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; (到這裡程式就無法執行了)
}
} 你的思路沒有問題
我直接幫你寫完你試試看#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); // 釋放資源(指標類的東西必須要手動釋放!)
} love6610716 發表於 2021-9-22 17:06 static/image/common/back.gif
你的思路沒有問題
我直接幫你寫完你試試看
我是用visual studio來跑,會跑出這些錯誤
還是visual studio 寫C 有其它寫法? 呂晨 發表於 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]