質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.86%

  • C

    3328questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C言語の配列と関して

受付中

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 207
退会済みユーザー

退会済みユーザー

整数型の配列変数dataを作成し、キーボードから入力させ、値を表示させてから3の倍数とそれ以外の数にわけて表示するプログラムです。
思うように動きません。

#include<stdio.h>
int main()
{
    int i, data[10], b[10], sum = 0, sum2 = 0;
    double a[10];
    printf("1から10までの整数を10個入力してください。\n");
    //数値の入力
    for(i=0; i<10; i++){
        scanf("%d", &data[i]);
    }

    //配列の表示
    for(i=0; i<10; i++){
        printf("%d ", data[i]);
    }
    printf("\n");

    //3の倍数かどうか
    for(i=0; i<10; i++){
        if(data[i]%3==0){
            a[i] = data[i];
            sum = sum + 1;
        }else b[i] = data[i];
        sum2 = sum2 + 1;
    }

    //3の倍数表示
    printf("3の倍数:");
    for(i=0; i<sum; i++){
        printf("%d ", a[i]);
    }
    printf("\n");

    //3の倍数以外表示
    printf("3の倍数以外:");
    for(i=0; i<sum2; i++){
        printf("%d ", b[i]);
    }
    printf("\n");

    return 0;
}

↓10個の整数を1,2,3,4,5,6,7,8,9,3としたときの結果です。

c:\prgc>kadai16
1から10までの整数を10個入力してください。
1
2
3
4
5
6
7
8
9
3
1 2 3 4 5 6 7 8 9 3
3の倍数:8 1997138198 0 6356644
3の倍数以外:1 2 1995729546 4 5 4199136 7 8 6356704 6356760

なぜでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+2

まず、ぱっと目に付いた点、

    //3の倍数かどうか
    for(i=0; i<10; i++){
        if(data[i]%3==0){
            a[i] = data[i];
            sum = sum + 1;
        }else b[i] = data[i];
        sum2 = sum2 + 1;
    }

sum2 = sum2 + 1
は、else に含まれません。

        }else {
          b[i] = data[i];
          sum2 = sum2 + 1;
        }


かなって気がします。 (これを忘れた結果は、環境依存)
括弧で括る習慣をつけた方が良いと思います。
その他はこれから。
それと、何が上手くいかないか具体的に書かれた方が、確認が早くなります。

-- 追記。
大物がいました。

a[i] = data[i];

ここ、 a[i]じゃなくて、 a[sum] でしょう。
同様に、

b[i] = data[i];

ここも b[sum2] ですね。

追加 (4/16):
他の方も指摘されてますが、念のため。

double a[10]

ここは、int a[10] ですね。そうしないと、 doubleのデータを intで出力しようとするので、不正な出力となります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/16 00:01

    迂闊でした...
    ご指摘ありがとうございます!なおしてみます!

    キャンセル

  • 2018/04/16 00:14

    ありがとうございます!
    指摘の部分をなおしと、3の倍数はちゃんと3,6,9,3と出たんですが、
    それ以外のものに1,3,6,9,3,8と出てしまいます...

    キャンセル

  • 2018/04/16 22:46

    if 文の else 以降を {} で括っただしょうか?
    あと、本文に追加

    キャンセル

+1

        printf("%d ", a[i]);

%d はint型のフォーマット文字ですねー


で、全部の変数がAUTO変数で初期化していないため、これらの変数はなにかの値を代入しない限り、でたらめな値になってます
3の倍数でないときのa[i]、3の倍数のときのb[i]、ともになにも代入されないため、でたらめな値になってます
ということで、該当する個所の出力がでたらめになる、ということですねー

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/16 00:12

    ありがとうございます!
    これでおかしな数字がでないようになりました!

    キャンセル

  • 2018/04/16 00:17

    んで、回答に触れられてないけど気になるところとして、

    a[]はべつに int でいいぢゃん、

    ってのもあります。
    まあ、これはバグではないですがw

    キャンセル

  • 2018/04/16 00:19

    そうでしたか、参考になります!

    キャンセル

0

#include<stdio.h>
int main()
{
    int i, data[10];
    int a[10], b[10], sum = 0, sum2 = 0;

    printf("1から10までの整数を10個入力してください。\n");
    // 数値の入力
    for(i = 0; i < 10; i++){
      scanf("%d", &data[i]);
    }

    //配列の表示
    for(i = 0; i < 10; i++){
      printf("%d ", data[i]);
    }
    printf("\n");

    // 3の倍数かどうか
    for(i = 0; i < 10; i++){
      if (data[i] % 3 == 0){
        a[sum] = data[i];
        sum = sum + 1;
      }else{
        b[sum2] = data[i];
        sum2 = sum2 + 1;
      }
    }

    // 3の倍数表示
    printf("3の倍数:");
    for(i = 0; i < sum; i++){
      printf("%d ", a[i]);
    }
    printf("\n");

    // 3の倍数以外表示
    printf("3の倍数以外:");
    for(i = 0; i < sum2; i++){
      printf("%d ", b[i]);
    }
    printf("\n");

    return 0;
}


実行例

$ gcc x.c
$ ./a.out
1から10までの整数を10個入力してください。
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10 
3の倍数:3 6 9 
3の倍数以外:1 2 4 5 7 8 10 


3の倍数かどうか の部分をみなおすとよいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは、
さっそく、気になった点を述べたいと思います。
1.配列の要素数の"10"は記号定数にすべきです。
2.入力はscanfより、fgetsをおすすめします。
3.ただの表示だけならば,わざわざ新たな配列に格納する必要はありません。
(あくまでも、表示だけならの話です。そのあと他の処理があるときは別の話です。)

以下、私が書いたソースを載せておきます。(大したことはしてません)

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

#define BUFSIZE 256
#define MAX_NUMBER 10

int main(void)
{
    char buf[BUFSIZE];
    int data[MAX_NUMBER];
    int i;

    for(i = 0; i < MAX_NUMBER; i++){
        fgets(buf,sizeof(buf),stdin);
        data[i] = atoi(buf);
    }

    printf("3の倍数:");
    for(i = 0; i < MAX_NUMBER; i++){
        if(data[i] % 3 == 0){
            printf("%d ",data[i]);
        }
    }
        printf("\n");
    printf("3の倍数以外");
    for(i = 0; i < MAX_NUMBER; i++){
        if(data[i] % 3 != 0){
            printf("%d ",data[i]);
        }
    }
    return 0;
}

 追記

どこが原因かわかりました。とりあえず、以下のソースで試してください。

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

#define BUFSIZE 256
#define MAX_NUMBER 10

int main(void)
{
    char buf[BUFSIZE];
    int data[MAX_NUMBER];
    int i;
    int a[MAX_NUMBER];
    int b[MAX_NUMBER];
    int count = 0;
    int count2 = 0;

    for(i = 0; i < MAX_NUMBER; i++){
        fgets(buf,sizeof(buf),stdin);
        data[i] = atoi(buf);
    }

    for(i = 0; i < MAX_NUMBER; i++){
        if(data[i] % 3 == 0){
            a[count] = data[i];
            count++;
        }
        else{
            b[count2] = data[i];
            count2++;
        }
    }
    printf("3の倍数:");
    for(i = 0; i < count; i++){
        printf("%d ",a[i]);
    }
    printf("\n");
    printf("3の倍数以外:");
    for(i = 0; i < count2; i++){
        printf("%d ",b[i]);
    }

    return 0;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/16 11:36 編集

    好みによりますが, sum = sum + 1のところはsum++のほうが簡略化しています。

    キャンセル

-1

Cなど不要。そう、シェル芸ならね!

$ echo 1 2 3 4 5 6 7 8 9 10|xargs -n1|awk '{if($1%3){a=a" "$1}else{b=b" "$1}}END{print "3の倍数:"b"\n3の倍数以外:"a}'
3の倍数: 3 6 9
3の倍数以外: 1 2 4 5 7 8 10

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3328questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。