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

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

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

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

Q&A

0回答

4519閲覧

c言語 ランレングス法の使い方がわかりません

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2019/11/15 16:16

編集2019/11/16 04:06

###質問
ランレングス法を使って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/ツールのバージョンなど)

お二人の回答者様のご意見により、内容を書き換えさせていただきました。

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

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

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

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

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

dodox86

2019/11/15 19:05 編集

> 少し書き換えるだけで出来ると言われた ずいぶん雑なアドバイスに思いますが、ご提示のコードを見るかぎりとてもそうは思えません。(あるいはその言った方にとっては簡単だったのかも?)少なくとも、例えば画像ファイルのサイズが1000バイトであったとき、 for(i = 2; i <= 9; i++){ のループでその全1000バイトを処理できるかどうか、考えてみましょう。ランレングス(RLE)は広く知られた圧縮方式ですが、その理解を土台に、ファイルアクセスの方法や同じデータが極端に長く続く場合も踏まえ、コードを書き直す必要があると思います。(回答はすみませんが現段階では控えます)
ttyp03

2019/11/16 00:29

「試したこと」のコードを提示してください。現物がないと何もアドバイスできません。
ttyp03

2019/11/16 04:04

画像を読み込む処理がないようですが。。。まずはそこから?読み込み方もわからないってことでしょうか?
退会済みユーザー

退会済みユーザー

2019/11/16 04:10

画像のファイルは事前に入手しており、リダイレクトを使って入力、出力をしてくださいと言われました。 画像を読み込む処理というのは、授業では習っておりません。
Zuishin

2019/11/16 04:15

画像と言ってもテキストファイルなので、標準入力から読み込めます。標準入力の読み方は習っているはずです。
Zuishin

2019/11/16 04:16

習っているはずというのは、実際質問のコードで標準入力が使われているので。
退会済みユーザー

退会済みユーザー

2019/11/16 04:37

プログラムを実行する時に、 ./encode.exe<画像データ名>圧縮データの出力 をしろと言われているのですが、それはまた違うのでしょうか。 stdinの話でしたら、これを使って読み捨ててと言われただけで、授業でしっかり習っておりません。
Zuishin

2019/11/16 04:42

読み捨てるというのは非常に考えにくいことですが、もしそうなら質問も回答も変わります。恐らく聞き違いだと思いますが、友達にでも確認してきてください。
退会済みユーザー

退会済みユーザー

2019/11/16 04:46

プリントがあるので、そこに書いてあることを簡単に言いますと、pgm形式のテキストファイルなので、1行目は識別記号P2になる。この1行目を読み捨てるためにfgetc(stdin)を3回書くのだそうです。
Zuishin

2019/11/16 04:47

読み捨てているのは識別記号だけです。他は読み捨てません。
退会済みユーザー

退会済みユーザー

2019/11/16 05:02

識別記号以外も読み捨てると言ったつもりはなかったのですが、、 伝わりにくい言い方になってしまい申し訳ございません。 識別記号を読み捨てるためにfgetc(stdin)を使うと言われております。
退会済みユーザー

退会済みユーザー

2019/11/16 05:04

では、プログラムを実行する際に ./encode.exe<test.pgm>test.rlen という風に実行しろとプリントに書いてあるのですが、それはデータの読み込みにはなっていないのですか?
Zuishin

2019/11/16 05:15 編集

それを読み込むプログラムを作るのがあなたのすることで、質問に掲載されたプログラムでは読み込んでいる部分があります。 ですから、習っているはずです。
Zuishin

2019/11/16 05:14

自分の作った(はずの)プログラムが何をしているか全て説明できますか?
退会済みユーザー

退会済みユーザー

2019/11/16 05:40

./encode.exe < test.pgm(画像データ名)という実行により、画像データの内容を入力し、その内容を私の作ったプログラムで圧縮しているということにはなっていないのですか? 一応実行例のように打って実行し、データのサイズを確認すると、サイズが小さくなっていたのですが、、、 プログラムの内でも画像データのファイルを読み込むための文が必要ということでしょうか?
Zuishin

2019/11/16 05:52

説明できないということですか?
退会済みユーザー

退会済みユーザー

2019/11/16 06:08

完璧に説明することはできませんが、リダイレクトにより画像データのファイルを入力しているので、プログラム内で読み込む必要はないという風に私は考えているのですが、、、 また、画像データのファイルが5つあり、プログラム内で読み込むとなると5つ分のプログラムが必要になるのではないのですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問