真的做崩溃了(┯_┯)

我写的不是段错误就是非零返回,关键我还不知道错哪,改哭了,xdm😭

img


#include<stdio.h>int main(){    int a;    int b[11];    int c[11] = { 0 };    int d[] = { 0,1,2,3,4,5,6,7,8,9,10 };    scanf("%d", &a);    for (int i = 0; i < a; i++)    {        scanf("%d", &b[i]);    }    for (int i = 0; i < a; i++)    {        if (0 <= b[i] && b[i] < 9)        {            c[0] += 1;        }        else if (10 <= b[i] && b[i] < 19)        {            c[1] += 1;        }        else if (20 <= b[i] && b[i] < 29)        {            c[2] += 1;        }        else if (30 <= b[i] && b[i] < 39)        {            c[3] += 1;        }        else if (40 <= b[i] && b[i] < 49)        {            c[4] += 1;        }        else if (50 <= b[i] && b[i] < 59)        {            c[5] += 1;        }        else if (60 <= b[i] && b[i] < 69)        {            c[6] += 1;        }        else if (70 <= b[i] && b[i] < 79)        {            c[7] += 1;        }        else if (80 <= b[i] && b[i] < 89)        {            c[8] += 1;        }        else if (90 <= b[i] && b[i] <= 99)        {            c[9] += 1;        }        else if (100 == b[i])        {            c[10] += 1;        }    }    for (int i = 0; i < 11; i++)    {        printf("%d:%d\n", d[i], c[i]);    }    return 0;}

那么多if else看到眼花,你看这样可以不?
仅供参考!谢谢!

img

img



#include<stdio.h>
int main()
{
    int n, tmp;
    scanf("%d", &n);
    if (n < 1)
        return -1;

    int arr[n], arr2[11] = { 0 };

    for (int i = 0; i < n; i++)
    {
        scanf("%d", &tmp);
        arr[i] = tmp >= 0 && tmp <= 100 ? tmp / 10 : -1;
        for (int j = 0; j < 11; j++)
            if (arr[i] == j)
                arr2[j] += 1;
    }

    for (int i = 0; i < 11; i++)
        printf("%d: %d\n", i, arr2[i]);

    return 0;
}


代码在我机上运行没问题,可以把错误图片发我一下吗?帮你修了一下格式:

#include <stdio.h>  
  
int main() {  
    int a;  
    int b[11];  
    int c[11] = {0};  
    int d[] = {0,1,2,3,4,5,6,7,8,9,10};  
  
    scanf("%d", &a);  
  
    for (int i = 0; i < a; i++) {  
        scanf("%d", &b[i]);  
    }  
  
    for (int i = 0; i < a; i++) {  
        if (0 <= b[i] && b[i] < 9) {  
            c[0] += 1;  
        } else if (10 <= b[i] && b[i] < 19) {  
            c[1] += 1;  
        } else if (20 <= b[i] && b[i] < 29) {  
            c[2] += 1;  
        } else if (30 <= b[i] && b[i] < 39) {  
            c[3] += 1;  
        } else if (40 <= b[i] && b[i] < 49) {  
            c[4] += 1;  
        } else if (50 <= b[i] && b[i] < 59) {  
            c[5] += 1;  
        } else if (60 <= b[i] && b[i] < 69) {  
            c[6] += 1;  
        } else if (70 <= b[i] && b[i] < 79) {  
            c[7] += 1;  
        } else if (80 <= b[i] && b[i] < 89) {  
            c[8] += 1;  
        } else if (90 <= b[i] && b[i] <= 99) {  
            c[9] += 1;  
        } else if (100 == b[i]) {  
            c[10] += 1;  
        }  
    }  
  
    for (int i = 0; i < 11; i++) {  
        printf("%d:%d\n", d[i], c[i]);  
    }  
  
    return 0;  
}

【以下回答由 GPT 生成】

问题分析

根据代码的描述,程序经常出现段错误和非零返回的问题,但是没有具体的错误原因。我们可以采取以下的步骤来分析和解决问题:

  1. 查找段错误的原因。
  2. 检查程序是否存在其他错误导致非零返回。
  3. 优化代码,避免重复的工作,提高代码的可读性和性能。

解决方案

1. 查找段错误的原因

通常情况下,段错误是由于程序访问了非法内存地址导致的。我们可以使用一些调试工具和技术来分析和解决这个问题。

a) 编译时添加调试信息

我们可以在编译程序时添加调试信息,以便在段错误发生时能够更容易地找到问题所在。可以使用 -g 参数来编译程序,例如:

gcc -g your_program.c -o your_program

b) 使用调试工具

使用调试工具可以帮助我们找到程序中的问题。常见的调试工具有 gdbvalgrind 等。我们可以通过以下步骤来使用 gdb 调试程序:

  1. 打开终端,切换到程序所在的目录。
  2. 使用 gdb 启动程序,例如 gdb your_program
  3. gdb 命令行中输入 run 执行程序,观察是否触发了段错误。
  4. 如果触发了段错误,可以使用 backtrace 命令查看调用栈,使用 print 命令查看变量的值等。
$ gdb your_program
(gdb) run

c) 检查指针的使用

在代码中可能存在指针使用不当的情况,例如未初始化的指针、指针越界、释放了已经释放的内存等。我们可以仔细检查代码中指针的使用情况,确保没有出现这种问题。

2. 检查程序是否存在其他错误导致非零返回

除了段错误,还需要检查程序是否存在其他错误导致了非零的返回值。我们可以使用 printf 或者调试工具来查看程序执行的过程中是否存在错误。

在代码中查找 return 语句,并检查该语句的条件是否正确,确保程序在合适的时候返回正确的值。

3. 优化代码

在代码中还存在一些可以优化的地方。我们可以避免重复的工作,提高代码的可读性和性能。

a) 使用循环和数组

代码中使用了多个 if 语句来判断 b[i] 的大小范围,并进行相应的计数。可以使用循环和数组来简化代码,提高可读性。具体的优化方案如下:

int range = 10;  // 设置范围
int num_ranges = 11;  // 范围的数量
int c[11] = { 0 };

for (int i = 0; i < a; i++){
    // 计算范围索引
    int index = b[i] / range;

    // 检查范围是否越界
    if (index < num_ranges){
        c[index] += 1;
    }
}

b) 循环中避免重复计算

代码中在每个循环中都使用了判断语句来判断 b[i] 的范围,这是重复计算,可以避免重复计算,提高性能。具体的优化方案如下:

int range = 10;  // 设置范围
int num_ranges = 11;  // 范围的数量
int c[11] = { 0 };

for (int i = 0; i < a; i++){
    int value = b[i];

    // 计算范围索引
    int index = value / range;

    // 检查范围是否越界
    if (index < num_ranges){
        c[index] += 1;
    }
}

c) 将计数部分提炼为函数

代码中计算范围的部分重复出现,可以将其提炼为一个函数,提高代码的可读性。具体的优化方案如下:

void increment_range_count(int value, int range, int num_ranges, int* counts){
    // 计算范围索引
    int index = value / range;

    // 检查范围是否越界
    if (index < num_ranges){
        counts[index] += 1;
    }
}

// 在主函数中调用
for (int i = 0; i < a; i++){
    increment_range_count(b[i], range, num_ranges, c);
}

完整代码

根据以上的优化方案,以下是优化后的完整代码:

#include <stdio.h>

void increment_range_count(int value, int range, int num_ranges, int* counts){
    // 计算范围索引
    int index = value / range;

    // 检查范围是否越界
    if (index < num_ranges){
        counts[index] += 1;
    }
}

int main(){
    int a;
    int b[11];
    int c[11] = { 0 };
    int range = 10;
    int num_ranges = 11;

    scanf("%d", &a);

    for (int i = 0; i < a; i++){
        scanf("%d", &b[i]);
    }

    for (int i = 0; i < a; i++){
        increment_range_count(b[i], range, num_ranges, c);
    }

    for (int i = 0; i < num_ranges; i++){
        printf("%d: %d\n", i, c[i]);
    }

    return 0;
}

希望以上的解决方案能帮助到你,如果有任何问题,请随时追问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

这么改,试试,供参考:

#include<stdio.h>
#define N 500      // 修改
int main()
{    
    int a, i;      // 修改
    int b[N] = {0};     // 修改 
    int c[11] = { 0 };    
    int d[] = { 0,1,2,3,4,5,6,7,8,9,10 };    
    scanf("%d", &a);    
    for (i = 0; i < a; i++)    {  // for (int i = 0; i < a; i++) 修改      
        scanf("%d", &b[i]);    
    }    
    for (i = 0; i < a; i++)    {  //for (int i = 0; i < a; i++)  修改      
        if (0 <= b[i] && b[i] < 9)                   
            c[0] += 1;             
        else if (10 <= b[i] && b[i] < 19)            
            c[1] += 1;        
        else if (20 <= b[i] && b[i] < 29)            
            c[2] += 1;                
        else if (30 <= b[i] && b[i] < 39)            
            c[3] += 1;        
        else if (40 <= b[i] && b[i] < 49)            
            c[4] += 1;        
        else if (50 <= b[i] && b[i] < 59) 
            c[5] += 1;        
        else if (60 <= b[i] && b[i] < 69)             
            c[6] += 1;       
        else if (70 <= b[i] && b[i] < 79)             
            c[7] += 1;        
        else if (80 <= b[i] && b[i] < 89) 
            c[8] += 1;        
        else if (90 <= b[i] && b[i] <= 99)
            c[9] += 1;        
        else if (100 == b[i])             
            c[10] += 1;        
    }    
    for (i = 0; i < 11; i++)    {    //for (int i = 0; i < 11; i++) 修改     
        printf("%d:%d\n", d[i], c[i]);    
    }    
    return 0;
}