1 :
デフォルトの名無しさん :
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 】
6 :
デフォルトの名無しさん :2005/08/10(水) 17:31:22
ぬるぽ
VIPに汚染されたスレなんか誰がいくか
9 :
デフォルトの名無しさん :2005/08/11(木) 11:07:53
【質問テンプレ】 [2] 問題文(含コード&リンク): x1,y1,x2,y2に外接する楕円があり 点x,yがその円の内側か外側かの判定をする関数を作れ [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: ANSI C [3.3] 言語: C [4] 期限: 9月1日まで [5] その他の制限: なし
(x1,y1),(x2,y2)に外接する「円」でおk?
11 :
デフォルトの名無しさん :2005/08/11(木) 12:05:05
>>10 箱の中に入ってる楕円の中か外かというイメージです
楕円じゃ、2点だと特定できないもんねぇ。 つーか、(x1, y1) - (x2, y2)の線分も楕円がつぶれた形と言えるし。 そうか、全ての点は内側に成らない可能性があるから判定の必要ないじゃん(ぉぃ
(x1, y1) (x1, y2) (x2, y2) (x2, y1) の4点に外接する楕円ってこと?
>>13 あーは子の中に入ってる楕円ってそういう意味かなるほど。
>>9 問題文をもっとわかりやすくかけよ
15 :
デフォルトの名無しさん :2005/08/11(木) 12:16:46
申し訳ないです
楕円の焦点が斜めにあるときも考慮するのか?と考えた瞬間思考をとめた俺ガイル なんかうまい方法あるのかな??期待してます。
斜めの楕円とかあり得るの?あり得るならまた問題文の不備だ罠。
>>9 ま、斜めを考慮しないなら
/* 外側なら正、楕円上ならゼロ、内側なら負を返す */
int wrt_ellipse(double x1, double y1, double x2, double y2, double x, double y)
{
double x0, y0, a, b, d;
x0 = (x1 + x2) / 2.0; y0 = (y1 + y2) / 2.0; a = (x2 - x1) / 2; b = (y2 - y1) / 2;
d = (x - x0) * (x - x0) / (a * a) + (y - y0) * (y - y0) / (b * b);
return d == 1.0 ? 0 : (d > 1.0 ? 1 : -1);
}
18 :
デフォルトの名無しさん :2005/08/11(木) 12:38:37
さすがに斜めは無しです・・・
19 :
デフォルトの名無しさん :2005/08/11(木) 12:39:45
21 :
デフォルトの名無しさん :2005/08/11(木) 15:19:57
a
22 :
お願いします。 :2005/08/11(木) 15:23:12
[1]初心C++ [2] 問題文:後で。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:NET2003 [3.3] 言語: C++ [4] 期限:5時間くらい [5] その他の制限:Array,Struct,Class,Function,Strings(Pointer無し)
なにこいつ。問題文を用意してから纏めて書けよな。
制限が意味不明・・・
時間がどんどん過ぎてゆくww 5時間くらいっていつまでだwwww
26 :
お願いします。 :2005/08/11(木) 15:36:46
まず、Data Fileを見つける(下の英文)。そこには、 PhrasesとそのResponsesとが上から交互にリストしてある。 このDataFile名をchatbot.txtとする。 hello hello to you too my name is thank you for telling me your name your name my name is Mr. Computer my mother tell me more about your family I like to why do you like this I like I like that too my this sounds important to you I go to Tell me more about where you go I must what will happen if you don't do this bye goodbye
27 :
お願いします。 :2005/08/11(木) 15:37:49
例えば、ユーザーがhelloと入れたらコンピューターはhello to you tooと応える ファイルのデータをプログラム内のArrayにロードして、ユーザーのInputにパターンがあるか 探す。(find関数を使って)もしあれば、応える。Structとかも使ってよい。 ==は使ってはいけない。 もし”my name is mud" や"do you know my name is" のInputなら "thank you for telling me your name." と返す。 プログラムはランダムに選ばれる3つのDefaultResponsesも含んでなければいけない。 もし、適切なResponseがChatbotにないときにこの内の一つを返す。 ユーザーがbyeと入れたら、プログラム終了。 ユーザーInputを"I"以外全てLowercaseに変える。
酷い英語だ。
29 :
お願いします。 :2005/08/11(木) 15:47:26
英語のを日本語に訳したんですけど
なんか、ところどころ変な英語混ぜてルー大柴みたいな文章だな。
ワロタw つか酷い英語だと思ったら全部目的語を抜いてるのかよ。 "do you know my name is"ってなにかと思った。 私の名前が存在していることを知っていますかってなんじゃw で、制限についてもうちょっとまともな説明は無いのか?
要は人工無脳か。
33 :
お願いします。 :2005/08/11(木) 16:22:12
I hope someone is working for me,,,,
But anybody don't do it....
[2] 問題文: int a=1; int b=2; int c=3; void f(int x, int y, int z){ int b=0; a=a+x; b=b+y; c=c+z; printf("%d,%d,%d,",a,b,c); } main(){ int a; a=10; b=20; c=30; f(100,200,300); printf("%d,%d,%d\n",a,b,c); } の出力結果が 101,200,330,10,20,330になるのですが 理解できません。解説おながいします。 [3.3] 言語: C [4] 期限: [無期限]
>>35 グローバルスコープとmain()関数内スコープを持つ二つのaがあることは判るかな?
同様にグローバル変数とf()関数内ローカル変数の二つのbがあるわけだ。
cは唯一グローバルにしかないからこれが一番判りやすかろう。
cの出力の結果を踏まえて、aとbについても考えてみれば判るんでないかな?
37 :
35 :2005/08/11(木) 18:42:54
>>36 ありがとうございました。
とても解りやすい説明ですね。
モヤモヤが晴れてすっきりしました。
38 :
お願いします。 :2005/08/11(木) 23:28:58
39 :
お願いします。 :2005/08/11(木) 23:30:53
制限が糞過ぎてやる気にならん。 == つかうなってなんだよ。 std::map つかわせろよ。
41 :
お願いします。 :2005/08/12(金) 00:27:29
お願いしますよ〜 #include <iostream> #include <string> #include <fstream> using namespace std; string reply(string input) int main() { string chat[100000]; ifstream file; file.open("chatbot.txt"); for(int i=0; ; i++)file>>chat[i]; string input=" ", output=" "; cout<<"Hello! Talk to me"<<endl; do{ getline(cin, input); output=reply(input); }while(input!="bye");
42 :
デフォルトの名無しさん :2005/08/12(金) 00:30:18
return 0; } string reply(string input) { int p1, p2 p1=input.find("hello") ここまでやってつまってます。。。
ああすばらしきかなstringの値渡し。 マジセンスねぇ
データファイルを読み込む先が std::vector<std::pair<std::vector<std::string>, std::string> >になりそうだけど、いい?
>>41 一応動作するはず。
#include <cstdlib>
#include <ctime>
#include <cctype>
#include <fstream>
#include <iostream>
#include <string>
#include <utility>
#include <vector>
typedef std::vector<std::pair<std::string, std::string> > array;
array read_data_file(std::ifstream& data_file) {
std::string input, output;
array res;
while (std::getline(data_file, input) && std::getline(data_file, output))
res.push_back(std::make_pair(input, output));
return res;
}
void convert(std::string& str) {
const char delimiters[] = " \t,.;:\"?!";
std::string::size_type start_index = str.find_first_not_of(delimiters);
while (start_index != std::string::npos) {
std::string::size_type end_index = str.find_first_of(delimiters, start_index);
if (end_index == std::string::npos) end_index = str.length();
if (!(end_index - start_index == 1 && str[start_index] == 'I'))
for (std::string::size_type i = start_index; i < end_index; ++i)
str[i] = std::tolower(str[i]);
start_index = str.find_first_not_of(delimiters, end_index);
}
}
std::string random_response() { int r = rand() % 3; return r == 0 ? "yeah" : r == 1 ? "huh" : "hmm"; } int main() { std::srand(unsigned int(std::time(0))); std::ifstream data_file("chatbot.txt"); array res = read_data_file(data_file); std::string input; while (std::getline(std::cin, input)) { convert(input); array::iterator begin = res.begin(), end = res.end(); while (begin != end && input.find(begin->first) == std::string::npos) ++begin; if (begin == end) std::cout << random_response() << std::endl; else std::cout << begin->second << std::endl; if (input.find("bye") != std::string::npos) break; } }
47 :
予言 :2005/08/12(金) 01:00:27
次に
>>22 は、「vector は習ってないので使わないでできないでしょうか」と、言う。
48 :
45 :2005/08/12(金) 01:00:35
後はまぁ頑張って。
49 :
デフォルトの名無しさん :2005/08/12(金) 02:10:10
vecto(ry
[2] 10進数で最大64桁の正の整数を、同じく10進数で最大32桁の正の整数で割り、小数点第一位を四捨五入して答えを表示するプログラムを作成せよ。 [3] 環境 [3.1] OS: RedHat Linux [3.2] コンパイラ名とバージョン: gcc 2.9 [3.3] 言語: Cのみ [4] [2005年08月15日07:30まで] [5] その他の制限: 標準でインストールされないライブラリは使用不可
51 :
41 :2005/08/12(金) 04:55:13
#include <iostream> #include <string> #include <fstream> #include <ctime> #include <cctype> using namespace std; int main() { srand(time(0)); string chat[100]; string input, output, sentense; int p1, x, res; ifstream file1; file1.open("chatbot.txt"); if(file1.fail()) exit(1); for(int i=0; i<100; i++) { getline(file1, sentense); chat[i]=sentense; } cout<<"Hello! Talk to me."<<endl;
52 :
デフォルトの名無しさん :2005/08/12(金) 04:57:08
do{ getline(cin, input); for(int c=0; ; c++) {input=tolower(input[c]);} x=input.find(" i "); if(x>=0)input.insert(x+2, " I "); for(int i=0; i<100; i+=2) { p1=input.find(chat[i]);
53 :
デフォルトの名無しさん :2005/08/12(金) 04:57:43
if(p1>=0) { cout<<chat[i+1]<<endl; break; } } else //Default { res=rand()%3; if(res==0) {output="I have no response.";} else if(res==1) {output="Talk to me again.";} else {output="Try again.";} cout<<output<<endl; break; } }while(input!="bye"); return 0; }
54 :
41 :2005/08/12(金) 04:58:15
kokomade dekimasitaga umaku ikimasen teiseionegaisimasu
>>52 の4行目のfor文の終了条件が俺には見えないが・・・文字列長でいいんでないの?
あと
>>52 の7〜9行目みたいなのは、とりあえず大枠が完成するまで
コメントアウトしといてもいいと思う。。’I’を使わなくていいデータもあるから。。
以上C++は触ったこともない俺より。。データ型とか関数とかよくわかってないから
そのへんは他の方にtouch!!
んで
>>45-46 さんが書いてくれてるから見ときな。。
56 :
前スレの606、875です :2005/08/13(土) 23:06:08
すみません前スレより参りました。
前スレの
>>985 のコードを組み込んだのですが、強制終了してしまいます。
私の組み込み方が悪いのかも知れませんので、前スレ985のコードを取り込んだ
すべてのコードをロダにUPしていただけませんでしょうか。お力添えよろしくお願いいたします。
人に頼む方法もあるが、自分から情報を出すという手もある。 ・自分で手を入れたソース ・出てくるエラー ・強制終了の手順 をアップしてみたら?
58 :
前スレの606、875です :2005/08/14(日) 00:01:15
いや・・だから・・・ ・問題文(条件やら前提やら全部) ・あなたが修正を加えたソース ・操作手順(データファイル作って、次に読み込ませるところまで) ・データファイルの内容 ・もしコンパイル時にエラーが出るならそのエラー をUP。 答えられる人でも情報が小出しだと、面倒で答えたくなくなるから。 聴く人も丁寧にやらなくちゃ・・・ね?
60 :
デフォルトの名無しさん :2005/08/14(日) 00:33:37
>>56 ちゃんと動いたぞ。Linuxだけど。細かくは見てない。
61 :
前スレの606、875です :2005/08/14(日) 02:05:07
>>61 で、前スレ985(987)が来たわけだが。こっちに差し替えって読まなかった?
/* ファイルを読む */
void ReadFromFile() {
Person* person = (Person*)malloc(sizeof(Person));
FILE* stream = fopen(OUTPUT_PATH,"r");
if (stream) {
while (fscanf(stream,"%d%s%s",&person->number,&person->name,&person->position) == 3) {
person->next = NULL;
SetMember(person);
person = (Person*)malloc(sizeof(Person));
}
fclose(stream);
free(person);
}
}
63 :
デフォルトの名無しさん :2005/08/14(日) 12:18:11
[2] 問題文(含コード&リンク):ファイル内容を16進表記で表示するコマンドを作成せよ。 [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc 2.9 [3.3] 言語: C [4] 期限: 2005年08月15日まで [5] その他の制限: %xは使用してはいけない
>>63 #include <stdio.h>
#include <stdlib.h>
static const char* hexDigits = "0123456789abcdef";
static const char hexMask = (1 << 4) - 1;
static const int width = 10;
int main(int argc, char* argv[]) {
FILE* fp;
int len, bytes = 0;
unsigned char buf[256];
if(argc <= 1) {
fprintf(stderr, "こう使う。hexdump FILE\n");
exit(1);
}
if((fp = fopen(argv[1], "rb")) == NULL) {
fprintf(stderr ,"ひらけね\n");
exit(1);
}
while(0 < (len = fread(buf, sizeof(char), sizeof(buf), fp))) {
int i;
for(i=0; i < len; i++) {
putchar( hexDigits[(buf[i] >> 4) & hexMask] );
putchar( hexDigits[ buf[i] & hexMask] );
printf("%s", ((++bytes % width) == 0)? "\n": " ");
}
}
fclose(fp);
return 0;
}
65 :
デフォルトの名無しさん :2005/08/14(日) 13:44:29
%xがダメなら%Xを使えばいいじゃない。
おまえ、クビ。
王妃様に向かってなんてことを
69 :
デフォルトの名無しさん :2005/08/14(日) 16:59:26
整数のデータを線形リストに格納しているとする。リストは次のように 定義され、空はマクロNULLで表す。 struct TreeNode{ int value; struct TreeNode* left; struct TreeNode* right; }; 二分木と正の整数nを受け取り、nよりも大きな値を持つ要素の位置と 値を出力する、次のような名前と型を持つC言語の関数を定義せよ。 void printLargerForTree(struct TreeNode* data,int n); ただし二分木中のノードの位置は次のような数で表現することにする。 ・ルートノードの位置は0で表現される。 ・あるノードの位置がxで表されるとき、そのleft側の子ノードの位置は2x+1 そのright側の子ノードの位置は2x+2で表される。 この関数を定義するにあたって、printLargerForTreeの引数を一つ増やした 補助的な関数 void printLargerForTreeAux(struct TreeNode* data,int n,int pos); を再帰的に定義し、この関数を利用してvoid printLargerForTreeを定義せよ。 お願いします。
>>71 初心者なので間違ってたらごめんなさい(><)
char *str_insert(char *s1,char *s2,int pos)
{
char temp[255];
int i, j = 0, len;
for (i = 0; s1[i] != '\0'; i++); len = i;
if (len < pos) return NULL;
for (i = pos - 1; s1[i] != '\0'; i++, j++) temp[j] = s1[i];
temp[j] = '\0';
for (i = 0; s2[i] != '\0'; i++); len = i;
for (i = 0; i < len; i++){
s1[pos - 1] = s2[i];
pos++;
}
for (i = 0; temp[i] != '\0'; i++){
s1[pos - 1] = temp[i];
pos++;
}
s1[pos - 1] = '\0';
return s1;
}
>>71 #include <string.h>
char *str_insert(char *s1,char *s2,int pos)
{
size_t len1, len2;
len1 = strlen(s1);
len2 = strlen(s2);
if (pos > len1)
return NULL;
memmove(s1 + pos + len2, s1 + pos, len1 - pos);
memmove(s1 + pos, s2, len2);
s1[len1 + len2] = '\0';
return s1;
}
>>69 大きいノードすべてを表示するのか、それとも1つだけでよいのか
>>74 すいません。
大きいノード全てを表示します。
void printLargerForTree(struct TreeNode* data,int n) { printLargerForTreeAux(data, n, 0); } void printLargerForTreeAux(struct TreeNode* data,int n,int pos) { if (data == NULL) return; if (data->value > n) printf("% 3d %d\n", pos, data->value); printLargerForTreeAux(data->left, n, 2 * pos + 1); printLargerForTreeAux(data->right, n, 2 * pos + 2); }
>71 元の文字列が250文字あって、たとえば50文字を挿入するとかってヤヴァくね?
>>77 宿題だし。それに、それを呼び出し元が管理するか呼び出し先が
管理するかはポリシーの問題。
79 :
77 :2005/08/15(月) 00:46:05
>78 でも挿入位置のチェックだけは呼ばれた側でやるの?おかしくね?
与えられた引数でできることはするポリシーなんだよ、うぜーな
>80 でも与えられたポインタがNULLかどうかはチェックしない、と
テストケースからプログラム作ることで、そこら辺の曖昧さを明確にせざるをえない
str系のNULLチェックしないのはスタンダードポリシーだ
たとえば、 strcpy()の受け側の文字列が十分に大きくない場合 (つまり、プログラマが間抜けか不精で、 コピーする前にサイズをチェックすることを怠った場合)、何が起こるかわからない。 固定長文字列を溢れさせるのはクラッカーが好むテクニックである。
じゃあ、どうすればいいの?(;´Д`)
課題出してる人だってわかって書いてるだろ ただの宿題なんだろうし。
>88
すまん、簡単すぎて食指が動かん。
んー・・?
たぶん
>>71 と同一人物だろうが、前の奴らに礼くらいしたらどうだ?
高専だか何だか知らないが、 こんな簡単なものも自分で解けなくて、本当に卒業出来るのだろうか。
仕事を回されたとき自分じゃできず、周囲に迷惑をかけるぱたーん?
>92 君は?
このスレでCを勉強してるものです
>94 ワロス 問題文よく嫁w
>96 >(男:'M' 女:'F') とあるが'M','F'以外の入力もおけ かつ'M'以外なら女にしてもおけ?
>>88 #include <stdio.h>
#include <string.h>
struct data {
char name[100];
char sex;
double sintyo;
double taiju;
};
int main(void) {
double d;
char buf[2];
struct data person;
for (; ; ) {
printf("名前入力:"); scanf("%s", person.name);
if (!strcmp(person.name, "end")) break;
printf("性別入力:"); scanf("%1s", buf);
person.sex = buf[0];
printf("身長入力:"); scanf("%lf", &person.sintyo);
printf("体重入力:"); scanf("%lf", &person.taiju);
d = person.taiju - (person.sintyo - 100) * 0.9;
printf("\n%s%sは、平均体重より%fkg%sです。\n\n", person.name, person.sex == 'M' ? "君" : "さん", d > 0 ? d : -d, d > 0 ? "多い" : "少ない");
}
return 0;
}
>98 >97
>98 %c
>>100 改行が残ってバッファをクリアしたりするのメンドイ。
>101 なるへそ (もれだったらgetchar()かな)
スペース空ければ
100以下の場合を考えなさいに見えた。orz #include <stdio.h> #include <string.h> struct data{ char name[100]; char sex; double sintyo; double taiju;}; int main(void) { struct data unko; while(1) { int namelen = 0; double heykin; const char* govi; printf("名前入力:"); fseek(stdin, SEEK_END, 0); while(namelen < sizeof(unko.name)) { int c = getchar(); if(NULL != strchr("\n\r", c)) { fseek(stdin, SEEK_END, 0); break; } unko.name[namelen++] = c; } if(namelen == sizeof(unko.name)) { printf("名前長っ!\n"); break; } unko.name[namelen] = '\0'; if(strcmp(unko.name, "end") == 0) break; printf("性別入力:"); scanf("%c", &unko.sex); if(unko.sex == 'M') govi = "君"; else if(unko.sex == 'F') govi = "さん"; else { printf("ホモお断り。\n"); break; } printf("慎重入力:"); scanf("%lf", &unko.sintyo); heykin = (unko.sintyo < 100.)? 0.9 / ((101-unko.sintyo) * 2.): (unko.sintyo - 100.) * 0.9; printf("体重入力:"); scanf("%lf", &unko.taiju); if(unko.taiju < heykin) printf("%s%sは、平均体重より%.1f少ないです。\n", unko.name, govi, heykin - unko.taiju); else printf("%s%sは、平均体重より%.1f重いです。\n", unko.name, govi, unko.taiju - heykin);} return 0;}
>printf("ホモお断り。\n"); break; end入力以外でかってに終了するのはいくない
まじっすかorz
問題に書かれていないことならどうなっても問題ないと思うけど? 例え format c: とか rm /* とか動いてもw
エラーメッセージ吐いて終了してるから問題ないべ。
つまらん宿題だと思ったが、対話型データ入力の例外処理をどう扱うかが主題だったら深いかもしれないねコレ。
110 :
96 :2005/08/15(月) 20:20:25
>>97 性別として男と女しか認めないのはあまりに保守的で時代遅れだと思った。
それから、「さん」は性別にかかわりなく使える一般的な敬称だと思ってそうした。
反省はしていない。
>>97 実用的には、「男」「女」以外に「不明」が必要だな。
不明はともかく 未回答とかはありかも(webのアンケートとか)
そーいや、アホがラジオボタンじゃなくてチェックボックスでつくってたな。 未回答、男、女、男女の4通りの答えがあった。 てか、燃料くれよ。
>>113 理にかなってるだろそれは。
まあ欲を言えば、チェックボタンを押す順番も取得したいところだが。
115 :
デフォルトの名無しさん :2005/08/16(火) 00:44:41
>>88 構造体の再利用は考えないでいいのか?
一人目以降のデータを上書きだと実用的じゃないよな?
>>115 宿題ごときに実用もクソもないと思われ。
このレベルの問題で再利用もクソもないと思われ。
こんなデータを上書きされても別に誰も困らないと思われ。
というか、常に上書きするのだったら構造体みたいなのじゃなくて単独変数でいいやん
118 :
デフォルトの名無しさん :2005/08/16(火) 01:04:24
だよね〜
119 :
デフォルトの名無しさん :2005/08/16(火) 01:34:01
120 :
88 :2005/08/16(火) 01:35:24
あぁぁぁ、いきなりヘンなとこ見つけた……
え?今更上書きバージョン?
122 :
88 :2005/08/16(火) 01:41:03
ダメ? なら直してくるよ。
123 :
88 :2005/08/16(火) 01:46:40
これらが未使用変数ですよ char NAMAE[100]; char SEX; double SHINTYOU; double TAIJYUU;
125 :
88 :2005/08/16(火) 01:54:38
あぁぁあ、ゴメン。 それさっき気付いたんですけど、また更新前のを送ってしまいました。orz
つか玉拾い&玉磨き
それって肉便器の事?
取り敢えず88はあんまり関係無いという事は分かった。
131 :
119 :2005/08/16(火) 09:30:29
ナチュラルに間違えていたんだけど、88 ≠ 119 です。
マジゴメン。吊ってくる。ってか、
>>129 の解読が出来ない… orz
132 :
129 :2005/08/16(火) 09:50:13
おれも間違えた.. 88ってのは宿題出してきた奴だった。こんなの提出しないだろうなぁ 866.cの修正点として2点 1)PERSON_INIT_NUMを0に設定するとセグフォがでるのを修正 2)引数なしで起動なら標準入力からで、コマンドラインからファイル名を入力したら それを読み込むように変更しました.要望があればうpします あとは、気が向いたら読み込んだデータをsqliteを使って保存するように変更してみますか
>>88 kumikoさんがあり得ないほど太っている件
>>88 体重と平均体重が一緒の場合はどうすればいい?
135 :
デフォルトの名無しさん :2005/08/17(水) 01:34:12
#include<stdio.h> double menseki(double,double); int main() { double a,b,c; c=menseki(a,b); printf("底辺--"); scanf("%lf",&a); printf("高さ--"); scanf("%lf",&b); printf("面積は%.2fです\n",c); return 0; } double menseki(double a,double b) { double c; c=a*b/2; return c; } 面積が0.00になるんですが、どうしてでしょうか?
>>135 0.00になるだけまし
a, bが不定なのに参照している
未定義動作。ハードディスクをフォーマットされてな
そんなプログラムを動かすなら、パソコンが壊れたときの責任は免責させてください。
>>136 自分でa,bを自分で入力して面積をだしたいと思ったのです
「自分で」使いすぎちまった
>>139 だから何なんだ?w
1. 自分でa,bを自分で入力して
2. 面積をだしたい
その順序で組めよ
なぜa, bが不定なのか考えたのか?
プログラミング言語を数学的に解釈していると思われる。 cは関数mensekiで定義される・・・とかかんがえてるんじゃなかろーか。 この手の説明をキチンとするには、プログラミングの代入ってどんなんとか、 関数は定義と呼び出しがあるんだとか、順番だとか、副作用だとか。のーみそがおかしくなる。
>>143 >cは関数mensekiで定義される
なんかそんな感じです。
本見ながらやってるんだけど
面積を求める関数を作れみたいな問題でした
>>144 プログラムでは数学で混用されている(という認識はないかもしれないが)
3種類のイコールが区別される。3種類のイコールとは、恒等(==)、代入(=)、
定義(関数の定義によって行う)。
エディタでプログラムを書いてセーブする →ソースファイルが出来る ソースファイルをコンパイルする →実行ファイルが出来る 実行ファイルを実行する →メモリにプログラムが読み込まれ、下準備した後main()から実行される。 メモリにはコード領域、スタック、ヒープがある。 ソースコードにはコード領域とヒープ領域の一部を書く。 実行時にはコード領域の内容を順次実行する。 なんか、上手な説明がないかなぁ。
そこまでディープに説明したらフォンノイマン型コンピューターの 仕組みとか解説する勢いだな。
・main関数の上から順に実行される ・自動変数は最初はゴミが入っているので代入して綺麗にしないといけない ・変数は演算、代入で値が変わる で、最後に これらを踏まえた上でアルゴリズムを組みましょう 最初のうちはこんなもんでいいんじゃない?
やっぱりスレタイにぼるじょあが入ってないと人が寄ってこないな
いや、普通に夏休みだからだろ。
夏だな。 他のスレでは別の意味で使うが(^^;;
ftpやnslookpuコマンドで使われているような 簡易シェルを作れと言われているんですが、 こんな感じですか? 問題点があったら教えてください。 int main() { char buffer[0x100]; for(;;) { printf(">"); if( gets(buf)==NULL) { break; } printf("入力されたコマンドは%sです\n",buffer); } return 0; }
>>153 gets 関数は境界チェックが無くて危険なので fgets 推奨。
あとは特に問題はないと思う。
155 :
129 :2005/08/20(土) 00:33:51
特に問題ないというか・・・
まだ他人に評価してもらうほどのものじゃないぞ・・・
printf(">");のあとにfflush(stdout);するのがいいんじゃないか
気をつけるべき点は
>>154 が言ってるようにユーザからの入力部分だな
バッファオーバーフローの話はいつまでたってもなくならんね
readline()使うとか。。プラットフォームに依存しちゃうか
あ、アンカーミス 155≠129です スマソ
>>157 どういう細線化のアルゴリズムを採用したか。
どういう結果になるつもりか。
実際にはどういう結果になったか。
これらの情報があるとヒントが出せると思う。
>>155 fflushは必要ない
getsの段階でflushされる
160 :
デフォルトの名無しさん :2005/08/20(土) 13:36:53
文字の配列に平仮名を格納して一文字ずつ取り出し、 あ〜おはアルファベットに直し、それ以外は 'N' を表示するプログラムを作れ、という問題で とりあえず 'あ' だけ処理してみようと以下のルーチンを作成してみたのですが 'N' しか表示されません。 どうすれば正しく表示されるのでしょうかorz #include <windows.h> #include <stdio.h> void main() { WCHAR* temp = L"あいうえおかきくけこ"; for(int i = 0; i < wcslen(temp); i++) { switch (temp[i]) { case 'あ': printf("%c", 'A'); break; default: printf("N"); } } }
>>161 ああああ!Lが抜けてたのか!
申し訳ない。orz
無事解決しました。ありがとうございました。
ところで
>>160 を作っていてふと思ったのですが、
>>160 のようにあ〜おだけでなく
ひらがな全てをアルファベットに直す場合はどうするのでしょう?
地道に全てのひらがなに対応したswitchを用意するものなんですか?
変換テーブルでも使え。
変換テーブルですか。調べてみます。
うう。夏が終わる。 がむばってlisp組みます。はい。
167 :
デフォルトの名無しさん :2005/08/22(月) 00:19:07
いきなり何を言い出すんだ
夏休みの宿題に言語を作れって言われてた奴とちゃう?
前スレで報告済みでありますが、夏休みの宿題を出されたのであります。 とりあえず、アトムとconsセルをどーやって表現するか決めるであります。
なんでもいいから言語を作れって宿題だけど、言語として空集合というのは どうでしょうか? するとそれをコンパイルするコンパイラは次のような仕様になるはずです。 1. 入力が空ならなにも出力せずに正常終了。 2. 入力になにかあったら"Syntax Error" を出力して終了。 これなら Hello World に毛の生えたようなプログラムでコンパイラが作れるはずです。
しかし問題はそれをプログラミング言語として認めてもらえるかが問題。 最低限、何らかの制御構造があるべきだと思う。
ごめん、再度書きます。 [1] 授業単元: 夏休みの宿題 [2] 問題文(含コード&リンク): コンパイラまたはインタプリタを設計/実装せよ。以下の機能をつけること。 変数、式、配列、関数定義/呼び出し、組み込み関数、制御構造 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ(バージョン): MinGW [3.3] 言語:C [4] 期限:9月1日まで [5] その他の制限:文法はひととおり
PostScriptインタープリタ書いてみるとかw
うーん。そこまでばっちり書いてあると逃げようがないね。 Smalltalk なんか制御構造無いっていえばないのに。 まあ式は代入だけで演算子なしでおっけーだろうけど。 組み込み関数は +1 と =0? と出力命令位でいいのかな? マシン語みたいに配列は一個固定、1 byte だけ入れられるにして、 変数も一個だけ 制御構造は変数が0の時だけ次の命令を実行しないと、goto文でも付けておけば いいかな? 関数定義はめんどくさいね。スタック作らないとだめなのかな?
一番簡単なPascalインタープリタでも作れば? p-code吐くソースならどこにでも転がってる希ガス。
オリジナルでいいなら、Lisp風が一番簡単なんじゃない。
177 :
デフォルトの名無しさん :2005/08/22(月) 13:48:34
0から100まで乱数で発生したデータファイルがあって、そのデータを整理したいです。 元のデータ 30 9 88 78 89 13 90 54 10 整理されたもの 0〜9 1個 10〜19 2個 20〜29 0個 : : お願いします
>>177 エクスプローラーでファイル名順に並べ替えてやれば、
0、100、一ケタ台を除けば全部固まってるだろ。
それを矩形でまとめて選択してフォルダに放り込む。
もしかしてプログラムで整理?
データファイル内にデータが入ってるんでない?
>>177 とりあえず書いた
テンプレに従ってないので勝手にGCC(ANSI C)だってことにした
ファイルにそういうデータが書いてあるのを読み込んで処理すりゃいいんだよな?
#include <stdio.h>
int main(void)
{
FILE *fp;
unsigned int count[10] = {0};/*個数*/
int temp;
if ((fp = fopen("infile", "r")) == NULL) exit(1);
while (fscanf(fp, "%d", &temp) == 1) {
count[(int)temp/10]++;
}
for (temp = 0; temp < 10; temp++)
printf("%d~%d\t%2d個\n", temp * 10, temp * 10 + 9, count[temp]);
return 0;
}
//0から99まででいいのかな? #define FILENAME "file.txt" #include <stdio.h> int main() { int ans[10]={0}; char buf[3]; FILE *fp=fopen( FILENAME ,"r"); if(!fp) {return -1;} while(fgets(buf,sizeof(buf),fp)) {ans[atoi(buf)/10]++;} for(i=0;i<10;i++) {printf("%d〜%d \t%d個\n",i,i+9,ans[i]);} fclose(fp); }
182 :
181 :2005/08/22(月) 14:19:44
かぶったゴメン・・・
つ qsort()
>>180 0から100だから、101通りあるよ。
>count[(int)temp/10]++;
0〜9の配列で10にアクセスしてしまう。
>unsigned int count[10] = {0};/*個数*/
これだと配列の最初だけしか初期化されないでしょ。
配列11個とって
{0,0,0,0,0,0,0,0,0,0,0};
またはSIZEOF(count)領域を初期化
>>181 > char buf[3];
これも2桁前提か。
データファイルが壊れてたらバグるな。
出力時ならいいけど、入力時はfgetsの最大値までちゃんととらんと。
> if(!fp) {return -1;}
> {printf("%d〜%d \t%d個\n",i,i+9,ans[i]);}
中括弧は外したほうがまし
または
if(!fp) {
return -1;
}
と表記して行の追加、削除をしやすくしたほうがいい。
行丸ごとコメントアウトしたり追加、削除したときに中括弧の対応が変わる。
186 :
180 :2005/08/22(月) 14:41:36
>>184 手元のK&Rには初期化子が少ない場合には0で埋められるって書いてあるが
まぁどっちにしろ100の存在忘れてた・・・
>>184 >これだと配列の最初だけしか初期化されないでしょ。
が意味わかんないし、
>>181 は1行目に0〜99って書いてんだろ。。
しかもここは中括弧とかのお話するところじゃないのよボーヤ
この場合sizeof(count)ってsizeof(int)と同じじゃない? sizeofで配列のサイズなんか取れたっけ?
189 :
180 :2005/08/22(月) 14:57:05
>>188 sizeof(配列名)の場合は配列全体のサイズじゃなかったっけ?
sizeof(配列名)/sizeof(配列名[0])で個数求めるとか、何処かで見た希ガス
>>186 >初期化子が少ない場合には0で埋められる
知らなかったけど、これは目的の0とデフォルトの0が一致してるから省略可能
になってるっていうことを誤解しやすいよ。
配列がたくさんあると全部書くのは大変だけど。
static とかグローバル変数の宣言によっては初期化されないとかなかった?
全然覚えてないけど、コンパイラのバグとかもあったと思うし。
ヘッダで複数のファイルにインクルードするときに条件があったような。
サイズの違うバッファのコピーとか移動とかでゴミが残ったりとかもあるし
>>187 バグはオマエの脳内だけにしてくれよ。
出題で0〜100って書いてあるだろ。
それを勝手に〜99に変更してるだろ。
「やっぱり〜100だよ」と言われたら3箇所の修正が必要になる。
>unsigned int count[10] = {0};/*個数*/
> char buf[3];
> for(i=0;i<10;i++)
> char buf[3];
の修正を忘れたら壊れるだろ?
fgetsはバッファのサイズなんかチェックしてくれないぞ。
>>188 マクロのSIZEOFなんだけど、配列だろうとアロケートメモリだろうと
適切なサイズを取ってくれる。
初期化やコピー、サイズ比較するとき便利だし、サイズ変更時の修正もいらない。
sizeof(int)では、変数の型が変更されたら食い違うので使わない。
せいぜいsizeofの動作やintのサイズを確認するときくらい
191 :
188 :2005/08/22(月) 15:06:48
ああ、スマン。調べてみたら出来るっぽいね。なんか勘違いしてたっぽい
>fgetsはバッファのサイズなんかチェックしてくれないぞ。 >fgetsはバッファのサイズなんかチェックしてくれないぞ。 >fgetsはバッファのサイズなんかチェックしてくれないぞ。 >fgetsはバッファのサイズなんかチェックしてくれないぞ。 >fgetsはバッファのサイズなんかチェックしてくれないぞ。
夏廚多すぎ あんびりばぼーなスレになってるw
195 :
181 :2005/08/22(月) 15:17:48
>>190 なんかスレが汚れてきててすごくいやなんだが、
とりあえず自分の見解を(多分また荒れるから今日はもう来ないぞw)
もし0〜100なんだったら
>0〜9 1個
>10〜19 2個
>20〜29 0個
> :
> :
という仕様の設定があいまいになるよな。100はドコに入るんだって。
あなた様は100は特別だ、ということでans[11]にしたいようだが、
そんなことは喪前の脳内で決まったことであってそれこそ書いてないぞ。
あと知ったかブリはやめとけyo
いつもニヤニヤしながら見てるよw
>>192 sizeof(buf) でサイズ指定してあったな。
確か割り当ては3バイトだな。
1、0、0、・・・NULLは入らないから、ま、いっか。
>関数は、入力文字列の読み込み時に、数値の一部として認識できない文字が現れた時点で停止します。
>この文字は、文字列の終わりを示す NULL ('\0' または L'\0') の場合もあります。
ふんふん。100として認識だな。どこを終端と認識してるんだろ。
bufの外には文字入れてないから問題ないだろうな。
さて次の文字だ。
¥r¥n
ん?改行コードを読み込めなかったか。
これは、0だな。
0〜9としてカウントすれば問題なし。
てことですか?
>>177 テンプレ書いてないんで勝手にC++ってことにした。
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::ifstream ifs("data.txt");
std::vector<int> v;
std::copy(std::istream_iterator<int>(ifs), std::istream_iterator<int>(), std::back_inserter(v));
std::sort(v.begin(), v.end());
for (int i = 0; i < 100; i += 10) std::cout << i << "〜" << i + 9 << '\t' << (std::upper_bound(v.begin(), v.end(), i + 9) - std::lower_bound(v.begin(), v.end(), i)) << "個" << std::endl;
std::cout << 100 << '\t' << (std::upper_bound(v.begin(), v.end(), 100) - std::lower_bound(v.begin(), v.end(), 100)) << "個" << std::endl;
}
>>195 >そんなことは喪前の脳内で決まったことであってそれこそ書いてないぞ。
書いてないことを都合のいいように定義するのは問題ない。
>>198 も
>テンプレ書いてないんで勝手にC++ってことにした。
って書いてる。
でも、はっきり書いてあることを勝手に変えた場合、
それが及ぼす影響はすべて変えたやつにある。
責任とれよってことだ。
>>199 文字列はNULLで終わる。
だから文字を読み取った後にNULLを追加してくれる。
しかし、バッファの最大値まで文字で埋まった場合はNULLを入れる場所がない。
だからMSのIEもアドレスが長すぎるとバグってた。
>それが及ぼす影響はすべて変えたやつにある。 それが及ぼす影響はすべて変えたやつに 責任が ある。
>しかし、バッファの最大値まで文字で埋まった場合
203 :
デフォルトの名無しさん :2005/08/22(月) 15:35:09
1 + 1/r^2 + 1/r^2 +・・・・+1/r^n rとnを聞いて と求めるプログラム を頼みます
>>202 はいはい。
ごめんなさいね。
バッファの最後までって書けばよかったね。
>>203 計算誤差はどう計算しますか?
ちなみに漏れは作れません。
>バッファの最後までって書けばよかったね。 ・・・orz
>計算誤差はどう計算しますか? >計算誤差はどう計算しますか? >計算誤差はどう計算しますか? >計算誤差はどう計算しますか? >計算誤差はどう計算しますか? >計算誤差はどう計算しますか?
>>203 1 + 1/r + 1/r^2 + … 1/r^n じゃないの?
桁あふれる?それがわかんないと。。 ってかマルチじゃねぇ?
>>206 nが大きいとあふれるし、少数以下の桁数が少ないと誤差が大きくなるから
そこを考えて計算しないといけないでしょ?
>>209 計算誤差を計算してもその計算において計算誤差が出ます
211 :
209 :2005/08/22(月) 15:46:57
あ、プログラム作ってからその問題を解決していきましょうってことかな?
>>210 だから、誤差を小さくするよう努力するとか、
プログラムがどこまで正常動作するかを計算してそれを仕様とするとか、
そういうことなんじゃないかと思ったんですが。
カレンダーにしたって何年から何年まで正しく動作するとかあるでしょ。
212 :
デフォルトの名無しさん :2005/08/22(月) 15:49:02
誤差は適当でいいだす 数字あふれてもかまいません
>>203 とりあえず3項目はtypoということで。ついでにCで。俺(==
>>198 )節操ないなぁw
#include <stdio.h>
int main(void) {
int n, r;
double t = 1, a = 1;
printf("n?:"); scanf("%d", &n);
printf("r?:"); scanf("%d", &r);
while (n--) a += t /= r;
printf("%f", a);
return 0;
}
214 :
デフォルトの名無しさん :2005/08/22(月) 15:52:44
cで書いてくれるのが ベストです(・ω・)
>>203 日本語がおかしいな。大丈夫か?
#include<stdio.h>
#include<math.h>
int main(void)
{
int n;
int r;
double result = 0;
printf("input n?:"); scanf("%d", &n);
printf("input r?:"); scanf("%d", &r);
int e;
for(e=0; e<n; e++)
{
result += 1 / pow(r, e);
}
printf("n=%d, r=%d, result=%lf\n", n, r, result);
return 0;
}
>>216 >>203 は1/r^nまで足してるからfor(e=0; e<=n; e++)じゃないかな
218 :
216 :2005/08/22(月) 16:16:17
>>217 そうだった・・・指摘ありがトン
あと、
>>203 へ
>>216 の結果は 1/r も含まれてるので、
入れたくなかったら自分で考えてループ調整してくれ。
219 :
デフォルトの名無しさん :2005/08/22(月) 16:20:18
218さんありがとう 1 + x/1! + x^2/2! + x^3/3! +・・・・+x^r/r! をとくプログラム xとrをきくかたち 教えてください(>Д<)
// x をきくかたち printf( "? x = " ); scanf( "%d", &x ); // r をきくかたち printf( "? r = " ); scanf( "%d", &r );
221 :
177 :2005/08/22(月) 16:36:58
皆さん素早い解答ありがとうございます。 書いていただいたことを参考にしてやってみます。
222 :
216 :2005/08/22(月) 16:47:23
>>219 計算結果が合ってるかどうかは自分で確かめて。
#include<stdio.h>
#include<math.h>
static long factorial(int n)
{
long result = 1;
while(n > 0){ result *= n--; }
return result;
}
int main(void)
{
int x = 2;
int r = 2;
double result = 0;
printf("input x?:"); scanf("%d", &x);
printf("input r?:"); scanf("%d", &r);
int n;
for(n=0; n<=r; n++)
{
result += pow(x, n) / factorial(n);
}
printf("x=%d, r=%d, result=%lf\n", x, r, result);
return 0;
}
223 :
213 :2005/08/22(月) 16:50:56
>>219 #include <stdio.h>
int main(void) {
int r, n = 0;
double x, t = 1, a = 1;
printf("x?:"); scanf("%lf", &x);
printf("r?:"); scanf("%d", &r);
while (n++ < r) a += t *= x / n;
printf("%f", a);
return 0;
}
224 :
216 :2005/08/22(月) 16:57:54
225 :
213 :2005/08/22(月) 17:05:59
226 :
219 :2005/08/22(月) 17:17:24
皆さんありがとう!!!!
227 :
216 :2005/08/22(月) 17:48:43
ほんと今更だが、 質問する香具師はちゃんとテンプレ書けよな。
(・3・)エェー 俺も日本語ならわかるYO!
229 :
165 :2005/08/23(火) 19:41:24
>>164 お陰様でstd::mapなんて便利なものがあることを知り、
平仮名文章→ローマ字プログラム作れました。ありがとう。
lisp組んでます。 ・・・とりあえず、空白とコメントを読み飛ばす処理を書きました。 次はトークン一つ取ってくるところです。 でも課題は山済み。 ・データ型の内部表現 ・式の構造解析 ・プリミティブな関数 ・値の放棄のタイミング決定 あう゛。終わんない。
つ Boost.Spirit
>>231 豪華すぎ。
yaccで充分というか、あんなの自前でやるべき。
それこそlispの醍醐味というもんだろ。
トークン切り出しはそっちのけで、内部データ構造の案。 最初はどーしよーもないんで、数、シンボル、リスト、関数型のみ扱うことにします。 #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]; 悩む。
>>234 実行例見ると12と33が出現回数同じだけど、
そういうときってどうするの?
テキトーでいいの?
236 :
234 :2005/08/24(水) 18:30:50
条件1に、最頻値が複数ある場合は、最も大きい値のデータを表示対象とする。とあるので 33が出るようにお願いします。わかりにくくて申し訳ないです。
>>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;
}
238 :
234 :2005/08/24(水) 19:17:52
>>273 さん
ありがとうございました。
num = num > 0 ? num < 20 ? num : 20 : 1;
の部分は学校では習っていなかったので、ここだけ
if(num > 0 && num <= 20){〜条件に合致すれば入力処理へ進む〜
}else{合致しなければおしまい
といった形にいじらせてもらいました。では失礼します。
239 :
234 :2005/08/24(水) 19:18:52
いんたぷりたorこんぱいらの男です。 もぉあきらめました。ご意見をくださったかた、心があたたかくなりました。 ご好意に添えないことが残念です。 友人にみせてもらって共同で作ったことにさせてもらいます・・・。 友人も出来てないみたいですが。なんとかやってくれるでしょう。
しかし最近の高専ってレベル高いのな。 高校生とは言え宿題でコンパイラは辛いだろ。 俺だって一月でCコンパイラ作ってこい言われたらキツいぞ。
>>241 ネットに転がってるのが前提なんじゃない?
専門学校でCASLアセンブラ作れって課題は出てたが、漏れはさっぱり分からなかった。
yaccで逆ポーランド記法のインタプリタを作らされたことならあるぞ。
RPNなんて7行プログラミングの管轄だろw
7行か……#includeを書かないのが美学?
#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]; }
>>247 が↑のMax()とMin()の中身を理解できてるか心配。
>>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]);
}
いけずなおまいらが大好きです
>>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];
}
>>247 のに挑戦してたんだけど、なるだけ汎用的な
Max(int*),Min(int*)に仕上げようと思って
渡された配列の要素数を計算しようとしたのですが
sizeof(src)/sizeof(src[0])でうまく出なかったので
何でなのかと弄ってたら、srcは関数内ではあくまで配列の
先頭へのポインタでしかないからsizeof(src)してもダメなのは
当然だという所までは気づいたんですが、こういう場合
要素数はどうやって求めればいいんでしょう?
やっぱり配列を扱える方で計算した上で引数として渡すしかないんでしょうか?
srcはmain()のローカル変数として宣言してます
int Max(valarray<int> &src) { return valarray.max(); }; int Min(valarray<int> &src) { return valarray.min(); };
>>253 引数で渡すしかない。
C++だといろいろと回避法はあるけど。
汎用的にするならこうなるのかな 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; }
[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の数値を扱う再にオーバーフローが起きてしまいます。 その部分の解決方法についておねがいします。
>>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;
}
>>260 無駄にそこまでこるならC++でテンプレート使えばいいじゃない。
262 :
258 :2005/08/26(金) 22:39:42
>>262 いろいろ目をつぶったら何も見えなくなった。
って後半(2->10)も何もないじゃないかあ〜!
(後、結果の保持or出力の形式の条件(有無さえ)が不明だなあ。
128桁の2進数値の保持に 128bit以上の整数型が必要になるのは理解済み?)
そのあたりは理解しています。 数値ではなく、文字として処理して計算?という案はあるのですが 加算処理をどう表現していいのかがわからず、です。 計算結果はそのまま 123456798456132・・・というふうに表示し、プログラム終了です。
>>266 文字として処理っていうのは筆算での掛け算をするってことか?
268 :
258 :2005/08/27(土) 02:37:59
桁数が大きくなると、普通に数値として計算ができなくなるので 数字の足し算を文字と文字の組み合わせで表現すればいいのでは?と考えてました。 1と1が組み合わさるときは2、1と2が組み合わさるときは3・・・とパターンを決めて計算を表現するということです。 うまく説明できない・・・ とりあえず、普通の足し算を行うのはあきらめる気でいました。
>>266 > 数値ではなく、文字として処理して計算?という案
10進数の数値に対して 1桁に1バイト割り当て&その値空間が '0' 〜 '9' ってことか?
270 :
258 :2005/08/27(土) 02:48:51
>>269 まさにそのとおりです。
と、ここまで書いておいて別の方法に気がつきました。
大きな数を4桁ずつとかに区切り、配列に格納したモノ同士を足していくほうが
繰り上がりの問題も含めて単純に解決できそうです。
今まで考えでは1桁ずつ計算していましたが、こちらのほうが楽かつ簡単な気がします。
考えがまとまらずにフラフラしてしまって申し訳ありません。
なかなかうまく進まず焦ってしまっています。
一旦自分で考え直してもう一度質問すべきことを練り直します。
[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乗の場合があるわけでターミナルに上のように表すのはどうかと思うので エクセルなどでヒストグラムを作れるようにすること。といわれました。どうかよろしくお願いいたします。
いちおう確認させてもらう。 習ったデータ構造は?(2分探索木、ハッシュ、mallocする形の二次元配列) 習ったバイナリファイルを読み込む方法は? 出力はアスタリスクの横棒とエクセルファイル、どちらを作ればいいの?
>>271 普通にバイナリモードで開いて、freadでunsigned longの変数に
放り込めばよくないか?
俺の教科書だと、 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)とかだと、処理系依存じゃねぇか?
>>272 習ったデータ構造についてですが、正直授業についていけなくてわかりません。
出力についてですが、0〜2の32乗の値のそれぞれの出現頻度をグラフ化したいわけで、
アスタリスクの横棒ですとターミナルに表示するのは非常に困難だと思いますし、
もし可能であれば、出力されるファイルをエクセル形式のファイルにして、それを
エクセルで開いて、縦軸に0〜2の32乗それぞれの出現頻度が、
開いたエクセルファイルに10進法で書かれていれば、それらから
グラフを作りたいなと考えております。
他の方法としても、ターミナルに一度に0〜2の32乗の出現頻度を表示することはできないので
100づつくらい、出現頻度を表示させておいて、それをエクセルに少しずつこぴぺしていこうと
考えております。私の発想ではこのくらいのことしかおもいつかないのですが
もっといい方法があったらそちらでプログラムを組んでいただけると助かります。
私の説明不足なために理解に苦しまれるところがたくさんあるとは思います。すみません。
エクセルも64K行しか作れないわけだが。
>>273 私がやってみた方法は、
#define BIG 2の32乗
hisutoguramu[BIG]という配列を用意いたしました。配列を初期化して
そして
hisutoguramu[in_data[i]]=hisutoguramu[in_data] + 1 ;
in_data[i]というのは元ファイルを4バイトずつ読み込んでいるものでiは
元ファイルのサイズ/4までしかループさせない
というふうにしてプリントfで表示させる方法をしてみようとしたのですが
できませんでした。セグメンテーション違反もでまして、無理でした。
>>276 それは知りませんでした。
何かいい方法で、0〜2の32乗を横軸とし、縦軸を出現頻度としたグラフは作成できないのでしょうか?
>>278 試しに、2の32乗がどんな値か計算して味噌。
できれば、それを表示するためにどれだけのメモリが必要になるかも。
#こいつの頭は大丈夫なんだろうかと不安になる恭子の頃。
>>278 そもそも2^32もの行(列)数をグラフ化できるソフトなんてあるのか?
>>279 4、294、967、296ですね・・・。
四十億ですね・・・。
無知ですみませんでした。
あとエクセルで確認したところ65536までしか縦軸がありませんでした
口頭で聞いた問題でしたので、271ような課題を出す先生はいらっしゃらないと思ったほうが
いいのでしょうか?
テンプレに書かれているように、問題文を途中で帰るのは失礼だとは思いますが、
少し変えさせてもらってもよろしいでしょうか?
Linuxならgnuplot用のデータ吐けばいいんでないか?
>281 変えるのならどうぞ。 >271ような課題を出す先生はいらっしゃらないと思ったほうが いいのでしょうか? 宿題としては、難儀です。32ビットだとデータ構造とかファイルサイズとか気にするんで。 限界に近いところでプログラムを組むことを経験させる・・・という意図ならありです。 なにか別の作業の一環でやってるなら、全データを扱うっていうのはヘンかな・・ 出現数が上位のものをリストアップする・・・とか。ある範囲で区切るとかするんじゃないかな。 モトのデータが何で、どういう目的で使いたいのかが分かると、やりやすいな。
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であらわされることとなります。 問題文を変え、言葉が足りないところも多数ありますがどうぞよろしくお願いいたします。
>>283 >モトのデータが何で、どういう目的で使いたいのかが分かると、やりやすいな。
画像のRGBのようなヒストグラムだと思っていただければいいと思います。
RGBにもう一つの要素が増えたと思っていただければなと思います。
・・・あー。そりゃ、R面G面B面α面ごとにヒストグラム作るべきだわ。
$ ./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; }
すまん。planeじゃハズいわ。plainな。
>>286 それぞれの要素ごとに作るべきでしたか。
>>287 レス遅れて申し訳ありません。
さっそくためにしてみます。
ありがとうございます。
>>287 ありがとうございます。
適当なバイナリを作って確認したところそのとおりになりました。
直接会ってお礼をいいたいところですが、本当にありがとうございます。
本当に助かりました。ありがとうございます。
291 :
デフォルトの名無しさん :2005/08/27(土) 23:14:58
>直接会ってお礼をいいたいところですが、 ちょっと引いたぞ
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のように出力させていただければ自分でエクセルを使ってヒストグラムを求めたいと考えております。 どうぞよろしくお願いいたします。
バイナリをテキストに変換してくれって言ってるんですか? 例) R1,G1,B1, R2,G2,B2, .......
>292 1)出力形式プリーズ >287の例だと ・1行1レコードのテキストファイル。 ・1レコードに含まれるフィールドはコンマで区切られる。 ・フィールドは順に、値,Rの頻度,Gの頻度,Bの頻度,αの頻度。 例 0,1,0,100 1,2,1,40 ... 255,100,0,0 というふうに書く。 2)メンドイからバイナリをどっかにおくと、いいかも。
>>293 はい。
RGB値 出現頻度
0 9
1 25
2 0
3 109
・ ・
・ ・
・
2の24乗 13
出現頻度が0の場合は表示しないようにすればなんとか収まると思うのでよろしくお願いします。
表示しないでおくと下のようになります
RGB値 出現頻度
0 9
1 25
3 109
・ ・
・
2の24乗 13
RGB値の値の計算式をR,G,Bを使ってあらわすこと>295
すみません ずれてました
>>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
>>294 287のような出力形式でいいですがもっといい方法があるならそちらを使ってもらって
下さると助かります。グラフにするときに便利な出力にしたいと考えております。
287の場合は最大Xが255だったのであの出力形式をエクセルにこぴぺして作れましたが
今回の場合は2の24乗になるのでなにか上手な方法があったらとおもっております。
>2)メンドイからバイナリをどっかにおくと、いいかも。
どういう意味でしょうか?無知ですみません。
みなさん深夜にありがとうございます。
なんか・・・出現数に応じたデータ圧縮かなぁ。とか思いつつ、生暖かく見ている。
2の24乗!!??? そんなに....
>>296 無知ですみません。それはどのような意味でしょうか?
>>299 あ・・・確かにそのとおりです。正直驚きました。なぜかというとTAではないドクターに知り合いがいて
少し相談したんですが彼もそういってました。このあとなにかしらの符号化?につなげていくのではと
>>300 やはり多くてグラフ化できないですかね?
それなら出現頻度が0の場合は消していけばなんとかならないですかね・・・
>>302 絶対にそれぞれの値の棒グラフを作らねばならないのか?
度数分布表とかではなく?
>>303 ヒストグラムを作ってということだったので特に指定はありませんでした。
私が勝手に判断して値の棒グラフと考えました。
度数分布表というのはよくわからないのでぐぐってきますがそれでいけそうでしたら
それでやってもらえると助かります
みなさんありがとうございます。
>>303 2の16乗で区分すると2の8乗の階級ができます。RGBで考えたときにRGが同じで
Bが違っても同じになるというのはこの課題ではだめだと思います。
>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 という組み合わせは見たことがあるので、そのうちのどれか知りたかった。 (ここではべき乗を^で表した)
>>306 無知ですみません。
RGBαRGBα・・・・で構成されているファイルをαを無視して、
RGBをワンセット(1ピクセル?)で考えて
どのようなRGBが出現頻度が高いのかを知りたいと考えております。
回答になってたでしょうか?本当にすいません。
#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; }
>>308 ありがとうございます
動作実験をしてみたいと思います
#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; }
311 :
310 :2005/08/28(日) 04:20:19
げ、最後のr, g, b, i[r][g][b]は r+1, g+1, b+1, data[r][g][b]と読み替えてください。できたらこれも実験してもらえたら嬉しいです。
0〜255だと256個必要だな。>310
313 :
310 :2005/08/28(日) 04:25:01
Unicode識別子は無効だって....error
314 :
310 :2005/08/28(日) 04:27:12
僕のは、試さないでください....。orz
#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>はタブ文字に置換してください、何度も荒らしみたいにごめんなさい。コンパイル通ったのが大変嬉しくて... */
みなさんありがとうございます。 RGBαのαは無視してと今までいっていたのですができればRGBαをまとまりと 考えて出現頻度を求めていただけないでしょうか?わがままいってもうしわけありません
作るのがあほらしくなったのでパス。>316
うむ。完全にバカにしとるな。
>>308 ありがとうございます。
動作を確認いたしました。
>return (long) r << 16 | (long) g << 8 | b;
この動作でαを除外したのですか?
無知ですみません
>>317 >>318 すいません・・・。
上の方で4バイトずつのヒストグラムは難しいといわれたので自分で勝手に3バイトとしました。
それならなんとかなるのかなとおもったためです
すいませんでした。
入力ファイルがメモリのサイズを越えないのであれば、四バイトの索引と 頻度のペアを作っていけば数えられるよ。 ただ、ヒストグラムの横軸をどうするのか? 出題ミスのような気がするから、まずやるべきは先生に問題を確認することなんだけど なぁ……
>>322 char、short、longと、配列サイズを変更して集計するとか。
>>322 ありがとうございます。
308の if (count[i]) /* 全要素を出力するにはこの行を削除 */
で 削除して全要素を出力したのですが出力できなかったところを考えると
2の24畳でさえだめだったのですから2の32乗は無理そうですね。
ですので出現したものだけのヒストグラムを作ろうかなと考えております(出題ミスでないと考えた場合)
この人わかってない。
つか線形リストなり、ハッシュなりで実装すりゃええやん どーいうデータが想定されてんのか知らんけどさ どーせ頻度0の要素がほとんどだろ?
固定長配列でO(n^2)なアルゴリズム。
>>325 すいません・・・
>>326 TAが配布したデータでは
(要素数は2の24乗がある中使われていた要素は10000ちょっとでした)でした。
>>327 わかりません・・・。
>>317 >>318 いいわけさせていただくと αの要素を調べていたら0か255でしたので
(RGBすべてが0だった場合αも0、RGBが何かしらの値を盛っていたらαは常に255だった)
のでαを省いたものといいました。
しかし、これでは他のデータですと汎用性がないというっことが考えられます
ですので後でRGBαをワンセットと考えて〜といってしまいました
みなさんにはいろいろしてもらっていたのに大変失礼なことをしてしまいました
本当にごめんなさい
この後にデータ圧縮が控えているわけだが、データ構造はどうしたらよいか?
>>330 データ圧縮は上でも推測されてたようにあるかもしれませんが、
ヒストグラムをつくってから考えたいと思います。
ためしにZIPで圧縮したら1.2Mが60kになったので関係ありそうな気がしますね・・・
>>331 TAから公開してはいけないとは言われいないデータなのですが、あまりにちゃんに慣れてない
ので怖いのでアップするのは勘弁してもらえないでしょうか?
あと気づいたことが会って TAからはRGBαという構成といわれたんですが どうも調べるうちにαBGRになっているような気がします。 一般論として環境によってはデータが逆さまになることがあるとか きいたことがあるようなないような・・・
>>334 ありがとうございます
確かそのような名前でなにかあったことを記憶しております
・・・人の話を聴かんやつだな。 そういうチェックもしたいからupしろというてる。 ・・・てか、人を信用しようよ・・・。
不満に思うなら答えないでいいじゃないか
うむ。そのとおりだ。
>>336 すいません。TAが所属している研究室は画像研究をしてる研究室で
受講しているだけの一学生に大切なデータを渡すとは思えないのですが、
なにか問題になるといやですのでアップは勘弁してください。
いろいろしていただいているのに沢山しつれないことをして申し訳ありません・・・。
>>332 ハッシュはよくわからないけど、データが少ないんなら2分木とかで存在する値だけ読んでいくとか。
デフォルメしてかまわないんなら・・・普通に配列でいいか。
テキストファイルなら圧縮率高いですよ。
特に0が多い場合。
うん。気張らなくていいと思う。 だらだら配列を線形探索。
リトルエディアンの場合 RGBαでなくってあるαBGRになっていると思うのですが、 したの308さんのプログラムですとαBGをワンセットと考えて出現頻度がでるようになっていると 思います。BGRをワンセットと考えて出現頻度を出すにはどうしたらいいのでしょうか? 何度もすみません。 #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; }
342を少し訂正いたします >BGRをワンセットと考えて出現頻度を出すにはどうしたらいいのでしょうか? をBGRαをワンセットとして出現頻度を出すにはどうしたらいのでしょううか? に訂正させてください。BGRでも出現頻度がでるのならお願いします
方法:そんなプログラムは捨てる
針の先ほども自分で考える気は無いんだとさ。
346 :
デフォルトの名無しさん :2005/08/28(日) 08:40:52
#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 << 24 | (long) g << 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; } ほらよ
スマソ 346だけど普通に違ってるわこれ
俺もよくなるが、なぜ書いた後になってすぐ気づくんだろう。
349 :
315 :2005/08/28(日) 09:00:45
ども、起きぬけの
>>315 です。なんだか壮絶なことになっているようですね。
return (long) r << 16 | (long) g << 8 | b; これをいじればαBGからRGBになりそうなのですが、バスエラーが出たりと よくわからなかったです。どうか教えていただけないでしょうか? リトルエディアンのことを言い忘れていてすみません
351 :
315 :2005/08/28(日) 09:05:58
リトルエンディアンでもそれぞれ1バイト長で確保しているならRGBalphaの並びではないんですか? とにかくデータがalpha,R,G,Bの並びなのかどっちなのかはっきりさせる必要がありそうです。
>>351 逆になってるっぽいって言ってるからRGBAlphaの1B*4で1セットじゃねーの
肝心のデータうpしてくれりゃそれで解決するんだがな
私なりに調べてみたのですが、リトルエディアンだとバイナリダンプすると順序が逆になってでてくるそうです データ自身はRGBαなのですがαBGRというふうに出て来るそうです
352さんのいってらっしゃるので正しいかと思います
355 :
315 :2005/08/28(日) 09:32:41
普通にメモリとって記録していったら.... 17179869184Byte つまり、16777216MB、16384GBもメモリをとられることになるんですけど.....。 頻度はそれぞれunsigned char型に収まりきらないものでしょうか。
(意訳)データをupするのが正しいかと思います
そもそも要素数が半端じゃないな。
まあ、今日は暇だから付き合いますけど。
#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) dummy = 0 | (long) b << 16 | (long) g << 8 | r; } 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; } これでおk?
>>355 とりあえず値の範囲でも調べたら?
何通りあるかとか。
みなさんありがとうございます >頻度はそれぞれunsigned char型に収まりきらないものでしょうか。 データのサイズによるのですが 2の24乗必要と考えもらえると助かります
私の勝手な考えなのですが308さんのプログラムでほとんど問題なく、ただ、308さんのだと αBGのワンセットでの出現頻度になっているので BGR(RGB)のワンセットでの出現頻度が出るようになればなと考えております
363 :
デフォルトの名無しさん :2005/08/28(日) 09:55:01
バイナリデータのファイルサイズは?なんかとんでもないでかさに思えてきたんだが。それをテキストデータに変換してエクセルで開くなんて逝ったら。。。
ファイルサイズは96*96*96*4で3538944バイトです。 三次元画像らしいので
362に追加で、データがαBGRというふうになっているので先頭のαを無視してBGRワンセットの 出現頻度をということです。 最初はRGBαというふうに説明していたために混乱させて申し訳ありません。 308さんのプログラムだとαBGとなってしまうのは私が最初にRGBαとなっているといったためです。 実際はαBGRです。リトルエディアンだからだそうです
LinuxだっけWindowsだっけ?
一度情報を整理してみよう。 ・入力データのフォーマット ・出力データのフォーマット を書いてね。
>>366 リナックスです
>>367 入力データのフォーマットはバイナリでRGBαそれぞれ1バイトで計4バイトが何度も記述されている
構成になっています。ただ、私の環境だとこのRGBαバイナリでーたを見てみると
αBGRという風に見えます。(ターミナルでコマンドで中身を見た場合)
出力データのフォーマットは下のような感じにしていただきたいです、
タブでもいいですし、、であけてもいいです。
ただし、出現回数が0の場合は記述しなくてもいいです。できればソースのある箇所をいじれば出現回数
が0でも記述するようにしてもらえると助かります。
RGB値 出現回数
1 4
2 5
・ ・
・ ・
出力書式の質問。 αをあとから付け足すとかしない?
>>369 arufaの値は調べていくとわかったのですが0か255でした。
本来ならばαを含めてRGBαをワンセットとした出現頻度をもとめたいのですが
0か255なら別にいらないのではと思い、RGBと書きました。
αをいれることでプログラムが動かなくなるようでしたらαなんていらないですが
もしもRGBαでワンセットの出現頻度がわかるのでしたらそうしていただきたいです。
αが0のときはRGBもそれぞれ0でした。なのであるRGB値が出現していたらアルファは255っとなります
少しわかりづらいかもしれません。すいません
ポイントだけ。
1)
>>308 getval()のなかのif (..) return EOF;が4つあるけれど、それの順番を変更すればよろしい。
2)
αがRGBの値から求められるのなら、αは無視してよろしい。
以上。
>>371 #include <stdio.h>
long getval(FILE *fp)
{
int r, g, b, dummy;
if ((dummy = fgetc(fp)) == EOF)
return EOF;
if ((b = fgetc(fp)) == EOF)
return EOF;
if ((g = fgetc(fp)) == EOF)
return EOF;
if ((a = fgetc(fp)) == EOF)
return EOF;
return (long) r << 16 | (long) g << 8 | b;
}
このようにr、g、b、dummyを単純に逆転させるだけでいのでしょうか?
いまさらなんですが入力ファイルを十進法で表現したファイルをアップしたほうがいいでしょうか?
>>374 出力だけ有っても無意味
入力とそれに対応する出力のセットか、片方だけなら入力
>>375 入力ファイルをテキストに十進法で出力しました。
そして RGBαそれぞれが0の場合がほとんどでしたのでプログラムを組んでこれを消しました。
その結果を出力したテキストが下のようなものになります
(αBGRの順)
255 212 71 102 255 212 81 121 255 191 82 115 255 198 106 132 ・・・・・・・・
自分なりにずっといろいろやったり考えたりしてたのですが、
このテキストで、(α)BGRをワンセットと考えたR出現頻度を求めることもできるかなとおもって
アップしたほうがいいかをお聞きしました。
バイナリをそのままあげなさい。 データを処理した後のものを出されても仕方ない。
言葉で伝えられないなら全部丸投げしろ。 それぞれ0ってなんだ? 全部0じゃないのか? へんてこな日本語を文脈で判断して、わけの分からない 加工データでよく分からない出力を出せといわれても無理だ。
お。
>>271 からだから。100レス超えた。単一の話題だけ・・・だよな?
>>377 >>378 すみません・・・。できるところは自分でやろうと思って変な方向になりました・・・。
877にアップしました。TAの方のメールを待っていましてが配布してもかまわんよとのことだったので
アップしました。
どうかお願いいたします。
>380 出力形式の確認もしたか?
話にならん。
>>384 無知ですみません
添付可能ファイル : TEXT, LHA, ZIP
なのにlzhであげるなということでしょうか?
>>384 やっとわかりました
出力形式というよりも最終的な目的がヒストグラムを作ることですので
エクセルに簡単にこぴぺできる形がいいかと思います
他にいい方法があったら教えてくださると助かります
確認していないのだな?
>>387 はい、というのもヒスグラムをつくってこいとのことでどういう風に作るかも課題の一つだと
私は考えておりました。
エクセルでは65k程度しか軸がないのでそれ以上のヒストグラムはつくれません
ですが出現しないRGBαを除けば10k程度に収まります
こういうのを試してるのではないかと思っております
ヒストグラムのつくりかたもTAに確認すべし。
>>388 普通に考えてバイナリモードでの読み込み処理ができるかどうかをみる課題だろ
それに出現しないのを除外してもいいのなら、そんなヒストグラムに何の意味があるよ?
PhotoshopとかにあるRGBそれぞれを別々にグラフ化して重ね合わせるんじゃないのか?
最近のターミナルアダプターは高機能なんだな。
清涼剤をありがとう>391
>>389 返事がすぐには来ないと思いますが聞いてみます。
>>390 上のほうにでているようにRGBα別々のヒストグラムを作りましたが
確認したところ 別々ではなく RGBαをワンセットとしてヒストグラムを とのことでした
なんかファイルの先頭にテキストがいくつか混ざってるのは俺だけ?
>>394 > なんかファイルの先頭にテキストがいくつか混ざってるのは俺だけ?
すいません。消すのを忘れていました
消したものをあげたほうがいいでしょうか?
96*96*96*4バイトが正確なデータです
ヘッダだろ
>>395 消すのを忘れたってことは、喪前が勝手に入れたのか?
AVSっていうデータの可視化ツール用のファイルみたいだな。 Cで組むんじゃなくて、このツールの使い方を学習させたいんじゃなかろーか。
なんだか思い切りそんな感じがしてきた。
>>397 いえ
ですがRGBαそれぞれのヒストグラムを作っていたとき
αの値がおかしかったのでヘッダを消したら0か255になったので消すのはむしろいいことのようです
(メールで確認済み)
>>398 私のヘッダを見てツールがあるのを発見したのでメールでTAにたずねたところ
別にAVSじゃなくってもいいんだけどたまたまそのファイルで演習してるだけ
とのことでした
どうも課題自体が、適当に出された課題のような気がするな BMPとかならまだしも、わざわざAVSとやらのデータをCで扱わせる意味が分からん それに3バイトを1セットと見てのヒストグラムを作るなんて 必要となるメモリを考えても何させたいのか分からないし
まあ、Cで書くにしろ、RGB値の出現数はもうクリアしてるから・・・終了だろ?
特徴を踏まえて符号化するためじゃないかい? 4バイトを1セットとみてヒストグラムを作らせ、ベクトル量子化させるとかだめかな?
そのまえに質問者さんは前提としてCは使えるんですよね? また、バイナリエディタで開いたんだけど、ヘッダ部分は最後の 0C 0Cまで削除してしまっていいんですよね。
あの上の方にも書きましたが308のどこを変えればαBGをワンセットとからBGRにできるのでしょうか?
>>406 私はイーマックスで開いて96*96*96*4バイトになるまで削除しました
プログラムはほとんど使えません すいませn
>>407 freadで4バイトまとめて読み込みゃ、RGBAlphaの並びになるから
0xFF辺りでマスクしろ
>>308 のgetval()のなかのif (..) return EOF;が4つある。その順番を変更すればよい。
一つのネタで200スレ行くか楽しみだったりする。
>>409 私の環境ですと、リトルエディアンが原因でαBGRとなっているので308さんのだとαBGになります
409さんのおっしゃることはボクでもできるかもしれませんが、
そのあとの出現頻度のカウントが全然わかりません。ごめんなさい
まちがい、レスか。こんなん200スレも立ったら死ぬ。
>>410 #include <stdio.h>
long getval(FILE *fp)
{
int r, g, b, dummy;
if ((dummy = fgetc(fp)) == EOF)
return EOF;
if ((b = fgetc(fp)) == EOF)
return EOF;
if ((g = fgetc(fp)) == EOF)
return EOF;
if ((a = fgetc(fp)) == EOF)
return EOF;
return (long) r << 16 | (long) g << 8 | b;
}
このようにr、g、b、dummyを単純に逆転させるだけでいのでしょうか?
>return (long) r << 16 | (long) g << 8 | b;
ここは変更させなくてもよろしいのでしょうか?
何度もすいません
>>414 long getval(FILE *fp)
{
unsigned long temp;
if (fread(&temp, 4, 1, fp) != 1)
return EOF;
return (long)temp >> 8;
}
こうでいいんじゃねーのか?脳内コンパイラだからエラー出たら適当に修正してくれ
unixなら sys/net.h をインクルードして htonl つかったらいいんジャマイカ。
>>415 ありがとうございます。これを308と合体させてみてコンパイルは通ったのですが
セグメンテーションエラーがでました。
414はどこが違うんでしょうか?読み込む順番をおっしゃられるようにかえて
r g b というならびになっていると素人目には見えるのですがだめなんでしょうか・・・
確認したいのですが出現頻度をどうやって確認したらいいのかもわかりません。
0の出現頻度はあからさまなのでわかるのですが。
>>416 それについて調べてみます
ありがとうございます
414のようにして バイナリファイルの中身を見て いくつか値を計算して確かめたのですが 同じ値があり、おそらく正しいと思われます みなさんありがとうございます。
セパレータで区切られた文字列の中から
指定したカラム数の文字列を取り出す関数を作れ
ex) str[] = "abc,def,ghi"
sep = ',' → defがとれる
column_num = 2
という問題があり
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/880.txt のように作ってみたのですが、コンパイルの際に
cc -o token_cut token_cut.c
token_cut.c: In function `main':
token_cut.c:28: warning: passing arg 2 of `token_cut' makes pointer from integer without a cast
というエラーが出ます
解決方法をどうかご教授ください。。。
>>422 main内でchar sepとして定義されてるが、肝心の関数の方は
char*を引数として取るから、呼び出しの時にsepじゃなくて
&sepにすりゃいいんじゃまいか?
>if(strcmp(r_string,NULL) == 0) こんなんいらん。 if(r_string == NULL) でいい、ってか、意味わかってかいてるか?
>>423 ありがとうございます。無事コンパイルできました。
が、セグメンーション違反になってしまいうまくいきません。
どこが悪いかご指摘いただけないでしょうか。
まず、16行目の
strcmp(r_string,NULL)
が間違っています。str(cmp)に渡すのは有効なポインタでなければならず、
NULLを渡せばアドレスはゼロを指しているためコンパイルを通ったとしてもクラッシュします、ヌル文字列でなければなりません。
したがってstrcmp(r_string, "")としなければなりません。ただ、
>>425 さんの言うようにこの文は
if(!r_string)で片付けたほうがいいと思います。
>>425 はい、意味は分かっています。
教授がこうしたほうがよいと言っていまして
このようにしたんです。
>>427 >str(cmp)に渡すのは有効なポインタでなければならず、
>NULLを渡せばアドレスはゼロを指しているためコンパイルを通ったとしてもクラッシュします、ヌル文字列でなければなりません。
ありがとうございます、自分の勉強不足でした。
無事、プログラムを動かすことができました
答えてくださった皆様ありがとうございました。
俺ならこうする。 #include <string.h> char *token_cut(char *str, char *sepa, int column_num) { if( column_num < 1 || str == NULL || sepa == NULL) { str = NULL; } else { int i; for(str = strtok(str, sepa), i = 1; str != NULL && i < column_num; str = strtok(NULL, sepa), ++i) ; } return str; }
>>430 「見た目が分かりやすいから
慣れないうちはこう書いたほうがいい」とのことです。
前の質問者はもう行ったみたいだね。
前の質問者のビルドして、自分で作ってみたけど30分もたってんのに まだ動いてるヨ。あと数時間かかるのかな.....。俺のルーチン遅。
strtok()を使わないといかんのか?
あんまり使いたくない関数だな。
>434 わろた。 なお、こんなことすると(longが32ビットの環境では)ループが終わらんので注意 unsigned long i; for (i = 0; i < 0xffffffffUL; i++) { /* 処理 */ }
>>437 終わらないって言うのは、2^32回ループするのが現実的な時間じゃ無理ってこと?
それともほんとに無限ループになる?
ちょっと気になったんで・・・
unsigned long i; for (i = 0; i < 0xfffffffUL - 1; i++) { /* 処理 */ } と比較してみたら? >438
unsigned char i; for(i=0;i<=0xff;i++){ func(); } とかだと、 i=0からはじまって、 i=0xfeのときi<=0xffは真か偽か? i=0xffのときi<=0xffは真か偽か? unsigned char な値が0xffのとき0x01を足すと次の値は何か?
追加で unsigned char i; for(i=0xff;i>=0;i--){ } もバグの原因となるので要注意
>>440 なんで終了条件が <= になってんの?
そんなこと誰も言ってないよ?
(・3・)アルェ〜 ここは僕が降臨する所なのかYO!
まあ、今週からお客さん増えるから、ぼちぼちな。
447 :
デフォルトの名無しさん :2005/08/29(月) 03:06:30
二次元配列の課題を解いているのですが二次元配列の終わりの部分でエラーになってしまいます。 どこが悪いのでしょうか? int price[7][7]={{600,800,1000,1200,1400,1600,1700}, /* 県内 */ {700,900,1100,1300,1500,1700,1800}, /* 第1地帯 */ {800,1000,1200,1400,1600,1800,2000}, /* 第2地帯 */ {900,1100,1300,1500,1700,1900,2100}, /* 第3地帯 */ {1000,1200,1400,1600,1800,2000,2200}, /* 第4地帯 */ {1100,1300,1500,1700,1900,2100,2300}, /* 第5地帯 */ {1200,1400,1600,1800,2000,2200,2400}}; /* 第6地帯 *// よろしくお願いいたします。
エラーメッセージは?
スラッシュが一つ多いとかでないことを祈る。 つか、テンプレ読もうな。
ぱっと見宣言に間違いはないっぽい。 つーかテンプレ使えよ
やっぱ、スラッシュか? てゆーか、テンプレにしたがえよ。
ソースコード全部とエラーメッセージ。あと、コンパイル方法。
1レスに収まらないなら、
>>1 のアップローダ。
453 :
デフォルトの名無しさん :2005/08/29(月) 16:29:39
よろしくお願いいたします。
[1] 授業単元: 人工知能
[2] 問題文(含コード&リンク):
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/883.txt このプログラム(↑)を変更し、12×12の世界で、
開始地点(左上)と目的地点(右下)と障害物を設計して、
各セルにランダムに点数を配置し、移動の度に点数を獲得し、
目的地点に達した時に獲得点数の合計を出力するSマリオのプログラムを作成せよ。
(プログラムは8×8の世界で壁にそって右にぐるぐる回るか、障害物をぐるぐるまわる
Sマリオのプログラムです。実行可能です。)
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ(バージョン): gcc
[3.3] 言語: C
[4] 期限: [2005年8月31日まで]
[5] その他の制限: なし
マリオは自分では座標値を持ってなくて、 MAPを上書きするのか・・・マンドクサ 関係ないが、make_world()という名前にちょっと反応した俺ガイル
455 :
454 :2005/08/29(月) 18:00:16
すまん、ソースちゃんと読んでなかった。
>>454 は無かったことにしてくれw
本当にこういう丸投げする奴らに感謝って言う感情があるのかな。 ちょっと書き換えればいい話だったりするときとか。考えもしていないんじゃないかって思う。
「問題を出して暇つぶしさせてやってる」とか思ってそうなやつもいるしな
面白い問題だすねぇ・・・w
459 :
デフォルトの名無しさん :2005/08/29(月) 19:40:33
print_world()のface_directionは一回も使われてないんだけど。 構造体まで教えているであろうコードなのにswitch使えるところで使ってないでif-else使ってるし。 何なの?
関数定義の最初の{を行頭に書かないスタイルだしな。 あまりCに慣れてないのでわなかろおか
462 :
デフォルトの名無しさん :2005/08/29(月) 22:42:47
464 :
462 :2005/08/29(月) 23:12:06
465 :
447 :2005/08/30(火) 00:51:16
すいません。自己解決いたしました。 お騒がせいたしました。
>>465 自己解決野郎は後を立たないな。テンプレを使わずにあほな質問して「お騒がせ」することより、
どう解決したかも書かないで勝手に自己解決することが一番失礼だぞ。
>>466 自己解決というと、ちょうどオナニーしてスッキリしたようなものか。
本人は気持ちいいかもしれんが、他の人がイライラする。
469 :
デフォルトの名無しさん :2005/08/30(火) 16:35:31
sage忘れました、ごめん
そういうツッコミは問題がハチャメチャだったり、 確認を取ったときに応答がヘンだったときに使うとよろしい>471
あ゛。答えつきか。すまん。
絶対こいつらソースそのまま提出だろうな。
いいんじゃない?<ソースそのまま てか、uploader使うのがイヤンなんで、プログラム圧縮装置を作成中。 いや、単に改行減らすだけなんだがね。 動くけど、「なんじゃこりゃー」なソースになるだろうと。 (どうせ、indentで綺麗にできるし)
>>476 逆に無駄なコードをたくさん入れるのもいいかもね。
それか、思いっきりトリッキーなコーディングをするとか。
アセンブラで組むのもアリかも。
ユーザー定義の識別子をl(エル)と1(イチ)の連続にするってのはどおだ? 識別子にID振って、lをイチ、1をゼロとする2進法で命名するとか。
>>478 さらにソースを画像でうpすれば完璧だね
>>475 だから、一箇所だけ一目でわかる罠を仕掛けるのさ
しっかりと授業に出てて、よく考えて自分なりにソースを作ってみてそれでもわからないというのでなければいいけど、 いや、授業出ていればわかるだろみたいな子にはそれくらい必要かも。
「なければ」じゃなくて「あれば」だった...。
>>469 で出てる課題+αの物体を、ちょっと前に統計学の試験用に作った俺ガイル
ってかあれが出来ないって、授業全く出てないorどうしようもないほど
プログラミングに向いてないかのどっちかだろ
自分でまずはソース書いて見れ。
【質問テンプレ】 [1] C言語学習 [2] 指定した行に書き込みを出来る関数を作れ [3] 環境 [3.1] OS: Windows [3.2] VC++6.0 Pro [3.3] 言語: C/C++/どちらでも可 のいずれか [4] 無期限 [5] 標準ライブラリ可 関数名 filesave(書き込む行「int型か数値」,書き込む文字列); にて製作する事です。 FILEやfprintfなどは習いましたが行単位の書き込みはまだです。
>>486 ソース書いてる暇無いのでヒントだけ
FILEについて習ったなら知ってるとは思うが
・行単位の読み込み: fgets
・行単位の書き込み: fputs
・EOFの判定: feof
これらを使っちゃいけないというなら
fgetcで改行コード(\n)を調べないといけないな。
>>486 fgetsでファイルを一行ずつ読みながらtempファイルに全部書いていって、
そのtempファイルから一行ずつ読んで書き込んでいって、
指定した行になったら指定した文字列を書き込んで、またtempファイル
から続きを読んで書けばいい。
>>486 一行のデータを保持する線形リスト作るという手間の掛かる方法が思いついた
>>487 >>488 出来ました。ヒント有難う御座いました。
tempファイルを削除するとか処理が大変なのでtempの変数を作ってやりました。
ファイルが重いほど保存が遅くなりそうです。
誘導されてきました。 データの入力と処理に関する質問です。 2 3 4 5 1 5 2 7 3 9 4 6 ・ ・ ・ の様な各列がスペースで区切られた約40000行のデータファイルがあります。 (*ファイルの1列、2列目はスペースがある) このデータファイルを読み込んで、各列ごとのヒストグラムを出力(printfで)したいのです。 どのようなCプログラムを作ればいいのでしょうか? 初心者なので具体例を提示していただければありがたいのですがm(__)m
問1 先頭4バイトが1レコードのデータ長。5バイト目からはデータがデータ長分データが存在する。 さらにレコードを識別するためにデータの後に2バイトのPAD(00 00)が付与される。以下にサンプル データを示す。 00 0A 01 02 03 04 05 06 07 08 09 10 00 00 00 0B .... 特定のバイト列 0xFABACDEEFAがレコードに存在するか調べるにはどのようにすればいいのか 実際にプログラムを作成し考えてみよ。 これってどうすれば高速に実現できますか?
先頭2バイトの間違えでしたすいません
>>492 先ずは動くものを作り、その振る舞いを見ながらリファクタリングを行なう。
>>491 ヒストグラムをグラフィックでということなら、グラフィックはCには標準で
用意されていないので、答えようがない。もっと具体的に、このような環境で
動けばよい、と指定すればレスが付くだろうけど。
496 :
491 :2005/08/31(水) 01:03:33
>>495 レスありがとうございます。
ヒストグラムはGNUPLOTで描写します。
目標としてはデータを入力させヒストグラムにするデータファイルを
1 34
2 45
3 67
4 100
5 45
6 22
・ ・
・ ・
・ ・
の様な形で出力したいのです。
環境は
[3] 環境
[3.1] OS: Linux
[3.2] gcc(Verは不明)
[3.3] 言語: C
>>491 向こうにも質問が出てるから、こっちでいいから纏めて回答してくれ。
データは4列固定か?
ヒストグラムは4本作るって事でいいのか?
「実際のグラフはGnuPlotに描かせるからそのためのデータを出力する」ということでいいのか?
>>496 34
45
67
100って各列の数字を足した数?
499 :
491 :2005/08/31(水) 01:13:55
>>497 34.17847854の小数点8桁の値です。
データは4列固定です。
ヒストグラムも4本でオッケーです。
>「実際のグラフはGnuPlotに描かせるからそのためのデータを出力する」ということでいいのか?
はい、この通りです!
拙い説明なのに、ここまで理解して頂いてありがたいです。。。
500 :
491 :2005/08/31(水) 01:16:09
>>498 1の値が34個
2の値が45個
・
・
・
あるという意味です。
分かりにくくてすいません
>>500 こんな感じ?
#include<stdio.h>
main(){
int i,temp[4],num[100];char str[64];
FILE *fp;
for(i=0;i<100;i++)num[i]=0;
if((fp=fopen("ファイル名","r"))==NULL){return 0;}
while(fgets(str,64,fp)!=NULL){
sscanf(str,"%d %d %d %d",&temp[0],&temp[1],&temp[2],&temp[3]);
num[temp[0]-1]++;num[temp[1]-1]++;num[temp[2]-1]++;num[temp[3]-1]++;
}
fclose(fp);
for(i=0;i<100;i++){
printf("%d %d\n",i+1,num[i]);
}
return 0;
}
聞くほうも聞くほうなら、回答する方も回答する方だな。
503 :
491 :2005/08/31(水) 01:33:29
>>501 大変ありがとうございますm(_ _)m
大学でしかデータ処理が出来ないので、結果がすぐに出せないのが残念ですが
明日中に必ず報告します。
505 :
491 :2005/08/31(水) 01:35:03
プログラム見ても構造体とか習っていないので、 何書いてあるかサッパリですね(^^;)
構造体なんて一つも使ってないけど。
一つ使ってたか。FILE
>>504 使用の遣り取りしてたの読んでないの?
#いや、読んでいてその程度しか理解できてないなら私の言うべきことは何もないから。
む、使用ではない。仕様だ……
うん。適当にしか読んでない。
>492 力任せの方法とかKMP法とかBM法とか 文字列のサーチあたりでぐぐれ。 俺ならソース持ってきて、整形しなおして提出する。
しかし、質問投げっぱなしで
回答が出てもレスしないってのは失礼だよな。
近いところだと
>>453 とか
>>469 とか。
まあ、こっちも適当にやってるわけだが。
やっぱり次からは回答に何かしら小細工しておいた方がいいかな?
まあ、そういうのには小細工は必要だと思うよ。
484をお願いします。
だからソースを書けよ。プログラミング演習でCのソースが書けなくてどうすんの?
まあまあ。落ち着いてスルー。
517 :
453 :2005/08/31(水) 22:48:13
おかげさまで完成させることができました。 ありがとうございました。 なお、決して投げっぱなしにしているわけではないので、悪しからず。
>>514 =
>>484 前にRGBαのヒストグラムを取るプログラムを作ったよな?
まずはアレを修正して、自分なりに作ったものを上げてくれ。
まともに動かなくてもいいから。
そしたら、そのソースを元にこっちで修正するなり、
ヒントを出したりするからさ。
たぶん
>>484 はコンパイルが精一杯だと思うんだけど。
まあ、アレだ。 ・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
484です 自分でやってみたうえでそのソースをアップしようと思います すいませんでした
なんかよくわからんが添削なんて誰もしたくないと思うぞ
まあ、ものは試しだよ。
俺、どーしょーもないプログラムみると(マジで)吐き気がするんだが・・・
>>524 毎日自分の書いたプログラム見て吐いてるのが
大変だな
あー。それもやるな。<自分のコードに吐き気 寝ぼけてデバッグしたのなんか、そうだ。
嫌味を華麗にかわされてちょっと悲しい漏れが去りますよ
赤黒木を実装せよってな問題が出たんですが、 ノードの削除がよくわからず死んでます。 ・・・ノードに削除フラグつけるだけじゃダメでしょーか。
[1] 授業単元: アルゴリズムII [2] 問題文(含コード&リンク): 赤黒木を実装せよ [3] 環境 [3.1] OS: SunOS [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2005年09月08日08:00 [5] その他の制限:
>>530 せめて自分がどこまでやって、どこのコーディングで詰まってるのかぐらい
ソースだしたらどうよ?
流れを見て、添削より丸投げのほうがいいのかなと。 ソース出したほうがいいのしょうか?
533 :
デフォルトの名無しさん :2005/09/02(金) 00:15:47
独学で詰まってしまったので教えてください。 [問題] 木星の衛星 Io 5 1.1763 //衛星名、光度、周期 Europe 6 3.5512 //衛星名、光度、周期 Ganymede 5 7.1454 //衛星名、光度、周期 Callisto 6 16.6890 //衛星名、光度、周期 を構造体にいれ、周期をキーにソートして下さい。 また、データのスワップに別のインデックスを使用して ソートはインデックスを使って行います。
typedef struct satelite { char *name ; int luminosity; double cycle; } jupiter ; int main (void) { static jupiter[] = { {"Io", 5, 1.1763}, {"Europe", 6 ,3.5512}, {"Ganymede", 5 ,7.1454}, {"Callisto", 6 ,16.890} } ; jupiter dumy ; int i , j ; i = j = 0 ; for(i = 0; i < 4 ; ++i){ double max = jupiter[i].cycle; for(j = i + 1 ; j < 4 ; ++j){ if(max < jupiter[j]){ max = jupiter[j] ; } } dumy = jupiter[i]; jupiter[i] = jupiter[j]; jupiter[j] = dumy ; }
>>533 別に構造体の配列作って、周期を基準にして大小返す関数作って
qsort()使えば済む話の気がしないでもないが
536 :
534 :2005/09/02(金) 00:29:08
display(jupiter); return 0; } void display(sturct jupiter) { int i; for(i = 0; i < 4; ++i){ printf("%10s %3d %8.4f\n" ); } }
ソートはバブルソートをしなくてはいけないのです。 534は普通に周期をキーにバブルソートをしたものです。 これに構造体indexを使い、index内の添え字をソートして その指す値がsatelliteになるようです。 index[1] の指す値がsatellite[0]であるといった内容です。
あー……出したもんは動くのか?
なんかお前のなかで型名と変数名が ごっちゃになってるような印象を受ける
出したものは動きます。
>>539 確かにごっちゃになっているかもしれません。
良かったらご教授ください。
上のコード内だと satellite が型名で jupiter が変数名だと思って書いています。 main関数内でjupiterを宣言した時にメモリに領域が確保されていると 思っているのですが、間違っていますか?
釣りは別のところでな。>541 foo.c: 関数 `main' 内: foo.c:11: error: 文法エラー before '[' token foo.c: トップレベル: foo.c:19: 警告: type defaults to `int' in declaration of `i' foo.c:19: error: 初期化子の要素が定数ではありません foo.c:19: 警告: data definition has no type or storage class foo.c:21: error: 文法エラー before "for" foo.c:28: 警告: type defaults to `int' in declaration of `dumy' foo.c:28: error: conflicting types for `dumy' foo.c:17: error: previous declaration of `dumy' foo.c:28: error: 文法エラー before "jupiter" foo.c:34: 警告: type defaults to `int' in declaration of `display' foo.c:34: 警告: data definition has no type or storage class foo.c:36: error: 文法エラー before "return" foo.c:39: error: 文法エラー before "jupiter" foo.c:40: error: conflicting types for `display' foo.c:34: error: previous declaration of `display' foo.c: 関数 `display' 内: foo.c:43: 警告: フォーマットへの引数が少なすぎます
すいません、本当に釣りでは無いんです。 まだ始めたばかりで悩んでいます。 VC++でビルドしたら実行出来たので、実行できると思っていました。
ちなみにdisplay関数はmainの上で宣言してます。
>>543 じゃあその実行できたコードをそのまま晒せ
とりあえず
>>537 のに従って書いてみた
gcc -ansiで確認済み
#include <stdio.h>
#define MAXNAME 40
struct satellite {
char name[MAXNAME];
int brightness;
double cycle;
};
int main(void)
{
struct satellite satellite[] = {
{"Europe", 6, 3.5512},
{"Callisto", 6, 16.6890},
{"Ganymede", 5, 7.1454},
{"Io", 5, 1.1763},
}, *index[4], *temp;
int i, j;
/* Initialize */
for (i=0;i<4;i++) {
index[i] = &satellite[i];
}
/* bubble sort */ for (i=3;i>0;i--) { for (j=0;j<i;j++) { if (index[j]->cycle > index[j+1]->cycle) { temp = index[j]; index[j] = index[j+1]; index[j+1] = temp; } } } /* print */ printf("%10s%5s%10s\n", "名前", "光度", "周期"); for (i=0;i<4;i++) { printf("%10s%5d%10.4f\n", index[i]->name, index[i]->brightness, index[i]->cycle); } return 0; } 書いててなんでこんな無駄なことしてるんだろうと思った
マジで無駄だな つか、データがこんなに少なくて固定なら あらかじめソートしとけばいいじゃん
>>549 まぁそう怒らず、元のデータみてみれ
綺麗にソートされてるから('A`)
ってか本当に何がしたいんだ?
最長不倒関数ってコトバが頭によぎった。
俺は添削はパス。 添削好きな>531の出番ですよ。
typedef
→
http://www9.plala.or.jp/sgwr-t/c/sec16.html static jupiter[] = {
→typedefで作った型名を配列定義?
typedef struct {
} SATELITE;
としたら?
i = j = 0 ;
→邪魔。削除。
for(i = 0; i < 4 ; ++i){
→i++ で覚えとけ
double max = jupiter[i].cycle;
→どこで変数定義してんの?そもそもバブルソートにMAXなんて関係ないし。
おお、感動した。ついでに>551のながったらしいmainも切ってくれ。 俺は理解できんかった。
>>554 C++行ったら++iって書かんといかんようになるんだから別にいいじゃん。
>>557 素朴な疑問なんだが、>556に対して>557でなにを指摘したいんだ?
C++では何故前置にしなくてはいけないか理解できないなら黙ってた方が可愛げがあるってもんだよ。
C++では前置++より後置++の方がコストがかかることが多いので、 前置でも後置でも良い場合は前置にする習慣があります。 という答えなら何点もらえますか?
561 :
554 :2005/09/02(金) 05:29:40
>>551 カウンタがいっぱいでよく分かりませんでした。
ところどころにコメント入れてもらえれば読みやすいと思います。
自作関数呼び出し、ループとコメントを抽出してフローチャートになるくらいに。
>>558 C++で後置きのサンプルです。
なぜとか愚問です。シビアな判断が必要なものは避ければいいんです。
組み込み型でのインクリメントなんだし、どっちでも同じじゃねーか
まあ将来的にC++を使うつもりがあるなら、 どちらでもいい場合には前置を使う癖をつけておいてもいいと思うけどね。
ここは宿題スレ。
宿題すれだからこそ、前置インクリメントに文句言う方が蛸。
551です 私はどこを直せばいいのでしょうか? よろしくお願いいたします
デバッグスレに行けば?
>>566 ベクトル量子化なんてやったことないけど、
とりあえずソース眺めてる。
以下、コーディング上修正すべき点
・ファイル開いたらちゃんと閉じろ
・メモリ確保したらちゃんと解放しろ
・使わない変数や処理を入れるな。
・main関数長すぎ。もうちょっと機能別に分割しろ。
・ちゃんとコメントつけろ。何やってるのかわからん
暇があったら添削したソース上げるわ。
>>566 機能ごとの関数分けはまぁいいとして(できればしてくれ)、
せめてコメント付けてくれんか
めっさ読み辛い
571 :
569 :2005/09/02(金) 17:25:41
テストデータ作って動かしてみたが、 ありえないインデックス値が入ってるような・・・ 生成されたコードブックの検証はしたのだろうか とりあえず、以下について言葉で説明してくれ ・ソース中の配列indexの意味と使われ方 ・コードブックに無いベクトルに対しての処理 (ソース中で何をやってるか) なんとなく、この辺が癌になってる気がする
>>569 >>570 すみません。
かなり急いでいたため、こうなってしまいました。
>>571 indexについてですが、コードブック中のRGBをあらわしています
コードブックに無いベクトルは一番近い値をコードブックから探してきています。
>生成されたコードブックの検証はしたのだろうか
gcc ----.c
./a.out 処理したいファイル名 コードブック名
でコードブックが現れます。
確認したところおそらくはコードブックは問題ないと思います。
コードブックに無いベクトルについては 読み込まれるRGBをR,G,B別々に考えて、コードブック中のRGBとの差をそれぞれ求めて その値が一番小さなコードブック中のベクトルの番号で置き換えています。
自分のプログラムだとαに255を入れているつもりが Rに255がはいっちゃってて 直してるつもりでも直らなかったです
>>574 getval()はαBGRの順で読んでるみたいなので
その順序を直せばOK
>>575 ありがとうございます
やってみましたがだめでした
ファイルの中身を十進法で見てみると
A B C 255 となっていて 255を一番前にもっていきたくって (255 A B C)
シフトなどを使ってみたのですが自分ではできませんでした。
577 :
554 :2005/09/02(金) 20:38:02
悪かったよ。
ループに影響すると思ってたんだよ。
けど、
>>556 の
>++iって書かんといかん
ていう間違いもだめだろ。
あと、
>>551 のソースの問題点分かったよ。
そもそもみんな正しい処理を分かってないから、
それぞれどういう目的でそういうコーディングしてるか書かないと、
間違いだと言う判断ができない。
>>577 RGBαであらわされた画像データを読み込みます
次にRGBαをひとつのベクトルとします。
で、出現頻度の高いRGBαをコードブックに書き出し、出現頻度の高い順に256個
選びました。
次に符号化するために、画像データを読みこんで もし同じ値がコードブックにあれば
その番号をふってやります。なかったら一番近いベクトルを選びます
選び方として それぞれのR、G,Bを引いてから足し合わせその数の一番少ないベクトルが
一番近いベクトルとみなされ、その番号をふってやります
複合化はその逆で、番号を見て、番号のベクトルをふってやります
αは0か255だったので最初省きました。RGBが値を持てば255それ以外は0です。
メモリの関係から省きました。
ですので複合化するときにαを足し加えたつもりです。
で、リトルエディアンだから逆に処理したりしたつもりだったのですが
頭がこんがらがってきて、結果を見てみるとαの位置が逆になったりしていました
わかりづらいとはおもいますがよろしくお願いいたします
>>578 質問とは関係なくて悪いんだけど、せっかくベクトルで処理してるなら
内積を使って一番近いベクトルを探した方がいいんじゃまいか?
>>578 最終的な出力データの形式は?
1)入力と同じRGBα形式:32bit
2)コードブック(RGBα:32bit)*256+インデックス値(8bit*画素数)
※コードブックサイズが256のとき
3)その他
>>579 私のプログラムのやり方があっているかはわかりません。
そっちのほうがいいのかもよくわからないのです。
>>580 最終的な出力データ形式は
本来ならば符号化したデータ (256のコードブックを使っているのならば読み込ませたデータRGBα
の1/4)と、複合化したデータ(コードブックを参照して、複合化するRGBαで)と、コードブックを出力したいのですが
私の作ったプログラムですと符号化したデータはでていません。複合化したデータは出したつもりです。
1)は複合化したものと考えられますよね?
2)は符号化したものとコードブックということですよね?
実際処理させたいファイルをアップしたほうがいいでしょうか?
583 :
580 :2005/09/02(金) 21:28:47
質問の仕方がちょっと曖昧だったけど ちゃんと解釈してくれたようなので安心 最終的には量子化圧縮したものを出したいけど 今はまだやってないってことだね。 >実際処理させたいファイルをアップしたほうがいいでしょうか 結果を照合できるからアップした方がいいと思う
>>583 ありがとうございます
最終的には上に上げた符号化、複合化、コードブックをだしたいのですが
最悪でも複合化したものを出してソフトを使って表示させたいです。
自分のプログラムで表示させると明らかにおかしい画像になりました。
897にあげておきました
よろしくおねがいいたします
>>584 元データにやたら0x00が含まれてる件について
>>585 それについては正しいです
0ボクセルが多いのが特徴のデータですので
どういう動作を求めているかわからないので ・プログラムの起動法(引数の説明やね) ・プログラムが読み書きするファイルの説明 どういうファイル形式かわからないので、 ・元データの形式 ・コードブック、符号データの形式(複数あるなら、それぞれ) 説明いれとくと、元データの形式だけど、4バイトYUVだったら、マイナスの表現を2の補数でしてるか、 下駄を履かせて最小値を0にしてるか。(これはユークリッド距離を求めるのに必要) 3バイトYUVだったらバイトの並びと、ビットの配置が必要になる。 入力データがRGBでYUVに変換するんだったら、変換式が必要ね。 コードブックは予想がつくんだけど、念のため。 符号データに関してはバイトをまたがるビット列になるので、その配置がわからんとどうしようもない。
>>587 プログラムの起動方はどうのような形でもかまいません。
元データの形式はαRGBなのですが、私の環境ではBGRαそれぞれ1バイトで
計4バイトです。
YUVにしてベクトル量子化もしたいのですがまずはRGBでやりたいとおもっております
いや。こちらが決めると「やっぱ直して」って言われるから、あなたが決めて。
#include <stdio.h> int main(void) { int i; for(i =0; i < 10; i++){ printf("**********\n" + i) } } このiがどういう作用をしているか教えてください。
>>589 すみません。わかりました。
できれば符号化と複合化のプログラムを分けてもらいたいです
起動方法は、
./a.out ベクトル量子化したいファイル そのファイルのコードブック 符号化されたデータ
./a.out 符号化されたデータ コードブック 複合化されたデータ
でお願いいたします。
複合化と符号化わけるのがだめというのであれば
./a.out ベクトル量子化したいファイル そのファイルのコードブック 符号化データ 複合化データ
でお願いいたします
>>590 #include <stdio.h>
int main(void)
{
static char a[10] = {'*','*','*','*','*','*','*','*','*','\n'};
int i;
for(i =0; i < 10; i++)
{
printf(a + i) ;
}
return 0;
}
これと等価だと思えばいい。
>590 あ、>591上手な説明だ。 RGBだけ対象で、コードの種類は256個限定?>591
リンクミスった。寝よう。
595 :
569 :2005/09/03(土) 01:13:31
>>551 添削するのめんどいので組みなおしてみた。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/898.txt とりあえず動作確認はしたが、結果が正しいかどうかまではわからん。
少なくとも、コードブックはちゃんと作れているみたい。
以下補足
・ヒストグラムを構造体のリンクリスト(単方向)にすることでサイズ軽減&高速化
・アルファチャンネルの補正はしていない
・RGBαのバイトオーダーはenumで指定
・ユークリッド距離の計算は適当
・使い方
% [実行ファイル名] [画像ファイル]
出力されるファイル
- histgram.txt: ヒストグラム
- codebook.raw: コードブック
- encode.raw: 符号化データ
- decoderaw: 復号化データ
疲れたのでもう寝ます。あとは任せたノシ
>>593 RGBだけ対象で問題ありませんが、複合化するときにRGBがすべて0ならαも0
そうでなれけば255をいれるようにしなくてはなりません。
コードの種類は256限定ではなく512、1024もつくれるようにしたいです。
>>595 ありがとうございます
確認してみます
本当にありがとうございます
って、コマンド仕様出てたのね・・・ 直す気力が無いのでこのまま寝ます。
595をgccでコンパイルしようとすると /tmp/cc666b8D.o: In function `get_color_diff': /tmp/cc666b8D.o(.text+0x408): undefined reference to `sqrt' collect2: ld returned 1 exit status というメッセージがでてきました どうしたらよいでしょうか?
>>592 それだと落ちますが。つーか、スレ違いなんだからレスすんなと。
601 :
595 :2005/09/03(土) 01:22:54
>>599 中で<math.h>をインクルードしてるので
% gcc -lm xxx.c でOK
>>590 *じゃなくて文字でやってみると効果がわかりやすいかもしれません。
文字じゃなくても違う配列に格納するものを変えてみるとか。
>596 コードの種類は256限定ではなく512、1024もつくれるようにしたいです。 ビットの並びを定義しましょう。
>>601 すいません
数学関数?ですね ありがとうございます
大変助かります
>>595 ありがとうございます。
ツールを使って画像を見ましたが、私のプログラムに比べて断然よくなておりました
少し木になったのですがエンコードサイズがデコードサイズと同じというのは圧縮という面では
少し違ってる?のかなと感じました。コードブックサイズは256ですので本来ならば
ちょうど1/4になると思いました。
本当にありがとうございます
匿名掲示板ですが本当にありがとうございます
連絡先聞いて御礼したいくらいです。ありがとうございます
>>603 ビットの並びの定義というのはどういったものなんでしょうか?
無知ですみません。
コードの数が512のとき、次コード列があったら、復号データファイルはどんなバイト列になって欲しいですか? コード列(10進数) 1 3 7 15 31 63 127 255 511
>607 もういいじゃん。 >605で終わってるのだから。
>>607 複合データファイルはバイナリでRGBαそれぞれ一バイトのバイト列になってほしいです
これで答えになっているでしょうか?
コードブックのサイズを変えたい場合は単純に #define CODEBOOK_SIZE 256 の256を1024などにすればいいとおもうのですが これを例えば画像の存在しうるベクトル数と同じ数(10000など)にすればまったく同じ画像に 再生されるはずなのですが、明らかに同じ画像に再生されませんでした。 同じベクトルがあればそのインデックスを振り当てるというふうにプログラム内部でなっているのに 色々してもらって本当に感謝しています。 もしよかったらどこを変えたらいいのか教えていただけないでしょうか
611 :
595 :2005/09/03(土) 02:40:27
>>605 いや、連絡先は勘弁してくれ・・・
コードブックサイズは256*4バイト。
エンコードサイズは画素数*1バイトで、データ部だけ見れば1/4。
データ中にコードブックを持たせると
その分だけサイズが大きくなるが、画像データが大きくなればなるほど
データ中のコードブックサイズの比率が小さくなる。
コードブックをシステム標準パレットみたく、外部固定にできれば
データにコードブックを付ける必要がなくなり、完全に1/4になるね
>>611 なるほど。ありがとうございます。
610について少々お知恵を拝借させていただけませんか。
あー。あとで修正するのが嫌なので、先に聞いておこう。
>>595 のプログラムを512,1024にも対応するだけで終わり?
>>613 ありがとうございます。
595さんのを512、1024にも対応させたいです。できれば512などのサイズは
あとで簡単に変えられるようにもしできればしていただきたいです。
あと最初にアップした問題にも書いてあるように、
RGBαをYUVα(それぞれ1バイト)にしてベクトル量子化を施すというのと
RGBαをYUVα(Yを8ビット、U,Vを2ビットずつ、αを4ビット、計2バイト)にして
ベクトル量子化をするのをしたいです。
YUVαそれぞれ1バイトできるとはおもうのですが後者(計2バイト)のは少し難しそうです。
これについてもコードブックサイズを256、512、1024などを作りたいです。
長々とすみません
615 :
595 :2005/09/03(土) 03:33:28
>>610 あー・・・
えっと、今のプログラムだとコードブックのインデックスの範囲が
8bit(0〜255)固定になってるので、define以外にそこも直さないとダメ。
ソースで言うと変数enc_data、enc_data_ptr、あとはfwrite()の第二引数。
fwrite()は各要素ごとに出力するようにしないと対応できないか。
修正方針としては
・ソース内部ではenc_dataの要素を16 or 32bitにする(それを参照するポインタの型も)。
・コマンドライン引数でコードブックサイズを取得し、cb_sizeに格納
文字列の判別は"256"、"512"、"1024"を直接比較でいいんじゃないかと。
・データ出力時に、コードブックサイズに応じて、各インデックス値を
8bit/16bitのいずれかで出力
こんなとこかな。
漏れがあったら誰か指摘よろ。
あと、俺のはエンコード/デコードでプログラム分かれてないんだけど、いいのかな?
>>595 をベースにするのは構わんけど、ちゃんと中身を理解してな。
>>615 ありがとうございます
正直先輩のソースは難しくて理解するのは大変な時間がかかりそうです
提出期限がもう終わってますがなんとかしたいとおもいます
ありがとうございます
>>615 >あと、俺のはエンコード/デコードでプログラム分かれてないんだけど、いいのかな?
欲を言うと分かれているほうがいいです
意訳: 新しく作り直してください。 細かいことを聴かれても答えません。アナタが作ってください。 気に入らなかったらまた作ってもらいます。
619 :
595 :2005/09/03(土) 04:03:14
>>618 え、ちょ、おまwwww
って、俺はやらんぞ。
>>617 か他の暇人よろ。
あと、
つ [後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です]
作った後の仕様変更は結構コストかかるのよ。バグの温床にもなるし。
だから
>>613 みたいに事前に確認を取るわけ。
>619 乙 400行のソースだけれど・・・元のプログラムの理解と修正コード作成で何時間ぐらいかかった?
621 :
595 :2005/09/03(土) 04:36:34
>>620 乙あり。
(
>>569 の1時間くらい前から
>>595 までの時間)−休憩等 = 7時間くらい
以下内訳
・解読 : 2時間
・添削→マンドクサ : 1時間
・組みなおし : 4時間
解読とコード作成はほぼ同時進行でやってたから正確じゃないかも。
1時間100行か。早いな<組みなおし でも、やっぱ時間かかるよな。ホント、おつかれ。
わがままいってもすみませんでした。 本当にありがとうございました。 がんばってみます
いろいろ直してコードブックサイズを例えば10000にしたらほとんど復元されました ありがとうございまいた。
何度も申し訳ありません。 上位256ベクトルを見て〜 といっていましたが一番多いベクトルは0です。 ですが今回は0を除いて上位256にしてみたいのですがどうしたらいいのでしょうか? 付け加えるようですみません。 もしくは下位256にする方法でもかまいません どうかよろしくお願いいたします
すいません625は大変失礼なことでした 申し訳ございません
>>601 ライブラリの指定は最後にしないと駄目だよ。
>>629 符号化データを
[位置][RGBα][位置][RGBα]・・・としたいのはわかったけど
それだと0がほとんど無い画像を符号化したときに
サイズが2倍になるわけだが、
>>629 はそこまで考えてる?
あと、データの持ち方として、
struct ENCODE_DATA{
unsigned int index;
unsigned int voxel;
}
みたいな構造体で配列を作って、この構造体のサイズを使って
処理させたほうがすっきりしてわかりやすいと思う。
量子化するときは、構造体のvoxelメンバにアクセスさせるようにすれば、
わざわざデータを分割しなくてもいいんじゃないかな
と。思うわけだが、まあ参考程度に。今から直すのめんどいだろうし。
セグメンテーション違反の原因がわかりました アウトバッファのメモリ確保の値を倍することで解決いたしました ですが、インデックス情報とボクセルを合体させたものを複合化したいのですが どうしても複合化できません。サイズが逆に小さくなってしまう・・・
すみません、合体させるところもメモリの問題でした 595さんのソースで実行させてみると近いベクトルをとってきてほしいのに 明らかに違うものをとってきてしまうという上体になっています ユークリッド距離のところは適当とおっしゃられていたのでそこらへんが 原因かなと考えておりますが、
どうも、一致しているベクトルだったらそれに置き換わるんですが 無い場合は一番近いベクトルを選ぶところを、一番近いものではなく コードブックで一番上にあるベクトルにおきかえているようなきがします (画像ツールで見た結果) 624でいったのは、コードブックサイズを増やせば完全に復元されるといういみで 例えばコードブックサイズが256なら一致する256ボクセル以外は0であらわされていました。 (0がコードブックで一番多い代表ベクトル) なのでおそらくコードブックの中のベクトルで一致しなかったら コードブックの一番上のベクトルに置き換えられているようです どうやって直せばいいのでしょうか・・・やってはいるんですがどうも595さんのが 私には難しすぎて。・・・
基本的なこと:C言語って学校で習った? 情報系の学科? これ、宿題じゃなくて、ゼミの課題?
>>627 ありがとうございます。
関数の中に関数って書けるんですね。勉強になります。
>>637 関数内での関数定義は規格に無い。一部の処理系の拡張機能。
そしてgccのいくつかのバージョンはこの拡張にバグがある。
基本的には使うな。
>629 起きてる? 位置の値が取る範囲は何?
ふむ。寝てるようなので、方針。 ・位置がとりうる範囲を確認する ・位置を表すのに必要なバイト数を求める(=nバイトとする) ・1バイト出力する捨てプログラムを書く ・nバイト出力する捨てプログラムを書く ・nバイトとボクセルだかベクトル量子化データだかを組で出力するプログラムを書く ・1バイト入力する捨てプログラムを書く ・nバイト入力する捨てプログラムを書く ・nバイトとボクセルだかベクトル量子化データだかを組で入力するプログラムを書く
>>635 距離の比較のところにバグがあったorz
595.c 344行目
----------------
/* 一致するノードが見つからない場合、最も近いものを探す */
if(!found){
double min_dist = 0;
int min_index = 0;
/*ユークリッド距離算出*/
min_dist = get_color_diff(color, codebook[0]);
/*** ↓がi=iになってて、ループの中に入ってなかった。ごめん ***/
for(i = 1; i< cb_size; i++){
/*ユークリッド距離算出*/
double tmp_dist = get_color_diff(color, codebook[i]);
if(min_dist > tmp_dist){/* 最短距離 */
min_dist = tmp_dist;
min_index = i;
}
}
*enc_data_ptr = (UINT8)min_index;
enc_data_ptr++;
}
----------------
[1] 授業単元:c言語中級 [2] 問題文(含コード&リンク):ログファイルに現在の日付、時間を出力したい。 現在の年・月・日・時・分・秒・ミリ秒を求め、ファイルに出力せよ [3] 環境 [3.1] OS: HP-UX [3.2] コンパイラ名とバージョン: gcc、バージョンはちょっと分からないです [3.3] 言語: C [4] 期限: 9月5日12:00まで [5] その他の制限: 特になしです 2005/09/04/05:01:30:40 yyyy/mm/dd/hh:mm:ss:msms (ms:ミリ秒) 上記のようなフォーマットで出力したいとおもっています。 gettimeofday()関数をつかってミリ秒の取得はできたのですが %dや%fなどの書式指定子で表示できないのです。 どうにかして表示したいので、知恵をお貸しください。
ソースと実行結果は?
>>642 ミリ秒で取得するから時、分、秒、ミリ秒は計算するんでしょ?
あと、日付と時間はそれぞれ取得すると思うけど。
手取り足取り教えてもらえるところはここですか?
宿題を晒したら暇人が勝手に答えるスレです。
1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 問題1 memsetのような関数を高速化する方法のひとつに、バイト単位ではな くワード単位で書き込みを実行する手法がある。このほうがハードウェ アに合うだろうし、ループのオーバーヘッドも1/4ないし1/8に減少 する可能性がある。これの問題点は、ターゲットがワード境界上にな い場合や長さがワードサイズの倍数でない場合に、さまざまな末端処 理を実行しなければならなくなる点だ。この最適化を実行するmemset を記述せよ。その性能を、既存のライブラリバージョンや単純なバイ ト単位でのループと比較せよ。 問題2 memsetのテスト機構を作成せよ。 [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 特になしです [5] その他の制限: 特になしです
ベンダーが用意する関数が、そのような単純な最適化もされてないと思い込む根拠はなんなのだろう……
ベンダーが用意する関数が、そのような単純な最適化もされてないとは書かれてないが?
651 :
650 :2005/09/04(日) 12:11:14
ついでに自分の環境での計測結果(gcc -O3) やはり処理系提供の関数は速いな。 memset 120 my_memset 230 my_memset_simple_loop 921
>>642 solarisでやってみた。たぶんHPも同じだと思うけど。
こんなんか?間違ってたらごめん
#include <stdio.h>
#include <sys/time.h>
int main(){
struct timeval time;
struct tm *t;
gettimeofday(&time, NULL);
t = localtime(&time.tv_sec);
printf("%04d/%02d/%02d/%02d:%02d:%02d:%02d\n",
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec, time.tv_usec/10000);
return 0;
}
>>640 アドバイスありがとうございます
>>641 ありがとうございます
早速試してみました。
前のソースでは一致するものはそのままそのベクトルということだったのですが
今回のソースでは、一致するものすらまともにでませんでした。
i = 1に変えただけでなぜそうなるのかよくわかりません・・。
654 :
デフォルトの名無しさん :2005/09/04(日) 13:04:00
[1] C言語プログラミング入門 [2] 0が入力されるまで正整数を読み込み、最大値、(最後の0を除いた)最小値、 全入力数値の平均(最後の0を含まない)を出力するプログラムを作る [3] 環境 OS: Windows,言語: C [4] 期限:2005年9月7日 [5] その他の制限:for文を習ったので、とりあえず自力で以下のような プログラムを作ったのですが、うまくいかないのでこれを直していただきたい と思っています。面倒でしょうがどうぞよろしくお願いします! #include<stdio.h> main() { int a[1000],i,j,sum=0,n=0; for(i=1,a[0]=-1;a[i-1]!=0;i++){ n=n+1; max=0,min=9999; for(j=o;j<=i-1;j++){ if(max<a[j]){ max=a[j]; } printf(“max=%d\n,a[j]); if(min>a[j]){ min=a[j]; } printf(“min=%d\n,a[j]); sum=sum+a[i]; sum*1.00/(n-1); pfintf(“ave=%d\n,sum”); } }
まあpfintfなんて関数ないしいったいどこで読み込んでんだかわからんし。 つーか添削しないとまずいの? 1からのほうが楽。
656 :
627 :2005/09/04(日) 14:00:02
元ソースを読んだが何をしたいのか理解できないので思いっきり書き直し。 たぶんこんな感じ? #include<stdio.h> int main() { int value,n=0,sum=0,min=9999,max=0; for( ; scanf("%d", &value ) == 1 && value > 0 ; ++n , sum+=value){ if(max < value) max = value; if(min > value) min = value; } if(n)printf("min=%d\nmax=%d\nave=%g\n" , min , max , sum*1.00/n ); return 0; }
658 :
657 :2005/09/04(日) 14:03:36
>>654 #include<stdio.h>
main(){
int i,min,max,sum,v;
scanf( "%d", &v );
min=max=sum=v;
for( i=1; ; i++ ){
scanf( "%d", &v );
if( v ) break;
if( min > v ) min=v;
if( max < v ) max=v;
sum+=v;
}
printf(“max=%d\nmin=%d\nave=%lf\n". max,min,(double)sum/i);
}
正整数って書いてあったからunsignedで書いてみんとす #include <stdio.h> int main(void) { unsigned int min=UINT_MAX, max=0, sum=0, num=0, input=0; for(; scanf("%ud", &input); num++) { if(input==0) break; min = min>input ? input : min; max = max<input ? input : max; sum += input; } if(num) { printf("max = %ud\nmin = %ud\nave = %f\n", max, min, (double)sum/n); } else { puts("No data"); } return 0; }
>>654 #include <stdio.h>
#include <limits.h>
int main(void)
{
int input_value;
int max = 0, min = INT_MAX;
int sum = 0, count = 0;
int status;
while (status = scanf("%d", &input_value), input_value != 0) {
if (status != 1 || input_value < 0) {
fprintf(stderr, "入力エラー\n");
return -1;
}
count++;
sum += input_value;
if (max < input_value) {
max = input_value;
}
if (min > input_value) {
min = input_value;
}
}
if (max) {
printf("最大値:%d\n最小値:%d\n平均値:%f\n", max, min, (double)sum / count);
}
return 0;
}
文字列を入力して偶数番目の要素と奇数番目の要素を別の配列に格納し、 文字列として表示。 ・・お願いします。
>>662 文字配列3つ用意
添え字も i, j, k で用意する
scanf で入力受付
i, j, k を初期化
入力文字列を'\0'まで1文字ずつチェック
添え字を2でMODをとると0か1になるんで条件分岐
if で奇数
else で偶数
それぞれ1文字ずつ配列に入れていく
ループを抜けたら j, k の位置に'\0' を入れる。
printf でそれぞれを表示
>>662 めんどいから手抜きで
#include<stdio.h>
int main()
{
int i;
char a[256],b[2][256];
fgets(a,256,stdin);
for(i=0;a[i] && a[i]!='\n';++i)b[i%2][i/2] = a[i];
b[i%2][i/2] = '\0';++i;
b[i%2][i/2] = '\0';++i;
printf("%s\n%s\n",b[0],b[1]);
}
#include <stdio.h> main(){ char in[1024],odd[1024],even[1024]; int i,ec,oc; fgets( in, 1024, stdin ); for( i=ec=oc=0; in[i]; i++ ) if( i%2 ) { even[ec]=in[i]; ec++; }else{ odd[ec]=in[i]; oc++; } even[ec]=odd[oc]=0; printf( "%s %s\n" even, odd ); }
666 :
642 :2005/09/04(日) 15:19:25
>>652 お返事遅くなってしまい申し訳ないです。
提示していただいたプログラムで大丈夫です。
ありがとうございました。
667 :
662 :2005/09/04(日) 15:36:03
助言してくれた皆様ありがとうございました。
助言ではなく丸n(ry
>>667 みんなゼロ番目から数えているから気をつけてね
670 :
デフォルトの名無しさん :2005/09/04(日) 22:40:41
>655 失礼しました…あまりにもめちゃくちゃすぎましたね。 for(i=1,a[0]=-1;a[i-1]!=0;i++){ と for(j=o;j<=i-1;j++){ の部分を授業でやったので、それを使いたかったんです。 >657,658,659,660,661 ありがとうございました!とても助かりました。
>>670 個人の好みによるけど、a[0]=-1みたいなループ制御以外のを
ループの初期化式に入れるとわかりにくくなるから
面倒でも分けた方がいいんじゃまいかと思う
674 :
673 :2005/09/05(月) 03:41:22
あー。 こういう使い方知らんかった。
>>672 #include <stdint.h>
#include <stdlib.h>
>>672 最後の行のケツ。全角スペース入っとる。
>>678 uint32_t
yuva2rgba(uint32_t n)
{
int r,g,b,a,y,u,v;
y = ((n & 0x000000ff) >> 0) - 0;
u = ((n & 0x0000ff00) >> 8) -128;
v = ((n & 0x00ff0000) >> 16) -128;
a = ((n & 0xff000000) >> 24) - 0;
r = y + 1.40200 * v;
g = y - 0.34414 * u - 0.71414 * v;
b = y + 1.77200 * u;
r = (uint8_t)r << 0;
g = (uint8_t)g << 8;
b = (uint8_t)b << 16;
a = (uint8_t)a << 24;
return r + g + b +a;
}
ここは添削スレですか?
添削つまらん。丸投げしてくれ。
以前○投げしたら怒られたので出来る限りしたあとでと思って投稿いたしました ごめんなさい
以前課題をやっていただいたものです もし595さんがよければフリーメールでいいので連絡先を教えていただけませんか?
わかりました。 そちらのメールアドレスに送りますので、 学校のメールアドレスかプロバイダのメールアドレスを書いてください。
>>683 すまんが、さすがに2chでそれはできない。
たまーにここや他のスレに見てるから、わからんことがあったら聞いておくれ。
名無しの回答者の中に俺が混ざってるかもしれん。
あと、
>>683 がこれから先、もっと難しいことをやるなら
画像処理スレの方で聞いた方が、ここよりも良い回答が得られるかもしれない。
(俺は画像処理は専門外なので、これ以上のことは答えられん)
そうはいっても、もうちょっと質問の仕方とC言語の勉強が必要だけどな。
ま、とにかく、がんばってくれ
あとは名無しに戻るよノシ
>>684 こらこらw本当に書きそうだからやめれw
良心の人だなぁ・・・ char usage[] = {数値列}; system(usage); の人とはえらい違いだ。
下駄を履かせてないのに-128するんはヘンだな。 それから浮動小数点演算してるんだから、誤差は出るつもりでいないとな。 上限や下限に収まらないときもあるだろう。 とヒントをくらいは出しておこう。
なんか活気がないなと思う今日このごろ。 大学って10月からでしたっけか?
国立系なら10月から後期課程のハズ
後期課程?
昔は知らないけど最近は春休みと夏休みを境目に前期と後期の二学期制になってる 冬休みもあったような気がするけど学期は変わらないかな
>>692 それは知ってるけど後期課程とは言わないんじゃないのか?
ドクターじゃあるまいし。
ああ、なるほど。課程って言ったらおかしいか。 俺が行ってた大学はSpring SemesterとFall Semesterって言ってた。 他は知らない。
>>685 そうですか・・・残念です。画像処理のアイデアも求められているのは授業の課題内容から
わかりますね。
この授業の課題は大変難しくて有名で、私にも色々事情があって本当に死のうかと考えた時期も
ありました。課題でないくらいで大げさなとおもわれるかもしれませんが、理由は省きますが
本当に欝になって死ぬことばっかり考えてた3週間でした。
ここのみなさんには課題をやっていただいたりして大変助かりました。
私が死ななかったのはみなさんのおかげであるという部分がかなりあります。
ありがとうございました。
授業か・・・ゼミではないのか?
厨排除のため、うそ宿題でも作るか? プログラミング言語C(通称K&R)の問題とかそれらしく書こうか。
暇人だな、このスレを保守するという手段が目的化してるお前も十分に厨
>>679 返事が送れてすみません。ありがとうございました
うんうん。698と699は厨だね。 以後スルーで。
702 :
デフォルトの名無しさん :2005/09/06(火) 11:36:54
はじめましてよろしくお願いします。 CSV形式のファイルの読み込みをしたいんですけど、ちょっとわからず、 知恵を貸していただけたら幸いかと思います。 #include<vector> bool Load Maintenance File(LPCTSTR lpsaName,std||vectar<MAINTEREC>&vecRec)) ↑ ↑ /*ファイル名*/ /*ファイル内容*/ ===MAINTERECファイル内容=== ================================= MAINTEREC Rec; 整数(int)なら→Rec.nWave 浮動小数点(double)なら→Rec.dValve vecRec.push_back(Rec); ================================= ※数字以外はエラー 必ず1つ目は整数値、二つ目は浮動小数点じゃない場合もある 格納配列 obj
703 :
702 :2005/09/06(火) 11:38:58
訂正 lpsaName→/*ファイル名*/ MAINTEREC→/*ファイル内容*/
704 :
702 :2005/09/06(火) 11:45:36
例 ==ファイル中身== っていう感じでファイルがあります。 123,0.123(一行) ・ , ・ ・ , ・ ・ , ・ ・ , ・ ========== 整数 | 少数 ↓ ↓ 整数 実数 ↓ ↓ Rec.nWave Rec.dValve
うむむ。全角か・・・。
707 :
702 :2005/09/06(火) 11:56:03
ああっ半角です。。それとも全角で書いたのがまずかったですか?
>>705
>>707 ファイルの中身として全角数字出したわけだから全角解析しろってことだろ?
709 :
702 :2005/09/06(火) 12:17:17
いやいやすみません半角でいいです・・・・
ごめんなさい・・・
>>708
作ったのが無駄になったじゃねえか むかつく
711 :
702 :2005/09/06(火) 12:30:51
ホントすみません・・・ごめんなさい・・・
>>710
712 :
702 :2005/09/06(火) 12:59:51
すみません誰か・・流れだけでもいいので教えていただけませんでしょうか?
713 :
702 :2005/09/06(火) 13:22:06
>>710 作ったところまで教えていただけませんか?
>>712 1) ファイルを開く
2) while(ファイルから1行取得→string、EOFまで)
{
3) ・stringからカンマの前後で部分文字列切り出し
4) ・前後のスペース除去
5) ・文字列→数値変換
6) ・それぞれの値を構造体?のメンバに保存
7) ・構造体?をvectorにpush_back
}
8) ファイルを閉じる
あと、質問するときは
>>1 をちゃんと読んで、テンプレをちゃんと埋めること。
>>712 は日本語がなんかおかしいし留学生とかじゃねーの?
多分
>>1 を読んでも意味がよくわからなかったんだよ
717 :
702 :2005/09/06(火) 14:10:15
>>714 ,715
すみません、焦っていて周りが見えなくなっていました。。。ごめんなさい!
718 :
702 :2005/09/06(火) 14:14:38
[1] 授業単元: プログラム演習
[2] 問題文(含コード&リンク):
>>702 [3] 環境
[3.1] OS: win2000
[3.2] コンパイラ名とバージョン: VC++6.0
[3.3] 言語: C
[4] 期限:9月6日16時30分ぐらいまで
[5] その他の制限: 半角でお願いします
あと2時間かw
>>702 の一番下の格納配列 objって何を格納したいの?
720 :
702 :2005/09/06(火) 14:28:16
配列オブジェクトへ追加する vecRec.push_back(Rec);→追加
721 :
702 :2005/09/06(火) 14:30:01
ソースコード直に書いてたらなんか変な操作したのか消えて一つ前の自分の書き込みが表示された。 最近多くて困る。@JaneStyle
>>718 > MAINTEREC Rec;
> 整数(int)なら→Rec.nWave 浮動小数点(double)なら→Rec.dValve
これが意味分からない。MAINTERECの定義と、CSVの内容の書式を教えてくれ。
こういうことでいいのか?しかもstd::vectorってCじゃないし。
CSV = LINEが1つ以上
LINE = DATA ' ' DATA '\n'
DATA = INT | DOUBLE
>>725 色々今試してみたらSHIFT+BackSpaceで再現出来た
727 :
702 :2005/09/06(火) 15:09:24
あっホントだ・・・std::vector C++だ・・・ とりあえずもらった資料にはこれぐらいしか書いてないっす。。。 もう一度書きます。 bool LoadMaintenanceFile(LPCTSTR lpsaName/*ファイル名*/,std||vectar<MAINTEREC>/*ファイル内容*/&vecRec) MAINTEREC Rec; ※数字以外はエラー ---------------- 一つ目は必ず整数 整数→Rec.nWave 2つ目は浮動小数点(ではない場合もある) 実数→Rec.dValve 格納配列ojb vecRec.push_back(Rec);→追加
>std||vectar これだけの量で間違いすぎ
729 :
702 :2005/09/06(火) 15:14:52
std::vector std||vectar 間違い探し
731 :
715 :2005/09/06(火) 15:26:18
>>721 stringはstd:stringのつもりで書いた。ちなみにC++。
別にcharの配列でもいいんだけどね。
732 :
702 :2005/09/06(火) 15:26:23
::でしたか!すみません!
733 :
702 :2005/09/06(火) 15:58:43
すみませんC言語って言ってたんですけどC++でお願いできませんでしょうか
[1] 授業単元: プログラム演習
[2] 問題文(含コード&リンク):
>>702 [3] 環境
[3.1] OS: win2000
[3.2] コンパイラ名とバージョン: VC++6.0
[3.3] 言語: C++
[4] 期限:9月6日18時00分ぐらいまで
[5] その他の制限: 半角でお願いします
期限が延びてるw
もしかしてMAINTERECは構造体じゃなくて共用体か?
ああ、勘違い。そんなわけないな。
てっかfscanfで簡単に読み込めるが
>>727 だとしたら、その仕様を書いた人間の頭が悪い。書き直させろ。
739 :
702 :2005/09/06(火) 16:22:16
流れは
>>715 の参考に
1) ファイルを開く
2) ファイルから1行取得し、EOFまで
{
3) ・数字なら処理を!数字でなかったらエラー
4) ・文字列を数値に変換
5) ・整数と実数にわける
6) ・整数ならRec.nWaveに保存してリストの末尾に追加するpush_back(Rec.nWave)
7) ・実数ならRec.dValveに保存してリストの末尾に追加するpush_back(Rec.dValve)
}
8) ファイルを閉じる
二つ目は整数でも実数でもRec.dValveに入れるんじゃないのか。
>>739 だから、問題の仕様自体が曖昧に過ぎるから、皆書くにかけないんだよ。
聞く限りでは内容はかなり簡単そうなんだから。もしそれだけしか仕様が
与えられないのであれば、誰も書けない。
742 :
702 :2005/09/06(火) 16:55:59
ちょっとまとめてから出直してきます。みなさんいろいろすみません・・・・
CSVってカンマ区切り、タブ区切り、固定長などがある。 カンマ区切りの場合、文字をダブルコーテーションで区切ると、中のカンマは文字扱い。 まずは扱えるCSVファイルの仕様を確定すること。 漢字が有る場合、漢字の一部をカンマと判断する場合があるので、 1バイト文字と2バイト文字は、それぞれ適切に扱う必要がある。
745 :
715 :2005/09/06(火) 17:04:24
746 :
デフォルトの名無しさん :2005/09/06(火) 17:05:03
MS Officeだとcsvはカンマ区切りでタブ区切りはテキストだな
CSV(Comma Separated Values) ふつう、タブでも固定でも無い
748 :
744 :2005/09/06(火) 17:13:09
そっすか。
tsv(TabSeparatedValues)とも言うなぁ。
750 :
デフォルトの名無しさん :2005/09/06(火) 17:25:01
今回の場合は関係ないけど、 文字の中にカンマが入ってる場合(ダブルクォートで囲む)とか、 さらにその中にダブルクォートが入ってる場合(エスケープするんだっけ?)とか、 ちゃんとしたものを実装しようとすると頭が痛くなる罠
>>751 literalなダブルクォートは二つ重ねて""で書く
イヤらしいのは改行含むカラムがある場合(エクセルはそーゆーのも出力するはず。
CRだかLFだか忘れたが)
妄想ですね。
>>755 LFか。ならstdioやiostreamのテキストモードでの行読みはつかえん
ということだな。
757 :
デフォルトの名無しさん :2005/09/06(火) 21:53:48
下のポログラムを参考にして名前もホームランの本数も入力できて何人分も追加できるポログラムを教えてください。ポインター使用でお願いします。 #include <stdio.h> #include <malloc.h> #include <string.h> struct MJlist { char name [20]; int homerun; struct MJlist *pointer; }; int main (void){ struct MJlist *hd,*p1,*p2; int sum =0; p2=(struct MJlist*)malloc(sizeof(struct MJlist)); strcpy(p2->name,"ICHIRO"); p2->homerun=10; p2->pointer=NULL; p1=(struct MJlist*)malloc(sizeof(struct MJlist)); strcpy(p1->name,"MATUI"); p1->homerun=15; p1->pointer=NULL; hd->pointer=p1; p1->pointer=p2; hd=(struct MJlist*)malloc(sizeof(struct MJlist)); strcpy(hd->name,"Nomo"); hd->homerun=5; hd->pointer=NULL; }
ポログラムってなんだよ
759 :
デフォルトの名無しさん :2005/09/06(火) 21:58:18
プログラムです。提出明日であせってました
おそらく連結リストにして欲しいのだろうけど。 サンプルは動かないわ/仕様は曖昧だわで 回答者がいないほうに一票
いい加減なソース付ける暇があるなら、テンプレに従えよ
>>757 このままで名前もホームランの本数も入力できて何人分も追加できるポログラムに
なっているよ。
だからそのまま提出すれば大丈夫でしょう。
もちろんポインターも使ってるし。
763 :
デフォルトの名無しさん :2005/09/06(火) 22:17:19
名前もホームランの本数も入力できて何人分も追加はキーボードであと入力でfor かなんかでまわしてほしいんですが(´Д⊂)
764 :
デフォルトの名無しさん :2005/09/06(火) 22:19:19
はぼ書き換えなるとおもいます
うーん。ポログラムってキーボード使わないの?だと、完全にお手上げだ。 キーボードの付いているパソコンを用意して欲しい。 入力を for で回したいならつぎのようにすればいいかな? char* nyuryoku[]={"入力 "," 入力 "," 入力","力 入"}; int i; for(i=0;i<100;i++){ printf("%s\n",nyuryoku[i%4]); }
何そのギャグ。
767 :
デフォルトの名無しさん :2005/09/06(火) 22:32:12
ポインターをつっかて名前もホームランの本数も入力できて何人分も追加できれば どんなんでもいいので教えてください
しつこい
769 :
デフォルトの名無しさん :2005/09/06(火) 22:35:41
じゃあ。解いてくださいよ!!!
>>757 batterにendと入力すれば入力終了。正しいかは保障しない。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct MJlist {
char name [20];
int homerun;
struct MJlist *pointer;
};
int main (void) {
struct MJlist *head = NULL, *tail = NULL, *temp;
char name[256]; int homer;
for (; ; ) {
printf("batter?:"); scanf("%255s", name); if (!strcmp(name, "end")) break;
printf("homer?:"); scanf("%d", &homer);
temp = (struct MJlist*)malloc(sizeof(struct MJlist));
strcpy(temp->name, name);
temp->homerun = homer; temp->pointer = NULL;
if (head != NULL) tail->pointer = temp; else head = temp;
tail = temp;
}
temp = head;
while (temp != NULL) {
printf("batter:%s, homer:%d\n", temp->name, temp->homerun);
temp = temp->pointer;
}
while (head != NULL) {
temp = head; head = head->pointer;
free(temp);
}
return 0;
}
771 :
デフォルトの名無しさん :2005/09/06(火) 22:53:43
770san ありがとうございます(;´д`)
なんか釣ってるのかまともな宿題なのかわからんなw
if(!(0))はtrueでif(!(2))とかif(!(-3))はfalseになるんだっけ?
そう
>>773 それでいい
負数も単体では真
以下チラシの裏
だからGetMessageの戻り値チェックは0以外かじゃなくて0以上かにしろと…(-1が返ってくるとry
>>774-775 サンクス。今までずっと0以下がfalseだと勘違いしてた。
まあ、if()に値を直接入れたりはしないようにしてたけど。
>>777 そーでもない
値が0か0以外かで保障される場合、むしろ直接使ったほうがいい。
if (!!GetMessage(...)) { ...; }
781 :
779 :2005/09/07(水) 10:31:28
GetMessage()がどんな関数かなんて知らない。 適当な関数なら何でもよかった。
782 :
デフォルトの名無しさん :2005/09/07(水) 13:16:54
すみません、宿題お願いしまつ・・・! [1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 構造体を作る。 (名前と年齢を入力する関数・名前と年齢を表示する関数を作る) [3] 環境 [3.1] OS: Windows/Linux/等々 環境とかよくわかりませんがとりあえずWindowsです。 [3.2] コンパイラ名とバージョン: gcc 2.9 VC 6.0等 これちょっとわかりません、すいません・・・・ [3.3] 言語: C/C++/どちらでも可 のいずれか C言語でお願いします。 [4] 期限: [yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか (「できるだけ早く」は不可) 2005年9月7日(水)今日の5時まで [5] その他の制限: どこまで習っているか、標準ライブラリは使ってはいけない等々 当方C言語の初心者でいちお構造体習ったのですがさっぱりで・・・ 先ほど問題を出されあせっちゃってます(;´Д`) よろしくお願いします・・・・
>>782 入出力関数だけ作ればいいのか?
(main関数等はいらんのか?)
>>782 struct data
{
char name[256];
int age;
};
void input_data(struct data * p)
{
char * pos, buf[64];
printf("Name: ");
fgets(p->name, sizeof(p->name), stdin);
pos = strrchr(p->name, '\n');
if (pos != NULL) * pos = '\0';
printf("Age: ");
fgets(buf, sizeof(buf), stdin);
p->age = atoi(buf);
}
void output_data(struct data * p)
{
printf("Name: %s\nAge: %d\n", p->name, p->age);
}
785 :
782 :2005/09/07(水) 13:49:41
786 :
782 :2005/09/07(水) 13:53:35
何度も書き込み申し訳ないです。。。 当方がなにぶん初心者の者で サルでもわかるようなプログラミングですと 幸いです(´Д`) ・・・・サルに失礼かも_| ̄|〇
>>784 を初心者っぽく(危険な)コードに書き換えてみた
#include<stdio.h>
#include<string.h>
struct data
{
char name[256];
int age;
};
void input_data(struct data * p)
{
printf("Name: ");
scanf("%s", p->name);
printf("Age: ");
scanf("%d", &p->age);
}
void output_data(struct data * p)
{
printf("Name: %s\n", p->name);
printf("Age: %d\n", p->age);
}
int main()
{
struct data d;
input_data(&d);
output_data(&d);
return 0;
}
788 :
787 :2005/09/07(水) 14:07:26
#include<string.h>はもういらんかったか
789 :
782 :2005/09/07(水) 15:38:57
>>787 .788
ありがとうございます!!!
助かりました。。。
自分でも作れるように頑張ります(`・ω・´)
790 :
デフォルトの名無しさん :2005/09/07(水) 19:26:43
非マナー非マナー非マナー非マナー非マナー非マナー 非マナー非マナー非マナー非マナー非マナー非マナー 非マナー非マナー非マナー非マナー非マナー非マナー ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非 ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非 ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非 非マナー非マナー非マナー非マナー非マナー非マナー 非マナー非マナー非マナー非マナー非マナー非マナー 非マナー非マナー非マナー非マナー非マナー非マナー ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非 ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非 ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非ーナマ非 非マナー非マナー非マナー非マナー非マナー非マナー 非マナー非マナー非マナー非マナー非マナー非マナー 非マナー非マナー非マナー非マナー非マナー非マナー
まあ、明らかに
>>1 を読んでない質問はスルーするように徹底すればいいんだろうけど。
解答側も読んでなかったりして。
793 :
こんにちわん :2005/09/07(水) 21:20:29
[1] 授業単元: プログラミング言語 [2] 問題文: 和暦の年号を西暦に変換するプログラムを作成せよ。 ヒント(西暦=明治:m+1867、大正:t+1911、昭和:s+1925、平成:h+1988) また、列挙体(enum)を用いた方法でも作成せよ。年号を入力してください。 例 昭和45年 → s 45 h 12 と入力してENTERすると結果は 西暦2000年です と表示されるもの。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: borland c++ [3.3] 言語: C++ [4] 期限: [2005年09月07日24:00まで] [5] その他の制限: 無し お願いします。
年と月と日が入力されないと正確な変換はできないが。
鋭いけど。そういう仕様ということでw
796 :
こんにちわん :2005/09/07(水) 21:31:51
そういう仕様でお願いします。ご迷惑おかけしてすみません^^;;
>>793 なんかこれとほぼ同じ問題を数スレ前でみた気がするんだが・・・
作ったコードはそのまま廃棄処分した希ガス
普通にgetcharで読み込んで、switchで昭和なのか平成なのか(ryを判定して
加算すりゃいいんじゃねーの?
798 :
デフォルトの名無しさん :2005/09/07(水) 21:35:00
[1] 授業単元: プログラム [2] 問題文(含コード&リンク): マインスイーパーを作れ [3] 環境 [3.1] OS: Windows [3.2] 環境: Visual studio.net 2003 [3.3] 言語: C [4] 期限: 一週間 お願いしますorz
799 :
デフォルトの名無しさん :2005/09/07(水) 21:35:10
>>793 超手抜き
#include<stdio.h>
#include<string.h>
enum{m=1867,t=1911,s=1925,h=1988,};
int array[]={m,t,s,h};
char str[]="mtsh";
int main(){
char ch,*p;int year;
if(scanf("%c%d",&ch,&year)==2 && (p=strchr(str,ch))!=NULL)
printf("西暦%d年です\n",array[p-str]+year);
else printf("入力が正しくありません\n");
}
800 :
こんにちわん :2005/09/07(水) 21:36:05
全然わからないです・・^^;; わかりやすく教えて頂けませんか??
801 :
こんにちわん :2005/09/07(水) 21:38:40
ありがとうございました!!!!!!!!!!!!
>>798 google 七行プログラミング マインスイーパー
遅かった #include <iostream> int main() { char ch; int Year; std::cin >> ch >> Year; switch (ch) { case 'm': Year += 1867; break; case 't': Year += 1911; break; case 's': Year += 1925; break; case 'h': Year += 1988; break; default: std::cerr << "年号が正しくありません" << std::endl; return 1; } std::cout << "西暦" << Year << "年です" << std::endl; return 0; }
C++はダメなんだろ
なにか問題でも?
出題者の意図は「元号の種別をenumにしろ」であろうから、及第点が貰えない に一票
810 :
デフォルトの名無しさん :2005/09/07(水) 22:15:22
voidのポインタに1足したらどうなるんだっけ? 1バイト動くで良いんだッけ?
片付けてやる。
>>1 のテンプレに従い宿題を書くのぢゃ。
[1] 授業単元:C言語研究 [2] 問題文(含コード&リンク): Todo管理のためのアプリケーションを作成する。 先に入力された予定から順に格納されていき、 先に入力した予定から、 実行しだい削除されていく⇒文字列を格納する循環キューを 管理するキュークラスを作成 入力可能な予定の数は、50個 初期化関数はコンストラクタを活用 コンストラクタは仮引数付(キューの名前を渡してやる) キューのメモリ割り当ては動的に行われるように (デストラクタでのメモリの解放もする) (C++の利点を生かしたやり方で) ToDo一覧を表示する関数を定義⇒キュークラスから生成された オブジェクトを引数とする関数 ToDo一覧のなかから、n番目とm番目の予定を入れ替える関数を定義 複数のToDo一覧を合成する仕組みを用意する 合成したToDo一覧の個数が限界を超えていたらエラーメッセージを表示して、 無記入のToDo一覧を返す [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:よくわかりませんがVisual C++です [3.3] 言語: C++ [4] 期限: [2005年9月9日午後12:00まで] [5] その他の制限:とくにないと思います。「 よろしくお願いします。
>>815 一日では(俺には)無理だ。手の早い人が気が向いたらやってくれるかも知れないけど。
C++らしい・・・stringとvectorか・・・題意満たしてないな・・。 問題がC++らしいかといわれると、謎。
818 :
815 :2005/09/08(木) 15:50:02
>>816 レスありがとうございます。
さっき出た課題なんです…できないorz
多少条件満たしてなくても形できてればおkらしいのですがおれには…orz
午後12:00って夜だっけ、昼だっけ?
一日は午前12:00から始まる
821 :
デフォルトの名無しさん :2005/09/08(木) 16:24:08
正午の瞬間には午前も午後もないが、正午から0.1秒でも経過したら午後。 9月9日正午までって書いとけば間違いないね。
823 :
デフォルトの名無しさん :2005/09/08(木) 16:33:30
事故で警察に呼ばれたとき、 「事故から1時間後は何時だ 午前12だろ。夜じゃないだろ。 深夜0時かそうか。それは午前か?午後か? そうか。午前か。午前なら早朝だな。夜じゃないじゃないかうそつき目。 オマエはいつになったら本当のことを言うんだ?泥棒や労。 うそつきだからオマエは泥棒なんだよ逮捕してもいいんだよ 昼でも早朝でもいいが、日が昇ってる時間なんだから暗いわけないだろ 北九州市の小倉南署 映画の撮影のためと称してやくざがらみでなんかやってた。 この事故は車にGPS仕掛けられて追跡されブレーキ細工され、 信号無視の車をよけられずに起きたんだが、 このときの担当警察官はその当たりや集団の一員。 つーか部落の一員。泥棒部落の出身。まちがいない。
へー
なんかあれだな。紀元0年とかゆーそーゆーカンチガイだな。 (社会科のセンセが間違ってたのをツッコミ入れたことがあるが、無視された)
宿題に突っ込み入れるスレはここですか?
そうです。
どなたか814もお願いいたします
>828 えーっと・・・10時間くらいかかりそうなのですが・・・ 一日1時間やるとして・・・10日ほどお待ち願えますかね?
>>829 そうですか・・・
自分ではできなくて・・・・
やってもいいんですけれど、待てますか、待てませんか? 今日はもう風呂入って寝るので、やるとしたら明日からですが。
>>831 ありがとうございます。
提出まで待てます。過ぎてもなんとかします。
失礼ですが内容は理解していただけたでしょうか?
意見の食い違いがあると面倒ですので
えらそうな文章になっていました 申し訳ございません。
>>834 ありがとうございます。
/* ベクトル値を各要素に分解 */
void get_rgba_from_color(
COLOR_t color,
int *r, int *g, int *b, int *a
)
{
*a = (color >> ((3 - DST_CHANNEL_A) << 3)) & 0xFF;
*b = (color >> ((3 - DST_CHANNEL_B) << 3)) & 0xFF;
*g = (color >> ((3 - DST_CHANNEL_G) << 3)) & 0xFF;
*r = (color >> ((3 - DST_CHANNEL_R) << 3)) & 0xFF;
}
の部分なんですが、なぜ私のソースをいじったのでしょうか?
この部分は私が595さんのを変えた部分で
595さんのままですとコードブックで一致しないベクトルを選ぶときに
それぞれのベクトルになっていませんでした。bが一致したものを
順に選んでいくことになっていました。
すげーむかつく
>>836 申し訳ございません。
えらそうにするつもりはありませんでした。
すいませんでした
>>834 きめ細かいコメント文までありがとうございます
ほい。風呂から戻ってきたよん。 10日くれるのだね。 んで、もう答えでてるけどご依頼は?
840 :
834 :2005/09/08(木) 22:04:18
>>835 >>814 のソースだと、シフトさせる幅を直に数値で書いてるため、
バイトオーダーを変更したときにRGBαが正しく抽出されなくなる。
>>595 のソースだとバグがあって
RRRRGGGGBBBBAAAA からRを抽出しようとしたとき、
1111000000000000 のマスク(AND演算)をかけてるため、
結果は0xR000になってしまう。
>>835 の処理だと
RRRRGGGGBBBBAAAA を右にビットシフトさせて
000000000000RRRR にしてから
0000000000001111 のマスクをかけるようにしてるので
結果は0x000Rとなる
あと、
>>835 のソースはバイトオーダーいじってるので、
テストするときは自分の環境に戻してやってくれ。
>>839 ありがとうございます。
今の状況としては834さんに色々助けていただいております。
839さんには感謝いたします。できれば今後も助けていただきたいです
>>840 ありがとうございます
バイトオーダーというのはRGBαがそれぞれ一バイト計四バイトの場合ではなくって
計2バイトの場合でも対応できるようにしたということでしょうか?
>>840 お聞きしたいのですが
1、いただいたソースでは、まずコンパイルして実行してひとつコードブックを作成すれば
今後、実行するときにそのコードブック名を入れれば、コードブックを新しく作成せずに
入力したコードブックを見て符号復号を行うと考えてもよろしいのでしょうか?
2、これは読み込む画像によりますが、今回の場合は814のソースで問題なかったので
いただいたソースの入力出力バイトオーダーのところを814と同じにすればよろしいという
ことでしょうか?
よろしくお願いたします
844 :
834 :2005/09/08(木) 22:18:03
>>841 計2バイト?の場合があるの?
1ボクセル4バイト固定だと想定して組んでたんだけど
>>844 ありがとうございます
ないとはいえませんが例としてだしました。
バイトオーダーの意味がわからなくてたとえとしてお出ししました。
バイトのならびということでしょうか?
EGBαの順番など
>>842 申し訳ございません。
課題の性質上、付け加えるような形になってすいません。
で、実際はどんな課題なのですか? 目標があるはずですけれど・・・どこがゴールですか? お見受けするところ、卒業研究とかゼミだと思うんですけど。 普通の授業ではないですよね?
>>843 1.よろしいです。
ファイルが読めなかった&コードブックサイズが小さい場合にのみ
コードブックを作るようにしてる。
2.読み込む画像に合わせればOK,だと思う。
>>845 >バイトのならびということでしょうか?
>EGBαの順番など
その通り。 RGBαとか、αBGRとか。
>>847 普通の授業ではないです。
いわゆるゼミ形式?と考えらられます。まだ研究室に入ってないのでわかりませんが
授業スタイルとしては、発表をして問題点を挙げて解決するといったものです
>>848 ありがとうございます
ということは私がお願いした要素はほとんど終わったと考えてもよろしいのでしょうか?
私はソースを改良してコードブックを新たに作らずにということを考えいましたので
作るコードがどのレベルを想定しているかを知りたいのですが。 授業の目標。あるいはアナタのこの授業での目標はなんですか?
これは私の勝手な感想です。 私の幼稚な文章からどのような課題かを読み取ってプログラムを作ることの出来る みなさんのレベルの高さに前から正直驚いておりました。 情報工学を専攻なさっていた方たちが多いのでしょうか?
とにかく、K&Rもしくは他のしっかりとした説明のある書籍をご覧になることをお勧めします。 そうしないといつまでたっても先に進めません。
>>851 作るコードのレベルは、プログラムができない私がいうのもなんですがそれほど高くないと
考えております。(間違ってたらすみません)
授業のもくひょうとしては、先生が勝手にいってるのは普通の授業じゃでできないことするぞ
ということです。例えば画像の圧縮をしようか!ということではなく
画像を用いて何をしてもいいということです。
ですので私が勝手に作った目標としては、(圧縮?を目標に)三次元画像のコードブックを使って
似た画像ならそのコードブックを使って違うならまたCBを作り直す。
画像を読み込みツールが判断できるようなツールを作りたいと考えております。
こういったことでよろしいでしょうか?
>>853 どうしてもプログラミングが苦手で、みなさんに助けを求めた次第です。
個人的な事情ですがこの単位に命が半分くらいかかってると考えております。
勉強するのが一番というのはわかっております。みなさんには本当にご迷惑おかけします
>>850 たぶんできてるとは思うけど、あまりテストしてないのでバグがあるかも。
というわけで、あとは任せたノシ
>>852 ちなみに俺は情報工学専攻だった。MやDには行かず、B止まりだけど。
>>854 普通の授業じゃつまらないからね。目標達成できるようにがんばってくれ。
でも、
>>853 の言う通り、もうちょっとCの勉強が必要。
>852 うんにゃ。大学ではそんなん習ってない。高校でもならってない。小中はいわずもがな。 >853 ・・・K&Rはまとまってる思いますけれど、難しくないですかい・・・?
>>856 ありがとうございました。
修士に行っても通用しそうな方ですね。知り合いに修士の方がいて質問しにいったのですが
私の説明では理解していただけなかったです。
>>857 それなのにすごいですね
独学ですか
ご依頼はないようなので、寝るッス。 ノシ
自力で単位取れないなら辞めてしまえ どうせ後々困る事になるだろうけどさ
>>860 おっしゃるとおりです。大学辞める状況まで追い込まれています。
確かにおっしゃるとおりで言い訳しようもありません・・・。
プログラミングが苦手とかそいういう話じゃないと思う。 そんなに人付き合いが下手だと、生きているのが間違いだと思う。 どうしようもないよ。
またーり汁
>>862 生きているのが間違いって言うのは言い過ぎ。
>>834 834さんのソースでは、コードブックを作らなくてもよいということですが、
CBの中身は595さんの形からかわっていないのでしょうか?
変わっていなかった場合、そのCBからあるRGBαのインデックス番号を
読み取ってそのインデックス番号に符号化することはできるのでしょうか?
一番むかつくのは、向上心の無さだな
留年しておりまして、周りに深くきけるような人がいないのは事実です。
あちゃー
もう一年留年するくらい、どうってことないじゃん?
しかし……、ここで熱心に聞くより、教授に熱心に聞きにいった方が良かったんじゃないか? 教授によっちゃ、お情けで単位くれることもあるだろうし
>>865 すいません。
ソース見てみたのですがうまくいっているように感じました
失礼いたしました
教 授 に き け
>>869 そのとおりかもしれません。
色々なことも重なりこれ以上は留年できません。
詳しい説明は割愛します。
>>870 教授にプログラミングのことをさすがに聞けません。
さっきいったような符号化復号化の考えは自分で考えてみました。
(あんまり意味ないねといった感じでしたが)
情報工学化?
ここはチャットルームですか?
たぶん、そう。
> 作るコードのレベルは、プログラムができない私がいうのもなんですがそれほど高くないと > 考えております。(間違ってたらすみません) 間違えています。 高い低い以前に、自分ができる範囲のものにしましょう。
教授に質問される→自分で作ってないし理解してないから答えられない→単位ヤラネ
>>874 はい、
>>875 すいません
>>877 すいません。自分ができるレベルでやると確実に単位をとれそうになかったのです
すいません
>>878 > 教授に質問される→自分で作ってないし理解してないから答えられない→単位ヤラネ
そのとおりになるとおもいます。人に教えてもらってもいいという考え方の人ですが、
そのぶん成績のつけ方はシビアなかたでらっしゃいます。
面倒くさがらずに正攻法を。 1)勉強する。Cの本なんて3日で読破できる。それ以上かかるならマジであきらめる。 2)クラスメイトを作る。クラスメイトと同レベルでいいし、相談までいかなくても、雑談で流れくらい読める。 3)センセに相談する。 4)ちゃんと単位を取るために時間を使う。 5)人に尋ねるときの方法を学ぶ。 6)自分の行動が人からどう思われるか意識する。 7)死ぬわけじゃないので、単位をあきらめて、別の道を探す。 ここの人に↑にあげたことを代わりにやってくれと言ってるよ、あんた。
>>880 おっしゃるとおりです。
もうここで相談するのはご迷惑でしょうか?すいません・・・
相談するのは問題無い だがな あんたは無意味に喧嘩売ってるんだよ
>>882 勉強してから質問しろということですよね?
すいません・・・。もうここには宿題を投げてはいけませんか?
[2] @ int **f_memo(int **array){ //メモリ確保 array = (int **)malloc(sizeof(int) * (4)); //メモリ確保失敗 if(array == NULL){ printf("メモリの領域確保に失敗しました。\n"); free(array); } return array; } A void main(void){ int **array; array = f_memo(array); free (array); if(array == NULL){ printf("メモリを開放しました。\n"); } } @から確保したメモリをAで受け取って開放したいのですが上手くいきません。 ポインタが良くわからないので解説をお願いします。 [3] Windows2000 [4] 期限: [無期限]
>>883 > 勉強してから質問しろということですよね?
そうです。特に日本語と、相手への配慮を勉強してください。
> すいません・・・。もうここには宿題を投げてはいけませんか?
はい。ここに投げてはいけません。
>>884 >>1 のテンプレにしたがってください。
(freeではarrayの値は変わりません。解説終わり)
>>884 つーか、普通にcalloc使えばいいじゃまいか
f_memo () ; でメモリ確保が失敗したときにfree(array)をやってはいけません。 arrayはNULLなため、悪ければシステム全体がクラッシュします。
888 :
884 :2005/09/09(金) 00:35:09
>>887 NULLなのに開放しても意味ありませんでした。
>>886 書き漏らしてしまいましたがmalloc使用の縛りがあったのでこうなりました。
>>885 arrayはポインタでアドレスを指定してるだけだからfreeで開放できないのでしょうか。
>>887 free(NULL)は安全じゃなかったっけ?
まぁ元のソースではあきらかに不要だが。
>>883 別に投げてもいいんだけど、なんというか
「理想は高いけど、自分では何もせずに完全に他人任せ」
みたいに受け取られる箇所があるので、もう少し応対に気をつけてな。
あと、人に教えてもらって物作るの構わんし、参考になる部分も多いだろうけど、
ちゃんと内容を理解してないと困るのは自分だってことを肝に銘じておくように。
数日後か数ヶ月後になるかわからないけど、必ずしっぺ返しが来るよ。
とはいっても、俺も人の事をとやかく言える立場じゃないんだけどね。
まあ、とにかくがんばれ。
892 :
883 :2005/09/09(金) 06:18:15
>>891 何も言ってないのと同じですね。脳タリンですか?あなたは。
893 :
782 :2005/09/09(金) 09:45:35
おはようございまつ。 7日に宿題お願いしたものですが 同じ宿題に新たに条件をつけられまして・・・ お願いします・・・! [1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 構造体を作る。 (名前と年齢を入力する関数・名前と年齢を表示する関数を作る) 新たに加えられた条件 ・scanfは使わない。 ・関数を作る(名前・年齢を入れる関数(?)) ・年齢は年齢と思われる妥当な数値が入っていなかったらエラーを返す。 (500歳やら文字が入ってたらエラー出力) [3] 環境 [3.1] OS: Windows/Linux/等々 環境とかよくわかりませんがとりあえずWindowsです。 [3.2] コンパイラ名とバージョン: gcc 2.9 VC 6.0等 これちょっとわかりません、すいません・・・・ [3.3] 言語: C/C++/どちらでも可 のいずれか C言語でお願いします。 [4] 期限: [yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか (「できるだけ早く」は不可) 2005年9月9日(金)今日の12時まで [5] その他の制限: どこまで習っているか、標準ライブラリは使ってはいけない等々 当方C言語の初心者でいちお構造体習ったのですがさっぱりで・・・ よろしくお願いします・・・・
氏んで欲しいです。
896 :
782 :2005/09/09(金) 10:51:33
>>894 ありがとうございます。
コンパイルしたところ
cfe: Warning 513: sample3.c, line 35: 未知の制御文字 \0307 は無視されました。
// 与えられた年齢が異常であれば (-1) を返す。
cfe: Error: sample3.c, line 37: 構文エラーです。
if(prof.age<0 || prof.age>150) return (-1) ;
このようなエラーがでてしまうのですが・・・(´Д`)
コピペではエラーでかなったので打ち込みミスと思う。 35行目を削除してコンパイル
未知の制御文字列? もしかしてgccは単一行コメントを許可していないのかもしれません。 そのコメントを/* */でくくっても駄目ですか?VCでは通りましたが。
> (-1) EOFが置換されてる、コメントが機能してないんじゃね
そんな気がしてきた。
901 :
782 :2005/09/09(金) 11:13:56
コメントを/**/でかこったらコンパイル通りました! ありがとうございます。 度々すみませんが、 実行したらありえない数値(年齢)を入力すると ちゃんと『年齢がありえません』と出るのですが 普通の年齢を入れると出力されたときに千桁になってしますのですが・・・ 例→23歳と入力 出力→2320と出る。 自分で調べてみましたがちょっとわからず・・・。
そこまで作ったソースをうpしたほうがいいと思います。そうすれば添削もしやすいです。
もう時間が無いんだからいざとなったらコピペで提出!添削はその後。
904 :
782 :2005/09/09(金) 11:23:45
コピペでは再現できず。
まさか全角で入力してないよな…
907 :
907 :2005/09/09(金) 11:44:50
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 必ずポインタを用いること。 aとbの値を入力した後に、ポインタpを介して、aの値をbにコピー するプログラムを作成せよ。その時、a,p,*p,bの値を表示せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: borland c++ [3.3] 言語: C++ [4] 期限: [2005年09月08日12:00まで] [5] その他の制限: 無し 急いでいます^^;お願いします。
908 :
907 :2005/09/09(金) 11:45:41
提出期限9/912:00でした。すみません。
909 :
782 :2005/09/09(金) 11:46:22
全角では打ってないんですが・・・ ってゆうかあせってやってたんですが 提出は3時くらいまででイイっぽい。。。勝手だな教授。 どっちにしろ謎を解明せねば(`・ω・´)
>>907 #include <iostream>
int main()
{
int a, b, * p;
std::cout << "a = "; std::cin >> a;
std::cout << "b = "; std::cin >> b;
b = * p = a;
std::cout << "a = " << a << std::endl;
std::cout << "p = " << p << std::endl;
std::cout << "* p = " << * p << std::endl;
std::cout << "b = " << b << std::endl;
return 0;
}
bにはなんのために入力するんだ?
>>909 に限らず想うに…
先生側にしてみれば、せめて授業をまじめに聞いてくれてれば、
なんてことない宿題だろうからなあ……
条件追加にしても、特に難しくしたつもりはない、とんでもない
書き方した奴や迷ってるやつに指針を出した程度のことだから…
それを人だよりにしたあげく、勝手だな、なんてテラカワイソス………
コピペで普通に実行できましたが、しかもgccで。 なぜ、エラー?
>>907 #include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
int a, b;
int* p = &b;
cout << "a = ", cin >> a;
cout << "b = ", cin >> b;
cout << "a == " << a << endl;
cout << "b == " << b << endl;
cout << "p == " << p << endl;
cout << "*p == " << *p << endl << endl;
cout << "Assign value which a was converted into to *p." << endl;
*p = a;
cout << "a == " << a << endl;
cout << "b == " << b << endl;
cout << "p == " << p << endl;
cout << "*p == " << *p << endl;
}
>>891 ありがとうございます。
>>834 さんのをコンパイルしたのですがエラーが出ました
834さんはテストしてくれたいたようですので環境の違いからでしょうか?
>>914 明らかにエラーになる箇所があって、
506行目に
int write_data(
が抜けてると思われ。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
オマエら・・・こいつを落第させるのも人の道だと思うが・・・。
この世から宿題をやる気を奪って堕落させ、既得権益を守ろうというのがこのスレの趣旨です。
そもそも、宿題丸投げウザイ というので出来た隔離スレ
>>915 どうなおせばいいんでしょう?
c:356: parse error before `*'
c:359: `tmp_hist' undeclared (first use
in this function)
c:359: (Each undeclared identifier is
reported only once
.c:359: for each function it appears in.)
などがエーら分です
エーら分 ワロタ
>>920 そのソースには致命的なミスが存在しています。
まず、コードブロックの初めのところでないにもかかわらず変数を宣言しています。
面白いね。まとめページ作ってくれると、流れが分かるので、手伝えるかも>920
んー・・・・最初は
>>271 かな。
釣り師としては上等なほうだな。
927 :
834 :2005/09/09(金) 17:15:59
>>914 あー・・・ごめん、コピペミスorz
>>915 の指摘が正解
(intをBOOLEANにtypedefしてるのに、置換し忘れてるのはナイショ
>>924 いろいろ仕様追加していくうちにスパゲッティになってる罠。
最初から読んでくと流れが分かると思う。
914です。 今まで自分ができうる限りの努力をいたしてまいりましたができませんでした・・・。
>>923 ありがとうございます
>>924 ありがとうございます
さっそく試してみます
>>925 すいませんこれ以上ご迷惑おかけできません
>>927 ありがとうございます。
コンパイル通ったらこれでコードブックを一度作ってしまえば今後作らないでも
そのCBを利用できるということですか?
少しも考えようとする頭は無いようだ
931 :
834 :2005/09/09(金) 18:59:31
>>929 試してみればわかる。
コードブックが同一のものかどうかは以下の操作で検証可能。
1) 画像1に対し、プログラム実行 → コードブックA作成
2) コードブックAを別名(コードブックA')でコピー
3) 画像2に対し、プログラム実行(コードブックA使用)
4) コードブックAとコードブックA'をdiff等で比較
以上、がんがれ
>>924 ありがとうございます
うまくいきました
>>931 前にもいっていた834さんが変えたところですが
/* ベクトル値を各要素に分解 */
void get_rgba_from_color(
COLOR_t color,
int *r, int *g, int *b, int *a
)
{
*a = (color >> ((3 - DST_CHANNEL_A) << 3)) & 0xFF;
*b = (color >> ((3 - DST_CHANNEL_B) << 3)) & 0xFF;
*g = (color >> ((3 - DST_CHANNEL_G) << 3)) & 0xFF;
*r = (color >> ((3 - DST_CHANNEL_R) << 3)) & 0xFF;
}
このままですとおかしなことになり(近いベクトルを選ぶ際、それぞれを対等に扱ってない
のである特定の色が重視されてしまう)
元に戻しました。
ありがとうございました
YCrCb変換についてやってみようと思います。 みなさん本当にありがとうございました。
「ました」ってことで、過去になってるな。さようなら。
なんか荒れてるね。 回答者は2〜3人だと思うんだけどさ。他の人はスルーすればよろし。
937 :
デフォルトの名無しさん :2005/09/10(土) 14:21:48
今回荒らしてるのは質問者だろ 本人に自覚が無いようなのでたちが悪い
はちゃめちゃな質問方法は、意図してやってるって(^^;; 本人が「これ以上ご迷惑おかけできません」って言ってるんだから、もう来ないでしょ。
つか、
>>934 は、やれやれ過去形だからようやっとお終い、
と考えていいんだよな、という回答側のため息に過ぎないと見るのだが、
それらを揚げ足とりと言ったり、プなどとは、何様のつもりでなんだろか?
942 :
940 :2005/09/10(土) 17:08:49
ああ、やっぱり低脳の考えることなんてそんなもんか… 理で書けないし。 940 は 934とはまったくの他人。勝手に巻き込むのは嫌なので念のため。終了
一々荒らしに釣られてレスしてる馬鹿が何を偉そうに
>>940 同意はするが、>941みたいなのは構うだけ無駄。スルーしなされ。
スルーできないのも低脳の証拠みたいなものですぜ。
#って、漏れもだな。
文末に「漏れもだな」とか書くなら最初から書くなよ
>>940 意図を汲み取ってくれてありがとよ。
擁護されるとは思ってなかった。
947 :
名無しさん@そうだ選挙に行こう :2005/09/10(土) 22:15:34
>947 乙、いいタイミングだ。
んん?タイミングを計ったつもりは無いんだが。
まだだ。まだ終わらんよ。