ss4415 发表于 2017-10-28 10:20:28

关于c语言的循环与二维数组问题

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

BngThea 发表于 2017-10-28 10:40:20

你需要用动态内存分配来实现手动输入行数n的情况
否则不能直接用a的形式

ss4415 发表于 2017-10-28 10:59:58

BngThea 发表于 2017-10-28 10:40
你需要用动态内存分配来实现手动输入行数n的情况
否则不能直接用a的形式

额..我不太懂,能说的再详细一点吗

BngThea 发表于 2017-10-28 11:03:58

你学了molloc 和 free 函数了吗?
因为需要动态分配内存的话是需要这些知识的。
如果没有,那么请用4代替你代码中的n,这样应该就可以了

ss4415 发表于 2017-10-28 11:11:56

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

还没有,目前只学到了字符数组,我给同学看,同学说应该不能用二维数组,否则要在定义一个变量,输出J,这样就不符合输入格式了

ss4415 发表于 2017-10-28 11:12:41

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

用4代替n,也不符合输入格式

丶忘却的年少o 发表于 2017-10-28 12:18:09

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

程序的修改:
你没初始化数组,a = {0},这样就可以了,然后把最后的打印语句改了printf("%d %d %d\n",a,a,a); 别的不改也行,程序也可以,但是看去逻辑上很便扭

ss4415 发表于 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={{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);
         }
       }
       for(i=0;i<n;i++)
       {
         for(j=0;i<3;j++)
         {
               a+=a;
               a+=a;
         }
       printf("%d %d %d %d",a,a,a,a);
       }
   }
   return 0;
}
这样呢,改了以后能运行,但是没有输出就报错了

丶忘却的年少o 发表于 2017-10-28 14:54:30

ss4415 发表于 2017-10-28 14:31
#include
#include
int main()


我的天那……我要炸裂了。其实你上一个程序还可以,现在这个真的……
1. 初始化a,只要写一个值就好了,剩余的会自动补全为0,当然你这么写也没错。
2. 输入每一行的数据的时候,接收数据的居然是a?二维数组就变成了一维???
3. 相加的那一块for循环里,我就看不懂了。为什么有一个一维数组,为什么定义了外循环 i 但是没用上?还有就是内循环的判断条件为什么是i<3?肯定是写错了吧
4. 最后打印的a是什么?总共的下标是0、1、2就这三列,不存在3这个下标呀,你这么写就超列的范围了!你的意思是不是要说总共的牌有几块是吧?那你就用个变量存一下!别放在数组了。
还是我给你个代码吧,就按照你写的改,你自己感觉下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
        int i, j, n, count = 0;
        int a = {0};
       
        scanf("%d",&n);
        if(n>=1 && n<18)
        {
                for(i=0; i<n; i++)
                {
                        for(j=0; j<3; j++)
                        {
                                scanf("%d",&a);        // 这里写全,哪行哪列!
                        }
                }
                for(i=0; i<n; i++)
                {
                        for(j=0; j<3; j++)
                        {
                                a+=a;
                        }
                        count+=a;                // 放循环外,为什么?因为统计完那一列的全部才算得到这种牌的总数
                }
                printf("%d %d %d\n",a,a,a);
                printf("一共是 %d 个\n", count);
        }
        return 0;
}

ss4415 发表于 2017-10-28 16:52:29

丶忘却的年少o 发表于 2017-10-28 14:54
我的天那……我要炸裂了。其实你上一个程序还可以,现在这个真的……
1. 初始化a,只要写一个值 ...

谢谢!
页: [1]
查看完整版本: 关于c语言的循环与二维数组问题