話せば長くなるのですが大学でまだC言語を学んでおらず、ある講義でC言語の課題がでました。 プログラム?は一応完成させてありますがこれをどう実行すれば良いのか分かりません。実行の仕方を最初から最後まで教えていただける方を探しています。時間があればプログラムが正しいかも判定して頂きたいです。
本当によろしくお願いします。
よろしければこちらまで連絡お願いします。SkypeID sennyou1234 *反応が遅れる場合があります
C言語が分からない・・・
Re: C言語が分からない・・・
よろしければSkypeなど外部ではなく、この掲示板内で解決したいと思います。zerocy さんが書きました:よろしければこちらまで連絡お願いします。SkypeID sennyou1234 *反応が遅れる場合があります
その課題で実行の仕方などの説明は無かったのですか?zerocy さんが書きました:話せば長くなるのですが大学でまだC言語を学んでおらず、ある講義でC言語の課題がでました。
どうやって完成させたのですか?zerocy さんが書きました:プログラム?は一応完成させてありますがこれをどう実行すれば良いのか分かりません。実行の仕方を最初から最後まで教えていただける方を探しています。
多くの入門サイトでは実行の仕方の解説もあると思いますが、組み込みなど特殊な環境でしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C言語が分からない・・・
みけCATさん返信有難うございます。
このサイトを初めて利用するので、しっかり返信できているか不安ですが。
その課題で実行の仕方などの説明は無かったのですか?
すでにC言語を学んでいるという体で行われている講義なので実行に関する説明はありませんでした。
どうやって完成させたのですか?
多くの入門サイトでは実行の仕方の解説もあると思いますが、組み込みなど特殊な環境でしょうか?
先生からヒントというものを全員渡されており、それを元に調べながら作ってみました(正しくかけているかは不明です)
多くのサイトを見ました。コマンドプロンプトのところで躓いてしまいます。
このサイトを初めて利用するので、しっかり返信できているか不安ですが。
その課題で実行の仕方などの説明は無かったのですか?
すでにC言語を学んでいるという体で行われている講義なので実行に関する説明はありませんでした。
どうやって完成させたのですか?
多くの入門サイトでは実行の仕方の解説もあると思いますが、組み込みなど特殊な環境でしょうか?
先生からヒントというものを全員渡されており、それを元に調べながら作ってみました(正しくかけているかは不明です)
多くのサイトを見ました。コマンドプロンプトのところで躓いてしまいます。
Re: C言語が分からない・・・
>コマンドプロンプトのところで躓いてしまいます。
C言語を学ぶということと、どう実行するかは別の話です。
どういう環境で実行しようとしてるのかを聞いてるんだと思いますが。すくなくともOSぐらいは掲示してください。
>すでにC言語を学んでいるという体で行われている講義
C言語を学んでおらず、と最初に言ってますが、そんな人がなんでこの講義を取ってるのでしょう?
#アドバイスしようにも掲示されている内容が全然不足なので
#何もアドバイスできませんね。
#どういう課題なのか、またどういうサイトをまわったのか何も掲示がない。
C言語を学ぶということと、どう実行するかは別の話です。
どういう環境で実行しようとしてるのかを聞いてるんだと思いますが。すくなくともOSぐらいは掲示してください。
>すでにC言語を学んでいるという体で行われている講義
C言語を学んでおらず、と最初に言ってますが、そんな人がなんでこの講義を取ってるのでしょう?
#アドバイスしようにも掲示されている内容が全然不足なので
#何もアドバイスできませんね。
#どういう課題なのか、またどういうサイトをまわったのか何も掲示がない。
written by へにっくす
Re: C言語が分からない・・・
>C言語を学ぶということと、どう実行するかは別の話です。
どういう環境で実行しようとしてるのかを聞いてるんだと思いますが。すくなくともOSぐらいは掲示してください。
OSはWindows 7 home Premium です。
>C言語を学んでおらず、と最初に言ってますが、そんな人がなんでこの講義を取ってるのでしょう?
たしかにそういわれてしまえばそうなのですが、しかし冒頭に書いておりますが、「話せば長くなる」で察し手いただければ幸いです。ただならぬ理由があります。そこまで理由が知りたければ教えますが。
課題の内容
BMP形式のカラー画像を読み込んで二値画像を出力するプログラムを作成せよ。
私が書いたプログラム(メモ帳で描き、.cで保存してある)
#define WIDTH 640
#define HEIGHT 480
#include <stdio.h>
#include <stdlib.h>
typedef struct color {
unsigned char r;
unsigned char g;
unsigned char b;
} COLOR;
int main() {
int i, j;
COLOR data[WIDTH][HEIGHT];
COLOR outdata[WIDTH][HEIGHT];
FILE *fp;
FILE *out;
char header[54];
if ((fp = fopen("image.bmp", "rb")) == NULL) {
fprintf(stderr, "file open error");
exit(1);
}
if ((out = fopen("out.bmp", "wb")) == NULL) {
fprintf(stderr, "file open error");
exit(1);
}
fread(header, 1, 54, fp);
for (j = HEIGHT-1; j >= 0; j--) {
for (i = 0; i < WIDTH; i++) {
data[j].b = getc(fp);
data[j].g = getc(fp);
data[j].r = getc(fp);
}
}
fclose(fp);
unsigned char gray:
for (i = 0; i < WIDTH; i++) {
for (j = 0; j < HEIGHT; j++) {
gray = (data[j].r + data[j].g + data[j].g)/3;
outdata[j].r = gray;
outdata[j].g = gray;
outdata[j].b = gray;
}
}
unsigned char gray:
unsigned threshold = 127;
for (i = 0; i < WIDTH; i++) {
for (j = 0; j < HEIGHT; j++) {
gray = (data[j].r + data[i][j].g + data[i][j].g > (3*threshold) ? 255: 0);
outdata[i][j].r = gray;
outdata[i][j].g = gray;
outdata[i][j].b = gray;
}
}
fwrite(header, 1, 54, out);
for (j = HEIGHT-1; j >= 0; j--) {
for (i = 0; i < WIDTH; i++) {
fputc(outdata[i][j].b, out);
fputc(outdata[i][j].g, out);
fputc(outdata[i][j].r, out);
}
}
fclose(out);
return 0;
}
このプログラムはほとんど調べたり配布されたヒントを元にコピペしたり書いたりしたので、C言語を理解してかいているわけではありません。おそらく間違いだらけだと思います。
実行する際に参考にしたサイト
http://guppy.eng.kagawa-u.ac.jp/~kagawa ... rompt.html
宜しくお願いします。
どういう環境で実行しようとしてるのかを聞いてるんだと思いますが。すくなくともOSぐらいは掲示してください。
OSはWindows 7 home Premium です。
>C言語を学んでおらず、と最初に言ってますが、そんな人がなんでこの講義を取ってるのでしょう?
たしかにそういわれてしまえばそうなのですが、しかし冒頭に書いておりますが、「話せば長くなる」で察し手いただければ幸いです。ただならぬ理由があります。そこまで理由が知りたければ教えますが。
課題の内容
BMP形式のカラー画像を読み込んで二値画像を出力するプログラムを作成せよ。
私が書いたプログラム(メモ帳で描き、.cで保存してある)
#define WIDTH 640
#define HEIGHT 480
#include <stdio.h>
#include <stdlib.h>
typedef struct color {
unsigned char r;
unsigned char g;
unsigned char b;
} COLOR;
int main() {
int i, j;
COLOR data[WIDTH][HEIGHT];
COLOR outdata[WIDTH][HEIGHT];
FILE *fp;
FILE *out;
char header[54];
if ((fp = fopen("image.bmp", "rb")) == NULL) {
fprintf(stderr, "file open error");
exit(1);
}
if ((out = fopen("out.bmp", "wb")) == NULL) {
fprintf(stderr, "file open error");
exit(1);
}
fread(header, 1, 54, fp);
for (j = HEIGHT-1; j >= 0; j--) {
for (i = 0; i < WIDTH; i++) {
data[j].b = getc(fp);
data[j].g = getc(fp);
data[j].r = getc(fp);
}
}
fclose(fp);
unsigned char gray:
for (i = 0; i < WIDTH; i++) {
for (j = 0; j < HEIGHT; j++) {
gray = (data[j].r + data[j].g + data[j].g)/3;
outdata[j].r = gray;
outdata[j].g = gray;
outdata[j].b = gray;
}
}
unsigned char gray:
unsigned threshold = 127;
for (i = 0; i < WIDTH; i++) {
for (j = 0; j < HEIGHT; j++) {
gray = (data[j].r + data[i][j].g + data[i][j].g > (3*threshold) ? 255: 0);
outdata[i][j].r = gray;
outdata[i][j].g = gray;
outdata[i][j].b = gray;
}
}
fwrite(header, 1, 54, out);
for (j = HEIGHT-1; j >= 0; j--) {
for (i = 0; i < WIDTH; i++) {
fputc(outdata[i][j].b, out);
fputc(outdata[i][j].g, out);
fputc(outdata[i][j].r, out);
}
}
fclose(out);
return 0;
}
このプログラムはほとんど調べたり配布されたヒントを元にコピペしたり書いたりしたので、C言語を理解してかいているわけではありません。おそらく間違いだらけだと思います。
実行する際に参考にしたサイト
http://guppy.eng.kagawa-u.ac.jp/~kagawa ... rompt.html
宜しくお願いします。
Re: C言語が分からない・・・
フォーラムルールをよく読んで、プログラムの貼り付けには
codeタグを使うようにしてください。
さて、COLOR data[640][480]; は 900キロバイトです。
COLOR outdata[640][480] と合わせて、1メガバイトを超えます。
こんなに大きなメモリ領域を関数のローカルな自動変数として
確保することはできません。
関数の前に、グローバル変数として宣言するか、static をつけて
静的に確保する必要があります。
しかし、よく考えると、1ピクセル 3バイトを読み込んで、
白か黒に変換して書き出せばよいので、3バイトしか要りません。
また、4つの二重ループで、読み込み、変換1、変換2、書き込みを
行っていますが、変換2 で変換1 の outdata を上書きしているので
変換1 は無駄に終わっています。
ということで、次のように修正してみました。
ちゃんとしたプログラムにするには、fread や fgetc が正しく実行
されたかどうかのチェックが必要でしょう。
また、HEIGHT や WIDTH が header の中のものと一致するかのチェックも
あったほうが良いでしょう。
codeタグを使うようにしてください。
さて、COLOR data[640][480]; は 900キロバイトです。
COLOR outdata[640][480] と合わせて、1メガバイトを超えます。
こんなに大きなメモリ領域を関数のローカルな自動変数として
確保することはできません。
関数の前に、グローバル変数として宣言するか、static をつけて
静的に確保する必要があります。
しかし、よく考えると、1ピクセル 3バイトを読み込んで、
白か黒に変換して書き出せばよいので、3バイトしか要りません。
また、4つの二重ループで、読み込み、変換1、変換2、書き込みを
行っていますが、変換2 で変換1 の outdata を上書きしているので
変換1 は無駄に終わっています。
ということで、次のように修正してみました。
#include <stdio.h> // fopen, fclose, fgetc, fputc, fread, fwrite
#include <stdlib.h> // exit
#define WIDTH 640
#define HEIGHT 480
typedef struct color {
unsigned char r;
unsigned char g;
unsigned char b;
} COLOR;
int main()
{
int i, j;
FILE *fp;
FILE *out;
char header[54];
if ((fp = fopen("image.bmp", "rb")) == NULL) {
fprintf(stderr, "file open error");
exit(1);
}
if ((out = fopen("out.bmp", "wb")) == NULL) {
fprintf(stderr, "file open error");
exit(1);
}
fread(header, 1, 54, fp);
fwrite(header, 1, 54, out);
for (j = 0; j < HEIGHT; j++) {
for (i = 0; i < WIDTH; i++) {
const int threshold = 127;
int b = fgetc(fp), g = fgetc(fp), r = fgetc(fp);
int gray = (r + g + b > 3*threshold) ? 255: 0;
fputc(gray, out), fputc(gray, out), fputc(gray, out);
}
}
fclose(out);
fclose(fp);
return 0;
}
されたかどうかのチェックが必要でしょう。
また、HEIGHT や WIDTH が header の中のものと一致するかのチェックも
あったほうが良いでしょう。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: C言語が分からない・・・
windowsならVisual Studioを利用するのが一般的でしょう。
少し情報が古いですが、こちら参考になるかと思います。
http://dixq.net/vcpp.html
今はVisualStudio2017の「Community 2017」と言うものを利用します。
リンク先とインストール方法は違うものの手順通り進めて行けばいいだけなので簡単です。
恐らくプロジェクトを作成するところで躓くのでしょうが、それはリンク先と要領は同じなので参考になるかと思います。
これは「開発環境」や「IDE」というキーワードで調べると分かりますよ。
https://www.google.co.jp/search?q=Visual+C%2B%2B+プロジェクト
この辺のキーワードで調べても良いでしょう。
困った時は「答え」を教えてもらうのではなく「調べ方を教えてもらう」ようにしてもらうのが勉強のスタイルとしてGoodです。
そうしないと常にずっと答えを教えてもらわないと自分では何もできなくなってしまいます。
少し情報が古いですが、こちら参考になるかと思います。
http://dixq.net/vcpp.html
今はVisualStudio2017の「Community 2017」と言うものを利用します。
リンク先とインストール方法は違うものの手順通り進めて行けばいいだけなので簡単です。
恐らくプロジェクトを作成するところで躓くのでしょうが、それはリンク先と要領は同じなので参考になるかと思います。
これは「開発環境」や「IDE」というキーワードで調べると分かりますよ。
https://www.google.co.jp/search?q=Visual+C%2B%2B+プロジェクト
この辺のキーワードで調べても良いでしょう。
困った時は「答え」を教えてもらうのではなく「調べ方を教えてもらう」ようにしてもらうのが勉強のスタイルとしてGoodです。
そうしないと常にずっと答えを教えてもらわないと自分では何もできなくなってしまいます。
Re: C言語が分からない・・・
かずまさん、 Dixq (管理人)ありがとうございます。
かずまさんが訂正してくれたプログラムや Dixq (管理人)が提示してくれたリンクなどを参考にしたいと思います。
恐縮なのですが、どの行がどのようなことをしているのかが、理解できないのでプログラムにコメントを書いていただきたいです。どなたか宜しくお願い致します。
ただ、>困った時は「答え」を教えてもらうのではなく「調べ方を教えてもらう」ようにしてもらうのが勉強のスタイルとしてGoodです。
そうしないと常にずっと答えを教えてもらわないと自分では何もできなくなってしまいます。
という考えには同意なのですが、私はC言語を利用する道には進もうとはしていませんし、最初に書いてある通り、止む終えない理由がありこの講義取りました。それに最初は自分で調べましたが全く分からなかったのでこの掲示板を利用しました。このことから、答えを聞いても良いのではと思います。
かずまさんが訂正してくれたプログラムや Dixq (管理人)が提示してくれたリンクなどを参考にしたいと思います。
恐縮なのですが、どの行がどのようなことをしているのかが、理解できないのでプログラムにコメントを書いていただきたいです。どなたか宜しくお願い致します。
ただ、>困った時は「答え」を教えてもらうのではなく「調べ方を教えてもらう」ようにしてもらうのが勉強のスタイルとしてGoodです。
そうしないと常にずっと答えを教えてもらわないと自分では何もできなくなってしまいます。
という考えには同意なのですが、私はC言語を利用する道には進もうとはしていませんし、最初に書いてある通り、止む終えない理由がありこの講義取りました。それに最初は自分で調べましたが全く分からなかったのでこの掲示板を利用しました。このことから、答えを聞いても良いのではと思います。
Re: C言語が分からない・・・
あなたが将来的にC言語を使おうと使うまいと、課題なんですから答えだけもらってサヨナラはありえないですね。
「やむをえないから抜け道で適当なことをしてOK」かどうかを判断するのはあなたでも我々でもないかと。
「やむをえないから抜け道で適当なことをしてOK」かどうかを判断するのはあなたでも我々でもないかと。
Re: C言語が分からない・・・
> という考えには同意なのですが、私はC言語を利用する道には進もうとはしていませんし、
> 最初に書いてある通り、止む終えない理由がありこの講義取りました。
理由はなんでも構いませんが、「この講義を取りました」というのは、
「課題や試験をパスして単位を取得するつもりです」ということですか?
それならば講義に必要なレベルでC言語を学習するのですよね。
将来必要ないみたいですが、止むを得ませんからね。
> それに最初は自分で調べましたが全く分からなかったのでこの掲示板を利用しました。
> このことから、答えを聞いても良いのではと思います。
zerocyさんが何を調べ、何が判らなかったのか書かれていませんが、
「自分で調べましたが全く分からなかった」というのは、
丸投げする人全員に共通の言い訳でもあります。
この掲示板は答えを聞く場所ではなく、答えへの道を聞く場所であるべきと思います。
> 最初に書いてある通り、止む終えない理由がありこの講義取りました。
理由はなんでも構いませんが、「この講義を取りました」というのは、
「課題や試験をパスして単位を取得するつもりです」ということですか?
それならば講義に必要なレベルでC言語を学習するのですよね。
将来必要ないみたいですが、止むを得ませんからね。
> それに最初は自分で調べましたが全く分からなかったのでこの掲示板を利用しました。
> このことから、答えを聞いても良いのではと思います。
zerocyさんが何を調べ、何が判らなかったのか書かれていませんが、
「自分で調べましたが全く分からなかった」というのは、
丸投げする人全員に共通の言い訳でもあります。
この掲示板は答えを聞く場所ではなく、答えへの道を聞く場所であるべきと思います。