C/C++の宿題を片づけます 49代目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/08/10(水) 17:10:47あなたが解けないC/C++の宿題を片づけます
――【注意点】―――――――――――――――――――――――――
・質問は必ず【質問テンプレ】に従ってください。
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
・計算問題は必ず数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
―――――――――――――――――――――――――――――――
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS: Windows/Linux/等々
[3.2] コンパイラ名とバージョン: gcc 2.9 VC 6.0等
[3.3] 言語: C/C++/どちらでも可 のいずれか
[4] 期限: [yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか (「できるだけ早く」は不可)
[5] その他の制限: どこまで習っているか、標準ライブラリは使ってはいけない等々
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【前スレ】
48代目: http://pc8.2ch.net/test/read.cgi/tech/1121471445/
【歴代スレは>>2-13】
0232デフォルトの名無しさん
2005/08/23(火) 22:32:35豪華すぎ。
yaccで充分というか、あんなの自前でやるべき。
それこそlispの醍醐味というもんだろ。
0233デフォルトの名無しさん
2005/08/23(火) 23:56:52最初はどーしよーもないんで、数、シンボル、リスト、関数型のみ扱うことにします。
#define TYPE_INT 0x00000000UL
#define TYPE_SYM 0x10000000UL
#define TYPE_LST 0x20000000UL
#define TYPE_FNC 0x30000000UL
typedef unsigned long Value;
struct Symbol { char *name; Value value; }; /* てかこれだけじゃletが扱えん・・・ */
struct Symbol symbol[1000];
struct Cell { Value car, cdr; }; /* たぶん、これだけじゃゴミ集めできん */
struct Cell list[1000];
悩む。
0234デフォルトの名無しさん
2005/08/24(水) 17:50:13[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/872.txt
[3] 環境
[3.1] OS:windows2k
[3.2] コンパイラ名とバージョン:VC++6.0
[3.3] 言語: C or C++
[4] 期限: [2005年9月01日まで]
[5] その他の制限: 特に無し
よろしくおねがいします。
0235デフォルトの名無しさん
2005/08/24(水) 18:10:11実行例見ると12と33が出現回数同じだけど、
そういうときってどうするの?
テキトーでいいの?
0236234
2005/08/24(水) 18:30:5033が出るようにお願いします。わかりにくくて申し訳ないです。
0237デフォルトの名無しさん
2005/08/24(水) 18:40:56>>235ではないが。
#include <stdio.h>
int main(void) {
int dat, dosuu[101] = {0}, num, i, max;
printf("入力データ件数?"); scanf("%d", &num);
num = num > 0 ? num < 20 ? num : 20 : 1;
for (i = 0; i < num; i++) {
printf("%2d番目の数:", i + 1); scanf("%d", &dat);
if (0 <= dat && dat <= 100) ++dosuu[dat];
}
for (max = 0, i = 0; i < 101; i++) if (dosuu[max] <= dosuu[i]) max = i;
printf("\n 最頻値:%d\n 度数:%d\n", max, dosuu[max]);
return 0;
}
0238234
2005/08/24(水) 19:17:52ありがとうございました。
num = num > 0 ? num < 20 ? num : 20 : 1;
の部分は学校では習っていなかったので、ここだけ
if(num > 0 && num <= 20){〜条件に合致すれば入力処理へ進む〜
}else{合致しなければおしまい
といった形にいじらせてもらいました。では失礼します。
0240デフォルトの名無しさん
2005/08/25(木) 00:14:28もぉあきらめました。ご意見をくださったかた、心があたたかくなりました。
ご好意に添えないことが残念です。
友人にみせてもらって共同で作ったことにさせてもらいます・・・。
友人も出来てないみたいですが。なんとかやってくれるでしょう。
0241デフォルトの名無しさん
2005/08/25(木) 02:56:28高校生とは言え宿題でコンパイラは辛いだろ。
俺だって一月でCコンパイラ作ってこい言われたらキツいぞ。
0242デフォルトの名無しさん
2005/08/25(木) 03:01:36ネットに転がってるのが前提なんじゃない?
専門学校でCASLアセンブラ作れって課題は出てたが、漏れはさっぱり分からなかった。
0243デフォルトの名無しさん
2005/08/25(木) 10:36:140244デフォルトの名無しさん
2005/08/25(木) 22:01:23激しく無駄だな。ワロス。
0245デフォルトの名無しさん
2005/08/26(金) 00:38:480246デフォルトの名無しさん
2005/08/26(金) 03:29:030247デフォルトの名無しさん
2005/08/26(金) 14:16:05[1] 授業単元:C言語�T
[2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/874.txt
[3] 環境
[3.1] OS: Windows
[3.2] BCC
[3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年09月3日まで]
[5] その他の制限:特になし
どうかお願いします。
0248デフォルトの名無しさん
2005/08/26(金) 14:49:08int Max(int *d);
int Min(int *d);
void main()
{
int d[3],c,i;
printf("*** MAXとMIN ***\n処理件数は?: ");
scanf("%d",&c);
for(i=0;i<c;i++){
putchar('\n');
printf("調べる数値 a,b,c:");
scanf("%d,%d,%d",&d[0],&d[1],&d[2]);
printf("最大値: %d ",Max(d));
printf("最小値: %d\n",Min(d));
}
}
int Max(int *d)
{
return (d[0]<d[1])?(d[2]<d[1])?d[1]:d[2]:(d[2]>d[0])?d[2]:d[0];
}
int Min(int *d)
{
return (d[0]>d[1])?(d[2]>d[1])?d[1]:d[2]:(d[2]<d[0])?d[2]:d[0];
}
0249デフォルトの名無しさん
2005/08/26(金) 16:48:050250≠248
2005/08/26(金) 17:03:55んじゃ、判りやすいように簡易版をw
int max2(int a, int b) {return a > b ? a : b;}
int Max(int * d)
{
return max2(max2(d[0], d[1]), d[2]);
}
int min2(int a, int b) {return a < b ? a : b;}
int Min(int * d)
{
return min2(min2(d[0], d[1]), d[2]);
}
0251デフォルトの名無しさん
2005/08/26(金) 17:10:290252デフォルトの名無しさん
2005/08/26(金) 17:16:25これならどう?w
int Max(int * d)
{
int rtn = d[0];
if (d[1] > rtn) {
rtn = d[1];
}
if (d[2] > rtn) {
rtn = d[2];
}
return rtn;
}
それともこうするかw
int Max(int * d)
{
unsigned idx = 0;
if (d[1] > d[idx]) {
idx = 1;
}
if (d[2] > d[idx]) {
idx = 2;
}
return d[idx];
}
0253デフォルトの名無しさん
2005/08/26(金) 17:29:29Max(int*),Min(int*)に仕上げようと思って
渡された配列の要素数を計算しようとしたのですが
sizeof(src)/sizeof(src[0])でうまく出なかったので
何でなのかと弄ってたら、srcは関数内ではあくまで配列の
先頭へのポインタでしかないからsizeof(src)してもダメなのは
当然だという所までは気づいたんですが、こういう場合
要素数はどうやって求めればいいんでしょう?
やっぱり配列を扱える方で計算した上で引数として渡すしかないんでしょうか?
srcはmain()のローカル変数として宣言してます
0254デフォルトの名無しさん
2005/08/26(金) 17:39:05return valarray.max();
};
int Min(valarray<int> &src) {
return valarray.min();
};
0255デフォルトの名無しさん
2005/08/26(金) 17:44:05引数で渡すしかない。
C++だといろいろと回避法はあるけど。
0256デフォルトの名無しさん
2005/08/26(金) 17:45:20やっぱりそうですか・・・どうもです
0257253ではない
2005/08/26(金) 18:16:24int Max(int * d, int n)
{
int max = d[0];
int i = 1;
while(i < n){
if (d[i] > max) {
max = d[i];
}
i++;
}
return max;
}
0258デフォルトの名無しさん
2005/08/26(金) 22:14:18[2] 問題文:128桁までの2進数を10進数に変換する。
各Bitごとに1であれば答えとなる変数に重みを加算する、という仕様。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC 6.0
[3.3] 言語:どちらでも可
[4] 期限: [2005年08月27日09:00まで]
[5] その他の制限: 特になし
上位Bitの数値を扱う再にオーバーフローが起きてしまいます。
その部分の解決方法についておねがいします。
0259デフォルトの名無しさん
2005/08/26(金) 22:26:49自分が作ったソースを晒しなぁ。
0260デフォルトの名無しさん
2005/08/26(金) 22:29:12俺も汎用的にしてみた。
void *max_in_array(void *a, int n, int elemsize, int(*cmp)(const void *,const void *))
{
int i;
char *max = a;
char *p = ((char*)a) + elemsize;
char *end = ((char*)a) + elemsize * n;
for(; p < end; p += elemsize)
if( (*cmp)(max, p) < 0 ) max = p;
return max;
}
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(*(a)))
#define MAX_IN_ARRAY(a, cmp, type) \
((type*)max_in_array(a, ARRAY_SIZE(a), sizeof(*(a)), cmp))
int int_cmp(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
}
int main()
{
int x[] = {3,1,4,1,5,9,2};
int max = *MAX_IN_ARRAY(x, int_cmp, int);
printf("max = %d\n", max);
return 0;
}
0261デフォルトの名無しさん
2005/08/26(金) 22:34:25無駄にそこまでこるならC++でテンプレート使えばいいじゃない。
0262258
2005/08/26(金) 22:39:42もともと32桁16進→10進という課題だったため、前半部分で16→2にしています。
作りかけでいろいろ無駄がありますが目をつぶってください。
0263デフォルトの名無しさん
2005/08/26(金) 23:00:28403 forbidden
0264デフォルトの名無しさん
2005/08/26(金) 23:15:34要は途中でunsined longなりの最大値超えるからでしょ?
適当な要素数のint型配列つかって10進数を表して
そいつを表示する部分と、乗算する部分作った方がいい希ガス
とりあえず自分で作ろうと思ってた奴の表示と乗算の部分だけ完成させたから
参考にでもしてくれ
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/876.txt
0265デフォルトの名無しさん
2005/08/27(土) 00:33:47いろいろ目をつぶったら何も見えなくなった。
って後半(2->10)も何もないじゃないかあ〜!
(後、結果の保持or出力の形式の条件(有無さえ)が不明だなあ。
128桁の2進数値の保持に 128bit以上の整数型が必要になるのは理解済み?)
0266デフォルトの名無しさん
2005/08/27(土) 01:55:38数値ではなく、文字として処理して計算?という案はあるのですが
加算処理をどう表現していいのかがわからず、です。
計算結果はそのまま 123456798456132・・・というふうに表示し、プログラム終了です。
0267デフォルトの名無しさん
2005/08/27(土) 02:17:58文字として処理っていうのは筆算での掛け算をするってことか?
0268258
2005/08/27(土) 02:37:59数字の足し算を文字と文字の組み合わせで表現すればいいのでは?と考えてました。
1と1が組み合わさるときは2、1と2が組み合わさるときは3・・・とパターンを決めて計算を表現するということです。
うまく説明できない・・・
とりあえず、普通の足し算を行うのはあきらめる気でいました。
0269デフォルトの名無しさん
2005/08/27(土) 02:40:10> 数値ではなく、文字として処理して計算?という案
10進数の数値に対して 1桁に1バイト割り当て&その値空間が '0' 〜 '9' ってことか?
0270258
2005/08/27(土) 02:48:51まさにそのとおりです。
と、ここまで書いておいて別の方法に気がつきました。
大きな数を4桁ずつとかに区切り、配列に格納したモノ同士を足していくほうが
繰り上がりの問題も含めて単純に解決できそうです。
今まで考えでは1桁ずつ計算していましたが、こちらのほうが楽かつ簡単な気がします。
考えがまとまらずにフラフラしてしまって申し訳ありません。
なかなかうまく進まず焦ってしまっています。
一旦自分で考え直してもう一度質問すべきことを練り直します。
0271デフォルトの名無しさん
2005/08/27(土) 03:13:40[2] 問題文(含コード&リンク): バイナリのファイルを4byeづつ読み込んでヒストグラムを求める。
[3] 環境
[3.1] OS: Linux
[3.2] gcc
[3.3] 言語: C
[4] 期限: [2005年8月28日12:00まで]
[5] その他の制限:
問題文ではなく口頭で言われたので、言葉足らずのところがあると思いますが、
よろしくお願いいたします。
口頭では、「例えば、12バイトのバイナリファイルがあったとする。
そのファイルを4バイトずつ読み込み、それらを十進法であらわすと100、200、100だったとする
するとヒストグラムは(もちろん2の128乗の場合があるわけで出現してないものも表記すること)
0 |
1 |
・ |
・ |
100|**
200|*
(あとは省略)となる。 2の128乗の場合があるわけでターミナルに上のように表すのはどうかと思うので
エクセルなどでヒストグラムを作れるようにすること。といわれました。どうかよろしくお願いいたします。
0272デフォルトの名無しさん
2005/08/27(土) 04:00:59習ったデータ構造は?(2分探索木、ハッシュ、mallocする形の二次元配列)
習ったバイナリファイルを読み込む方法は?
出力はアスタリスクの横棒とエクセルファイル、どちらを作ればいいの?
0273デフォルトの名無しさん
2005/08/27(土) 04:28:11普通にバイナリモードで開いて、freadでunsigned longの変数に
放り込めばよくないか?
0274デフォルトの名無しさん
2005/08/27(土) 04:41:58unsigned long x;
x = (getchar() & 0xff) << 24;
x |= (getchar() & 0xff) << 16;
x |= (getchar() & 0xff) << 8;
x |= (getchar() & 0xff);
ってなっとる(爆) これもなんだかな・・・だが。
unsigned longが64ビットじゃない処理系って、俺は知らんけど、
fread(&x, 4, fp)とかだと、処理系依存じゃねぇか?
0275デフォルトの名無しさん
2005/08/27(土) 04:44:47習ったデータ構造についてですが、正直授業についていけなくてわかりません。
出力についてですが、0〜2の32乗の値のそれぞれの出現頻度をグラフ化したいわけで、
アスタリスクの横棒ですとターミナルに表示するのは非常に困難だと思いますし、
もし可能であれば、出力されるファイルをエクセル形式のファイルにして、それを
エクセルで開いて、縦軸に0〜2の32乗それぞれの出現頻度が、
開いたエクセルファイルに10進法で書かれていれば、それらから
グラフを作りたいなと考えております。
他の方法としても、ターミナルに一度に0〜2の32乗の出現頻度を表示することはできないので
100づつくらい、出現頻度を表示させておいて、それをエクセルに少しずつこぴぺしていこうと
考えております。私の発想ではこのくらいのことしかおもいつかないのですが
もっといい方法があったらそちらでプログラムを組んでいただけると助かります。
私の説明不足なために理解に苦しまれるところがたくさんあるとは思います。すみません。
0276デフォルトの名無しさん
2005/08/27(土) 04:50:070277デフォルトの名無しさん
2005/08/27(土) 04:51:57私がやってみた方法は、
#define BIG 2の32乗
hisutoguramu[BIG]という配列を用意いたしました。配列を初期化して
そして
hisutoguramu[in_data[i]]=hisutoguramu[in_data] + 1 ;
in_data[i]というのは元ファイルを4バイトずつ読み込んでいるものでiは
元ファイルのサイズ/4までしかループさせない
というふうにしてプリントfで表示させる方法をしてみようとしたのですが
できませんでした。セグメンテーション違反もでまして、無理でした。
0278デフォルトの名無しさん
2005/08/27(土) 04:53:11それは知りませんでした。
何かいい方法で、0〜2の32乗を横軸とし、縦軸を出現頻度としたグラフは作成できないのでしょうか?
0279デフォルトの名無しさん
2005/08/27(土) 04:57:08試しに、2の32乗がどんな値か計算して味噌。
できれば、それを表示するためにどれだけのメモリが必要になるかも。
#こいつの頭は大丈夫なんだろうかと不安になる恭子の頃。
0280デフォルトの名無しさん
2005/08/27(土) 04:58:09そもそも2^32もの行(列)数をグラフ化できるソフトなんてあるのか?
0281デフォルトの名無しさん
2005/08/27(土) 05:06:064、294、967、296ですね・・・。
四十億ですね・・・。
無知ですみませんでした。
あとエクセルで確認したところ65536までしか縦軸がありませんでした
口頭で聞いた問題でしたので、271ような課題を出す先生はいらっしゃらないと思ったほうが
いいのでしょうか?
テンプレに書かれているように、問題文を途中で帰るのは失礼だとは思いますが、
少し変えさせてもらってもよろしいでしょうか?
0282デフォルトの名無しさん
2005/08/27(土) 05:07:450283デフォルトの名無しさん
2005/08/27(土) 05:26:22変えるのならどうぞ。
>271ような課題を出す先生はいらっしゃらないと思ったほうが いいのでしょうか?
宿題としては、難儀です。32ビットだとデータ構造とかファイルサイズとか気にするんで。
限界に近いところでプログラムを組むことを経験させる・・・という意図ならありです。
なにか別の作業の一環でやってるなら、全データを扱うっていうのはヘンかな・・
出現数が上位のものをリストアップする・・・とか。ある範囲で区切るとかするんじゃないかな。
モトのデータが何で、どういう目的で使いたいのかが分かると、やりやすいな。
0284デフォルトの名無しさん
2005/08/27(土) 06:11:08お言葉に甘えて問題を変えさせていただきます。
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): バイナリであらわされているファイルを1byeづつ4バイト区切りで読み込んでヒストグラムを求める。
[3] 環境
[3.1] OS: Linux
[3.2] gcc
[3.3] 言語: C
[4] 期限: [2005年8月28日12:00まで]
[5] その他の制限:
例えば、A,B,C,Dそれぞれ1バイトで表現されていて、
ファイルとしては A1,B1,C1,D1、A2,B2,C2、D2、・・・An、Bn,Cn,Dnとなっていて
Aだけのヒストグラム Bだけのヒストグラム Cだけのヒストグラム Dだけのヒストグラムを求めたいです。
例えば縦軸は 0〜(読み込むデータサイズ/4) 横軸は0〜255であらわされることとなります。
問題文を変え、言葉が足りないところも多数ありますがどうぞよろしくお願いいたします。
0285デフォルトの名無しさん
2005/08/27(土) 06:16:31>モトのデータが何で、どういう目的で使いたいのかが分かると、やりやすいな。
画像のRGBのようなヒストグラムだと思っていただければいいと思います。
RGBにもう一つの要素が増えたと思っていただければなと思います。
0286デフォルトの名無しさん
2005/08/27(土) 06:20:500287デフォルトの名無しさん
2005/08/27(土) 06:44:11#include <stdio.h>
#include <stdlib.h>
#define NPLANE 4
int main(int argc, char *argv[])
{
static unsigned long count[NPLANE][256] = {0};
int c, plane, i;
FILE *fp = fopen(argv[1], "rb"); /* エラーチェックしてない */
for (plane = 0; (c = fgetc(fp)) != EOF; plane = (plane + 1) % NPLANE)
count[plane][c]++;
for (i = 0; i < 256; i++) {
printf("%d,%lu", i, count[0][i]);
for (plane = 1; plane < NPLANE; plane++)
printf(",%lu", count[plane][i]);
printf("\n");
}
return 0;
}
0288デフォルトの名無しさん
2005/08/27(土) 06:49:420289デフォルトの名無しさん
2005/08/27(土) 08:28:28それぞれの要素ごとに作るべきでしたか。
>>287
レス遅れて申し訳ありません。
さっそくためにしてみます。
ありがとうございます。
0290デフォルトの名無しさん
2005/08/27(土) 08:51:07ありがとうございます。
適当なバイナリを作って確認したところそのとおりになりました。
直接会ってお礼をいいたいところですが、本当にありがとうございます。
本当に助かりました。ありがとうございます。
0291デフォルトの名無しさん
2005/08/27(土) 23:14:58ちょっと引いたぞ
0292デフォルトの名無しさん
2005/08/28(日) 02:31:36[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): バイナリのファイルを読み込み、ヒストグラムを求める。
[3] 環境
[3.1] OS: Linux
[3.2] gcc
[3.3] 言語: C
[4] 期限: [2005年8月28日12:00まで] 過ぎても提出できます。
[5] その他の制限:
問題文ではなく口頭で言われたので、言葉足らずのところがあると思いますが、
よろしくお願いいたします。
例えば、R,G,B,αがそれぞれ1バイトで表現されていて、
ファイルとしては R1,G1,B1,α1、R2,G2,B2、α2、・・・Rn、Gn,Bn,αnとなっていて
そこでαは無視して、R,G,Bをワンセットとして考え、284でいったようなR,G,Bそれぞれではなく
R,G,Bをワンセットとしてヒストグラムを求めたいです。
287のように出力させていただければ自分でエクセルを使ってヒストグラムを求めたいと考えております。
どうぞよろしくお願いいたします。
0293デフォルトの名無しさん
2005/08/28(日) 02:56:37例)
R1,G1,B1,
R2,G2,B2,
.......
0294デフォルトの名無しさん
2005/08/28(日) 03:12:241)出力形式プリーズ
>287の例だと
・1行1レコードのテキストファイル。
・1レコードに含まれるフィールドはコンマで区切られる。
・フィールドは順に、値,Rの頻度,Gの頻度,Bの頻度,αの頻度。
例
0,1,0,100
1,2,1,40
...
255,100,0,0
というふうに書く。
2)メンドイからバイナリをどっかにおくと、いいかも。
0295デフォルトの名無しさん
2005/08/28(日) 03:12:51はい。
RGB値 出現頻度
0 9
1 25
2 0
3 109
・ ・
・ ・
・
2の24乗 13
出現頻度が0の場合は表示しないようにすればなんとか収まると思うのでよろしくお願いします。
表示しないでおくと下のようになります
RGB値 出現頻度
0 9
1 25
3 109
・ ・
・
2の24乗 13
0296デフォルトの名無しさん
2005/08/28(日) 03:14:080297デフォルトの名無しさん
2005/08/28(日) 03:16:38>>293
RGB値 出現頻度
0 9
1 25
2 0
3 109
・ ・
・ ・
・
2の24乗 13
出現頻度が0の場合は表示しないようにすればなんとか収まると思うのでよろしくお願いします。
上のようにしてもプログラムできるというなら上のようなバージョン(出現頻度が0でも表示する)と
下のバージョン(出現頻度が0の場合は表示させない)二つしてもらえると助かります。
表示しないでおくと下のようになります。
RGB値 出現頻度
0 9
1 25
3 109
・ ・
・
2の24乗 13
0298デフォルトの名無しさん
2005/08/28(日) 03:20:03287のような出力形式でいいですがもっといい方法があるならそちらを使ってもらって
下さると助かります。グラフにするときに便利な出力にしたいと考えております。
287の場合は最大Xが255だったのであの出力形式をエクセルにこぴぺして作れましたが
今回の場合は2の24乗になるのでなにか上手な方法があったらとおもっております。
>2)メンドイからバイナリをどっかにおくと、いいかも。
どういう意味でしょうか?無知ですみません。
みなさん深夜にありがとうございます。
0299デフォルトの名無しさん
2005/08/28(日) 03:20:370300デフォルトの名無しさん
2005/08/28(日) 03:22:42そんなに....
0301デフォルトの名無しさん
2005/08/28(日) 03:23:39無知ですみません。それはどのような意味でしょうか?
0302デフォルトの名無しさん
2005/08/28(日) 03:28:08あ・・・確かにそのとおりです。正直驚きました。なぜかというとTAではないドクターに知り合いがいて
少し相談したんですが彼もそういってました。このあとなにかしらの符号化?につなげていくのではと
>>300
やはり多くてグラフ化できないですかね?
それなら出現頻度が0の場合は消していけばなんとかならないですかね・・・
0303デフォルトの名無しさん
2005/08/28(日) 03:30:35絶対にそれぞれの値の棒グラフを作らねばならないのか?
度数分布表とかではなく?
0304デフォルトの名無しさん
2005/08/28(日) 03:33:19ヒストグラムを作ってということだったので特に指定はありませんでした。
私が勝手に判断して値の棒グラフと考えました。
度数分布表というのはよくわからないのでぐぐってきますがそれでいけそうでしたら
それでやってもらえると助かります
みなさんありがとうございます。
0305デフォルトの名無しさん
2005/08/28(日) 03:36:302の16乗で区分すると2の8乗の階級ができます。RGBで考えたときにRGが同じで
Bが違っても同じになるというのはこの課題ではだめだと思います。
0306デフォルトの名無しさん
2005/08/28(日) 03:37:41R成分,G成分,B成分をまとめて表すとき、
R * 256^2 + G * 256 + B
B * 256^2 + G * 256 + R
G * 256^2 + R * 256 + B
B * 256^2 + R * 256 + G
という組み合わせは見たことがあるので、そのうちのどれか知りたかった。
(ここではべき乗を^で表した)
0307デフォルトの名無しさん
2005/08/28(日) 03:46:35無知ですみません。
RGBαRGBα・・・・で構成されているファイルをαを無視して、
RGBをワンセット(1ピクセル?)で考えて
どのようなRGBが出現頻度が高いのかを知りたいと考えております。
回答になってたでしょうか?本当にすいません。
0308デフォルトの名無しさん
2005/08/28(日) 03:51:18long getval(FILE *fp)
{
int r, g, b, dummy;
if ((r = fgetc(fp)) == EOF)
return EOF;
if ((g = fgetc(fp)) == EOF)
return EOF;
if ((b = fgetc(fp)) == EOF)
return EOF;
if ((dummy = fgetc(fp)) == EOF)
return EOF;
return (long) r << 16 | (long) g << 8 | b;
}
int main(int argc, char *argv[])
{
static unsigned long count[256L*256*256] = {0};
long i;
FILE *fp = fopen(argv[1], "rb"); /* エラーチェックしてない */
while ((i = getval(fp)) != EOF)
count[i]++;
for (i = 0; i < 256L*256*256; i++)
if (count[i]) /* 全要素を出力するにはこの行を削除 */
printf("%ld\t%lu\n", i, count[i]);
return 0;
}
0309デフォルトの名無しさん
2005/08/28(日) 04:02:19ありがとうございます
動作実験をしてみたいと思います
0310デフォルトの名無しさん
2005/08/28(日) 04:13:51#include <stdlib.h>
#define DATA_SIZE 16777216
#define RGB_MAX 255
long data[RGB_MAX][RGB_MAX][RGB_MAX];
struct RGB {
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char alpha;
} rgb;
int main(void)
{
FILE *fp;
int i, r, g, b;
if((fp=fopen("ファイル名", "rb")) == NULL) exit(1); /* ファイルが開けなかった */
/* RGBのそれぞれの組み合わせをインクリメントしていく */
for(n=0; n<DATA_SIZE; n++) {
fread(&rgb, sizeof rgb, 1, fp);
data[rgb.r-1][rgb.b-1][rgb.b-1]++;
}
fclose(fp); /* ここで一旦ファイルを閉じる */
if((fp=fopen("textdata", "w")) == NULL) exit(1); /* ファイルが開けなかった */
fprintf(fp, "r,g,b,頻度");
for(r=0; r<RGB_MAX; r++)
for(g=0; r<RGB_MAX; g++)
for(b=0; r<RGB_MAX; b++)
fprintf(fp, "%.3d,%.3d,%.3d,%d,\n", r, g, b, i[r][g][b];
fclose(fp);
return 0;
}
0311310
2005/08/28(日) 04:20:19r+1, g+1, b+1, data[r][g][b]と読み替えてください。できたらこれも実験してもらえたら嬉しいです。
0312デフォルトの名無しさん
2005/08/28(日) 04:22:550313310
2005/08/28(日) 04:25:010314310
2005/08/28(日) 04:27:120315デフォルトの名無しさん
2005/08/28(日) 04:44:17#include <stdlib.h>
#define DATA_SIZE 16974593
#define RGB_MAX 256
long data[RGB_MAX][RGB_MAX][RGB_MAX];
struct rgb_data {
<TAB>unsigned char r;
<TAB>unsigned char g;
<TAB>unsigned char b;
<TAB>unsigned char alpha;
} rgb;
int main(void)
{
<TAB>FILE *fp;
<TAB>int i, r, g, b;
<TAB>if((fp=fopen("ファイル名", "rb")) == NULL) exit(1); /* ファイルが開けなかった */
<TAB>/* RGBのそれぞれの組み合わせをインクリメントしていく */
<TAB>for(i=0; i<DATA_SIZE; i++) {
<TAB><TAB>fread(&rgb, sizeof rgb, 1, fp);
<TAB><TAB>data[rgb.r][rgb.g][rgb.b]++;
<TAB>}
<TAB>fclose(fp); /* ここで一旦ファイルを閉じる */
<TAB>if((fp=fopen("textdata", "w")) == NULL) exit(1); /* ファイルが開けなかった */
<TAB>fprintf(fp, "r,g,b,頻度");
<TAB>for(r=0; r<RGB_MAX; r++)
<TAB><TAB>for(g=0; g<RGB_MAX; g++)
<TAB><TAB><TAB>for(b=0; b<RGB_MAX; b++)
<TAB><TAB><TAB><TAB>fprintf(fp, "%.3d,%.3d,%.3d,%d,\n", r, g, b, data[r][g][b]);
<TAB>fclose(fp);
<TAB>return 0;
} /* <TAB>はタブ文字に置換してください、何度も荒らしみたいにごめんなさい。コンパイル通ったのが大変嬉しくて... */
0316デフォルトの名無しさん
2005/08/28(日) 04:50:16RGBαのαは無視してと今までいっていたのですができればRGBαをまとまりと
考えて出現頻度を求めていただけないでしょうか?わがままいってもうしわけありません
0317デフォルトの名無しさん
2005/08/28(日) 04:56:340318デフォルトの名無しさん
2005/08/28(日) 05:01:530319デフォルトの名無しさん
2005/08/28(日) 05:02:14ありがとうございます。
動作を確認いたしました。
>return (long) r << 16 | (long) g << 8 | b;
この動作でαを除外したのですか?
無知ですみません
0320デフォルトの名無しさん
2005/08/28(日) 05:03:44>>318
すいません・・・。
上の方で4バイトずつのヒストグラムは難しいといわれたので自分で勝手に3バイトとしました。
それならなんとかなるのかなとおもったためです
すいませんでした。
0321デフォルトの名無しさん
2005/08/28(日) 05:10:18ありがとうございました。
0322デフォルトの名無しさん
2005/08/28(日) 05:35:57頻度のペアを作っていけば数えられるよ。
ただ、ヒストグラムの横軸をどうするのか?
出題ミスのような気がするから、まずやるべきは先生に問題を確認することなんだけど
なぁ……
0323デフォルトの名無しさん
2005/08/28(日) 06:00:57char、short、longと、配列サイズを変更して集計するとか。
0324デフォルトの名無しさん
2005/08/28(日) 06:03:04ありがとうございます。
308の if (count[i]) /* 全要素を出力するにはこの行を削除 */
で 削除して全要素を出力したのですが出力できなかったところを考えると
2の24畳でさえだめだったのですから2の32乗は無理そうですね。
ですので出現したものだけのヒストグラムを作ろうかなと考えております(出題ミスでないと考えた場合)
0325デフォルトの名無しさん
2005/08/28(日) 06:09:160326デフォルトの名無しさん
2005/08/28(日) 06:17:09どーいうデータが想定されてんのか知らんけどさ
どーせ頻度0の要素がほとんどだろ?
0327デフォルトの名無しさん
2005/08/28(日) 06:22:580328デフォルトの名無しさん
2005/08/28(日) 06:28:03すいません・・・
>>326
TAが配布したデータでは
(要素数は2の24乗がある中使われていた要素は10000ちょっとでした)でした。
>>327
わかりません・・・。
0329デフォルトの名無しさん
2005/08/28(日) 06:32:13>>318
いいわけさせていただくと αの要素を調べていたら0か255でしたので
(RGBすべてが0だった場合αも0、RGBが何かしらの値を盛っていたらαは常に255だった)
のでαを省いたものといいました。
しかし、これでは他のデータですと汎用性がないというっことが考えられます
ですので後でRGBαをワンセットと考えて〜といってしまいました
みなさんにはいろいろしてもらっていたのに大変失礼なことをしてしまいました
本当にごめんなさい
0330デフォルトの名無しさん
2005/08/28(日) 06:35:450331デフォルトの名無しさん
2005/08/28(日) 06:40:23>>329
TAが配布したデータをupせよ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
■ このスレッドは過去ログ倉庫に格納されています