鱼C论坛

 找回密码
 立即注册
查看: 5048|回复: 9

[已解决]关于c语言的循环与二维数组问题

[复制链接]
发表于 2017-10-28 10:20:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近在学习循环与二维数组,可能是因为逻辑问题,经常感到头晕,希望大佬们能帮我解决一下,就如下面这道题目。
#2008年北京奥运会,A国的运动员参与了n天的决赛项目(1≤n≤17)。现在要统计一下A国所获得的金、银、铜牌数目及总奖牌数
输入格式
3
1 0 3
3 1 0
0 3 0
输出格式
4  4  3
对于本题我只能有循环能做对,再试着用二维数组和循环时,遇到了困难。
#include <stdlib.h>
int main33()
{
   int i,j,a[100][3],n,m;
   while(scanf("%d",&n)!=EOF)
   {
       for(i=0;i<n;i++)
       {
           for(j=0;j<3;j++)
           {
               scanf("%d",&a[i][j]);
           }
       }
       for(j=0;j<3;j++)
       {
           for(i=0;i<n;i++)
           {
               a[n][j]+=a[i][j];
               a[n][3]+=a[n][j];
           }
       }
       printf("%d %d\n",a[n][j],a[n][3]);
   }
   return 0;
}
最佳答案
2017-10-28 14:54:30
ss4415 发表于 2017-10-28 14:31
#include
#include
int main()

我的天那……我要炸裂了。其实你上一个程序还可以,现在这个真的……
1. 初始化a[18][3],只要写一个值就好了,剩余的会自动补全为0,当然你这么写也没错。
2. 输入每一行的数据的时候,接收数据的居然是a[j]?二维数组就变成了一维???
3. 相加的那一块for循环里,我就看不懂了。为什么有一个一维数组,为什么定义了外循环 i 但是没用上?还有就是内循环的判断条件为什么是i<3?肯定是写错了吧
4. 最后打印的a[n][3]是什么?总共的下标是0、1、2就这三列,不存在3这个下标呀,你这么写就超列的范围了!你的意思是不是要说总共的牌有几块是吧?那你就用个变量存一下!别放在数组了。
还是我给你个代码吧,就按照你写的改,你自己感觉下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.         int i, j, n, count = 0;
  6.         int a[18][3] = {0};
  7.        
  8.         scanf("%d",&n);
  9.         if(n>=1 && n<18)
  10.         {
  11.                 for(i=0; i<n; i++)
  12.                 {
  13.                         for(j=0; j<3; j++)
  14.                         {
  15.                                 scanf("%d",&a[i][j]);        // 这里写全,哪行哪列!
  16.                         }
  17.                 }
  18.                 for(i=0; i<n; i++)
  19.                 {
  20.                         for(j=0; j<3; j++)
  21.                         {
  22.                                 a[n][i]+=a[j][i];
  23.                         }
  24.                         count+=a[n][i];                // 放循环外,为什么?因为统计完那一列的全部才算得到这种牌的总数
  25.                 }
  26.                 printf("%d %d %d\n",a[n][0],a[n][1],a[n][2]);
  27.                 printf("一共是 %d 个\n", count);
  28.         }
  29.         return 0;
  30. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-28 10:40:20 | 显示全部楼层
你需要用动态内存分配来实现手动输入行数n的情况
否则不能直接用a[n][j]的形式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-28 10:59:58 | 显示全部楼层
BngThea 发表于 2017-10-28 10:40
你需要用动态内存分配来实现手动输入行数n的情况
否则不能直接用a[n][j]的形式

额..我不太懂,能说的再详细一点吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-28 11:03:58 | 显示全部楼层
你学了molloc 和 free 函数了吗?
因为需要动态分配内存的话是需要这些知识的。
如果没有,那么请用4代替你代码中的n,这样应该就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-28 11:11:56 | 显示全部楼层
BngThea 发表于 2017-10-28 11:03
你学了molloc 和 free 函数了吗?
因为需要动态分配内存的话是需要这些知识的。
如果没有,那么请用4代替 ...

还没有,目前只学到了字符数组,我给同学看,同学说应该不能用二维数组,否则要在定义一个变量,输出J,这样就不符合输入格式了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-28 11:12:41 | 显示全部楼层
BngThea 发表于 2017-10-28 11:03
你学了molloc 和 free 函数了吗?
因为需要动态分配内存的话是需要这些知识的。
如果没有,那么请用4代替 ...

用4代替n,也不符合输入格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-28 12:18:09 | 显示全部楼层
说几点:
先不说你的程序能不能运行,就说你的格式语法的问题。 main函数后面最好别加33什么的;你题目值的n最大是17,你就定义一个18行,第18行保存金银铜的总数就行,别定义这么多,浪费不说,程序执行会效率会慢一点,当然你是感觉不出来的;不用while,你只是输入一个n,完全可以用if判断,然后让程序运行完正常结束;最后打印结果,你只写了两列数据,并且你用了j,j继承for的++已经超出范围。

程序的修改:
你没初始化数组,a[18][3] = {0},这样就可以了,然后把最后的打印语句改了printf("%d %d %d\n",a[n][0],a[n][1],a[n][2]); 别的不改也行,程序也可以,但是看去逻辑上很便扭
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-28 14:31:54 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-28 12:18
说几点:
先不说你的程序能不能运行,就说你的格式语法的问题。 main函数后面最好别加33什么的;你题目值 ...

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int i,j,a[18][3]={{0},{0}},n;
   scanf("%d",&n);
   if(n>=1&&n<18)
   {
       for(i=0;i<n;i++)
       {
           for(j=0;j<3;j++)
           {
               scanf("%d",&a[j]);
           }
       }
       for(i=0;i<n;i++)
       {
           for(j=0;i<3;j++)
           {
               a[n][j]+=a[j];
               a[n][3]+=a[n][j];
           }
       printf("%d %d %d %d",a[n][0],a[n][1],a[n][2],a[n][3]);
       }
   }
   return 0;
}
这样呢,改了以后能运行,但是没有输出就报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-28 14:54:30 | 显示全部楼层    本楼为最佳答案   
ss4415 发表于 2017-10-28 14:31
#include
#include
int main()

我的天那……我要炸裂了。其实你上一个程序还可以,现在这个真的……
1. 初始化a[18][3],只要写一个值就好了,剩余的会自动补全为0,当然你这么写也没错。
2. 输入每一行的数据的时候,接收数据的居然是a[j]?二维数组就变成了一维???
3. 相加的那一块for循环里,我就看不懂了。为什么有一个一维数组,为什么定义了外循环 i 但是没用上?还有就是内循环的判断条件为什么是i<3?肯定是写错了吧
4. 最后打印的a[n][3]是什么?总共的下标是0、1、2就这三列,不存在3这个下标呀,你这么写就超列的范围了!你的意思是不是要说总共的牌有几块是吧?那你就用个变量存一下!别放在数组了。
还是我给你个代码吧,就按照你写的改,你自己感觉下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.         int i, j, n, count = 0;
  6.         int a[18][3] = {0};
  7.        
  8.         scanf("%d",&n);
  9.         if(n>=1 && n<18)
  10.         {
  11.                 for(i=0; i<n; i++)
  12.                 {
  13.                         for(j=0; j<3; j++)
  14.                         {
  15.                                 scanf("%d",&a[i][j]);        // 这里写全,哪行哪列!
  16.                         }
  17.                 }
  18.                 for(i=0; i<n; i++)
  19.                 {
  20.                         for(j=0; j<3; j++)
  21.                         {
  22.                                 a[n][i]+=a[j][i];
  23.                         }
  24.                         count+=a[n][i];                // 放循环外,为什么?因为统计完那一列的全部才算得到这种牌的总数
  25.                 }
  26.                 printf("%d %d %d\n",a[n][0],a[n][1],a[n][2]);
  27.                 printf("一共是 %d 个\n", count);
  28.         }
  29.         return 0;
  30. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-10-28 16:52:29 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-28 14:54
我的天那……我要炸裂了。其实你上一个程序还可以,现在这个真的……
1. 初始化a[18][3],只要写一个值 ...

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-19 02:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表