计算系统和程序设计基础课程设计.docx
《计算系统和程序设计基础课程设计.docx》由会员分享,可在线阅读,更多相关《计算系统和程序设计基础课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
计算机程序设计基础
课程设计
24
目录
一:
捕鱼问题 3
1、【设计题目】 3
2、【设计内容及思路】 3
3、【算法】 3
4、【程序清单与运行结果】 4
二:
荷兰国旗问题 5
1、【设计题目】 5
2、【设计内容及思路】 5
3、【算法】 5
4、【程序清单与运行结果】 6
三:
发纸牌 8
1、【设计题目】 8
2、【设计内容及思路】 8
3、【算法】 8
4、【程序清单与运行结果】 8
四:
数字旋转方阵 10
1、【设计题目】 10
2、【设计内容及思路】 10
3、【算法】 10
4、【程序清单与运行结果】 11
五:
【总结及设计体会】 12
一:
捕鱼问题
1、【设计题目】
A、B、C、D、E五个人合伙夜间捕鱼,上岸时都疲惫不堪,各自在湖边的树丛中找地方睡觉了。
清晨,A第一个醒来,将鱼分成5份,把多余的一条扔回湖中,拿自己的一份回家了;B第二个醒来,也将鱼分成5份,扔掉多余的一条鱼,拿自己的一份回家了;接着,
C、D、E依次醒来,也都按同样的办法分鱼。
问:
5个人至少共捕到多少条鱼?
每个人醒来后看到多少条鱼?
2、【设计内容及思路】
根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条鱼后剩下的鱼正好分成五份,然后拿走自己的一份,余下其它的四份。
假定鱼的总数为X,则X可以按照题目的要求进行五次分配:
X-1后可被5整除,余下的鱼为4*(X-1)、
5。
3、【算法】
采用正推法,fish[0]从1开始每次增加5,然后依次考查fish【n】是
否满足被5证书后余1,算法描述如下:
Step1:
初始化fish【0】=1;Step2:
重复下述操作,直到fish【n】满足被5除后余1;
Step2.1:
fish【0】=fish【0】+5;Step2.2:
循环变量i从1到4,重复执行下述操作;
Step2.2.1:
fish【i】=(fish【i-1】-1)/5*4;
Step2.2.2:
如果fish【i】不满足被5除后余1,则转step2.1;
Step2.2.3:
i++Step3:
依次输出数组fish【n】
4、【程序清单与运行结果】
#include
intmain()
{
charman[5]={'A','B','C','D','E'};
intfish[5],i;fish[0]=1;do
{
fish[0]=fish[0]+5;for(i=1;i<5;i++)
{
fish[i]=(fish[i-1]-1)/5*4;
if(fish[i]%5!
=1)break;
}
}while(i<5);
for(i=0;i<5;i++)
printf("%c看到的鱼数是%d\n",man[i],fish[i]);return0;
}
显示结果:
A看到的鱼是3121
B看到的鱼是2493
C看到的鱼是1996
D看到的鱼是1596
E看到的鱼是1276
二:
荷兰国旗问题
1、【设计题目】
要求重新排列一个由Red、White和Blue(这是荷兰国旗的颜色)构成的数组,使得所有的Red都排在最前面,White排在其次,Blue排在最后。
2、【设计内容及思路】
荷兰国旗问题其实就是一个排序问题,可以将红,白,蓝3种颜色
分别用数字0,1,2表示,用一个数组来存储他们。
将相同颜色线条归为一类就相等于将数组中的数值按大小进行排序,只不过数组里存储的只有3种数值而已。
解题的基本策略是遍历两个颜色区域,如果颜色条不属于所在区域,则交换一个属于该区域的颜色条。
这样,每一次都是有必要的交换,从而实现最少交换次数。
3、【算法】
输入:
数组Colora[n],有Red、White、和Blue三种元素功能:
荷兰国旗
输出:
有序数组Colora[n]
4、【程序清单与运行结果】
#include#include#include#defineNUM10
enumColor{Red,White,Blue};
voidA(enumColora[],intn);voidB(enumColora[],intn);
voidC(enumColora[],intn);
intmain()
{
enumColora[50];A(a,NUM);
printf("初始序列为:
");
C(a,NUM);
B(a,NUM);
printf("荷兰国旗是:
");C(a,NUM);
return0;
}
voidA(enumColora[],intn)
{
inttemp,i;srand(time(NULL));
for(i=0;i{
temp=rand()%3;a[i]=(enumColor)temp;
}
}
voidB(enumColora[],intn)
{
inti=0,k=n-1,j=0;enumColortemp;
while(j{
switch(a[j])
{
caseRed:
temp=a[i];a[i++]=a[j];a[j++]=temp;
break;
caseWhite:
j++;break;
caseBlue:
temp=a[j];a[j]=a[k];a[k--]=temp;
break;
}
}
return;
}
voidC(enumColora[],intn)
{
inti;
for(i=0;i{
switch(a[i])
{
caseRed:
printf("Red");break;caseWhite:
printf("White");break;caseBlue:
printf("Blue");break;
}
}
printf("\n");
}
}
显示结果:
三:
发纸牌
1、【设计题目】
假设纸牌的花色有梅花、方块、红桃和黑桃,纸牌的点数有
A、2、3、4、5、6、7、8、9、10、J、Q、K,请根据用户输入的纸牌张数n,随机发四手纸牌,每手共有n张纸牌。
(所谓一手纸牌指的是一个玩家手里的纸牌)
2、【设计内容及思路】
为避免重复发牌,设二维数组sign【4】【13】记载是否法国某张牌,其中行下标,列下标表示点数,数组元素均为初始化为0.设字符串指针数组card【n】储存随机发的n张纸牌,例如card【0】=“梅花二”。
按以下方法一次发每一张牌:
首先产生一个0~3的随机数i表示花色,再产生一个1~12的随机数j表示点数,如果这张牌尚未发出,则将sign【i】【j】置1,并将这张牌储存到数组card【n】中。
3、【算法】
输入:
数组card[13],有
A、2、3、4、5、6、7、8、9、10、J、Q、K十三种元素
功能:
发纸牌
输出:
有序数组card[13]
4、【程序清单与运行结果】
#include#include#include#include
char*str1[4]={"梅花","黑桃","红桃","方块"};//存储花色
char *str2[13] =
{"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
char*card[13];//最多发13张牌
voidSendCards(intn);voidPrintcards(intn);
intmain()
{
intn;
printf("请输入发牌张数:
");scanf("%d",&n);SendCards(n);
Printcards(n);return0;
}
voidSendCards(intn)
{
intsign[4][13]={0};intk,i,j;srand(time(NULL));for(k=0;k{
i=rand()%4;j=rand()%13;
if(sign[i][j]==1)continue;
else
{
card[k]=(char*)malloc(6);strcpy(card[k],str1[i]);
strcat(card[k],str2[j]);sign[i][j]=1;
k++;
}
}
return;
}
voidPrintcards(intn)
{
for(intk=0;kprintf("%-10s",card[k]);printf("\n");
return;
}
显示结果:
四:
数字旋转方阵
1、【设计题目】
给定方阵的阶数,输出如图1所示N×N(1≤N≤10)的顺时针旋转和逆时针旋转两种数字旋转方阵。
12019181716
22132313015
32233362914
1 2 3 4 5 6
20212223247
19323334258
(a)逆时针旋转方阵 (b)顺时针旋转方阵
图1数字旋转方阵示例
2、【设计内容及思路】
用二维数组data[N][N]储存N*N矩形方阵,分别求N*N的顺时针旋转逆时针旋转两种数字旋转方阵,观察其旋转方阵特点,从而得出
i、j、k之间的关系。
3、【算法】
输入:
二维数组data[N][N]
功能:
给定方阵的阶数,输出N*N的顺时针旋转逆时针旋转两种数字旋转方阵。
输出:
N*N的顺时针旋转逆时针旋转两种数字旋转方阵。
4、【程序清单与运行结果】
#include#defineN10
intdata[N][N]={0};
voidFu