(头歌)C语言程序设计------------数组编程

第1关:国王的许诺

任务描述

本关任务: 编写一个求有关数列和的程序,以验证国王能否兑现他的许诺。 【国王的许诺】 相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢国际象棋,让宰相自己选择何种赏赐。 这位聪明的宰相只要“一些”麦子,他指着棋盘说:第1格放1粒麦子,第2格放2粒麦子,第3格放4粒麦子,……,此后每一格的麦粒数在前一格的基础上增加一倍,把这64格棋盘放完即可。 编程计算: 1、放满n格的棋盘共需要多少粒麦子? 2、如果1立方米的麦子有1500000粒,印度的国土面积是298万平方公里,把这些麦子平铺在印度国土上,这个麦子堆的高度是多少米? 3、回答国王能不能兑现许诺:假如麦子堆的高度小于1毫米,国王能兑现许诺,否则不能兑现许诺。

相关知识

为了完成本关任务,你需要掌握:

  1. 如何通过数组计算数列中的各个数据项并求和;
  2. 如何计算麦子堆成的柱体的高度。

计算数列中的各个数据项并求和

将数组中的第一个元素初始化为1,其后的每一个元素的值都等于前一个元素的值乘以2。

计算麦子堆成的柱体的高度

把所有棋格中的麦子数累加起来,除以1立方米的麦子数(1500000)就是这些麦子的体积。这个体积除以印度的国土面积就是麦子堆的高度,注意要将国土面积换算成平方米!

编程要求

1、根据提示,在右侧编辑器Begin和End之间补充代码。先输入棋盘格数(范围1到81格),然后借助数组计算并输出相应棋盘格中放入的麦子总数,以及麦子堆的高度和国王能否兑现许诺。 2、程序中用到的数组名必须为自己姓名拼音的第一个字母,例如:姓名叫“杜庆书”,则用到的数组名为“dqs”;姓名叫“艾力扎提”,则用到的数组名为“alzt”! 3、程序代码要有层次,且符合缩进规范。

测试说明

平台会对你编写的代码进行测试:

测试输入:100 预期输出: 警告:棋盘格数不合适!

测试输入:49 预期输出: 49格棋盘可放562949953421311粒麦子。 将这些麦子平铺在印度国土上,这个麦堆的高度是0.0001米。 国王能兑现许诺!

测试输入:54 预期输出: 54格棋盘可放18014398509481984粒麦子。 将这些麦子平铺在印度国土上,这个麦堆的高度是0.0040米。 国王不能兑现许诺!

提示:

  1. //程序中已经定义了两个变量,存放相应数值
  2. double area=2.98e12; //印度的国土面积是298万平方公里,即2.98e12平方米
  3. 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]

测试说明

平台会对你编写的代码进行测试:

测试输入: 3      4       5

     6  7      8     9      10

      11   12    13   14      15

预期输出: 原矩阵为:  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;

}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失棉的羊 .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值