トップページ⇒tech
1001コメント370KB

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
>>231
豪華すぎ。
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
[1] 授業単元:C言語基礎
[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
>>234
実行例見ると12と33が出現回数同じだけど、
そういうときってどうするの?
テキトーでいいの?
02362342005/08/24(水) 18:30:50
条件1に、最頻値が複数ある場合は、最も大きい値のデータを表示対象とする。とあるので
33が出るようにお願いします。わかりにくくて申し訳ないです。
0237デフォルトの名無しさん2005/08/24(水) 18:40:56
>>234
>>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;
}
02382342005/08/24(水) 19:17:52
>>273さん
ありがとうございました。
num = num > 0 ? num < 20 ? num : 20 : 1;
の部分は学校では習っていなかったので、ここだけ
if(num > 0 && num <= 20){〜条件に合致すれば入力処理へ進む〜
}else{合致しなければおしまい
 といった形にいじらせてもらいました。では失礼します。
02392342005/08/24(水) 19:18:52
訂正、>>237さんでした・・・orz
0240デフォルトの名無しさん2005/08/25(木) 00:14:28
いんたぷりたorこんぱいらの男です。
もぉあきらめました。ご意見をくださったかた、心があたたかくなりました。
ご好意に添えないことが残念です。

友人にみせてもらって共同で作ったことにさせてもらいます・・・。
友人も出来てないみたいですが。なんとかやってくれるでしょう。
0241デフォルトの名無しさん2005/08/25(木) 02:56:28
しかし最近の高専ってレベル高いのな。
高校生とは言え宿題でコンパイラは辛いだろ。
俺だって一月でCコンパイラ作ってこい言われたらキツいぞ。
0242デフォルトの名無しさん2005/08/25(木) 03:01:36
>>241
ネットに転がってるのが前提なんじゃない?
専門学校でCASLアセンブラ作れって課題は出てたが、漏れはさっぱり分からなかった。
0243デフォルトの名無しさん2005/08/25(木) 10:36:14
yaccで逆ポーランド記法のインタプリタを作らされたことならあるぞ。
0244デフォルトの名無しさん2005/08/25(木) 22:01:23
>>243
激しく無駄だな。ワロス。
0245デフォルトの名無しさん2005/08/26(金) 00:38:48
RPNなんて7行プログラミングの管轄だろw
0246デフォルトの名無しさん2005/08/26(金) 03:29:03
7行か……#includeを書かないのが美学?
0247デフォルトの名無しさん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:08
#include <stdio.h>

int 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:05
>>247が↑のMax()とMin()の中身を理解できてるか心配。
0250≠2482005/08/26(金) 17:03:55
>>249
んじゃ、判りやすいように簡易版を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:29
いけずなおまいらが大好きです
0252デフォルトの名無しさん2005/08/26(金) 17:16:25
>>251
これならどう?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:29
>>247のに挑戦してたんだけど、なるだけ汎用的な
Max(int*),Min(int*)に仕上げようと思って
渡された配列の要素数を計算しようとしたのですが
sizeof(src)/sizeof(src[0])でうまく出なかったので
何でなのかと弄ってたら、srcは関数内ではあくまで配列の
先頭へのポインタでしかないからsizeof(src)してもダメなのは
当然だという所までは気づいたんですが、こういう場合
要素数はどうやって求めればいいんでしょう?
やっぱり配列を扱える方で計算した上で引数として渡すしかないんでしょうか?

srcはmain()のローカル変数として宣言してます
0254デフォルトの名無しさん2005/08/26(金) 17:39:05
int Max(valarray<int> &src) {
 return valarray.max();
};

int Min(valarray<int> &src) {
 return valarray.min();
};
0255デフォルトの名無しさん2005/08/26(金) 17:44:05
>>253
引数で渡すしかない。
C++だといろいろと回避法はあるけど。
0256デフォルトの名無しさん2005/08/26(金) 17:45:20
>>255
やっぱりそうですか・・・どうもです
0257253ではない2005/08/26(金) 18:16:24
汎用的にするならこうなるのかな
int 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
[1] 授業単元:
[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
>>258
自分が作ったソースを晒しなぁ。
0260デフォルトの名無しさん2005/08/26(金) 22:29:12
>>257
俺も汎用的にしてみた。
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
>>260
無駄にそこまでこるならC++でテンプレート使えばいいじゃない。
02622582005/08/26(金) 22:39:42
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/875.txt

もともと32桁16進→10進という課題だったため、前半部分で16→2にしています。
作りかけでいろいろ無駄がありますが目をつぶってください。
0263デフォルトの名無しさん2005/08/26(金) 23:00:28
>>262
403 forbidden
0264デフォルトの名無しさん2005/08/26(金) 23:15:34
>>262
要は途中でunsined longなりの最大値超えるからでしょ?
適当な要素数のint型配列つかって10進数を表して
そいつを表示する部分と、乗算する部分作った方がいい希ガス

とりあえず自分で作ろうと思ってた奴の表示と乗算の部分だけ完成させたから
参考にでもしてくれ
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/876.txt
0265デフォルトの名無しさん2005/08/27(土) 00:33:47
>>262
いろいろ目をつぶったら何も見えなくなった。
って後半(2->10)も何もないじゃないかあ〜!
(後、結果の保持or出力の形式の条件(有無さえ)が不明だなあ。
128桁の2進数値の保持に 128bit以上の整数型が必要になるのは理解済み?)
0266デフォルトの名無しさん2005/08/27(土) 01:55:38
そのあたりは理解しています。
数値ではなく、文字として処理して計算?という案はあるのですが
加算処理をどう表現していいのかがわからず、です。

計算結果はそのまま 123456798456132・・・というふうに表示し、プログラム終了です。
0267デフォルトの名無しさん2005/08/27(土) 02:17:58
>>266
文字として処理っていうのは筆算での掛け算をするってことか?
02682582005/08/27(土) 02:37:59
桁数が大きくなると、普通に数値として計算ができなくなるので
数字の足し算を文字と文字の組み合わせで表現すればいいのでは?と考えてました。
1と1が組み合わさるときは2、1と2が組み合わさるときは3・・・とパターンを決めて計算を表現するということです。
うまく説明できない・・・
とりあえず、普通の足し算を行うのはあきらめる気でいました。
0269デフォルトの名無しさん2005/08/27(土) 02:40:10
>>266
> 数値ではなく、文字として処理して計算?という案
10進数の数値に対して 1桁に1バイト割り当て&その値空間が '0' 〜 '9' ってことか?
02702582005/08/27(土) 02:48:51
>>269
まさにそのとおりです。


と、ここまで書いておいて別の方法に気がつきました。
大きな数を4桁ずつとかに区切り、配列に格納したモノ同士を足していくほうが
繰り上がりの問題も含めて単純に解決できそうです。
今まで考えでは1桁ずつ計算していましたが、こちらのほうが楽かつ簡単な気がします。

考えがまとまらずにフラフラしてしまって申し訳ありません。
なかなかうまく進まず焦ってしまっています。
一旦自分で考え直してもう一度質問すべきことを練り直します。
0271デフォルトの名無しさん2005/08/27(土) 03:13:40
[1] 授業単元: プログラミング演習
[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
>>271
普通にバイナリモードで開いて、freadでunsigned longの変数に
放り込めばよくないか?
0274デフォルトの名無しさん2005/08/27(土) 04:41:58
俺の教科書だと、
unsigned 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
>>272
習ったデータ構造についてですが、正直授業についていけなくてわかりません。
出力についてですが、0〜2の32乗の値のそれぞれの出現頻度をグラフ化したいわけで、
アスタリスクの横棒ですとターミナルに表示するのは非常に困難だと思いますし、
もし可能であれば、出力されるファイルをエクセル形式のファイルにして、それを
エクセルで開いて、縦軸に0〜2の32乗それぞれの出現頻度が、
開いたエクセルファイルに10進法で書かれていれば、それらから
グラフを作りたいなと考えております。
他の方法としても、ターミナルに一度に0〜2の32乗の出現頻度を表示することはできないので
100づつくらい、出現頻度を表示させておいて、それをエクセルに少しずつこぴぺしていこうと
考えております。私の発想ではこのくらいのことしかおもいつかないのですが
もっといい方法があったらそちらでプログラムを組んでいただけると助かります。
私の説明不足なために理解に苦しまれるところがたくさんあるとは思います。すみません。

0276デフォルトの名無しさん2005/08/27(土) 04:50:07
エクセルも64K行しか作れないわけだが。
0277デフォルトの名無しさん2005/08/27(土) 04:51:57
>>273
私がやってみた方法は、
#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
>>276
それは知りませんでした。
何かいい方法で、0〜2の32乗を横軸とし、縦軸を出現頻度としたグラフは作成できないのでしょうか?
0279デフォルトの名無しさん2005/08/27(土) 04:57:08
>>278
試しに、2の32乗がどんな値か計算して味噌。
できれば、それを表示するためにどれだけのメモリが必要になるかも。

#こいつの頭は大丈夫なんだろうかと不安になる恭子の頃。
0280デフォルトの名無しさん2005/08/27(土) 04:58:09
>>278
そもそも2^32もの行(列)数をグラフ化できるソフトなんてあるのか?
0281デフォルトの名無しさん2005/08/27(土) 05:06:06
>>279
4、294、967、296ですね・・・。
四十億ですね・・・。
無知ですみませんでした。
あとエクセルで確認したところ65536までしか縦軸がありませんでした

口頭で聞いた問題でしたので、271ような課題を出す先生はいらっしゃらないと思ったほうが
いいのでしょうか?

テンプレに書かれているように、問題文を途中で帰るのは失礼だとは思いますが、
少し変えさせてもらってもよろしいでしょうか?
0282デフォルトの名無しさん2005/08/27(土) 05:07:45
Linuxならgnuplot用のデータ吐けばいいんでないか?
0283デフォルトの名無しさん2005/08/27(土) 05:26:22
>281
変えるのならどうぞ。

>271ような課題を出す先生はいらっしゃらないと思ったほうが いいのでしょうか?
宿題としては、難儀です。32ビットだとデータ構造とかファイルサイズとか気にするんで。
限界に近いところでプログラムを組むことを経験させる・・・という意図ならありです。

なにか別の作業の一環でやってるなら、全データを扱うっていうのはヘンかな・・
出現数が上位のものをリストアップする・・・とか。ある範囲で区切るとかするんじゃないかな。

モトのデータが何で、どういう目的で使いたいのかが分かると、やりやすいな。
0284デフォルトの名無しさん2005/08/27(土) 06:11:08
271です。先生、TAの雰囲気から察するに難しい課題ではないと思いますので
お言葉に甘えて問題を変えさせていただきます。

[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
>>283
>モトのデータが何で、どういう目的で使いたいのかが分かると、やりやすいな。
画像のRGBのようなヒストグラムだと思っていただければいいと思います。
RGBにもう一つの要素が増えたと思っていただければなと思います。
0286デフォルトの名無しさん2005/08/27(土) 06:20:50
・・・あー。そりゃ、R面G面B面α面ごとにヒストグラム作るべきだわ。
0287デフォルトの名無しさん2005/08/27(土) 06:44:11
$ ./a.out inputfile >outputfile

#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:42
すまん。planeじゃハズいわ。plainな。
0289デフォルトの名無しさん2005/08/27(土) 08:28:28
>>286
それぞれの要素ごとに作るべきでしたか。

>>287
レス遅れて申し訳ありません。
さっそくためにしてみます。

ありがとうございます。
0290デフォルトの名無しさん2005/08/27(土) 08:51:07
>>287
ありがとうございます。
適当なバイナリを作って確認したところそのとおりになりました。
直接会ってお礼をいいたいところですが、本当にありがとうございます。
本当に助かりました。ありがとうございます。
0291デフォルトの名無しさん2005/08/27(土) 23:14:58
>直接会ってお礼をいいたいところですが、
ちょっと引いたぞ
0292デフォルトの名無しさん2005/08/28(日) 02:31:36
290です。何度も申し訳ございません。
[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:24
>292
1)出力形式プリーズ
>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
>>293
はい。

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:08
RGB値の値の計算式をR,G,Bを使ってあらわすこと>295
0297デフォルトの名無しさん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:03
>>294
287のような出力形式でいいですがもっといい方法があるならそちらを使ってもらって
下さると助かります。グラフにするときに便利な出力にしたいと考えております。
287の場合は最大Xが255だったのであの出力形式をエクセルにこぴぺして作れましたが
今回の場合は2の24乗になるのでなにか上手な方法があったらとおもっております。

>2)メンドイからバイナリをどっかにおくと、いいかも。
どういう意味でしょうか?無知ですみません。

みなさん深夜にありがとうございます。
0299デフォルトの名無しさん2005/08/28(日) 03:20:37
なんか・・・出現数に応じたデータ圧縮かなぁ。とか思いつつ、生暖かく見ている。
0300デフォルトの名無しさん2005/08/28(日) 03:22:42
2の24乗!!???
そんなに....
0301デフォルトの名無しさん2005/08/28(日) 03:23:39
>>296
無知ですみません。それはどのような意味でしょうか?
0302デフォルトの名無しさん2005/08/28(日) 03:28:08
>>299
あ・・・確かにそのとおりです。正直驚きました。なぜかというとTAではないドクターに知り合いがいて
少し相談したんですが彼もそういってました。このあとなにかしらの符号化?につなげていくのではと

>>300
やはり多くてグラフ化できないですかね?
それなら出現頻度が0の場合は消していけばなんとかならないですかね・・・
0303デフォルトの名無しさん2005/08/28(日) 03:30:35
>>302
絶対にそれぞれの値の棒グラフを作らねばならないのか?
度数分布表とかではなく?
0304デフォルトの名無しさん2005/08/28(日) 03:33:19
>>303
ヒストグラムを作ってということだったので特に指定はありませんでした。
私が勝手に判断して値の棒グラフと考えました。
度数分布表というのはよくわからないのでぐぐってきますがそれでいけそうでしたら
それでやってもらえると助かります

みなさんありがとうございます。
0305デフォルトの名無しさん2005/08/28(日) 03:36:30
>>303
2の16乗で区分すると2の8乗の階級ができます。RGBで考えたときにRGが同じで
Bが違っても同じになるというのはこの課題ではだめだと思います。
0306デフォルトの名無しさん2005/08/28(日) 03:37:41
>301
R成分,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
>>306
無知ですみません。
RGBαRGBα・・・・で構成されているファイルをαを無視して、
RGBをワンセット(1ピクセル?)で考えて
どのようなRGBが出現頻度が高いのかを知りたいと考えております。

回答になってたでしょうか?本当にすいません。
0308デフォルトの名無しさん2005/08/28(日) 03:51:18
#include <stdio.h>
long 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
>>308
ありがとうございます
動作実験をしてみたいと思います
0310デフォルトの名無しさん2005/08/28(日) 04:13:51
#include <stdio.h>
#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;
}
03113102005/08/28(日) 04:20:19
げ、最後のr, g, b, i[r][g][b]は
r+1, g+1, b+1, data[r][g][b]と読み替えてください。できたらこれも実験してもらえたら嬉しいです。
0312デフォルトの名無しさん2005/08/28(日) 04:22:55
0〜255だと256個必要だな。>310
03133102005/08/28(日) 04:25:01
Unicode識別子は無効だって....error
03143102005/08/28(日) 04:27:12
僕のは、試さないでください....。orz
0315デフォルトの名無しさん2005/08/28(日) 04:44:17
#include <stdio.h>
#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:16
みなさんありがとうございます。
RGBαのαは無視してと今までいっていたのですができればRGBαをまとまりと
考えて出現頻度を求めていただけないでしょうか?わがままいってもうしわけありません
0317デフォルトの名無しさん2005/08/28(日) 04:56:34
作るのがあほらしくなったのでパス。>316
0318デフォルトの名無しさん2005/08/28(日) 05:01:53
うむ。完全にバカにしとるな。
0319デフォルトの名無しさん2005/08/28(日) 05:02:14
>>308
ありがとうございます。
動作を確認いたしました。

>return (long) r << 16 | (long) g << 8 | b;
この動作でαを除外したのですか?
無知ですみません
0320デフォルトの名無しさん2005/08/28(日) 05:03:44
>>317
>>318
すいません・・・。
上の方で4バイトずつのヒストグラムは難しいといわれたので自分で勝手に3バイトとしました。
それならなんとかなるのかなとおもったためです
すいませんでした。
0321デフォルトの名無しさん2005/08/28(日) 05:10:18
>>310
ありがとうございました。
0322デフォルトの名無しさん2005/08/28(日) 05:35:57
入力ファイルがメモリのサイズを越えないのであれば、四バイトの索引と
頻度のペアを作っていけば数えられるよ。
ただ、ヒストグラムの横軸をどうするのか?
出題ミスのような気がするから、まずやるべきは先生に問題を確認することなんだけど
なぁ……
0323デフォルトの名無しさん2005/08/28(日) 06:00:57
>>322
char、short、longと、配列サイズを変更して集計するとか。
0324デフォルトの名無しさん2005/08/28(日) 06:03:04
>>322
ありがとうございます。
308の if (count[i]) /* 全要素を出力するにはこの行を削除 */
で 削除して全要素を出力したのですが出力できなかったところを考えると
2の24畳でさえだめだったのですから2の32乗は無理そうですね。
ですので出現したものだけのヒストグラムを作ろうかなと考えております(出題ミスでないと考えた場合)
0325デフォルトの名無しさん2005/08/28(日) 06:09:16
この人わかってない。
0326デフォルトの名無しさん2005/08/28(日) 06:17:09
つか線形リストなり、ハッシュなりで実装すりゃええやん
どーいうデータが想定されてんのか知らんけどさ
どーせ頻度0の要素がほとんどだろ?
0327デフォルトの名無しさん2005/08/28(日) 06:22:58
固定長配列でO(n^2)なアルゴリズム。
0328デフォルトの名無しさん2005/08/28(日) 06:28:03
>>325
すいません・・・

>>326
TAが配布したデータでは
(要素数は2の24乗がある中使われていた要素は10000ちょっとでした)でした。

>>327
わかりません・・・。
0329デフォルトの名無しさん2005/08/28(日) 06:32:13
>>317
>>318
いいわけさせていただくと αの要素を調べていたら0か255でしたので
(RGBすべてが0だった場合αも0、RGBが何かしらの値を盛っていたらαは常に255だった)
のでαを省いたものといいました。
しかし、これでは他のデータですと汎用性がないというっことが考えられます
ですので後でRGBαをワンセットと考えて〜といってしまいました

みなさんにはいろいろしてもらっていたのに大変失礼なことをしてしまいました
本当にごめんなさい
0330デフォルトの名無しさん2005/08/28(日) 06:35:45
この後にデータ圧縮が控えているわけだが、データ構造はどうしたらよいか?
0331デフォルトの名無しさん2005/08/28(日) 06:40:23
オマエら朝から暇だな。

>>329
TAが配布したデータをupせよ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
■ このスレッドは過去ログ倉庫に格納されています