C言語初心者の大学1年生です。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
unittk501st

C言語初心者の大学1年生です。

#1

投稿記事 by unittk501st » 7年前

C言語初心者の大学1年生です。これらの課題に全く手が付けられなくてとても困っています。どなたかご教示ください。宜しくお願いします。

(引用開始)
課題1
課題内容: 指定のファイルを読み込み 左右反転の処理をしてからPPMのヘッダをつけて出力するプログラムを作りなさい

ヒント
画像を読み込む/書き込む用の関数が作るといいかも
画像を取り扱うための構造体を使うといいかも

ファイルのサイズは 384x512 である
入力ファイル名を abbey_road.txt, 出力ファイル名を out.ppm とすること
添付ファイル: abbey_road.txt
提出期限: 8/7/23:59

課題2
課題内容: 以下の整数の配列変数が使っているメモリを後ろから1Byteずつ読み出しchar型として出力しなさい.

a[0] = -1611678591;
a[1] = -2120752255;
a[2] = -478042141;
a[3] = -1931040872;
a[4] = -1766661246;
a[5] = -478049561;

実行(出力)する端末はUTF-8に設定すること.
大学のLinuxであれば問題ない(はず)
提出期限: 8/7/23:59
(引用終了)

以上です。宜しくお願いします。

jay
記事: 314
登録日時: 9年前
住所: 大阪市
連絡を取る:

Re: C言語初心者の大学1年生です。

#2

投稿記事 by jay » 7年前

フォーラムルールは読みましたか?

この掲示板では宿題の質問はOKですが、全部を丸投げするのはNGになっています
質問するのであれば
・どこまで理解できているのか
・課題はどこまで出来ているのか
・具体的に(課題の)どこが分からないのか

などなどルールに沿った形での質問をお願いします
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

unittk501st

Re: C言語初心者の大学1年生です。

#3

投稿記事 by unittk501st » 7年前

・どこまで理解できているのか
ー課題は全く理解できず、何を言ってるかがさっぱりわかりません。
・課題はどこまで出来ているのか
ーしたがって全く手をつけられていない状況です。
・具体的に(課題の)どこが分からないのか
ーまず問題文が理解できません。

丸一日かけて理解しようと試みましたが、この有様です。期日が迫っていて読み解いていく時間がありません。本当に困っています。どなたか助けていただけないでしょうか。

エクレかわああ

Re: C言語初心者の大学1年生です。

#4

投稿記事 by エクレかわああ » 7年前

(不適切な文章だったため、管理人が編集しました)

友達とかに聞くなどして少しぐらいは書いて下さい。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C言語初心者の大学1年生です。

#5

投稿記事 by softya(ソフト屋) » 7年前

エクレさん。フォーラムルールにあります通り穏便な会話をお願いします。

unittk501stさんは、どのあたりから出来ないか具体的な自己分析などもお願いします。
フォーラムルールを読まれましたか? テンプレートもありますのでご利用ください。
分かる部分とか補足できる部分とか無いのでしょうか?
特に課題1はそれ以前の講義・課題等を前提にしていると思われるのでPPMについて分かるだけの解説を行なってください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: C言語初心者の大学1年生です。

#6

投稿記事 by Dixq (管理人) » 7年前

とりあえず「何も分からない」と言われてしまっては、どのように回答すればよいか分かりません。

課題1と2だと2の方が楽そうなので、まず2をやってみましょう。

課題2はポインタの理解が必要ですね。
課題のままでは少し難しいので、少し簡単な問題に置き換えてみます。

問題1_1.
const static int LEN = 8*2+1;
char str[LEN]="お疲れ様でした!";
で格納されたstrの文字列をchar型のポインタ*pを用いて1文字ずつ表示させましょう。

これなら出来ますか?
一応下に回答の一例を載せるので、まずはこれをみずにやってみてください。
その後、int型配列に入れたデータを*pに格納して表示、最終的に逆に表示すれば課題クリアになります。

その過程で分からないことがあれば、どこが分からないか都度聞いて下さい。

コード:

#include <stdio.h>
const static int LEN = 8*2+1;
int main(){
	char str[LEN]="お疲れ様でした!";
	char *p = (char *)&str[0];
	for(int i=0; i<LEN; i++){
		printf("%c",*p);
		p++;
	}
	return 0;
}

たかぎ
記事: 328
登録日時: 9年前
住所: 大阪
連絡を取る:

Re: C言語初心者の大学1年生です。

#7

投稿記事 by たかぎ » 7年前

unittk501st さんが書きました:・どこまで理解できているのか
ー課題は全く理解できず、何を言ってるかがさっぱりわかりません。
もしかして、外国人留学生か何かで、日本語が不自由なのでしょうか?
そうでなければ、「全く」理解できないということはないはずです。
(日本語で文章も書けているようですし)

「全く」理解できないのでなければ、どこまで理解できているのかを書くことは可能なはずです。

unittk501st

Re: C言語初心者の大学1年生です。

#8

投稿記事 by unittk501st » 7年前

お恥ずかしい話ですが、授業内の課題は配布資料の丸写しで解けてしまうものでしたので、きちんとした理解に至っていないのが現状です。printfもまだ理解できていないレベルです。復習を怠った自分に責任があることは重々承知のうえで投稿させていただきました。ですが、いまから総復習をするのには時間が明らかに足りません。そこで皆さんに助けていただきたいのです。これは嘘ではなく本当に理解力がないがために手が付けられないんです。こんな無力な私に救いの手を差し伸べて下さる方はいらっしゃいませんか。宜しくお願いします。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: C言語初心者の大学1年生です。

#9

投稿記事 by Dixq (管理人) » 7年前

> 本当に理解力がないがために手が付けられないんです

printfの理解もできていないということですが、画面に文字を表示するだけなら出来ますよね?
もしそれすらできないのであれば、参考書なりネットで入門サイトを調べるなりして「hello world」を表示させる位数時間あれば出来るはずです。
それが出来ないのであれば、理解力がないのではなく、プログラムを学ぶ気が無く、誰か答えを教えてくれる人がいればラッキーと捉えていると思われても仕方ないと思います。
また、printfすら分からないようでは、答えを教える以外にアドバイスのしようがありません。
締切までに回答者さん達の知恵を借りながら、少しでも学習してみましょう。

"hello world"は入門者が最初にプログラムを勉強する時に使うサンプルとして有名です。
http://dixq.net/vcpp.html
こちらを見ればhello worldは出来るでしょう。
書いてあることをそのままやればいいだけなので、「できない」ということはないはずです。
(VC++のバージョンは説明より新しくなってるかもしれませんが)

金銭的な都合で参考書が買えないのであれば、ネットでいくらでも学べます。
http://www.google.co.jp/search?q=C%E8%A ... 5%E9%96%80

では問題を変えます。

問題0_1.
char str[LEN]="お疲れ様でした!";
で格納されたstrの文字列をprintfで表示させましょう。

これなら解けますか?
それから、回答者がunittk501stさんに聞いたことはなるべく全て答えるようにして下さい。
そうすればスムーズにやり取りができるでしょう。

unittk501st

Re: C言語初心者の大学1年生です。

#10

投稿記事 by unittk501st » 7年前

すみません、printfではなくscanfの間違いでした。どちらにしろ初歩的なレベルにも達していないので2日のうちにconst,statisticなどを理解するのは無理だと感じています。

unittk501st

Re: C言語初心者の大学1年生です。

#11

投稿記事 by unittk501st » 7年前

わかりました。図書館で参考書を借りて調べながらやってみることにします。ですが、手当たり次第に最初から読んでいくと時間が掛かってしまうので、お手数ですが課題に必要な項目を教えて頂けないでしょうか。宜しくお願いします。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: C言語初心者の大学1年生です。

#12

投稿記事 by Dixq (管理人) » 7年前

図書館よりネットの方が手軽で早いですよ。
constやstaticはしらなくても解けますが、検索すればすぐ分かるかと思います。

学ぶ内容ですが、まずは質問の問題文が答えられるようにすることを目標にしてはいかがでしょうか。

※日中はあまりレスできませんが悪しからず…

エクレかわああ

Re: C言語初心者の大学1年生です。

#13

投稿記事 by エクレかわああ » 7年前

課題に必要な項目って言っても基礎すら知らないようなので、
課題1をクリアするのはほぼ絶望的ですね
課題1はここの掲示板でも答えられる人は少ないと思います。


課題2については、型、変数、配列、を理解してないと厳しいでしょうね
メモリとか配列って言葉を聞いて頭が真っ白になるならほぼアウトです。
その辺の単語を死に物狂いで調べて頑張ってください


他人に回答を聞いてそのままコピペして提出なんてしてたらどうせまた後で苦しくなるだけですよ
また丸投げされたら迷惑です。
提出できなくてもそれは自分が悪いんだから、反省して死に物狂いで勉強して次の課題にまで備えればいいと思います。
それも経験です。

unittk501st

Re: C言語初心者の大学1年生です。

#14

投稿記事 by unittk501st » 7年前

アドバイスありがとうございます。
Dixq (管理人) さんが書きました:まずは質問の問題文が答えられるようにすることを目標にしてはいかがでしょうか。
「質問の問題文」とありますが、具体的に何のことを言っているのですか?私にはこの日本語が理解し難いので解説お願いします。

エクレかわああ

Re: C言語初心者の大学1年生です。

#15

投稿記事 by エクレかわああ » 7年前

Dixq (管理人) さんが書きました: では問題を変えます。

問題0_1.
char str[LEN]="お疲れ様でした!";
で格納されたstrの文字列をprintfで表示させましょう。

これなら解けますか?
それから、回答者がunittk501stさんに聞いたことはなるべく全て答えるようにして下さい。
そうすればスムーズにやり取りができるでしょう。
↑このことでしょう。
質問にはなるべく全て答えるようにしてくださいって書いてるのに全部読んでないからそうなるんです。

non
記事: 1097
登録日時: 9年前

Re: C言語初心者の大学1年生です。

#16

投稿記事 by non » 7年前

unittk501st さんが書きました:「質問の問題文」とありますが、具体的に何のことを言っているのですか?私にはこの日本語が理解し難いので解説お願いします。
DixqさんのNo.6に書かれている問題だと思います。

「追記」
だぶった。
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C言語初心者の大学1年生です。

#17

投稿記事 by softya(ソフト屋) » 7年前

課題1に関しては下記の画像フォーマットだと思いますが、たぶんP3形式でしょう。ちゃんとした説明が無いので何とも言えませんが。
「PNM (画像フォーマット) - Wikipedia」
http://ja.wikipedia.org/wiki/PNM_(%E7%9 ... %E3%83%88)
ここは、unittk501st さんがちゃんと説明しないと前進しない部分ですね。

とりあえずC言語に関しては、こちらを参考にしてください。
「苦しんで覚えるC言語」 誤記など色々と問題はありますが読みやすいと思います。
http://9cguide.appspot.com/

【補足】
最終的な問題は、No: 9の最後の方に書かれているものだと思います。
まだunittk501st さんにはC言語で1つも答えてもらっていない状況です。

こんな状態になりたくなかったら今勉強するべきだと思いますよ。
情報処理関係の学科なら避けて通れませんからね。
「C言語プログラミングを楽しむ方法ないですか? - Yahoo!知恵袋」
http://detail.chiebukuro.yahoo.co.jp/qa ... 1491841879
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

unittk501st

Re: C言語初心者の大学1年生です。

#18

投稿記事 by unittk501st » 7年前

コンパイルは通るのですが実行してa,b,cの数値を入力すると以下のようなエラーが表示されて先に進めません。どこが間違っているか教えてください。宜しくお願いします。

Debug Error!
Run-Time Check Failure #3 - The variable 'max' is being used without being initialized.

コード:

#include <stdio.h>
int main(void){
	int a, b, c, max;
	printf("Input number a:\n");
	scanf("%d", &a);
	printf("Input number b:\n");
	scanf("%d", &b);
	printf("Input number c:\n");
	scanf("%d", &c);

	if(a > b){
		max == a;
	}
	else{
		max == b;
	}
	
	if(max < c){
		max == c;
	}
	
	printf("The biggest number is %d\n", max);
	return 0;
}

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: C言語初心者の大学1年生です。

#19

投稿記事 by みけCAT » 7年前

C言語の代入演算子は==ではなく=です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C言語初心者の大学1年生です。

#20

投稿記事 by softya(ソフト屋) » 7年前

unittk501st さんが書きました:コンパイルは通るのですが実行してa,b,cの数値を入力すると以下のようなエラーが表示されて先に進めません。どこが間違っているか教えてください。宜しくお願いします。

Debug Error!
Run-Time Check Failure #3 - The variable 'max' is being used without being initialized.

コード:

#include <stdio.h>
int main(void){
	int a, b, c, max;
	printf("Input number a:\n");
	scanf("%d", &a);
	printf("Input number b:\n");
	scanf("%d", &b);
	printf("Input number c:\n");
	scanf("%d", &c);

	if(a > b){
		max == a;
	}
	else{
		max == b;
	}
	
	if(max < c){
		max == c;
	}
	
	printf("The biggest number is %d\n", max);
	return 0;
}
なぜ、みなさんのアドバイスを無視されるのでしょう?
と言うか、何処から出てきた問題なのでしょうか? 話の因果関係が掴めません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

unittk501st

Re: C言語初心者の大学1年生です。

#21

投稿記事 by unittk501st » 7年前

ご指摘ありがとうございます。=に変えたらできました。
==は等号でしたね。
失礼致しました。

雨ガエル

Re: C言語初心者の大学1年生です。

#22

投稿記事 by 雨ガエル » 7年前

この場合だと、
max == a; ではなく、
max=a; だと思います。

他の2箇所も同じです。
max==aはmaxとaが等しかったら、という条件の文です。
max=aはmaxにaの値を代入する文です。

unittk501st

Re: C言語初心者の大学1年生です。

#23

投稿記事 by unittk501st » 7年前

softya(ソフト屋) さんが書きました: なぜ、みなさんのアドバイスを無視されるのでしょう?
と言うか、何処から出てきた問題なのでしょうか? 話の因果関係が掴めません。
皆様のご要望にお応えするため、最初から復習している最中です。ですので、課題の内容とはだいぶかけ離れてしまいましたがその点をご容赦下さい。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C言語初心者の大学1年生です。

#24

投稿記事 by softya(ソフト屋) » 7年前

unittk501st さんが書きました:
softya(ソフト屋) さんが書きました: なぜ、みなさんのアドバイスを無視されるのでしょう?
と言うか、何処から出てきた問題なのでしょうか? 話の因果関係が掴めません。
皆様のご要望にお応えするため、最初から復習している最中です。ですので、課題の内容とはだいぶかけ離れてしまいましたがその点をご容赦下さい。
それを書いて頂きたかったのです。
話が急に飛び過ぎなので誰か出した問題かと思って掲示板を読みなおしてしまいました。

それとDixqさんのNo.9にある問題を答えることはさほどの手間がかかりませんので早いうちにお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: C言語初心者の大学1年生です。

#25

投稿記事 by Dixq (管理人) » 7年前

締め切りは明日の夜でしたね。
着実にそれまでにやっていきましょう。
段階を経て課題がクリアできるように、課題を分解してみました。
順々にやっていけば完成するはずです。


問題0_1.
char str[LEN]="お疲れ様!";
で格納されたstrの文字列をprintfで表示させましょう。

問題1_1.
int LEN = 5*2+1;
char str[LEN]="お疲れ様!";
で格納されたstrの文字列をchar型のポインタ*pを用いて1文字ずつ表示させましょう。

問題1_2.
int a[6];
a[0] = -1611678591;
a[1] = -2120752255;
a[2] = -478042141;
a[3] = -1931040872;
a[4] = -1766661246;
a[5] = -478049561;
で格納されたaの先頭アドレスのポインタを
char *p;
の変数pに格納し、先頭から終わりまで表示しましょう(int型は4バイトとします)

問題1_3.
先の問題の出力を後ろから前に向かって行いましょう。

***** ここまでできたら課題2クリア*****

問題1_4.
fprintfを使ってprintfの内容をファイル出力しましょう。

*********************************************************************

問題2_1.
http://dixq.net/BBS/P3.txt
こちらのファイルをダウンロードし、fopenでファイルを開き、
ファイルの内容を一字ずつ表示しましょう。

問題2_2.
P3.txtの内容をfscanfやfgetsを利用して(決め打ちでいいので)変数に一度値をした後、変数の中身を表示させましょう。
但し、ppmのファイルの内容を理解し、
int width;//幅
int height;//高さ
int maxValue;//最大輝度
int color[3];//RGBの値(1ピクセルごとに捨てる)
の変数にそれぞれ適した値が入るようにすること。

問題2_3.
int color[width][3];
と同じ配列の長さになるようにmallocで配列を確保し、一行ずつ(widthのピクセルずつ)colorの値を格納して表示しましょう。

問題2_4.
ヘッダ部はファイルから読み取った通りにファイル出力(P3.ppm)し、ピクセル部分は問題2_3で格納したピクセルを後ろから出力して、全ピクセルを左右反転させましょう。

問題2_5.
読み込むファイルを課題の添付ファイルにし、ヘッダを付けて、問題2_4の要領で画像部分を出力しましょう。

***** ここまでできたら課題1クリア*****

ppmファイルはGIMP
http://www.geocities.jp/gimproject2/dow ... nload.html
で確認できます。
http://dixq.net/BBS/P3.ppm
これが左右反転していれば成功です。


自分で調べた上で、分からないことがあれば聞いて下さい。
また、上で言いましたが

> それから、回答者がunittk501stさんに聞いたことはなるべく全て答えるようにして下さい

は大事なことなので、なるべく気を付けて返答をお願いします。
softyaさんも仰っていますが、情報が足りないので、私にもこの課題がこれで正解になるのか分かりません。

赤鬼

Re: C言語初心者の大学1年生です。

#26

投稿記事 by 赤鬼 » 7年前

あー、1はちょっと大変ですね。
txtの中身が分からない以上完璧にとは言いようがありませんが。
2が出来たら参考にしてみてください。

ppmファイルの構造は
一番上にヘッダと呼ばれるものが来ます。
ヘッダとは画像ファイルの情報が入っているものと思ってください。
で、ファイルの中身はどうなっているかというと

[ヘッダ]
P6
改行コード
画像の幅(テキスト値を16進数に直した値)
セパレータ(まあ、改行でおkだと思います)
画像の高さ
改行コード
最大輝度
改行コード
[画像情報]
(R,G,B)の順番で縦*横のピクセル数が詰まっています。

つまり、画像情報のみを受け取って書き込むということは
先頭にP6を書く(16進数だと50、36)、改行コード(16進数で0A)、幅、改行コード、縦、改行コード、255(1バイトですので)、改行コード,
反転した画像情報 (R,G,B)*幅*高さを書き込む必要があります。

また、受け取るファイルは画像ファイルですので、くれぐれもテキストファイルで開かずバイナリファイルで開いてください。
書き込む場合は全部バイナリで書くと良いと思います。
unittk501st さんが書きました: ヒント
画像を読み込む/書き込む用の関数が作るといいかも
画像を取り扱うための構造体を使うといいかも
画像を読み込む/書き込む用の関数を作ると良いかもじゃなくてほぼ必須です。
見辛いしmainに書かれたら発狂ものだと思います。

構造体に関してですが。

コード:

struct IMAGE{
int width;
int height;
unsigned char *pix;//画像情報はunsigned char型の配列[384][512][3](幅)(高さ)(R,G,B)の3次元配列にする(まあ、自分なら1次元の動的配列にしますけどね)。普通なら動的確保でしょうが分からないでしょうし。多分先生もおまけしてくれるはず。
};
こんな感じの構造体をお勧めします。

後ろからは2をやれば多分わかると思うので、がんばってください。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: C言語初心者の大学1年生です。

#27

投稿記事 by Dixq (管理人) » 7年前

いきなり0から書くのは難しいかもしれないのでサンプルを用意してみました。
もちろんこの通りでなくても良いですが、ファイル
http://dixq.net/BBS/sample.txt
の内容を整数型変数に値を格納して表示するサンプルを作りましたので参考程度にどうぞ。

コード:

#include <stdio.h>

int main(){
	int a,b;
	FILE *fp = fopen("P3.txt", "r");//ファイルを開く
	while(fgetc(fp)!='\n'){}//1行読み飛ばし
	fscanf(fp, "%d %d", &a, &b);//空白で区切られた整数を2つ読み取る
	printf("%d %d\n", a, b);//表示
	fscanf(fp, "%d", &a);//整数を一つ読み取る
	printf("%d\n", a);//表示
	fclose(fp);//ファイルを閉じる
	return 0;
}

unittk501st

Re: C言語初心者の大学1年生です。

#28

投稿記事 by unittk501st » 7年前

皆様からのたくさんのアドバイスに感謝します。これなら私にも課題を読み解いていけそうです。
今日一日かけてやっと配列の手前まで理解することが出来ましたが、時間がないので今日は徹夜で頑張ることにします。

[quote="赤鬼"]あー、1はちょっと大変ですね。
txtの中身が分からない以上完璧にとは言いようがありませんが。
2が出来たら参考にしてみてください。
quote]
とありましたので、念のため課題1の添付ファイルを書いておこうと思いましたが、

記事のメッセージ字数が 2031886 字です。入力可能なメッセージの最大字数は 60000 字です。

となってしまい送信できませんでした。
どうやって送ればいいですか。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: C言語初心者の大学1年生です。

#29

投稿記事 by Dixq (管理人) » 7年前

> 2031886 字

200万文字ですか?ちょっと投稿するには多すぎませんか・・。
上限の6万文字投稿されても読み切れないです。
何にそんなに文字数が必要なのか分かりませんが、ファイルを添付して投稿すればよいでしょう。
訂正:あ、ppmファイルの内容ですか。
zipファイル添付等は画面右下の「ユーザー登録」から登録して頂ければ可能になります。(その他使える文字が増えたり日記が書けたり、チャットができたりするようになります)
# もし配布資料をそのままアップロードしようとしているのであれば著作権侵害にご注意ください。

> 今日一日かけてやっと配列の手前まで理解することが出来ましたが、時間がないので今日は徹夜で頑張ることにします。

1日や2日でC言語を理解するのは大変でしょうけど頑張って下さいね。
私たち回答者は答えを知っているので、答えを書くのは簡単なのですが(私の問題文 "お疲れ様でした!" の文字列の意味が最後分かると思います)
それでもこんなに回りくどくみなさん回答しているのは少しでもunittk501stさんの理解に繋げたいと思っているからです。

現在回答者として偉そうに言っている私ですが、学生の頃はunittk501stさんが仰るよりも酷い講義の受け方だったかもしれません。
授業は聞かず、宿題は人のコピーで、挙句の果てに単位を落とす・・。しかしそんな私でもある時プログラミングの楽しさを知ってから人生を変えることができました。
私としても似たような経験をしているからこそ力になりたい気持ちです。
頑張って下さいね。

※ゲームとか作りたくなったら言って下さい←

unittk501st
記事: 11
登録日時: 7年前

Re: C言語初心者の大学1年生です。

#30

投稿記事 by unittk501st » 7年前

利用登録をさせていただいたのですが、添付する方法がわかりません。どうしたら良いでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C言語初心者の大学1年生です。

#31

投稿記事 by softya(ソフト屋) » 7年前

unittk501st さんが書きました:利用登録をさせていただいたのですが、添付する方法がわかりません。どうしたら良いでしょうか。
投稿時に下の方にファイル添付と書かれたタグがあるので、そこで「ファイル追加」で添付できます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: C言語初心者の大学1年生です。

#32

投稿記事 by Dixq (管理人) » 7年前

添付画像を参照下さい。
「返信」
そして
「ファイル添付」タブから「参照」で添付するファイルを選ぶことが出来ます。

ちなみに添付ファイルはデフォルトで小さいですが、画像上部をクリックすると拡大します。
添付ファイル
temp.png
temp.png (30.1 KiB) 閲覧数: 484 回

unittk501st
記事: 11
登録日時: 7年前

Re: C言語初心者の大学1年生です。

#33

投稿記事 by unittk501st » 7年前

ありがとうございます。見つかりました。
それでは課題1の添付ファイルをZIP形式で添付しておきます。
添付ファイル
abbey_road.zip
(572.24 KiB) ダウンロード数: 28 回

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C言語初心者の大学1年生です。

#34

投稿記事 by softya(ソフト屋) » 7年前

赤鬼 さんが書きました:あー、1はちょっと大変ですね。
txtの中身が分からない以上完璧にとは言いようがありませんが。
2が出来たら参考にしてみてください。

ppmファイルの構造は
一番上にヘッダと呼ばれるものが来ます。
ヘッダとは画像ファイルの情報が入っているものと思ってください。
で、ファイルの中身はどうなっているかというと

[ヘッダ]
P6
改行コード
画像の幅(テキスト値を16進数に直した値)
セパレータ(まあ、改行でおkだと思います)
画像の高さ
改行コード
最大輝度
改行コード
[画像情報]
(R,G,B)の順番で縦*横のピクセル数が詰まっています。

つまり、画像情報のみを受け取って書き込むということは
先頭にP6を書く(16進数だと50、36)、改行コード(16進数で0A)、幅、改行コード、縦、改行コード、255(1バイトですので)、改行コード,
反転した画像情報 (R,G,B)*幅*高さを書き込む必要があります。

また、受け取るファイルは画像ファイルですので、くれぐれもテキストファイルで開かずバイナリファイルで開いてください。
書き込む場合は全部バイナリで書くと良いと思います。
unittk501st さんが書きました: ヒント
画像を読み込む/書き込む用の関数が作るといいかも
画像を取り扱うための構造体を使うといいかも
画像を読み込む/書き込む用の関数を作ると良いかもじゃなくてほぼ必須です。
見辛いしmainに書かれたら発狂ものだと思います。

構造体に関してですが。

コード:

struct IMAGE{
int width;
int height;
unsigned char *pix;//画像情報はunsigned char型の配列[384][512][3](幅)(高さ)(R,G,B)の3次元配列にする(まあ、自分なら1次元の動的配列にしますけどね)。普通なら動的確保でしょうが分からないでしょうし。多分先生もおまけしてくれるはず。
};
こんな感じの構造体をお勧めします。

後ろからは2をやれば多分わかると思うので、がんばってください。
今気づきましてが、赤鬼さんのPPMヘッダはP6(バイナリ形式)なのでマズイです。
「PNM (画像フォーマット) - Wikipedia」
http://ja.wikipedia.org/wiki/PNM_(%E7%9 ... %E3%83%88)
処理すべきはP3のテキスト形式だと私は思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Hiragi(GKUTH)
記事: 167
登録日時: 9年前
住所: 大阪府
連絡を取る:

Re: C言語初心者の大学1年生です。

#35

投稿記事 by Hiragi(GKUTH) » 7年前

Dixq (管理人) さんが書きました:とりあえず「何も分からない」と言われてしまっては、どのように回答すればよいか分かりません。

課題1と2だと2の方が楽そうなので、まず2をやってみましょう。

課題2はポインタの理解が必要ですね。
課題のままでは少し難しいので、少し簡単な問題に置き換えてみます。

問題1_1.
const static int LEN = 8*2+1;
char str[LEN]="お疲れ様でした!";
で格納されたstrの文字列をchar型のポインタ*pを用いて1文字ずつ表示させましょう。

これなら出来ますか?
一応下に回答の一例を載せるので、まずはこれをみずにやってみてください。
その後、int型配列に入れたデータを*pに格納して表示、最終的に逆に表示すれば課題クリアになります。

その過程で分からないことがあれば、どこが分からないか都度聞いて下さい。

コード:

#include <stdio.h>
const static int LEN = 8*2+1;
int main(){
	char str[LEN]="お疲れ様でした!";
	char *p = (char *)&str[0];
	for(int i=0; i<LEN; i++){
		printf("%c",*p);
		p++;
	}
	return 0;
}

ちょっときになったので、レスしますが
使う言語はCなのか?それともC++なのか?
使う言語が明確に表記されていませんが、タイトルが「C言語初心者」となっていますので、100%C言語にするならば、

コード:

const static int LEN = 8*2+1;
ではなくて、

コード:

#define LEN = 8*2+1;
のほうがいいのでは?
だいがくせい!

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: C言語初心者の大学1年生です。

#36

投稿記事 by Dixq (管理人) » 7年前

> グクス君

#define LEN = 8*2+1;

はコンパイルが通らないでしょう。仮に

#define LEN 8*2+1

だとしても

LEN*2

と書いたときに期待した動作にならないのでやめた方がいいと思います。

printf("%d",LEN*2);

を表示してみれば意味が分かると思います。
const int LEN = 1;
と書いているのは型を明確にするためです。
また、constもstaticもC言語で使用可能です。

> unittk501stさん

課題の期限は今日中でしたよね?
もう残り時間が少ないと思いますが、まだ一つも回答を投稿してもらっていないと思います。
進捗はいかがですか?

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: C言語初心者の大学1年生です。

#37

投稿記事 by Dixq (管理人) » 7年前

取り掛かりやすいように少し書き出しを書いておきますので参考にして下さい。
ぐちゃぐちゃなプログラムでもいいのでとにかく書いてみましょう。

下は、提示されたファイルからrgbの値を100ピクセル分読み込んでは表示するプログラムです。

コード:

#include<stdio.h>
int main(){
	FILE *fp = fopen("abbey_road.txt","r");
	int red, green, blue;
	for(int i=0; i<100; i++){
		fscanf(fp, "%d %d %d ", &red, &green, &blue);
		printf("%d, %d, %d\n", red, green, blue);
	}
	fclose(fp);
	return 0;
}
ちなみに、明日大事な用事があるので、今日は早く寝ます。。

unittk501st
記事: 11
登録日時: 7年前

Re: C言語初心者の大学1年生です。

#38

投稿記事 by unittk501st » 7年前

配列の課題は何とかできました。皆様のご指導のお陰です。

もう片方は現在取り掛かっております。

unittk501st
記事: 11
登録日時: 7年前

Re: C言語初心者の大学1年生です。

#39

投稿記事 by unittk501st » 7年前

たった今課題1、2共に完成し、無事に提出できました。
これも何もすべて皆様のお陰です。
いままで皆様がアドバイスをくださったこと、勇気づけて下さったことに心より感謝致します。
本当にありがとうございました。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: C言語初心者の大学1年生です。

#40

投稿記事 by beatle » 7年前

このフォーラムのルールですが、解決した場合は用いた方法やソースコードをお示しいただくことになっております。
後からこの掲示板に来た人の参考にするためですのでご協力お願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る