30/09/2018, 16:58

Tìm các phần tử khác nhau giữa 2 mảng 1 chiều (Thao tác trên tệp tin)

Đề bài: Cho một tệp tin input1.txt
dòng 1 chứa: số phần tử của mảng thứ nhất.
dòng 2 chưa: các phần tử của mảng thứ nhất.
dòng 3 chứa: số phần tử của mảng thứ hai.
dòng 4 chứa: Các phần tử của mảng thứ hai.

Yêu cầu: -Đọc 2 mảng số nguyên trên.

  • Tìm phần tử xuất hiện trong mảng thứ nhất mà không xuất hiện trong mảng thứ hai, tinh tổng các phần tử đó và ghi xuống tập tin output1.txt

    #include <stdio.h>
    #include <String.h>

    void ReadFile(int intArray1[], int intArray2[], int &dong1, int &dong2)
    {
    FILE* fp = fopen(“input1.txt”, “rt”);
    if (fp == NULL)
    {
    printf(“Truy cap that bai !”);
    }
    fscanf(fp, “%d”, &dong1);

      	for (int i = 0; i < dong1; i++)
      	{
      		fscanf(fp, "%d ", &intArray1[i]);
      	}
    
      	fscanf(fp, "%d", &dong2);
      	for (int j = 0;  j < dong2; j++)
      	{
      		fscanf(fp, "%d ", &intArray2[j]);
      	}
    

    }

    void KiemTravaXuatFile(int intArray1[], int intArray2[], int &dong1, int &dong2, FILE* fp1)
    {
    int Sum = 0;
    int C[100];
    int count = 0;
    for (int i = 0; i < dong1; i++)
    for (int j = 0; j < dong2; j++)
    if (intArray1[i] != intArray2[j])
    {
    C[count] = intArray1[i];
    count++;
    Sum += intArray1[i];
    }
    for (int i = 0; i < count; i++)
    {
    fprintf(fp1, "%d ", C[i]);
    }
    fprintf(fp1, “ %d”, Sum);
    }

    void main()
    {
    FILE* fp1 = fopen(“output1.txt”, “wt”);
    int intArray[100], intArray2[100];
    int dong1, dong2;
    ReadFile(intArray, intArray2, dong1, dong2);
    WriteFile(intArray, intArray2, dong1, dong2, fp1);
    }
    File input1.txt là như thế này ạ

    4
    10 8 5 11
    5
    4 8 6 5 15
    Kết quả mong muốn ở file output1.txt:

    10 11
    21
    và file ouput.txt của em nó ra như thế này:

    10 10 10 10 10 8 8 8 8 5 5 5 5 11 11 11 11 11
    157
    Cho em hỏi em sai chỗ nào ạ ?

nhatlonggunz viết 19:14 ngày 30/09/2018

Thật sự là xưa giờ giải thuật em toàn dùng stdin stdout với freopen không à, nên gặp cái này em bối rối quá

Update:
Em thấy chỗ không ổn trong thuật toán của anh:

  • Đề yêu cầu tìm số không xuất hiện trong mảng thứ 2, nghĩa là anh phải quét hết mảng 2, trong khi bên trên mới gặp thằng khác đầu tiên anh đã đưa vào rồi.

Update cái nữa, code em đây anh:

    freopen("input1.TXT", "r", stdin);
    freopen("output1.TXT", "w", stdout);

    int length1, length2;

    // Sử dụng cin và vòng lặp để nhập mảng

    int count = 0, sum = 0;

    for(int i = 0; i < length1; i++){
        count = 0;
        for(int j = 0; j < length2; j++){
            if(A[i] == B[j])
                break;
            count++;
        }
        if(count == length2){ // nếu count = length, nghĩa là nó đã xét hết mảng 2 mà không bị break ra
            cout << " " << A[i];
            sum += A[i];
        }
    }
    cout << endl << sum;

Và file input với output của em có kết quả đúng
Anh xem thử @Mark

X viết 18:59 ngày 30/09/2018

mình làm mẫu trên C++. bạn tham khảo cho vui nhé

Gió viết 19:11 ngày 30/09/2018

Có thể dùng các hàm xây dựng sẵn trong C:

  • sort mảng 2
  • dùng binary search các phần tử mảng 1 không có trong mảng 2.

int compare( const void* a, const void* b){
    return *(int*)a- *(int*)b;
}

qsort(mang2,n2,sizeof(int),compare);

//tim kiem ptu mang 1 trong mang 2
for(i=0;i<n1;i++){
    int key=mang1[i];
    int *res=(int*) bsearch(&key,mang2,n2,sizeof(int),compare);
    if(res!=NULL){// tim thay

    }else{ // khong tim thay
            printf("%d ", key);
    }
}

Bài liên quan
0