入力した数値から最大値を探すプログラム

[戻る]
まつお 2003/11/12(水) 21:43:21
題名のようなプログラムを作ってみたいのですがうまくいきません。
一応自分が書いたプログラムを載せて見ます。
#include<stdio.h>
main()
{
    int i,a,c[6];
    for(i=0,i<=5;i++;){
    scanf("%d",&a);
    c[i]=a;}        
    if(c[i]==0 || c[i]==5);{
        printf("%d\n",c[i]);
}

}
どなたかヒントでも良いので教えていただけないでしょうか?
宜しくお願いいたします。

dairygoods 2003/11/12(水) 22:13:35
#include<stdio.h>
void main()
{
    int i,a,c[6];
    int 今のところ一番大きい数;
    for(i=0;i<=5;i++){
        scanf("%d",&a);
        c[i]=a;
    }
    今のところ一番大きい数 = c[0];
    for(i=1;i<=5;i++) {
        if(c[i]が今のところ一番大きい数より大きい) {
             今のところ一番大きい数 = c[i];
        }
    }
    printf("%d\n",今のところ一番大きい数);
}

RAPT 2003/11/12(水) 22:35:02
dairygoods さんが答を載せてしまいましたが、折角書いたので…。

私自身がコンピュータの気持ちになって、まつおさんのコードを解釈してみました。

for文の書きかたがおかしい。
> for (i = 0, i <= 5; i++; ){
i <= 5 は、ただ単に評価される。
i = 0 で i が 0 で初期化される。
for文のループ条件、i++ だが、後置インクリメントなので、まず i の値が評価され、
 i == 0 なので、for文を抜ける。そして、i++ で i がインクリメントされ、i == 1 とな
る。
⇒結局for文のブロック内は一度も実行されない。

i == 1 であり、c[]は初期化されていないため、c[i] == c[1] の値は不定である。
そのため、(c[i] == 0 || c[i] == 5) の結果は真とも偽ともなりうる。
ところが、if文が、「;」で終結しているため、次のブロック{}は、このif文とは関わり無く、
必ず実行される。

c[i] == c[1] であり、その値は不定なので、不定の値が標準出力に表示される。


⇒最終的に、標準出力に不定な値が出力され、プログラムは終了する。

RAPT 2003/11/12(水) 22:38:01
> i <= 5 は、ただ単に評価される。
> i = 0 で i が 0 で初期化される。
すみません、順番が逆でした。

それから、書き忘れましたが、引用されている個所で、まつおさんのコード中に
空白文字を入れてあります。

kajiki 2003/11/12(水) 23:01:46
if(c[i]==0 || c[i]==5);{    //←この行すごく変
     printf("%d\n",c[i]);
}

if ( 条件 ); ←このセミコロン不要。
条件もなんだこれ。
とりあえず
変数を2つ用意してそれぞれに数値を入れたとしよう。
例)
int a = 3;
int b = 5;

これからaとbどっちが大きいかってソース書けるかい?
それすら出来てないようから、もうちょっと参考書読んでみなよ。

まつお 2003/11/12(水) 23:09:59
皆様助言ありがとうございます。
皆様の助言を下にこれから作りなおしてみたいと思います。
変な質問して申し訳ありませんでした。

まつお 2003/11/13(木) 18:20:30
あれから皆様の意見を参考に作り直してみました。
#include<stdio.h>
main()
{
    int i,a,c[6],max;  
    for(i=0;i<=5;i++){    
        scanf("%d",&a);
        c[i]=a;
    }                       
    max = c[0];    
    for(i=0;i<=5;i++){ 
        if(c[i] > max)
             max = c[i];
    }
    printf("max=%d\n",max); 
}
一応問題なく実行されたのですが、
このような感じで宜しいでしょうか?
先輩方の意見を聞かせてください。

PAI 2003/11/13(木) 18:25:21
細かいスタイルはいろいろ突っ込めるところはあるけど、
とりあえずは問題なく実行されたんだったらそれでいいんじゃない。

kajiki 2003/11/13(木) 19:00:54
PAIさんに同意。
慣れてくればもっとスマートにかけるようになるさ。
がんばれ。

たいちう 2003/11/13(木) 19:06:00
でもせっかく意見をお求めなので、僭越ながら、、、

1.
main関数は

int main()
{
    ...
    return 0;
}

と書く。

2.
main関数の前に

#define N 6

を追加してmain関数内の6や5をなくす(6の代わりにNと書く)。
特に5という数字には何の意味もないので、
define を使わないとしても、せめてこう書く。

for (i=0;i<6;i++) {

ついでに3.
scanfしながら常に最大値を保持しておけば、forは1つですむ。

RAPT 2003/11/13(木) 23:18:30
ついでに4.
> scanf("%d",&a);
> c[i]=a;
変数 a はここでしか使用されていないので、
scanf("%d",&c[i]);
と書けます。こうすれば、変数 a は不要となります。


ちなみに、たいちろうさんの3.を行なうには、maxの初期値として、
変数 max がとりうる最小値を指定する必要があります。
(通常、マクロで定義されています)

VC++6では、int型については、LIMITS.Hに、
#define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */
と定義されています。

まつお 2003/11/14(金) 00:52:18
[[解決]]
皆様色々とありがとうございます。
大変勉強になります。
私自身最近C言語を始めたばかりで右も左もわからない状態でして・・・
早く皆さんのように理解できるようになりたいです。

επιστημη [E-Mail] [HomePage] 2003/11/14(金) 09:56:22
// 余計なお世話^^;
// C++版: 要素数制限ナシ

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
  std::vector<int> input;
  int n;
  while ( std::cin >> n )
    input.push_back(n);
  std::cout << *std::max_element(input.begin(), input.end());
  return 0;
}

古いスレッドには追加発言できません。