用C語言編制查詢某班同學的平均成績

hai-chu發表於2020-09-25

用C語言編制查詢某班同學的平均成績

1.實驗目的與要求

⑴ 掌握用C語言編寫查詢統計程式。

⑵ 掌握C語言的檔案讀寫的基本操作。

2.實驗內容

⑴ 建立一個文字檔案,含有若干班級的資料,要求其資料每個班級至少有50位同學,每位同學至少學習10門課程(要考慮各班級中的不同人數以及學習的課程門數不同)

⑵ 寫出函式求出某一位的平均成績

⑶ 寫出函式求出每一位的平均成績

⑷ 使用檔案讀入相關資料,將執行結果送到檔案中

3.實驗準備

  1. 首先應明確建立文字檔案的格式,資料協議等。
  2. 其次根據檔案讀取資料,並將結果送入結構檔案中。
  3. 參閱C語言教材中的有關內容。

4.實驗方法

⑴ 用建立文字檔案的格式建立資料。

⑵ 編制相應功能函式。

⑶ 讀取檔案的資料(注意可能有不同的個數的資料)。

⑷ 整合相關函式構成完整的應用程式。

⑸ 輸出結果送入檔案中。

程式碼程式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
typedef struct student{
	char classes[15];
	int no;
	char name[32];
	char scores[100];
} stu;

typedef struct course{
	int no;
	char name[32];
	double score;
} cur;

void split(char *src,const char *separator,char **dest,int *num) {
	/*
		src 源字串的首地址(buf的地址) 
		separator 指定的分割字元
		dest 接收子字串的陣列
		num 分割後子字串的個數
	*/
     char *pNext;
     int count = 0;
     if (src == NULL || strlen(src) == 0) //如果傳入的地址為空或長度為0,直接終止 
        return;
     if (separator == NULL || strlen(separator) == 0) //如未指定分割的字串,直接終止 
        return;
     pNext = (char *)strtok(src,separator); //必須使用(char *)進行強制型別轉換(雖然不寫有的編譯器中不會出現指標錯誤)
     while(pNext != NULL) {
          *dest++ = pNext;
          ++count;
         pNext = (char *)strtok(NULL,separator);  //必須使用(char *)進行強制型別轉換
    }  
    *num = count;
} 	
void getoneavgscore(char name[],stu stu1[100],cur cur2[1000]);
void getallavgscore(stu stu1[100],cur cur2[1000]);
int getsumstu();
int main(int argc, char* argv[])
{
 //開啟檔案 
 FILE * r=fopen("A.txt","r");
 assert(r!=NULL);
 //讀寫檔案 
//int sumstu = getsumstu();
//printf("共有%d條資料\n",sumstu);
 stu a[100];
 cur b[1000];
//cur b[128];
 int i=0;
 //!feof(pf)
 printf("資料讀取中.....................\n");
 while(fscanf(r,"%s%d%s%s",a[i].classes,&a[i].no,a[i].name,a[i].scores)!=EOF)
 {
	 printf("%s\t%d\t%s\t%s\n",a[i].classes,&a[i].no,a[i].name,a[i].scores);
   i++;
 } 
   
  //關閉檔案 
 fclose(r);

int p = 0;
  for(int j = 0 ;j < i; j++)
    {
	  
	  char *revbuf[20] = {0}; //存放分割後的子字串 
//	printf("%s\n ",a[j].scores);

	//分割後子字串的個數
	int num = 0;
	split(a[j].scores,",",revbuf,&num); //呼叫函式進行分割 

	
	//輸出返回的每個內容 
	for(int k = 0;k < num; k ++) {
		//printf("%s\n",revbuf[k]);
		char *revbuf2[20] = {0}; //存放分割後的子字串 
		int num2 = 0;
		split(revbuf[k],":",revbuf2,&num2); //呼叫函式進行分割 
		strcpy(b[p].name,revbuf2[0]);
		b[p].no = a[j].no;
		b[p].score =atof(revbuf2[1]);
	//	printf("%s\n",revbuf2[1]);	
		p++;
		
	}
  }

 printf("..................資料讀取完成\n");
 int choice;//選擇序號
 char answer;
 do
    {
	    printf("歡迎你使用!\n");
	    printf("|---------------------------------------|\n");
	    printf("|\t請輸入選項編號(0-2):\t\t|");
	    printf("\n|---------------------------------------|\n");
	    printf("|\t1--查詢某一位的平均成績:\t\t|\n");
	    printf("|\t2--查詢每一位的平均成績:\t\t|\n");
	    printf("|\t0--退出系統:\t\t\t|\n");
	    printf("|---------------------------------------|\n");
	    printf("請輸入選項:");
	    scanf("%d",&choice);
	    switch(choice)
	    {
		    case 0:
			    {
					printf("********退出系統*********\n");
					printf("歡迎下次使用\n");
					exit(0);
					break;   
				}
			case 1:
				{
					printf("請選擇查詢方式\n");
					printf("1.姓名\n2.學號\n");
					scanf("%s",&answer);
					if( answer == '1' )
						{
							char name[10];
							printf("請輸入姓名:");
							scanf("%s",&name);
							getoneavgscore(name,a,b);
						}
						if(answer == '2' )
						{
						    int no;
							printf("請輸入學號:");
							scanf("%d",&no);
							for(int q = 0;q<100;q++){
								if(a[q].no==no){
									getoneavgscore(a[q].name,a,b); 
								}
							}
							
						}
						if(answer != '1' && answer!= '2')
						{
							printf("輸入錯誤\n");
						}
						printf("1.按任意鍵回車後繼續查詢\n0.退出\n");
						scanf("%s",&answer);
						fflush(stdin);
						if(answer == '0' )
						{
							break;
						}

				}
			case 2:
				{
					getallavgscore(a,b);
						break;
				   }
			default:
				{
					printf("********沒有這個選項*********\n按任意鍵重新輸入\n");
					break;
				}
		}
	}while(1);
  
 system("pause");
 return 0;
}

//根據學生姓名查成績
void getoneavgscore(char name[32],stu stu1[100],cur cur2[1000]) 
{
	int no1;
	for(int q = 0;q<100;q++){
		if(strcmp(stu1[q].name, name)==0){
			no1 = q;
		}
	}
	printf("\t\t\t學生資訊\n\t\t學號:%d\t班級:%s\t姓名:%s\t\n",stu1[no1].no,stu1[no1].classes,stu1[no1].name);
	printf("*******************************************************\n");
	printf("\t\t\t\t成績資訊\n");
	printf("\t\t課程名\t\t\t成績\n");
	double sum = 0;
	int count = 0;
	for(int p = 0;p<1000;p++){
		if(cur2[p].no==stu1[no1].no){
			count++;
			sum = sum+cur2[p].score;
			printf("\t\t%s",cur2[p].name);
			printf("\t\t\t%3.1f",cur2[p].score);
			printf("\n");
		}
	}
	printf("*******************************************************\n");
	printf("\t\t課程數:%d\t總成績:%3.1f\t平均成績:%3.1f\n",count,sum,sum/count);

} 
//查詢每一位的平均成績
void getallavgscore(stu stu1[100],cur cur1[1000]) 
{
	 FILE * w=fopen("B.txt","w");
	 assert(w!=NULL);
	printf("*******************************************************\n");
	printf("\t學號\t姓名\t課程數\t總分\t平均分\n");
	fprintf(w,"\t學號\t姓名\t課程數\t總分\t平均分\n");
	for(int q = 0;q<100;q++){
		double sum = 0;
		int count = 0;
		for(int s = 0;s<1000;s++){
			if(stu1[q].no == cur1[s].no){
			count++;
			sum = sum+cur1[s].score;
			}	
		}
			printf("\t%d\t%s\t%d\t%3.1f\t%3.1f\n",stu1[q].no,stu1[q].name,count,sum,sum/count);
			fprintf(w,"\t%d\t%s\t%d\t%3.1f\t%3.1f\n",stu1[q].no,stu1[q].name,count,sum,sum/count);

	}
	 fclose(w);

} 
/*int getsumstu(){
 FILE * r1=fopen("A.txt","r");
 assert(r1!=NULL);
 int i=0;
 char temp[255];
 while(fscanf(r1,"%s",temp)!=EOF)	 
 {
   i++;
 } 
 return i/4;
}*/

資料檔案(命名為A.txt) 

1班	1001	王51	數學:51,英語:54,語文:89,地理:26,政治:52,生物:31,物理:61,歷史:65,體育:84,美術:21,計算機:51
1班	1002	王52	數學:34,英語:57,語文:99,地理:69,政治:29,生物:82,物理:75,歷史:73,體育:70,美術:90,
1班	1003	王53	數學:51,英語:75,語文:32,地理:77,政治:32,生物:42,物理:97,歷史:49,體育:64,美術:59,
1班	1004	王54	數學:46,英語:57,語文:50,地理:38,政治:27,生物:33,物理:91,歷史:35,體育:90,
1班	1005	王55	數學:47,英語:97,語文:39,地理:97,政治:57,生物:71,物理:50,歷史:48,體育:95,美術:57,計算機:90
1班	1006	王56	數學:35,英語:77,語文:81,地理:55,政治:23,生物:22,物理:75,歷史:83,體育:51,美術:46,
1班	1007	王57	數學:71,英語:90,語文:92,地理:92,政治:53,生物:51,物理:52,歷史:80,體育:20,美術:54,
1班	1008	王58	數學:47,英語:40,語文:32,地理:31,政治:67,生物:26,物理:52,歷史:35,體育:56,美術:38,
1班	1009	王59	數學:56,英語:90,語文:71,地理:72,政治:87,生物:25,物理:31,歷史:62,體育:49,美術:44,
1班	1010	王60	數學:35,英語:54,語文:71,地理:40,政治:40,生物:47,物理:95,歷史:29,體育:64,
1班	1011	王61	數學:27,英語:24,語文:25,地理:27,政治:28,生物:93,物理:40,歷史:82,體育:56,美術:35,
1班	1012	王62	數學:89,英語:20,語文:69,地理:97,政治:93,生物:36,物理:42,歷史:21,體育:95,美術:53,
1班	1013	王63	數學:26,英語:35,語文:90,地理:41,政治:60,生物:33,物理:90,歷史:28,體育:87,美術:22,
1班	1014	王64	數學:36,英語:83,語文:45,地理:55,政治:86,生物:95,物理:26,歷史:30,體育:48,美術:90,
1班	1015	王65	數學:67,英語:40,語文:91,地理:53,政治:81,生物:78,物理:20,歷史:84,體育:24,美術:37,
1班	1016	王66	數學:51,英語:36,語文:80,地理:29,政治:67,生物:59,物理:57,歷史:76,體育:61,美術:67,
1班	1017	王67	數學:47,英語:33,語文:51,地理:92,政治:28,生物:59,物理:55,歷史:87,體育:52,美術:25,計算機:90
1班	1018	王68	數學:44,英語:46,語文:70,地理:95,政治:35,生物:36,物理:43,歷史:39,體育:83,美術:35,
1班	1019	王69	數學:46,英語:89,語文:64,地理:71,政治:51,生物:63,物理:85,歷史:28,體育:96,
1班	1020	王70	數學:79,英語:26,語文:49,地理:91,政治:40,生物:86,物理:98,歷史:68,體育:28,美術:78,
1班	1021	王71	數學:25,英語:70,語文:31,地理:91,政治:58,生物:62,物理:58,歷史:83,體育:70,美術:67,
1班	1022	王72	數學:29,英語:38,語文:46,地理:63,政治:95,生物:54,物理:59,歷史:72,體育:90,美術:51,
1班	1023	王73	數學:56,英語:87,語文:39,地理:46,政治:63,生物:97,物理:27,歷史:82,體育:60,美術:57,
1班	1024	王74	數學:84,英語:79,語文:46,地理:33,政治:91,生物:65,物理:30,歷史:48,體育:82,美術:83,
1班	1025	王75	數學:98,英語:53,語文:30,地理:100,政治:26,生物:93,物理:98,歷史:64,體育:90,美術:26,計算機:90
1班	1026	王76	數學:24,英語:21,語文:79,地理:46,政治:89,生物:57,物理:79,歷史:49,體育:97,
1班	1027	王77	數學:57,英語:80,語文:43,地理:79,政治:56,生物:50,物理:43,歷史:45,體育:69,美術:93,
1班	1028	王78	數學:43,英語:40,語文:50,地理:31,政治:26,生物:42,物理:25,歷史:32,體育:99,美術:25,
1班	1029	王79	數學:74,英語:94,語文:42,地理:58,政治:82,生物:26,物理:64,歷史:61,體育:38,美術:72,
1班	1030	王80	數學:67,英語:58,語文:31,地理:74,政治:51,生物:69,物理:90,歷史:43,體育:90,美術:42,
1班	1031	王81	數學:25,英語:21,語文:74,地理:22,政治:83,生物:86,物理:52,歷史:49,體育:84,美術:94,
1班	1032	王82	數學:32,英語:72,語文:79,地理:93,政治:60,生物:50,物理:21,歷史:87,體育:24,美術:76,
1班	1033	王83	數學:58,英語:58,語文:38,地理:77,政治:83,生物:48,物理:21,歷史:77,體育:50,美術:85,
1班	1034	王84	數學:99,英語:62,語文:22,地理:60,政治:56,生物:52,物理:80,歷史:88,體育:30,美術:21,計算機:90
1班	1035	王85	數學:53,英語:67,語文:88,地理:80,政治:97,生物:31,物理:94,歷史:95,體育:54,美術:67,
1班	1036	王86	數學:77,英語:27,語文:29,地理:91,政治:84,生物:86,物理:27,歷史:49,體育:33,美術:61,
1班	1037	王87	數學:71,英語:27,語文:26,地理:62,政治:90,生物:96,物理:36,歷史:66,體育:24,
1班	1038	王88	數學:32,英語:91,語文:69,地理:30,政治:98,生物:23,物理:97,歷史:31,體育:71,美術:72,
1班	1039	王89	數學:35,英語:49,語文:22,地理:74,政治:56,生物:78,物理:65,歷史:22,體育:79,美術:80,
1班	1040	王90	數學:62,英語:56,語文:20,地理:94,政治:75,生物:99,物理:95,歷史:60,體育:88,美術:30,
1班	1041	王91	數學:87,英語:34,語文:78,地理:20,政治:93,生物:91,物理:60,歷史:74,體育:80,美術:25,
1班	1042	王92	數學:65,英語:41,語文:46,地理:96,政治:98,生物:33,物理:73,歷史:52,體育:83,美術:92,
1班	1043	王93	數學:69,英語:56,語文:88,地理:88,政治:84,生物:51,物理:50,歷史:72,體育:43,美術:71,計算機:90
1班	1044	王94	數學:79,英語:68,語文:39,地理:33,政治:27,生物:34,物理:46,歷史:25,體育:75,美術:60,
1班	1045	王95	數學:42,英語:39,語文:27,地理:75,政治:41,生物:29,物理:70,歷史:40,體育:70,美術:56,
1班	1046	王96	數學:30,英語:54,語文:85,地理:93,政治:97,生物:24,物理:77,歷史:78,體育:43,
1班	1047	王97	數學:84,英語:51,語文:53,地理:76,政治:27,生物:100,物理:39,歷史:57,體育:72,美術:66,
1班	1048	王98	數學:55,英語:91,語文:76,地理:52,政治:36,生物:72,物理:45,歷史:31,體育:38,美術:69,
1班	1049	王99	數學:97,英語:33,語文:33,地理:64,政治:22,生物:79,物理:83,歷史:54,體育:39,美術:46,
1班	1050	王100	數學:69,英語:79,語文:34,地理:54,政治:46,生物:41,物理:39,歷史:94,體育:74,美術:77,
2班	2001	王1	數學:25,英語:89,語文:96,地理:95,政治:95,生物:52,物理:45,歷史:67,體育:33,美術:27,
2班	2002	王2	數學:45,英語:78,語文:33,地理:44,政治:63,生物:36,物理:96,歷史:29,體育:92,美術:22,計算機:90
2班	2003	王3	數學:45,英語:94,語文:56,地理:37,政治:63,生物:61,物理:91,歷史:79,體育:39,美術:21,
2班	2004	王4	數學:64,英語:87,語文:99,地理:47,政治:63,生物:65,物理:60,歷史:27,體育:82,美術:35,
2班	2005	王5	數學:49,英語:72,語文:72,地理:95,政治:74,生物:23,物理:95,歷史:94,體育:32,美術:66,
2班	2006	王6	數學:22,英語:31,語文:94,地理:30,政治:66,生物:81,物理:74,歷史:72,體育:50,美術:32,
2班	2007	王7	數學:94,英語:30,語文:81,地理:81,政治:99,生物:87,物理:67,歷史:24,體育:53,美術:50,
2班	2008	王8	數學:81,英語:57,語文:71,地理:29,政治:83,生物:89,物理:57,歷史:49,體育:21,美術:76,
2班	2009	王9	數學:52,英語:33,語文:43,地理:63,政治:20,生物:57,物理:93,歷史:80,體育:44,美術:24,
2班	2010	王10	數學:35,英語:81,語文:60,地理:84,政治:29,生物:29,物理:30,歷史:58,體育:39,美術:100,
2班	2011	王11	數學:53,英語:99,語文:81,地理:82,政治:28,生物:24,物理:68,歷史:67,體育:61,美術:28,
2班	2012	王12	數學:30,英語:74,語文:66,地理:35,政治:22,生物:76,物理:93,歷史:57,體育:65,美術:82,
2班	2013	王13	數學:54,英語:42,語文:90,地理:64,政治:64,生物:43,物理:24,歷史:72,體育:68,美術:88,計算機:90
2班	2014	王14	數學:31,英語:89,語文:62,地理:26,政治:58,生物:72,物理:38,歷史:38,體育:52,美術:99,
2班	2015	王15	數學:73,英語:48,語文:36,地理:70,政治:86,生物:63,物理:65,歷史:85,體育:73,
2班	2016	王16	數學:54,英語:84,語文:31,地理:51,政治:76,生物:82,物理:93,歷史:73,體育:23,美術:57,
2班	2017	王17	數學:74,英語:23,語文:38,地理:28,政治:27,生物:43,物理:93,歷史:90,體育:34,美術:42,
2班	2018	王18	數學:65,英語:64,語文:61,地理:58,政治:82,生物:66,物理:25,歷史:60,體育:68,
2班	2019	王19	數學:61,英語:52,語文:31,地理:21,政治:53,生物:29,物理:97,歷史:73,體育:38,美術:94,
2班	2020	王20	數學:45,英語:38,語文:39,地理:92,政治:74,生物:50,物理:22,歷史:59,體育:85,美術:29,
2班	2021	王21	數學:20,英語:53,語文:66,地理:94,政治:43,生物:78,物理:71,歷史:44,體育:68,美術:69,
2班	2022	王22	數學:77,英語:79,語文:55,地理:29,政治:91,生物:65,物理:23,歷史:93,體育:27,美術:66,
2班	2023	王23	數學:48,英語:88,語文:58,地理:27,政治:91,生物:47,物理:84,歷史:41,體育:83,美術:44,
2班	2024	王24	數學:20,英語:60,語文:31,地理:76,政治:24,生物:69,物理:69,歷史:69,體育:25,美術:76,
2班	2025	王25	數學:39,英語:62,語文:92,地理:22,政治:43,生物:81,物理:30,歷史:64,體育:92,美術:48,計算機:90
2班	2026	王26	數學:71,英語:45,語文:24,地理:82,政治:90,生物:26,物理:72,歷史:71,體育:53,美術:74,
2班	2027	王27	數學:21,英語:44,語文:96,地理:67,政治:76,生物:83,物理:83,歷史:53,體育:93,美術:79,
2班	2028	王28	數學:97,英語:59,語文:24,地理:38,政治:27,生物:68,物理:73,歷史:86,體育:74,美術:60,
2班	2029	王29	數學:51,英語:74,語文:41,地理:100,政治:58,生物:69,物理:50,歷史:65,體育:62,
2班	2030	王30	數學:68,英語:76,語文:51,地理:25,政治:99,生物:38,物理:73,歷史:92,體育:74,美術:24,
2班	2031	王31	數學:58,英語:86,語文:22,地理:41,政治:59,生物:41,物理:29,歷史:74,體育:38,美術:64,
2班	2032	王32	數學:42,英語:73,語文:40,地理:71,政治:44,生物:85,物理:61,歷史:46,體育:45,美術:44,
2班	2033	王33	數學:52,英語:76,語文:24,地理:71,政治:84,生物:65,物理:75,歷史:44,體育:51,美術:95,
2班	2034	王34	數學:35,英語:98,語文:54,地理:33,政治:61,生物:79,物理:70,歷史:66,體育:97,美術:75,
2班	2035	王35	數學:44,英語:92,語文:78,地理:80,政治:73,生物:41,物理:27,歷史:30,體育:71,美術:43,
2班	2036	王36	數學:52,英語:43,語文:93,地理:29,政治:45,生物:65,物理:70,歷史:39,體育:26,美術:38,
2班	2037	王37	數學:45,英語:35,語文:39,地理:59,政治:60,生物:44,物理:53,歷史:100,體育:97,美術:24,計算機:90
2班	2038	王38	數學:38,英語:71,語文:23,地理:52,政治:55,生物:63,物理:95,歷史:93,體育:84,美術:66,
2班	2039	王39	數學:32,英語:89,語文:52,地理:21,政治:26,生物:89,物理:92,歷史:27,體育:97,
2班	2040	王40	數學:89,英語:29,語文:63,地理:69,政治:90,生物:60,物理:66,歷史:95,體育:83,美術:50,
2班	2041	王41	數學:71,英語:71,語文:73,地理:24,政治:69,生物:46,物理:27,歷史:21,體育:40,美術:43,
2班	2042	王42	數學:71,英語:31,語文:56,地理:40,政治:85,生物:47,物理:73,歷史:71,體育:94,美術:66,
2班	2043	王43	數學:100,英語:91,語文:99,地理:90,政治:86,生物:63,物理:57,歷史:21,體育:45,美術:67,
2班	2044	王44	數學:74,英語:81,語文:87,地理:73,政治:78,生物:44,物理:45,歷史:20,體育:25,美術:84,
2班	2045	王45	數學:87,英語:97,語文:68,地理:94,政治:73,生物:51,物理:44,歷史:38,體育:59,美術:55,
2班	2046	王46	數學:67,英語:48,語文:45,地理:63,政治:20,生物:61,物理:82,歷史:35,體育:85,美術:91,
2班	2047	王47	數學:62,英語:68,語文:92,地理:50,政治:48,生物:94,物理:52,歷史:68,體育:80,美術:44,
2班	2048	王48	數學:91,英語:31,語文:69,地理:27,政治:40,生物:54,物理:28,歷史:57,體育:55,美術:40,
2班	2049	王49	數學:45,英語:44,語文:61,地理:91,政治:77,生物:83,物理:51,歷史:23,體育:29,美術:77,
2班	2050	王50	數學:24,英語:41,語文:79,地理:57,政治:67,生物:65,物理:38,歷史:94,體育:26,美術:83,

原始碼檔案

 

相關文章