WUT/武汉理工PTA-2021年春-MOOC-《C编程方法学》编程练习题解集

Posted Zack North

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WUT/武汉理工PTA-2021年春-MOOC-《C编程方法学》编程练习题解集相关的知识,希望对你有一定的参考价值。

目录

 

写在前面

第1讲_printf()的简单使用

7-1 1.1输出诗歌

7-2 1.2杨辉三角 (10 分)

第3讲 程序中的输入/输出

7-1 输入日期和时间

7-2 不同类型数据的混合输入 (10 分)

第4讲 顺序结构程序设计

7-1 已知三角形的2个角和1条边,求三角形面积 (10 分)

第5讲 选择结构程序设计

7-1 计算运费 (3.4) (15 分)

7-2 判断BMI指数 (15 分)

第6讲 循环结构程序设计

7-1 统计选票 (15 分)

7-2 E-2求多项式之和 (15 分)

7-4 判断可逆素数 (15 分)

第7讲 一维数组

7-1 计算平均分并输出低于平均分的成绩 (5.1) (10 分)

 7-2 求数组中第二大的元素 (5.8) (15 分)

 7-3 模拟2048游戏(1)--单行向左移动叠加 (15 分)

第8讲 二维数组

7-1 矩阵的转置运算 (20 分)

7-2 大奖赛现场统分 (20 分)

 第9讲 字符数组

7-1 字符串加密 (15 分)

 7-2 统计单词个数 (5.13) (15 分)

7-3 TicTacToe游戏--胜负判定 (15 分)


写在前面

其实很多时候自己在写题目的时候也遇到了很多困难,但是呢,作为一个比较害羞又内向(不是)的小男生,很多时候也不敢直接问老师,很多时候也就想着自己翻翻书本可以得到答案,因此其实很多时间都是被浪费了,所以在这里,也想借助这个平台,给大家一些解答。在遇到困难的时候,可以看看题解,其实很多时候都是一些小问题出了错。

每道题目基本的框架是:

题目(包括题目的基本内容)

难点以及注意点

解决方法

代码

然后呢,写这个题解不容易,也希望大家多多点赞评论关注啦!

有什么问题及时私信我或者评论留言也可以!

第1讲_printf()的简单使用

7-1 1.1输出诗歌

按照如下方式输出诗歌:

输出格式:

第1行从第10列输出;第2行从第15列输出;其他行从第一列输出

输出样例:

 

难点以及注意点:

1、如何从令第1行从第10列输出;第2行从第15列输出

解决方法:

%ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。(在使用的时候要记得加上字符的长度)

代码:

#include<stdio.h>
int main()
{
    printf("%11s\\n","Ed");
    printf("%29s\\n","Ashley Mailloux");
    printf("There once was a horse named Ed,\\n");
    printf("Who always ate something red.\\n");
    printf("He didn't mind\\n");
    printf("To be treated unkind.\\n");
    printf("As long as he was fed.\\n");
    return 0;
}

7-2 1.2杨辉三角 (10 分)

请按照如下方式输出杨辉三角:

输出格式:

每个数字前面先输出两个空格,每一行从第一列开始输出。

难点以及注意点:

无,简单的复制粘贴。

代码:

#include<stdio.h>
int main()
{
    printf("  1\\n");
    printf("  1  1\\n");
    printf("  1  2  1\\n");
    printf("  1  3  3  1\\n");
    printf("  1  4  6  4  1\\n");
    return 0;
}

第3讲 程序中的输入/输出

7-1 输入日期和时间

编写程序,先按输入格式要求输入日期和时间,再按输出格式要求输出日期及时间。

输入格式:

在一行输入日期和时间,其中按年-月-日的格式输入日期,年月日之间用短横线连接;按小时:分钟:秒的格式输入时间,之间用英文冒号分隔。

输出格式:

分两行分别输出日期和时间,第一行按年/月/日格式(之间用/分隔)输出日期;第二行按小时:分钟:秒的格式(注意分隔符是英文冒号)输出时间,其中月、日、小时、分、秒按2位显示,不足2位时前面填充0,行末都没有空格。

难点以及注意点:

基本没有,个人主要使用了数组,因为数据太多,大家也可以用别的变量代替

代码:

#include<stdio.h>
int main()
{
    int a[6];
    scanf("%d-%d-%d %d:%d:%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5]);
    printf("%d/%02d/%02d\\n",a[0],a[1],a[2]);
    printf("%02d:%02d:%02d",a[3],a[4],a[5]);
    return 0;
}

7-2 不同类型数据的混合输入 (10 分)

编写程序,按输入格式要求输入一个整数、一个双精度实数和一个字符,再按输出格式要求输出这些数据。

输入格式:

分三行依次输入一个整数、一个实数(双精度)、一个字符。

输出格式:

在同一行依次输出一个整数、一个字符和一个实数,其中实数按小数点后两位输出,且三个数据之间用一个空格分隔,行末没有空格。

输入样例:

200101
98.50
F

输出样例:

200101 F 98.50

难点以及注意点:

无,简单的输入输出。

代码:

#include<stdio.h>
int main()
{
    int a;
    char c;
    double b;
    scanf("%d\\n",&a);
    scanf("%lf\\n",&b);
    scanf("%c\\n",&c);
    printf("%d %c %.2lf",a,c,b);
    return 0;
}

第4讲 顺序结构程序设计

7-1 已知三角形的2个角和1条边,求三角形面积 (10 分)

一个三角形的3条边分别是a, b, c(注意是小写字母),三个顶角分别是A, B, C(注意是大写字母)。 现输入三角形的两个顶角A和B,以及1条边c,根据下面三角形面积公式求面积area。为保证数据精度,变量全部使用double类型。

area=​c^2*sinAsinB/2​​​​sin(A+B)​​

输入格式:

依次输入顶角A、B,以及边长c,数据之间用空格分隔。顶角的单位是度,用公式计算时注意要换算成弧度,且π值精度为3.14159。

输出格式:

按格式“area=面积”输出,面积值保留3位小数。

难点以及注意点:

1、输出3位小数的方法

2、括号看清楚不要漏了

3、#include<math.h>记得加,sin是math库的,而且内部是弧度制(pi)

代码:

#include<stdio.h>
#include<math.h>
#define pi 3.14159
int main()
{
    double a,b,c,k;
    scanf("%lf %lf %lf",&a,&b,&c);
    k=c*c*sin(a*pi/180)*sin(b*pi/180)/(2*sin((a+b)*pi/180));
    printf("area=%.3f",k);
    return 0;
}

7-2 根据x的值求y (10 分)

编写程序,输入x的值,根据下面多项式求y的值。为保证数据精度,注意用double类型。

y=​4​​/3​​x​^5​​+12x^​4​​−7.3x​^3​​−​3​​/8​​x​^2​​+2x−4

输入格式:

在一行上输入x的值。

输出格式:

按格式输出y的值,数据精度保留2位小数。

输入样例:

1.2

输出样例:

y=8.70

难点以及注意点:

 1、一定要记住(4/3)不能直接用(4/3)不然两个int相除答案就是0,要转换或者变成4.0/3

2、用pow()之前记得加math库

解决方法:

1、强制转换或者如代码转换成4.0/3,0.75

代码:

#include<stdio.h>
#include<math.h>
int main()
{
    double x,y;
    scanf("%lf",&x);
    y=0.75*pow(x,5)+12*pow(x,4)-7.3*pow(x,3)-(2.66666)*pow(x,2)+2*x-4;
    printf("y=%.2f\\n",y);
    return 0;
}

第5讲 选择结构程序设计

7-1 计算运费 (3.4) (15 分)

运输公司对用户计算运费。路程(s)越远,每千米运费就越低。标准如下:

  • s<250km ,没有折扣;
  • 250km≤s<500km, 2%的折扣;
  • 500km≤s<1000km, 5%的折扣;
  • 1000km≤s<2000km,8%的折扣;
  • 2000km≤s<3000km,10%的折扣;
  • 3000km≤s,15%的折扣。

设每千米每吨货物的基本运费为p,货物重为 w,距离为s,折扣为d,则总运费f的计算公式为: f=p×w×s×(1-d)

输入格式:

在一行中以小数形式输入基本运费、货重和距离,以空格作为分隔符。

输出格式:

在一行输出计算出来的运费,精确到小数点后2位的值。

输入样例:

在这里给出一组输入。例如:

100 20 300

输出样例:

在这里给出相应的输出。例如:

freight=588000.00

难点以及注意点:

不断用if/else if拼凑就可以:

代码:

#include<stdio.h>
int main()
{
    double p,s,w,f;
    scanf("%lf %lf %lf",&p,&w,&s);
    f=p*s*w;
    if(s<250) f=f;
    else if(s>=250&&s<500) f=f*0.98;
    else if(s>=500&&s<1000) f=f*0.95;
    else if(s>=1000&&s<2000) f=f*0.92;
    else if(s>=2000&&s<3000) f=f*0.9;
    else if(s>=3000) f=f*0.85;
    printf("freight=%.2f\\n",f);
    return 0;
}

 

7-2 判断BMI指数 (15 分)

BMI指数(Body Mass Index,即身体质量指数),是用体重公斤数除以身高米数平方得出的数字,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。当我们需要比较及分析一个人的体重对于不同高度的人所带来的健康影响时,BMI值是一个中立而可靠的指标。本题要求根据输入的身高与体重,计算对应的BMI指数,并给出相应的结论。

输入格式:

输入在一行中依次给出2个浮点数,分别对应身高(单位:米)与体重(单位:公斤),中间用空格间隔。

输出格式:

按如下格式输出对应的BMI指数(保留一位小数)与结论

BMI = BMI计算结果
结论

其中结论的输出规则如下:

  • BMI<18.5,输出"Under Weight"
  • 18.5 ≤ BMI < 24,输出"Normal"
  • 24 ≤ BMI < 28,输出"Over Weight"
  • 28 ≤ BMI < 32,输出"Fat"
  • BMI ≥ 32,输出"Too Fat"

输入样例:

1.74 76.5

输出样例:

BMI = 25.3
Over Weight

难点以及注意点:

简单的一个计算,只要输出的时候做一个选择结构就可以

代码:

#include<stdio.h>
int main()
{
    double s,t,bmi;
    scanf("%lf %lf",&s,&t);
    bmi=t/s/s;
    printf("BMI = %.1f\\n",bmi);
    if(bmi<18.5) printf("Under Weight\\n");
    else if(bmi<23.9) printf("Normal\\n");
    else if(bmi<27.9) printf("Over Weight\\n");
    else if(bmi<32) printf("Fat\\n");
    else if(bmi>=32) printf("Too Fat\\n");
    return 0;
}

第6讲 循环结构程序设计

7-1 统计选票 (15 分)

某次选举的共有三人参选,试编写程序根据输入的选票值,统计三人各自的得票数和废票数,并输出投票结果。统计规则如下:

  • 选票值为1表示选Tom
  • 选票值为2表示选Jerry
  • 选票值为3表示选Spike
  • 选票值为0或4表示为废票
  • 若3人票数均不大于废票数,则选举结果无效

输入格式:

在一行中依次输入所有选票的值,之间用空格间隔,输入-1则表示输入结束。

输出格式:

在第一行中按如下格式输出票数统计结果。

Tom = 得票数 Jerry = 得票数 Spike = 得票数 Invalid = 废票数

若选举无效,则在第二行中输出

Election invalid!

输入样例1:

3 1 2 1 1 3 3 2 1 2 3 3 2 1 1 3 2 0 1 4 -1

输出样例1:

Tom = 7 Jerry = 5 Spike = 6 Invalid = 2

输入样例2:

3 0 4 0 1 2 0 4 3 2 3 1 1 3 2 0 0 4 -1

输出样例2:

Tom = 3 Jerry = 3 Spike = 4 Invalid = 8
Election invalid!

 难点以及注意点:

1、有一个点是四个人都没有票

2、不确定有多少人,故用while语句,但是记得n一开始一定要初始化

解决方法:

1、加了一个条件(tom==0&&je==0&&sp==0&&in==0)

2、int n==5,while(n!=-1)。

代码:

#include<stdio.h>
int main()
{
    int n=5,tom=0,je=0,sp=0,in=0;
    while(n!=-1)
    {
        scanf("%d",&n);
        if(n==1)
            tom+=1;
        else if(n==2)
            je+=1;
        else if(n==3)
            sp+=1;
        else if(n==0||n==4)
            in+=1;
    }
    printf("Tom = %d Jerry = %d Spike = %d Invalid = %d\\n",tom,je,sp,in);
    if((tom<in&&je<in&&sp<in)||(tom==0&&je==0&&sp==0&&in==0))
        printf("Election invalid!\\n");
    return 0;
}

7-2 E-2求多项式之和 (15 分)

求Sn=a+aa+aaa+……+aa…aa(n个a)的值,例如Sn=2+22+222+2222+22222,其值应为24690。其中a是0-9的数字,n为不大于6的正整数。

输入格式:

在一行中依次输入a和n的值,两数值之间用空格分开。

输出格式:

在一行中输出计算结果。

输入样例:

在这里给出一组输入。例如:

2 5

输出样例:

在这里给出相应的输出。例如:

24690

  难点以及注意点:

1、怎么让数字不断增加位数,2,22,222……

解决方法:

1、n=n*10+g;n是循环位数,g是个位数。

代码:

#include<stdio.h>
int main()
{
   int n,g,s,i,sum=0;
   scanf("%d%d",&n,&s);
    g=n;
    for(i=1;i<=s;i++)
   {
        sum+=n;
        n=n*10+g;
    }
    printf("%d\\n",sum);
    return 0;
}

7-3 统计各位和为k的数 (15 分)

输出区间[M,N](10≤M≤N≤1000)之间所有各位数值之和为k的数,并统计输出满足条件的数的个数。

输入格式:

输入在第一行中给出正整数k,第二行中给出2个正整数M和N(10≤M≤N≤1000),中间用空格间隔。

输出格式:

在第一行中输出满足条件的所有数,每个数后面一个空格。

在第二行按count = 总数的格式输出满足条件的数的个数。

注意:若没有满足条件的数,则第一行为空行

输入样例1:

5
200 300

输出样例1:

203 212 221 230 
count = 4

输入样例2:

6
100 103

输出样例2:


count = 0

难点以及注意点:

1、如何分离各位数字

解决方法:

1、我的办法比较笨拙,是从个位到百位分离

bw=i/100;gw=i%10;sw=(i-bw*100-gw)/10;

代码:

#include<stdio.h>
int main()
{
    int a,min,max,i,gw,sw,bw,count=0;
    scanf("%d",&a);
    scanf("%d %d",&min,&max);
    for(i=min;i<=max;i++)
    {
        bw=i/100;
        gw=i%10;
        sw=(i-bw*100-gw)/10;
        if(gw+bw+sw==a)
        {
            count+=1;
            printf("%d ",i);
        }
    }
    printf("\\ncount = %d\\n",count);
    return 0;
}

7-4 判断可逆素数 (15 分)

若将某一素数的各位数字的顺序颠倒后得到的数仍是素数,则此素数称为可逆素数。

现编写程序,输入一个正整数,判断该数是否是可逆素数。如果是可逆素数,输出YES,否则输出NO。

输入格式:

输入一个正整数N(0<N≤10000)。

输出格式:

输出YES或NO。(注意是大写字母)

输入样例1:

23

输出样例1:

NO

输入样例2:

17

输出样例2:

YES

难点以及注意点:

1、素数的判断

2、颠倒数字怎么实现

解决方法:我的办法是采用了两个函数实现(这两个函数可以保存,素数判断和反转数字都用得到)

1、素数判断

int ss(int n)
{
    int prime=1,i;
    if(n==1)
    {
        prime=0;
        return prime;
    }
    if(n==2)
        return prime;
    for(i=2;i<=(int)(sqrt(n)+1);i++)
    {
        if(n%i==0)
        {
            prime=0;
            break;
        }
    }
    return prime;
}

2、反转数字

int reverse(int k)
{
    int i=0,t=k;
    while(t)
    {
        i=10*i+(t%10);
        t/=10;
    }
    return i;

代码:

#include<stdio.h>
#include<math.h>
int ss(int n)
{
    int prime=1,i;
    if(n==1)
    {
        prime=0;
        return prime;
    }
    if(n==2)
        return prime;
    for(i=2;i<=(int)(sqrt(n)+1);i++)
    {
        if(n%i==0)
        {
            prime=0;
            break;
        }
    }
    return prime;
}
int reverse(int k)
{
    int i=0,t=k;
    while(t)
    {
        i=10*i+(t%10);
        t/=10;
    }
    return i;
}
int main()
{
    int shuru,fz;
    scanf("%d",&shuru);
    fz=reverse(shuru);
    if(ss(shuru)&&ss(fz))
        printf("YES");
    else
        printf("NO");
    return 0;
}

第7讲 一维数组

7-1 计算平均分并输出低于平均分的成绩 (5.1) (10 分)

计算全班n个(n≤30)学生的平均分,输出平均分以及低于平均分的成绩。

输入格式:

先输入整数n,再依次输入n个整数成绩,以空格间隔。

输出格式:

在第一行以格式average=result输出平均分(result保留小数点后两位),在下一行依次输出低于平均分的成绩,每个成绩后跟一个空格。(注意最后一个数后面有一个空格)

输入样例:

20
67 78 77 45 97 65 53 90 75 88 85 76 72 75 87 56 96 92 44 70

输出样例:

average=74.40
67 45 65 53 72 56 44 70 

 难点以及注意点:

简单的数组计算输入输出。

代码:

#include<stdio.h>
int main()
{
    int n,a[30],i;
    double s=0.0,aver;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        s+=(double)a[i];
    }
    aver=s/n;
    printf("average=%.2f\\n",aver);
    for(i=0;i<n;i++)
    {
        if(a[i]<aver)
            printf("%d ",a[i]);
    }
    return 0;
}

 7-2 求数组中第二大的元素 (5.8) (15 分)

无需排序,求数组中第二大的元素。

输入格式:

在一行中输入10个整数,以空格分隔。

输出格式:

直接输出第二大的值。

输入样例:

在这里给出一组输入。例如:

81 78 80 67 85 42 86 82 90 73

输出样例:

在这里给出相应的输出。例如:

86

 难点以及注意点:

虽然他说不排序,但是我觉得好像还是排序方便(?),所以用了冒泡排序。

解决方法:

1、冒泡排序!很有用!然后直接输出倒数第二个,序号为8。

for(i=0;i<10;i++)
    {
        for(j=0;j<9-i;j++)
        {
            if(a[j]>a[j+1])
            {
                t=a[j+1];
                a[j+1]=a[j];
                a[j]=t;
            }
        }
    }

代码:

#include<stdio.h>
int main()
{
    int a[10],i,j,t;
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    for(i=0;i<10;i++)
    {
        for(j=0;j<9-i;j++)
        {
            if(a[j]>a[j+1])
            {
                t=a[j+1];
                a[j+1]=a[j];
                a[j]=t;
            }
        }
    }
    printf("%d",a[8]);
    return  0;
}

 7-3 模拟2048游戏(1)--单行向左移动叠加 (15 分)

《2048》 是一款比较流行的数字游戏,最早于2014年3月20日发行。这款游戏的玩法很简单,每次可以选择上下左右滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。不断的叠加最终拼凑出2048这个数字就算成功。 本题模拟2048游戏的规则,提供一行4个格子,输入每个格子的初始值(空白格子值为0),玩家选择向左移动,所有数字向左靠拢,相同的数字相撞时会叠加。移动结束后,输出叠加后的数值。

输入格式:

输入4个整数,分别表示4个格子中的数值,数据之间用空格分隔。

输出格式:

在一行输出移动叠加后的4个数,每个数之间有一个空格,行末无空格。

输入样例:

2 0 2 2 

输出样例:

4 2 0 0

难点以及注意点:

这道题真的还挺难的,我自己也想了很久,前几天写了一个题解,放在这里,大家可以具体看题解的分析过程。题解:

https://blog.csdn.net/m0_58327726/article/details/117188150?spm=1001.2014.3001.5501

代码:

#include<stdio.h>
int main()
{
    int a[4],i,j,k;
    for(i=0;i<4;i++)
        scanf("%d",&a[i]);
    for(k=0;k<3;k++)//重复三次 怕连续三个均为0
    {
        for(i=0;i<3;i++)
        {
            if(a[i]==0)//当该格为空的时候
            {
                for(j=i;j<4;j++)//所有往左移动一格子
                {
                    a[j]=a[j+1];
                }
                a[3]=0;//补0
            }
        }
    }
    for(i=0;i<3;i++)
    {
        if((a[i]==a[i+1])&&(a[i]!=0))//如果前后相等
        {
            a[i]+=a[i+1];
            for(j=i+1;j<4;j++)
            {
                a[j]=a[j+1];//右边的往左移动
            }
            a[3]=0;
        }
    }
    for(i=0;i<4;i++)
    {
        if(i==3)
            printf("%d\\n",a[i]);
        else
            printf("%d ",a[i]);
    }
    return 0;
}

第8讲 二维数组

7-1 矩阵的转置运算 (20 分)

编写程序,将一个n×n(2≤n≤10)的矩阵进行转置,即将行与列互换,转置后再按n×n矩阵形式输出。

输入格式:

输入整数n,从第2行开始依次输入n*n个整数,各数以一个空格分隔。

输出格式:

按n行n列的形式输出转置后的二维数组,每个元素占5列,采用右对齐(即数据不足指定位数时左边补空格),行末无空格。

输入样例:

3
1 2 3
4 5 6
7 8 9

输出样例:

    1    4    7
    2    5    8
    3    6    9

 难点以及注意点:

1、只要i,j换位置就可以转置了

2、记得元素占5列

代码:

#include<stdio.h>
int main()
{
    int n,i,j,a[10][10];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
    for(j=0;j<n;j++)
    {
        for(i=0;i<n;i++)
            printf("%5d",a[i][j]);
        printf("\\n");
    }
    return 0;
}

7-2 大奖赛现场统分 (20 分)

大奖赛现场统分。已知某大奖赛有n个(0<n≤10)选手参赛,m(2<m≤10)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉1个最高分和1个最低分后,取平均分作为该选手的最后得分(为保证精度用double类型)。要求编程计算n个选手的最后得分。

输入格式:

输入选手数目n,评委人数m,数据间隔一个空格; 从第2行起,每行输入一位选手的m个得分,数据用空格分隔。

输出格式:

每行输出一个选手的m个得分,以及该选手的最后得分(为保证精度用double类型,保留两位小数),数据间一个空格间隔,注意每行的行尾无空格。

输入样例:

4 6
7.8 8.0 7.5 7.9 8.2 9.0
7.6 7.2 7.5 8.6 8.2 8.0
8.5 8.6 8.3 9.1 8.9 9.0
7.8 8.2 7.7 7.5 6.9 7.2

输出样例:

7.80 8.00 7.50 7.90 8.20 9.00 7.98
7.60 7.20 7.50 8.60 8.20 8.00 7.82
8.50 8.60 8.30 9.10 8.90 9.00 8.75
7.80 8.20 7.70 7.50 6.90 7.20 7.55

难点以及注意点:

1、记得去掉一个最高分 去掉一个最低分!

代码:

#include<stdio.h>
int main()
{
    int n,w,i,j;
    double a[10][10],s[10]={0,0,0,0,0,0,0,0,0,0},max=-1.0,min=11.0;
    scanf("%d %d",&n,&w);
    for(i=0;i<n;i++)
        for(j=0;j<w;j++)
            scanf("%lf",&a[i][j]);
    for(i=0;i<n;i++)
    {
        for(j=0;j<w;j++)
        {
            s[i]+=a[i][j];
            if(a[i][j]>max)
                max=a[i][j];
            if(a[i][j]<min)
                min=a[i][j];
        }
        s[i]=s[i]-max-min;
        max=-1.0;
        min=11.0;
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<w;j++)
        {
            printf("%.2f ",a[i][j]);
        }
        printf("%.2f\\n",s[i]/(w-2));
    }
    return 0;
}

 第9讲 字符数组

7-1 字符串加密 (15 分)

从键盘上输入一个长度不超过50的字符串(字符串中可以包含空格),现要求按照以下规则对其加密:其中所有的英文字母加3,即字母'A'加密后变成'D',而'X'加密后变成'A',小写字母也采用此规则转换为对应的小写字母,其它字符不变,将加密后的字符串存放到另一个字符数组中,输出原字符串和加密后的字符串。

输入格式:

字符串的输入以回车来结束,字符串的长度不超过50个字符。

输出格式:

分两行输出,第一行是原字符串,第二行是加密后的字符串,每行行末无空格。

输入样例:

XYZ 123*! abc

输出样例:

XYZ 123*! abc
ABC 123*! def

难点以及注意点:

基本没有,我自己是直接用的if,然后记得用strlen()的时候要引入string库

代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char s[51];
    int n,i;
    gets(s);
    n=strlen(s);
    printf("%s\\n",s);
    for(i=0;i<n;i++)
    {
        if(s[i]=='x')
            s[i]='a';
        else if(s[i]=='y')
            s[i]='b';
        else if(s[i]=='z')
            s[i]='c';
        else if(s[i]=='X')
            s[i]='A';
        else if(s[i]=='Y')
            s[i]='B';
        else if(s[i]=='Z')
            s[i]='C';
        else if(((s[i]<'x')&&(s[i]>='a'))||(s[i]<'X')&&(s[i]>='A'))
            s[i]+=3;
    }
    printf("%s",s);
    return 0;
}

 7-2 统计单词个数 (5.13) (15 分)

输入若干个英文单词,单词之间用空格分隔(空格数可能不止一个),判断其中的单词个数。(所谓“单词”是指连续不含空格的字符串,例如"you're"和"Good!"均计为1个单词)。

输入格式:

输入若干个英文单词,单词之间用空格分隔(空格数可能不止一个),用回车作为输入结束(不超过100个字符)。

输出格式:

输出1个整数,表示单词个数。

输入样例:

this is the first time you're flying by yourself 

输出样例:

9

 难点以及注意点:

1、采用循环的方法,基本思路就是

1)如果输入的是空格且word=1(前面单词没结束),说明是一个单词的结束,word=0

2)在其他情况中,当word=0且输入不是空格的时候,word=1(开始单词),num+=1(单词数+1)。

2、有一个点是非常多空格,所以根据题目说不超过100个字符,所以设置了一个字符计数器min,当min=100直接break

代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char s;
    int word=0,num=0,min=1;
    s=getchar();
    while(s!='\\n')
    {
        min+=1;
        if((s==' ')&&(word==1))
            word=0;
        else
        {
            if((word==0)&&(s!=' '))
            {
                num+=1;
                word=1;
            }
        }
        s=getchar();
        if(min==100)
            break;
    }
    printf("%d\\n",num);
    return 0;
}

7-3 TicTacToe游戏--胜负判定 (15 分)

井字棋是一种在3x3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边框,格线排成井字故得名。

游戏规则:由分别代表O和X的两个游戏者轮流在格子里留下标记。由最先在任意一条直线上成功连接三个标记的一方获胜。(摘抄自百度百科)

QQ截图20210516153608.jpg

读入一个3X3的二维数组,数组元素为'X'表示下X,元素为'O'表示下O,数组元素为'.'(英文符号“点”)表示未下棋,现编写程序进行当前胜负的判断,如果X方胜,则显示"X win!",如果O方胜,则显示"O win!",如果无人获胜,则显示"No one win!"。

输入格式:

读入一个3X3的二维数组,数组元素为'X'表示下X,元素为'O'表示下O,数组元素为'.'(英文符号“点”)表示未下棋。

输出格式:

若X方胜,则显示"X win!";若O方胜,则显示"O win!";若无人获胜,则显示"No one win!"。

输入样例1:

X.O
OX.
O.X

输出样例2:

X win!

输入样例2:

O.O
XX.
X..

输出样例2:

No one win!

 难点以及注意点:

这题也是比较难的题目,本人前几天也写了一个题解,放在这里给大家看。

https://blog.csdn.net/m0_58327726/article/details/117332116?spm=1001.2014.3001.5501

代码:

int main()
{
    char a[4][4];
    int i,xflag=0,oflag=0;//xflag=0代表x没赢,xflag=1代表x赢
    for(i=0;i<3;i++)//常规输入
    {
        scanf("%s",a[i]);
    }
    for(i=0;i<3;i++)//判断行是否三个相同,因此只需要在一行内看
    {
        if((a[i][0]==a[i][1])&&(a[i][1]==a[i][2])&&(a[i][0]==a[i][2]))//判断行是否三个相同
        {
            if(a[i][0]!='.')//不能是点赢
            {
                if(a[i][0]=='X')//x赢了
                    xflag=1;//x赢
                else//否则o赢
                    oflag=1;
            }
        }
    }
    for(i=0;i<3;i++)//判断列是否三个相同,因此只需要在一列内看
    {
        if((a[0][i]==a[1][i])&&(a[1][i]==a[2][i])&&(a[0][i]==a[2][i]))//判断列是否三个相同
        {
            if(a[0][i]!='.')//不能是点赢
            {
                if(a[0][i]=='X')//x赢了
                    xflag=1;//x赢
                else//否则o赢
                    oflag=1;
            }
        }
    }
    if(((a[0][0]==a[1][1])&&(a[1][1]==a[2][2])&&(a[0][0]==a[2][2]))||((a[0][2]==a[1][1])&&(a[1][1]==a[2][0])&&(a[0][2]==a[2][0])))//对角相等只有两种可能,直接检验
    {
        if(a[1][1]!='.')//不能是点赢
        {
            if(a[1][1]=='X')//x赢了
                xflag=1;//x赢
            else//否则o赢
                oflag=1;
        }
    }
    if((xflag==1)&&(oflag==0))//x赢o未赢
        printf("X win!\\n");//xwin
    else if((xflag==0)&&(oflag==1))//o赢x未赢
        printf("O win!\\n");//owin
    else
        printf("No one win!\\n");//都没赢
    return 0;
}

TO BE CONTINUED!

以上是关于WUT/武汉理工PTA-2021年春-MOOC-《C编程方法学》编程练习题解集的主要内容,如果未能解决你的问题,请参考以下文章

WUT/武汉理工PTA-2021年春-MOOC-《C编程方法学》编程练习题解集

麻省理工18年春软件构造课程阅读15“相等”

麻省理工18年春软件构造课程阅读13“调试”

麻省理工18年春软件构造课程阅读04“代码评审”

麻省理工18年春软件构造课程阅读02“Java基础”

[WHUT]武汉理工大学PPT模板