作者lueichun (no anonymous)
看板C_and_CPP
標題[問題] struct type資料assign給另一個struct的
時間Fri Feb 10 14:19:19 2012
開發平台(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