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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C

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

Q&A

5回答

1190閲覧

C言語の配列と関して

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

1クリップ

投稿2018/04/15 14:45

整数型の配列変数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

なぜでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

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


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

投稿2018/04/15 14:54

編集2018/04/15 15:02
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/15 15:12

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

2018/04/15 15:17

んで、回答に触れられてないけど気になるところとして、 a[]はべつに int でいいぢゃん、 ってのもあります。 まあ、これはバグではないですがw
退会済みユーザー

退会済みユーザー

2018/04/15 15:19

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

0

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

C

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

sum2 = sum2 + 1

は、else に含まれません。

C

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

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

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

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/15 14:53

編集2018/04/16 13:51
pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/15 15:01

迂闊でした... ご指摘ありがとうございます!なおしてみます!
退会済みユーザー

退会済みユーザー

2018/04/15 15:14

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

2018/04/16 13:46

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

0

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

bash

1$ 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}' 23の倍数: 3 6 9 33の倍数以外: 1 2 4 5 7 8 10

投稿2018/04/15 22:10

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

C

1#include <stdio.h> 2#include <stdlib.h> 3 4#define BUFSIZE 256 5#define MAX_NUMBER 10 6 7int main(void) 8{ 9 char buf[BUFSIZE]; 10 int data[MAX_NUMBER]; 11 int i; 12 13 for(i = 0; i < MAX_NUMBER; i++){ 14 fgets(buf,sizeof(buf),stdin); 15 data[i] = atoi(buf); 16 } 17 18 printf("3の倍数:"); 19 for(i = 0; i < MAX_NUMBER; i++){ 20 if(data[i] % 3 == 0){ 21 printf("%d ",data[i]); 22 } 23 } 24 printf("\n"); 25 printf("3の倍数以外"); 26 for(i = 0; i < MAX_NUMBER; i++){ 27 if(data[i] % 3 != 0){ 28 printf("%d ",data[i]); 29 } 30 } 31 return 0; 32}

追記

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

C

1#include <stdio.h> 2#include <stdlib.h> 3 4#define BUFSIZE 256 5#define MAX_NUMBER 10 6 7int main(void) 8{ 9 char buf[BUFSIZE]; 10 int data[MAX_NUMBER]; 11 int i; 12 int a[MAX_NUMBER]; 13 int b[MAX_NUMBER]; 14 int count = 0; 15 int count2 = 0; 16 17 for(i = 0; i < MAX_NUMBER; i++){ 18 fgets(buf,sizeof(buf),stdin); 19 data[i] = atoi(buf); 20 } 21 22 for(i = 0; i < MAX_NUMBER; i++){ 23 if(data[i] % 3 == 0){ 24 a[count] = data[i]; 25 count++; 26 } 27 else{ 28 b[count2] = data[i]; 29 count2++; 30 } 31 } 32 printf("3の倍数:"); 33 for(i = 0; i < count; i++){ 34 printf("%d ",a[i]); 35 } 36 printf("\n"); 37 printf("3の倍数以外:"); 38 for(i = 0; i < count2; i++){ 39 printf("%d ",b[i]); 40 } 41 42 return 0; 43}

投稿2018/04/16 02:29

編集2018/04/16 02:35
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/16 02:37 編集

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

0

c

1#include<stdio.h> 2int main() 3{ 4 int i, data[10]; 5 int a[10], b[10], sum = 0, sum2 = 0; 6 7 printf("1から10までの整数を10個入力してください。\n"); 8 // 数値の入力 9 for(i = 0; i < 10; i++){ 10 scanf("%d", &data[i]); 11 } 12 13 //配列の表示 14 for(i = 0; i < 10; i++){ 15 printf("%d ", data[i]); 16 } 17 printf("\n"); 18 19 // 3の倍数かどうか 20 for(i = 0; i < 10; i++){ 21 if (data[i] % 3 == 0){ 22 a[sum] = data[i]; 23 sum = sum + 1; 24 }else{ 25 b[sum2] = data[i]; 26 sum2 = sum2 + 1; 27 } 28 } 29 30 // 3の倍数表示 31 printf("3の倍数:"); 32 for(i = 0; i < sum; i++){ 33 printf("%d ", a[i]); 34 } 35 printf("\n"); 36 37 // 3の倍数以外表示 38 printf("3の倍数以外:"); 39 for(i = 0; i < sum2; i++){ 40 printf("%d ", b[i]); 41 } 42 printf("\n"); 43 44 return 0; 45}

実行例

$ 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の倍数かどうか の部分をみなおすとよいと思います。

投稿2018/04/15 21:39

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問