C语言思维训练3题。

1.改错


#include <stdio.h>
int main() {
    int num, sum;
    scanf("%d", &num);
    while (num != 0) {
        sum = 0;
        while (num != 0) {
            sum += num;
            scanf("%d", &num);
        }
        printf("%d\n", sum);
        scanf("%d", &num);
    }
    return 0;
}

img

2.求和

img

3.镂空三角形

img

求三个题的完整代码

第一题:
改错后:

#include <stdio.h>
int main() {
    int num, sum;
    scanf("%d", &num);
    while (num != 0) {
        sum = 0;
        while (num != 0) {
            sum += num;
            scanf("%d", &num);
        }
        printf("%d\n", sum);
        scanf("%d", &num);
    }
    return 0;
}

在这个代码中,我们使用了两个嵌套的 while 循环来读取输入并计算总和。外部的 while 循环用于处理多组输入,而内部的 while 循环用于对每个组的数字进行求和,直到输入的数字为 0 为止。然后打印出每组数字的总和,并继续读取下一组数字的输入。

这个代码的目的是读取一系列的数字,并对每组数字进行求和,直到输入的数字为 0。在每次求和之前,需要读取一个数字作为下一组数字的开始。

第二题:

#include <stdio.h>

int main() {
    int numLines;
    scanf("%d", &numLines); // 读取输入的行数

    // 循环处理每行输入
    for (int i = 0; i < numLines; i++) {
        int numIntegers;
        scanf("%d", &numIntegers); // 读取当前行的整数数量

        int sum = 0;
        // 循环读取当前行的整数,并计算它们的和
        for (int j = 0; j < numIntegers; j++) {
            int num;
            scanf("%d", &num);
            sum += num;
        }

        printf("%d\n", sum); // 输出当前行整数的和
    }

    return 0;
}

第三题:

#include <stdio.h>

void printHollowTriangle(char c, int n) {
    int i, j;

    // 输出上半部分
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= n - i; j++) {
            printf(" "); // 输出空格
        }
        if (i == 1 || i == n) {
            // 输出首行和末行的完整字符
            for (j = 1; j <= i * 2 - 1; j++) {
                printf("%c", c);
            }
        } else {
            // 输出中间行的空心效果
            printf("%c", c); // 输出左边的字符
            for (j = 1; j <= (i - 1) * 2 - 1; j++) {
                printf(" "); // 输出中间的空格
            }
            printf("%c", c); // 输出右边的字符
        }
        printf("\n"); // 换行
    }
}

int main() {
    char c;
    int n;
    scanf("%c %d", &c, &n); // 读取字符和边长

    printHollowTriangle(c, n); // 调用函数打印镂空等腰三角形

    return 0;
}

该程序存在一个 bug,即在第二个 while 循环中,读取输入的数字的语句应该在累加 sum 变量之后,否则会导致输入的第一个数字被重复计算。

以下是修改后的代码:

#include <stdio.h>
int main() {
    int num, sum;
    scanf("%d", &num);
    while (num != 0) {
        sum = 0;
        do {
            sum += num;
            scanf("%d", &num);
        } while (num != 0);
        printf("%d\n", sum);
        scanf("%d", &num);
    }
    return 0;
}

修改后的代码中,第二个 while 循环被替换为 do-while 循环,读取输入的数字的语句放在累加 sum 变量之后,确保每次读取的数字都被累加到 sum 变量中。

代码存在两个 while 循环,第二个循环没有条件判断,会一直读入数字并累加 sum 直到 num 等于 0,导致结果错误。正确代码如下:

#include <stdio.h>
int main() {
  int num, sum;
  scanf("%d", &num);
  while (num != 0) {
    sum = 0;
    while (num != 0) {
      sum += num;
      scanf("%d", &num);
    }
    printf("%d\n", sum);
    scanf("%d", &num);
  }
  return 0;
}

题目中缺少{},因此首先应加上一对大括号。同时,在内层循环(第二个while循环)中sum没被处理,所以将内层循环的代码放到外层循环中即可。
正确代码如下:

#include <stdio.h>
int main() {
int num, sum;
scanf("%d", &num);
while (num != 0) {
sum = 0; // 这句话移到外层while循环
while (num != 0) {
sum += num;
scanf("%d", &num);
}
printf("%d\n", sum);
scanf("%d", &num);
}
return 0;
}

求和
代码如下:

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

镂空三角形
代码如下:

#include <stdio.h>
int main()
{
int n, i, j, k;
scanf("%d", &n);
for ( i = 1; i <= n; i++ )
{
for ( j = n; j >= i; j-- )
{
printf(" ");
}
for ( k = 1; k <= i * 2 - 1; k++ )
{
if ( k == 1 || k == i * 2 - 1|| i == n )
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
return 0;
}

在 while 循环内部添加一个 sum = 0 语句,以便在每次循环开始时重置 sum 变量。
将 printf 语句修改为 print,以便在每次循环结束时打印当前 sum 值。
在每次循环结束后,将 num 变量的值添加到 sum 变量中,以便在下一次循环中使用更高的 num 值。
将两个 while 循环之间的代码添加到 main 函数中,以便在程序结束时返回 0 值。
以下是修改后的代码:

#include <stdio.h>  
int main() {  
    int num, sum = 0;  
    scanf("%d", &num);  
    while (num != 0) {  
        num = num / 10;  // 将 num 除以 10,以便在每次循环中使用更高的 num 值  
        sum += num;  
        scanf("%d", &num);  
    }  
    print(sum);  // 在每次循环结束时打印当前 sum 值  
    scanf("%d", &num);  
    return 0;  
}


第一题

#include <stdio.h>
int main() {
    int num, sum;
    scanf("%d", &num);
    while (num != 0) {
        sum = 0;
        while (num != 0) {
            sum += num;
            scanf("%d", &num);
        }
        printf("%d\n", sum);
        scanf("%d", &num);
    }
  return 0;
}

第一题,代码如下所示:

#include <stdio.h>

int main() 
{
    int num, sum;
    scanf("%d", &num);
    while (num != 0) 
    {
        sum = 0;
        if(getchar()=='\n')//获得新行
        {
            
            scanf("%d", &num);
            if(num==0)//结束
            {
                sum+=num;
                break;
            }
            else
            {
                sum+=num;
            }
        }
    }
    printf("%d\n", sum);
    printf("%d\n", num);
    return 0;
}

以下答案由GPT-3.5大模型与博主波罗歌共同编写:

  1. 改错

代码:

#include <stdio.h>
int main() {
    int num, sum;
    scanf("%d", &num);
    while (num != 0) {
        sum = 0;
        while (num != -1) {
            sum += num;
            scanf("%d", &num);
        }
        printf("%d\n", sum);
        scanf("%d", &num);
    }
    return 0;
}

原因:原代码有死循环,当输入0时,内循环不会退出。应该加入一个合适的退出条件,如加入一个特定的终止条件-1。

  1. 求和

题目描述:输入n个整数,求它们的和。

代码:

#include <stdio.h>
int main() {
    int n;
    int sum = 0;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        int num;
        scanf("%d", &num);
        sum += num;
    }
    printf("%d", sum);
    return 0;
}
  1. 镂空三角形

题目描述:输入一个正整数n,输出一个边长为n的空心三角形。

代码:

#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        if (i == 0 || i == n - 1) {
            for (int j = 0; j < 2 * i + 1; j++) {
                printf("*");
            }
        } else {
            printf("*");
            for (int j = 0; j < 2 * i - 1; j++) {
                printf(" ");
            }
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

例如,当输入n=5时,输出如下的三角形:

    *
   * *
  *   *
 *     *
*********

如果我的回答解决了您的问题,请采纳!

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:
第一题:
这里是对该C语言代码的改错分析:

c
#include <stdio.h>
int main() {
    int num, sum;     // 声明num和sum变量
    scanf("%d", &num);   // 读取第一个整数num
    while (num != 0) {   // num不为0循环
        sum = 0;         // sum置0,开始新一组整数求和
        while (num != 0) { // num不为0循环
            sum += num;   // sum加上num
            scanf("%d", &num);  // 继续读取整数值到num
        }
        printf("%d\n", sum);   // 输出当前组整数和
        scanf("%d", &num);   // 读取下一组的第一个整数
    }
    return 0;
}  

  1. 变量num和sum重复声明,应删除第二次声明sum = 0;,而直接在循环内使用sum变量。
  2. 循环条件num != 0可能导致无限循环,应修改为scanf("%d", &num) != EOF
  3. 两个while循环可以合并为一个循环。

修改后的代码为:

c
#include <stdio.h>
int main() {
    int num, sum = 0;  
    while (scanf("%d", &num) != EOF) { 
        if (num == 0) {  // num等于0,输出当前和并置0
            printf("%d\n", sum);
            sum = 0; 
        } else {
            sum += num;  // 继续累加
        }
    }
    return 0;
}

该代码先读取整数到num,如果num等于0,则输出当前整数和sum,并置sum为0,开始新一组求和。如果num不等于0,则将num的值累加到sum。循环直到文件结束。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7687468
  • 这篇博客也不错, 你可以看下C语言题目:从键盘输入三个数,求三角形面积和周长
  • 除此之外, 这篇博客: c语言经典算法中的 3. 巴斯卡三角形 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Ngb5wtR-1613263465819)(clip_image002.jpg)] |

    #include <stdio.h> #define N 12
    
    long combi(int n, int r){ int i;
    
    long p = 1;
    
    for(i = 1; i <= r; i++)
    
    p = p * (n-i+1) / i; return p;
    
    }
    
    void paint() {
    
    int n, r, t;
    
    for(n = 0; n <= N; n++) { for(r = 0; r <= n; r++) {
    
    int i;/* 排版设定开始 */ if(r == 0) {
    
    for(i = 0; i <= (N-n); i++)
    
    printf("   ");
    
    }else {
    
    printf("   ");
    
    } /* 排版设定结束 */ printf("%3d", combi(n, r));
    
    
    
    }
    
    printf("\n");
    
    }
    
    }
    
  • 您还可以看一下 李飞老师的C语言开发之数据结构与算法三课程中的 散列表小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    抱歉,参考资料中并没有包含您所需的三个题目的代码。我建议您在其他地方寻找这些代码,或者自行尝试编写。