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

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

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

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

Q&A

解決済

3回答

109閲覧

0にするにはどうすればよいのか

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/12/13 12:15

編集2018/12/13 12:43

入力した数字が3つ以上並んでいたらならその数を0にするというコードを書きたいです。
例えば、

1 1 1 2 2 ならば  0 0 0 2 2 のように変換したいです。
1 1 1 1 2 ならば 0 0 0 0 2 のように変換したいです。

また、縦は自分で定めて横は5つで固定して考えてます。
下のコードは途中までですが書きました。
「e」というのは横の列を考えたときに同じ数が並んだ回数を数えて2以上ならその数を0にするというコード書くために作ったのですが、その数を0にするやり方がわからず途中で止まっています。この先はどのように書いたらいいのでしょうか?

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int a,b,c,e=0,i,j; 6 printf("縦を指定してください\n"); 7 scanf("%d",&a); 8 int kazu[a][5]; 9 printf("数を入力してください\n"); 10 for(i=0;i<=a-1;i++){ 11 for(j=0;j<=4;j++){ 12 scanf("%d",&kazu[i][j]); 13 } 14 } 15 for(i=0;i<=a-1;i++){ 16 for(j=0;j<=4;j++){ 17 for(c=1;kazu[i][j]==kazu[i][j+c];c++){ 18 e++; 19 } 20 } 21 } 22 23}

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

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

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

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

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

cateye

2018/12/13 12:25

"12223"なども"10003"としますか?
退会済みユーザー

退会済みユーザー

2018/12/13 12:30

します!
guest

回答3

0

0にするやり方

kazu[i][j]=0;です。
#追記
「0にするやり方」がわからないのじゃなくて、「0にするかどうかの判断」が分からないのでしょうか?
cが同じ数が幾つ続いたかを表していますので、eという変数は不要です。
forを抜けたときにc>=3であれば、ゼロにすべきと言うことになります。
また、配列をオーバーしないために、j+c<5という条件も必要です。

C

1 for(i=0;i<a;i++){ 2 for(j=0;j<5;j++){ 3 for(c=1;j+c<5 && kazu[i][j]==kazu[i][j+c];c++); 4 if(c>=3){ 5 for(c--;c>=0;c--){ 6 kazu[i][j+c]=0; 7 } 8 break; 9 } 10 } 11 }

投稿2018/12/13 12:38

編集2018/12/13 14:54
otn

総合スコア84533

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

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

0

データは手入力でなく、プログラム中で初期化して、正しく変換されることを確認するようにして、処理を書いてみました。

z.c

c

1#include <stdio.h> 2 3int main(void) 4{ 5 int a = 8; 6 int kazu[10][5] = { 7 {1, 2, 1, 2, 1}, 8 {1, 1, 2, 1, 1}, 9 {1, 1, 1, 2, 2}, 10 {2, 1, 1, 1, 2}, 11 {2, 2, 1, 1, 1}, 12 {2, 1, 1, 1, 1}, 13 {1, 1, 1, 1, 2}, 14 {1, 1, 1, 1, 1} 15 }; 16 17 // 変換前の表示 18 for (int i = 0; i < a; i++) { 19 for (int j = 0; j < 5; j++) { 20 printf("%d ", kazu[i][j]); 21 } 22 printf("\n"); 23 } 24 printf("\n"); 25 26 // 変換 27 for (int i = 0; i < a; i++) { 28 for (int j = 0; j < 5; j++) { 29 int len = 1; 30 for (int d = 1; j + d < 5; d++, len++) { 31 if (kazu[i][j] != kazu[i][j + d]) { 32 break; 33 } 34 } 35 36 if (len > 2) { 37 for (int d = 0; d < len; d++) { 38 kazu[i][j + d] = 0; 39 } 40 } 41 } 42 } 43 44 // 変換結果の表示 45 for (int i = 0; i < a; i++) { 46 for (int j = 0; j < 5; j++) { 47 printf("%d ", kazu[i][j]); 48 } 49 printf("\n"); 50 } 51 return 0; 52}

実行例
イメージ説明

投稿2018/12/15 00:38

編集2018/12/15 01:38
katoy

総合スコア22324

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

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

0

ベストアンサー

色々と方法はあるんでしょうが、、、
2次元でなくても確認できるんで、只の配列 kazu[5] にデータがあるとすると、

C

1 n = kazu[0]; 2 for (i = 1; i < 3; i++) { 3 if ((n == kazu[i]) && (n == kazu[i+1])) { 4 kazu[i - 1] = 0; kazu[i++] = 0; kazu[i++] = 0; 5 while ((i < 5) && (n == kazu[i])) kazu[i++] = 0; 6 break; 7 } else { 8 n = kazu[i]; 9 } 10 }

こんなんであり?

元のコードは、4まで比較していますが、最後の2つは必要無し。
for(c=1;kazu[i][j]==kazu[i][j+c];c++){ も無理あり。
int kazu[a][5]; aが変数で通るコンパイラは多くないと思うのですが、 (VS 2017の Cは、エラー)
と、ほとんど書換え。その他は考えてください。

投稿2018/12/13 14:15

pepperleaf

総合スコア6383

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問