[問題] struct type資料assign給另一個struct的

看板C_and_CPP作者 (no anonymous)時間12年前 (2012/02/10 14:19), 編輯推噓2(2012)
留言14則, 7人參與, 最新討論串1/1
開發平台(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

02/10 15:30, , 1F
能給 code 其他部份嗎?
02/10 15:30, 1F

02/10 15:47, , 2F
給個完整能跑的code
02/10 15:47, 2F
※ 編輯: lueichun 來自: 111.251.172.78 (02/10 16:22)

02/10 17:09, , 3F
陣列開 [256] 是由 [0] 到 [255] 不是由 [1] 到 [256]...
02/10 17:09, 3F
可是我打的code是只處理index<256的部分,for loop裡面是這樣寫 ※ 編輯: lueichun 來自: 111.251.172.78 (02/10 17:13)

02/10 17:18, , 4F
個人覺得這個code詭異的地方挺多的...XD
02/10 17:18, 4F

02/10 17:20, , 5F
個人覺得排版不錯,但是忘記使用貼網址方法.
02/10 17:20, 5F

02/10 17:20, , 6F
排版不錯是真的XD
02/10 17:20, 6F

02/10 17:42, , 7F
沒有.c檔 也沒有資料檔 得慢慢讀才知道你想做什麼...
02/10 17:42, 7F

02/10 17:57, , 8F
search中的sort之後就怪怪的 另外判斷相等是 = =
02/10 17:57, 8F
※ 編輯: 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)

02/10 23:34, , 9F
怎麼知道是在那行停止執行的?
02/10 23:34, 9F

02/10 23:34, , 10F
另外, 黃色字那行下面的for是貼錯還是真的寫錯?
02/10 23:34, 10F

02/10 23:35, , 11F
for(j=i-1;j=1;j--) // 終止條件為 j=1 ??
02/10 23:35, 11F

02/11 10:42, , 12F
照那個for來看是要j=1才程式
02/11 10:42, 12F

02/11 10:42, , 13F
才執行
02/11 10:42, 13F

02/11 11:28, , 14F
驚, 想太快就寫壞了, 的確是迴圈的執行條件....Orz
02/11 11:28, 14F
文章代碼(AID): #1FDBRf7d (C_and_CPP)