[問題] struct type資料assign給另一個struct的
開發平台(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
02/10 15:30, 1F
→
02/10 15:47, , 2F
02/10 15:47, 2F
※ 編輯: lueichun 來自: 111.251.172.78 (02/10 16:22)
推
02/10 17:09, , 3F
02/10 17:09, 3F
可是我打的code是只處理index<256的部分,for loop裡面是這樣寫
※ 編輯: lueichun 來自: 111.251.172.78 (02/10 17:13)
→
02/10 17:18, , 4F
02/10 17:18, 4F
→
02/10 17:20, , 5F
02/10 17:20, 5F
→
02/10 17:20, , 6F
02/10 17:20, 6F
→
02/10 17:42, , 7F
02/10 17:42, 7F
→
02/10 17:57, , 8F
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
02/10 23:34, 10F
→
02/10 23:35, , 11F
02/10 23:35, 11F
→
02/11 10:42, , 12F
02/11 10:42, 12F
→
02/11 10:42, , 13F
02/11 10:42, 13F
→
02/11 11:28, , 14F
02/11 11:28, 14F