资源描述
C课程设计教学大纲
一、目的与任务
根据高教委的要求,高校学生必须具备扎实的计算机基础知识,具有较强的程序设计和软件开发能力,特别对计算机专业及相关专业(如电子信息工程、通信工程、土木工程等)的学生要求更高。安排课程设计的目的,就是要通过一次集中的强化训练,使学生能及时地巩固已学的基础知识,补充未学的但又是必要的内容,更进一步提高程序设计的能力。望同学们能珍惜此次课程设计的机会,不但要使自己的程序设计能力更上一个台阶,而且要提高与程序设计和软件开发相关的各种综合能力。
二、时间安排
1.课程设计以编程序上机为主,具体按教师每次下发的课程序设计内容进行。
2.总学时为周20个学时。
三、评分标准
课程设计结束后,由指导老师根据学生在课程设计中的表现及任务完成的数量与质量给每个学生评定成绩。总成绩由两部分组成。总成绩=课堂检查成绩*40%+设计报告成绩*60%
1.课堂检查。
在课程设计的每一次,由指导老师分别对每个学生的设计进行检查,检查的内容主要有以下三个方面。
① 每次课程设计完成的数量与质量,可采用学生先汇报并自我评价,然后老师作检查。
② 随机抽取题目对学生提问,从中判定学生的算法设计和程序设计的分析能力。
③ 随机抽取学生地综合设计的模拟运算过程及结果,并作必要的提问,据此判别学生对综合练习的完成情况。
2.课程设计报告
指导教师认真阅读每个学生的课程设计报告,对其系统设计、数据结构设计、算法设计、程序设计等的合理性和质量以及对报告的编写质量作认真的审核,以此作为评定综合练习成绩的主要依据
四、设计报告格式(参考附件一)
文档资料的统一要求:
1、文档中的正文字体用五号宋体。
2、每个问题均要有数据结构分析、算法思想描述、源代码和上机调试的过程及结果。
3.工程名称:学号姓名任务;文件名称:学号姓名任务
4、源代码是C++编辑正确且含有编译、连接的提示信息贴图、程序运行的结果用贴图方式表示。
5、没有按要求做的同学则视为本课程设计不合格。
6、每次上机所做的内容用移动磁盘带走。
五、课程设计内容
第1章 分支与循环
1.1 算法与范例
1.递推算法
递推算法是循环程序设计的精华之一,在很多情况下使用递推算法能使程序简练,同时还能节省计算时间。
递推算法的基本思想:是利用前一项的值来推算出当前项的值,即利用前一项的值乘以(或加上)一系数得到当前项的值。使用递推算法的前堤,必须有一项的值(一般是最前项)是已知的。使用递推算法的关键地,是如何将多项式化成递推公式。
示范:求(即1!+2!+3!+…+20!)的程序
编程提示:n=1 to 20
当n=1时,要做两件事:① 实现t=t*n 注意t=1;② 实现 sum=sum+t 注意sum=0。当n=2时,还是要做以上两件事。因此t=t*n,sum=sum+t是递推项是编程的核心。
参考程序:
#include <stdio.h>
void main()
{double sum=0,t=1; int n;
for (n=1;n<=20;n++)
{t=t*n; sum=sum+t;}
printf("1!+2!+...+20!=%22.15e\n",sum);
}
2.测试法
在实际应用中,有许多问题是无法用解释方法实现的,这时采用测试法来求解是一种很有效的方法。
测试法的基本思想是假设各种可能的解,让计算机进行测试,如果测试结果满足条件,则假设的解就是所要求的解。如果所要求的解是多值的,则假设的解也应是多值的,在程序设计中,实现多值解的假设往往使用多重循环进行组合。
示范:百钱买百鸡问题
已知公鸡每只5元,母鸡每只3元,小鸡1元买3只。要求用100元钱正好买100只鸡,问公鸡、母鸡、小鸡各多少只?
编程提示:设公鸡、母鸡、小鸡分别为a、b、c只,依据题目能列出下列两个方程:
a+b+c=100
5a+3b+c/3=100
这是个不定方程,无法用解释式求解。但可采用多重循环组合出各种可能的a、b、c的值。100元钱,全部买公鸡最多只能买20只,即公鸡的只数范围是:a=1 to 20
100元钱,全部买母鸡最多只能买33只,即母鸡的只数范围是:b=1 to 33
100元钱,全部买小鸡最多只能买100只,即公鸡的只数范围是:c=1 to 100
参考程序:
#include<stdio.h>
void main()
{ int a,b,c; printf("公鸡 母鸡 小鸡\n");
for(a=1;a<=20;a++)
for(b=1;b<=33;b++)
{ c=100-a-b;if(5*a+3*b+c/3==100) printf(" %d %d %d\n",a,b,c);
}
}
1.2 设计任务
1.若一个口袋中放有12个球,其中有3个红色球,3个白色球和6个黑色球,从中任取8个球,问共有多少不同的颜色搭配。
2. 输入年月日,求它是该年的第几天。注:闰年的2月有29天,平年的2月有28天。
3. 简单计算器。请编写一个程序计算表达式:data1 op data2的值。其中op为运算符+、-、*、/。
4. 猜数游戏。由计算机“想”一个数请人猜,如果猜对了,则游戏结束,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到猜对为止。计算机记录人猜的次数,以此可以反映出猜数者“猜”的水平。
1.3 实现过程
1.3.1设计任务1的实现过程
1.算法分析(用文字或流程图进行描述)
2.编写的源程序代码
3.程序运行的结果
1.3.2 设计任务2的实现过程
1.算法分析(用文字或流程图进行描述)
2.编写的源程序代码
3.程序运行的结果
1.3.3 设计任务3的实现过程
1.算法分析(用文字或流程图进行描述)
2.编写的源程序代码
3.程序运行的结果
1.3.4 设计任务4的实现过程
1.算法分析(用文字或流程图进行描述)
2.编写的源程序代码
3.程序运行的结果
第2章 数组与函数
2.1 启示与范例
1.输入n个学生的成绩,并求出其中高于平均分的人数。
编程提示:
用程序来实现本题的要求,首先有两个值得思考的问题:一是数据结构的选择;二是数组的长度。
① 数据结构的选择:n个学生的成绩是否有必要开辟数组来存放还是定义变量来存放?从任务要求分析知,两次用学生成绩,一次是求平均分;另一次是将每个学生的成绩与平均分比较,高于平均分要输出。因此有必要将其定义数组。
② 数组的长度定义:学生个数n的具体数值一般表示在编写程序时是未知的,而在程序执行时由使用者随意确定。即n是一个变量,其值需要用输入来确定。这样一来,存放n个分数的数组a,其长度的定义就必须注意,既不能定义为int a[n];因为数组长度要求是常量,而n是一个变量,又不能将n定义成符号常量,因为n的具体值是未知的。对于这种情况的处理方法一般是:将数组的长度定义较大,让使用者在此范围内随意使用,当然这个长度的定义有其原则,那就是既不让使用者感到长度不够,又不至于定义过大而浪费内存,这种情况视应用情况而定。
参考程序:
#include<stdio.h>
void main()
{int i,a[1000],num=0,n;float aver=0;
printf("输入学生个数n\n"); scanf("%d",&n);
printf("输入学生的成绩存放到数组a中\n");
for(i=0;i<n;i++)
{scanf("%d",&a[i]); aver=aver+a[i]; }
aver=aver/n;
for(i=0;i<n;i++)
if(a[i]>=aver) num++;
printf("高于平均分的人数是:%d\n",num);
}
2.输入任意个学生的学号及成绩,然后按顺序输出高分的前十名。
编程提示:
依据设计任务的要求需要考虑几个问题:初始数据的数据结构选择;采用的算法如何实现及相关的数据结构;任意个数据的实现问题。
① 初始数据的数据结构选择问题:所谓任意个学生,应该是个数不限,因此,对于存放初始数据的数据结构不宜选择为数组。并且,从算法实现的角度考虑,每个学生的数据输入后只需使用一次,没有再保留的必要,因此可选择简单变量作数据结构来存放一个学生的数据,而且每个学生的初始数据都用同一个数据结构存放,即对一个学生的数据使用完后就将该数据结构让给下一个学生的数据使用。
② 算法的实现及相关的数据结构:本题核心的算法是排序,由设计任务可知只要求前十名的排序结果,因此算法上不需考虑对所有学生数据进行排序,只考虑对前十名排序即可。因此,应选择合适的数据结构来存放前十名排序结果的数据,显然,选择数组是最合适的。关于算法的实现可采用插入排序法最为合适。即存放排序结果的数组始终是存放当前已插入数据的前十名的排序结果,而后每输入一个学生的数据就进行一次插入排序更新这一排序结果。
③ 任意个的实现:对于本题的程序来说,总体结构是然是一个循环结构,每次循环的任务是输入一个学生的数据并进行插入排序。问题是何时结束循环?循环结束的条件是什么?对用户输入的有用数据,循环继续;对用户输入的无用数据即输入数据为负数时,循环结束。
④ 为了使程序更加清晰。主程序只提供输入学生的学号、成绩,并且输出前十名的学号及成绩;子函数实现插入排序的过程。
参考程序:
#include<stdio.h>
void insertsort(int num[],int a[],int n,int number,int score)
{int i,j;
for(i=0;i<n;i++)
if(score>a[i])break;
if(i>=n)return;
for(j=n-1;j>i;j--)
{num[j]=num[j-1];a[j]=a[j-1];}
num[i]=number; a[i]=score;
}
void main()
{int i,num[10],a[10],number,score;
for(i=0;i<10;i++)
{a[i]=0;num[i]=0;}
while(1)
{printf("输入学生的学号及学生成绩:\n");
scanf("%d%d",&number,&score);
if(number<0||score<0)break;
insertsort(num,a,10,number,score);
}
for(i=0;i<10;i++)printf("前十名学生学号%d 成绩是%d\n",num[i],a[i]);
}
2.2 设计任务
1.有一个一维数组score[],内存放10个学生的成绩,要求编写三个函数分别求学生的平均成绩,求10个学生的最高分,求10个学生的最低分。
2. 编写一个函数,将输入的一串字符中的小写字母转变成大写字母,并输出所有的大写字母。
3.输入10个学生姓名,按字典顺序将排在最前面的学生姓名输出。即在字符数组中求最小字符串。
4.用函数法求N*N的对角线的和。其中的N是用户通过键盘输入的任意值。
2.3实现过程
2.3.1 设计任务1实现过程
1.算法分析(用文字或流程图进行描述)
2.编写的源程序代码
3.程序运行的结果
2.3.2设计任务2实现过程
1.算法分析(用文字或流程图进行描述)
2.编写的源程序代码
3.程序运行的结果
2.3.3设计任务3实现过程
1.算法分析(用文字或流程图进行描述)
2.编写的源程序代码
3.程序运行的结果
2.3.4 设计任务4实现过程
1.算法分析(用文字或流程图进行描述)
2.编写的源程序代码
3.程序运行的结果
第3章 指针与文件
3.1 启示与范例
1.指针变量作为函数参数最常见有以下两种用法:① 用于接受实参变量的地址,从而可以在函数中通过访问指针变量所指向的内存单元来达到间接地访问实参变量。这样,函数中既可引用实参变量原来的值,也可将结果存入实参变量所在的单元,达到双向传递的效果。② 用于接受实参数组的首地址,从而可以在函数中通过访问指针变量所指向的内存单元及基以下的各元素来达到间接访问实参数组的各元素,这样,函数中既可以引用实参数组各元素的值,也可以将结果存入实参数组的各元素中。
示例1:通过改变指针的指向来引用不同元素法:编写输入100名学生的成绩,输出其中高于平均分的人数。
参考程序如下:
#include<stdio.h>
int over_aver_number(int *a,int n)
{int i,number=0; float aver=0;
for(i=0;i<n;i++)
aver+=*a++; //a++的作用是每执行一次循环就让指针变量a指向下一个元素,使以后的访问就直接访问a所指向的内存单元,不需再作地址计算。
aver/=n;
a-=n; // a-=n的作用是使a恢复其初始指向。
for(i=0;i<n;i++)if(*a++>=aver) number++;
return number;
}
void main()
{int i,number,a[100]; //a是数组名,是指针常量。
printf("\n Enter a:");
for(i=0;i<100;i++) scanf("%d",&a[i]);
number=over_aver_number(a,100);
printf("\n输出高于平均分的人数number=%d",number);
}
2.文件的输出只要求掌握其基本用法,且一般是按指定格式输出到文件中。对文件输入,除了基本用法外,还必须注意文件中数据的格式与输入语句的格式相匹配,否则输入的数据会失真。对文本文件的读写步骤如下:
① 打开文件;对应的函数是fopen
② 读/写文件;对应的函数是fscanf/fprintf
③ 关闭文件;对应的函数是fclose
示例2:从键盘读入若干个字符串,对它们按字母大小顺序排序,然后把排序好的字符送到磁盘文件中保存
参考程序如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{ FILE *fp; char str[3][10],temp[10]; int i,j,k,n=3;
printf("请输入字符串:\n");
for(i=0;i<n;i++) gets(str[i]);
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
if(strcmp(str[k],str[j])>0) k=j;
if(k!=j)
{strcpy(temp,str[i]);strcpy(str[i],str[k]); strcpy(str[k],temp); }
if((fp=fopen("F:\\wang\\string.dat","w"))==NULL)
{ //要将一个已经排好序的string.dat数据文件存放在F盘wang目录下
printf("打开文件失败!\n"); exit(0);}
printf("\nThe new sequence:\n");
for(i=0;i<n;i++)
{fputs(str[i],fp);fputs("\n",fp);printf("%s\n",str[i]);
}
}
}
3.2 设计任务
1.已知一个整型数组a[5],其各元素值为4,6,8,10,12。使用指针法求该数组元素之积。
2.100个围成一圈,从第1个人开始,每数到3的人出圈。问最后一个出圈的人是哪一个。3.编写一个排序函数,要求这个函数既能完成从小到大排序,又能完成从大到小排序,并编写主函数完成:
① 输入n个数;
② 组织调用排序函数对n个数重排,要求重排后的结果是以最小值所在位置为界,前段数据按从大到小排序,后段数据按从小到大排序;
③ 输出重排结果。
3.3实现过程
3.3.1 设计任务1实现过程
1.算法分析(用文字或流程图进行描述)
2.编写的源程序代码
3.程序运行的结果
3.3.2设计任务2实现过程
1.算法分析(用文字或流程图进行描述)
2.编写的源程序代码
3.程序运行的结果
3.3.3设计任务3实现过程
1.算法分析(用文字或流程图进行描述)
2.编写的源程序代码
3.程序运行的结果
第4章 综合设计题(学生可选做其中的一题或两题甚至全部)
4.1 设计任务
设计任务1:运用C语言开发一个“小学生算术四则运算测试系统”。该系统是让计算机充当一位给小学生布置作业的算术老师,为学生出题并阅卷。该系统要求实现下列功能:
1.为小学生出题(分别进行+、-、*、/等不同运算)。
2.学生做题后,进行评阅。学生每做一题后,评阅给出“答题正确,很好”或“答题错误,重做”等信息。
3.加、减、乘、除运算功能可以自由选择实现。
4.运算数值可控制在两位数的四则运算范围内。
设计任务2:运用C开发一个“比赛评分系统”。打分原则为:满分为10分,评委给出分数后,去掉一个最高分和一个最低分后的平均分为选手的最后得分(精确到小数点后两位)。该系统要求实现以下功能:
1.参数人数为n名选手,评委为m名(不得少于11的奇数)。
2.参赛选手按抽签序号依次比赛,统计最后得分。
3.能够查阅选手的得分情况。
4.比赛结束后,整理出“名次表”。
5.公布一、二、三等奖得奖选手名单。
设计任务3:用C开发一个“学生成绩综合管理系统”。该系统要求实现下列功能:
1.读入学生情况数据(学生人数为n,课程门数为m)。
2.按学号顺序输出成绩。
3.输出任一名学生的情况。
4.输出有三门以上课程成绩在90分以上的学生名单。
5.按平均成绩排序输出成绩单。
6.输出各科成绩档次的统计数目。
4.2 设计过程
展开阅读全文