用C语言编制查询某班同学的平均成绩

用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,

源码文件

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值