看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) dev-c++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 想請問以下code 餵入的資料(Input): 預期的正確結果(Expected Output): 原本預期資料會assign到另個struct type的變數 錯誤結果(Wrong Output): 結果程式就在assign結構內資料那一行停止執行了(黃色字的那一行,在加那一行之前 程式是可以動的) 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> #include <string.h> #define DATA_FILE "data.txt" struct STUDENT { int id; char name[80]; int take_num; int takes[6]; }; void init(struct STUDENT students[]); void load(FILE* fp,struct STUDENT students[]); int search(struct STUDENT students[],int id); int search_by_name(struct STUDENT students[],char* name); int name_to_id(struct STUDENT students[],char* name); void show(struct STUDENT students[],int id,int index); int add(struct STUDENT students[],int id,int index,int course); void save(FILE* fp,struct STUDENT students[]); int main (void) { FILE *fp; struct STUDENT students[256]; int id;//search by id char name[80];//search by name int index; int course; int result; int select_num;//save the number selected init(students);//對id,name做初始化 fp=fopen(DATA_FILE,"r"); load(fp,students); fclose(fp); printf("please select enter name or enter id:\n"); printf("enter name 按1,enter id 按2\n"); scanf("%d",&select_num); if(select_num==1) { printf("please enter name:"); scanf("%s",name); index=search_by_name(students,name); if(index==-1) { printf("name doesn`t exist,program ends\n"); exit(1); } id=name_to_id(students,name); } else if(select_num==2) { printf("please enter id:"); scanf("%d",&id); index=search(students,id); if(index==-1) { printf("id doesn`t exist,program ends\n"); exit(1); } } while(1) { show(students,id,index); if(students[index].take_num==5) { printf("all courses are selected,program ends"); break; } printf("請輸入課程代號,-1結束選課"); scanf("%d",&course); if(course==-1) { printf("程式結束\n"); break; } result=add(students,id,index,course); if(result==1) { printf("選課成功\n"); } else if(result==2) { printf("重複選課\n"); } else if(result==3) { printf("無此課程\n"); } } fp=fopen(DATA_FILE,"w"); save(fp,students); fclose(fp); return 0; } void init(struct STUDENT students[]) { int i,j; for(i=1;i<256;i++) { students[i].id=-1; //students[i].name[80]={0}; memset(students[i].name,0,sizeof(students[i].name)); } } void load(FILE* fp,struct STUDENT students[]) { int i,j; i=0; while(!feof(fp)) { i=i+1; fscanf(fp,"%d",&students[i].id); fscanf(fp,"%s",&students[i].name); fscanf(fp,"%d",&students[i].take_num); for(j=1;j<=students[i].take_num;j++) { fscanf(fp,"%d",&students[i].takes[j]); } } } int search(struct STUDENT students[],int id) { int i,index; int j; struct STUDENT temp;//資料暫存處 index=-1; /*for(i=1;i<256;i++) { if(students[i].id==id) { index=i; break; } }*/ //insertion sort for(i=2;i<256;i++) { /*temp.id=students[i].id;//暫存資料 temp.name=students[i].name; temp.take_num=students[i].take_num; temp.takes=students[i].takes;*/ printf("%d\n",students[i].id); temp=students[i]; /*應該是錯這裡, 因為在加 這一行前程式是可以動的*/ for(j=i-1;j=1;j--) { if(students[j].id<students[i].id) break; else if(students[j].id>=students[i].id) { students[j+1]=students[j]; } } if(j==i-1) continue; else students[j]=temp; }/*insertion sort*/ for(i=1;i<256;i++) { // printf("%d\n",students[i].id); } return index; } int search_by_name(struct STUDENT students[],char* name) { int i,index=-1; for(i=1;i<256;i++) { if(strcmp(students[i].name,name)==0) { index=i; break; } } return index; } int name_to_id(struct STUDENT students[],char* name) { int i,index=-1; for(i=1;i<256;i++) { if(strcmp(students[i].name,name)==0) { break; } } return students[i].id; } void show(struct STUDENT students[],int id,int index) { int i; printf("您已選以下課程:\n"); for(i=1;i<=students[index].take_num;i++) { printf("%d",students[index].takes[i]); printf(" "); } printf("\n"); } int add(struct STUDENT students[],int id,int index,int course) { int i; if(course>=101&&course<=105) { for(i=1;i<=students[index].take_num;i++) { if(students[index].takes[i]==course) return 2; } students[index].takes[i]=course; students[index].take_num=students[index].take_num+1; return 1; } return 3; } void save(FILE* fp,struct STUDENT students[]) { int i,j; for(i=1;i<256;i++) { if(students[i].id!=-1) { fprintf(fp,"%d",students[i].id); fprintf(fp,"\t"); fprintf(fp,"%s",students[i].name); fprintf(fp,"\t"); fprintf(fp,"%d",students[i].take_num); fprintf(fp,"\t"); for(j=1;j<=students[i].take_num;j++) { fprintf(fp,"%d",students[i].takes[j]); fprintf(fp,"\t"); } fprintf(fp,"\n"); } } } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.251.172.78
xatier:能給 code 其他部份嗎? 02/10 15:30
diabloevagto:給個完整能跑的code 02/10 15:47
※ 編輯: lueichun 來自: 111.251.172.78 (02/10 16:22)
LPH66:陣列開 [256] 是由 [0] 到 [255] 不是由 [1] 到 [256]... 02/10 17:09
可是我打的code是只處理index<256的部分,for loop裡面是這樣寫 ※ 編輯: lueichun 來自: 111.251.172.78 (02/10 17:13)
james732:個人覺得這個code詭異的地方挺多的...XD 02/10 17:18
angleevil:個人覺得排版不錯,但是忘記使用貼網址方法. 02/10 17:20
james732:排版不錯是真的XD 02/10 17:20
chunhsiang:沒有.c檔 也沒有資料檔 得慢慢讀才知道你想做什麼... 02/10 17:42
chunhsiang:search中的sort之後就怪怪的 另外判斷相等是 = = 02/10 17:57
※ 編輯: lueichun 來自: 111.251.172.78 (02/10 21:42) ※ 編輯: lueichun 來自: 111.251.172.78 (02/10 21:44) ※ 編輯: lueichun 來自: 111.251.172.78 (02/10 21:46) ※ 編輯: lueichun 來自: 111.251.172.78 (02/10 21:47) ※ 編輯: lueichun 來自: 111.251.172.78 (02/10 21:48)
VictorTom:怎麼知道是在那行停止執行的? 02/10 23:34
VictorTom:另外, 黃色字那行下面的for是貼錯還是真的寫錯? 02/10 23:34
VictorTom:for(j=i-1;j=1;j--) // 終止條件為 j=1 ?? 02/10 23:35
diabloevagto:照那個for來看是要j=1才程式 02/11 10:42
diabloevagto: 才執行 02/11 10:42
VictorTom:驚, 想太快就寫壞了, 的確是迴圈的執行條件....Orz 02/11 11:28