呂晨 發表於 2021-9-22 09:34:48

C作業

本帖最後由 呂晨 於 2021-9-22 09:35 編輯

要讀txt檔

利用動態結構,由大到小排序,並且可以輸入A?,輸出值後面的值

這是我現在打的,但不知道該如何一個一個地把資料放進結構裡面,或者是一次把所有資料讀完放在一個矩陣裡再丟到結構裡面,檔案最大有到130000行

想詢問,我打的程式思路有沒有錯,並且該怎麼把資料放進結構裡#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning( disable : 4996 )
#define N 13

struct test
{
        int name;
        int x;
} *matrix;

int main()
{
        int i,j=1,line=0;
        char name;
        char value;
        printf("enter the file name:(.txt)");
        scanf("%s", &name);
        FILE* fp=fopen(name,"r");
        if (fp == NULL)
        {
                puts("error");
        }
        while((i=fgetc(fp))!=EOF)
        {
                if(i=='\n') line++;
        }
        fseek(fp,0L,SEEK_SET);
        matrix=(struct test*)malloc(line*sizeof(struct test));
        
        while(fgets(value,sizeof(value),fp)!=NULL)
        {

//printf("%s",value);
                struct test A=value;  (到這裡程式就無法執行了)
        
        }
}

love6610716 發表於 2021-9-22 17:06:37

你的思路沒有問題
我直接幫你寫完你試試看#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning( disable : 4996 )
#define N 13

struct test
{
        char* name;
        int x;

        test() {};        // 建構子

        void print() {
                printf("%s %d\n", name, x);
        }
};

int binarySearch(test* matrix, int l, int r, int x)
{
        if (r >= l) {
                int mid = l + (r - l) / 2;
                if (matrix.x == x)
                        return mid;
                if (matrix.x > x)
                        return binarySearch(matrix, l, mid - 1, x);
                return binarySearch(matrix, mid + 1, r, x);
        }
        return -1;
}

void bubbleSort(test* matrix, int line) {
        struct test temp;
        int i, j;
        for (i = 1; i < line; i++) {
                for (j = 0; j < line - i; j++) {
                        if (matrix.x > matrix.x) {
                                temp = matrix;
                                matrix = matrix;
                                matrix = temp;
                        }
                }
        }
}

int main()
{
        int i, j = 1, line = 0, tmp;
        char name;
        char value;
        printf("enter the file name:(.txt)");
        scanf("%s", &name);
        FILE* fp = fopen(name, "r");
        if (fp == NULL)
        {
                puts("error");
        }
        while ((i = fgetc(fp)) != EOF)
        {
                if (i == '\n') line++;
        }
        fseek(fp, 0L, SEEK_SET);

        test* matrix = (test*)malloc(line * sizeof(test));
        i = 0;        // 記錄第幾筆資料
        while (fgets(value, sizeof(value), fp) != NULL)
        {
                char* token = strtok(value, " ");        // 取得指向 A? 的指標
                matrix.name = (char*)malloc(sizeof(char) * N);
                strcpy(matrix.name, token);                // 賦值

                token = strtok(NULL, "\n");                        // 取得指向 數值 的指標
                tmp = atoi(token);                                        // 字串轉數字
                matrix.x = tmp;
                matrix.print();                                        // 印出結構

                i++;
        }

        // Bubble Sort
        bubbleSort(matrix, line);

        // Binary Search
        int toFind;
        for (i=0;i<line;i++)
        {
                toFind = binarySearch(matrix, 0, line, matrix.x);

                printf("你要找的東西: ");
                matrix.print();
        }

        free(matrix);        // 釋放資源(指標類的東西必須要手動釋放!)
}

呂晨 發表於 2021-9-23 10:14:59

love6610716 發表於 2021-9-22 17:06 static/image/common/back.gif
你的思路沒有問題
我直接幫你寫完你試試看

我是用visual studio來跑,會跑出這些錯誤

還是visual studio 寫C 有其它寫法?

love6610716 發表於 2021-9-23 12:33:08

呂晨 發表於 2021-9-23 10:14 static/image/common/back.gif
我是用visual studio來跑,會跑出這些錯誤

還是visual studio 寫C 有其它寫法?

抱歉我寫成C++的語法了
以下是C的#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#pragma warning( disable : 4996 )
#define N 13

struct test
{
        char* name;
        int x;
};

void print(struct test _t) { printf("%s %d\n", _t.name, _t.x); }

int binarySearch(struct test* matrix, int l, int r, int x)
{
        if (r >= l) {
                int mid = l + (r - l) / 2;
                if (matrix.x == x)
                        return mid;
                if (matrix.x > x)
                        return binarySearch(matrix, l, mid - 1, x);
                return binarySearch(matrix, mid + 1, r, x);
        }
        return -1;
}

void bubbleSort(struct test* matrix, int line) {
        struct test temp;
        int i, j;
        for (i = 1; i < line; i++) {
                for (j = 0; j < line - i; j++) {
                        if (matrix.x > matrix.x) {
                                temp = matrix;
                                matrix = matrix;
                                matrix = temp;
                        }
                }
        }
}

int main()
{
        int i, j = 1, line = 0, tmp;
        char name;
        char value;
        printf("enter the file name:(.txt)");
        scanf("%s", &name);
        FILE* fp = fopen(name, "r");
        if (fp == NULL)
        {
                puts("error");
        }
        while ((i = fgetc(fp)) != EOF)
        {
                if (i == '\n') line++;
        }
        fseek(fp, 0L, SEEK_SET);

        struct test* matrix = (struct test*)malloc(line * sizeof(struct test));
        i = 0;        // 記錄第幾筆資料
        while (fgets(value, sizeof(value), fp) != NULL)
        {
                char* token = strtok(value, " ");                                        // 取得指向 A? 的指標
                matrix.name = (char*)malloc(sizeof(char) * N);
                strcpy(matrix.name, token);                                                // 賦值

                token = strtok(NULL, "\n");                                                        // 取得指向 數值 的指標
                tmp = atoi(token);                                  // 字串轉數字
                matrix.x = tmp;
                print(matrix);                                   // 印出結構

                i++;
        }

        // Bubble Sort
        bubbleSort(matrix, line);

        // Binary Search
        int toFind;
        for (i = 0; i < line; i++)
        {
                toFind = binarySearch(matrix, 0, line, matrix.x);

                printf("你要找的東西: ");
                print(matrix);
        }

        free(matrix);        // 釋放資源(指標類的東西必須要手動釋放!)
}
頁: [1]
查看完整版本: C作業