掲示板ランキング  東洋ハーブ(ウコン(うこん))  東洋ハーブ(春ウコン(春うこん))


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.6320

すごい初心者ですけど、お助けを!
投稿者---てつ(2006/08/24 11:35:22)


getchar関数を使用して、数字を10回入力し、最も大きな数を表示するプログラムを作ろうとするですけど、こんな考え合ってますか?!


/*.............................................*/
#include<stdio.h>
#include<stdlib.h>

main()
{
int index=0;
char *str;
char *a[10];





/*メモリ確保*/
str = (char *)calloc(10, sizeof(char));
/*メモリ確保に失敗した時プログラム終了*/
if(str == NULL)
{
printf("エラー");
exit(-1);
}

printf("数字を10回入力し、最も大きな数を表示する。\n5桁以下の数字を2つ入力して下さい。\n");

for(;;)
{
*(str+index)=getchar();
index++;
if(*(str+index-1)=='\n')
{
*(str+index-1)='\0';


break;
}
}
printf("%s\n",str);
/*
ここになんかいれてstrをほぞんしたいけどあってますか?!
めちゃくちゃですかね!自分もそう思うんですが.....
*/
printf("%s\n",a[10]);
/*メモリ開放*/
free(str);

}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:すごい初心者ですけど、お助けを! 6323 ruby 2006/08/24 13:12:00
<子記事> Re:すごい初心者ですけど、お助けを! 6339 shu 2006/08/24 16:15:57


No.6323

Re:すごい初心者ですけど、お助けを!
投稿者---ruby(2006/08/24 13:12:00)


タイトルは「すごい初心者ですけど、お助けを!」というのではなく、
投稿内容を的確に反映させてください。

さて、本題へ行きます。
プログラムの仕様が今ひとつつかめていない状態です。
「数字を10回入力する」のか「5桁以下の、つまり1桁〜5桁の数字を
2回入力する」のか、どちらでしょう?

また、入力の区切りとしてのEnterキーを押すタイミングは、
どのように考えていますか?



この投稿にコメントする

削除パスワード

No.6324

Re:すごい初心者ですけど、お助けを!
投稿者---てつ(2006/08/24 13:23:29)


>タイトルは「すごい初心者ですけど、お助けを!」というのではなく、
>投稿内容を的確に反映させてください。
>
>さて、本題へ行きます。
>プログラムの仕様が今ひとつつかめていない状態です。
>「数字を10回入力する」のか「5桁以下の、つまり1桁〜5桁の数字を
>2回入力する」のか、どちらでしょう?
>
>また、入力の区切りとしてのEnterキーを押すタイミングは、
>どのように考えていますか?

getchar関数を使用して、数字を10回入力し、最も大きな数を表示するプログラムを作ろうとするですけど、こんな考え合ってますか?!

5桁以下の数字を10回入力し、最も大きな数を表示したいです。

5桁以下の数字を一組入力して「Enter」を押す。
また、5桁以下の数字を一組入力して「Enter」を押す。
こんな漢字で10組の数字を入力終わって「Enter」をおすと
最大値を出力したです。
***数字しか入力できないようにしたいです。



/*.............................................*/
#include<stdio.h>
#include<stdlib.h>

main()
{
int index=0;
char *str;
char *a[10];





/*メモリ確保*/
str = (char *)calloc(10, sizeof(char));
/*メモリ確保に失敗した時プログラム終了*/
if(str == NULL)
{
printf("エラー");
exit(-1);
}

printf("数字を10回入力し、最も大きな数を表示する。\n5桁以下の数字を入力して下さい。\n");/*ココ訂正*/

for(;;)
{
*(str+index)=getchar();
index++;
if(*(str+index-1)=='\n')
{
*(str+index-1)='\0';


break;
}
}
printf("%s\n",str);
/*
ここになんかいれてstrをほぞんしたいけどあってますか?!
めちゃくちゃですかね!自分もそう思うんですが.....
*/
printf("%s\n",a[10]);
/*メモリ開放*/
free(str);

}



この投稿にコメントする

削除パスワード

No.6325

タイトルは適切なものにしてください。
投稿者---Blue(2006/08/24 13:32:25)


とりあえず、掲示板ご利用上の注意をよんでください。

守られていないことがいくつかあります。
> 題名と投稿者名は具体的に書きます。
→このような、題名では回答者の興味を引くことはできません。
逆に、回答したくなくなります。

> ソースの添付は「HTML変換ツール」で字下げします。
→字下げされていないソースは読む気がなくなります。

> 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
→環境によってはできることできないことがありますので、きちんと明記してください。



この投稿にコメントする

削除パスワード

No.6327

Re:タイトルは適切なものにしてください。
投稿者---てつ(2006/08/24 13:49:45)


>とりあえず、掲示板ご利用上の注意をよんでください。
>
>守られていないことがいくつかあります。
>> 題名と投稿者名は具体的に書きます。
>→このような、題名では回答者の興味を引くことはできません。
>逆に、回答したくなくなります。
>
>> ソースの添付は「HTML変換ツール」で字下げします。
>→字下げされていないソースは読む気がなくなります。
>
>> 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
>→環境によってはできることできないことがありますので、きちんと明記してください。

すいません、緊急で出したもんでルールとか見る時間なかったです!
どうかご理解を!


この投稿にコメントする

削除パスワード

No.6329

理解できません。
投稿者---Blue(2006/08/24 14:05:08)


>すいません、緊急で出したもんでルールとか見る時間なかったです!
>どうかご理解を!
急いでいれば、ルールを破ってもいいということを理解してほしいのでしょうか?

どちらにせよ、ルールを守れない人は掲示板を利用するのを控えてもらいたいです。

といっているそばから、また字下げしないソースを載せている。
環境も書いていない。タイトルも変えていない。



この投稿にコメントする

削除パスワード

No.6326

今回のプログラムの処理概要
投稿者---ruby(2006/08/24 13:48:24)


>5桁以下の数字を10回入力し、最も大きな数を表示したいです。

数字じゃなくて0〜99999の数値なのですね。やっとわかりました。
今回のプログラムは、getchar関数を使っては実現できないと思います。
処理の概要は、

1)入力内容をいったん文字列として受ける。
2)0〜9だけを受け付けるのであれば、前項の文字列に対して
そういうチェックを行なう。
3)チェックを通過したら、文字列→数値の変換を行なう。
4)前3項を10回繰り返し、10個の数値を得る。
5)10個の数値の最大値を求めて、その値を出力する。

といったものになりましょうか。


この投稿にコメントする

削除パスワード

No.6328

Re:今回のプログラムの処理概要
投稿者---てつ(2006/08/24 14:00:40)


>>5桁以下の数字を10回入力し、最も大きな数を表示したいです。
>
>数字じゃなくて0〜99999の数値なのですね。やっとわかりました。
>今回のプログラムは、getchar関数を使っては実現できないと思います。
>処理の概要は、
>
>1)入力内容をいったん文字列として受ける。
>2)0〜9だけを受け付けるのであれば、前項の文字列に対して
>そういうチェックを行なう。
>3)チェックを通過したら、文字列→数値の変換を行なう。
>4)前3項を10回繰り返し、10個の数値を得る。
>5)10個の数値の最大値を求めて、その値を出力する。
>
>といったものになりましょうか。


getchar関数を使っては実現できないと思います。????
ええ、そんな!
「getchar関数を使って」というかだいですが....
文字列→数値の変換を行なうのってどうやります?

int index=0;
char *str;
int *a[10];





/*メモリ確保*/
str = (char *)calloc(10, sizeof(char));
/*メモリ確保に失敗した時プログラム終了*/
if(str == NULL)
{
printf("エラー");
exit(-1);
}

printf("数字を10回入力し、最も大きな数を表示する。\n5桁以下の数字を2つ入力して下さい。\n");

for(;;)
{
*(str+index)=getchar();
index++;
if(*(str+index-1)=='\n')
{
*(str+index-1)='\0';


break;
}
}
printf("%s\n",str);

ここまでは文字列として受けます(数値のチェックは抜いて)
そして文字列から数値の変換が出来ません!
下のは試しにしたけど失敗です。
変な数値に変わります。
しかもこういう警告がです。
1-7-50.c 38: 警告: ポインタの型が合わない (=)
----a[10]= *str;-----この行です



a[10]= *str;
printf("%s\n",a[10]);


この投稿にコメントする

削除パスワード

No.6330

Re:今回のプログラムの処理概要
投稿者---Blue(2006/08/24 15:24:47)


>getchar関数を使っては実現できないと思います。
こんな感じでいかが?
#include <stdio.h>

#define ISNUM( c ) ( ( ( c ) >= '0' )  && ( ( c ) <= '9' ) ) // ctype.h isdigit
#define TONUM( c ) ( ( c ) - '0' )

int getnumber( int* n, int keta )
{
    int c;
    int result = 0;

    while ( c = getchar(), ( c != '\0' ) && ( c != '\n' ) )
    {
        if ( !ISNUM( c ) || ( --keta < 0 ) )
        {
            while ( c = getchar(), ( c != '\0' ) && ( c != '\n' ) );
            return 0;
        }
        result = result * 10 + TONUM( c ); // オーバフローは考慮していない
    }
    *n = result;
    return 1;
}

int main( void )
{
    int n;
    if ( getnumber( &n, 5 ) )
        printf( "%d を入力しました。\n", n );
    else
        puts( "不正な入力です。" );
    return 0;
}



この投稿にコメントする

削除パスワード

No.6331

ありがとうです。
投稿者---てつ(2006/08/24 15:36:31)


ありがとうです。
難しいです、みてもわからないのでほかの方法考えます。
お疲れでした!


この投稿にコメントする

削除パスワード

No.6333

Re:ありがとうです。
投稿者---ruby(2006/08/24 15:44:50)


>難しいです、みてもわからないのでほかの方法考えます。

せっかく投稿してくださったのに、10分やそこらであきらめてしまうのですか?
新しい方法を考える前に、どうやったらBlueさんのプログラムを
うまく流用できるかを考えないのですか?


この投稿にコメントする

削除パスワード

No.6334

Re:ありがとうです。
投稿者---てつ(2006/08/24 15:55:12)


>>難しいです、みてもわからないのでほかの方法考えます。
>
>せっかく投稿してくださったのに、10分やそこらであきらめてしまうのですか?
>新しい方法を考える前に、どうやったらBlueさんのプログラムを
>うまく流用できるかを考えないのですか?


私もそうしたいどころですが...
cを始めて3週間の私に.....
せっかくですが、申し訳ないです!



この投稿にコメントする

削除パスワード

No.6332

Re:今回のプログラムの処理概要
投稿者---ruby(2006/08/24 15:40:57)


>こんな感じでいかが?

ありがとうございます。
私は、端からできないものと思い込んでいました。自戒せねば…。


この投稿にコメントする

削除パスワード

No.6335

Re:今回のプログラムの処理概要
投稿者---ruby(2006/08/24 16:01:45)


>こんな感じでいかが?

getnumber関数で、return 0;する直前の2つ目のwhile文は、
「入力内容に誤りがあったので、その時点の入力ストリームの内容をクリアする」
という意味でしょうか?


この投稿にコメントする

削除パスワード

No.6337

Re:今回のプログラムの処理概要
投稿者---Blue(2006/08/24 16:07:16)


>getnumber関数で、return 0;する直前の2つ目のwhile文は、
>「入力内容に誤りがあったので、その時点の入力ストリームの内容をクリアする」
>という意味でしょうか?
そのつもりです。
その後の処理をfgets関数を使った後のようにしたいと思って入れました。



この投稿にコメントする

削除パスワード

No.6338

Re:今回のプログラムの処理概要
投稿者---ruby(2006/08/24 16:13:20)


>そのつもりです。
>その後の処理をfgets関数を使った後のようにしたいと思って入れました。

よく理解できました。
重ね重ねありがとうございます。


この投稿にコメントする

削除パスワード

No.6339

Re:すごい初心者ですけど、お助けを!
投稿者---shu(2006/08/24 16:15:57)


//
//	サンプルプログラム1
//

int main(void)
{
    int num[N], max;
    int i;
    
    //
    for (i = 0; i < N; i++) {
        scanf("%d", &num[i]);
    }
    
    //
    max = num[0];
    
    for (i = 1; i < N; i++) {
        if (max < num[i]) {
            max = num[i];
        }
    }
    
    //
    for (i = 0; i < N; i++) {
        printf("%d ", num[i]);
    }
    putchar('\n');
    
    printf("max = %d\n", max);
    
    return 0;
}

//
//	サンプルプログラム2
//

{
    char str[N];
    int i, num;
    
    //	step 1
    for (i = 0; i < N; i++) {
        str[i] = getchar();
    }
    
    //	step 2
    for (i = 0; i < N - 1; i++) {
        str[i] = getchar();
    }
    str[i] = '\0';
    
    //	step 3
    for (i = 0; i < N - 1; i++) {
        str[i] = getchar();
        
        if (str[i] == '\n') {
            break;
        }
    }
    str[i] = '\0';
    
    //	step 4
    for (i = 0; i < N - 1; i++) {
        str[i] = getchar();
        
        if (str[i] == '\n') {
            break;
        }
    }
    str[i] = '\0';
    
    num = atoi(str);
}



この投稿にコメントする

削除パスワード

No.6340

atoiで数値でも変換しらなかったです!
投稿者---てつ(2006/08/24 16:36:48)


重要なこの一法ありがとうでした。

num = atoi(str);

これで何とかやってみます。

atoiこの関数知らなかったです。
本当に助かります!


この投稿にコメントする

削除パスワード

No.6343

Re:atoiで数値でも変換しらなかったです!
投稿者---shu(2006/08/24 23:48:44)


>num = atoi(str);
>
>これで何とかやってみます。

最終的なてつオリジナルプログラムによる結果報告待っております。

>atoiこの関数知らなかったです。
>本当に助かります!

一番どうでもいいことを喜ばれているようで、なにかむなしい・・・・・・


この投稿にコメントする

削除パスワード

No.6346

Re:atoiで数値でも変換しらなかったです!
投稿者---てつ(2006/08/25 13:31:53)


>>num = atoi(str);
>>
>>これで何とかやってみます。
>
>最終的なてつオリジナルプログラムによる結果報告待っております。
>
>>atoiこの関数知らなかったです。
>>本当に助かります!
>
>一番どうでもいいことを喜ばれているようで、なにかむなしい・・・・・・


バリバリの初心者なので、関数一個わかってうれしいのは当然です:)
ステップ1.2.3.4は自分で作りましたけど、atoiがわからなくで進めなかったです。

数字を10回入力し、最も大きな奇数を表示するものをつくりました。
5回に一回は最大値を出力なしに終わります。
どこか悪のかわからないです

#include<stdio.h>
#include<stdlib.h>

main()
{
    int index;
    char *str;
    int su[10];
    int i,sumax=0;
    
    /*メモリ確保*/
    str = (char *)calloc(10, sizeof(char));
    /*メモリ確保に失敗した時プログラム終了*/
    if(str == NULL)
    {
        printf("エラー");
        exit(-1);
    }
    
    printf("数字を10回入力し、最も大きな奇数を表示する。\n5桁以下の数字を入力して下さい。\n");
    
    for (i=0;i<10;i++)
    {
        index=0;
        printf("入力データ(%d回目)==>",i+1);
        for(;;)
        {
            
            *(str+index)=getchar();
            index++;
                if(*(str+index-1)=='\n')
                {
                    *(str+index-1)='\0';
                    break;
                }
        }
/*    printf("%s\n",str);      確認のためのプリント*/
    
        su[i] = atoi(str);
        
            if (su[i]==0)
            {
                printf("入力エラー\n");
                i-=1;
                continue;
            }
            else if (su[i]!=0)
                if(su[i] > 0 && su[i] <= 9999)    
                {
/*          printf("成功(%d回目)\n",i+1);      確認ためのプリント*/
                    
                        /*数字の比較*/
                    
                        
                        if (su[i]%2!=0)
                        {
                            if(sumax<su[i])
                                sumax=su[i];
                                if(i==9)
                                {
                                    printf("最大奇数==>%d\n",sumax);
                                    break;
                                }
                        }
                        
                    goto next;
                }
                else
                printf ("入力エラー\n");
                i-=1;
                next:
                continue;
                
    }
    
    
    /*メモリ開放*/
    free(str);

}



この投稿にコメントする

削除パスワード

No.6347

Re:atoiで数値でも変換しらなかったです!
投稿者---ruby(2006/08/25 13:55:19)


引用は必要最小限にとどめましょう。「掲示板利用宣言」にそう書いてあります。

>数字を10回入力し、最も大きな奇数を表示するものをつくりました。
>5回に一回は最大値を出力なしに終わります。

10回ループする1個のfor文の中で、データ入力や数値への変換、
さらに最大奇数の取得まで行なっているので、
プログラム全体の見通しが悪くなっていると思います。
機能ごとに分離・分割して考えてみてはいかがでしょう。

また、最大桁数は5なのですか?
10000以上だと入力エラーにしているようですが…。


この投稿にコメントする

削除パスワード

No.6348

Re:atoiで数値でも変換しらなかったです!
投稿者---クロ(2006/08/25 14:12:51)


入力データ(1回目)==>1
入力データ(2回目)==>2
入力データ(3回目)==>3
入力データ(4回目)==>4
入力データ(5回目)==>5
入力データ(6回目)==>6
入力データ(7回目)==>5
入力データ(8回目)==>4
入力データ(9回目)==>3
入力データ(10回目)==>2
と順番よく入力すると確実に落ちますね。


この投稿にコメントする

削除パスワード

No.6350

Re:atoiで数値でも変換しらなかったです!
投稿者---ruby(2006/08/25 14:16:03)


>と順番よく入力すると確実に落ちますね。

こういう場合、普通「落ちる」とは言いません。
単に結果を表示しないだけです。

今のプログラムでは、10個目のデータが偶数のとき、
最大奇数の値を出力してくれません。
理由を考えてみてください。


この投稿にコメントする

削除パスワード

No.6351

Re:atoiで数値でも変換しらなかったです!
投稿者---ruby(2006/08/25 14:17:53)


>今のプログラムでは、10個目のデータが偶数のとき、
>最大奇数の値を出力してくれません。
>理由を考えてみてください。

失礼いたしました。上記のコメントは、当然のことながらてつさん宛です。


この投稿にコメントする

削除パスワード

No.6353

Re:atoiで数値でも変換しらなかったです!
投稿者---クロ(2006/08/25 14:21:59)


すみません。
ソースが長くて、読まずにテストしてしまいました。


この投稿にコメントする

削除パスワード

No.6352

分離・分割関数と方法教えてください!
投稿者---てつ(2006/08/25 14:20:33)


>引用は必要最小限にとどめましょう。「掲示板利用宣言」にそう書いてあります。
すいません、全部出さないとわからないかな〜っと思って..
みんな私と同じレベルじゃないモンね〜!


>>数字を10回入力し、最も大きな奇数を表示するものをつくりました。
>>5回に一回は最大値を出力なしに終わります。
>
>機能ごとに分離・分割して考えてみてはいかがでしょう。
これが出来ないです。これについての関数か方法を教えてください

>また、最大桁数は5なのですか?
>10000以上だと入力エラーにしているようですが…。
気づきました。今!
すぐ変えます!



この投稿にコメントする

削除パスワード

No.6355

Re:分離・分割関数と方法教えてください!
投稿者---ruby(2006/08/25 14:40:42)


>これが出来ないです。これについての関数か方法を教えてください

私だったらこんな風にしてみる、という例を書きます。
まだ骨組みだけですので、動きません。

input_data関数とget_max_odd関数の中身を考えてみてください。
先に提示されたソースコードを、どう当てはめればよいでしょうか。

#include <stdio.h>
#include <stdlib.h>

#define NUM (10)                        /* データの個数 */

void input_data(int *su, int n);        /* データを入力する関数 */
int get_max_odd(int *su, int n);        /* 最大奇数を求める関数 */

int main(void)
{
    int su[NUM];                        /* データ */
    int sumax;              /* 最大奇数 */
    
    input_data(su, NUM);                /* データを入力する */
    sumax = get_max_odd(su, NUM);      /* 最大奇数を求める */
    printf("最大奇数=%d\n", sumax);
    return 0;
}

void input_data(int *su, int n)
{
    /* ここに、データ入力処理を書く */
}

int get_max_odd(int *su, int n)
{
    /* ここに、最大奇数を求める処理を書く */
}




この投稿にコメントする

削除パスワード

No.6366

Re:分離・分割関数と方法教えてください!
投稿者---yoh2(2006/08/26 13:01:40)


>>これが出来ないです。これについての関数か方法を教えてください

まずは具体的にどんなコードを書くのかを考えるのではなく、もっと大雑把に、
どんな流れにしたいかを考えます。

rubyさんの例ですと、

1. 10個の整数を読み取る。
2. 1で読み取った10個の整数から最大の奇数を求める。
3. 2の結果を表示する。

という流れですね。
その後、Cではどのように書くかを考えていきます。
(上の例にはありませんが)「繰り返す」という表現があれば、大抵はforやwhileといった
繰り返し構文が相当し、「もし...ならば」といった表現があれば、ifやswichといった分岐構文が
相当します。
その他は代入、(自作、既存を問わず)関数の呼び出し等に相当します。
今回は、

1: 自作関数input_data()呼び出し
2: 自作関数get_max_odd()呼び出し
3: 既存関数printf()呼び出し

に相当します。

# 日本語だと「関数」となっていますが、原語の「function」には、「機能」という意味もあります。
# そして、「機能」と翻訳して考えてみるとしっくりくる場合も多々あります。これがその一例。

既存関数の呼び出しならそこで終わりですが、自作関数ですと、今度はその関数の内容を
考えなくてはなりません。
とはいっても、考え方は一緒で、関数の流れを考える→Cのコードに対応させる、とするだけです。
さらにその自作関数のなかで自作関数が必要になったら...と繰り返し、自作関数の新規作成が
不必要になったらあら不思議。プログラムがひとつ完成している、といった寸法です。


ちなみに、rubyさんの示した、数値読み込みと最大奇数判定を分離する流れの他に、
数値読み込みと同時に最大奇数を順次判定していくといった方法もあります。
興味がありましたら、こちらの方針でも実装してはいかがでしょう。

a. 「前回までの最大奇数」にあたるデータ(以下のc - eで使う)を初期化。
b. c - dを10回繰り返す。
c. 数値をひとつ読み込む。
d. cで読み込んだ数値が奇数かつ「前回までの最大奇数」より大きかったら、「前回までの最大奇数」をcで読み込んだ値にする。
e. 「前回までの最大奇数」を表示する。

# aは具体的なCのコード寄りだということで、あえて列挙しないこともあります。

このように、どんな流れで処理を実現するかを考えることを「設計」と呼び、
プログラマの腕の見せ所のひとつだったりします。


この投稿にコメントする

削除パスワード

No.6349

Re:atoiで数値でも変換しらなかったです!
投稿者---クロ(2006/08/25 14:14:37)


参考程度に。。。。

#include<stdio.h>

int main(void)
{
    int a[10], i;
    int max = 0;


     printf("数字を10回入力し、最も大きな奇数を表示する。\n5桁以下の数字を入力して下さい。\n");
    
    for (i = 0; i < 10; i++){
        printf("入力データ(%d回目)==>",i+1);
        scanf("%d", &a[i]);

    }

    for (i = 0; i < 10; i++)
        if (0 != a[i] % 2)
            if (max < a[i])
                max = a[i];

    printf("最大奇数==>%d\n", max);

    return 0;
}



この投稿にコメントする

削除パスワード

No.6354

Re:atoiで数値でも変換しらなかったです!
投稿者---てつ(2006/08/25 14:26:40)


英文字入力したら.....
あと、getcharをつかってっといわれました!
せっかくですが、すいません!



この投稿にコメントする

削除パスワード

No.6356

Re:atoiで数値でも変換しらなかったです!
投稿者---「」(2006/08/25 14:49:02)


>英文字入力したら.....
>あと、getcharをつかってっといわれました!
>せっかくですが、すいません!

丸写しできるかどうかだけで判断しないように。
回答者に対して失礼です。

入力以外はすべて参考になるでしょう。
自分のソースと比べて、自分の何が悪いのかよく考えてください。


この投稿にコメントする

削除パスワード

No.6357

Re:atoiで数値でも変換しらなかったです!
投稿者---shu(2006/08/25 14:49:45)


>どこか悪のかわからないです

su[0]〜su[9]に、きちんとデータが入りきる前から、
最も大きな奇数なんて、正しく求まるはずもありません。


この投稿にコメントする

削除パスワード

No.6358

Re:atoiで数値でも変換しらなかったです!
投稿者---ruby(2006/08/25 15:00:54)


>su[0]〜su[9]に、きちんとデータが入りきる前から、
>最も大きな奇数なんて、正しく求まるはずもありません。

いえ、大丈夫です。
1個ずつデータを配列に入れるたびに、
・奇数だったらその時点の最大奇数と比較する
・その時点での最大奇数より大きかったら、そのデータを最大奇数とする
というロジックで、10個のデータの最大奇数が求まります。
現時点のプログラムは、最大奇数の値を出力する箇所のネストが正しくないだけです。


この投稿にコメントする

削除パスワード

No.6359

Re:atoiで数値でも変換しらなかったです!
投稿者---ruby(2006/08/25 15:03:28)


入力データがすべて偶数だったら何と出力するか、
という考えが必要であるかもしれませんが…。



この投稿にコメントする

削除パスワード

No.6365

Re:atoiで数値でも変換しらなかったです!
投稿者---shu(2006/08/26 03:02:48)


@rubyさんへ

>1個ずつデータを配列に入れるたびに、

1個ずつだと配列を使う意味合いが薄れる。

>現時点のプログラムは、最大奇数の値を出力する箇所のネストが正しくないだけです。

ネストが正しくないというのは深刻ですが、
浅いネストばかりに目を取られて、深いネストまで見渡せていなかったです。

浅いネストで枠組みをしっかりさせることに重点を置いてきたのですが、
深いネストで無駄を省いたり、場合によっては格上げすることも、
同じように重要だと感じました。


@てつさんへ

具体的にネストを減らす方法。

if(i==9)の処理の場合、
一番外のループ for (i=0;i<10;i++)の後に持ってくれば、
if(i==9)という条件も、breakも必要無くなる。
i<10というforループの継続条件も、しっかりと働いてくれる。

if (su[i]%2!=0)とif(sumax<su[i])の条件の場合、
&&を使ってひとかたまりにした方が、
最大の奇数(最大 && 奇数)という条件として自然な感じがする。

入力エラーの条件の場合
二つある入力エラーの流れを一つにする。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ