C程序设计很好的版本.docx
《C程序设计很好的版本.docx》由会员分享,可在线阅读,更多相关《C程序设计很好的版本.docx(14页珍藏版)》请在冰豆网上搜索。
C程序设计很好的版本
HUNANCITYUNIVERSITY
C语言课程设计
报告
课程名称:
C语言课程设计
专业:
计算机科学与技术
学生姓名:
周志强
班级学号:
1006402-07
分组成员:
曹立清、王晓洁
指导教师:
谭新良老师
C语言上机实习报告
1006402—07周志强
一、设计时间
2011年11月24日—11月28日
二、设计地点
湖南城市学院1实验楼计算机机房406
三、设计目的
1.熟练掌握C语言的基本知识:
数据类型(整形、实型、字符型、数组、结构等);运算符(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用);预处理命令(宏定义、文件包含、条件编译)等。
2.掌握各种函数的应用,包括输入输出函数、数学函数、字符操作函数、字符串操作函数、时间函数、绘图函数等。
3.程序=数据结构+算法。
掌握一些常用的算法,包括用辗转相除法求最大公约数;用牛顿迭代法、二分法、弦截法等求高次方程的根;用冒泡法、选择法排序;穷举法等。
4.理解递归函数的运行实现过程,掌握递归程序的编写。
5.学握指针的使用、学会利用位运算处理实际问题,懂得文件的基本操作。
四、设计小组成员
1006402-47曹立清,1006402-07周志强1006402-57王晓洁
五、指导老师
谭新良老师
六、设计课题
我们组成员选取第1,7,9三题进行编程设计
七、基本思路及关键问题的解决
(1)基本思路:
分析题目所要涉及的函数类型、数据类型—分析数据结构及算法—编写程序—运行并检查程序
(2)关键问题的解决:
在画N-S流程图的过程中,关键是搞清程序所表达的意思,然后弄清楚当型、直当型、for以及while的流程图结构和嵌套语句在流程图中的画法。
八、调试过程中出现的问题及相应解决办法
(1)调试运行中的问题
①程序中有死循环;
②程序在等待某些输入信息,并且直到输入正确后才会得出结果;
(2)解决方法
在开始调试这样一个程序时,应该先检查一下程序结构,然后再按执行顺序依次查看程序的各个部分,看看它们是否能正确运行。
①程序中有死循环:
先检查检查一下循环结构,重新编辑运行;如果运行出错,直接关闭程序。
②程序在等待某些输入信息,并且直到输入正确后才会得出结果:
运行程序时注意输入值的限制条件,在进行运行。
九、算法及流程图
第1题流程图:
第7题流程图:
第9题流程图:
建立链表的N-S图
n=0
p1=p2=(structstudent*)malloc(LEN):
开辟一个新单元
输入第一个学生的学号和成绩numscore
head=NULL头指针不知想任何有用的储存单元
while(p1->num!
=0)
n=n+1
Tn等于1
F
haed=p1
P2->next=p1
p2=p1
P1=(structstudent*)malloc(LEN)
输入学生的学号和成绩scanf(“%d,%d,&p1->=num,&p1->score”)
P2->next=NULL
返回有指针所指的内容
合并链表的N-S图
Pa2=pa1=ah
Pb2=pb1=bh
While((pb1->num>pa1->num)&&(pa1->next!
=NULL)
pa2=pa1
pa1=pa1->next
Pb1指向的等号小于
T
或等于所指向的学号
F
ah=pal
T
F
ah=pb1
Pa2->next=pb1
Pb1=pb1->next
Pb2->next=pa1
Pa2=pb2;pb2=pb1
While(pa1->next!
=NULL)||(pa1==NUL:
L&&pb1!
=NULL)
(pb1!
=NULL)&&(pb1->num>
T
Pai->num)&&(pa1->next=NULL)
F
Pa1->next=pb1
返回ah
十、课程设计心得体会
经过这次的课程设计我体会到拥有实的基础很关键,因为如果你平时学得就不怎么样,那么你面对这么一个比较有难度的程序,你可能会望而却步,看他人的程序都是个难点,更别说让你自己去设计。
为了解决此。
类问题,最好就是多向同学,老师请教,不要怕难为情。
尤其是老师,评他们多年的编写程序的经验,要解决我们的问题,对他们来说只是smallcase。
此外我非常感谢老师们给了我们这次的课程设计,它使我更加深刻地体会到多看专业书的重要性,只有掌握了一定量的专业知识才能得心应手地解决诸多问题;另外,做任何事都要有耐心,不要一遇到困难就退缩;在学习和工作中要时刻谨记“团结”二字,它好比通向成功的铺路石,不可或缺。
在这次程序中有过山穷水尽的困惑;有过柳暗花明的惊喜;有过唇枪舌剑的辩论;有过相互鼓励的安慰。
一个多礼拜的时间我们经历了很多,也收获了很多。
与其说它是体力与脑力的作业,不如说它是合作精神和毅力的考验。
经过这次课程设计,我不仅学到了很多知识和技能,更重要的是我们学会了如何运用所学知识去解决实际问题.十一、源程序(每句语言要有详细解释)
1.学生成绩管理系统
管理n个学生的成绩。
每个学生包括学号NO.、姓名name、语文score1、数学score2、外语score3等信息。
输入这n个学生的信息,求出每人的平均分,打印出总分最高的学生的姓名。
#defineN3//定义一个3次循环的N
structstudent//定义"student"这个整体
{charnum[10];//定义num,装载学号,最多占10个字符
charname[10];//定义name,装载名字,最多占10个字符
intscore[4];//定义score,整形变量,装载分数,最多4个字符
floatave;//定义浮点型ave,装载一名学生的平均分
}stu[N];
main()//主函数
{inti,j,max,maxi,sum;//定义整形i,j,max,maxi,sum
floataverage;//定义浮点型average,用来装每个学生的平均分
for(i=0;iprintf("Pleaseinputscoresofstudent%d:
\n",i+1);//屏幕显示循环次数
printf("NO.:
");//输入循环的学生学号
scanf("%s",stu[i].num);//输入学号,赋值给每次循环的num
printf("name:
");//提示输入学生名字
scanf("%s",stu[i].name);//输入学生名字,赋值给每次循环的name
for(j=0;j<3;j++){//设置一个进行3次的循环
printf("score%d:
",j+1);//屏幕显示输入分数,输完后循环+1
scanf("%d",&stu[i].score[j]);//输入分数,分别赋值给每次循环的学生,P.S:
此语句一共将循环3*3=9次
}
}
average=0;//将average的初值设置为0,用来装每个学生的平均分
max=0;//将max的初值设置为0,用来装所有学生成绩最高的
maxi=0;//将maxi的初值设置为0,用来装最大分数学生的学号
for(i=0;isum=0;
for(j=0;j<3;j++)sum+=stu[i].score[j];//将每名学生的成绩加起来,赋值给sum,循环N次
stu[i].ave=sum/3.0;//求出每个学生的平均分,赋值给ave
average+=stu[i].ave;//将每个学生的平均分加起来,赋值给average
if(sum>max)
{max=sum;//当sum>max时,将sum的值赋给max
maxi=i;//将学生的顺序编号赋值给maxi,此时,maxi为最大学生的顺序编号
}
}
average/=N;//求所有学生的平均分
printf("NO.namescore1score2score3average\n");
for(i=0;iprintf("%5s",stu[i].num);//将每位学生的学号输出,占5字符
printf("%10s",stu[i].name);//将每位学生的姓名输出,占10字符
for(j=0;j<3;j++)printf("%9d",stu[i].score[j]);//将每位学生的分数输出,占9个字符
printf("%8.2f\n",stu[i].ave);//输出每名学生的平均成绩
}
printf("average=%6.2f\n",average);
printf("Thehighestscoreis:
%s,scoretotal:
%d\n",stu[maxi].name,max);//将最高成绩输出
getch();//停止
}
7.打印n*n方阵:
#include
#include
voidmain()/*打印n*n的方阵*/
{
intm,n,s=0,i=1,j=1,h,a[21][21];
/*定义一个二维数组,m、n、i、j控制行列,s控制数值*/
printf("Pleaseinputn(1~20):
");
scanf("%d",&n);/*输入一个1~20范围内的数*/
for(m=0;m{
for(h=0;h<=m;h++)
{
a[i][j]=++s;
if(m%2==0){i++;j--;}
else{i--;j++;}
}
if(m%2==0)j=j+1;
elsei=i+1;
}/*控制行列*/
for(m=n-1;m>0;m--)/*为n维数组赋初值*/
{
for(h=0;h{
if(m%2==0){i--;j++;}
else{i++;j--;}
a[i][j]=++s;
}
if(m%2==0)j=j+1;
elsei=i+1;
}/*控制行列*/
for(i=1;i<=n;i++)
{
printf("\n");
for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
}/*以n列为一行输出数组*/
getch();/*将数组输出到屏幕*/
}
9.已有a,b两个链表,每个链表中的结点包括号学号、成绩。
要求把两个链表合并,按学号升序排列。
#include
#include
/*在malloc.h头文件中已包含了宏定义#defineNULL0,故在程序中不必再重复定义*/
#defineLENsizeof(structstudent)
structstudent
{
Longnum;
Intscore;
Structstudent*next;
};
Structstudentlista,listb;
intn,sum=0;
voidmain()
{
structstudent*creat(void);//函数声明
Structstudent*insert(structstudent*,structstudent*);//函数声明
voidprint(structstudent*);//函数声明
structstudent*ahead,*bhead,*abh;
printf(“inputlista:
\n”);
ahead=creat();//调用creat函数,输入表A
sum=sum+n;
printf(“inputlistb:
\n”);
bhead=creat();//调用creat函数,输入表B
sum=sum+n;
ab=insert(ahead,bhead);//调用insert函数,将两表合并
print(abh);//输出合并后的链表
}
Structstudent*creat(void)//建立链表函数
{
Structstudent*p1,*p2,*head;
n=0;
p1=p2=(structstudent*)malloc(LEN);
printf(“inputnumber&scoresofstudent:
\n”);
printf(“ifnumberis0,stopinputing.\n”);
scanf(“%ld,%d”,&p1->num,&p1->score);
head=NULL;
while(p1->num!
=0)
{
n=n+1;
If(n==1)
Head=p1;
else
p2->next=p1;
p2=p1;
p1=(structstudent*)malloc(LEN);
scanf(“%ld,%d”,&p1->num,&p1->score);
}
P2->next=NULL;
return(head);
}
structstudent*insert(structstudent*ah,structstudent*bh)
//定义insert函数,用来合并两个链表
{
structstudent*pa1,*pa2,*pb1,*pb2;
pa2=pa1=ah;
pb2=pb1=bh;
do
{
while((pb1->num>pa1->num)&&(pal->next!
=NULL))
{
pa2=pa1;
pa1=pa1->next;
}
If(pb1->num<=pa1->num)
{
if(ah==pa1)
ah=pb1;
elsepa2->next=pb1;
pb1=pb1->next;
pb2->next=pa1;
pa2=pb2;
pb2=pb1;
}
}while((pa1->next!
=NULL)||(pa1==NULL&&pb1!
=NULL));
If((pb1!
=NULL)&&(pb1->num>pa1->num)&&(pa1->next==NULL))
pa1->next=pb1;
return(ah);
}
voidprint(structstudent*head)//输出函数
{
structstudent*p;
printf(“\nThereare%drecords:
\n”,sum);
p=head;
if(p!
=NULL)
do
{printf(“%ld%d\n”,p->num,p->score);
p=p->next;
}while(p!
=NULL);
}
参考文献
[1]张强华.C语言程序设计[M].北京:
人民邮电出版社,2001.
[2]徐新华.C语言程序设计教程[M].北京:
中国水利水电出版社,2001.
[3]谭浩强.C程序设计(第四版)[M].北京:
清华大学出版社,2010.