自动化与电气工程学院
2012级C语言程序设计课程设计计划及实施方案
一、设计安排
1、时间安排
课程设计安排在本学期第20周(7月8日—7月12日)和第21周(7月13日—7月17日)。
第20周(7月8日—7月12日):给学生布置设计任务、讲解要求。让学生做第一类基础题和第二类改错题,画出其流程图,写出源代码,并上机调试得出运行结果。根据情况检查学生的完成情况。
第21周(7月13日—7月17日):要求学生做第三类综合题,首先要分析出该题的需求和功能;其次画出各个模块及总程序的流程图;然后编写源代码;最后上机调试得出运行结果。根据情况检查学生的完成情况(要求每个学生做不同的模块)。
7月17日,要求学生完成课程设计报告并参加课程设计检查和小组答辩。
7月17日下午18点前各指导教师完成小组内答辩,并收齐所有课程设计报告。报告按照统一格式完成,课程设计的最终成绩由各指导教师根据学生平时的学习情况、课程设计报告及答辩情况综合考虑给出。
2、答疑时间
7月8日(学院楼406):学生确定所选题目;
7月10日下午15:00(学院楼406):检查第一类基础题的流程图、源代码及调试运行结果;
7月12日上午10:00(学院楼406):检查第一类基础题和第二类改错题的流程图、源代码及调试运行结果;
7月16日下午15:00(学院楼406):检查第三类综合题各模块及总程序的流程图、源代码及调试运行结果。
二、设计内容与要求
1、课程设计的基本内容
课程设计题目分成三类,第一类为技巧性强的基础题目,第二类为程序改错题目,
第三类为综合题目。第一类及第二类题目要求每人一题,不得重复,第三类题目可依据题目难度,2-3人为一小组合作完成。每个学生均提交课程设计报告,以此作为主要评分依据。
2、设计基本步骤
设计步骤的规范不但可以培养学生科学的工作方法和作风,而且还能有效地减少错误,提高工作效率。因此必须严格执行良好的设计规范。本课程设计的基本步骤是:(1)问题分析及解决方案框架确定
充分地分析和理解问题本身,弄清要求做什么(What to do?)。在确定解决方案框架过程中(How to do?),综合考虑系统功能,考虑怎样使系统结构清晰、合理、简单和易于调试。最后确定每个过程和函数的简单功能,以及过程(或函数)之间的调用关系。
(2)详细设计
确定算法的主要流程,在此基础上进行代码设计(Coding),每个明确的功能模块程序一般不超过60行,否则要进一步划分。
(3)上机调试
上机前程序静态检查可有效提高调试效率,减少上机调试程序时的无谓错误。
静态检查主要有两种途径:用一组测试数据手工执行程序;通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑,把程序中的明显错误事先排除。
(4)完成课程设计说明书
课程设计说明书内容应有如下几部分组成:
1)引言:说明设计目的,要求和设计方法;
2)设计
设计思路:主要算法思想分析
设计表示:每个函数或过程的功能,列出每个过程或函数所调用的过程或函数
流程图:画出清晰的主程序及各模块流程图
源代码:编写主程序及各模块函数的源代码
实现注释:各项功能的实现程度、在完成基本要求的基础上还实现了什么功能
3)调试报告:调试过程中遇到的主要问题,是如何解决的;对设计和编码的
回顾讨论和分析;改进设想;经验和体会等。
4)运行及测试结果。如果题目规定了测试数据,则结果要包含这些测试数据
和运行输出,当然还可以含其他测试数据和运行输出。
5)总结:对设计方法,结果等进行总结;
6)参考文献:给出设计中主要参考的文献;
3、课程设计报告形式要求
(1)设计报告仅是对设计目的、设计任务及自己所做设计的说明,不允许对原理内容描述过多。
(2)设计报告形式
1.纸型:A4纸,单面打印;
2.封面填写内容格式:中文,宋体,四号;数字及英文字符,Times New Roman,
四号。
3.页边距:上2.5cm,下2.5cm,右2.5cm,左:3.5CM,左侧装订。
4.页眉页码:页码居中,底部,Times New Roman,小五,正文起始页页码为1。封面不允许出现页眉页码。页眉页码由正文开始,一律用阿拉伯数字连续编页码。页码必须标注在每页页脚底部居中位置,宋体,小五。行距为最小值9磅,段前为30磅、段后为0。页眉宋体,五号,居中。填写内容是“c语言程序设计课程设计报告”。行距为最小值9磅,段前为0、段后为30磅。
5.正文格式:
(a) 章节标题格式:
一级标题:中文,宋体,加粗,英文,Times New Roman,加粗,小三,1.5倍行距,居左;
二级标题:中文,宋体,加粗,英文,Times New Roman,加粗,四号,1.5倍
行距,居左。
(b) 正文格式:
中文:宋体,小四;
英文:Times New Roman,小四;
多倍行距 1.25,间距:段前、段后均为0行,取消网格对齐选项。设计(论文)中文字之间不允许有空行,文字与图之间不允许有多行空白。
(c) 源程序代码格式:Times New Roman,小四,单倍行距。
三、设计大纲
1、目的
进一步培养学生结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解,针对c语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。
为了使学生从课程设计中尽可能取得比较大的收获,对课程设计题目分成2类,第一类为技巧性强的基础要求题目,第二类为综合题目。学生从第一类中选择1个题目,从第二类中选择1个题目进行设计。
2、课程设计的要求和过程管理
设计步骤的规范不但可以培养学生科学的工作方法和作风,而且还能有效地减少错误,提高工作效率。因此必须严格执行良好的实验步骤规范(包括上级操作规范)。本课程设计的基本步骤是:
1.问题分析及解决方案框架确定
充分地分析和理解问题本身,弄清要求做什么(What to do?)。在确定解决方案框架过程中(How to do?),综合考虑系统功能,考虑怎样使系统结构清晰、合理、简单和易于调试。最后确定每个过程和函数的简单功能,以及过程(或函数)之间的调用关系。
2.详细设计和编码
确定算法的主要流程,在此基础上进行代码设计(Coding),每个明确的功能模
块程序一般不超过60行,否则要进一步划分。
3.上机前程序静态检查
上机前程序静态检查可有效提高调试效率,减少上机调试程序时的无谓错误。
静态检查主要有两种途径:用一组测试数据手工执行程序;通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑。把程序中的明显错误事先排除。
4.上机调试程序
5.完成课程设计报告
①需求和规格说明:问题描述:题目要解决的问题是什么
②设计
设计思路:主要算法思想
设计表示:每个函数或过程的功能,列出每个过程或函数所调用的过程或函数实现注释:各项功能的实现程度、在完成基本要求的基础上还实现了什么功能详细设计:主要算法的伪代码。这部分不作强制性要求
③调试报告:调试过程中遇到的主要问题,是如何解决的;对设计和编码的回顾讨论和分析;改进设想;经验和体会等
④附录:源程序清单和结果。如果题目规定了测试数据,则结果要包含这些测试数据和运行输出,当然还可以含其他测试数据和运行输出。
3、考核评估
通过程序实现、总结报告和学习态度综合考评,并结合学生的动手能力,独立分析解决问题的能力和创新精神。成绩分优、良、中、及格和不及格五等。
考核标准包括:
1、程序设计的正确性,程序结构是否合理、编程风格。
2、学生的工作态度、动手能力、创新精神。
3、总结报告。
总成绩评定:满分为100分,总分=第一项成绩×50%+第二项成绩×20%+第三项
成绩×30% 90-100分为优秀,80-89分为良好,70-79分为中等,
60-69分为及格,60分以下为不及格。成绩单上按优秀、良好、中
等、及格和不及格填写。
4、课程设计实习题
(一)基本要求题目
1、一司机出车祸后驾车逃离现场,第一位目击者记得车牌号前两位数字相同,且后两位数字也相同;第二位目击者是一位数学家,他看出车牌号是四位完全平方数。试编程推算肇事车的车牌号。
2、有17个人围成一圈,从0号的人开始报数,凡报到3的倍数的人离开圈子,然后再数下去。直到最后只剩下一个人为止。问此人原来的位置是多少号。
3、编写一个程序,求3X4数组的转置矩阵。要求在main函数里读数,在change 函数里把矩阵转置。
4、用条件编译方法实现以下功能:输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母(如’a’变成’b’……….’z’变成’a’。其他字符不变)。用#define命令来控制是否要译成密码。例如:#define change 1 ,则输出密码。若#define change 0,则不译成密码,按原码输出。
5、用指向指针的方法对n个字符串排序并输出。
6、用指向指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。N 个整数在主函数中输入。最后在主函数中输出。
7、有n个学生,每个学生的数据包括学号、姓名、年龄和两科成绩。请编程用结构类型的数据处理方式实现如下目标:(1)在main函数中输入原始数据;(2)在count 函数中输出各学生的总分和平均分;(3)输出总分最高的学生;(4)编写sort函数将各学生的数据按总分降序输出。
8、用链表方式建立5个学生的成绩统计表,每个学生的信息包括学号和一门课成绩。要求:(1)程序执行前只含头结点;(2)从键盘输入各学生的成绩时,按学号输入,但各学生在链表中所占接点的位置按成绩的高低排列;(3)程序要能删除特定分数线以下的学生所占的结点,并释放相应的内存。
9、编写文件拷贝程序,执行格式:HCOPY file_name1 file_name2
10、编写对C源程序加行号的程序,执行格式:ADD file_name
11、编写求 Xn函数
12、编写求以下函数
13、编写求子串函数substr(s,n1,n2),在串s中从n1位置开始取n2个字符的子串
14、文本文件连接程序:FCAT file_name1 file_name2
15、超文本文件转换成文本文件程序:TRAN file_name1 file_name2
16、文件分割程序:FG file_name SIZE,如FG XSDOS.LHP 360K
17、文件加密程序:将待加密文件以二进制打开,读入32个字节,分别与口令异或,在将4、5、6三个字分别与0xaaaa异或,即完成加密,执行第二次就解密
18、求矩阵a、b乘积,结果存入矩阵c中并按矩阵形式输出。
矩阵相乘的前提:矩阵A(m×p)的列数p=矩阵B(p×n)。即:C(m×n)=A·B 要求
A=
B=
C= 3
其计算公式是: (i=1,2,…,m j=1,2,…,n) Σ==pkkjikbacij1
19、编写字串 str1 中找出所有小写字母转成大写字母,大写字母转成小写字母后,结果依次存入字符数组 str2 中,str1 不变仍为原字串的程序。例如,字符串 str1 为 "91A2BC. a1bc",调用函数 fun 后,字符数组 str2将存入"91a2bc. A1BC",str1仍然是"91A2BC. a1bc"。
20、编写一个将某个范围在-32768~32767之间的整数转换为R进制(R=2,5,8,16)的通用程序。
(二)程序改错题
程序1:
#include
main()
{
int i,j;
char ch;
while(ch=getch()!='\r')
{
i++;
printf("%c",ch);
}
printf("you type %d characters\n",i);
}
程序2:
#include
#include
main()
{
int i,j;
int sum,k=0;
for(i=0;i<5;i++);
{
printf("input a number:");
scanf("%d",k);
sum+=k;
}
printf("the sum is %d",sum);
}
程序3:
#include
main()
{
int i,j;
clrscr();
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
if(i=j)break;
printf("* ");
}
printf("\n");
}
程序4:
#include
int fun( )
{
int a[3][3], sum;
int i, j;
_____;
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
scanf("%d" a[i][j]);
}
for(i=0; i<3; i++)
sum = sum * a[i][i];
printf("Sum=%d\n", sum);
}
main( )
{ fun( ); }
程序5:
#include
#include
void fun(int a, b)
{
int t;
t = b; b = a ; a = t;
}
main( )
{
int a, b;
clrscr( );
printf("Enter a,b :"); scanf("%d%d", &a, &b);
fun(&a, &b);
printf("a=%d b=%d\n", a, b);
}
程序6:
#include
#include
fun(double *a, *b)
{
if(a*b > 0.0)
return 1;
else
return 0;
}
main( )
{
double n, m;
clrscr( );
printf("Enter n , m : "); scanf("%lf%lf", &n, &m);
printf("\nThe value of function is: %d\n", fun(&n, &m));
}
程序7:
#include
#include
#include
int fun(char *s, char *t)
{
int n; char *p, *r;
n = 0;
while(*s)
{
p = s; r = t;
while(*r)
if(*r == *p)
{
r++;
p++
}
else
break;
if(r == '\0')
n++;
s++;
}
return n;
}
main( )
{
char s[100], t[100]; int m;
clrscr( );
printf("\nPlease enter string S:" );
scanf("%s", s);
printf("\nPlease enter substring t:");
scanf("%s", t);
m = fun(s, t);
printf("\nThe result is : m = %d\n", m);
}
程序8:
对候选人得票的统计程度。设由3个候选人,每次输入一个得票的候选人的名字,要求最后输入各人得票结果。(总票数为n)。
程序如下:
#include
struct person
{
char name[20];
int count;
}
leader[3]={"Li",0,"Zhang",0,"Fun",0};
main()
{
int i,j; /*error*/
char leader_name[20];
scanf("%d\dn",&n);
for(i=0;i<=n;i++) /*error*/
{
scanf("%s",leader_name);
for(j=0;j<3;j++)
if(leader_name==leader[j].name) /*error*/
}
printf("\n");
for(i=0;i<3;i++)
printf("%5s:%d\n",leader[i].name,leader[i].count);
}
程序9:
函数str1的功能是输入一个英文句子(字符串),将其中每个单词的最后一个字母改写成大写,然后输出此句子。(这里的"单词"是指由空格隔开的字符串)。例如:若输入:"this is a book ",则应输出:"thiS iS A booK "请改正函数str1中的两个错误,使程序能输出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
程序如下:
#include "stdio.h"
#include "ctype.h"
#include "conio.h"
void str1(char *p)
{
int k=0;
for(;*p;p++)
if(k)
{
if(p==' ')
{
k=0;
*p=toupper(*(p-1));
}
}
else
k=1;
}
void main()
{
char str[100];
int d;
clrscr();
printf("\n please input a string:");
gets(str);
str1(str);
printf("\nafter changing:\n %s",str);
}
程序10:
下列给定程序中,函数fun的功能是:分别统计字符串中大写字母和小写字母的个数。例如:给字符串s输入:AAaaBBb123CCccccd,则应该输出结果:upper=6,lower=8。请改正程序中的错误,使程序能得出正确的结果。注意,不要改多main函数,不得增行或删行,也不得更改程序的结构。
程序如下:
#include
void fun (char *s,int a, int b)
{
while(*s)
{
if (*s>='A' && *s<='Z')
a++;
if (*s>='a' && *s<='z')
b++;
s++;
}
}
main()
{
char s[100];int upper=0,lower=0;
clrscr();
printf("nPlease a string:");gets(s);
fun(s,&upper, &lower);
printf("n upper=%d lower=%dn",upper,lower);
}
程序11:
下列给定程序中,函数fun的功能是:逐个比较a、b两个字符串对应位置中的字符,把ASCII值大或等于的字符一次存放到c数组中,形成一个新的字符串。例如,若a中的字符串为aBCDeFgH,b中的字符串为:ABcd,则c中的字符串为:aBcdeFgh。请改正程序中的错误,使程序能得出正确的结果。注意,不要改多main函数,不得增行或删行,也不得更改程序的结构。
程序如下:
#include
void; fun(char *p,char *q,char *c)
{
int k=1;
while(*p!=*q)
{
if (*p<*q) c[k]=*q;
else c[k]=*p;
if (*p) p++;
if (*q) q++;
k++;
}
}
main()
{
char a[10]="aBCDeFgh",b[10]="ABcd",c[80]={''};
fun(a,b,c);
printf("The string a:"); puts(a);
printf("The string b:"); puts (b);
printf("The result:"); puts(c);
}
程序12:
下列给定程序中,函数fun的功能是:依次取出字符串中所有数字字符,形成新的字符串,并取代原字符串。请改正程序中的错误,使程序能得出正确的结果。注意,不要改多main函数,不得增行或删行,也不得更改程序的结构。
程序如下:
#include
void fun (char *s)
{
int i,j;
for (i=0,j=0;s[i]!='\0';i++)
if (s[i]>='0' && s[i]<='9')
s[j]=s[i];
s[j]="\0";
}
main()
{
char item[80];
clrscr();
printf("\nEnter a string:");
gets(item);
printf("\n\nThe string is :\%s\n",item);
fun (item);
printf("\n\nThe string of changing is :\%s\n",item);
}
程序13:
假定整数数列中的数不重复,并存放在数组中。下列给定程序中,函数fun的功能是:删除数列中值为x的元素。n中存放的是数列中元素的个数。请改正程序中的错误,使程序能得出正确的结果。注意,不要改多main函数,不得增行或删行,也不得更改程序的结构。
程序如下:
#include
#define N 20
fun (int *a,int n, int x)
{
int p=0,i;
a[n]=x;
while (x!=a[p])
p=p+1;
if (p==n)
return -1;
else
{
for (i=p;i a[i+1]=a[i]; return n-1; } } main() { int w[N]={-3,0,1,5,7,99,10,15,30,90},x,n,i; n=10; printf("The original data:n"); for (i=0;i printf("%5d",w[i]); printf("nInput x (to delete):"); scanf("%d",&x); printf("Delete:%dn",x); n=fun(w,n,x); if (n==-1) printf("***Nor be found!***nn"); else { printf("The data after deleted:n"); for (i=0,i printf("%5d",w[i]);printf("nn"); } } 程序14: 下列给定程序中,函数fun的功能是:根据整型形参m的值,计算如下公式的值。t=1-1/2×2-1/3×3-…-1/m×m。例如,若m中的值为5,则应输出:0.536389。请改正程序中的错误,使程序能得出正确的结果。注意,不要改多main函数,不得增行或删行,也不得更改程序的结构。 程序如下: #include #include double fun (int m) { double y=1.0; int i; for (i=2;i y-=1/(i*i); return(y); } main () { int n=5; clrscr(); printf("\nRhe result is %1f\n",fun(n)); } 程序15: 下列给定程序中,函数fun的功能是:用选择法对数组中的n个元素按从小到大的顺序进行排序。请改正程序中的错误,使程序能得出正确的结果。注意,不要改多main 函数,不得增行或删行,也不得更改程序的结构。 程序如下: #include #define N 20 void fun(int a[],int n) { int i,j,t,p; for (j=0;j { p=j for (i=j;i,n;i++)