C语言课程设计保过版Word文件下载.doc
《C语言课程设计保过版Word文件下载.doc》由会员分享,可在线阅读,更多相关《C语言课程设计保过版Word文件下载.doc(19页珍藏版)》请在冰点文库上搜索。
intmain()
{ chars[100],t[100];
intm;
clrscr();
printf("
\nPleaseenterstringS:
"
);
scanf("
%s"
s);
\nPleaseentersubstringt:
t);
m=fun(s,t);
\nTheresultis:
m=%d\n"
m);
return0;
(2)函数fun的功能是:
从低位开始取出长整形变量s中偶数位上的数,依次构成一个新的数放在t中。
例如,当s中的数为7654321时,t是得数为642.请改正程序中的错误,使程序能得出正确的结果。
注意不要改动main函数,不得增行或删行,也不得更改程序的结构。
程序如下:
voidfun(longs,longt)
{
longs1=10;
s/=10;
*t=s%10;
While(s<
0)
s=s/100;
*t=s%10*s1+*t;
s1=s1*10;
}
longs,t;
nPleaseenters:
%ld"
&
s);
fun(s,&
t);
Theresultis:
%ldn"
3.综合设计题目:
计算24点
(1)问题描述:
计算24点是流行的扑克游戏。
其方法是任意取出4张牌,AJQK王牌算1,其它牌按点数计算,花色不计,目标是通过加、减、乘、除和括号最终计算出24。
设计一个程序,输入4个数字(1~10),则列出所有可能计算结果为24的方案。
(2)功能要求:
方案不能重复(加法乘法交换律等算不同方案)。
计算中局部可以分为分数,结果为整数即可(如3377算法:
(3+3/7)*7。
如果没有找到方案,输出:
无解。
二、设计思路
-3-
基本要求题
图1第1题算法流程图
设计思路:
将所有人编号a[i]=i。
开始1-3报数,报至3的人的人编号置0,剩余人数-1,报至队尾时返回队首继续报数,只有编号非0的人参与报数。
剩余人数为1时结束报数,此时编号不为0的人即为剩下的最后一人,编号就是此人的初始位置。
图2第2题main函数算法流程图
图3第2题count函数算法流程图
先将n名学生的信息输入一个结构体数组中。
然后显示菜单,根据键盘输入选择执行不同的子程序,或退出程序。
无效的输入将返回主菜单;
子程序执行完毕也返回主菜单。
仅当没有计算过总分时才计算总分。
计算完毕即显示每名同学的总分。
图4第2题sort函数算法流程图
不改变学生数据stu[i],而是建立指向stu[i]的指针数组p[i],将p[i]排序,执行效率更高,且提高了子程序的内聚性。
-2-
1.修改内容
(1)第14行,修改为:
p++;
第17行:
修改为:
if(*r=='
)
(2)第3行,修改为:
voidfun(longs,long*t)
第8行,修改为:
while(s>
0)
第19行,修改为:
printf("
\nPleaseenters:
第22行,修改为:
%ld\n"
2.综合设计题目:
(1)小组成员及分工
表1组员分工细表
序号
姓名
分工
具体完成的工作
1
薛冰
程序结构设计
流程图设计
主函数main()、表达式处理函数fun()及代码整理
2
乔瑟夫
子程序设计
表达式输出函数print_ans()
及随机数生成函数init()
3
丹尼尔
运算符生成函数make_opt()
及表达式计算函数cal()
(2)主程序流程图及设计思路
图5主程序算法流程图
(3)子程序流程图及设计思路
图6fun()函数流程图
函数主体为永真循环,用break语句退出。
循环体首先清屏,然后显示主菜单,读取键盘输入。
采用枚举算法求解24点。
枚举中,用make_opt()函数生成运算符。
用fun()函数生成表达式并枚举运算组合,输出可行解。
3个运算符只能组成5种运算次序:
((AB)C)D
(AB)(CD)
(A(BC))D
A((BC)D)
A(B(CD))
枚举所有的组合,计算相应的result.当result=24时调用make_ans()输出表达式。
表达式有解时函数返回值为1,否则为0。
14
(4)数据结构:
main函数定义的变量:
intopt[3] 用于保存3个运算符(0~3),其中,
0表示+
1表示–
2表示*
3表示/
intnum[4] 用于保存4个数字(1~10)
fun函数定义的变量:
inttype 用来表示运算符的结合顺序(0~4),其中,
type=0:
((AB)C)D
type=1:
(AB)(CD)
type=2:
(A(BC))D
type=3:
A((BC)D)
type=4:
A(B(CD))
(5)程序结构
函数名
返回值类型
参数列表
函数功能
main
int
正常退出返回0
void
生成人机界面,输入num[4],枚举n(0~63),生成运算符并求解表达式。
输出。
make_opt()
intopt[3]
intn
根据n(0~63)生成3个运算符(0~3表示)
存于opt[3]中。
cal()
double
计算结果
doublen1
intopt
doublen2
计算n1与n2进行opt运算的结果。
4
fun()
有解返回1
无解返回0
intnum[4]
根据opt[3]和num[4]枚举5种运算顺序(type),输出所有结果为24的表达式。
5
print_ans()
inttype
根据opt[3]和num[4]和type(0~4)输出表达式。
(6)扩展功能实现
设计函数生成4个随机数(1~10)用于求解24点问题。
子程序结构:
init
intsum[4]
随机生成4个整数(1~10),存入sum[4].
三、程序调试
1.概述
基本要求题输出结果错误。
通过加入额外的输出语句,定位了出错代码的大致位置,最终找出进行了更正。
综合设计题程序提前退出。
通过使用多组有代表性的测试数据,分析运行结果,找到了出错特征,最终定位了出错代码,进行了更正。
表1程序调试记录表
题目
函数
语句
修改结果
备注
基本要求题1
main()
k=1
k=0
报数值从0开始自增。
基本要求题2
sort()
if(flag)
if(!
flag)
flag=0时执行求和语句。
综合设计题
if(f1)break;
if(f1)continue;
执行下次循环。
函数结尾
增加:
printf(“\n”);
输出完毕后换行。
2.课程设计小结
通过加入额外的输出语句和使用特别设计的测试数据,可以帮助查找出错代码的错误特征与大概位置,缩短调试时间。
另外,高级编译器提供的单步调试功能对大规模程序的调试工作帮助很大。
综合设计题程序规模较大,首先应当进行程序结构设计和数据结构设计:
建立主函数流程图,明确各子函数应实现的功能、函数返回值类型、所需函数参数及参数的储存与传递方式。
其中结构化程序设计思想与优秀的数据结构设计可以帮助简化程序结构设计工作。
四、附录
1.程序清单
/*1.1循环报数*/
constn=17;
//n为参加报数的总人数
inta[n];
inti,m,k;
k=0;
//k为报数123
m=n;
//m为剩余总人数
for(i=1;
i<
=n;
i++)//a[i]为每人编号
a[i]=i;
i=1;
//报数起始位置
while(m>
1)//剩余人数多于1时
if(a[i]!
=0)
{
k++;
//报数
if(k==3) //报至3时
a[i]=0;
//剔除此人
k=0;
//k值重置
m--;
//剩余人数-1
}
i++;
if(i==n+1)i=1;
//报至队尾,i值归1
i++)
printf("
ThelastoneisNo.%d\n"
a[i]);
/*1.2学生成绩处理*/
stdlib.h>
windows.h>
typedefstructstudent //数据结构
intnum;
charname[10];
intage;
floatscore1,score2,sum;
}STU;
voidcount(STU*stu,intn,int&
flag) //输出总分和平均分
inti;
if(!
flag) //仅当未计算过总分时才计算
for(i=0;
n;
stu[i].sum=stu[i].score1+stu[i].score2;
flag=1;
姓名\t学号\t总分\t平均分\n"
for(i=0;
printf("
%s\t%d\t%.2f\t%.2f\n"
stu[i].name,stu[i].num,stu[i].sum,stu[i].sum/2);
\n按任意键返回\n"
getch();
voidsort(STU*stu,intn,int&
flag) //按总分降序输出
STU**p,*temp;
p=(STU**)calloc(n,sizeof(STU*));
inti,j;
i++) //p[i]用来储存stu[i]的地址
p[i]=&
stu[i];
flag) //仅当未计算过总分时才计算
i++) //依据p[i]->
sum对p[i]进行排序
for(j=0;
j<
n-i-1;
j++)
if(p[j]->
sum<
p[j+1]->
sum)
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
姓名\t学号\t科目1\t科目2\t总分\n"
//按总分降序输出学生信息
%s\t%d\t%.2f\t%.2f\t%.2f\n"
p[i]->
name,p[i]->
num,p[i]->
score1,p[i]->
score2,p[i]->
sum);
free(p);
intmain() //主函数
intn,i,flag=0;
charch;
STU*stu;
输入学生总数:
%d"
n);
stu=(STU*)calloc(n,sizeof(STU));
学生%d\n"
i+1);
姓名:
scanf("
stu[i].name);
学号:
stu[i].num);
年龄:
stu[i].age);
科目1成绩:
%f"
stu[i].score1);
科目2成绩:
stu[i].score2);
\n"
while
(1) //程序主菜单
system("
cls"
======================\n"
1.输出总分和平均分\n"
2.按总分降序输出\n"
0.退出程序\n"
if(flag)printf("
无效的输入,请重新输入!
ch=getch();
switch(ch)
case'
1'
:
count(stu,n,flag);
flag=0;
break;
2'
sort(stu,n,flag);
0'
free(stu);
return0;
//程序出口
default:
flag=1;
/*24点程序*/
voidmake_opt(intopt[3],intn);
//用n(0-63)生成3个运算符存于opt[]
doublecal(doublen1,intopt,doublen2);
//求相应运算的运算结果
intfun(intopt[3],intnum[4]);
//枚举判断当前opt[],num[]能否组成正确表达式,如果能,
//则输出(也许有多种可能),返回1
voidprint_ans(intopt[3],intnum[4],inttype);
//输出表达式
voidinit(intnum[4]);
//生成随机数
intopt[3],num[4],i,f1=0,f2;
//输入无效时f1=1,表达式无解时f2=1
srand(GetTickCount());
//初始化随机种子
while
(1) //程序主菜单
===========================================================\n"
====\n"
==计算24点是流行的扑克游戏。
其方法是任意取出4张==\n"
==牌,AJQK王牌算1,其它牌按点数计算,花色不计,目标==\n"
==是通过加、减、乘、除和括号最终计算出24。
本程序可==\n"
==根据输入的4个数字(1~10),枚举出所有计算结果为24==\n"
==的方案。
==\n"
if(f1)
\n无效的输入!
f1=0;
\n请输入4个正整数(1~10,中间用空格分隔)或输入0由程序随机生成4个数:
num[0]);
if(num[0]==0)init(num);
//生成随机数
else
for(i=1;
4;
scanf("
num[i]);
i++) //无效输入的处理
if(!
(num[i]>
=1&
&
num[i]<
=10))
f1=1;
if(f1)continue;
f2=1;
64;
i++) //枚举
make_opt(opt,i);
//生成运算符
if(fun(opt,num)) //判断是否有解,输出结果
f2=0;
if(f2)
本组数据无解\n"
按x退出,按任意键继续...\n"
if(ch=='
x'
||ch=='
X'
)break;
//程序出口
/*
3个运算符,每个运算符共4中可能,所以运算符的组合共有4^3=64种,将n(0~63)转化为
4进制,各位数字赋给opt[]即实现了枚举所有运算符组合。
其中:
0代表+
1代表-
2代表*
3代表/
*/
voidmake_opt(intopt[3],intn) //生成运算符
3;
opt[i]=n%4;
n/=4;
doublecal(doublen1,intopt,doublen2) //完成相应运算
doubleresult;
switch(opt)
case0:
result=n1+n2;
case1:
result=n1-n2;
case2:
result=n1*n2;
case3:
result=n1/n2;
returnresult;
3个运算符只能组成5种运算次序,利用type表示不同的运算次序,进行枚举;
type=0:
((AB)C)D
type=1:
(AB)(CD)
type=2:
(A(BC))D
type=3:
A((BC)D)
type=4:
A(B(CD))
枚举计算结果,用print_ans()函数输出所有可行解。
表达式有解时本函数返回值为1,否则为0.
intfun(intopt[3],intnum[4])
intfla