第1关:国王的许诺
任务描述
本关任务: 编写一个求有关数列和的程序,以验证国王能否兑现他的许诺。 【国王的许诺】 相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢国际象棋,让宰相自己选择何种赏赐。 这位聪明的宰相只要“一些”麦子,他指着棋盘说:第1格放1粒麦子,第2格放2粒麦子,第3格放4粒麦子,……,此后每一格的麦粒数在前一格的基础上增加一倍,把这64格棋盘放完即可。 编程计算: 1、放满n格的棋盘共需要多少粒麦子? 2、如果1立方米的麦子有1500000粒,印度的国土面积是298万平方公里,把这些麦子平铺在印度国土上,这个麦子堆的高度是多少米? 3、回答国王能不能兑现许诺:假如麦子堆的高度小于1毫米,国王能兑现许诺,否则不能兑现许诺。
相关知识
为了完成本关任务,你需要掌握:
- 如何通过数组计算数列中的各个数据项并求和;
- 如何计算麦子堆成的柱体的高度。
计算数列中的各个数据项并求和
将数组中的第一个元素初始化为1,其后的每一个元素的值都等于前一个元素的值乘以2。
计算麦子堆成的柱体的高度
把所有棋格中的麦子数累加起来,除以1立方米的麦子数(1500000)就是这些麦子的体积。这个体积除以印度的国土面积就是麦子堆的高度,注意要将国土面积换算成平方米!。
编程要求
1、根据提示,在右侧编辑器Begin和End之间补充代码。先输入棋盘格数(范围1到81格),然后借助数组计算并输出相应棋盘格中放入的麦子总数,以及麦子堆的高度和国王能否兑现许诺。 2、程序中用到的数组名必须为自己姓名拼音的第一个字母,例如:姓名叫“杜庆书”,则用到的数组名为“dqs”;姓名叫“艾力扎提”,则用到的数组名为“alzt”! 3、程序代码要有层次,且符合缩进规范。
测试说明
平台会对你编写的代码进行测试:
测试输入:100
预期输出: 警告:棋盘格数不合适!
测试输入:49
预期输出: 49格棋盘可放562949953421311粒麦子。
将这些麦子平铺在印度国土上,这个麦堆的高度是0.0001米。
国王能兑现许诺!
测试输入:54
预期输出: 54格棋盘可放18014398509481984粒麦子。
将这些麦子平铺在印度国土上,这个麦堆的高度是0.0040米。
国王不能兑现许诺!
提示:
//程序中已经定义了两个变量,存放相应数值
double area=2.98e12; //印度的国土面积是298万平方公里,即2.98e12平方米
double v=1.5e6; //1立方米的麦子有1500000粒麦子,即1.5e6粒麦子
代码如下
#include <stdio.h>
#define N 81
int main( )
{
double area=2.98e12;//印度的国土面积是298万平方公里,即2.98e12平方米
double v=1.5e6; //1立方米的麦子有1500000粒,即1.5e6粒
/*** Begin ***/
int a,zfl;
double b,s;
scanf("%d",&zfl);
if(zfl>N)
{
printf("警告:棋盘格数不合适!");
}
else
{
b=1;
s=1;
for(a=0;a<zfl-1;a++)
{
b*=2;
s+=b;
}
printf("%d格棋盘可放%.f粒麦子。\n",zfl,s);
printf("将这些麦子平铺在印度国土上,这个麦堆的高度是%.4f米。\n",s/v/area);
if((s/v/area)>=0.01)
{
printf("国王不能兑现许诺!\n");
}
else
printf("国王能兑现许诺!\n");
}
/*** End ***/
return 0;
}
第2关:求矩阵中的最小元素
任务描述
本关任务: 编写一个程序,求矩阵中最小的那个元素的值,并指明所在的行号和列号。
编程要求
1、根据提示,在右侧编辑器Begin和End之间补充代码。 2、定义一个H行L列(程序开头已将H和L定义成符号常量)的二维int类型数组,数组名必须为自己姓名拼音的第一个字母,例如:姓名叫“王大年”,则用到的数组名为“wdn”;姓名叫“阿依古丽”,则用到的数组名为“aygl”! 3、程序运行时先输入本次要用的矩阵的行数m和列数n,行数m必须在[2,H]之间,列数n必须在[2,L]之间,不在范围要有“行号不合适!”或“列号不合适!”的警告。 4、然后输入这个m行n列矩阵的m×n个元素。 5、计算出矩阵中最小的那个元素的值,以及它所在的行号和列号,并按%5d
形式输出矩阵及相关信息。 6、程序代码要有层次,且符合缩进规范。
算法提示
定义两个变量来记录最小值的行号和列号(如hh和lh),将数组中的第一个元素假定成最小值,即hh=lh=0,然后将二维数组中的每一个元素与当前最小值(即hh行、lh列的元素)相比,如果当前元素比最小值还小,则改变hh和lh为当前的行号和列号。
测试说明
平台会对你编写的代码进行测试:
测试输入: 3
4
11
5
8
23
6
9
22
16
56
4
7
88
预期输出: 11
5
8
23
6
9
22
16
56
4
7
88
最小值4在2行1列。
测试输入: 10
10
预期输出: 行号不合适!
代码如下
#include <stdio.h>
#define H 8 //矩阵的最大行数
#define L 12 //矩阵的最大列数
int main()
{
/*** Begin ***/
int i,j,min,c,d,m,h,l,zfl[H][L];
scanf("%d %d\n",&h,&l);
if(h>H||h<2)
{
printf("行号不合适!");
return 0;
}
if(l>L||l<2)
{
printf("列号不合适!");
return 0;
}
for(i=0; i<h; i++)
{
for(j=0; j<l; j++)
{
scanf("%d",&zfl[i][j]);
}
}
for(i=0; i<h; i++)
{
for(j=0; j<l; j++)
{
printf("%4d",zfl[i][j]);
}
printf("\n");
}
c=d=0;
min=zfl[0][0];
for(i=0; i<h; i++)
{
for(j=0; j<l; j++)
{
if(zfl[i][j]<min)
{
min=zfl[i][j];
c=i;
d=j;
}
}
}
printf("最小值%d在%d行%d列。",min,c,d);
/*** End ***/
return 0;
}
第3关:字符排序
任务描述
本关任务: 编写一个程序,用选择排序法对10个字符按升序进行排序。
编程要求
1、根据提示,在右侧编辑器Begin和End之间补充代码。 2、定义一个具有10元素的char类型的一维数组,数组名必须为自己姓名拼音的第一个字母,例如:姓名叫“阿迪力”,则用到的数组名为“adl”;姓名叫“王楚钦”,则用到的数组名为“wcq”! 3、程序运行时先输入10个字符,然后用选择排序法按由小到大的顺序排序,然后按预期输出格式进行输出。 4、程序代码要有层次,且符合缩进规范。
测试说明
平台会对你编写的代码进行测试:
测试输入: abudureyim
预期输出: 排序结果为:abdeimruuy
测试输入: 1d2A3i4l@5
预期输出: 排序结果为:12345@Adil
代码如下
#include <stdio.h>
#include<string.h>
int main()
{
/*** Begin ***/
char zfl[100];
int i=0;
int j=1;
int n,l;
int m=8;
int x,y,z;
scanf("%s",zfl);
l=strlen(zfl);
m=l;
for(i=0;i<l;i++)
{
for(n=m;n>1;n--)
{
if(zfl[i]>zfl[j])
{
x=zfl[i];
zfl[i]=zfl[j];
zfl[j]=x;
}
j++;
}
j=i+2;
m--;
}printf("排序结果为:");
puts(zfl);
/*** End ***/
return 0;
}
第4关:矩阵转置
任务描述
本关任务: 编写一个程序,将一个H行L列的二维矩阵转置成L行H列的二维矩阵。
编程要求
1、根据提示,在右侧编辑器Begin和End之间补充代码。 2、程序中要使用已经定义好的H和L这两个符号符号常量! 3、定义两个int类型的二维数组,第一个数组存放原矩阵(H行L列),第二个数组存放转置后的矩阵(L行H列),数组名必须为自己姓名拼音的首字母再加1和2区别,例如:姓名叫“王亚萍”,则数组名为“wyp1”和“wyp2”。 4、程序运行时先输入H×L个整数给第一个数组,将其转置后放入第二个数组,然后按预期输出格式输出原矩阵和转置矩阵。 5、程序代码要有层次,且符合缩进规范。
算法提示
a数组转置成b数组后,两数组元素之间满足以下关系: b[j][i]=a[i][j]
测试说明
平台会对你编写的代码进行测试:
测试输入: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
预期输出: 原矩阵为:
1
2
3
4
5
6
7
8
9 10
11
12
13
14
15
转置后的矩阵为:
1
6
11
2
7
12
3
8
13
4
9
14
5
10
15
注意:按%4d格式输出矩阵中的每个元素!
代码如下
#include <stdio.h>
#define H 3
#define L 5
int main()
{
/*** Begin ***/
int i,j,zfl[H][L];
for(i=0; i<H; i++)
{
for(j=0; j<L; j++)
{
scanf("%d",&zfl[i][j]);
}
}
printf("原矩阵为:\n");
for(i=0; i<H; i++)
{
for(j=0; j<L; j++)
{
printf("%4d",zfl[i][j]);
}
printf("\n");
}
printf("转置后的矩阵为:\n");
for(j=0; j<L; j++)
{
for(i=0; i<H; i++)
{
printf("%4d",zfl[i][j]);
}
printf("\n");
}
/*** End ***/
return 0;
}
第5关:字符串大小写转换
任务描述
本关任务: 编写一个程序,输入一个可以包含空格的字符串到字符数组,先将字符串中的字母先转换成大写字母并输出,然后再转换成小写字母并输出。
编程要求
1、根据提示,在右侧编辑器Begin和End之间补充代码。 2、不能使用系统函数strupr()
和strlwr()
,自己写相应的代码来完成字母大小写转换功能。 3、转换过程中其它字符不变。 4、数组名必须为自己姓名拼音的首字母,例如:姓名叫“艾合麦提”,则数组名为“ahmt”。 5、程序代码要有层次,且符合缩进规范。
测试说明
平台会对你编写的代码进行测试: 测试输入: Hello WangHao .
预期输出: 转大写:HELLO WANGHAO .
转大写:hello wanghao .
测试输入: 你好阿Q,Hello AQ. ^_^
;
预期输出:
转大写:你好阿Q,HELLO AQ. ^_^
转大写:你好阿q,hello aq. ^_^
代码如下
#define N 100 //数组的大小
#include <stdio.h>
int main()
{
/*** Begin ***/
char zfl[N];
int i;
gets(zfl);
for(i=0;zfl[i]!='\0';i++)
if(zfl[i]>='a'&&zfl[i]<='z')
zfl[i]-=32;
else if(zfl[i]>='A'&&zfl[i]<='Z')
zfl[i]+=32;//
for(i=0;zfl[i]!='\0';i++)
if(zfl[i]>='a'&&zfl[i]<='z')
zfl[i]-=32;
printf("转大写:");
puts(zfl);
for(i=0;zfl[i]!='\0';i++)
if(zfl[i]>='A'&&zfl[i]<='Z')
zfl[i]+=32;
printf("转小写:");
puts(zfl);
/*** End ***/
return 0;
}