###質問
ランレングス法を使って5つのpgm形式の画像を圧縮をしたいのですが、どのようにしてプログラムを書けばよいのかわかりません。前にそのランレングス法を使って,、10個の整数をキーボードから入力し、同じ整数が何回連続で入力されたかを出力するプログラムを作りました。それを少し書き換えるだけで出来ると言われたのですが、いまいちどのように書き換えたらいいのかわかりません。
前に作ったプログラム
c
1#include <stdio.h> 2int main(void){ 3 int a, b, i, cnt; 4 5 scanf("%d", &a); 6 7 b = a; 8 cnt = 1; 9 10 for(i = 2; i <= 9; i++){ 11 scanf("%d", &a); 12 if(a == b){ 13 cnt++; 14 } else { 15 printf("%d %d\n", b, cnt); 16 b = a; 17 cnt = 1; 18 } 19 } 20 21 scanf("%d", &a); 22 23 if(a == b) cnt++; 24 else cnt = 1; 25 26 printf("%d %d\n", a, cnt); 27 28 return 0; 29}
試したこと
実際に上記のプログラムを書き換えて、違うプログラムを作りました。
友達から聞いた話によると、fgetc(stdin)を入れないといけなかったようなので、追加しました。あとは書き換えただけなのですが、プログラミング初心者のため自信がないです。また、実際に画像の圧縮をした結果、5つの画像データのうち3つはサイズが小さくなったのですが、2つはサイズが大きくなってしまいました。その原因は何なのか、またこれ以外に効率の良い方法があれば教えていただきたいです。
c
1#include <stdio.h> 2int main(void){ 3 int a, b, c, d, i, x, y, cnt; 4 5 fgetc(stdin); 6 fgetc(stdin); 7 fgetc(stdin); 8 9 scanf("%d", &a); 10 scanf("%d", &b); 11 scanf("%d", &c); 12 13 d = a * b; 14 15 scanf("%d", &x); 16 y = x; 17 cnt = 1; 18 19 for(i = 2; i <= d; i++){ 20 scanf("%d", &x); 21 if(x == y){ 22 cnt++; 23 } else { 24 printf("%d %d\n", y, cnt); 25 y = x; 26 cnt = 1; 27 } 28 } 29 30 scanf("%d", &x); 31 if(x == y) cnt++; 32 else cnt = 1; 33 34 printf("%d %d\n", x, cnt); 35 36 return 0; 37}
補足情報(FW/ツールのバージョンなど)
お二人の回答者様のご意見により、内容を書き換えさせていただきました。
あなたの回答
tips
プレビュー