我們才做了這個作業。。。
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct scorenode)
#define DEBUG
#include <string.h>
struct scorenode
{
int number;/*學號*/
char name[8];/*姓名*/
float cj1;/*成績1*/
float cj2;/*成績2*/
float cj3;/*成績3 */
struct scorenode *next;
};
typedef struct scorenode score;
int n,k;/*n,k為全局變數,本程序中的函數均可以使用它*/
/*==============================================================================================*/
score *creat(void)
/*函數creat,功能:創建鏈表,此函數帶回一個指向鏈表頭的指針*/
{
score*head;
score *p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];
n=0;
p1=p2=p3=(score *)malloc(LEN);head=p3; /*申請一個新單元*/
printf("請輸入學生資料,輸0退出!\n");
repeat1: printf("請輸入學生學號(學號應大於0):");/*輸入大於0的學號*/
scanf("%d",&p1->number);
while(p1->number<0)
{
getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&p1->number);
}
/*輸入學號為字元或小於0時,程序報錯,提示重新輸入學號*/
if(p1->number==0)
goto end;/*當輸入的學號為0時,轉到末尾,結束創建鏈表*/
else
{
p3=head;
if(n>0)
{
for(i=0;i<n;i++)
{
if(p1->number!=p3->number)
p3=p3->next;
else
{
printf("學號重復,請重輸!\n");
goto repeat1;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}
}
printf("請輸入學生姓名:");
scanf("%s",&p1->name); /*輸入學生姓名*/
printf("請輸入cj1(0~100):"); /*輸入cj1,成績應在0-100*/
scanf("%f",&p1->cj1);
while(p1->cj1<0||p1->cj1>100)
{
getchar();
printf("輸入錯誤,請重新輸入cj1"); /*輸入錯誤,重新輸入成績1*/
scanf("%f",&p1->cj1);
}
printf("請輸入cj2(0~100):"); /*輸入cj2,成績應在0-100*/
scanf("%f",&p1->cj2);
while(p1->cj2<0||p1->cj2>100)
{
getchar();
printf("輸入錯誤,請重新輸入cj2"); /*輸入錯誤,重新輸入cj2直到正確為止*/
scanf("%f",&p1->cj2);
}
printf("請輸入cj3(0~100):");/*輸入cj3,成績應在0-100*/
scanf("%f",&p1->cj3);
while(p1->cj3<0||p1->cj3>100)
{
getchar();
printf("輸入錯誤,請重新輸入cj3");
scanf("%f",&p1->cj3);} /*輸入錯誤,重新輸入cj3直到正確為止*/
head=NULL;
while(p1->number!=0)
{
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(score *)malloc(LEN);
printf("請輸入學生資料,輸0退出!\n");
repeat2:printf("請輸入學生學號(學號應大於0):");
scanf("%d",&p1->number); /*輸入學號,學號應大於0*/
while(p1->number<0)
{
getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&p1->number);
}
/*輸入學號為字元或小於0時,程序報錯,提示重新輸入學號*/
if(p1->number==0)
goto end; /*當輸入的學號為0時,轉到末尾,結束創建鏈表*/
else
{
p3=head;
if(n>0)
{
for(i=0;i<n;i++)
{
if(p1->number!=p3->number)
p3=p3->next;
else
{
printf("學號重復,請重輸!\n");
goto repeat2;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}
}
printf("請輸入學生姓名:");
scanf("%s",&p1->name);/*輸入學生姓名*/
printf("請輸入cj1(0~100):");
scanf("%f",&p1->cj1);/*輸入cj1,成績應在0-100*/
while(p1->cj1<0||p1->cj1>100)
{
getchar();
printf("輸入錯誤,請重新輸入cj1");
scanf("%f",&p1->cj1);}/*輸入錯誤,重新輸入cj1直到正確為止*/
printf("請輸入cj2(0~100):");
scanf("%f",&p1->cj2);/*輸入cj2,成績應在0-100*/
while(p1->cj2<0||p1->cj2>100)
{
getchar();
printf("輸入錯誤,請重新輸入cj2");
scanf("%f",&p1->cj2);
} /*輸入錯誤,重新輸入cj2績直到正確為止*/
printf("請輸入cj3(0~100):");
scanf("%f",&p1->cj3);/*輸入cj3,成績應在0-100*/
while(p1->cj3<0||p1->cj3>100)
{
getchar();
printf("輸入錯誤,請重新輸入cj3");
scanf("%f",&p1->cj3);} /*輸入錯誤,重新輸入cj3直到正確為止*/
}
end: p1=head;
p3=p1;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;
if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交換前後結點中的學號值,使得學號大者移到後面的結點中*/
strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交換前後結點中的姓名,使之與學號相匹配*/
fen=max->cj1;
max->cj1=p1->cj1;
p1->cj1=fen;
/*交換前後結點中的cj1,使之與學號相匹配*/
fen=max->cj2;
max->cj2=p1->cj2;
p1->cj2=fen;
/*交換前後結點中的cj2,使之與學號相匹配*/
fen=max->cj3;
max->cj3=p1->cj3;
p1->cj3=fen;
/*交換前後結點中的cj3,使之與學號相匹配*/
}
}
max=head;p1=head;/*重新使max,p指向鏈表頭*/
}
p2->next=NULL;/*鏈表結尾*/
printf("輸入的學生數為:%d個!\n",n);
return(head);
}
score *add(score *head,score *stu)
/*函數add,功能:追加學生資料,並且將所有學生資料按學號排序*/
{
score *p0,*p1,*p2,*p3,*max;
int i,j;
float fen;
char t[10];
p3=stu=(score *)malloc(LEN);/*開辟一個新單元*/
printf("\n輸入要增加的學生的資料!");
repeat4: printf("請輸入學生學號(學號應大於0):");
scanf("%d",&stu->number);
/*輸入學號,學號應大於0*/
while(stu->number<0)
{
getchar();
printf("輸入錯誤,請重新輸入學生學號:");
scanf("%d",&stu->number);} /*輸入錯誤,重新輸入學號*/
/******************************************************/
if(stu->number==0)
goto end2;/*當輸入的學號為0時,轉到末尾,結束追加*/
else
{
p3=head;
if(n>0)
{for(i=0;i<n;i++)
{if(stu->number!=p3->number)
p3=p3->next;
else
{
printf("學號重復,請重輸!\n");
goto repeat4;
/*當輸入的學號已經存在,程序報錯,返回前面重新輸入*/
}
}
}
}
/******************************************************/
printf("輸入學生姓名:");
scanf("%s",stu->name); /*輸入學生姓名*/
printf("請輸入cj1(0~100):");
scanf("%f",&stu->cj1); /*輸入cj1,成績應在0-100*/
while(stu->cj1<0||stu->cj1>100)
{getchar();
printf("輸入錯誤,請重新輸入cj1");
scanf("%f",&stu->cj1);
} /*輸入錯誤,重新輸入cj1直到正確為止*/
printf("請輸入cj2(0~100):");
scanf("%f",&stu->cj2);/*輸入cj2,成績應在0-100*/
while(stu->cj2<0||stu->cj2>100)
{
getchar();
printf("輸入錯誤,請重新輸入cj2");
scanf("%f",&stu->cj2);}/*輸入錯誤,重新輸入cj2直到正確為止*/
printf("請輸入cj3(0~100):");
scanf("%f",&stu->cj3);/*輸入cj3,成績應在0-100*/
while(stu->cj3<0||stu->cj3>100)
{
getchar();
printf("輸入錯誤,請重新輸入cj3");
scanf("%f",&stu->cj3);}/*輸入錯誤,重新輸入cj3直到正確為止*/
p1=head;
p0=stu;
if(head==NULL)
{head=p0;p0->next=NULL;}/*當原來鏈表為空時,從首結點開始存放資料*/
else/*原來鏈表不為空*/
{
if(p1->next==NULL)/*找到原來鏈表的末尾*/
{
p1->next=p0;
p0->next=NULL;/*將它與新開單元相連接*/
}
else
{
while(p1->next!=NULL)/*還沒找到末尾,繼續找*/
{
p2=p1;p1=p1->next;
}
p1->next=p0;
p0->next=NULL;
}
}
n=n+1;
p1=head;
p0=stu;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
max=p1;
p1=p1->next;
if(max->number>p1->number)
{
k=max->number;
max->number=p1->number;
p1->number=k;
/*交換前後結點中的學號值,使得學號大者移到後面的結點中*/
strcpy(t,max->name);
strcpy(max->name,p1->name);
strcpy(p1->name,t);
/*交換前後結點中的姓名,使之與學號相匹配*/
fen=max->cj1;
max->cj1=p1->cj1;
p1->cj1=fen;
/*交換前後結點中的cj1,使之與學號相匹配*/
fen=max->cj2;
max->cj2=p1->cj2;
p1->cj2=fen;
/*交換前後結點中的cj2績,使之與學號相匹配*/
fen=max->cj3;
max->cj3=p1->cj3;
p1->cj3=fen;
/*交換前後結點中的cj3,使之與學號相匹配*/
}
}
max=head;p1=head;/*重新使max,p指向鏈表頭*/
} end2:
printf("現在的學生數為:%d個!\n",n);
return(head);
}
/*========================================================
======================================*/
score *search(score *head)
/*函數search,功能:查詢學生成績*/
{int number;
score *p1,*p2;
printf("輸入要查詢的學生的學號,");
scanf("%d",&number);
while(number!=0)
{
if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}
printf("-----------------------------------------\n");
printf("|學號\t|姓名\t|cj1\t|cj2\t|cj3\t|\n");
printf("-----------------------------------------\n");/*列印表格域*/
p1=head;
while(number!=p1->number&&p1->next!=NULL)
{p2=p1;p1=p1->next;}
if(number==p1->number)
{printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|\n",p1->number,p1->name,p1->cj1,p1->cj2,p1->cj3);
printf("-----------------------------------------\n");}/*列印表格域*/
else
printf("%d不存在此學生!\n",number);
printf("輸入要查詢的學生的學號,");
scanf("%d",&number);
}
printf("已經退出了!\n");
return(head);
}/*=============================================
=================================================*/
score *del(score *head)/*函數del,功能:刪除學生資料*/
{
score *p1,*p2;
int number;
printf("輸入要刪除的學生的學號(輸入0時退出):");
scanf("%d",&number);
getchar();
while(number!=0)/*輸入學號為0時退出*/
{
if(head==NULL)
{
printf("\n沒有任何學生資料!\n");
return(head);
}
p1=head;
while(number!=p1->number&&p1->next!=NULL)
/*p1指向的不是所要找的首結點,並且後面還有結點*/
{
p2=p1;p1=p1->next;
} /*p1後移一個結點*/
if(number==p1->number)
/*找到了*/
{
if(p1==head)
head=p1->next;
/*若p1指向的是首結點,把地二個結點地址賦予head*/
else
p2->next=p1->next;
/*否則將下一個結點地址 賦給前一結點地址*/
printf("已經刪除:%d\n",number);n=n-1;
}
else
printf("%d不存在此學生!\n",number);
/*找不到該結點*/
printf("輸入要刪除的學生的學號:");
scanf("%d",&number);
getchar();
}
#ifdef DEBUG
printf("已經退出了!\n");
#endif
printf("現在的學生數為:%d個!\n",n);
return(head);
} /*==================================================
============================================*/
score *statistics(score *head)
/*函數statistics,功能:統計學生成績*/
{
float sum1=0,sum2=0,sum3=0,ave1=0,ave2=0,ave3=0,max=0,min;
score *p;
int x,y=0,i=0;
p=head;
printf("1個人總分和平均分\t2單科平均分\t3總分最高分\t4總分最低分\n");
scanf("%d",&x);
getchar();
switch(x)
/*用switch語句實現功能選擇*/
{
case 1: if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/
else
{
printf("---------------------------------------------------------\n");
printf("|學號\t|姓名\t|cj1\t|cj2\t|cj3\t|總分\t|平均分\t|\n");
printf("---------------------------------------------------------\n");/*列印表格域*/
while(p!=NULL)
{
sum1=p->cj1+p->cj2+p->cj3; /*計算個人總分*/
ave1=sum1/3;/*計算個人平均分*/
printf("|%d\t|%s\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|%.1f\t|\n",p->number,p->name,p->cj1,p->cj2,p->cj3,sum1,ave1);
/*列印結果*/
printf("---------------------------------------------------------\n");/*列印表格域*/
p=p->next;}
}
return(head); break;
case 2: if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/
while(p!=NULL)
{
sum1=sum1+p->cj1;
sum2=sum2+p->cj2;
sum3=sum3+p->cj3;/*計算總分*/
y=y+1;
ave1=sum1/y;
ave2=sum2/y;
ave3=sum3/y;/*計算平均分*/
p=p->next;/*使p指向下一個結點*/
}
printf("cj1平均分是%.1f\n",ave1);
printf("cj2平均分是%.1f\n",ave2);
printf("cj3平均分是%.1f\n",ave3);/*列印結果*/
return(head); break;
case 3:
if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/
max=p->cj1+p->cj2+p->cj3;
while(i<n)
{
i=i+1;
sum1=p->cj1+p->cj2+p->cj3; /*計算個人總分*/
if(max<sum1)
max=sum1;
p=p->next;
}
printf("總分最高分:%.1f",max);
printf("\n");
return(head); break;
case 4: if(head==NULL)
{printf("\n沒有任何學生資料!\n");return(head);}/*鏈表為空*/
while(p!=NULL)
{
min=p->cj1+p->cj2+p->cj3;
while(p!=NULL)
{sum2=p->cj1+p->cj2+p->cj3;
if(min>sum2)
min=sum2;
p=p->next;
}
}
printf("總分最低分:%.1f",min);
printf("\n");
return(head); break;
default :printf("輸入錯誤,請重試!\n");
}
return(head);
}
/*===========================================================
===================================*/
int save(score *p1)
/*函數save,功能:保存學生的資料*/
{
FILE *fp;
char filepn[20];/*用來存放文件保存路徑以及文件名*/
printf("請輸入文件路徑及文件名:");
scanf("%s",filepn);
if((fp=fopen(filepn,"w+"))==NULL)
{
printf("不能打開文件!\n");
return 0;
}
fprintf(fp," 學生成績管理系統 \n");
fprintf(fp,"-------------------------------------------------------\n");
fprintf(fp,"| 學號\t| 姓名\t| cj1\t| cj2\t| cj3\t|\n");
fprintf(fp,"-------------------------------------------------------\n");
/*列印表格域*/
while(p1!=NULL)
{
fprintf(fp,"%d\t%s\t%.1f\t%.1f\t%.1f\t\n",p1->number,p1->name,p1->cj1,p1->cj2,p1->cj3);
p1=p1->next;/*下移一個結點*/
}
fclose(fp);
printf("文件已經保存!\n");
return 0;
}
int menu()/*函數menu,功能:菜單選擇界面*/
{
int i,k;
printf("\t\t\t\t學生成績管理系統\n");
for(i=0;i<80;i++)
printf("*");
printf("\t\t1創建資料\t\t\t2查詢成績\t\t\n");
printf("\t\t3刪除資料\t\t\t4追加資料\t\t\n");
printf("\t\t5統計成績\t\t\t6保存資料\t\t\n");
/*菜單選擇界面*/
for(i=0;i<80;i++)
printf("*");
printf("請選擇您所要的操作(選擇(0)退出):");
scanf("%d",&k);/*選擇操作*/
getchar();
return (k);}
/*==============================================================================================*/
main() /*主函數main,功能:通過調用creat,search,del,add,print,ststistics,save,taxis等函數,實現學生成績查詢系統功能*/
{
score *head=0,*stu=0;
while(1)
{
k=menu();
switch(k)/*用switch語句實現功能選擇*/
{
case 1: head=creat();break;/*調用創建鏈表函數*/
case 2: head=search(head);break;/*調用查詢函數*/
case 3: head=del(head); break;/*調用刪除函數*/
case 4: head=add(head,stu);break;/*調用追加函數*/
case 5: statistics(head); break;/*調用統計函數*/
case 6: save(head);break;/*調用保存函數*/
case 0: exit(0);/*退出系統,返回主界面*/
default: printf("輸入錯誤,請重試!\n");
}
}
}
⑵ c語言怎麼在一個工程下創建兩個源文件
1、首先在打開的C語言編程軟體中,點擊File菜單的文件按鈕。
⑶ 用C語言編程:編寫一個函數,將兩個字元串連接起來
1、新建一個工程和.c文件,輸入頭文件和主函數。
⑷ c語言編程中為什麼要先建立工程
C語言編程並沒有要先建立工程的需求。
工程是一些編程工具的說法,在使用部分編程工具時,會先要求建立工程,然後編程工具可以根據工程屬性,對代碼進行管理,編譯等。
使用這類工具,並用工程管理源代碼,可以節省編程人員的時間,降低項目的管理難度。編程人員不需要知道源文件是怎麼組織的,代碼是如何編譯的,依賴關系是如何創建的,而是僅通過可視化界面,完成所有操作。
但實際上,C語言對此並沒有要求。工程的出現,只是為了管理C語言代碼。編程本身,以及編譯運行與工程都沒有絕對的關系。