用C语言编制查询某班同学的平均成绩
1.实验目的与要求
⑴ 掌握用C语言编写查询统计程序。
⑵ 掌握C语言的文件读写的基本操作。
2.实验内容
⑴ 创建一个文本文件,含有若干班级的数据,要求其数据每个班级至少有50位同学,每位同学至少学习10门课程(要考虑各班级中的不同人数以及学习的课程门数不同)
⑵ 写出函数求出某一位的平均成绩
⑶ 写出函数求出每一位的平均成绩
⑷ 使用文件读入相关数据,将运行结果送到文件中
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,
源码文件