《新编C语言程序设计教程》课件第14章
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 14章 C语言程序设计实例
main( )/*主控函数*/ { clrscr( );
input( ); asfun( ); tasfun( ); sortfun( ); output( ); }
第 14章 C语言程序设计实例
void input( )/*获取数据*/ { char ch;
int i,j; char *ps; FILE *fps; printf("请选择数据源(K—键盘输入 F—磁盘文件读取):\n"); ch=getch( ); switch (ch) { case 'K':/*数据从键盘输入*/ case 'k': {printf("请输入实际学生人数:");
第 14章 C语言程序设计实例
2. 数据说明 (1) 学生人数假定不超过1000人, 课程门数假定不超过30 门,分别用符号常量N、M描述。 (2) 实际学生人数、实际课程门数分别用整型量n、m描述。 (3) M门课程名称用二维字符数组sname描述。 (4) 学生数据考虑学号num、姓名name、M门课程成绩, 用结构体stt描述。M门课程成绩用一维数组score描述。N个 学生数据用结构体数组sta描述。
(8) 数据源文件、处理结果文件分别用字符指针变 量ps、pt与文件指针变量fps、fpt描述。
第 14章 C语言程序设计实例
(9) 引入中间整型变量i、 j、 k, i用于循环中控制 学生, j用于循环中控制课程,k对应总分最高的学生 序号。
(10) 数据源文件前面存放学生实际学生人数、 实 际课程门数与课程名称;处理结果文件中学生数据增 加总分、 平均分及名次,课程的平均分和方差、学生 的平均分和方差存放于文件的最后。
}
printf(" 课程平均分 ");
for(j=0;j<m;j++)
printf("%16.2f",avs1[j]);
printf("\n");
printf("
方差 ");
for(j=0;j<m;j++)
printf("%16.2f",sus1[j]);
第 14章 C语言程序设计实例
printf("%16.2\n",sus2); pt="STUDENT.DAT";/*输出数据送磁盘*/ if((fpt=fopen(pt,"wb"))==NULL)
scanf("%d",&n); printf("请输入实际课程门数:");
第 14章 C语言程序设计实例
scanf("%d",&m); if(n<=0||n>1000 ||m<=0 ||m>30)
{ printf("数据无效!"); exit(0);
} printf("请输入%d门课程名称:",m); for(j=0;j<m;j++)
第 14章 C语言程序设计实例
if(sort[l]==i+1) is=l;
printf("%8d%12s",sta[is].num,sta[is].name);
for(j=0;j<m;j++)
printf("%16.2f",sta[is].score[j]);
printf("| %8.2f%8.2f%6d\n",total[is],avs2[is],sort[is]);
第 14章 C语言程序设计实例
fwrite(&sort[i],2,1,fpt); } fwrite(avs1,4,m,fpt); fwrite(&sus2,4,1,fpt); fclose(fpt); }
第 14章 C语言程序设计实例
5. 几点说明 (1) 数据源文件可用字处理软件直接建立。 (2) 程序的实现可以不用数组,而用链表。 (3) 函数之间数据可改用参数传递。 (4) 处理结果还可考虑打印输出。 (5) 流程图请读者画出。 (6) 所做的数据与算法分析可转化成本程序的简单技术文档。
第 14章 C语言程序设计实例
实例二 电子词典程序
1. 在计算机中建立有限规模的电子英汉词典(文件), 利用程序实现电子英汉词典的查找与增、删、 改等维护。
第 14章 C语言程序设计实例
2. (1) 对单词和释义字符串长度的限定分别为不超过20个与 40个字符, 词条数限定为不超过1000条。 (2) 单词数组words,字符串数组。释义数组expls,字符串 数组。 词典中词条总数len,整型变量。 (3) 标志变量flag,在主函数中为0则执行菜单,为1则退出 程序;在进入词典操作命令后,为1则继续执行同一命令,为 0则退回到菜单。 以上变量定义为全局变量。
第 14章 C语言程序设计实例
3.算法分析
(1) 整个程序由主控模块main( )、输入模块input( )、每门课 程的平均分和方差计算模块asfun( )、每个学生的平均分及方差 计算模块tasfun( )、排序模块sortfun( )、输出模块output( )六个模 块组成。
各模块之间顺序执行。
第 14章 C语言程序设计实例
(4) 命令序号num, 整型。 在main( )函数中用于散转执 行对应操作。
(5) 一维字符数组(字符串)word在lookup( )函数中为待 查单词, 在insert( )函数中为r待插入单词,在delete( )函 数中为待删除单词,在modify( )函数中为待修改单词,在 display( )函数中为待显示单词。
(6) 一维字符数组(字符串)expl为待插入释义或待改成的 释义。
(7) 在search1( )和search2( )中,正整数l,查找下限, 形参;正整数r,查找上限,形参;正整数m,中点位置, 计算 得到。
第 14章 C语言程序设计实例
(2) 实际学生人数n、实际课程门数m、原始成绩数据由键盘 输入或从磁盘数据文件读取。
第 14章 C语言程序设计实例
(3) 原 始 成 绩 数 据 由 键 盘 输 入 时 , 将 送 磁 盘 文 件 SCORE.DAT保存。
(4) 方差计算公式为数据平方和的平均值减去数据平均值 的相互之间差别较小。
第 14章 C语言程序设计实例
{t[j]+=sta [i].score[j]; ts[j]+=sta [i].score[j]*sta [i].score[j]; } avs1[j]=t[j]/n; sus1[j]=ts[j]/n-avs1[j]* avs1[j]; } }
void tasfun( )/*计算每个学生的总分、平均分和方差*/ { int i,j;
第 14章 C语言程序设计实例
第 14章 C语言程序设计实例
实例一 成绩处理程序 实例二 电子词典程序 实例三 野人渡河程序
第 14章 C语言程序设计实例
实例一 成绩处理程序
1. 问题描述 进行若干个学生、 若干门课程的成绩处理, 要求计算: (1) 每门课程的平均分和方差。 (2) 每个学生的总分、 平均分及方差。 (3) 按总分对学生由高分到低分排序。
{printf("文件建立错误!"); exit(0);
} fwrite(&n,2,1,fpt); fwrite(&m,2,1,fpt); fwrite(sname,16,m,fpt); for(i=0;i<n;i++)
{fwrite(&sta[i],sizeof(struct stt),1,fpt); fwrite(&total[i],4,1,fpt); fwrite(&avs2[i],4,1,fpt);
} sus2=ts/n? (ta/n)*(ta/n); }
void sortfun( )/*按总分排序*/ { int i,j,k;
for(i=0;i<n;i++) {k=i; for(j=i+1;j<m;j++) if(total[j]>total[k]) k=j; sort[i]=k+1; }
}
float ta=0,ts=0; for(i=0;i<n;i++)
{total[i]=0;
第 14章 C语言程序设计实例 for(j=0;j<m;j++) total[i]+=sta [i].score[j]; avs2[i]=total[i]/n; ta+=avs2[i];ts+=avs2[i]*avs2[i];
第 14章 C语言程序设计实例
(5) 每门课程的平均分和方差分别用一维实型数组 avs1、 sus1描述。
(6) 每个学生的总分、 平均分及方差分别用一维实 型数组total、 avs2和实型量sus2描述。
(7) 排序结果引入一序号数组sort保存。 以上变量定义为全局变量, 同时利用这些变量在函 数之间传递数据。
scanf("%s",sname[j]); for(i=0;i<n;i++)
{printf("请输入第%d个学生学号,姓名,%d门课程成绩:",i+1,m); scanf("%d%s",&sta[i].num,sta[i].name); for(j=0;j<m;j++)
scanf("%f",&sta[i].score[j]); }
(5) 排序采用选择排序方法, 利用序号数组保存学生名 次, 无需交换数据。
(6) 处理结果与原始成绩数据合并后用另一磁盘文件 STUDEN.DAT保存。
第 14章 C语言程序设计实例
4. 参考程序 #include ″stdio.h″ #include ″math.h″ #define N 1000 #define M 30 void input( ); void asfun( ); void tasfun( ); void sortfun( ); void output( );
第 14章 C语言程序设计实例
void output( )/*输出数据*/ { int i,l,j;
int is; char *pt; FILE *fpt; clrscr( );/*输出数据送屏幕*/ printf("%d个学生%d门课程成绩数据如下:\n"); printf(" 学号 姓名 "); for(j=0;j<m;j++) printf("%16s",sname[j]); printf("| 总分 平均分 名次\n"); for(i=0;i<n;i++) {for(l=0;l<n;l++)
第 14章 C语言程序设计实例
defautl: { printf("数据源选择错误! "); exit(0); }
} }
void asfun( )/*计算每门课程的平均分和方差*/ { int j;
float t[M],ts[M]; for(j=0;j<m;j++)
{t[j]=0;ts[j]=0; for(i=0;i<n;i++)
第 14章 C语言程序设计实例 {printf(“请输入数据文件名:”); scanf("%s",ps); if((fps=fopen(ps,"rb"))==NULL)
{ printf("文件打开错误! "); exit(0); }
fread(&n,2,1,fps); fread(&m,2,1,fps); fread(sname,16,m,fps); fread(sta,sizeof(struct stt),n,fps); fclose(fps); break; }
第 14章 C语言程序设计实例
int n, m; struct stt {int num; char *name; float score[M]; }sta[N]; char sname[M][16]; float avs1[M], svs1[M]; float total[N], avs2[N], svs2; int sort[N];
第 14章 C语言程序设计实例
ps="SCORE.DAT";/*送磁盘文件保存*/ if((fps=fopen(ps,"wb"))==NULL)
{ printf("文件建立错误!"); exit(0);
} fwrite(&n,2,1,fps); fwrite(&m,2,1,fps); fwrite(sname,16,m,fps); fwrite(sta,sizeof(struct stt),n,fps); fclose(fps); break; } case 'F':/*数据从磁盘文件读取*/ case 'f ':