我写的不是段错误就是非零返回,关键我还不知道错哪,改哭了,xdm😭
#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看到眼花,你看这样可以不?
仅供参考!谢谢!
#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 生成】
根据代码的描述,程序经常出现段错误和非零返回的问题,但是没有具体的错误原因。我们可以采取以下的步骤来分析和解决问题:
通常情况下,段错误是由于程序访问了非法内存地址导致的。我们可以使用一些调试工具和技术来分析和解决这个问题。
我们可以在编译程序时添加调试信息,以便在段错误发生时能够更容易地找到问题所在。可以使用 -g
参数来编译程序,例如:
gcc -g your_program.c -o your_program
使用调试工具可以帮助我们找到程序中的问题。常见的调试工具有 gdb
、valgrind
等。我们可以通过以下步骤来使用 gdb
调试程序:
gdb
启动程序,例如 gdb your_program
。gdb
命令行中输入 run
执行程序,观察是否触发了段错误。backtrace
命令查看调用栈,使用 print
命令查看变量的值等。$ gdb your_program
(gdb) run
在代码中可能存在指针使用不当的情况,例如未初始化的指针、指针越界、释放了已经释放的内存等。我们可以仔细检查代码中指针的使用情况,确保没有出现这种问题。
除了段错误,还需要检查程序是否存在其他错误导致了非零的返回值。我们可以使用 printf
或者调试工具来查看程序执行的过程中是否存在错误。
在代码中查找 return
语句,并检查该语句的条件是否正确,确保程序在合适的时候返回正确的值。
在代码中还存在一些可以优化的地方。我们可以避免重复的工作,提高代码的可读性和性能。
代码中使用了多个 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[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;
}
}
代码中计算范围的部分重复出现,可以将其提炼为一个函数,提高代码的可读性。具体的优化方案如下:
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;
}