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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

953閲覧

C言語 配列を振り分ける

carlton

総合スコア13

C

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/06/29 08:31

編集2018/06/29 08:34

下記文のループ処理が正常に行われないのですが、その理由が分かりません。
printf文を使ってみたところ2回だけ動作をしているようなのですが、どうしたら望みの動作になるか解説をお願いします。

動作としてはある一定の数字を起点にして配列を三つに分けたいです。
(今回でいうと元のWを010,1116,17~20のデータを振り分けたいです)

C言語

1{ 2 int W[20] = { 9,19,19,12,12,17,8,8,16,16,16,10,10,10,20,20,20,9,9,9 }; 3 int Sare[3][20]={0}; 4 int SareC=0; 5 int up[3]={0}; 6. 7. 8. 9 for(SareC=0;SareC<=20;){ 10 if(W[SareC]<=10){ 11 Sare[0][up[0]]=W[SareC]; 12 up[0]++; 13 SareC++; 14 } 15 else if(W[SareC]<=16){ 16 Sare[1][up[1]]=W[SareC]; 17 up[1]++; 18 SareC++; 19 } 20 else if(W[SareC]<=20){ 21 Sare[2][up[2]]=W[SareC]; 22 up[2]++; 23 SareC++; 24 } 25 } 26. 27. 28. 29}

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

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

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

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

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

guest

回答3

0

printf文を使ってみたところ2回だけ動作をしているようなのですが

という「2回だけ動作」という意味がよくわからないのですがどういう結果になるのでしょうか?そのprintfでの出力コードも載せてもらえますか?

それと、ループ回数が1回多いのと、21以上だった場合が抜けている点を修正しつつ、もう少し簡潔に書くとすると、

C

1 for(SareC=0;SareC<20;SareC++){ 2 if(W[SareC]<=10){ 3 Sare[0][up[0]++]=W[SareC]; 4 } 5 else if(W[SareC]<=16){ 6 Sare[1][up[1]++]=W[SareC]; 7 } 8 else if(W[SareC]<=20){ 9 Sare[2][up[2]++]=W[SareC]; 10 } 11 }

の様な感じでしょうか。
ループ変数を、forの処理の中でいじるのはわかりにくいコードのなるのでよくはないです。例えば、元のコードだと、もし、21以上の数値があった場合にSareCがカウントアップされません。こういうミスが起きがちなので、標準の書き方が望ましいです。

投稿2018/06/29 09:04

PineMatsu

総合スコア3579

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

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

carlton

2018/06/29 09:09

ありがとうございます for文の継続条件術式についても、ありがとうございました
guest

0

ベストアンサー

一か所おかしい(※)ところは直しましたが、普通に動いていますよ?

C

1#include <stdio.h> 2 3int main(int argc, char** argv) { 4 int W[20] = { 9,19,19,12,12,17,8,8,16,16,16,10,10,10,20,20,20,9,9,9 }; 5 int Sare[3][20]={0}; 6 int SareC=0; 7 int up[3]={0}; 8 9 for(SareC=0;SareC<20;){ 10 if(W[SareC]<=10){ 11 Sare[0][up[0]]=W[SareC]; 12 up[0]++; 13 SareC++; 14 } else if(W[SareC]<=16){ 15 Sare[1][up[1]]=W[SareC]; 16 up[1]++; 17 SareC++; 18 } else if(W[SareC]<=20){ 19 Sare[2][up[2]]=W[SareC]; 20 up[2]++; 21 SareC++; 22 } 23 } 24 25 for(int i=0; i<3; i++) { 26 for(int j=0; j<20; j++) { 27 printf("%2d,", Sare[i][j]); 28 } 29 puts(""); 30 } 31 return 0; 32}

結果(Ubuntu Linux amd64, gcc 5.4.0)

9, 8, 8,10,10,10, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,12,16,16,16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19,19,17,20,20,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

※SareC のループは 0~19 までなので、 <=20 ではなく <20

投稿2018/06/29 08:58

tacsheaven

総合スコア13703

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

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

0

各ifの中で'SareC++'を実行していますが、for分は次の繰り返し処理に入る際、

for (①; ②; ③)

③に書かれた処理を実行します。
つまり、SareC++が二回行われてしまいます。

また、②に書かれたSareC<=20はSareCが20の時も「真」になりループ内に突入しますが、
W[SareC](W[20]へのアクセス)はメモリアクセス違反です。
SareC<20で良いです。

投稿2018/06/29 08:38

takabosoft

総合スコア8356

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問