1 :
デフォルトの名無しさん :
2005/10/05(水) 15:21:12
5 :
デフォルトの名無しさん :2005/10/05(水) 15:23:41
乙
7 :
前回の946,894 :2005/10/05(水) 17:14:44
>>7 余計な注釈入れずにテストしたコードをそのまま上げろ
それに<vector>ってC++だろ
9 :
前回の946,894 :2005/10/05(水) 17:39:02
>>9 正直、糞すぎ。
一番下の
GetEnergy((struct _iobuf*)&allFp,(char*)&lpszFileName,(int)&nStep,(int)&allDNum);
はたぶん。
GetEnergy(allFp,lpszFileName,nStep,allDNum);
こう。
で、こう直してもallFpもnStepも未初期化だから絶対に意図したようには動かない。
これ以上は見る気も失せたから知らん。
>>10 lpszFileNameも未初期化ですね。
というか何したいねん。これ
12 :
7,8 :2005/10/05(水) 18:02:38
ただテストしたいんですけど、どう値を当てていいか解らず、
質問しました。
初めは
>>10 のGetEnergy(allFp,lpszFileName,nStep,allDNum);
にしたんですけど、↓になってしまい
warning C4700: 値が割り当てられていないローカルな変数 'nStep' に対して参照が行われました。
warning C4700: 値が割り当てられていないローカルな変数 'lpszFileName' に対して参照が行われました。
warning C4700: 値が割り当てられていないローカルな変数 'allFp' に対して参照が行われました。
苦し紛れにキャストしてしまいました。
警告はコンパイラの出す唯一の親切。 それを黙らすのがそもそも間違いというか人間として腐ってる。 あと、テストするときの値を何にするかは今の情報だけじゃ、こっちは分かるはずがない。 自分でテストするべき値を割り当てろ。
14 :
7,8 :2005/10/05(水) 18:13:56
警告はコンパイラの出す唯一の親切←なるほど もう一回調べてみます。
テストって,上の部分もおまいが作ったのか?
16 :
7,8 :2005/10/05(水) 18:23:01
そうだけど。
>>15 自分で作っといてテスト方法が分からんはありえんだろ。
18 :
17 :2005/10/05(水) 18:27:07
つーか、最低限どういう引数を取ってどういう処理をする関数なのかぐらい書けよ
20 :
おしえて厨 :2005/10/05(水) 18:41:01
[1] 授業単元:画像関連の科目 [2] 問題文(含コード&リンク): 白黒画像ファイルを読み込んで、その画像ファイルを碁盤の目のような感じに小さい正方形たちに区切られているとみなし、 その正方形ひとつひとつにつき、正方形内に占める黒画素の割合をそれぞれ計算して出力するプログラムを作れ。 左上、右上、左下、右下の4つの正方形領域があるとみなして、それぞれの領域内での黒画素の割合を出すってだけでもいい。 何個の正方形に区切るかは任意。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C/C++/どちらでも可 [4] 期限: [2005年10月6日まで] [5] その他の制限: 画像ファイルはpgm形式
>>7 ,8
なんつーかね,君がやりたいことを書いてくれれば一から書き直すからさ.
きちんと全部説明してくれよ.そのほうが絶対に早いし,動くものができるからさ.
>>7-8 下のことをまとめてくれ。
1) プログラムの概要(何をするためのプログラムか?)
2) 入力ファイルの形式(orサンプルファイル)
3) プログラムの処理の流れ
4) 期待している処理の結果(出力ファイル、表示形式等)
あと、ソースにmain関数が入ってないぞ。
23 :
7,8 :2005/10/05(水) 18:50:58
ファイルポインタと、ファイル名と、 nStepって言う名の番号と、allDNumという名のデータ数を渡したいんですけど ファイル名とnStepとallDNumは渡せたんですけど、 ファイルポインタだけ渡せないんですけどどうすれば渡せますか?
24 :
7,8 :2005/10/05(水) 19:16:56
「話の噛合わなさ」が笑えるずれですね
>>24 どうやら君とは意思疎通ができないようだ 力足らずで申し訳ない 諦めてくれ
27 :
デフォルトの名無しさん :2005/10/05(水) 19:29:18
cの質問です char型の入力をするのに scanf()とgetchar() がありますが、それぞれの長所短所って何ですか? 初歩の初歩ですいません
29 :
7,8 :2005/10/05(水) 19:37:33
もう一回あとで書き直します。一回リフレッシュします。
30 :
デフォルトの名無しさん :2005/10/05(水) 19:38:02
>28 ごめんなさい。 誘導ありがとうございます。そっちのほうで聞いてみます
いやはー。C++は便利だのぉ。
C++の標準ライブラリ、俺も使いこなしてぇ。
>>31 スレ違いだが、参考書を教えてちょ。
>>31 main の if (!pgm_read( "sample.pgm", data, max_level)); はセミコロンの前に
return 0 でも入れてください.エラー処理書くつもりで忘れてた.
34 :
& ◆hJb7GWrzxo :2005/10/05(水) 20:16:51
>31, 33 どうもたすかりましたありがとう
>>24 エスパーになった気分で質問に答えとく。
AllToAscFileConvert()でバイナリファイルが開けないなら、
引数のファイルパスが本当に正しいか確認しろ。
あと、GetEnergy()はAllToAscFileConvert()の中じゃないと呼べない。
なぜなら、引数で渡してるallFpはAllToAscFileConvert()の中で開いてるファイルの
ポインタだからだ。
コンパイルが通ったなら、あとはブレークポイント張ったり、ログを出力したりで
怪しいところを1個ずつチェックしていけ。
36 :
おしえて君 :2005/10/05(水) 20:37:17
[1] 授業単元:画像関連の科目 [2] 問題文(含コード&リンク): 白黒2値画像ファイルを二枚読み込んで、二枚の画像を引き算した結果を出力するプログラムを作れ。 画像の引き算というのは、画像のそれぞれの画素を、もうひとつの画像の同じ座標にある画素で引き算するということ。 引き算の結果は1か0になるように、すべて絶対値をとること。 最後にすべての画素での引き算結果の絶対値を合計する。そしてその数値を出力してほしい。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C/C++/どちらでも可 [4] 期限: [2005年10月6日まで] [5] その他の制限: 画像ファイルはpgm形式
まー、その、なんだ。 元画像のファイルをupしてくれ。
次から次へと白黒画像ファイルの課題が来る予感('A`)
39 :
& ◆McolPJAn7. :2005/10/05(水) 21:14:45
40 :
36 :2005/10/05(水) 21:26:35
> 次から次へと白黒画像ファイルの課題が来る予感('A`) これでおしまいです。どうもご迷惑おかけしてすみません
白黒、01というから、2値画像と思ったんだが。グレイスケールなのな。 引き算の意味がわからんな・・・。 A B A - B 0 0 0 0 1 0 1 0 1 1 1 0 って考えればいいのか? あと、。閾値もかんがえんといかんのか。
>>41 2つの画像で重なってる画素の部分を単純にXORすればいいんじゃないの?
43 :
36 :2005/10/05(水) 22:32:24
ありゃあ、そういえば2値画像ではなくてグレイスケール画像なのでした・・・。 でも、255の半分の127か128を閾値にして、それより上は全部255、 それより下は全部0みたいにすればいいと思います。 あと、引き算はマイナスになると絶対値をとるので、 例えば0-1も1となるようにしてもらいたいです。
>>42 グレースケールの XORって何物さ?
例えば 0.7 xor 0.4 っていくら?
45 :
36 :2005/10/05(水) 22:58:26
>>44 グレイスケールの各要素を閾値を使って2値分割してからXORすれば
いいんじゃないかと
>>44 >>42 で言ってるのは、
グレースケール1画素=8bitのunsigned値でXORってことでしょ。
・・・って、釣られてる?
48 :
36 :2005/10/05(水) 23:53:28
なんだかむずかしくてよくわからない話になってきました・・・
単に飽和加算と飽和減算してやればいいと思われ
ただし濃度の最大値を最小公倍数に調整
pgmは幅高さ深さの情報が、二行に分かれていることを保証していないがいいのだろうか。 例えば、 -- P2 1 1 255 128 -- ってファイルもありなんだけど。
53 :
7,8 :2005/10/06(木) 12:48:03
>>53 入力バイナリファイルのサンプル
出力テキストファイルのサンプル
および、それぞれのファイルの構造を説明した文章
をUPせよ。
55 :
7,8 :2005/10/06(木) 12:58:11
↑値は入ってるものだと思ってください。 よろしくお願いします。
私にはこの情報だけでは無理だ。
>>55 だから、あなたが示したものはソースコードであって、バイナリファイルの本体じゃない。
『藻前の持ってるallファイル』をUP汁。それとも人には見せられない内容なのか?
>>53 仮にバイナリファイルを読み込んだ結果が
>>53 だとしても、
出力ファイルの書式がわからないし、
構造体の値をどのように使えばよいのかわからない。
せめて出力結果の例と、構造体メンバとの対応くらいは説明しろ。
なんか3回くらい同じこと言ってる気がするぞ。
ポインタをバイナリ形式で保存ってのはムズイと思うんだが。
60 :
7,8 :2005/10/06(木) 13:18:36
allファイルを拡張子だけ変えて拡張子ascファイルにするんですけど、 allファイルはバイナリの値が入ってるものだと思ってください 出力は例えば、 10.509150 1212 12.90324 4235 ・ ・ ・ BOOLは出力しなくていいです。気にしないで下さい。 AAAは可変なんですAAA内のデータ件(10件)分出力する MMMも可変でデータ件数(5件)分出力する AAAのみ出力 AAAはBBBを読み込まないとAAAは解らないとします。 やっぱりバイナリの値を決めます。 バイナリの値は f=22.33F i=5 d=12.3 です。
> typedef MMM *pAB; これにものすごい違和感を覚えたのは俺だけだろうか。
62 :
7,8 :2005/10/06(木) 13:23:02
*.allファイルのAAAの値を*.ascファイル形式に変換して保存 *.ascファイル名は変換元となる*.allファイルの拡張子をascとしたもの
>allファイルを拡張子だけ変えて拡張子ascファイルにするんですけど rename()
> *.allファイルのAAAの値を*.ascファイル形式に変換して保存 int c; FILE *fin, *fout; /* 略 */ while ((c = getchar(fin)) != EOF) fprintf(fout, "%02x ", c);
>>60 > AAAは可変なんですAAA内のデータ件(10件)分出力する
> MMMも可変でデータ件数(5件)分出力する
データ件数はどこから持ってくる?
> AAAのみ出力
ということは、上の例はAAAのメンバを順番に1行ずつ出力してると
考えていいんだな?その場合、有効桁数はどうするんだ?
> AAAはBBBを読み込まないとAAAは解らないとします。
AAAとBBBの関係を示せ。
BBBからAAAのデータを作るという意味か?わけわからんぞ。
> allファイルはバイナリの値が入ってるものだと思ってください
そのファイルの形式が不明(Cの構造体では説明になっていない)。
ってことで、
>>54 >>57-58 が要求している情報の回答が必要だと思うよ。
67 :
7,8 :2005/10/06(木) 13:36:50
あっデータ件数は allファイルにあります。。。 (allファイル) データ件数 int ここでは10件とします
68 :
7,8 :2005/10/06(木) 13:40:10
↑先頭にあります(データ件数)
あー。最初から読んでようやくわかった。
>>53 のプログラムは説明用に書いたものか・・・。
わざわざわかりにくくしてるね。
んで、これ、業務? ゼミ?
質問の仕方が下手だと、仕事おわんないよ。とりあえず、本番のプログラム、データをUPしよう。
複数ファイルになるならzipで固めるとかすればよろしい。
70 :
7,8 :2005/10/06(木) 13:43:42
ちょっとしっかり書きます。みなさんすみません
71 :
7,8 :2005/10/06(木) 13:49:20
*.allの中身 項目名 型 備考 データ件数 int ここでは10件とします ここからデータ件数分繰り返す AAA内のデータ数 int ここでは5件とします AAAの値 float AAA内のデータ数分出力
あー。こらこら。AAAとか分けのわからん名前をつけたでっちあげのものを使うのはやめなさい。 本番の名前をつかいましょう。
73 :
7,8 :2005/10/06(木) 13:55:38
出力は(例) 10←データ件数(固定) 10.509150 2.906092 -2.487760 ・ ・ ・ ・
74 :
7,8 :2005/10/06(木) 13:57:41
本番の名前ですか・・ ええっとAAA→TOP AAAを格納する構造体の名前→ONESELF
75 :
7,8 :2005/10/06(木) 13:58:36
>>72 解りやすいかと勘違いしました。それでAAAとしました。すみません。
*.allのバイナリファイルをUP。
>>74 んー。翻訳されると、逆にわかんないので、
・本番の構造体
・本番のファイル
・本番のソースファイル
をUPしたうえで、
>>1 のテンプレートにしたがって、書き直してください。
変遷してるみたいだから、書き直してもらわないと、全体がつかめなくなっています。
78 :
7,8 :2005/10/06(木) 14:02:41
バイナリのファイルはこれが出来上がってじゃないと先生がくれないんですよ。 処理ができたらファイルをくれるので、値は決まってないです。
[4] 期限: [2005年10月6日14:00まで] 終了だな。乙。
80 :
7,8 :2005/10/06(木) 14:06:08
本番用を簡潔に表したんですけど。。掴めなさそうなので、、upします。
釣り師同士が釣り合いしているスレはここでつか?
要は
>>9 、
>>24 のソースにあるGetEnergy()を
ちゃんと動くようにしてくれってことでしょ。
>>78 > バイナリのファイルはこれが出来上がってじゃないと先生がくれないんですよ。
それでも、
・バイナリファイルの形式(データ構成)
・テキストファイルの形式(出力フォーマット)
これらは何らかの形で先生から提示されてるはずなので、
それを「そのまま」UPしろ
釣りだろ。センセも架空の人物な気がしてきたぞ。
84 :
7,8 :2005/10/06(木) 14:42:49
85 :
7,8 :2005/10/06(木) 14:46:33
↑自分で書いたソースは書き込みのところがおかしいのとバイナリの値を テキストに変えるのが解らないです。 バイナリからテキストに変えるだけが解りません。 書き込みは何とかなると思います
まあ、シンプルな解だが、fprintf()とか。
87 :
7,8 :2005/10/06(木) 14:56:22
fprintfですか!早速試したと思います。
88 :
7,8 :2005/10/06(木) 15:53:12
できました。fprintfでした!ありがとうございます。fwriteを使ってました。
('A`) オチはそれかよ・・・
90 :
7,8 :2005/10/06(木) 16:27:58
みなさんありがとうございました!ホントにすみませんでした!
91 :
86 :2005/10/06(木) 17:05:08
あー。冗談だったんだが。 つーか・・・printf系は教科書の最初の方にでてるはずだし、 仮にfprintfを知らなくてもマニュアルのprintfと同じ位置に書かれてそうに思うが。
fwriteって・・・K&Rでは付録の標準ライブラリ関数一覧でしか触れられてない様な奴だぞ いくらなんでもネタだろ
マニュアルってどこにあるの?
googleとかMSDNとかJISハンドブック情報処理編(これは今出てないか)とか manとかLSI Cの付属のものJISCのPDFとか。ネタだと思っても反応してしまう。 俺はマニュアル代わりにH&Sリファレンス使ってるが・・・絶版だな。
95 :
7,8 :2005/10/06(木) 18:33:13
結構本気でした。うっかり忘れてました。。。すみません
96 :
36 :2005/10/06(木) 18:37:28
まあ、書き換えればOKじゃない。
98 :
31 :2005/10/06(木) 18:47:49
>>36 手元の Windows の Borland C++ Compiler と cygwin の g++,Gentoo の g++ で
pgm の資料のページにあった奴をコピペしたら一応走ったので書いちゃったけど,
エラー処理とか全然してないので駄目かも.
入力に使ったファイルうpできますか?
99 :
36 :2005/10/06(木) 18:52:45
>>99 その画像はバイナリ版(ヘッダがP5)だね。
>96はテキスト版を想定しているから入力ロジックを書き換えないと動かない。
>98が書き換えてくれるのを待つか、今晩遅くに私が自作ロジックをあげるのを待つよろし。
101 :
36 :2005/10/06(木) 19:28:40
>100 98氏にも100氏にもどっちにも期待・・・ おねがいします
>>101 罠だ、気を付けろ!100はおまえの先生だ!
あるあるw
適宜,・・・うんぬんのセンセも居たしな
105 :
デフォルトの名無しさん :2005/10/06(木) 19:44:03
[1] 授業単元: C [2] 問題文(含コード&リンク): F(s)=(1/(2*PI*PI*s*s))*(sin(2*PI*s*R)-(2*PI*s*R)*cos(2*PI*s*R)) 半径Rの球の散乱関数F(s)を求めるプログラムです。 scanfでRを指定して、sは0から無限大を指定したいです(while構文?) printfでsが変わる度にF(s)を表示したいです。 グラフで表すと、sを無限大にするとF(s)が0に収束するような感じになります。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:わかりません。 [3.3] 言語: C [4] 期限: [明日早朝まで] [5] その他の制限: 4年前に勉強したがさっぱり忘れました。 もっこすお願いします
散乱関数がよくわからない。(ごめんね) できれば、 ・その数式をグラフ付きで説明しているページ プリーズ。 それから、 ・sのキザミはいくつごと? ・プログラムで無限大は扱えないんだけども ってことで、現在の情報では組めない。
107 :
31 :2005/10/06(木) 19:57:01
>>105 >104 のとおりどこまで表示したらいいかわからんかったので
F(s) が十分小さくなるまで h 刻みで表示してやった
#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793238462643383279
#define h 0.001
#define EPS 0.0001
double F(double s, double R) {
return (1.0/(2.0*PI*PI*s*s))*(sin(2.0*PI*s*R)-(2.0*PI*s*R)*cos(2.0*PI*s*R));
}
int main() {
double s, R, Fs = -1;
scanf("%lf", &R);
for (s = h; fabs(Fs) >= EPS; s += h) {
Fs = F(s, R);
printf("%lf %lf\n", s, Fs);
}
}
>>105 刻み幅がわからんから勝手に0.1刻みにした。
都合悪かったらs+=0.1のところの0.1を適当に変えといて
#include<stdio.h>
#include<math.h>
double F(double s,int R){
return (1/(2* M_PI* M_PI*s*s))*(sin(2*M_PI*s*R)-(2*M_PI*s*R)*cos(2*M_PI*s*R));
}
int main(){
double R,s;
printf("R = ");
scanf("%lf",&R);
for(s=0;;s+=0.1)printf("F(%f)=%f\n",s,F(s,R));
return 0;
}
>>109 s = 0 でその F(s) は分母ゼロになって未定義になるので lim_{s → 0} F(s) = 0 を
分けて書くかループの開始をずらすかしたほうが幸せと思われ
111 :
109 :2005/10/06(木) 20:29:53
あ、修正かけるの忘れてた ×double F(double s,int R) ○double F(double s,double R)
収束するとわかってるなら、 s = s*2で、Fの絶対値が0に十分近くなるまで計算しとけばいいんじゃないか?
113 :
105 :2005/10/06(木) 20:58:11
>>108 >>109 =111
>>110 の先生がたありがとうございます。
グラフは探したけど見当たりませんでした、すいません。
ちなみに
lim_{s → 0} F(s) = 4/3πR^3
になります。
グラフを求めるためのプログラムなので
sの刻みは0.1でお願いします。
F(s)は原点反射で+−を繰り返して0に収束します。
今から夜勤なのでまた早朝チェックします。
で、どこが問題なんだろう。
>>113 え? Taylor 展開したら F(s) = 4/3 π R^3 s - 8/15 (π^3 R^5) s^3 + O(s^4) になったんだが。
もし s の付け忘れでないなら、式が間違ってる可能性があるのでチェックよろしく。
刻みくらいはプログラム見て直してくれ。
[1] C演習 [2] (x-x1)^2+(y-y1)^2+h^2=r1 (x-x2)^2+(y-y2)^2+h^2=r2 (x-x3)^2+(y-y3)^2+h^2=r3 但し r1:r2:r3=a:b:c x1,x2,x3,y1,y2,y3,h,a,b,cは既知。これを満たすx,y,r1,r2,r3を求めよ。 要は三元連立二次方程式を解けってことだと思います。 [3] 環境 [3.1] UNIX [3.2] gcc ? [3.3] C [4] 期限: [2005年10月8日23:00まで] [5] 特にないです 急に出題されたもので困っています。よろしくお願いします!
>>116 1,2と3,4とでそれぞれ1問と考えてよいのだろう。4つ組む必要があるけどね。
>>117 わからん。式からして、円が3つあって、それぞれ
原点が、(x1, y1), (x2, y2), (x3, y3)
半径^2が、r1-h^2, r2-h^2, r3-h^2で、
半径の比がa, b, c。
この3つの円周が3つとも重なる点がx, yだけど・・・。
数学板で解き方おしえてもらったほうがいいかも。
すまん。半径の比は間違いだ。
>>116 とりあえず、1.
#include<stdio.h>
int main(int argc,char *argv[]){
char buf[1024];
FILE *fp;
size_t n;
if(argc!=2)return 1;
fp=fopen(argv[1],"r");
if(!fp)return 1;
while(1){
n=fread(buf,1,sizeof(buf),fp);
if(!n)break;
fwrite(buf,1,n,stdout);
}
fclose(fp);
return 0;
}
>>116 んでもって、2.
#include<stdio.h>
int main(int argc,char *argv[]){
char buf[1024];
FILE *ifp,*ofp;
size_t n;
if(argc!=3)return 1;
ifp=fopen(argv[1],"r");
if(!ifp)return 1;
ofp=fopen(argv[2],"w");
if(!ofp){
fclose(ifp);
return 1;
}
while(1){
n=fread(buf,1,sizeof(buf),ifp);
if(!n)break;
fwrite(buf,1,n,ofp);
}
fclose(ifp);
fclose(ofp);
return 0;
}
>>116 3.完成
#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[]){
char buf[8192];
FILE *fp;
size_t line;
if(argc!=2)return 1;
fp=fopen(argv[1],"r");
if(!fp)return 1;
for(line=1;fgets(buf,sizeof(buf),fp);line++){
if(buf[strlen(buf)-1]=='\n')buf[strlen(buf)-1]='\0';
size_t words;
char *dp;
printf("-----%d-----\n",line);
dp=strtok(buf,",");
for(words=1;dp;words++){
printf("%d:%s\n",words,dp);
dp=strtok(NULL,",");
}
}
fclose(fp);
return 0;
}
#include<stdio.h> #include<string.h> #include<stdlib.h> int main(int argc,char *argv[]){ char buf[8192],*data[256]; FILE *fp; size_t line,a,b; if(argc!=4)return 1; if(!(fp=fopen(argv[1],"r")))return 1; a=atoi(argv[2]),b=atoi(argv[3]); for(line=1;fgets(buf,sizeof(buf),fp);line++){ if(buf[strlen(buf)-1]=='\n')buf[strlen(buf)-1]='\0'; size_t words=0,i; char *dp=strtok(buf,","); printf("-----%d-----\n",line); if(dp) for(words=1;dp;words++){ data[words-1]=dp; dp=strtok(NULL,","); } if(a<=words&&b<=words){ char *tmp=data[a-1]; data[a-1]=data[b-1]; data[b-1]=tmp; } for(i=0;i<words-1;i++) printf("%d:%s\n",i+1,data[i]); } fclose(fp); return 0; }
125 :
113 :2005/10/07(金) 07:28:39
>>115 式の計算までしてくださってありがとうございます。
ロピタルの定理を使って分母分子を2回微分してs=0を代入すると
F(s)=4/3πR^3になるみたいです。
ありがとうございました。
>>125 もう解決してる気がするけど、分子二回微分したら
4πR^2 ( sin(2πRs) + 2πRs cos(2πRs) )
になって s → 0 で 分子 → 0 だから、結果 0 と思うがなあ。
127 :
125 :2005/10/07(金) 11:43:22
>>126 すいません、僕の間違いでした。
最初の式が
F(s)=(1/(2*PI*PI*s*s*s))*(sin(2*PI*s*R)-(2*PI*s*R)*cos(2*PI*s*R))
でした。
すいません。。
どうか以下の問題を助けてください┏oペコリッ 【質問テンプレ】 [1] 授業単元: ソートとサーチ [2] 問題文(含コード&リンク): @主な準備 ・対象データ配列作成プログラム その都度指定する個数X(最大100万程度)の整数をランダムに並べた配列を作成、 また、必要に応じ整列済み、逆順整列済みなどのデータを作成。 ・処理時間の測定方法の調査 ・ソート結果が正しいかどうかチェックするプログラム Aサーチプログラム1 与えられた配列から指定した値を検索する。 Bソートプログラム1 バブルソート、挿入ソートなどのNの2乗オーダのプログラムを1つ以上。 Cサーチプログラム2 整列済みの配列から指定した値を高速に検索する。 Dソートプログラム2 クイックソートなどNlogNオーダの高速ソートプログラムを1つ以上。 [3] 環境 [3.1] OS: Unix [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [2005年10月14日07:00まで] [5] その他の制限: 特になしです。 まるっきり分かりません(´・ω・`)
129 :
128 :2005/10/07(金) 19:59:19
>>128 すいません
[5]その他の制限:/* */コメントこまめにつけてくれると助かります><
よし、いい加減にヒント (1) >個数X(最大100万程度)の整数 これって要素数が100万って言うことですよね →malloc()か初めから無駄に100万要素確保 >ランダムで作成 →とりあえずrand()でいいんじゃないかな 値が気に入らないようだったら複数回呼び出して作るか (8771と6584と8402とかでたら * / \ % 使って 775840 とか) 自前で疑似乱数作るのも… >ソート結果が正しいかどうかチェック 昇順か降順かわからないけど 昇順チェックにforかwhile使ってa[i]>a[i+1]だったらbreakして その時のiの値によって最後までいったか途中で(ry ごめん…time.hまともに使ったことないんだorz (2)探してるものをbとすると a[0]がbかどうか、a[1]が…を延々とやる。見つからない場合は(ry (4)→バイナリサーチ a[0]〜a[99]まで昇順のがあったら a[(0+99)/2]=a[49]を調べる。あたり→よかったね a[49]より大きい→a[(49+1+99)/2]=a[74]を a[49]より小さい→a[(0+49-1)/2]=a[24]を 以下あたるまでループ。見つからなかったときの言い訳を考えておくこと (3)(5)講義で習ったんじゃないの? わかんなかったらその単語をgoogle他で検索 腕試しに徹夜で考えてみます
>>128 ひとつ確認
>必要に応じ整列済み、逆順整列済みなどのデータを作成。
ってのは整列済みのデータを生成する、つまりランダム生成してからソートは駄目ってこと?
あと
>処理時間の測定方法の調査
は、 linux なら time とかいうコマンドがいるはず。詳しくは man time とか Google。
clock()かな・・・標準ライブラリで時間計測に使うの・・・。 あと・・・n log n のソートだと100万件でもあっとゆー間だったように思う。 1メガ個だろ・・・。今の3ギガHzとかのCPUじゃ1秒もかからんのじゃないか?
gettimeofdayなんてどう?時間計測。
[1] 授業単元: C言語講座 [2] 問題文: @高さと幅40*40で8bitのグレースケールビットマップの画素値を入れた[40][40]の二次元配列を使い 画像のエッジ処理をせよ。(輪郭を際立たせよ) A高さと幅40*40で8bitのグレースケールビットマップの画素値を入れた[40][40]の二次元配列を使い 80%に縮小せよ。 [3] 環境 [3.1] OS: Windows2000 [3.2] コンパイラ名とバージョン:VC [3.3] 言語: C [4] 期限:[無期限] [5] その他の制限:ライブラリ禁止 モジュールなど使わずにfor文や配列などの基礎的なものだけで回答せよ。 1の問題はラプラシアンなど微分演算しないでも出来、マスク処理をするとやりやすいとのことでしたが、msdnのサイトや ビットマップの構造についていろいろ調べてもさっぱりでした。 2の問題は2分の一に縮小は出来たのですが、配列のみで%で縮小・拡大率を変えることが出来ませんでした。 あまり役に立たないと思いますが二分の一の時のソースを記しておきます。よろしくお願いします。 //2分の1縮小 biWidth = srt->biWidth/2; biHeight = srt->biHeight/2; Arr = CreateArr2(biHeight, biWidth); for(i=0; i<Height; i+=2){ for(j=0; j<Width; j+=2){ Arr[i/2][j/2] = Arr[i][j]; } }
>>135 1は注目画素と隣接画素の差を取るだけでもそれっぽくなるけどそれじゃダメなのかな?
2は同じ要領で1/2のかわりに.8倍すればいいと思う。
137 :
128 :2005/10/08(土) 03:06:12
>>130 様
まるっきしソースから分からないんです;;
もし、お暇があればお願いしますです。
>>131 様
私もそこで迷ったんですが。。。そもそもランダムのさえ作るのがわからなくって・・・全然進展しません;;
いきなり作れって言われた感じで・・・
>>132 様
ありがとうございます!ありがたく受け取りますです┏oペコリッ
スキヤキにビールを入れるとか肉ばっか喰うとか、カンベンしてください。
>>128 >・処理時間の測定方法の調査
時間を計るときにどこにスタートとストップを置くかじゃないかな?
>>139 様
神。・;+゜・(ノД`):・゜+:・。ありがとうです;;
143 :
135 :2005/10/08(土) 12:33:59
>>136 @
一応下記のように前後の配列を比べて違う時だけ取り出すやり方を一つのやり方を作ってみたのですが
違うやり方を想定していたらしくて。
下記のものも不完全で縦の行を上下で比べ方が前後を比べるやり方で出来ないため横の直線だけ空白になってしまい
どうしたらいいのか解らないので凍結していました。
for(i=0; i<Height; i++){
for(j=0; j<Width; j++){
if(Arr[i][j+1] != Arr[i][j-1]){
Arr2[i][j] = Arr[i][j];
}
}
}
Aは今は80%だけど35%もしくは117%のように縮小拡大に対応させれるようにしなくてはいけないので。
縮小の場合は配列を何個飛ばしで読み込みの計算が小数の扱いなどがわからなくて。
拡大は2倍の時は2個連続で同じ配列の値を読みこんでいたのですが。
>>143 丸数字は避ける癖を付けたほうがいいとおも
(1)
if (Arr[i][j+1] != arr[i][j-1] || Arr[i-1][j] != Arr[i+1][j]) Arr2[i][j] = Arr[i][j]
じゃだめなの?
(2) x パーセントにする → 画像を x 倍して100個飛ばし or 100個の平均を取る
>>144 今すぐは試すことが出来ないのですがやってみます。ありがとうございました。
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): コマンドラインから指定したファイルをいったんメモリに全て読み込み、 その後内容をバイト単位で16進するプログラムを書け [3] 環境 [3.1] OS: X端末っていわれてるこんぴゅーたです [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: できれば月曜中でおねがいします [5] その他の制限: よろしくおねがします
[1] 授業単元:応用プログラミング [2] 問題文:デジタル音声データ処理において、音の高低を求めるピッチを求める時雑音処理のために平均化処理が行われる。 音声を短い時間窓で区切って、各区間で周波数を求めることにより、音の高低の推移がわかる。 ある手法で求められた各時間窓の周波数(HZ)を入力し、その値を平均化するプログラムを作成せよ。 ここで平均化処理は以下のように前後の値の平均からその値を求めることによりなされる。 例えば入力データが以下のようだとする。 104 99 99 97 96 93 90 87 83 79 75 72 69 67...... すると5番目のデータの平均化された値は5番目のデータの前後のデータに重みをつけた平均で求められる。 今回は前後2個のデータと、指定した数値自身のデータ(5番目の場合3,4,5,6,7番目のデータ)で平均を求め、平均を求めるに当たっての重み付けは自分より2つはなれたデータの重みは2、後の3つのデータは3とする。 したがって、5番目のデータの平均化された値は以下の式で求められる。 {(3番目*2)+(4番目*3)+(5番目*3)+(6番目*3)+(7番目*2)}/13 これを一般的に書くと重み関数をw[5]={2,3,3,3,2} 元の値が配列p[]に入っているとすると、 i番目の平均化された値q[i] q[i]=(廃[i-2+k]*w[k])/13(シグマはk=0,5つの数値の総和)で求めることが出来る ただし、最初や最後の数値の場合は、前後の値が無いので、i-2+kが0以下の場合は0番目のデータ、データ数を超えた場合は最後のデータを用いることにする。 また、入力データはdouble型の配列で処理する。 実行結果はリダイレクションでファイルからデータを読み込み、結果もリダイレクションでファイルに書き出す。 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:不明 [3.3] 言語:C++ [4] 期限: [2005年10月12日9:00まで] [5] その他の制限:配列まで習ってます。 どなたかお願いします。使ってるテキストに書かれている例がわかりづらくてどうにもならないんです。
>>147 #include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
using namespace std;
vector<double> v;
copy(istream_iterator<double>(cin), istream_iterator<double>(), back_inserter(v));
v.insert(v.begin(), 2, v[0]), v.insert(v.end(), 2, v[v.size() - 1]);
vector<double> result(v.size() - 4, 0.0);
for (int i = 0; i < 5; ++i) {
int weight[] = {2, 3, 3, 3, 2};
for (int j = 0; j < weight[i]; ++j) {
transform(result.begin(), result.end(), v.begin() + i, result.begin(), plus<double>());
}
}
transform(result.begin(), result.end(), ostream_iterator<double>(cout, "\n"), bind2nd(divides<double>(), 13));
}
149 :
128 :2005/10/08(土) 18:23:00
後付けっていけないんですよね;;乱数はrand関数だと15ビットまでしか生成できないが 15ビット乱数×2の15乗+15ビット乱数で30ビット乱数が作成できるとか、。。。まず@番 を完成させなくちゃいけないですよね・・・(⊃д⊂)
>>148 どうもありがとうございます。
あとこれincludeをiostreamだけで書く方法ありませんか?
自分の書き方が『配列まで習ってる』としか書かなかったので悪いのは自分なんですが、
<functional>も<vector>も<algorithm>も<iterator>も習ってないのですよorz
ええっと・・・自作乱数関数とかなら、メルセンヌ・ツイスタとか・・・。>149
>>149 >>130 で少しいったけど
>値が気に入らないようだったら複数回呼び出して作るか
>(8771と6584と8402とかでたら * / \ % 使って 775840 とか)
(int)(1.0 * P * rand() / RAND_MAX);
とかでもいいとは思うけど 最大(RAND_MAX)種類しか値取れないので
v1=(rand()
>>4 )&255;
v2=(rand()
>>4 )&255;
v3=(rand()
>>4 )&255;
a[i]=v1<<16+v2<<8+v3;
たとえばこんなのでどうですか?
stdlib.hのrandはお手軽にランダムな数字を取ってくる二はいいけど
アレなので 統計に使いたいなら
>>151 でいってるメルセンヌ・ツイスターとかの方がいいかも
ttp://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
153 :
デフォルトの名無しさん :2005/10/08(土) 20:32:49
[1] 授業単元:C++演習 [2] 問題文(含コード&リンク):まず、getOpenというユーザーから任意のファイル名を入力させ、そのファイルを開く関数を作成しなさい。 またこのとき、ファイルが存在しなかったら、エラーを返しプログラムを終了するようにしなさい。 次に、void sumCountAndAverage(ifstream&, double&, double&, double&); という 先ほど作成した関数から呼び出したファイルの中のdouble型の数の総和とその数の個数を求め、 その後それらの値から平均値を求める関数を作成しなさい。 最後にこれらの関数とmain関数を用いて1つのプログラムとして稼動するようにしなさい。 このとき、main関数において、先ほど求めたファイルの中の数の総和、個数と平均値を表示しなさい。 なお、今回使用するファイルは一行に1個ずつdouble型の数が収められており、 最後の行の数が入力されたあとはエンターキーが一回入力された.dat型ファイルとする。 [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: g++ [3.3] 言語: C++ [4] 期限: 2005年10月10日20:00まで [5] その他の制限: 特になし。よろしくお願いします。
>>153 #include<iostream>
#include<fstream>
#include<string>
int getOpen(std::ifstream&strm){
std::string filename;
std::cout << "Open file name ?:";std::cin >> filename;
strm.open(filename.c_str());
return !strm;
}
void sumCountAndAverage(std::ifstream&strm, double&sum, double&n, double&average){
for(double var;strm>>var;++n)sum+=var;
average = sum / n;
}
int main(){
std::ifstream strm;
double sum=0,n=0,average;
if(getOpen(strm)){
std::cout << "Can't open file."<< std::endl;
return 1;
}
sumCountAndAverage(strm,sum,n,average);
std::cout
<< " Sum = " << sum << std::endl
<< " N = " << n << std::endl
<< "Average = " << average << std::endl;
return 0;
}
>>154 getOpenはboolを返していいだろ。
156 :
デフォルトの名無しさん :2005/10/09(日) 09:46:00
>>146 #include <stdio.h>
hexdump(FILE * fp) {
char byte;
/* ファイルの終りまで一文字ずつ byte に読み込み */
while ((byte = getc(fp)) != EOF) {
printf("%x", (int)byte);
}
}
main(int argc, char **argv)
{
int i;
FILE *input;
if (argc == 1) /* コマンドライン引数がないとき */
printf("Specify the file name.\n");
else{
for (i = 1; i < argc; i++) {
/* argv[i] をファイル名として読み込み用のオープンをする */
input = fopen(argv[i], "rb");
if (input == NULL) {
fprintf(stderr, "cannot open %s\n", argv[i]);
return 1;
}
hexdump(input);
fclose(input);
}
}
return 0;
}
157 :
156 :2005/10/09(日) 09:49:31
>>146 失敗。これ↓を見落としていた。
>いったんメモリに全て読み込み、
[1] 授業単元: 入社試験(と書いてあった) [2] 問題文(含コード&リンク): 次のC言語のプログラムを最適化せよ。ただしint型は無限長のbitを持つと仮定して良い。 int f(int x,int y){ if (x==1||x==y) return 1; return f(x?1,y?1)+f(x,y?1); } int g(int N){ int sum=0; for(int i=1;i<=N;++i) sum+=f(i,N); return sum; } int main(){ return g(100000); } [3] 環境 [3.1] OS: 規定されていない [3.2] コンパイラ名とバージョン: 多分紙と鉛筆だけで解くのだと思う [3.3] 言語: C [4] 期限: とくにありません。 [5] その他の制限: 他に2問あって、合計1時間で解くものでした。
return f(x?1,y?1)+f(x,y?1); 何これ? 式 ? 真の時の値:偽の時の値 とは違うよな...
けど?が出てくるのって三項演算子以外でないだろ それでも構文変だが
最適化ってのも曖昧な問題だな
すまん。f(x-1,y-1)+f(x,y-1)だ。
末尾最適化。再帰呼び出しを取り去る。
>>158 ちょいと樹形図を書けばわかるけど,その g(N) のオーダーは O(2^N) より大きい.
というわけで,小手先の最適化くらいでなんとかなる問題じゃあない.
というわけで動的計画法.簡単のため M を g の入力の最大の数として,
int tbl[M+1][M+1];
int init() {
for (int i = 0; i <= M; ++i) tbl[1][i] = tbl[i][i] = 1;
for (int i = 1; i <= M; ++i)
for (int j = 1; j <= M; ++j)
tbl[i][j] = tbl[i-1][j-1] + tbl[i][j-1];
}
int f(int x,int y) { return tbl[x][y]; }
入力の値に上界を設けたくなければ適当に realloc でもすればいい.
>>158 ああ・・・(と、模範解答を見る)・・・なるほど
f()を書き換えるだけで、main()には手をつけんな・・・俺なら。
>>158 やっつけで
int g(int N){
int i,sum=1;
for(int i=1;i<N;i++) sum+=sum;
return sum-1;
}
int main(){ return g(100000); }
>>158 f = y-1 C x-1
∴
g = 輩-1 C k
∴
g = 2 ^ (y -1)
g = 1 << (y-1)
∴
int main(){ return 1<<(100000-1); }
158でつ。問2、3もおねがいしまつ。
>>169 問い2だけ......
問い3はプログラムじゃないんで放置
//再帰版
int W(int a[7][7],int x,int y){
return a[y][x]==0?a[y][x]=2,1+W(a,x-1,y)+W(a,x+1,y)+W(a,x,y-1)+W(a,x,y+1):0;
}
//非再帰版
#define push(x,y) (*p)[0]=x,(*p++)[1]=y
#define pop(x,y) p != stack && ( x=(*--p)[0],y = (*p)[1] ,1)
int W(int a[7][7],int x,int y){
int stack[7*7*6][2]={x,y},(*p)[2]=stack+1,sum = 0;
while(pop(x,y))
while(!a[x][y]) a[x][y] = 2,++sum,push(x-1,y),push(x+1,y),push(x,y-1),++y;
return sum;
}
>>169 んじゃ問3.
(1)
φ(φ(x)) = φ(A x + a) = A^2 x + A a + a = x,
整理して (A + I) a = (I - A^2) x.
これが任意の x について成立するためには両辺がゼロにならないといけないので
case1: A = -I
case2: A^2 = I かつ a = 0
のどちらか.ただし I は単位行列.
(2)
case1 のとき φ(x) = x <=> -x + a = x <=> x = a/2.
よって F(φ) = { a/2 }.( x = 0 は A x = x を満たす )
case2 のとき φ(x) = x <=> A x = x.
(3)
case1 のとき一点なのは既に示した.
case2 のとき 0 ∈ F(φ) は明らかだから,非自明な x が F(φ) に入ったら F は一点集合でない.
A を Jordan 標準形にしてみてちょっと計算すると A は対角化できることがわかり,
その固有値は 1 か -1 を取る.
固有値が全て -1 とすると A は -I と相似になって A = -I となって φ(x) = -x で case1 に入る.
一つでも -1 でないものがあったとすると,その固有ベクトル x は A x = x を満たすので ∈ F(φ).
174 :
デフォルトの名無しさん :2005/10/09(日) 20:48:48
[1] 授業単元: C言語 [2] 問題文: テキスト内にある/home/abcd/ap1,10,A,1,AP1,V01,20041014,log がファイルフォーマットだとして、 /home/abcd/ap1,10,A,,,V01,,logのように項目が抜けていた場合に 何番目の項目が抜けているのかを特定したいのですが、いいアイディアが浮かびません。 なるべく短いステップで処理したいのですが、いい方法ありませんか?お願いします。 [3] 環境 [3.1] OS: Windows2000 [3.2] コンパイラ名とバージョン:VC [3.3] 言語: C [4] 期限:[無期限]
問題文 の意味が理解不能です
176 :
デフォルトの名無しさん :2005/10/09(日) 21:03:37
174です。説明不足でした。 /home/abcd/ap1,10,A,,,V01,,logの場合 ,と,の間に文字が入ってないのでその位置を特定したい。 (例として、3個目と4個目の間に文字がありません。) 見たいな特定がしたいです。よろしくお願いします。
177 :
namahage :2005/10/09(日) 21:04:40
すいませんどなたかsinxとlogxのテーラー展開するプログラム教えてください
>>174 ,177
宿題なら
>>1 に従ったフォーマットを。宿題でないなら別スレへ。
>>174 #include <string.h>
void check_field( chr *str, int *exist ){
char *tp;
tp = strtok( str, "," );
*exist = tp?1:0; exist++;
while ( tp ) {
tp = strtok( NULL, "," );
*exist = tp?1:0; exist++
}
}
forで回して、,の個数とその間の文字数をカウントするだけだべ?
182 :
128 :2005/10/10(月) 01:40:40
>>128 です。
2〜5はアレでいいんですね!
1のソース誰かいただけますか。。考えたけど全然だめです・・・
183 :
デフォルトの名無しさん :2005/10/10(月) 01:47:08
>>179 174です。遅れましたがご解答ありがとうございます。
この処理は、','(コンマ)が4つとか連続で入っていた時でも対処できるものでしょうか?
勉強不足ですみません。
例として、3目個と4個目の間に文字がありません。4個目と5個目の間に文字がありません。みたいな事が行ないたいのです。
ソースでなくてもいいアイディアなにか無いでしょうか?おねがいします。
【質問テンプレ】 [1] 授業単元: 文字列関係 [2] 問題文(含コード&リンク):1 文字列をキーボードから入力し、その結果を表示するプログラム。 2 文字列をキーボードから入力し、入力した文字列の長さを計算し表示するプログラム。(例[Syukudai]→結果[8] [ganbaru]→結果[7]) 3 文字列をキーボードから入力し、以下の処理を行う(そして表示)。i,英字は全て英大文字に ii,数字はそのまま iii,特殊文字は空白に (例「Syu+ku12dai」→結果「SYU KU12DAI」 「ga(n)baru」→結果「ga n baru」) 4 文字列をキーボードから入力し、その文字列を逆転する処理して表示。その処理のフローチャートも書くこと。 (例「Syukudai」→結果「iadukuyS」 [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [2005年10月10日23:00あたりまで] または [無期限] のいずれか (「できるだけ早く」は不可) [5] その他の制限: イ、GOTO文を使用してはいけない ロ、入力は繰り返し行えるように(なんらかの行動で終われるようにする。[end]と打つと終わりとかそういう感じ) ハ、必ずmain()関数とサブ関数を使用 ニ、ポインタじゃなく配列を使用 一度全て作成したのですが、文字「列」として出力しなかったりしたり、毎回キーボードで打つのとか繰り返しの判定処理とか 出力するprintfの文とかはほぼ同じだからそこをmainとサブで効率よくできるように〜〜みたいなことを言われました(´・ω・`) あくまで文字列として出力しろ〜〜みたいなことも・・・どうすればいいかわかりません、、よろしくお願いしますです。
185 :
184 :2005/10/10(月) 01:57:36
修正。 ga(n)baru →GA N BARUでした。><
>>184 1とかmain一つで事足りるわけだが、それも関数分けないとダメ?
それとctype.hは使っておk?
>>183 strchrとか使ったら?ループでstr[i]==','とか判定するのとあんまり変わらんかも知れんが。
>>128 ランダム版 for(i=0;i<N;i++) data[i]=rand();
整列済み版 for(i=0;i<N;i++) data[i]=i;
逆整列済み版 for(i=0;i<N;i++) data[i]=N-i;
でいいんじゃね?ただ、ランダム版でデータ重複がいやだとか(逆)整列済み版で重複有りとなると多少改造が必要だが。
>>184 元の奴を改造させた風にする必要があるだろうし、元プログラムをうp
189 :
179 :2005/10/10(月) 02:09:27
>>183 確かにコンパイルもパスしない代物で申し訳無かったが
existというintのarrayにトークン(コンマで区切られた文字列)の有無が入るように書いた(つもり)
実行環境が手許に無いので試験してみることが出来ないけど。
main(){
int e[100]=[0];
char *any = "任意の文字列";
check_field( any, e )
/* ここでeの内容を確認 */
}
のようなテストドライバでも書いて試験してみて下さい。
例に挙げたようなことはe(exist)が正しく出来ているなら簡単でそ
190 :
デフォルトの名無しさん :2005/10/10(月) 02:25:55
183です。みなさんさっそくのご解答ありがとうございます。 まだ試していませんがいいアイディアいただけて、感謝しています。 またいいアイディアありましたらよろしくお願いします。
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): バブルソート法で数列 80 40 30 90 50 20 10 60 を昇順にソートするプログラムを書け [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2005年10月12日 [5] その他の制限: 無し よろしくおねがいします
つ、つまらん…
#include<stdio.h> void out_num(int *,int); void srt_bub(int *,int); int main(int argc,char **argv){ int a[]={80,40,30,90,50,20,10,60},n=8; out_num(a,n);srt_bub(a,n);out_num(a,n); return 0; } /* 出力 */ void out_num(int *a,int n){ int i; for(i=0;i<n;i++)printf("%d ",a[i]); printf("\n"); } /* (3)バブルソート */ void srt_bub(int *a,int n){ int i,j,tmp; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(a[i]>a[j]){ tmp=a[i];a[i]=a[j];a[j]=tmp; } } ホイ、使い回し
195 :
デフォルトの名無しさん :2005/10/10(月) 14:24:32
[1] 授業単元: C [2] 問題文(含コード&リンク): UNIXの(ls -l)コマンドをプログラムで再現しなさい。 という課題が出されました。指定のディレクトリ内のファイル等を(ls -l)で表示できる、 パーミッションやユーザ名、ファイルサイズ等を表示したいのですが、 全く知恵が出てきません。ご教授お願いします。 [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限:[無期限] [5] その他の制限: 特にありません。 UNIX全くの無知です。お力を貸してください。よろしくお願いします。
>>195 int main() {
return system("ls -l");
}
198 :
デフォルトの名無しさん :2005/10/10(月) 15:03:43
195です。さっそく回答ありがとうございます。 追加機能として、自分で決めた任意のディレクトリの表示は可能でしょうか?
201 :
デフォルトの名無しさん :2005/10/10(月) 15:14:30
199さん。残念ながらまだ試していません。UNIX環境が自宅にないもので。 すみません。 明日さっそく学校で試してみたいと思います。
stat()?
203 :
184 :2005/10/10(月) 16:59:15
入社試験ネタやってみた。分けがわからんかった。 でも、この手の面白いな。またあったらネタでもかまわんのでよろしく。
206 :
デフォルトの名無しさん :2005/10/10(月) 22:27:36
[1] 授業単元: コンピュータープログラミング [2] 問題文 a[ ]の箱を100個作ってi*iを代入。その合計と平均を求める。 「input」と「nijou」と「calc_sum」と「calc_average」を使って、「input」で、まずa[ ]=i*iの形?いみたいなのを作る。 そして「nijou」で実際に計算、「calc_sum」で合計を求めて「calc_average」で平均を出して終わり。説明下手でごめんなさい。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:よくわからない。 [3.3] 言語: C [4] 期限 今日の24時まで・・・。 [5] その他の制限: 関数のい課題です。ポインタとかまだ、習ってません。 大体のプログラムの形は作ったんですが、明らかに変です。これ↓を修正して作ってくれませんか?お願いします。
207 :
206 :2005/10/10(月) 22:28:09
#include<stdio.h> float input(void); float nijou(float); float calc_sum(float); float calc_average(float); int main(void){ float s,r,a,b; s=input(); r=nijou(s); a=calc_sum(r); calc_average(a); } float input(void){ float z,i,a[99]; a[i]=i*i; z = a[i]; return z; } float nijou(float nn){ float a[99],i; a[i]=i*i; return a[i]; }
問題そのままかいて...
float calc_sum(float ss){ float x,i,sum,a,a[99]; sum=0; for(i=0;i<=99;i++){ a[i] = i*i; } for(i=0;i<99;i++){ sum=sum+a[i]; } a=sum; printf("sum=%d\n",sum); return a; } float calc_average(float aa){ float average; average = (float)aa/100 printf("average=%f\n",average); } sage忘れててごめんなさい・・・。
210 :
206 :2005/10/10(月) 22:30:42
ちなみに問題文は削除されてしまって分かりません・・・。 分かりにくくてすみません。
212 :
デフォルトの名無しさん :2005/10/10(月) 22:35:56
【質問テンプレ】 [1] 授業単元:プログラミング [2] 問題文(含コード&リンク):BM法をもちいて住所のデータから郵便局を検索せよ。住所データは配列でファイル読み込みすることです。 [3] 環境: [3.1] OS: WindowsXp [3.2] コンパイラ名とバージョン: vC.net2003 [3.3] 言語: C/C++/どちらでも可 [4] 期限:3日以内 [5] ライブラリをもちいての文字列検索は不可 お願いしますm(−−)m
BM法って?
214 :
206 :2005/10/10(月) 22:37:01
>>211 その出題者と連絡が取れないんです・・・。明日になれば聞けますが、それだと締め切りに間に合いません・・・。
やっぱり、ちゃんとした問題文がないと出来ませんよね・・・。ごめんなさい。
あー・・・まあ、10月からの講義だとしても、学校通って半年たってるんだから、友人くらいいるだろ。 そいつらに答え聞くか、問題聞いてみるとか。
216 :
206 :2005/10/10(月) 22:59:18
>>215 いや・・・他の友人はみんな金曜に学校で終わらせたんだよね。
・・・で、みんなのそのときのデータは学校。問題文が載ってるサイトも学内専用・・・。
友人に聞いても「課題終わってるのに家にデータ持って帰るわけないだろ」と、言われました。しかも問題文も覚えてないっていうし・・・。
今回は自分が悪いですね・・・。
217 :
初心者 :2005/10/10(月) 23:00:44
商品の金額と出した金額を入力し、おつりを算術するプログラムが出来ません。 #include <stdio.h> #include <conio.h> #include <stdio.h> int main (void) { int kai,kane; int oturi = kane - kai; char buf[3]; printf("いくらの買い物ですか\n"); kai = atoi(gets(buf)); printf("お金はいくら出しますか\n"); kane = atoi(gets(buf)); printf("おつりは%d円です\n",oturi); } こんな感じで打ったのですがエラーになります。初心者ゆえなにを如何したら改善するのか皆目検討つきません ちなみにコンパイラはborlandC++compilerです。 どなたかご教授願えますか?
218 :
デフォルトの名無しさん :2005/10/10(月) 23:00:45
219 :
初心者 :2005/10/10(月) 23:01:31
エラーメッセージは以下の通りです 警告 W8065 mondai10.c 14: プロトタイプ宣言のない関数 'atoi' の呼び出し(関数 main ) 警告 W8065 mondai10.c 16: プロトタイプ宣言のない関数 'atoi' の呼び出し(関数 main ) 警告 W8070 mondai10.c 20: 関数は値を返すべき(関数 main ) 警告 W8004 mondai10.c 16: 'kane' に代入した値は使われていない(関数 main ) 警告 W8004 mondai10.c 14: 'kai' に代入した値は使われていない(関数 main )
あー、学校へTELNETとか叩けるのか? だったら見られるんじゃねーか?
222 :
206 :2005/10/10(月) 23:06:40
Telnetは使い方がよく分からないし、大学のIPアドレスとかまったく知らないので自分が使うのは無理っぽいです・・・。
>>217 どうして、
#include <stdio.h>
が二行もあるの?
#include <stdio.h> #include <conio.h> #include <stdlib.h> // atoiってstdlibでしょ? int main (void) { int kai,kane; int oturi; char buf[3]; printf("いくらの買い物ですか\n"); kai = atoi(gets(buf)); printf("お金はいくら出しますか\n"); kane = atoi(gets(buf)); oturi = kane - kai; // kaneとkaiの値が決まってから代入しなきゃダメ。 printf("おつりは%d円です\n",oturi); return 0; // main関数がint型だから値を返す必要がある }
225 :
デフォルトの名無しさん :2005/10/10(月) 23:33:51
>>206 #include <stdio.h>
void input(int a[]);
int nijou(int n);
int calc_sum(int a[]);
float calc_average(int a[]);
int main(void)
{
int a[100];
float ave;
input( a );
ave = calc_average( a );
printf("average=%f\n", ave);
return 0;
}
void input(int a[])
{
int i;
for(i = 1; i <= 100; i++)
{
a[i] = nijou( i );
}
}
226 :
デフォルトの名無しさん :2005/10/10(月) 23:35:23
225の続き int nijou(int n) { return n * n; } int calc_sum(int a[]) { int i, sum = 0; for(i = 0; i < 100; i++) { sum += a[i]; } return sum; } float calc_average(int a[]) { return (float)calc_sum(a) / 100; }
227 :
デフォルトの名無しさん :2005/10/10(月) 23:36:29
217<< プロトタイプ宣言のない関数 'atoi' の呼び出し(関数 main atoiって関数宣言してないからエラーだとおもう。
229 :
初心者 :2005/10/10(月) 23:55:13
230 :
206 :2005/10/10(月) 23:56:18
>>225 ありがとうございます!
でも、実はsumも表示させないといけないんです・・・。
>>226 なるほどなー
ホインタ習って無いってのをどうしようか迷っていたが、
int a[]で受けるならポインタ使ってないよって誤魔化せるか
232 :
206 :2005/10/11(火) 00:00:05
自分でsum表示させれました。 ありがとうございました。
234 :
初心者 :2005/10/11(火) 00:25:07
>>233 うを 勉強になります
いい年こいて不勉強でした
235 :
C言語始めたばかり :2005/10/11(火) 00:43:43
[1] 授業単元:データ構造(リンクドリスト) [2] 問題文(含コード&リンク): 入力(1):文字列データ apple,banana,peach,pineapple,orange 入力(2):挿入、削除の操作を指定する一文字 I,D,P リンクドリストの何番目のデータに対する操作かを示す自然数、挿入(I)の時は英語の果物名を文字列として入力 操作:入力(1)で入力された5個の文字列データを入力された順に配列を使って実現されたリンクドリストに記憶する。 リンクドリストのm番目に文字列を挿入する関数insert、リンクドリストに記憶されているn番目の文字列データを削除する関数delete、 リンクドリストに記憶されているデータをその記憶されている順に出力する関数plistを定義し、 入力(2)の一文字I、D、Pの入力によって、入力で指定されたデータをパラメータとして、 それぞれの関数insert,関数delete,関数plistが呼び出されて実行される。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2005年10月17日13:00まで [5] その他の制限: 特に指示はありませんでした。 自分でもC言語の本とか見て調べたのですが、理解できなかったので、どうかお願いします。
マルチ乙
理解できない。 →あきらめる →人にたよる(ま、嫌われんようにな) →別の本なりサイトなりで調べてみる
その「人にたよる」という行為が、このスレなのだが。
嫌われんようにな←がポイントだと思う
>>235 リンクドリストって聞き慣れないが、要はただの単方向リストか?
大量にサンプルコード有るんだからそれみて理解しろ
無理なら諦めろ
あとから書き直しパターンぽいなぁ・・・。
[1] 授業単元:アルゴリズム入門 [2] 問題文:まず、符号化したい文字列を入力する。それぞれの文字につい て出現頻度を表示し、 次にハフマン符号の考え方を用いて、各文字に0と1の符号を割り当てよ。 例 aaaabbbccdを入力。出力結果→出現頻度 a→4回 b→3回 c→2回 d→1回 符号化した結果はa→0 b→11 c→101 d→100 [3] 環境 [3.1] OS: Windowsxp home [3.2] c++bulider 5.5 [3.3] 言語:Cのみ [4] 期限: 今週水曜まで [5] 学校の授業でcに触れたくらいで、あまりまだプログラミングというものを理解できていません・・・。わかる方がいらっしゃいましたらよろしくお願いします<(_ _)>
整数を入力として受け付けて、その数に3足した分だけ*を表示せよ。 例えば、入力が3だとすると出力は以下のようになる。 ****** C
>>244 アマゾンで頼んでも水曜には間に合わんと思うがなぁ
著者のページにソース置いてあるんで。間に合うんでないかい?
247 :
245 :2005/10/11(火) 03:44:30
おぉ、ホントだ! >error("使用法は本文を参照してください"); なんて書いてあるが、コメントもいっぱい付いてるし、問題なさげだ
まだ置いてあったのか・・・grwinとgrgtkが欲しいぞ。
249 :
デフォルトの名無しさん :2005/10/11(火) 04:26:47
すみません、初歩的問題ですが分かりません。 ご指導お願いします。UNIXです? シグインとかいうソフトで起動させてます ・アルファベットがどのような数値で表されているか表示するプログラムを作りなさい ・乱数を発生する関数rand()を使って0〜99の乱数を50個作りなさい またその50個の乱数の最大値と最小値を見つけるプログラム作りなさい ・switch〜case文を使って、入力された文字について 大文字、小文字、数字、記号などの種類を表示するプログラムを作りなさい ・入力された文字が 大文字なら小文字に、小文字なら大文字に変換し、その他ならそのまま出力するプログラムを つくりなさい
252 :
249 :2005/10/11(火) 05:14:03
失礼いたしました。 [1] 授業単元: 情報制御工学 [2] 問題文(含コード&リンク): ・アルファベットがどのような数値で表されているか表示するプログラムを作りなさい ・乱数を発生する関数rand()を使って0〜99の乱数を50個作りなさい またその50個の乱数の最大値と最小値を見つけるプログラム作りなさい ・switch〜case文を使って、入力された文字について 大文字、小文字、数字、記号などの種類を表示するプログラムを作りなさい ・入力された文字が 大文字なら小文字に、小文字なら大文字に変換し、その他ならそのまま出力するプログラムを つくりなさい [3] 環境 [3.1] OS: WindowsXP セレロン [3.2] コンパイラ名とバージョン: gcc (よく分からないですがgccってので起動してます) [3.3] 言語: C [4] 期限: 今日の17時までです。 [5] その他の制限: ほとんど初心者です。すみません
>>252 (1)
int main() {
char c;
for (c = 'a'; c <= 'z'; ++c) printf("%2c ", c);
printf("\n");
for (c = 'a'; c <= 'z'; ++c) printf("%02x ", c);
printf("\n");
for (c = 'A'; c <= 'Z'; ++c) printf("%2c ", c);
printf("\n");
for (c = 'A'; c <= 'Z'; ++c) printf("%02x ", c);
printf("\n");
return 0;
}
>>252 (2)
int main() {
int i, tbl[50], min, max;
srand(time(NULL));
for (i = 0; i < 50; ++i)
tbl[i] = (int)(50.0 * rand() / RAND_MAX);
min = max = tbl[0];
for (i = 0; i < 50; ++i) {
if (min > tbl[i]) min = tbl[i];
if (max < tbl[i]) max = tbl[i];
}
printf("min = %d, max = %d\n", min, max);
return 0;
}
>>252 (3)
int main() {
char c;
scanf("%c", &c);
if ('a' <= c && c <= 'z') {
printf("small character\n");
} else if ('A' <= c && c <= 'Z') {
printf("large character\n");
else {
printf("otherwise\n");
}
return 0;
}
(4)
int main() {
char c;
scanf("%c", &c);
if ('a' <= c && c <= 'z') {
printf("%c", c + 'A'-'a');
}
else if ('A' <= c && c <= 'Z') {
printf("%c", c + 'a'-'A');
} else {
printf("%c", c);
}
return 0;
}
[1] 入門プログラミング [2]ある数字の数だけ記号を表示するにはどうすればいいでしょうか? 例えば3なら@@@、5なら@@@@@といったようにです。 [3] 環境 [3.1] Windows2000 [3.2] VC 6.0 [3.3] C++ [4] 今日の朝8時まで [5] 基礎程度です。 あるプログラムの最後の一部分なんですがこれをどうすればよいかがわかりません。 どなたかよろしくお願いします。
#include <iostream> using namespace std; int main(){ int num, i; cin >> num; for (i = 0; i < num; i++) cout << "@"; return 0; }
cout << '@';
260 :
デフォルトの名無しさん :2005/10/11(火) 11:43:54
#include <stdio.h> int main(void); int main(void) { int i; float rate,kekka; rate = 113.95 ; while(i<=50){ kekka=i*rate; printf("%.2f\n",kekka); i++; } [1] 授業単元:情報基礎 [2] 問題文(含コード&リンク): forループを使って25ドル〜50ドルまでの円への換算表を作りなさい 為替るーとは113.95円とする これと同じことをwhileループを使って書け [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 本日14時 [5] 上のプログラムを作ったのですがうまく起動しません $ gcc j3.c j3.c: In function `main': j3.c:20: error: syntax error at end of input と表示されます、具体的にどこを直せばよいのでしょうか?
>>260 int main(void); ←不要
あと中括弧の閉じが一個足りない
nt main(void) { int i; float rate,kekka; rate = 113.95 ; while(i<=50){ kekka=i*rate; printf("%.2f\n",kekka); i++; } }
263 :
デフォルトの名無しさん :2005/10/11(火) 11:50:10
>>253 ありがとうございます。ソースを読んだんですが理解でいません(><)
自分で書いたものがあるんですがみてもらえますか??
264 :
260 :2005/10/11(火) 11:50:53
動きました、ありがとうございます。 何故int main が余計なのですか?簡単な理由だったら教えて欲しいです
>>264 main関数は特別で、プロトタイプ宣言が必要ないということになってるだけ。
266 :
260 :2005/10/11(火) 11:55:19
先ほどの換算プログラム、ホワイルだと 2848.75 2962.70 3076.65 3190.60 3304.55 3418.50 3532.45 3646.40 3760.35 3874.30 3988.25 4102.20 4216.15 4330.10 4444.05 4558.00 4671.95 4785.90 4899.85 5013.80 5127.75 5241.70 5355.65 5469.60 5583.55 5697.50 結果がとなり
267 :
260 :2005/10/11(火) 11:56:12
2848.75 2962.70 3076.65 3190.60 3304.55 3418.50 3532.45 3646.40 3760.35 3874.30 3988.25 4102.20 4216.15 4330.10 4444.05 FORだと 4558.00 4671.95 4785.90 4899.85 5013.80 5127.75 5241.70 5355.65 5469.60 5583.55 5697.50 と、結果に違いが生じてしまうのですが、何故でしょうか?
268 :
260 :2005/10/11(火) 11:56:54
FORのプログラムはこう作りました #include <stdio.h> int main(void) { int i; float rate,kekka; rate = 113.95 ; for(i=25;i <=50; i++){ kekka=i*rate; printf("%.2f\n",kekka); } }
>>260 よく見たら i 初期化してねぇじゃん。
270 :
260 :2005/10/11(火) 11:57:45
>>265 ど丁寧にどうもです。
プロトタイプ宣言というものがよく分からないので
調べてきます。
271 :
260 :2005/10/11(火) 11:58:42
>>269 return(0) とか言うヤツですか?
>>271 iの初期値は25だろ?どこでその数値を入れてる?
int i; ↓ int i = 25; にしろってことだよ。
274 :
デフォルトの名無しさん :2005/10/11(火) 12:35:12
275 :
260 :2005/10/11(火) 12:43:58
277 :
249 :2005/10/11(火) 17:08:36
>> 264-256 2〜3のプログラムが上手く走りません、エラーは以下の通りです 何がいけないのでしょうか? gcc j7.c j7.c:5: error: syntax error before '{' token j7.c:7: error: syntax error before string constant j7.c:7: warning: conflicting types for built-in function `scanf j7.c:7: warning: data definition has no type or storage class $ gcc j7.c j7.c:5: error: syntax error before '{' token j7.c:7: error: syntax error before string constant j7.c:7: warning: conflicting types for built-in function `scanf j7.c:7: warning: data definition has no type or storage class $ gcc j8.c j8.c:4: error: syntax error before '{' token j8.c:6: error: syntax error before string constant j8.c:6: warning: conflicting types for built-in fun j8.c:6: warning: data definition has no type or sto j8.c:16:2: warning: no newline at end of file
278 :
249 :2005/10/11(火) 17:10:49
2〜4の間違いでした こう書きました (4) #include<stdio.h> int main(void); { char c; scanf("%c", &c); if ('a' <= c && c <= 'z') { printf("%c", c + 'A'-'a'); } else if ('A' <= c && c <= 'Z') { printf("%c", c + 'a'-'A'); } else { printf("%c", c); } return (0); }
279 :
249 :2005/10/11(火) 17:12:03
#include<stdio.h> int main(void); { char c; scanf("%c", &c); if ('a' <= c && c <= 'z') { printf("small character\n"); } else if ('A' <= c && c <= 'Z') { printf("large character\n"); else { printf("otherwise\n"); } return (0); }
280 :
249 :2005/10/11(火) 17:13:03
(2) #include<stdio.h> int main(void) { int i, tbl[50], min, max; srand(time(NULL)); for (i = 0; i < 50; ++i) tbl[i] = (int)(50.0 * rand() / RAND_MAX); min = max = tbl[0]; for (i = 0; i < 50; ++i) { if (min > tbl[i]) min = tbl[i]; if (max < tbl[i]) max = tbl[i]; } printf("min = %d, max = %d\n", min, max); return (0); }
main()のあとの「;」がいらない
282 :
249 :2005/10/11(火) 17:26:15
「;」をとると以下のようなエラーが出ます・・・・ (2) $ gcc j6.c j6.c: In function `main': j6.c:10: error: `RAND_MAX' undeclared (first use in j6.c:10: error: (Each undeclared identifier is repo j6.c:10: error: for each function it appears in.) (3) $ gcc j7.c j7.c: In function `main': j7.c:12: error: syntax error before "else" (4) $ gcc j7.c j7.c: In function `main': j7.c:12: error: syntax error before "else"
もう、どれがj6.cやらj7.cやら。毎回毎回どうしてこうもコピペに失敗するのかねぇ。
ケアレスミスの文法エラーを指摘しなければならないのも スレの範疇なのかねぇ
285 :
249 :2005/10/11(火) 18:20:09
どうも皆様すみません ケアレスミスなのですね、じっくり観察して見ます ありがとうございました。
286 :
デフォルトの名無しさん :2005/10/11(火) 19:52:53
[1] 単元:情報演習 [2] 環境 [2.1] OS: Linux [2.2] コンパイラバージョン: gcc [2.3] 言語: C [3] 期限: 木曜13時 [4] 問題: ビットごとのXOR演算子を用いて、文字列を暗号化するプログラムを作成し、実行しなさい。ただし、プログラムは以下の条件を満たすものとする。 条件1:対象とする文字列は80文字以下とし、アルファベット小文字、スペース、ピリオド、コンマからなる。 条件2;暗号化は、対象文字列を逆順にするとともに、各文字と0から9までの数字(キーナンバーとして打ち込んだもの)とのXORをとって完了する。ただし、スペース、ピリオド、コンマについてはXOR演算の対象としないこと。 条件3;暗号化、復号化の処理は、それぞれ少なくとも一個ずつ関数を定義し、実行させること。 <仕様>1.ファイルoriginal.dat(ASCII型式)に保存されている文字列を暗号化対象として読み込む。original.datが存在しないときは、最初に対象文字列をそのファイルに書き込ませること。 2.上記条件2で示した方法によって、暗号化する。そして、キーナンバーと暗号化文字列をファイルcoded_wds.dat(ASCII型式)に書き込む。 3.復号化の際は、coded_wds.datを読み込んで実行すること。まず、キーナンバーを打ち込ませる。誤ったキーナンバーを3回連続して打ち込んだ場合、処理を終了させること。正しいキーナンバーが打ち込まれた場合、復号化してその結果を表示させること。 以上が問題なのです、どうかお願いします(iДi)
>>274 無理に短くしないで全部上げてくれたほうがよかったな.手元でコンパイルが通らん.
ま,Search 関連だけ見た.アルゴリズム自体は間違ってないはず.
「whileのループがまわらない」ってのはよくわからんが,予想される不具合は
日本語の文字列を char にぶち込んだときに,その値が範囲外になってること.
実際こっちの環境で試したら key[k] が負の値を取ってた.
もしそちらで入力を全部ローマ字にしてまともに動けばこれが原因と思う.
skip[x] を全部 skip[(unsigned char)x] に置き換えればとりあえず動くけど,
検索が「日本語の文字列単位で」まともに動く保証は全く無い.
288 :
287 :2005/10/11(火) 21:12:36
>>288 そこまでいくと、std::mapを使いたくなるよ
【質問テンプレ】 [1] 授業単元:アルゴリズム入門 [2] 問題文(含コード&リンク):下記のプログラムは文字列を入力し、 連続している文字があった場合連続数に直し、結果を表示するプログラムである。 例、abcdを入力→abcdを出力 例2、aabbを入力→a2b2を出力 このプログラムの逆の働きをするプログラムを上記プログラムを参考にし作成せよ。 [3] 環境 [3.1] OS: Windows2000 [3.2] コンパイラ名とバージョン: Borland C++builder5.5 [3.3] 言語: C [4] 期限:明日17時まで [5] その他の制限:参考にするプログラムにわからないことが多く、逆のプログラムの作成方法もよくわからないです。明日までと急ですみませんがよろしくお願いします。
291 :
290 :2005/10/11(火) 22:07:47
こちらが問題文です。よろしくお願いします。 while (fgets(bun, 256,stdin) != NULLや if (i&&bun[i-1]==bun[i])の意味がよくわからないです。 #include <stdio.h> #include <conio.h> int main (void) { char bun[256]; int i,n; printf("文字を入力(256文字まで): "); for (i=0;bun[i]!='\0';i++) { while (fgets(bun, 256,stdin) != NULL){ break; } printf("結果:"); for (n=i=0;bun[i]!=NULL;i++){ if (i&&bun[i-1]==bun[i]){ n++; } else { if(n!=NULL){ printf("%d",n+1); } if(!bun[i]) { break; } n = 0; putchar(bun[i]); } } } getch(); return 0; }
意訳: while (fgets(bun, 256,stdin) != NULL バッファ(256バイト)にstdinから1行読み込む。読み込めなければ、ループ終了。 if (i&&bun[i-1]==bun[i]) iが0以外(つまり最初の文字でなでなく)、かつ、今の文字が直前の文字といっしょならば・・・
293 :
287 :2005/10/11(火) 22:44:54
>>289 まあ基本的に投稿者のプログラムを残してますので.
細かな話をすると,std::map は普通は赤黒木だから要素の参照は
配列参照よりもちょっとだけだけ遅くなります.でも検索が必要となる場面って
「(すごく長い文字列から普通の長さの文字列を探す)×たくさん」が多いから,
参照コストは計算量に響いちゃう,という理由もあります.
294 :
C言語始めたばかり :2005/10/11(火) 22:54:18
297 :
デフォルトの名無しさん :2005/10/11(火) 23:46:50
[1] 数学系 [2] x^2 * tan(x) = A をニュートン法を使って解く [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン: 不明 [3.3] 言語: C言語 [4] 期限: 本日中が望ましいが明日の朝まで(明日の授業で提出) [5] その他の制限: なし ずっと考えていましたが解りませんでした。 時間がないですが、よろしくお願いします。
298 :
290 :2005/10/12(水) 00:06:02
>>292 さん
ご返答ありがとうございます。おかげさまで
この条件文の意味がわかりました。
只今、プログラムに取り組んでますが上手くいきません orz
教えてくださる方がいればよろしくお願いします。
>if(i&&bun[i-1]==bun[i]) こんな汚い条件式書くような奴に習いたくないな
301 :
初心者 :2005/10/12(水) 00:45:36
>>235 の課題
できればプログラムのせていただけないでしょうか?
C言語は始めたばかりで
>>235 の課題のレベルはまだかけなくて
>>297 もう寝るので数学っぽいヒントだけ
f(x)=x^2*tan(x)-A だから f'(x)=2*x*tan(x)+x*x/(cos(x)*cos(x))
適当な初期値を x として、
x ← x - f(x)/f'(x)
をひたすら計算。毎回 x の変動量を見て、十分小さくなるまでとかの判定を。
303 :
290 :2005/10/12(水) 01:08:41
>>300 さん
お答えありがとうございました。自分のほうでもなんとかできましたが、
こちらのプログラムのほうがすっきりしてて大変参考になりました。
ありがとうございますm(_ _"m)
>>301 クラスの他の人も同じ課題をしてるわけだから
C言語は始めたばかりってのは何の言い訳にもならん罠
君が嫌われてる理由
1.いちいちageる
2.名前欄の初心者って主張がウザイ
3.そもそもマルチポスト
305 :
286 :2005/10/12(水) 01:23:05
296さん、職人さんどうもありがとうございました。 本当にありがとうつД`)
> char bun[256]; > printf("文字を入力(256文字まで): "); こんなの書くような奴に習いたくないなw
っつーかむしろ漏れは > char bun[256]; > for (i=0;bun[i]!='\0';i++) { 初期化なしかよ > while (fgets(bun, 256,stdin) != NULL){ 256文字かよ > for (n=i=0;bun[i]!=NULL;i++){ char と NULL 比較かよ んな奴に習いたくないなw
>>243 俺のヘボいプログラムやるから今度はテンプレ使えよ
#include <stdio.h>
main(){
int i,j;
printf("数字を入れてみなさい:");
scanf("%d",&i);
if(i<0){
printf("バカ!そんな数字入れんな!\n");
printf("数字を入れてみなさい:");
scanf("%d",&i);
}
for(j=0;j<=i+2;j++)
printf("*");
printf("\n");
}
>>308 どうせ書くならもっと萌えるセリフかけよな
313 :
311 :2005/10/12(水) 06:16:43
>>312 スマソ、忘れてましたorz
出力結果がこうなります、AとBが何か違くありません?
A:
0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000
0.000 +NAN 0.000 0.000
B:
0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000
0.000 +NAN 0.000 0.000
U:
1.000 0.000 0.000
0.000 1.000 0.000
0.000 0.000 1.000
宿題じゃないのですが 300万行くらい(サイズは150MBくらい)あるテキストファイルの \n\n(改行2つ)を\t(タブ)に置換するだけのCのプログラムお願いします コンパイラはBCC5.5で期限は特にありません
[1] 授業単元:生産画像処理工学 [2] 問題文(含コード&リンク): ヒストグラムを求めよう 対象画像 横20×縦15の乱数を用いた画像(値の範囲は0〜9) 画像データを乱数で設定し、その画像のヒストグラムを求め、 求めたヒストグラムを '*' 文字で表示する。 0 : 30 ****************************** 1 : 28 **************************** 2 : 32 ******************************** ....... [3] 環境 [3.1] OS: soralis [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2005/10/12 まで [5] その他の制限: 特になし
316 :
デフォルトの名無しさん :2005/10/12(水) 10:37:24
[1] 授業単元:プログラム [2] 問題文(含コード&リンク): 次に記すcellの構造の定義と変数の宣言の下で、以下の問題に答えよ struct cell {int data;struct cell *next}; struct cell *p, *q, *r 問題1 次に示す状態で計算が始まるものとする data next p□→□ □ 50 null 如何に示す各プログラムコードを順に実行したとき、変数p,q,rとそれらが指す セル内容の各コードに図示せよ。 1 r=(struct cell *)malloc(sizeof(struct cell)); 2 p=q->next; 3 p->next=r; 4 r->data= 100; 5 r->next=q; [3] 環境 [3.1] OS: 手書きの問題です [3.2] コンパイラ名とバージョン: 無し [3.3] 言語: C [4] 期限: 2005年10月13日 [5] その他の制限: 5問ありますがお願いします
>>315 #include<stdio.h>
#include<stdlib.h>
#include<time.h>
void make_image(int image[15][20]){
int y,x;
for(y=0;y<15;++y)for(x=0;x<20;++x)image[y][x] = rand()%10;
}
int main(int argc,char**argv){
int image[15][20],count[10]={0},i,j;
srand(time(NULL));
make_image(image);
for(i=0;i<15;++i)for(j=0;j<20;++j)++count[image[i][j]];
for(i=0;i<10;++i){
printf("%d : %2d ",i,count[i]);
for(j=0;j<count[i];++j)
putchar('*');
putchar('\n');
}
return 0;
}
318 :
電大さんが通る :2005/10/12(水) 11:59:49
授業で出た課題がさっぱりです。 友達にきいたら、こんなんもわからんカスは死ねと言われました。 こんなカスにお力を… ---------------------------------------------------------------------- 自給(円/時間)、働いた時間(時間)、交通費(片道、円)を入力してアルバイト料 を計算し、表示する。扱う数(変数)は整数とする。 ----------------------------------------------------------------------
>>316 特に図示すべき対象物の指定がないので、
単純に変数p, q, r と問題文の該当コード部分を写した後に
「図示すべき対象物の指定なし」と書いて出せば大丈夫でしょう。簡単!!
321 :
315 :2005/10/12(水) 13:34:45
>>316 問題文が正しいかもう一度チェックしてみ(特に2)
それと、初期状態の図は画像でくれた方がわかり易いかも
323 :
デフォルトの名無しさん :2005/10/12(水) 16:34:15
>>287 ,288
ありがとうございますm(ーー)mいまからやってみます。
324 :
デフォルトの名無しさん :2005/10/12(水) 18:22:26
#include <stdio.h> main() { int n, i, s; printf("n を入力して下さい : ") scanf("%d", &n)"; s=0; for (i=1; i<=n; i++) { s +=i; } printf("n=%f Sum=%d/n",n,s); } 1 この例題を変更して1+1/2+1/3+........+1/n の結果を表示するプログラムを作成せよ 2 nの値を読み込んで、n!を計算し表示するプログラムを作成せよ これ課題でてるんだけど解けない。。。orz 頭いい先輩方お願いします。よろしくお願いします。
>>324 1.
#include <stdio.h>
int main()
{
double s;
int i, n;
printf("n を入力してください : ");
scanf("%d", &n);
s = 0.0;
for (i=1; i<=n; i++) {
s += 1.0/i;
}
printf("n=%d sum=%g\n", n, s);
return 0;
}
2.
#include <stdio.h>
int main()
{
int i, s, n;
printf("n を入力してください : ");
scanf("%d", &n);
s = 1;
for (i=1; i<=n; i++) {
s *= i;
}
printf("n=%d n!=%d\n", n, s);
return 0;
}
326 :
デフォルトの名無しさん :2005/10/12(水) 19:57:59
327 :
デフォルトの名無しさん :2005/10/12(水) 20:05:33
こんな宿題がでて、分からず書き込みました。 教えてください。お願いします [1] 授業単元: ネットワークとプログラミング [2] 問題文:ホスト名を元にIPアドレス、サブネットマスク、GW、優先DNS、代替DNSを設定するプログラムを作りなさい。 なお、アドレスの設定は、ファイル(CVS)から読み設定するものとする。 ファイル(CVS)の中身以下の元のする。 ホスト名IPアドレスサブネットマスクGW優先DNS代替DNS host110.192.1.5255.255.255.010.192.1.25410.192.30.110.192.40.12 host210.192.1.6255.255.255.010.192.1.25410.192.30.110.192.40.12 host310.192.1.10255.255.255.010.192.1.25410.192.30.110.192.40.12 host410.192.2.10255.255.255.010.192.2.25410.192.30.110.192.40.12 ・ ・ ・ ・ host10010.192.100.5255.255.255.010.192.100.25410.192.30.110.192.40.12 なお、ホスト名がファイルのリストに無い場合エラーで警告させるようにする また、正常に設定されたら、再起動させるようにせよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語: Cまたは、C++ [4] 期限: [2005年10月15日00:00まで] [5] その他の制限: 特になし。 よろしくお願いします。
328 :
デフォルトの名無しさん :2005/10/12(水) 20:18:42
↑ ホスト名とかがつながって表示されているのでスペースであけました。 ファイルは、以下のようになっています。 ホスト名 IPアドレス サブネットマスク GW 優先DNS 代替DNS host1 10.192.1.5 255.255.255.0 10.192.1.254 10.192.30.1 10.192.40.12 host2 10.192.1.6 255.255.255.0 10.192.1.254 10.192.30.1 10.192.40.12 host3 10.192.1.10 255.255.255.0 10.192.1.254 10.192.30.1 10.192.40.12 host4 10.192.2.10 255.255.255.0 10.192.2.254 10.192.30.1 10.192.40.12 ・ ・ ・ host100 10.192.100.5 255.255.255.0 10.192.100.254 10.192.30.1 10.192.40.12 なんどもすみません。よろしくお願いします。
[1] 授業単元:C言語プログラミング [2] 問題文: ある人工衛星が地球を1周する周期は T=2.0π((R+h)^3/(gR^2))^0.5 である この人工衛星の地球からの高さを100kmからはじめ100kmきざみで 1000kmまで変化させた時のTの値を求めよ。 Tは関数を用いて計算せよ また T:周期(秒) g:重力加速度(9.81m/s^2) R:地球の半径(6.37*10^6メートル) h:地表から人工衛星までの高さ(m) とする [3] 環境 [3.1] OS: Windows XP [3.3] 言語: C [4] 期限: 2005年10月14日まで [5] その他の制限:よろしくお願いします
>>329 そのまんま。
#include <stdio.h>
#include <math.h>
#define PI 3.1415926
#define R 6.37e6
#define G 9.81
double T(double h)
{
retrun 2.0*PI*pow((pow(R + h,2.0) / (G*pow(R,2.0))),0.5);
}
int main(void)
{
int i;
double t;
for(i = 1;i <= 10;i++){
t = T(i * 100.0);
printf("%2d:T=%lf\n",i,t);
}
return 0;
}
>>329 #include<stdio.h>
#include<math.h>
#define PAI 3.14
#define G 9.81
#define R 6.37E6
/*地表から人工衛星までの高さ(km)*/
#define H 100
double CULt(int h)
{
return 2.0*PAI*pow((pow(R + h,3.0) / (G*pow(R,2.0))),0.5);
}
int main(void)
{
int h=1000*H;
int i;
for(i=h;i<=1000000;i=i+100000){
printf("h=%4d(km): T=%f(sec)\n",i/1000,CULt(i));
}
return 0;
}
333 :
デフォルトの名無しさん :2005/10/13(木) 00:07:03
>>327 >>328 は問題の意味がわかんない。
ホスト名を入力・選択すると、そのPCのネットワーク設定が変更、でいいのかな?
でも正直こんな課題、家とかでも実験しにくいし、出題者は何を考えているんだ...
そして
>>333 ゲッ
【質問テンプレ】 [1] 授業単元:ソフトウェア基礎 [2] 問題文(含コード&リンク): テキストファイルを読み込んで、文字ごとに登場頻度を%表示で表すプログラムを作成せよ。 例えば、aaaabbcccdと書いてあるテキストファイルを読み込むとする。 出力結果は読み込まれたファイル内容→aaaabbcccdと各文字の割合→a=40% b=20% c=30% d=10% と出力されるようにせよ。 [3] 環境 [3.1] OS: Windowsxp home [3.2] コンパイラ名とバージョン:家ではbcpad、学校ではC++ビルダー6.0 [3.3] 言語: Cのみ [4] 期限:明日中 [5] その他の制限: ファイルポインタというのをこの前の授業で習ったので、それを使用します。 考えてたらわからないまま期限になってしまいました。どうぞよろしくお願いします。
>>334 含まれてる文字はアルファベット小文字のみか?
てけとーなんで信用しないように。 #include <stdio.h> #include <ctype.h> int main(void) { int c, total = 0, count[256] = {0}; while ((c = getchar()) != EOF) { count[c]++; total++; } for (c = 0; c < 256; i++) { if (count[i] && isprint(c)) { printf("%c = %f%%\n", c, count[c] / (double) total); } return 0; }
>>334 ファイルポインタを使用するってのが曖昧で
どうしたいかわからんから、推測気味に書いてみた。
#include<stdio.h>
int main(){
int counts[256]={0},count=0,ch,i;
FILE* fp = fopen("a.txt","r");
if(!fp){
puts("Error: ファイルが存在しません。");
return 0;
}
while((ch=getc(fp))!=EOF)++count,++counts[ch];
for(i=0;i<256;++i)
if(counts[i])printf("%c=%g%%\n",i,counts[i]*100.0/count);
return 0;
}
338 :
334 :2005/10/13(木) 00:47:39
>>335 アルファベットの大小と数字でできれば良いと先生が言っていました。
340 :
334 :2005/10/13(木) 00:53:21
>>335 336
素早い返信大変感謝です。問題には書いてませんが、読み込むファイルは自分で指定できるようにして
と言われました。書いていなくてすみません(*_ _)
341 :
334 :2005/10/13(木) 00:56:25
レス間違ってしまった・・・。
>>337 さん。すみません。
皆さんのを参考にもう少し頑張ってみます
>>340 暇なんで貼り絵した。脳内gccすら通してないからミスってたら修正よろ
mainの仮引数間違ってる可能性大
#include<stdio.h>
#include <ctype.h>
int main(int argc, char *argv){
int c, total = 0, count[256] = {0};
if (argc <= 1) {
puts("Error: ファイル名を指定してください");
return 1;
}
FILE* fp = fopen(argv[1], "r");
if(!fp){
puts("Error: ファイルが存在しません。");
return 1;
}
while ((c = getc(fp)) != EOF) {
count[c]++;
total++;
}
for (c = 0; c < 256; i++) {
if (count[i] && isprint(c)) {
printf("%c = %f%%\n", c, count[c] / (double) total);
}
return 0;
}
仮引数はchar *argv[]。 return 0;の前に}が1個不足してる。 って、漏れも脳内コンパイラだけど。
[]付けるかどうか迷ったんだよな・・・しかもfor閉じられてないし やっぱり久しぶりに触るとダメだな Pascalなんて時代遅れな言語やらせる大学がUzeeeeeeeeeeeeeeee('A`)
そこまで好きなら大学以外のプログラムもしなっせ。 Javaあたりがおすすめ。(C知ってるとC++を勉強するのに足かせになる)
>>345 無論、大学の方は課題だけ仕上げて独学でやってるよ
今はオブジェクト指向とC++学び中
Javaやろうかとは思ったんだけど、どうもあの言語好かないんだよな
言語仕様云々じゃなくてJREが遅いってのが原因だけど
えらいな。勉強家は。こういう人ばっかだと、このスレいらんのだろうな。
スタート状態が、 器A 茶 透 緑 器B 茶 透 緑 器C 茶 透 緑 となっていて、 ゴール状態が 器A 茶 茶 茶 器B 透 透 透 器C 緑 緑 緑 となればよいのか? 移動ってのは例えば、 移動前 器A 茶 透 緑 器B 茶 透 緑 器C 茶 透 緑 移動後 器A 茶 茶 透 緑 器B 茶 透 緑 器C 透 緑 ということか?
350 :
348 :2005/10/13(木) 03:17:03
>>349 えと
器A:茶1 緑2 透明3
器B:茶4 緑5 透明6
器C:茶7 緑8 透明9
だったら
器A:茶のみ1+4+7
器B:緑のみ2+5+8
器C:透明のみ3+6+9
と集めて
最小値は4+7+2+8+3+6の30ということになります
出力 BGC 30 (茶緑透明)
なので
器A 茶 透 緑
器B 茶 透 緑
器C 茶 透 緑
となっていて、
ゴール状態が
器A 茶 茶 茶
器B 透 透 透
器C 緑 緑 緑
のように1つの容器を1色だけにするための最小移動数を求めればいいそうです。
すまん、理解できんかった。
>>350 つまり、r1〜r6の最小の物を見つけて(同値ならr1の方を優先で)
コードを6分岐できればいいということだな?
int name; これを宣言 num = r1; name = 1; こう変更 各if内を同様に変更 -> num = r2; name = 2; printfはifから消す 最後に以下 switch (name) { 1: printf("BCG %d", num); break; 2: printf("BGC %d", num); break; 略 6: printf("GCB %d", num); break; } 多分この変更でいけるんじゃまいか? switchをまだやってないならif (name == 1)とかの羅列に変えてくれ つーか配列もポインタも使えないからすっきりした実装ができないな
>>348 while(cin >> b1 >> g1 >> c1 >> b2 >> g2 >> c2 >> b3 >> g3 >> c3) {
bb1 = b2 + b3; gg1 = g2 + g3; cc1 = c2 + c3;
bb2 = b1 + b3; gg2 = g1 + g3; cc2 = c1 + c3;
bb3 = b1 + b2; gg3 = g1 + g2; cc3 = c1 + c2;
// BCG
min = bb1 + cc2 + gg3; color = "BCG";
// BGC
if((sum = bb1 + gg2 + cc3) < min) {
min = sum; color = "BGC";
}
// CBG
if((sum = cc1 + bb2 + gg3) < min) {
min = sum; color = "CBG";
}
// CGB
if((sum = cc1 + gg2 + bb3) < min) {
min = sum; color = "CGB";
}
// GBC
if((sum = gg1 + bb2 + cc3) < min) {
min = sum; color = "GBC";
}
// GCB
if((sum = gg1 + cc2 + bb3) < min) {
min = sum; color = "GCB";
}
cout << color << " " << min << endl;
}
C++だが、根幹が分かれば大丈夫だと思う。重要なのは出力を1カ所で行うことだな。
>>356 配列まだって言ってるから文字列無理じゃね?
358 :
348 :2005/10/13(木) 04:17:46
>>352 そうです。
アルファベット順(若しくは茶色>透明>緑色)だそうです。
>>353-354 switchは分かります。でも使わなきゃムリなんですかね・・・。
IF文で出来るとかあったけど、switch使ってもいいよってことなのか・・。
>>356 c++は触ったことも無いかも・・・でも同じような感じですね。
もすこし見てみます。
>>356 配列をやっていない=>ポインタなんでなおのことやってない
colorをどう宣言すれば良いかもわかんないと思うぞ
Cを標準装備しているならchar *color;でいいが
無理やりするなら
char color1,color2,color3;
color1='B';color2='C';color3='G';
printf("%c%c%c",color1,color2,color3);
かなorz
360 :
287 :2005/10/13(木) 06:16:31
>>326 警告とか出たなら書いてくれ.
で……申し訳ないが g++,bcc でも動作するコードは書けなかった.どうやら locale 周りで
死んでるみたい.もしファイル読み込みが fscanf(fp, "%d,%l[^,],%l[^,],%d", 略): で動作するならラッキー.
動かなかったら
1. wchar_t は諦めて素敵な日本語ライブラリを探す.
2. 日本語単位になるのを諦めて char でやる.skip[ (unsigned char)x ].
3. wchar_t でやる方法をがんばって調べる.
お勧めは 2. あと誰か日本語処理強い人が居たらお願いします.
361 :
デフォルトの名無しさん :2005/10/13(木) 07:13:33
>>326 です。
>>333 >ホスト名を入力・選択すると、そのPCのネットワーク設定が変更、でいいのかな?
>でも正直こんな課題、家とかでも実験しにくいし、出題者は何を考えているんだ...
ホスト名は、入力しません。ホストに設定されている、名前とファイルにある名前を照らし合わせて、一致したら
IPを設定するプログラムです。違う場合、エラー通告。
ホストに設定されている、名前がファイル上にあったら、その行のアドレスをPCに設定するプログラムです。
よろしくお願いします。
362 :
デフォルトの名無しさん :2005/10/13(木) 07:25:04
325さんどうもありがとう(泣)
363 :
デフォルトの名無しさん :2005/10/13(木) 14:32:13
[1] 授業単元:ネットワーク [2] 問題文(含コード&リンク):ウェブサーバーの構築。 [3] 環境 [3.1] OS: LINUX [3.2] gcc [3.3] C [4] 期限: 10月15日。 [5] その他の制限: ネットワークに関する基礎とソケットプログラミングを少し。 ポート80や8080や6789を使う代わりに、自分独自のポートを選ぶ。 次の2つのステップを含む。 「ステップA」 メッセージのリクエストをダンプするウェブサーバーを構築。 ブラウザーを使用して、自分のサーバーにつなぎ、メッセージのリクエストを記録する。 「ステップB」 パートAで作ったコードに基づき、ブラウザーからHTTPリクエストをparseし、、 ヘッダーラインによってprecedeされるリクエストファイルを含むHTTPの応答メッセージをつくり、 応答を直接clientに送るウェブサーバーを作るために、関数を1つ加える。 「注意。」ブラウザーとサーバーを同じマシーンでやっているならば、local hostまたは、127.0.0.1を使う。 contentType functionは少なくともHTMLファイルを認識する。 パートA、パートBが終われば、自分のサーバーをテストする。 最初にHTMLファイルをサーバーのdirectoryにおき、サーバーに接続する。 webserver.c とレポートするhtmlファイルを提出する。 ネットワークの授業の最初のレポートです。 宿題に関しては、教授等まったくサポートしてくれないということになっています。 最初のプロジェクトで、まず何をどう始めていいかさえわかりません。 よろしくお願いします。
364 :
デフォルトの名無しさん :2005/10/13(木) 15:25:40
[1] 授業単元:ゼミ [2] 問題文:文脈自由文法で入力された 「わしのにわのわしのきにわしがとまったので,わしがてっぽうでうったら, わしもおどろいたが,わしもおどろいた。」 この仮名文字の文章を, 「わしの庭のわしの木に鷲が留まったので,わしが鉄砲で撃ったら, 鷲も驚いたが,わしも驚いた。」 このように漢字変換されるアルゴリズムと,それに基づくプログラムを作成する課題です。 入力形式は,1文全てを入力しての1発変換か,カンマ区切りの入力(課題では4回の入力)で, 正しい日本語に変換するという問題です。 問題にはカンマはない状態でしたので,もしカンマの位置が不適切でしたら, プログラムできるように変えてください。 カンマで区切る場合は,変換の度に正しい漢字に変換できるようにしてください。 例えば,「わしのにわのわしのきにわしがとまったので」と入力されたら 1回の変換で「わしの庭のわしの木に鷲がとまったので」と変換されるようにしたいです。 それと,「とまった」は「留まった」でいいと思うのですが もし間違っているようであれば,訂正してください。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:VC 6.0 [3.3] 言語:C++ [4] 期限: [2005年10月14日2:00まで] [5] その他の制限: 関数,構造体,ポインタの基本的なことは習っていると思います。 変換の際,辞書ファイルが必要になるような気もするので もし必要であれば,辞書ファイルもアルゴリズムに合わせてください。 *アホなので,コメント多めでお願いします>< サポートやヒントらしいヒントもなく,まったく組めない状態です。 よろしくお願いします。
>>364 問題がよくわからん.その特定の文章の連続部分文字列の変換だけ対応すればいいのか,
もっと一般的なアルゴリズムがほしいのか,とか.
背景が知りたいので,どんなゼミでどんな状況でこの課題が出されたか詳しくキボン.
(初期のワードプロセッサで)最長一致が結構認識率が高いということだった。 課題については、strcmp(line, "わしの・・・") で。
367 :
デフォルトの名無しさん :2005/10/13(木) 16:21:34
[1] 授業単元: 基礎情報処理 [2] 問題文 正整数を入力し、それをローマ数字で表示するプログラムを作りなさい。 例: 3 III 5 V 12 XII 46 XXXXVI 73 LXXIII 111 CXI 378 CCCLXXVIII 521 DXXI 1002 MU [3] 環境 [3.1] Windows [3.3] C言語 [4] 期限: 10月17日(月) [5] その他の制限: 制限についてはそこまで考慮していただかなくて かまいませんが、一応今まで習ったのはfor,if,多重ループ、while、配列、 関数です。多少非効率的でも簡単なプログラムだと嬉しいです。 よろしくお願いします。
>>326 VS.NET 2003のようだし、こんなモンでいいだろ。
>>287 氏のmain()の変わりに使ってくれ。
stdinから読んでstdoutから吐くのでリダイレクトしてくれ。検索キーは引数で指定。
void look(wchar_t *key)
{
table(key);
int m, n;
wchar_t s[1024], t[1024], *p;
while (scanf("%d,%l[^,],%l[^,],%d", &m, s, t, &n) == 4)
if (p = Search(s, key))
printf("%d,%ls,%ls,%d\n", m, s, t, n);
}
int wmain(int argc, wchar_t **argv) {
locale::global(locale("japanese"));
if (argc < 2) {
fprintf(stderr, "usage: %s searchkey\n", argv[0]);
return 1;
}
look(argv[1]);
return 0;
}
>>367 #include<stdio.h>
int main(){
char *M[10]={"","M","MM","MMM","M?","?","?M","?MM","?MMM","M?"};
char *C[10]={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
char *X[10]={"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
char *I[10]={"","I","II","III","IV","V","VI","VII","VIII","IX"};
unsigned num;
scanf("%u",&num);
printf("%s",M[num%10000/1000]);
printf("%s",C[num%1000/100]);
printf("%s",X[num%100/10]);
printf("%s",I[num%10]);
return 0;
}
370 :
デフォルトの名無しさん :2005/10/13(木) 17:39:42
<<360 <<368 ありがとうございます早速がんばってみます。 あっ警告いろいろやってたらきえました(−−;)
CSVファイルを読みとって、一行ごとに結果を表示したいんだけど、、、 char szStr[1024 * 64]; DWORD dwAccBytes; HANDLE hFile = ::CreateFile( csvFile.c_str(), GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); // ファイルポインタを読み込む if( ReadFile(hFile, szStr, 1024*64, &dwAccBytes, NULL) ) { ::CloseHandle( hFile ); } szStrに、ファイルの全部の内容がどば〜っとはいってしまってどうしたらいいかわかりません。 szStrを改行ごとにしらべて分解していくしかないのでしょうか?
>>371 読んだ後にカンマとか改行とかでセパレート
これでわからんようなら
>>1 参照
374 :
364 :2005/10/13(木) 19:18:33
>>365 有難う御座います。説明下手ですみません。
特定の文章の連続部分文字列の変換だけ対応というよりは、
課題も含んだ一般的なアルゴリズムでお願いします。
課題が出された背景は,ゼミで文脈自由文法について習っていた中で
文脈自由文法を漢字変換する際に,
アルゴリズムとすることが難しい例として
「わし」と「鷲」の変換例が出されて,より日本語らしい文章ということで
課題のような仮名文が出されました。
>>366 有難う御座いました。
最長一致法で認識率が高いのは分かるのですが,
この課題では,2回出てくる「わしもおどろいた。」の部分で
それぞれ違う変換を求められるので,最長一致法では無理かなって思ってました。
私が勝手に最長一致法では無理と判断して書かなかったので
もしできるようなら,最長一致法でお願いします。
char *henkan(const char *s) { if (strcmp(s, "わしのにわのわしのきにわしがとまったので,わしがてっぽうでうったら,わしもおどろいたが,わしもおどろいた。") == 1) return "わしの庭のわしの木に鷲が留まったので,わしが鉄砲で撃ったら,鷲も驚いたが,わしも驚いた。"; else return s; } ワードプロセッサの「貴社の記者は汽車で帰社した」なんかはこんな発想で作られている。 何がいいたいかというと、特例を作ってしまえばよいってこと。 (マジメにやるなら、その手のフリーソフトのソース読んでください)
すまん。strcmp(..) == 0だ・・・吊って来る。
>>375 ×strcmp(...,...) == 1
○strcmp(...,...) == 0
378 :
377 :2005/10/13(木) 19:37:20
おっと、先に本人に気づかれたかw
「単なる宿題」の範囲を超えている問題だと思うのは俺だけ?
まともなものができたらお金貰えそうだな 「こういう論文とかプログラムを参考にしてこんなもん考えてこう実装したらこうなった」 「こういう場合にはうまくいくがこういう場合にはうまくいかない」 とか発表するのがゼミならちょうどいいところだと思うが
課題の目的が「うまくいかない」と確認させることな気がするし、 それをどう報告するかってのを学ばせるためだと思う。
ゼミの宿題ではなくて卒業制作か何かなのではないだろうか。
D:\randdata.txt の先頭のデータ
ありがとうございました。
【質問テンプレ】 [1] 授業単元: ソートとサーチ [2] 問題文(含コード&リンク): @主な準備 ・対象データ配列作成プログラム その都度指定する個数X(最大100万程度)の整数をランダムに並べた配列を作成、 また、必要に応じ整列済み、逆順整列済みなどのデータを作成。 ・処理時間の測定方法の調査 ・ソート結果が正しいかどうかチェックするプログラム Aサーチプログラム1 与えられた配列から指定した値を検索する。 Bソートプログラム1 バブルソート、挿入ソートなどのNの2乗オーダのプログラムを1つ以上。 Cサーチプログラム2 整列済みの配列から指定した値を高速に検索する。 Dソートプログラム2 クイックソートなどNlogNオーダの高速ソートプログラムを1つ以上。 [3] 環境 [3.1] OS: Unix [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [2005年10月14日07:00まで] [5] その他の制限: プログラムのソースをお願いします><A〜Dはすでに答えてもらっているので合ってるのでしょうか? @のデータを作成っていうあたりもよくわかりません。。プログラムのソースと一緒に説明できる方おられました らお願いします。。
388 :
364 :2005/10/14(金) 00:29:54
>>375 〜
>>378 特例を認めるってことですか。
「貴社の記者は汽車で帰社した。」の例文は知らなかったので、
その辺ももう少し調べてみたいと思います。
>>380 〜
>>383 みなさんおっしゃるように、
「うまくいかない」ことを学ばせるためかもしれません。
というか、言われて気づきました・・・。
卒論ではなくゼミなので、
それならサポートもらえないのも理解できますし。
特例の件も含めて、検討してみます。
本当にありがとうございました。
>>387 void make_data(int data[], int size, int type)
{
int i, j, k;
if( type == 0 ) { // ランダム(重複有り)
for( i = 0 ; i < size ; i++ ) data[i] = rand();
} else if( type == 1 ) { // ランダム(重複無し)
make_data(data, size, 2);
for( i = 0 ; i < size ; i++ ) {
j = rand() % size;
k = data[i];
data[i] = data[j];
data[j] = k;
}
} else if( type = 2 ) { // 整列済み(重複無し)
for( i = 0 ; i < size ; i++ ) data[i] = i;
} else if( type = 3 ) { // 逆順整列済み(重複無し)
for( i = 0 ; i < size ; i++ ) data[i] = size - i;
}
}
前(
>>187 )にこれと同様なのを答えたことあるけど、具体的なソースとして
ここまで作ってあげる必要があるんならもっとキミは勉強が必要。
まープログラムの課題なんて、他人のプログラムをコピーするくらいしかしないしなぁ。 せっかく段階を踏んで課題をだされても、ぜんぜん理解できないよ。
#include<stdio.h> #define MAX 1000 int main(void) { int i=0, sum=0, ary[MAX]; puts("整数を入力してください。"); while(i < MAX){ printf("NO.%d:", i+1); scanf("%d", &ary[i]); sum += ary[i++]; } if(i > 1) printf("合計は%dで平均は%.2fです。\n", sum, (double)sum / i ); return (0); }
終了条件ならwhile()の中に入ってるじゃん
1000個入力しろってことか。
>>389 本当にありがとうございます;;
簡単なプログラムしか作れない初心者で・・・・
授業では一切説明とかなくて・・・「はい、つくって」って感じで・・・助かりました><
自分でも勉強して行きますが、また力不足のとき、ここの方々の力を借りたいと思います;;
>>392 そんな汚いコードは見るだけで害だから、すぐ忘れた方がいい
#include<stdio.h>
#define MAX 1000
int main(void)
{
int i=0,sum=0;
puts("整数を入力してください。");
for(i=0;i<MAX;i++){
int num;
printf("NO.%d:",i+1);
if(scanf("%d",&num)<1)break;
if(num==9999)break;
sum+=num;
}
if(i){
printf("合計は%dで平均は%.2fです。\n",sum,(double)sum/i);
}
return 0;
}
399 :
398 :2005/10/14(金) 14:18:25
インデントがずれた、というか 入ってしまった
1] 授業単元:プログラミング言語 [2] 問題文1:入力された数値を大きい順、小さい順に並びかえよ。 入力の終了条件/継続条件は各自決定すること。ただし、実行時に変更できるようにすること。 問題文2:入力された数値を大きい順、小さい順に並びかえよ。 ただし、同じ値には同じ順位を付けて、順位は一つずつ変化する。 問題文3:入力された数値を大きい順、小さい順に並びかえよ。 ただし、同じ値には同じ順位を付けて、順位は個数ずつ変化する。 [3] 環境 [3.1] OS:unix [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限:2005/10/24(月)17時まで [5] その他の制限:選択ソートを使用。 お願いしますorz
401 :
1-1 :2005/10/14(金) 16:35:54
>>400 #include<stdio.h>
#include<stdlib.h>
#define MAX 10000
void selsort(int data[],int n,int flg);
int main(int argc,char** argv){
int i,n;
int *data;
n=atoi(argv[1]);
data = (int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++){
printf("No.%d = ",i+1);
scanf("%d",&data[i]);
}
selsort(data,n,0);
printf("\n[Ascending order]\n");
for(i=0;i<n;i++){
printf("%d\n",data[i]);
}
selsort(data,n,1);
printf("\n[Descending order]\n");
for(i=0;i<n;i++){
printf("%d\n",data[i]);
}
return 0;
}
402 :
1-2 :2005/10/14(金) 16:37:06
void selsort(int data[],int n,int flg){ int i,j,k,min,max,temp; if(flg==0){ for(i=0;i<n-1;i++){ k=i; min=data[i]; for(j=i+1;j<n;j++){ if(min>data[j]){ min=data[j]; k = j; } } temp=data[i]; data[i]=data[k]; data[k]=temp; } } if(flg==1){ for(i=0;i<n-1;i++){ k=i; max=data[i]; for(j=i+1;j<n;j++){ if(max<data[j]){ max=data[j]; k = j; } } temp=data[i]; data[i]=data[k]; data[k]=temp; } } }
とりあえず問題文1だけやってみました。 自分も学生なんでなんか間違ってるかもしれませんが(´・ω・`)
>>403 mallocしたものはfreeしましょう。(OSが…、とかじゃなく気持ち悪いから)
> if(min>data[j]){
> min=data[j];
> k = j;
> }
とかは
if(data[k]>data[j]){
k = j;
}
の方が見やすいかな
あと、int flagはint descとか意味のある名前にしましょう。
>>404 ご指摘ありがとうございます。
mallocしてたこと忘れてましたorz
#define MAX 10000 も要らないですね。
406 :
367 :2005/10/14(金) 23:51:08
>369 ありがとうございます! …が、charというものがよく分かりません。 習っていないものはあまり使わないほうがよいのですが、 他の方法はありませんか?申し訳ないです。 別解を思いついた方、是非教えて下さい。お願いします。
[1] 授業単元: プログラミング実験
[2] 問題文
あるファイルには、全て小文字で書かれた英単語が、スペースまたは改行を区切りに書かれている。
このファイルの中には同じ単語が何回か繰り返し入力されている。このようの単語ファイル名をキーボードから入力すると、
各単語とそれぞれの出現回数と、その訳をディスプレイに表示し、かつ指定した出力ファイルにも書き込むプログラムを作成せよ。
ただし、入力単語ファイルの単語の種類は100未満とする。単語の一覧表示の順序はファイル中に出てきた順でよい
このプログラムを作成するに当たり、ofstream、ifstreamを使用する。
ifstreamでは英単語用と、辞書用の二つのifstreamのオブジェクトを定義する。
辞書には『英単語 訳』と入っているので英単語用の配列と訳用の配列を用意し、i番目の英語の訳はi番目に入るようにする。
ファイルに出現した単語を格納するstring配列を用意する。
上記の単語配列にあわせて、その単語の出現頻度を格納する整数配列も用意する。
<実行例>
Specify input file! words.txt
Specify output file! result.txt
result:
and と 3
apple リンゴ 2
button ボタン 1
cat 猫 3
kiwi 未登録 1
辞書ファイル以下にアップロードしてあります
ttp://www.geocities.jp/ryo_haruka2002/dicE1.txt [3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: 不明
[3.3] 言語: C++
[4] 期限: [2005年10月17日9:00まで]
[5] その他の制限: 分岐、多重繰り返し、リダイレクション、配列あたりまでやってます。
作ってるうちに8つくらい配列が出来てしまい、コンパイルしたらエラーだらけで
とても使い物にならなかったので…お力添えをお願いします。
std::vector<>とか習った?
map使うとすぐだな
410 :
369 :2005/10/15(土) 01:30:13
>>406 charが解らないってこと?(それならお手上げ)
*(ポインタ)が解らないってことなら
char M[10][5]={"","M","MM","MMM","M?","?","?M","?MM","?MMM","M?"};
char C[10][5]={"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
char X[10][5]={"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
char I[10][5]={"","I","II","III","IV","V","VI","VII","VIII","IX"};
ならどう?
411 :
1-1 :2005/10/15(土) 02:12:17
>>406 #include<stdio.h>
int main(void){
int i,num;
printf("正整数を入力してください:");
scanf("%d",&num);
i=1;
while(i){
if(num>=1000){
printf("M");
num = num-1000;
}
if(num<1000) i=0;
}
i=1;
while(i){
if(num>=900){
printf("CM");
num = num-900;
}
if(num<900) i=0;
}
412 :
1-2 :2005/10/15(土) 02:12:53
i=1; while(i){ if(num>=500){ printf("D"); num = num-500; } if(num<500) i=0; } i=1; while(i){ if(num>=400){ printf("CD"); num = num-400; } if(num<400) i=0; } i=1; while(i){ if(num>=100){ printf("C"); num = num-100; } if(num<100) i=0; } i=1; while(i){ if(num>=90){ printf("XC"); num = num-90; } if(num<90) i=0; }
413 :
1-3 :2005/10/15(土) 02:14:01
i=1; while(i){ if(num>=50){ printf("L"); num = num-50; } if(num<50)i=0; } while(i){ if(num>=40){ printf("XL"); num = num-40; } if(num<40) i=0; } i=1; while(i){ if(num>=10){ printf("X"); num = num-10; } if(num<10) i=0; } if(num==0) printf("\n"); if(num==1) printf("I\n"); if(num==2) printf("II\n"); if(num==3) printf("III\n"); if(num==4) printf("IV\n"); if(num==5) printf("V\n"); if(num==6) printf("VI\n"); if(num==7) printf("VII\n"); if(num==8) printf("VIII\n"); if(num==9) printf("IX\n"); return 0; }
whileとifだけで書いみた。 って今よく見たら関数使ってもよかったのねorz
if(num>=40)のとこのwhileの上のi=1;が抜けてる
416 :
407 :2005/10/15(土) 05:47:48
417 :
407 :2005/10/15(土) 05:48:33
[1] 授業単元:人工知能 [2] 問題文: 狼と山羊とキャベツと男のパズルを横型探索するプログラムを作成せよ。 [3] 環境 [3.1] OS: Unix [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [2005年10月18日まで] よろしくお願いします。
419 :
デフォルトの名無しさん :2005/10/15(土) 10:38:27
>>327 >>328 の問題と似ているんですが、以下の問題でました。
[1] 授業単元:ネットワーク論
[2] 問題文(含コード&リンク):
ホスト名を入力し、ファイルリストのからホスト名を元にIPアドレス、
GW、サブネット、DNSを設定させるプログラムを作成せよ。
なお、ホスト名が正しくない場合、エラーで通告せよ。
IPアドレスなどが、正しく設定されたら、
設定を反映させるために再起動を実行させるプログラムを実行せよ。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC 6.0等
[3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年10月17日00:00まで]
[5] その他の制限: 特になし。
>>327 と違う点は、ホストも変更する点です。
よろしくお願いします。
>>419 環境依存スレかネットワーク関係のスレのほうがいいかもねー
>>407 文字列はどうならいました?
#include <string>
std::string ...;
とか
#include <string.h>
string ...;
とか
#include <string>
using namespace std;
string ...;
とかあるんですけど。
>>420 そんなこと言われなくてもわかってます。
それ以前に、そんな忠告するぐらいだったら最初から全部答えろやカスが。
422 :
407 :2005/10/15(土) 16:28:33
>>420 文字列はその一番下の
#include<string>
using namespace std;
を使ってます
了解。C++はよくわからんけど、作ってみるよ。
>>424 ありがとうございます!助かりました!
あと番兵って何ですか?初めて聞く言葉ですが…
>>423 先に
>>424 さんが作られてしまいましたが、何パターンもみれた方が勉強になるんで完成したらアップしてもらえるとうれしいです。
426 :
424 :2005/10/15(土) 22:20:30
>>425 配列の最後に終端記号を置くことを番兵を置く,って言います.配列から何かを検索するときに
int i; for (i = 0; i < size; ++i) if (a[i] == 何か) break; の代わりに
a[size] = 何か; int i; while (a[i] != 何か) ++i; と書いたりする感じです.
上のプログラムの最後の部分では、日本語辞書の一番最後に "未登録" を置いておいて,英語辞書の
対応する部分に翻訳前のを設定して先頭から探索をかければ,もし普通に登録されてれば対応する英語,
登録されてなければ一番最後の部分で引っかかって "未登録" が出る,とかやってます.
>>425 C/C++の文字列リテラルのナル文字も、ある意味番兵。
番兵(Sentinel)を使わない場合、文字列長を保存する仕掛けが必要になってしまう。
#そういう言語も少なくないし、C++の文字列クラスもそうなってたりはするが。
わはは。423でつ。できませんでした。(手屁)
429 :
デフォルトの名無しさん :2005/10/16(日) 00:07:24
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): あるテキストから(絶対パス、相対パスどちらかが記入されている) ディレクトリを読み込み、ディレクトリを移動した後、ディレクトリ内にファイル が存在する場合は、そのファイルのパーミッション、グループ名、ユーザ名、 ファイルサイズ、名前の順に表示する。 例) テキスト内 /home/users/d05/d05a0rst/dir1/work workディレクトリ内のファイル hoge.c hoge.txt 実行結果 -rw-rw-rw-rw- root root 1541 hoge.c -rw-rw-rw-rw- users users 2416 hoge.txt [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 無期限 [5] その他の制限: システム関数は使用してはいけない。 私が問題を聞いて感じたのは、構造体から必要な 情報のみを取得し、表示させるプログラムを作る って事だと思いましたが、ls -l コマンド以外に 思いつきません。 なのでどうか皆さんお力お貸しください。 よろしくお願いします。
opendir()/readdir()/closedir()/stat() ユーザー名とグループ名は持ってきたことないからわからん。
システム関数ってのが system("ls -l"); のことなら FILE* fp=fopen("la -l", "r"); while( !feof(fp) ) { char tmp[1000]; fgets(tmp, 1000, fp); fputs(tmp, stdout); } (短くするために色々省いた)で行けるんだけどなぁ…
あ、なるほど。popenかもしれん。
434 :
デフォルトの名無しさん :2005/10/16(日) 00:29:45
>>430 さん
>>431 さん
さっそくご返答ありがとうございます。
system("ls -l"); が使用できないので、大変困っています。
自分が無知なもので、すみません。
イメージは多分、ディレクトリ内のファイル一つ一つに対して
パーミッション、グループ名、ユーザ名、ファイルサイズ、名前を
取得し表示の繰り返しだと思うんですが。
execl使用可だったりして。
436 :
429 :2005/10/16(日) 00:41:30
429です。 できればどなたか簡単なパーミッション、グループ名、ユーザ名、ファイルサイズ、名前 取得のサンプルソースなんか書いていただけないでしょうか? テキストからのディレクトリの取得やディレクトリの移動、あたりは 自分で何とかしようと思っていますが、パーミッションあたりは 何も知識が無く、どうしようもなく困っています。 よろしければ、お願いします。 execlも使用できないと思われます。 構造体からの取得ってものが私の悩みどころです。
>>430 stat()したあとに/etc/passwdを検索とか(w
先に /etc/passwd と /etc/group から ID→ユーザ名、グループ名 のテーブル作って stat() で得られる uid gid から逆引きしたら?速さを気にしなければ何とかなるでしょ。 ってまぁ ls のソース見れば多分一発解決なんだろうが。
被った上に先人はネタ扱い… (´・ω・`)ショボーン 自分も半分ネタ扱いだけどさ。
lsのソースってばどこどこ?
442 :
438 :2005/10/16(日) 01:02:29
>>440 別にネタって訳じゃないけど、
思いついた自分も、全然スマートじゃないって感じただけ。
他に有効な方法があるのかは、知らない
/etc/passwdとか直截見るのは論外。シャドウされてるかもしれないし。 getpwent()系の関数を使え。
444 :
デフォルトの名無しさん :2005/10/16(日) 01:42:41
429・436です。
皆さんご返答ありがとうございます。
私の力では、
>>438 さん
>>439 さんの回答ネタなのかどうかもわかりませんが、
スマートなコーディングを行いたいと言うのが希望です。
unix初心者ですが、やさしい内容でご教授できないでしょうか?
スマートかどうか分からんが、今書いてる。そっちのUNIXでどれだけの関数がまともに使えるか分からんが、 こっちでは一応こっちのUNIX・Linux・Cygwinでは動作テストしてみる。
ふぁいと。
447 :
444 :2005/10/16(日) 01:47:26
おお、
>>445 さんありがとうございます。
ほんとココの住人の皆さんはしっかり答えてくれる方々が
いてくれて助かります。
ありがとうございます。
めんどくさいから、gnuのftpからfileutilのソース持ってきてls.cを読んでみろ
450 :
447 :2005/10/16(日) 02:07:20
>>448 さん私には、めんどくさいから、gnuのftpからfileutilのソース持ってきてls.cを読んでみろ
が、わからないんですが・・・
詳しく教えていただけないでしょうか?
>>449 さん 元
>>195 なのかな?
私ではないですが、
>>195 さんを読む限り同じ授業を受けてると思う
内容に感じます。誰だろ??
>>450 ftp.gun.orgの/pub/の下のどっかにfileutil-4.xx.xx.tar.gzと言うファイルがある。
それを持ってきて適切な解凍ツールで解凍するとsrcの中にls.cが有るのでそれを見ろ。
大抵のLinuxで使ってるlsはそれだ。
>>450 下のをそのまま打ってくれ
ftp ftp.gnu.org
anonymous
cd gnu/fileutils
binary
ls
get fileutils-4.1.tar.gz
bye
tar xzf fileutils-4.1.tar.gz
cd fileutils-4.1/src
less ls.c
んー。システムコールを学ばせる講義はいくつか聴いたことがある。
455 :
448 :2005/10/16(日) 02:25:00
そういや確認しないでls.cって書いたけどls.cに本体入ってるよね
>>452 gzip -dc fileutils-4.1.tar.gz | tar xf -
推奨。システム標準のtarがzオプションに対応しているとは限らない。
同様にlessではなくmore推奨。
なにせ環境Linuxではなく「UNIX」だからな。
コンパイラはgccみたいだけれど。
458 :
450 :2005/10/16(日) 02:47:05
453>>さん
なめてんのか?って言われるかも知れませんが、
ttp://directory.fsf.org/all/fileutils.html からtarball拾いましたが
strフォルダのls.cを見ましたが、理解が出来ませんでした。
>>457 さんサンプルありがとうございます。
これを元に何とかしてみようと思います。
お手数おかけしました。
ココの住人の皆さん、もし他にもこんなやりかたあるよ、みたいなソースありましたら、
今後unixを勉強する私に色々なコーディングの行い方の知識を
随時UPしていただけないでしょうか?
このC/C++の宿題を片づけます板を元にどんどんC言語の面白さを
もっともっと感じて行きたいです。
ぜひぜひよろしくお願いします。
>>458 UNIXを勉強するならUNIX板へ。少なくともこのスレでは勉強になることはごく稀(5スレくらいに1回で多い方)にしかない。
460 :
450 :2005/10/16(日) 02:56:47
>>459 さん
了解しました。unix板にも行ってみます。
でもこのC/C++の宿題を片づけます板の方々は、
しっかり回答してくれるし、ここが勉強になると思ってたんです。
これからもよろしくお願いします。
>>460 スレタイ100回読め。
ここはC/C++の宿題を片づけるスレであって、それ以上でもそれ以下でもないの。
宿題以外の話はスレ違いだから、他のスレや板を当たれ。
462 :
デフォルトの名無しさん :2005/10/16(日) 03:03:07
>>461 さん
そうでした・・・
自分の国語力の無さを感じました。
ごめんなさい。
宿題があるときのみ依頼します。
失礼しました。
463 :
デフォルトの名無しさん :2005/10/16(日) 03:59:38 BE:222831656-#
今、プログラミングの勉強をしているのですが、下記のプログラムが実行できません。 何が原因かわからないので原因を教えてください。お願いします。 /*今日の日付を表示する*/ #include<time.h> #include<stdio.h> voidput_date(void) { time_tcurrent; struct tm*local; charwday_name[][3]={"日","月","火","水","木","金","土"}; time(¤t);/*現在の時刻を取得*/ local=localtime(¤t);/*地方時の構造体に変換*/ printf("%4d年%02d月%02日(%s)",local->tm_year+1900/*年*/ ,local->tm_mon+1/*月*/ ,local->tm_mday/*日*/ ,wday_name[local->tm_wday]/*曜日*/ ); } void main() { printf("今日は"); put_date(); printf("です。\n"); }
>>463 空白が消えまくっているのがアレだが、「実行できない」ってのは、
具体的にどういう症状なんだ?
コンパイルはできたんだな?
465 :
463 :2005/10/16(日) 04:06:27 BE:401096096-#
書き忘れていましたが [3]環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:VC++6.0 [3.3] 言語: どちらでも可 [4] 期限:無期限 です。
構造体だけでいーんじゃまいか? * 不要。
× %4d年%02d月%02日(%s) 〇 %4d年%02d月%02d日(%s) だな。それで動くだろ。
468 :
463 :2005/10/16(日) 04:13:31 BE:259970257-#
>>464 空白はTabでやってたのでコピーした時に消えてました(;^ω^)
>>467 できました(;^ω^)ありがとうございます。
何回も見直したのに全く気づかなかったorz
469 :
デフォルトの名無しさん :2005/10/16(日) 14:17:29
[1] 授業単元: プログラミング [2] 問題文: SSDA法を用いてステレオマッチングを行い,左のカメラの画像の全ての点について, 右のカメラで撮った画像のどの点に対応するかを求め,対応する点の組を出力せよ。 また得られた対応する点をもとに左のカメラの画像の各点の3次元位置を,三角測量の 原理により計算するプログラムを作成せよ。得られた3次元空間中の点の集合の様子を 描画するプログラムを作成せよ. [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: borland C++ 5.5 [3.3] 言語: C [4] 期限: [2005年10月24日7:00まで] [5] その他の制限:pgm形式の画像ファイル。 よろしくお願いします。
>>469 うぁぁ、面倒だ。
画像のサイズの上限は?
認識率と拒否率は?
safety distanceは?
471 :
デフォルトの名無しさん :2005/10/16(日) 14:55:52
>>470 返信ありがとうございます。
画像サイズの上限は1280×960です。
認識率,拒否率,safety distancとはなんのことなのでしょうか?
よろしければ教えていただけないでしょうか?
よろしくお願いします。
472 :
デフォルトの名無しさん :2005/10/16(日) 15:23:00
lsに刺激されてWindows版作ってる。まだトラバースしかできんが。 車輪の再開発だろうけど、まあ、ぼちぼちと。
474 :
名無し :2005/10/16(日) 17:36:50
>>474 確認だけど,配列を使った LinkedList ってのは (data, next) のペアの配列で
next が次の配列の中のインデックスを保持する,ってやつでいいの?
マルチで5日間何をしてたんだ
477 :
名無し :2005/10/16(日) 20:41:20
>>475 実行結果が課題どうりであれば、配列を使っても構造体をつかってもいいと言っていました。
479 :
名無し :2005/10/16(日) 21:03:22
>>478 ありがとうございます。
明日 早めに学校へ行って実行してみます。
本当に助かりました。
481 :
デフォルトの名無しさん :2005/10/17(月) 03:12:41
すでに既出かもしれないんですが教えてください!
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク): ピボット選択付きガウス消去法のプログラムを作り
Ax=bのxを求めなさい。
また、出てきたxの値をつかいb−Axの値をだすプログラムも追加し、
そのプログラムの計算がどれだけ正確かをレポートしなさい。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC 6.0(推奨)何でもいい。
[3.3] 言語: C++
[4] 期限: [2005年10月19日12:00pmまで]
今、ガウス消去法(ピボット選択付き)のプログラムを作ってます。
大方、出来ていると思うんですが、
テストしたい値が分数になるとエラーが出てしまいます。
また出てきた値xと入力した値A,bの数値の差b−Axを
付け加えたいんですが、どうしてもしたらいいですか?
以下のサイトを主に参考にしてます↓
http://www.fuka.info.waseda.ac.jp/~kozo/suuchi/simple_equation/simple_equation_2.html
>>481 まずは原型プログラムをうpしなさい。行列の入力方法とか、どの範囲で
(質問文を見ると分数処理もする必要あるの?)やらなきゃいけないかも分からん。
>どうしてもしたらいいですか?
あと、日本語の勉強もしなさい。
483 :
481 :2005/10/17(月) 03:30:01
とりあえず、いままで作った分とか授業で使ったプログラムとかUP。
485 :
481 :2005/10/17(月) 03:43:57
486 :
481 :2005/10/17(月) 03:51:48
<<482 たびたびすみません。 分数処理が必要です。
A[][]は破壊されるので、B[][]でも作ってコピーを取っておく。 解はs[]に入っているがローカル変数なので、他からアクセスできない→外にだす。 b-Axの1行目だけ式でかくと b_1 - A_11 * x_1 + A_12 * x_2 + ... + A_1N * X_N という式。 i行だと b_i - A_i1 * x_1 + A_i2 * x_2 + ... + A_iN * x_n という式。 上の式のb_iはプログラム上ではB[i][N+1],同様に、A_ijはB[i][j]、x_jはs[j]な。 まあ、そんなんでがんばれ。
488 :
481 :2005/10/17(月) 04:13:56
<<487 ありがとうございます。 何度か作ってみたんですがどうしても無限ループになってしまうので 困ってました! とりあえず、なんとか頑張ってみます
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
>>194 の続きで
交換が行われたかどうかを判定する変数exchangeを使った
やり方のバブルソートのプログラムを完成せよ
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2005年10月19日
[5] その他の制限: 無し
よろしくおねがいします
>>489 #include <stdio.h>
void print(int * data, int length) {
int i;
for (i = 0; i < length; i++) { printf(" %d", data[i]); }
puts("");
}
void bubble_sort(int * data, int length) {
int exchange;
do {
int i;
exchange = 0;
for (i = 0; i < length - 1; i++) {
if (data[i] > data[i+1]) {
int temp = data[i];
data[i] = data[i+1];
data[i+1] = temp;
exchange = 1;
}
}
// print(data, length); ソート範囲を表示
length--;
} while (exchange);
}
int main(void)
{
int arr[] = { 80, 40, 30, 90, 50, 20, 10, 60 }, length = sizeof(arr)/sizeof(arr[0]);
printf("before :"), print(arr, length);
bubble_sort(arr, length);
printf("after :"), print(arr, length);
return 0;
}
491 :
デフォルトの名無しさん :2005/10/17(月) 13:40:11
[1] 授業単元:システム工学特別講義 [2] レポート課題: (1)ユークリッド平面上に配置された都市を入力とする巡回セールスマン問題に対する以 下の近似解法のプログラムを作成せよ. (1-1)Nearest Neighbor法 (1-2)Nearest Addition法(最近追加法) (1-3)Nearest Neighbor法を適用して得られる巡回路を初期解とする2-opt法 (1-4)Nearest Addition法を適用して得られる巡回路を初期解とする2-opt法 (2)(1)で作成したプログラムおよびランダムな巡回路を初期解とする2-opt法(サンプルプ ログラム)を用意した全ての例題に対して実行し,得られた巡回路の長さおよび実行時間 を比較せよ. [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2005年10月20日 [5] ・サンプルプログラムを自由に改変してプログラムを作成して構わない. うわ〜!破滅だ〜!神様!仏様!プログラム板様〜!! 大変忙しい中すみません!なにとぞ よろしくおながいします!
あほう。サンプルプログラムをうp。
493 :
デフォルトの名無しさん :2005/10/17(月) 13:50:27
はい! /* ランダムな巡回路を生成するプログラム */ #include <stdlib.h> #include <stdio.h> #include <math.h> #include <time.h> #define MAX_CITY_NUM 3000 /* 最大都市数 */ struct point{ /* 都市の座標を格納する構造体 */ double x; double y; }; struct point city[MAX_CITY_NUM]; /* 外部変数: 都市の座標を格納する配列 */ int city_num; /* 外部変数: 都市数 */ int tour[MAX_CITY_NUM]; /* 外部変数: 都市の巡回順を格納する配列 */ /* 関数の宣言 */ double distance(int i, int j); /* 都市(i,j)間のユークリッド距離 */ void random_tour(); /* ランダムな巡回路の生成 */ /* メインプログラム */ int main(int argc, char *argv[]){ FILE *input_file, *output_file; double length; int i; double start_time, search_time;
494 :
491 :2005/10/17(月) 14:09:07
ここにいるナイスな野郎さん達 助けてくださいまし うぅ 続き/* 引数のチェック */ if(argc <= 1){ fprintf(stderr,"Please input the name of data file!\n"); exit(1); } /* 入力データの読み込み */ input_file = fopen(argv[1], "r"); fscanf(input_file,"%d", &city_num); for(i = 0; i < city_num; i++){ fscanf(input_file,"%lf %lf",&(city[i].x),&(city[i].y)); } fclose(input_file); /* 入力データの表示 */ printf("city_num= %d\n",city_num); for(i = 0; i < city_num; i++){ printf("%4d\t%f\t%f\n",i,city[i].x,city[i].y); }
以下の場合には,評価を不可とする. ・レポート提出期限内にレポートを提出しない ・提出されたレポートが上記の(1)(2)を満たさない ・作成したプログラムが完成していない ・プログラムもしくはレポートが他人のコピーである ・レポートの内容が基準を満たしていない 梅谷センセにここのURLメールすればいいのか。ふむ。
496 :
491 :2005/10/17(月) 15:02:34
ぐあぁぁ 見られた〜(爆死)&終了
ネタなのかわからんが茶吹いた
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 半球電鉄の運賃は距離によって決まる(距離と運賃は整数) 距離 運賃 0km以上3km未満 120円 3 5 150 5 8 190 8 13 240 13 19 310 19 30 450 30 50 560 50km以上 670 距離を画面から入力し運賃を求めるプログラムを作成せよ。 また2次配列、while、EOF、foe、を使いなさい。 また結果は4件以上出しなさい。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [2005年10月18日まで] [5] その他の制限:2次配列まで習っています 何ぶん未熟なもので、どなたか宜しくお願いします。
>>499 2次配列は2次元配列の書き間違いだよね?
#include <stdio.h>
#include <stdlib.h>
#define foe for
#undef EOF
#define EOF if
int main(void)
{
int table[][2] = {{3,120},{5,150},{8,190},{13,240},{19,310},{30,450},{50,560},{0,670}};
int i, distance, table_idx;
foe (i = 0;;) {
EOF (scanf("%d", &distance) != 1 || distance < 0) {
EOF (i < 4) {
scanf("%*[^\n]");
continue;
}
break;
}
foe (table_idx = 0; table[table_idx][0]; table_idx++)
EOF (distance < table[table_idx][0])
break;
printf("\\%d\n", table[table_idx][1]);
i++;
}
return 0;
}
501 :
デフォルトの名無しさん :2005/10/17(月) 16:58:17
C言語の宿題で下のプログラムの実行結果を説明しなさい。なんですがポインタ変数を なにしてるのかがわからないです><教えて下さい>< #include <stdio.h> #include <stdlib.h> int main(void) { printf("size of char = %d\n", sizeof(char)); printf("size of short int = %d\n", sizeof(short int)); printf("size of int = %d\n", sizeof(int)); printf("size of long int = %d\n\n", sizeof(long int)); printf("size of float = %d\n", sizeof(float)); printf("size of double = %d\n", sizeof(double)); printf("size of long double = %d\n\n", sizeof(long double)); printf("size of char* = %d\n", sizeof(char*)); printf("size of short int* = %d\n", sizeof(short int*)); printf("size of int* = %d\n", sizeof(int*)); printf("size of long int* = %d\n\n", sizeof(long int*)); printf("size of float* = %d\n", sizeof(float*)); printf("size of double* = %d\n", sizeof(double*)); printf("size of long double* = %d\n", sizeof(long double*)); exit(0); } -------------------------------
502 :
500 :2005/10/17(月) 17:06:19
あ、while使ってないや。 どこかに適当に while(0); って入れといて。
>>501 ポインタ変数なんかどこにもありませんがそれはそうと
>>1 ぐらい読んでスレ違いに気づこうね
>>501 マルチされるのも面倒なのでここで答えとく。
sizeof()の意味はわかってるよな?
あと、データ型の勉強もしてるよな?
そのプログラムでは、指定したデータ型のサイズ(バイト単位)を表示してる。
お前がポインタ変数だと思ってるのは、ポインタのデータ型だ。
ポインタのデータ型は、参照する型の種類に関わらず全部同じサイズになる。
だったらあとはプログラム実行して確かめろ。
>>499 > 距離を画面から入力し
どうしてもタッチパネルを思い浮かべてしまう。
507 :
デフォルトの名無しさん :2005/10/17(月) 18:38:18
[1] 単元:情報演習 [2] 環境 [2.1] OS: Linux [2.2] コンパイラバージョン: gcc [2.3] 言語: C [3] 期限: 木曜14時 [4] 問題:人数を入力後、その人数分の名前を入力し、それら名前を入力順序と逆順にして出力するプログラムを作成し、実行しなさい。 その際、人数を入力後、人数に応じたメモリ領域を確保してから、名前を入力すること。 また、最後にメモリ領域の開放もすること。 また、メモリ領域の確保は、標準関数であるmallocを使うこと。 以上ですよろしくお願いいたします
508 :
499 :2005/10/17(月) 19:11:06
>>500 早々のレスありがとうございます。
、、、、、、、、、、、、、、、、
大変申し訳ないのですが、foe じゃなくえ for でした。
すみませんが499のものを
2次元配列、while、EOF、for、を使ってお願いします。
>>507 名前は256文字より短いと仮定.
#include <stdio.h>
#include <stdlib.h>
typedef char string[256];
int main() {
int i, n;
string *namelist;
scanf("%d", &n);
namelist = (string*)malloc(sizeof(string) * n);
for (i = 0; i < n; ++i)
scanf("%s", namelist[i]);
for (i = n - 1; i >= 0; --i)
printf("%s\n", namelist[i]);
for (i = 0; i < n; ++i)
free(namelist[i]);
}
510 :
509 :2005/10/17(月) 20:40:04
ごめん最後編集途中だった × for (i = 0; i < n; ++i) free(namelist[i]); ○ free(namelist);
皆さん、宿題をやってもらうんだから、sage進行でいきましょうよ。 ちょっと考えたら分かる事。
>>511 これは要するに自前で浮動小数点型を作れってことだよね?
はい、そうです。 入力した数値に対して、浮動小数点での表記に書き換えるものです。
>>499 問題文とか条件を省略してないか?
その問題だとEOF使う所がないんだが...
>また結果は4件以上出しなさい。
も意味不明。ある距離に対して複数(4件以上)の運賃があるのか?
>>516 多分こういうことじゃないか?
int main(int argc, char **argv)
{
int table[][2] = {{3,120},{5,150},{8,190},{13,240},{19,310},{30,450},{50,560},{0,670}};
int i=0, distance, table_idx;
while (i<4) {
if(scanf("%d", &distance) == EOF || distance < 0) {
printf("やりなおし。4件以上入力しる\n");
scanf("%*[^\n]");
continue;
}
for(table_idx = 0; table[table_idx][0]; table_idx++)
if(distance < table[table_idx][0])
break;
printf("\\%d\n", table[table_idx][1]);
i++;
}
return 0;
}
518 :
517 :2005/10/18(火) 13:41:29
4回までしか入力できなかった。おれも落第だな。 int main(int argc, char **argv) { int table[][2] = {{3,120},{5,150},{8,190},{13,240},{19,310},{30,450},{50,560},{0,670}}; int i=0, distance, table_idx; while (1) { if(scanf("%d", &distance) == EOF || distance < 0) { if(i<4) { printf("やりなおし。4件以上入力しる\n"); scanf("%*[^\n]"); continue; } break; } for(table_idx = 0; table[table_idx][0]; table_idx++) if(distance < table[table_idx][0]) break; printf("\\%d\n", table[table_idx][1]); i++; } return 0; }
519 :
デフォルトの名無しさん :2005/10/18(火) 17:19:00
はっきりいってこれじゃあ動かないんです。エラーが出てしまうんですけど どこが違うんですかね? #include <stdio.h> #include <stdlib.h> #include <string.h> // strcpy() のため #define BUFFER_SIZE 100 #define TABLE_SIZE 10 int main(void) { int i, j; char *buffer[BUFFER_SIZE]; char *table[TABLE_SIZE]; for (i = 0; i < TABLE_SIZE; i++) { if (fgets(buffer, BUFFER_SIZE, stdin) == EOF) { break;} table[i] = (char *)malloc(TABLE_SIZE*sizeof(char)); strcpy(*buffer, table[i]); } for (j = 0; j < i; j++) { printf("table[%d]: %s", j, *buffer); } exit(0); }
520 :
デフォルトの名無しさん :2005/10/18(火) 17:21:21
標準入力 (キーボード) から入力された文字列を1行分読み込んで配列 buffer[] に一時的に保存し,その文字列をポインタ配列の各 table[i] (0≦i<TABLE_SIZE) が指すメモリ領域にコピーすることを繰り返す. 途中,EOF (End Of File) が入力されるか,i = TABLE_SIZE - 1 になったら,入力を終了し,ポインタ配列の各 table[i] (0≦i<TABLE_SIZE) が指す文字列を順に出力するプログラム はっきりいってこれじゃあ動かないんです。エラーが出てしまうんですけど どこが違うんですかね?
なんとなく strcpy(*buffer, table[i]); が逆な気がする。
522 :
デフォルトの名無しさん :2005/10/18(火) 17:22:42
519と520は同一人物です。パソコン慣れしてなくて間違えてしまいました。
>>519 char *buffer[BUFFER_SIZE];
↓
char buffer[BUFFER_SIZE];
strcpy(*buffer, table[i]);
↓
strcpy(table[i], buffer);
printf("table[%d]: %s", j, *buffer);
↓
printf("table[%d]: %s", j, table[j]);
あと一応freeもしとけ
524 :
デフォルトの名無しさん :2005/10/18(火) 17:30:42
早い返事ありがとうございます。さらになんですが、 if (fgets(buffer, BUFFER_SIZE, stdin) == EOF) { break;} の文に下のようなエラーが出てしまうんです。。。 2kadai04b.c:15: warning: comparison between pointer and integer
>>524 fgetsは失敗するとEOFではなく空ポインタを返すから、
== NULL
にしないと
>>519 fgets()の戻り値はEOFにはならない。
sizeof(char)は常に1だから書く必要がない。
exit()は使う必要がない。returnで充分。
EOFの入力って0x1Aかどうかを比較するの?
EOFと0x1aの間には最早何の関連もありません。
へ?そうなの?
530 :
499 :2005/10/18(火) 18:05:57
>>516 問題はそっくりそのままです。
4件以上ってのは、ちゃんと作れているか、たしかめるために、
1, 6, 25, 50 などの数字を入力し、出てきた結果を
プログラムの後ろに貼り付けて提出しなさいとうことなので
そのためのものです。
>>517 どうもありがとうございます。助かりました。
>>529 EOFやNULLといったマクロ定数の実際の数値は処理系依存
俺はC入門書とK&Rしか読んでないがどっちかに書いてあったぞ
>>531 あぁ。そういう意味ですか。了解しました。
>>531 そういう問題じゃないから。
>>527 0x1aのコードを持つ制御文字をファイル終端と見なすのはCP/Mだけ。
初期のMS-DOSでは互換性のためにファイル終端と見なすこともあったが、
今では単なる制御文字と見なすのが普通。
標準入力を閉じるのに^zを使うのはその名残だが、0x1aの文字が入力されるわけではない。
534 :
デフォルトの名無しさん :2005/10/18(火) 19:04:31
懸賞プログラムをつくりたいです。 [前提条件] ・ユニークなIDが100個あります ・当選確率は30% [期待する動作] ・任意のIDを入力すると、当選確率に応じて「当たり」か「外れ」か表示される [自分で考えたこと] IDを種とした 0-99 までの乱数を算出して、それが33以下だったら当たり、とか・・・ この程度しか思いつきませんでした。 えらい人教えてください。よろしくお願いします。
あ、すみません。 [前提条件]のところを以下のように訂正させてください ×・ユニークなIDが100個あります ○・ユニークなIDがたくさんあります
>>531 NULLのソースコード上の値は(型は定められていないが)0と決まっている。
>>534 ぜんぜん条件が足りない.というかそもそも何がしたいの?懸賞プログラムって何?
とりあえず,同じ ID に対して常に同じ結果が出る必要があるかとか,
入力された全 ID の中の 30% が必ず当選する必要があるかとかは規定してくれんと.
VC++ で #define AX 50000 とやってから int i = AX; とやるとAXレジスタの値が入ってしまうんですが、 何とかすることできないでしょうか?
[1] 授業単元:プログラミング言語 [2] 問題文:@ 1からnまでの自然数の総和は、最初のn-1個の数を加算し、その合計を最後の数nを加えることによっても計算できる。 この方法を使って、1からnまでの総和を計算するアルゴリズムを再帰的に設計し、そのプログラムを書け。 A フィボナッチ数と呼ばれる数列の第n項は、第n-1項と第n-2を足して得られる。 したがって、第1項、第2項とも1の場合のフィボナッチ数は、1,1,2,3,5,8,13,21,34,・・・となる。 このとき、数Nをコマンドライン上から読み込み、第N項までのフィボナッチ数列を出力する再帰アルゴリズムと、そのプログラムを書け。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: 不明 [3.3] 言語: C [4] 期限: [2005年10月28日15:00まで] 以上です。
//\
>>540 適当
#include <stdio.h>
int sum(int n){
return (n > 1) ? sum(n - 1) + n : 1;
}
int main(){
int n;
printf("n?>");
scanf("%d", &n);
printf("sum(1:%d) = %d\n", n, sum(n));
return 0;
}
#include <stdio.h>
int fibonacci(int n){
//printf("%d ", n);
return (n > 2) ? fibonacci(n - 1) + fibonacci(n - 2) : 1;
}
int main(){
int i, n;
printf("n?>");
scanf("%d", &n);
for(i = 1; i <= n; i++){
printf("%d ", fibonacci(i));
}
printf("\n");
return 0;
}
>>539 BX レジスタの値とか、一通りレジスタの値の取得法をまとめれば
雑誌の記事とかになるんじゃないかな?
まああんまりお金になりそうにはないけど。
544 :
デフォルトの名無しさん :2005/10/19(水) 00:00:21
>410〜415 お返事遅くなってすみません。 ありがとうございました、助かりました!
545 :
539 :2005/10/19(水) 00:30:58
>>543 本来であればdefineされた値になっていてほしいのに、
レジスタと同じ名前の識別子が
レジスタの値が入る変数のように振舞うので困っているのです。
コンパイルオプションとかで設定できるのでしょうか?
548 :
デフォルトの名無しさん :2005/10/19(水) 02:04:29
C++で作ったPGMですが、 \\netdrv\test\work\sample.txt をReadさせようとすると、何故か作業フォルダ配下の \netdrv\test\work\sample.txt をReadしようとしてしまうんですが・・・ これは何故??
エスケープシーケンスじゃねの?
>それと@のソート結果が正しいかどうかチェックするプログラム [昇順チェック] for(先頭から今見ている香具師が、一つ前より大の間繰り返し) ; 最後まで逝ってれば正しい 降順の場合は一つ前より小か、で
551 :
デフォルトの名無しさん :2005/10/19(水) 02:51:14
[1] 授業単元: プログラミング言語 [2] 問題文: XYZの三次元座標上でランダムに座標(0,0,0)からの距離が平均値1となる座標 を決定するプログラムを作成せよ。ただしX方向とYZ方向で2:1の楕円状の確率依存性を持つも のとする。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: [3.3] 言語: C 不明 [4] 期限: [2005年10月24日まで] [5] その他の制限:乱数の生成には逆関数を使うらしい お願いします
>>547 >>132 や
>>139 からもらったものはとうしたの?
「まるっきり分りません」とか「よくわからない」とか言われても
聞いてる方はもっと分らない。
日本語も分らない奴として放置させてもらいますが、よろしいか?
正直、忘れてました
555 :
491 :2005/10/19(水) 10:33:26
>>491 です。
>>495 さんがイナイ間にヒントだけでも〜 ってかヒントならOKそうなので
最初にどこから手をつければよいのやら…
[1] 授業単元:プログラミングU [2] 問題文: C言語でガウスの消去法で連立一次方程式を解くプログラム(LU分解・コレスキー分解なし) を作成せよ。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ(バージョン):gcc [3.3] 言語:C [4] 期限:10/20まで [5] その他の制限:特に無し どなたかご教授お願いします。
558 :
491 :2005/10/19(水) 11:19:32
ああっ すいません見落としてました! メシアよ!これです これこれ 超これなんです!
チョーコレ イト?
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 二問あります @二つの整数を受け取って和をとる関数を定義し、main関数から 二つの整数データを渡し、結果を返してもらいmainで印刷するプログラムを書け。 A二つの整数の値をいれかえる関数swapを定義し、main関数から 二つの整数データを渡し、main関数のデータを入れ替えて印刷するプログラムを書け。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2005年10月21日 [5] その他の制限: プロっぽいソースプログラムじゃない物でお願いします。
562 :
556 :2005/10/19(水) 13:25:43
>560 すげー、ありがとうございます。 自分でも色々探してみたんですが、 これほどわかりやすいプログラムは見つかりませんでした。
>>561 素人っぽさが足りなければ自分で変更して
@
#include <stdio.h>
int sum( int a, int b ){ return a+b; }
int main( int ac, char **av ){ printf( "%d", sum( 1, 2 ) ); return 0; }
A
#include <stdio.h>
void swap( int *a, int *b ){ int work; work = *a; *a = *b; *b = work; }
int main( int ac, char **av ){ int a = 3; int b=4; swap( &a, &b ); printf( "%d %d", a, b ); return 0; }
>>563 この三行だけでいいんですか?
なんか結果が表示されないんです
>>564 お前今までの授業でどうやって結果見てたんだよ
頭の中で思い浮かべてました
>>565 コンパイルして./a.outでやったけど見れなかったです
>>566 じゃあ今回もそれでいいじゃん(*^ー゚)b
569 :
568 :2005/10/19(水) 14:06:21
しまったやってしまった
>>567 a.out.exeなんてファイル名、ふつうつけるか?
>>570 a.outはファイル名じゃなくて実行のコマンドです
いつもはできるのにやっぱりできませんでした
a.outはlinux+gccの時のデフォだろ
573 :
568 :2005/10/19(水) 14:52:54
>>571 例えUNIXであろうとa.outはgccでコンパイルした結果出来上がるファイル名だ
>>570 のは,今回の課題はWindowsでは実行ファイルは拡張子exeを付ける事になってることを踏まえての発言(だろう)
君にはプログラミング以前の基本的知識が欠如してる気がする
名前消し忘れた なんかもうボロボロ
あああ、OS間違えましたUNIXです
もしかしてOSが違うと
>>563 のプログラムが実行できないんですか
576 :
573 :2005/10/19(水) 15:03:25
しかも途中で修正したから日本語もおかしくなってfだふぁががhgdq
NameFileの中身はソート済みのようだから、普通に二分木を作るとバランスされないような気がするのだが。
>>575 563が動かなかったら、それはプログラムの問題ではないので、おまえの近くの人に聞くことをお勧め。
>>577 ヒープソートでもやりたいのか?
ってかstrcasesmpって何よ?当然manでも何も出てこないし、ググってもそれらしいの無いが
strcasecmp()だろ、それぐらい察してやれ まあ非標準関数だがな
大久保界隈の電子専門学校の生徒がうじゃうじゃいそうなスレだね。。。 心当たる人は手を挙げて。
585 :
577 :2005/10/19(水) 17:57:03
スミマセンm(__;)m strcasecmpの間違いです
>>578 ファイルの中はあいうえお順なので、それをアルファベッド順に表示したいのです
03TI001 阿部 恒彦 j0301at Abe Tsunehiko
03TI002 荒牧 孝洋 j0302at Aramaki Takahiro
03TI011 江田 慎太郎 j0311es Eda Shintarou
という風に
高田馬場も大久保界隈に入るのかな?もしそうならノシ
587 :
デフォルトの名無しさん :2005/10/19(水) 18:04:16
しりとりゲームを作りたいです。 ルールは普通のしりとりと同じ。同じワードは使えない、最後に"ん"がついたらいけない 英単語は不可等。 まず最初は自分が入力をし、その後コンピュータ側が持っている テキスト(辞書ファイル)の中からユーザーが入力した言葉に続く文字を見つけて出力、 その後またユーザーの入力→コンピュータ側がファイルを読み込んで出力の繰り返し。 ユーザーが入力した単語の中でファイルの中に無い単語の場合、学習(ファイルに登録)させる。 仮にファイルの中身が1Mあったとして、1M全て読み切ったらユーザーの勝ち。 勿論学習機能があるのでファイルの容量はいつまでも増え続ける。 がんばってくださーい
>>587 その仕様じゃ、ユーザーはありもしない単語延々と並べるだけで絶対負けないじゃないか。
っていうかスレ違い。
つーか、トリビアのネタだし。
>>590 タモリが出てるトリビアの泉ってTV番組、知らない?
587の内容がトリビアとどう関係があるんだ?ってことだろ
595 :
デフォルトの名無しさん :2005/10/19(水) 18:31:12
しりとりを解くのは実は高度な数学でしたって話
596 :
デフォルトの名無しさん :2005/10/19(水) 18:35:11
コマンドラインから与えられた引数を文字列と見て,各引数の出現する順番はそのままで,文字の並びを左右逆にして 表示するプログラムを作りたいんですけど、2次元配列を使ってはいけないんです。strlen関数を使ったら どうなりますか?説明つきで教えて下さい。m(_ _)m
597 :
587 :2005/10/19(水) 18:44:33
C言語でこういう宿題が出たけどいいアルゴリズム(COM)が思い浮かばないから ヤッテクレと言った 宿題スレで聞いてはいけないならどのスレなんだ?
598 :
デフォルトの名無しさん :2005/10/19(水) 18:49:12
>>597 そんな問題設定じゃアルゴリズムなんてねーだろ.どうせプレイヤー側が 588 の手順で 100% 勝つ.
600 :
587 :2005/10/19(水) 18:57:14
588の仕様でいいんでつ
ひらがな限定なら同音異語でもアウトだな。
603 :
デフォルトの名無しさん :2005/10/19(水) 19:04:12
コマンドラインから与えられた引数を文字列と見て,各引数の出現する順番はそのままで,文字の並びを左右逆にして 表示するプログラムを作りたいんですけど、2次元配列を使ってはいけないんです。strlen関数を使ったら どうなりますか?説明つきで教えて下さい。m(_ _)mお願いします。
断る。
>>596 コマンドライン引数が char の二次元配列に入る以上原理的に不可能のような
606 :
デフォルトの名無しさん :2005/10/19(水) 19:05:33
コマンドラインから与えられた引数を文字列と見て,各引数の出現する順番はそのままで,文字の並びを左右逆にして 表示するプログラムを作りたいんですけど、2次元配列を使ってはいけないんです。strlen関数を使ったら どうなりますか?説明つきで教えて下さい。m(_ _)mお願いします。 ちなみにこれが実行例です。 % ./kadai04c ← コマンドライン引数が 0 個の時の例 % % ./kadai04c abc ← コマンドライン引数が 1 個の時の例 cba % ./kadai04c abc 12345 QWERTY ← コマンドライン引数が 3 個の時の例 cba 54321 YTREWQ %
今日は馬鹿が集まる日なのか?
>>606 int main(int argc, char* argv[]){
この時点で ↑で二次元配列を使ってるんだけど(w
>>606 そこだけ二次元配列使うのを許すならこんなもんか。
#include <stdio.h>
void moin(char *p) { if (*p != '\0') moin(p+1), putchar(*p); }
int main(int argc, char **argv) { if (argc > 0) main(argc-1, argv), moin(argv[argc-1]), putchar('\n'); }
[1]授業単元:オブジェクト指向言語 [2]問題文:3人のテストの点数、合計値、平均点を2次元配列を利用して表示するプログラムを作成しなさい。 実行結果 A : 70 80 75 60 : sum = 285, ave = 71.25 B : 75 83 70 70 : sum = 298, ave = 74.50 C : 60 76 70 55 : sum = 261, ave = 62.25 [3]環境 [3.1]OS:Linux [3.2]コンパイラ名とバージョン: [3.3]言語:C言語 [4]期限:10月20日午前9時まで [5]その他の制限:なし 先月からC言語を学び始めたのですがいきずまってしまい、何卒よろしくおねがいします。
オブジェクト指向言語の授業なのにCなのか
612 :
デフォルトの名無しさん :2005/10/19(水) 20:45:43
>>611 Cでオブジェクト指向しなきゃいけないんじゃない?
よしObjective-Cの出番だ
614 :
デフォルトの名無しさん :2005/10/19(水) 21:01:11
C言語って、テキストファイル1行づつ読み込んで 全く同じようなかんじでテキストファイルってつくれたっけ? ファイルのコピーじゃなくて。。 何がやりたいかって言うと、 テキストファイルの上15行が文字列で 16行目がブランク 17行目から300万行くらいが数字配列(300万行、3列) なんだけど、ほしいのはその300万行の数列、 1〜16行を排除したい。 ただ、データが膨大で普通のエディタでは開けなくて、 そこだけ手動で消すことができない。 そこで、プログラムでなんとかしようかと思ってるのだけど。 ちなみにもとはCSVファイルだったんだけど、 テキストならと思ってコピペでテキストファイルSCV 両方用意しとります。 もし、できるなら100行づつの3つのファイルになってもかまいません。 よろしくお願いします。
>>610 Cで書いてみたけど手続き指向になってしまった。
誰かオブジェクト指向版を頼む。
#include<stdio.h>
int main(void){
int score[][4]={ {70,80,75,60,},{75,83,70,70,},{60,76,70,55,}, };
char name[][2] = { "A","B","C", };
int i,j,sum;
double ave;
for(i=0;i<3;++i){
printf("%s :",name[i]);
for(j=0,sum=0;j<4;sum+=score[i][j],++j) printf(" %d",score[i][j]);
ave = sum / 4.0;
printf(" : sum = %d, ave = %2.2f\n",sum,ave);
}
return 0;
}
>>614 getline で1行読めるので
for (int i = 0; i < 16; ++i) { 1行読み込む; }
for (int i = 16; i < 300万; ++i) { 1行読み込む; 読んだ行を出力; }
これでわからんようなら
>>1 参照
>>615 この問題、点数を二次元配列でもったら、オブジェクト指向のしようがない気がする。
OOPとしてするなら得点を属性として持ち、合計・平均を派生属性として持つ 人クラスを作って、そのインスタンスの要素数3の配列作るのが妥当か・・・?
んー、まずはオブジェクト指向を考えないプログラムを作成させて
その後そのコードをオブジェクト指向に書き換えさせるって方針なんじゃない?
だから多分後で
>>615 のプログラムをオブジェクト指向を用いて作成せよってのをやると思うよ。
まあ勝手な憶測でしかないんだけど。
うちの学校はオブジェクト指向の授業が無いから羨ましい。
>>620 それ恐ろしく効率悪いというか意味無いだろ
あくまでOOPは分析・設計レベルから実装までの一貫した流れな訳で
一旦手続き指向で実装した物をオブジェクト指向で実装し直すとか意味ナサス
つ憂鬱なプログラマのためのオブジェクト指向
とくにあんな単純なデータ処理をわざわざ OO 的に書きなおさせたら,OO 面倒としか思えなくなりそうだ.
オブジェクト指向ってのがよくわからないが適当にやってみた #include <stdio.h> struct Student { char name[2]; int score[4]; }; int Sum(struct Student s) { return s.score[0] + s.score[1] + s.score[2] + s.score[3]; } double Ave(struct Student s) { return Sum(s) / 4.0; } void main() { struct Student s[3] = {{"A", 70, 80, 75, 60}, {"B", 75, 83, 70, 70}, {"C", 60, 76, 70, 55}}; char* format = "%s : %d %d %d %d : sum = %d, ave = %.2f\n"; char dimArray[3][128]; // 二次元配列! int i; for (i = 0; i < 3; i++) { sprintf(dimArray[i], format, s.name, s.score[0], s.score[1], s.score[2], s.score[3], Sum(s), Ave(s)); } for (i = 0; i < 3; i++) { printf("%s", dimArray[i]); } }
>>623 題意を満たすために二次元配列を強引に入れてるのにワロタw
>>491 見てる? 面白そうな問題だから、やってみたい。
問題文とか解説ってWeb上にあるなら、URL晒してくれ。
628 :
デフォルトの名無しさん :2005/10/20(木) 02:22:16
[1] 授業単元: 卒研 [2] 問題文:0〜1の擬似乱数を30000個ずつ3行発生させ、その平均と分散を求めるプログラムを作成せよ。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: Fujitsu Fortran&C Academic Package V2.1 [3.3] 言語: C言語 [4] 期限:2005年10月25日 [5] その他の制限:なし 別スレからの誘導で来ました。マルチと呼ばないでください…orz
629 :
628 :2005/10/20(木) 02:22:55
一応、「1〜100の擬似乱数を10個ずつ10行発生」というプログラムは作れたので、それを書き換えたらできるかな?と思ったんですが、 どうもうまくいかなくて、どこをどう書き換えたらいいのかわかりません…。 それとも、書き換えるのでは駄目なんでしょうか?? これがそのプログラムです… #include <stdlib.h> #include <stdio.h> #include <time.h> int main(void) { int i,j; /* 乱数系列の変更 */ srand((unsigned) time(NULL)); /* 1〜100の擬似乱数を10個ずつ10行発生 */ for (i=1; i<=10; i++) { for (j=0; j<10; j++) { printf("%3d ",rand()%100+1); } printf("\n"); } return 0; } すみませんが、卒業かかってるので本当によろしくお願いします…。
おーい0〜1って、 (0,1) [0,1] (0,1] [0,1) のどれだ?
631 :
デフォルトの名無しさん :2005/10/20(木) 02:45:06
だれかホントお願いします。アセンブラ?らしいんですけど・・・ [8050h] ← [8051h] + [8052h] を計算し、符号付2進数加算としてのオーバーフローを判定する。 (オーバーフローのとき Cy ← 1、オーバーフローでないとき Cy ← 0 とする) オーバーフローの判定方法を付け加えること。
>>631 できればスレタイを65535回ほど読んで欲しいかなー
633 :
628 :2005/10/20(木) 03:35:25
>>630 様 すいません、
(0,1)
[0,1]
(0,1]
[0,1)
の違いがわかりません…。発生させたいのは、0.ナニナニの小数です…
630じゃないけどさ、 上から順に 0.0 < x < 1.0 0.0 ≦ x ≦ 1.0 0.0 < x ≦ 1.0 0.0 ≦ x < 1.0 ようするに境界を含むかどうか ところでそれが卒研なのか?
635 :
628 :2005/10/20(木) 03:57:18
>>634 様 ありがとうございます!!えーと、(0,1)です!!
…はい、コレを卒研で使うんですけど、もう全然ムリポで…。
私、建設学科なのに…orz
>>635 printf("%f ", (1.0 / (RAND_MAX + 1.0)) * (rand() + 0.5));
『C言語による最新アルゴリズム辞典』の乱数の項を参考にした。
この方法は0や1にならない。
argcとargv[]の使い方を教えてください! いろんなサイト見てみたけどわけわかめです。 サイトに載ってたのには実行画面にC:\があるんですが、 実行してもこれが出ません。どうすれば出るんでしょうか? ちなみにコマンドプロンプト起動したらC:\Documents and Settings\名前> が出てこっちでもできません。 環境:OS:XP、コンパイラ:VCです。 期限:出来れば8:40までに・・・
638 :
637 :2005/10/20(木) 07:25:18 BE:401096669-#
訂正:コンパイラ:VC++6.0です
639 :
628 :2005/10/20(木) 07:29:03
>>636 様 ありがとうございます!!遅くにありがとうございましたm(_ _)m゛
とりあえず学校行ってきます!!
C:\Documents and Settings\名前>C:
641 :
637 :2005/10/20(木) 07:40:01 BE:415951878-#
>>640 すいません、くわしく教えてもらえないでしょうか(;^ω^)
コマンドプロンプト使ったことないもんで・・・
643 :
637 :2005/10/20(木) 07:57:28 BE:200547893-#
何とかC:\>に直す方法は見つかりました でも結局コマンドラインから入力できないorz ちょっとコードのミスを探してきます。
>>628 脳内コンパイルで妥当かどうかもチェックしてません。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(void)
{
int i,j;
double v,sum,/*合計*/var,/*分散*/ave;/*平均*/
/* 乱数系列の変更 */
srand((unsigned) time(NULL));
/* 0〜1の擬似乱数を30000個ずつ3行発生 */
for (i=0; i<3; i++) {
for (j=0,sum=0,var=0; j<30000; j++){
v = (rand()+0.5)/(RAND_MAX+1.0);
sum += v;
var += v*v;
}
ave = sum / 30000;
var = var / 30000 - ave*ave;
printf("%f %f\n",ave,var);
}
return 0;
}
>>547 @で作ったのを利用して他のをやっていきたいんですが、それにその都度乱数の量を指定できないので・・・
起動に./ファイル 1000 などのような感じでやっていきたいのですが・・・うまく説明できなくてごめんなさい。
646 :
デフォルトの名無しさん :2005/10/20(木) 11:00:53
>>645 お前うちの大学だな。金曜の演習の課題か。
printf("データの個数を入力\n");
scanf("%d", &n);
を消して
n = atoi(argv[2]);
ってコードを追加してみろ。
./コマンド名 出力ファイル名 1000 とか入れればその数だけ乱数が生成される。
ちなみにatoiは引数の文字列をint型に変換する関数だ。あとは自分で調べろ。
友達に聞いてもわからないと言っていたので
どなたか
>>563 のプログラムを完成させてください。
648 :
デフォルトの名無しさん :2005/10/20(木) 12:25:15
>>563 のプログラムは完成しているように見えるが
どなたか
>>577 のプログラムコードお願いしますm(__)m
>>583 じゃ駄目なの?どんなコードか見てないけど
あ、スイマセン、
>>583 に気づきませんでした
ところでコンパイルすると
警告 W8060 6k.c 29: おそらく不正な代入(関数 bin_tree_add )
こんなのが出るんですけど無視して良いんですかね? 実行はちゃんとできました
○○社で大規模爆発事故 原因は面接に来た学生のイオナズン 3月1日午後、○○社(東京中央区)で大規模な爆発事故が発生し、 社員ら約300名が100以上のダメージの大怪我を負った。死者はいない模様。 原因は面接に来た学生が唱えたイオナズンと見られている。 「イオナズンを使うぞ」「使えるものなら使ってみろ」といった押し問答の後、 逆上した学生がイオナズンを唱えたという。 「どうせMPが足りないと思っていた。まさか本当に使うとは」 (面接を担当した○○社の社員) 「最近の若者はすぐにキレやすいし、MPも10年前に比べると 格段に増えている。マホカンタやマホトーンなど自分で自分を 守らないといけない」と関東学院大学牛島助教授(呪文心理学)は警告する。 関連記事 社会面 経済面
653 :
507 :2005/10/20(木) 13:45:26
509さん早いレスありがとうございました。 助かりました。 ところで私のPCでそのプログラムを実行したところ、 結果が bash-2.05b$ gcc src10-20.c bash-2.05b$ ./a.out 3 kido sato ito このようになったのですが、これはどこに問題があるのでしょうか?
654 :
デフォルトの名無しさん :2005/10/20(木) 13:55:02
ハミング距離を求めるプログラムを作ってできあがったのですが。 タイマーつけました。 しかしさらにこれに何かオプション的なものをつけろと言われたのですが。 何かいい案ありませんか? Windows C++ 特に制限はありません。
自爆装置でもつけたらいい
656 :
デフォルトの名無しさん :2005/10/20(木) 14:37:28
そんなプログラムしらんめぇ
657 :
491 :2005/10/20(木) 15:08:26
>>515 のプログラムがない!ないない!図しかない!!うあぁぁ 破滅だ!
658 :
デフォルトの名無しさん :2005/10/20(木) 15:34:21
[1] 授業単元: プログラミング演習 [2] 組み合わせの数nCmを求める関数を作成し,この関数が正しく計算できることを調べるmain関数も作成せよ. ここで,nとmは入力によって求めることとし,組み合わせの数nCmを求める関数は次のようだとする. int combi(int n, int m); [3] 環境 [3.1] OS: Redhat Linux [3.2] gcc ver? [3.3] C [4] 21日(明日)の正午 [5] ポインタは未だ習っていません
>>658 #include<stdio.h>
int combin(int n,int m){
if(n==m || m==0)return(1);
return(combin(n-1,m-1)+combin(n-1,m));
}
int main(void){
int i,j;
for(i=1;i<=10;i++){
for(j=0;j<=i;j++){
printf("%dC%d = %d\n",i,j,combin(i,j));
}
}
}
#include<stdio.h> int combi(int n, int m); int combi(int n, int m) { int i,s; if(n<m||n<1) return 0; else if((n>=1&&m==0)||n==m) return 1; else { for(i=0,s=1;i<m;i++) s *= (n-i); for(;m>1;m--) s /= m; return s; } } int main(void) { int n,m; printf("n="); scanf("%d",&n); printf("m="); scanf("%d",&m); printf("%dC%d = %d\n",n,m,combi(n,m)); return 0; }
if (m > 0) return ((n/m)*combi(n-1, m-1)); else return 1; ってやったらだめだったんだけど何でかね?
>>660 毎回 gcd でも取ってやらんと十分計算できるはずの数が計算できなくなるぞ
>>510 はスルーだな、俺は作れるけどこの板の住人では無理なのか。
今から作るしちょっと待ってろ。
>>666 659? 指数オーダのアルゴリズムだけど簡単にメモ化できるので大して問題無いと思うが
668 :
664 :2005/10/20(木) 19:08:39
>>644 > var += v*v;
ここって
vat += (v-ave)*(v-ave)
じゃなかったっけ。
結局2パス必要になると思う
標準分散は(1/n)*Σ(x-x~)^2
>>669-670 (1/n) (x - x~)^2
= (1/n) x^2 − (x~)^2
だから、
var += v * v;
した後に、
var = var / n - ave * ave;
で分散になる。
1 2 3という数値で計算してみよう データ数nは3、平均x~は2。 (1/n) (x - x~)^2 = (1/3) { (1 - 2) ^ 2 + (2 - 2) ^ 2 + (3 - 2) ^ 2) } = (1/3) { 1 ^ 2 + 0 ^ 2 + 1 ^ 2 } = (1/3) (1 + 1) = 2/3 (1/n) x^2 − (x~)^2 = (1/3) (1 ^ 2 + 2 ^ 2 + 3 ^ 2) - 2 ^ 2 = (1/3) (1 + 4 + 9) - 4 = (1/3) (14) - (12 / 3) = 2/3 ありゃ。この計算では正しいな。
673 :
デフォルトの名無しさん :2005/10/20(木) 19:49:52
標準入力から入力された文字列をポインタbufferが指すメモリ領域に保存し,その文字列中のアルファベット小文字を大文字に変換して、 ポインタresultが指すメモリ領域にコピーするプログラムをつっくたのですが、エラーが出てしまうのですがどこが間違ってるのか教えてください!! #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define BUFFER_SIZE 100 void capitalizeCopy(char*, char*); int main(void) { char *buffer, *result; buffer = (*char)malloc(sizeof(char)); result = (*char)malloc(sizeof(char)); printf("input string: "); fgets(buffer, BUFFER_SIZE, stdin); capitalizeCopy(result, buffer); printf("buffer: %s", buffer); printf("result: %s", result); exit(0); } void capitalizeCopy(char *dest, char *src) { while (src != '\0') if (islower(*src)) { *dest = *src - 32; } else { *dest = *src; } src++; } }
マルチするなボケ
>>673 ソースコード張りなおし.お前が本当に書いたソースコードを手で写さずにコピーペーストしろ.
あと,エラーが出るならそのエラーメッセージも手で写さずにコピーペーストしろ.
マジレスすると
>>671 でも問題ない
手持ちの統計学の教科書にも計算上便利な1/nΣx^2 - x~^2が使えるって書いてあるしな
ただし、場合によっては桁落ちが落ちるので気をつけろとも書いてあるが
>>657 ネタだと思うが、他人の破滅は見てて楽しいので、後日談も希望。
680 :
669 :2005/10/20(木) 20:24:51
681 :
デフォルトの名無しさん :2005/10/20(木) 21:17:51
1]コンピュータアプリケーション [2]データの個数nとデータa1,a2...anの値をファイルにdate1.dから読み込みデータ と平均値と標準偏差を計算し、結果をファイルdate2.dに出力するプログラムを作り なさい。 10個のデータは適当な数字でよい [3.1]xp [3.2]わからないでです [3.3]C [4]10月21日16時30分 [5]わからなくて困ってます。よろしくお願いします。
>>681 データの個数はn個?10個?
data1.d、data1.dのフォーマットは?
683 :
682 :2005/10/20(木) 21:33:14
date1.d、date2.dだったか…
藻前等、関数電卓の統計機能を使ったことないのか? あれはnとΣxとΣx2だけ保存しておいてx~, σn, σn-1は押されたときに計算するだけだぞ。 #昔の関数電卓ではちゃんと取り説で解説されていたのだが……
>>684 漏れの関数電卓は回帰直線・曲線も求めることができるんだが
これも全データは取っておいてないの?
686 :
681のものです。 :2005/10/20(木) 22:12:43
データの個数は10個ですね。 流れとしてはまずdate1.dに10個の数字を入れておいてそれを問題のプログラムに計算させてdate2.dに出力させるわけですが、プログラムの部分が全然わからずすすまないんですよ。
>>685 1次回帰ならΣx, Σy, Σxy, Σx2, Σy2があれば計算できる。
2次回帰でも1次回帰のほかにΣx3, Σx2y, Σx4辺りがあればいい。
#式の詳細は「一次/二次回帰分析」で検索すると出てくる漏れのサイトにも書いてある。
688 :
デフォルトの名無しさん :2005/10/20(木) 22:24:29
[1] C++入門 [2] string str; str = "さんたすよん";が与えられたとする。 このとき,さんを数字の3に,よんを数字の4に,たすを演算子+になおし,その結果を表示するプログラムを考えよ [3] 環境 [3.1] OS: WindowsXP SP1 [3.2] Borland C++ Compiler 5.5 [3.3] C++ [4] 期限: [2005年10月27日09:00まで] [5] その他の制限: 特にありません
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●(´・д・`)●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● これを見た人は確実に【不合格】です。これをコピペでどこかに1回貼れば回避できます。 これは本当です。やらないと一年無駄になります
690 :
625 :2005/10/21(金) 00:19:13
チラシの裏 あり? 2つの方法で、実装2つ作ったけど・・・一致しねぇ。。。 まあいいか、俺の仕事じゃねぇし・・・ 時間があったら3つ目の実装つくってみるべ・・・。 デバッグとか考えて作りましょう>わし
>>681 コンパイラ通してない&セキュリティ甘い版
#include <stdio.h>
#include <math.h>
int main(void)
{ FILE* fp=fopen("data1.d", "r");
int n, i, data;
double ave, var;
fscanf(fp, "%d", &n);
ave = var = 0.0;
for( i = 0 ; i < n ; i++ ) {
fscanf(fp, "%d", &data); ave += data; var += data * data;
}
fclose(fp);
ave /= n; var = var / n - ave * ave;
fp = fopen("data2.d", "w");
fprintf(fp, "Ave:%f\nSig:%f\n", ave, sqrt(var));
fclose(fp);
return 0;
}
テキストの形は次の行から
10 // データ数 n (コメントはデータファイルに書かない。あくまで説明用。)
1234 // データ1個目
:
8374 // データ最後
上の行まで、という感じで。
>>673 ネタだと思うが敢えてマジレス。
なんでBUFFER_SIZEを1000に設定してるのにmallocで1バイトしか確保しとらんの?
しかもBUFFER_SIZE分読み込もうとしてるし。
これじゃ下手したらSegmentation faultするぞ。
自分にバッファオーバーフロー攻撃してどうする?
あと小文字=>大文字変換用関数。ただし必要最小限の機能だけ。
void Capitalize(char *org,char *dest)
{
char *ptr;
for(ptr = org;*ptr != '\0';ptr++){
if(islower(*ptr))
*dest++ = toupper(*ptr);
}
}
あとはどうにでもなるだろ。
islower()にただのcharを渡してはいかん unsigned charにキャストしる
OKなのって、EOFと0-255なん? って言語スレだね。失敬。
695 :
628 :2005/10/21(金) 02:53:38
>>644 様 レス遅くなってすいません。どうもありがとうございました!!!
実行してみたところ、6つの乱数が出てきたのですが、それでいいのでしょうか??
[1] 授業単元:プログラミング
[2] 問題文:
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/998.txt ここにあるNameFileのアルファベット氏名を使って,
一行分の各データを読み込み、各個人データをメモリ内で二分木を一旦作成して,
それから,アルファベット順に名前データを表示するプログラムを作って下さい.
strcasecmp() を使用すること。
ヒントとしてscanfの使い方が与えられてます↓
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/994.txt [3] 環境
[3.1] Windows/Linux
[3.2] gcc
[3.3] 言語: C
[4] 期限: 2日以内
[補足]上記の問題は
>>577 と同じようですが、以下の点が違います
NameFileの中身が、[03TI001 阿部 恒彦 j0301at Abe Tsunehiko]から
[03TI001,阿部 恒彦,g2,Abe,Tsunehiko,0123450]と、コンマで区切られている
因みにそれぞれ[ユーザーID,漢字氏名,学年,e苗字,e名前,学籍番号]となっています。
>>577 のに比べて人数が減っているのは気にしなくていいです
因みに
>>577 の解答コードは
>>583 です、これをうまく改造すればいいのでしょうが
どうもうまくいきません、コーディングをお願いしますm(__)m
>>696 ファイル形式が違うだけなら、フォーマット文字列を"%[^,],%[^,],%[^,],%[^,],%[^,]\n"にでもして、
漢字名の部分を姓名二つのメンバから一つのメンバに換えればよろしかろ。
699 :
698 :2005/10/21(金) 04:35:23
scanf()の結果判定文まちがってた。何やってんだ俺はorz × if(i != 6) ○ if(i == 6)
700 :
696 :2005/10/21(金) 04:43:44
>>698 NameFileをちゃんと書き直しても、read errorで終了してしまいます・・・。
何故なんでしょう・・・。
因みにコンパイルすると
警告 W8060 NF.c 29: おそらく不正な代入(関数 bin_tree_add )
ってのが出ます
701 :
696 :2005/10/21(金) 04:45:40
Oh!ちゃんとできました! ありがとうございましたm(__)m
702 :
644 :2005/10/21(金) 08:00:56
>>695 ……えーと、ソース読めばわかると思うけど表示してるのは平均と分散。
乱数部分は全部表示してたら鬱陶しいと思って表示を切ってある。
もし表示したいなら、君が最初に見せたソースと同じ要領で、
printf文で%fを指定してvを表示してくれ。
[1] 授業単元:プログラミング演習U [2] 問題文: static double data[] = {1.23, 2.34, 3.45, 4.56, 0.98}; 上記のように double 型の配列を宣言、初期化した場合、 各データはメモリ空間上のどのようなアドレスに格納されているか 数値と一緒に表示せよ。 次に、データ中の最大値を探して表示するプログラムを作成せよ。 なお、配列の各要素を参照する場合、ポインタ変数を使用すること。 ※printf文におけるアドレス表示の変換指定子は %p を利用すること [3] 環境 [3.1] OS:Linux [3.2] コンパイラ(バージョン):gcc [3.3] 言語:C [4] 期限:10/24まで [5] その他の制限:ポインタを習い始めたばかりです。 どなたかご教授お願いします。
>>703 #include <stdio.h>
static double data[] = {1.23, 2.34, 3.45, 4.56, 0.98};
int main(int argc, char **argv)
{
double *p = data, *max = data;
int i, num = sizeof(data)/sizeof(double);
for(i = 0; i < num; i++, p++) {
printf("data[%d]のアドレス = %p, data[%d]の値 = %lf\n", i, p, i, *p);
if(*max < *p) {
max = p;
}
}
printf("最大値 = %lf\n", *max);
return 0;
}
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 累計 1 2 3 4 5 15 7 8 9 10 49 13 14 15 91 19 20 130 25 155 上の様に表示するプログラムを作る [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:VS.net [3.3] 言語: C [4] 期限:2005年10月23日0:00まで [5] その他の制限:配列を使わないで作成
706 :
705 :2005/10/21(金) 11:10:04
累計 1 2 3 4 5 15 7 8 9 10 49 13 14 15 91 19 20 130 25 155 訂正です よろしくお願いします
707 :
705 :2005/10/21(金) 11:17:19
>706 #include <stdio.h> int main(){ printf( "累計\n" "1 2 3 4 5 15\n" "7 8 9 10 49\n" "13 14 15 91\n" "19 20 130\n" "25 155\n" ); return 0; } ほい マジレスすると問題文に転載漏れあるだろ? それを追加してから出直してきてください。たぶん入力された数字の和を求めよとかそういうのだと思うけど。 しかしCの演習でVisual Studioとはリッチな学校だな
709 :
708 :2005/10/21(金) 11:25:40
リロード忘れたので708は見なかったことにしてください。
710 :
703 :2005/10/21(金) 11:25:45
>>705 対応しないといけない数はそれだけ?他の入力とかは考慮しなくていいの?しなきゃいけないならその個数は?
713 :
712 :2005/10/21(金) 12:18:40
個数ってのは、一行に入りうる数の個数な。それがわからないと配列を使わないで実装するのは難しいかもしれない。
サンプルを示しても問題/仕様の定義にはならない。
>>707 がサンプルでないなら、
>>708 が回答だろw
何度もすみません、自分のパソコンだと実行できないので
どなたか
>>563 のプログラムを実行して結果を貼ってください、おねがいします。
>715 機種依存しそうなコードじゃないので715の行いに問題があると考えられる
>>715 どうして実行できないのか書いたほうがいいよ。
例えばこんなエラーが出たとか。
むしろ出題者の方を疑った方がいい気もしてきた。 問題文が本当にそれだけなら出題者がだいぶボンクラであるに違いない。 あと、配列がダメなら文字列もアウトか?
>>719 文字列は char の linkedlist で
721 :
デフォルトの名無しさん :2005/10/21(金) 14:46:03
[1] 授業単元:C言語プログラム [2] 問題文: データの個数nとデータa1,a2,・・・anの値をファイル(A.d)から読み込み、 データの平均値と標準偏差を計算して結果を別のファイル(B.d)に出力するプログラムを作り、 データの値が 90.4, 70.6, 29.3, 48.2, -12.8, 33.3, -21.8, 35.6, 99.9, 38.9, の10個の場合について求めよ。 [3] 環境 [3.1] OS:Windows [3.3] 言語: C [4] 期限: [2005年10月22日まで] [5] その他の制限:ありません お願いします。
>>721 #include <stdio.h>
#include <math.h>
int main() {
double a[100]; /* データ数は高々 99 と仮定 */
int n, i;
double m = 0, sigma2 = 0;
FILE *fin, *fout;
fin = fopen("A.d", "r");
for (n = 0; fscanf(fin, "%lf,", &a[n]) != EOF; ++n);
fclose(fin);
for (i = 0; i < n; ++i) m += a[i] / n; /* m = Σa[i]/n */
for (i = 0; i < n; ++i) sigma2 += pow(a[i]-m, 2) / n; /* σ^2 = Σ(a[i]-m)^2/n */
fout = fopen("B.d", "w");
fprintf(fout, "m = %lf, sigma = %lf\n", m, sqrt(sigma2));
fclose(fout);
}
723 :
デフォルトの名無しさん :2005/10/21(金) 16:22:59
問題 キーボードから整数を入力したとき、その数が3の倍数かどうかを出力するプログラムをつくりなさい。ただし、等価演算子を使わずに条件を記述しなさい。←これで、7行目のif文を誰か解いてもらえますか?初歩的な問題かも知れませんがわかりません。お願いします。
val % 3 ? _T("( ゚Д゚)ハァ?") : _T("( ・∀・)イイ!!");
>>723 入力した整数が入っている変数を n とするとif (!(n % 3))。
726 :
681 :2005/10/21(金) 16:47:46
727 :
722 :2005/10/21(金) 16:53:40
728 :
722 :2005/10/21(金) 16:54:57
と思ったら微妙に提出日とか違ったスマソ……
729 :
デフォルトの名無しさん :2005/10/21(金) 17:05:55
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 素数を求めるプログラムを作成せよ。素数を求める範囲(下限 上限)を標準入力から入力すること。 求めた素数はファイルout.txtに出力すること。main関数の他に引数として与えた数が素数なら1、素数でないなら 0を返す関数を作成すること。 [3] 環境 [3.1] OS: WINxp [3.2] Borland BCC dev [3.3] 言語: C [4] 期限: 今月中 おながいします!
>>731 確か素数を見つけるアルゴリズムが有ったと思うが
俺はよく知らないので時間のかかる奴でもいいか?
知ってるが、ソースを書くのが面倒なので教えてやらない
>>731 エラトステネスの篩使ってるのにめっちゃ無駄が多い(w
#include <stdio.h>
#include <stdlib.h>
int is_prime(int upper) {
int i, notprime, *integers = (int*)malloc(sizeof(int) * (upper + 1)), ret;
for (i = 2; i <= upper; i++) integers[i] = 1;
integers[0] = integers[1] = 0;
for (i = 2; i <= upper / 2; i++) {
notprime = i;
while ((notprime += i) <= upper) integers[notprime] = 0;
}
ret = integers[upper];
free(integers);
return ret;
}
int main(void) {
int upper_num, lower_num, i;
FILE* fp = fopen("data.txt", "w");
scanf("%d%d", &lower_num, &upper_num);
for (i = lower_num; i <= upper_num; i++)
if (is_prime(i)) fprintf(fp, "%d\n", i);
fclose(fp);
return 0;
}
>>736 ・・・mallocの正否を確認していませんが。
いつもそうなのですか?
>>736 やってもらったのにすいませんが、なんか割り算をして求める方法らいしです!
739 :
628 :2005/10/21(金) 22:06:34
>>644 様 ありがとうございました!!!昨日慌ててたのでソースきれいに見てなかってすいませんでした(^_^;)
卒研もうまくいきそうです。本当に助かりました!!
あなたは ネ申!!!
>>738 んじゃこれで。n % iがnをiで割った余りだから。
#include <stdio.h>
int is_prime(int n) {
int i;
for (i = 2; i <= n / 2; i++) if (n % i == 0) return 0;
return 1;
}
int main(void) {
int i, upper_num, lower_num;
FILE* fp = fopen("data.txt", "w");
scanf("%d%d", &lower_num, &upper_num);
for (i = lower_num; i <= upper_num; i++)
if (is_prime(i)) fprintf(fp, "%d\n", i);
fclose(fp);
return 0;
}
>>737 どゆこと?
>>740 ありがとうございます。これをヒントに考えてみます
>>740 下限や上限が整数でない場合はどうしたらいいですか?double型を使うとして
for文のところがわからないです
>>742 釣りか?と思いつつも。
#include <stdio.h>
#include <math.h>
int is_prime(int n) {
int i;
for (i = 2; i <= n / 2; i++) if (n % i == 0) return 0;
return 1;
}
int main(void) {
int i, upper_num, lower_num;
double upper, lower;
FILE* fp = fopen("data.txt", "w");
scanf("%lf%lf", &lower, &upper);
upper_num = floor(upper);
lower_num = ceil(lower);
for (i = lower_num; i <= upper_num; i++)
if (is_prime(i)) fprintf(fp, "%d\n", i);
fclose(fp);
return 0;
}
>>743 例えば下限に6.5が入力されたとして、for文で1ずつ足していくと7とかが無視されないですか?
>>744 おまえは floor と ceil という文字が見えんのか?
というか、なんで実際に動かして試してみろ馬鹿
>>746 floorとceilは習ってません・・・
>>747 じゃあ検索しろ。マニュアルくらい読め。わからなかったら少しは自分で調べろ。
>>747 ここは、説明はあんまし期待しないよーに。
実行してみて不具合があったら報告すればよろし。
[1] 授業単元:プログラミング入門 [2] 問題文(含コード&リンク): 30人のテストの得点データを読み込む。得点は0点以上10点以下。 各点数の人数を求め、その人数を点数ごとに*の数で表しなさい。 また、最も人数の多い得点と、最も人数の少ない得点を示しなさい。 [3] 環境 [3.1] OS: WindowsXP [3.3] 言語: どちらでも可 [4] 期限: 日曜日までにお願いします。 [5] その他の制限: 配列を利用しなさいということ以外は特に指定はありませんでした。 お願いします。
言語:どちらでも可ってなんだ。マイナー言語でもよいと言うのか。
WhiteSpaceでよろ
言語はBrainfuckでひとつ。
HSP!HSP!HSP!HSP!HSP!HSP!HSP!HSP!HSP!HSP!HSP!HSP!
>>750 点数はファイルに改行とか空白で区切られて入ってるものとする。
#include <iostream>
#include <fstream>
#include <algorithm>
int main() {
int scores[10+1];
std::fill(scores, scores+11, 0);
std::ifstream ifs("score.dat");
for (int i = 0, x; i < 30; ++i) ifs >> x, scores[x]++;
for (int i = 0; i <= 10; ++i) {
for (int j = 0; j < scores[i]; ++j) std::cout << '*';
std::cout << std::endl;
}
int minid = 0, maxid = 0;
for (int i = 0; i <= 10; ++i) {
if (scores[i] < scores[minid]) minid = i;
if (scores[i] > scores[maxid]) maxid = i;
}
std::cout << minid << "," << maxid << std::endl;
}
>>751 スマソ_| ̄|○
C++の間違いだった……。
758 :
705 :2005/10/22(土) 01:10:16
返答遅れてスイマセン 整数の値は各行に5個ずつ 各行の終わりにはそれまでの累計を表示 逆階段の様に表示するプログラムです 同時に出された問題2はは 1〜25までの好きな数字を入力して 入れた数字まで整数の値を各行に表示(6だったら5まで表示 行の累計だけではなく 列の累計も表示するプログラムです おそらく最初の問題は2番目の問題の雛形だと思います 最初の問題だけ教えてもらって 後半は自力で解こうとした為 説明不足になってしまいました 改めてよろしくお願いします
759 :
デフォルトの名無しさん :2005/10/22(土) 08:19:53
>>750 >最も人数の多い得点と、最も人数の少ない得点を示しなさい。
ここは自分でやってくれい
#include <iostream>
#include <vector>
using namespace std;
void input_result( vector<int> &v ){
int i;
for( i=0; i<30; i++ )
v.push_back( rand()%11 );
}
void show( vector<int> v ){ int i; for( i=0; i<=10; i++ ) { cout << i << ": "; vector<int>::iterator p = v.begin(); while( p != v.end() ) { if( i == *p ) cout << "*"; p++; } cout << endl; } } int main() { vector<int> v; input_result(v); show(v); return 0; }
761 :
デフォルトの名無しさん :2005/10/22(土) 21:36:59
[1] 単元:情報プログラム [2] 環境 [2.1] OS: Linux [2.2] コンパイラバージョン: gcc [2.3] 言語: C [3] 期限: 木曜16時 [4] 問題:任意の2自然数に関する最小公倍数計算のためのルールを見出し、それにもとづきアルゴリズムを考案し、 プログラムを作成・実行せよ。2数は使用者がプログラム実行時に打ち込めるものとする。 <出力例1> Please input first number:60 ←60を入力 Please input second number:84 ←84を入力 The least common multiple of 60 and 84 is 420 <入出力例2>Please input first number:84 ←84を入力 Please input second number:84 ←84を入力 The first number (84)is equal to the second(84). Try again! <ルール確率のためのヒント> 以下に60と84の最小公倍数の求め方を示す。 @60と80は2で割れる A30と40は2で割れる B15と21は3で割れる C5と7を割れる数はない D2*2*3*5*7=420が最小公倍数 上記手順は人間の勘に依存する部分があるので、そのままアルゴリズム化できない。 ルールを確立するためには、以下の点に着目。 「1」手順Cにおける2数(5と7)間に1以外の公約数はない。 「2」2*2*3は最大公約数である 「3」最大公約数に5を乗じると60になり、7を乗じると84になる 以上が課題ですよろしくお願いします・゚・(ノД`)・゚・
???素因数分解してダブりを除いてかけるのが最小公倍数じゃん 60=2*30=2*2*15=2*2*3*5 84=2*42=2*2*21=2*2*3*7 最小公倍数 2*2*3*5*7
>>761 #include <stdio.h>
#include <stdlib.h>
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
int lcm(int x, int y) { return x / gcd(x, y) * y; }
int main(void)
{
int x, y;
do {
while (printf("Please input first number:"), scanf("%d", &x) != 1 || x < 0) scanf("%*[^\n]");
while (printf("Please input second number:"), scanf("%d", &y) != 1 || y < 0) scanf("%*[^\n]");
} while (x == y && printf("The first number (%d)is equal to the second(%d)\nTry again!\n", x, y));
printf("The least common multiple of %d and %d is %d\n", x, y, lcm(x, y));
return 0;
}
確か、小さい方で割った剰余を出して、それで今度は逆の事をしてって 繰り返していくのがなかったっけ?
int gcd(int a, int b) { if(b) return gcd(b, a%b); return a; } int lcm(int a, int b) { return (a/gcd(a,b))*b; }
前に住人たちにお世話になったものです 久しぶりに見たけど色々な人を助けてるようですね。 あの時はありがとう。なんか自分の人生は変わってしまったけど ここは変わってなくて安心した
767 :
デフォルトの名無しさん :2005/10/23(日) 02:45:58
>>696 かなり亀レスだが…
お前の使ってる緑色の教科書の、2分探索木を操作するプログラムを改良して作ったほうがシンプルで楽だぞ…
お前と同じ大学に通っている俺が言うんだから間違いない
丁寧に追いかけるだけだよ.funcJ が呼ばれるまでで a = [1, 2, 3, 4, 2, 3, 4, 5],d = [a, a+4] になるのは明らか.funcJ の中で d[0] = a, d[1] = a+4 なので, for 文の中身は (a+4)[j] += (a)[j]. ここで C 言語では a[k] は *(a+k) の構文糖衣なので, (a+4)[j] = *(a+4+j) = a[4+j] となって,for 文の中身は a[4+j] += a[j] と同値. よって a = {1, 2, 3, 4, 3, 5, 7, 9}
>>769 a【100】って領域が確保されている以外は図の通りと考えて問題ない。
[1] プログラム演習T [2] スタックを用いて、後置式を前置式に変換するアルゴリズムを考える、あるいは調べよ。 プログラムにした場合加点対象とする。 例:54*1+なら、((5*4)+1) [3] 環境 C言語。WinXP、Borland C++ Compiler 5.5がコンパイラ。 [4] 期限: [2005/10/25] [5] 半年C言語を習った程度。 アルゴリズムが分かりません。スタックって・・・木構造じゃないのかorz
>>771 問題文と例が不一致.問題文は後置を中置にしてるが.
>>771 問題のコードが変だなぁ
UINT_MAX行だけ出力するようになっているし、なぜかintを16ビットと見なしているし。
教科書と言うのは時代に即してないのね
元のコードが動くものであるなら、こんな変更でいいんじゃないかな(コンパイルもしてみてない)
int count_bits(unsigned x)
↓
int count_bits(unsigned char x)
for(i=0;i<UINT_MAX;i++){
print_bits(i);
printf("%6o%5u%4x\n",i,i,i);
}
↓
i=CHAR_MAX;
print_bits(i);
printf("%5u%4x\n",i,i);
>>772 アルゴリズムとしては,それが項か演算子かを区別して,式を最初から読んでいって
1. 項だったらスタックに突っこむ
2. 演算子だったら二つスタックから取ってきてそれを結合してスタックに突っこみなおす
3. 式を全部読んだらスタックの先頭に結果が入ってる.
例えば 54*1+ だったら,
・5 だからスタックに突っこむ
・4 だからスタックに突っこむ
・* だからスタックから 5 と 4 を取ってきて * でつないで (5*4) を作ってスタックに突っこむ
・1 だからスタックに突っこむ
・+ だからスタックから (5*4) と 1 を取ってきて + でつないで ((5*4)+1) を作ってスタックに突っこむ
で読みきったとき,スタックの先頭には ((5*4)+1) が入ってるはず.
これを普通に書くと↓みたいになる.スタックに文字列を突っこむことになるので最初に語句解析しとくと楽.
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1003.c
と思ったがどうせスタックに入るのは項だけなんだから語句解析なんていらんな……ああ無駄コード orz
char *str[100]; char buf[256]; int ptr = 0; 中身が頻繁に変わるbufを strに順番に保存しておきたいのですが strcpy( str[ptr++], buf); これではだめなんでしょうか?うまくいきません。
割り当ててません(; やり方教えてもらえますか? ごく簡単でかまいません m(_ _)m
>>779 char str[256][100]; で strcpy(str[ptr++], buf);
>>775 ありがとうございます。
文字列をスタックに入れる発想ができませんでした。
文字列を数値に変換するのとか習ってたのに・・・
参考になりました。
783 :
780 :2005/10/23(日) 13:16:35
【質問テンプレ】
[1] 授業単元:名前解決を実装するソケットプログラミング
[2] 問題文(含コード&リンク):ドメイン名をIPアドレスに変換するプログラムを作成せよ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1004.txt [3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: [2005年10月28日まで]
[5] その他の制限:nslookupやdig等のようにローカルDNSに問合せに行って
ローカルDNSがルートDNSに問い合わせると言う形はNGです。
あくまで、このプログラムが直接ルートDNSに問合せに行き、
名前解決をする必要があります。
785 :
デフォルトの名無しさん :2005/10/23(日) 16:47:55
質問したのにsageてしまった。 それと>784をコンパイルし./プログラム名 www.livedoor.co.jpと入力すると ------------------------- データ送信:www.livedoor.co.jp データ受信:4294967295 ------------------------- と表示されます。 データ受信の欄にjpドメイン全体を管理するネームサーバのアドレスを表示させ、 順次co全体を管理するネームサーバのアドレス、 livedoor全体を管理するネームサーバのアドレス、 と表示させたいのですが。
>>785 そりゃぁ、全く間違ったものを表示させようとしているだろ。
787 :
デフォルトの名無しさん :2005/10/23(日) 20:29:53
>786 ルートDNSの53番ポートにドメイン名を送ると、上記の4294967295が返ってきます。 送り方に問題がありそうなのですが、良く分からなくて・・・。
0xffffffff
だから-1を表示してどうしたいのかと。
[1] 授業単元: 三次元プログラミング [2] 問題文(含コード&リンク): int yaw, pitch, rollに角度(0゚〜360゚=0〜65536)、float distに原点座標からの距離が代入されている。 これをfloat vecx, vecy, veczに原点座標からのベクトル値に変換しなさい。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VC.net2003 [3.3] 言語: C++ [4] 期限: [2005年10月24日08:00まで] [5] その他の制限:特になし、C++に関してはほぼ習得出来ているつもり 宜しくお願いします。
>>790 ヨーピッチロールとxyzの方向の関係を図示したまえ。
792 :
質問です。 :2005/10/23(日) 22:03:23
授業単元とか無いのですが、卒業研究の一環でJPEGを読み込んでRGBの値を 得るプログラムがどうしても欲しいのです。C++でもCでも良いのです。 注意点を守ってないのは承知の上なのですが、どうしても力を借りたいので お願いします。
>788 >789 なんで、0xffffffffが送られてくるのか理解できてないです。 DNSパケットとかRFCとかをもう少し勉強してきます。
>>796 そもそもDNS参照は生の文字列を送りつければ結果が返ってくるような単純なものじゃないよ。
>798 >797のおっしゃるとおり、ルートの53番ポートにドメイン名をそのまま送りつけているだけです。 そんな単純な話じゃないんですねorz
>>799 俺も興味があったのでちょっと調べてるが、とりあえず@ITでも見てみれ
>>802 そんなGUIの絡んだような宿題は基本的に手間ばかりで宿題の醍醐味に欠けるのでやりたがる人は少ない。
そもそも、>1を読んでくれ。
>803 情報ありがとうございます。 実行させてみたところ、私の作りたいものにきわめて類似していることが分かりました。 ./resolver-1.pl 198.41.0.4 www.livedoor.com(書式: DNSサーバ名 名前解決ホスト名) とルートDNSを指定して実行したところ、 権威(1): リソースデータ: A.GTLD-SERVERS.NET と返ってきて、次に ./resolver-1.pl A.GTLD-SERVERS.NET www.livedoor.com と実行したところ、 権威(1): リソースデータ: zns05.data-hotel.net と返ってきて、次に ./resolver-1.pl zns05.data-hotel.net www.livedoor.com と実行したところ、 回答(1): リソースデータ: 203.131.197.197 と答えの203.131.197.197にたどり着くことが出来ました。 このソースをCに移植して、出来れば一回の入力で、 名前解決が完了できるプログラムを作れるよう今週頑張ってみます。 Perlは以前少し触ったことがありますし、頑張って解読してみようと思います。
>>802 せめて MFC は使って良いとか SDK 直叩きだけで作れとか言ってくれないと困る
[1] 授業単元: 画像処理プログラミング [2] 問題文: 24bit BitmapのデータをYUV444,YUV422に変換し保存せよ。 また、YUV444,YUV422のデータを24bit Bitmapに変換し、保存せよ。 [3] 環境 [3.1] OS: Windows2000 [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語: C [4] 期限: [2005年10月26日11:00まで] [5] その他の制限: 変換で外部ライブラリ等の使用は禁止 よろしくお願いします。
>>807 BitmapとYUV444、YUV422の変換に関しての参考リンク、または説明を。
どうせ授業で何かしら資料提示されてるでしょ?それ出しな。
C言語の問題です Yamada、Yoshizaki、Suzuki、Kato、Kamata、Kuwata、Maeda をポインタ配列へ登録し、イニシャルを入力するとそのイニシャルを持つ名前のみを表示するプログラムを作成しなさい なお、イニシャルの入力はmain()関数にて行い、ユーザ関数は、判別表示のみで行なうようにすること。 どなたかオチカラをm(__)m
[1] 授業単元:プログラム入門 [2] 問題文(含コード&リンク):標準入力からよみこんだ2つの整数除算を行い その解を小数点20桁まで表示させよ。このプログラムでは、ループを回し挌桁を その都度計算し表示させよ。但し、途中で割り切れたら以後の小数点は求めず、割る数に 0が入力されたら計算はしない。 [3] 環境 [3.1] OS: Unix [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [2005年10月26日20:00まで] 長文すみませんがよろしくお願いします。
>>809 >>1 通りに書いてないが、折角作ったからやるよ。
#include <stdio.h>
#include <string.h>
void print(int s, char *str[], int n);
int main(void)
{
char *str[] = {"Yamada", "Yoshizaki", "Suzuki", "Kato", "Kamata", "Kuwata", "Maeda"};
char buf[128];
while (1) {
printf("イニシャルを入力して下さい(Enterで終了): ");
fgets(buf, sizeof(buf), stdin);
if (*buf == '\n') break;
print(*buf, str, sizeof(str) / sizeof(char *));
}
return 0;
}
void print(int s, char *str[], int n)
{
int i;
for (i = 0; i < n; i++)
if (s == str[i][0])
puts(str[i]);
}
813 :
809 :2005/10/25(火) 11:11:50
すいません。携帯からだったので1を見る余裕が無くて‥ 期限も12時までだったんで助かります。本当にありがとうございました! いい一日になりそうです
>>812 今見返したら、string.hいらないや。ま、いいか。
815 :
809 :2005/10/25(火) 11:41:11
ポインタ配列までしか習ってないのでstrやbuf[128]など初見です(汗 Call by Referenceを最近習った。 せっかく力を貸してくれたのにちゃんとデンプレ通りにやらない自分が悪いですね‥すいません。
>>811 かなり適当。
#include <stdio.h>
int main(int argc, char **argv)
{
int a,b,c,i;
scanf("%d %d", &a, &b);
if(b == 0) {
fprintf(stderr, "error: divide by 0");
return -1;
}
for(i = 0; i <= 20; i++) {
c = a / b;
a = (a % b) * 10;
printf("%d", c);
if(a == 0) {
break;
}
if(i == 0) {
putchar('.');
}
}
return 0;
}
817 :
809 :2005/10/25(火) 11:46:16
実行例1: イニシャルを入力してください? Z 該当者無し 実行例2: イニシャルを入力してください? Y Yamada Yoshizaki こういう風なプログラムらしいです。連カキやばいなぁ‥
>>817 strはポインタ配列です。それから、bufは入力バッファ。
getchar()では不都合が起きる事があるので、fscanf()にした。
void print(int s, char *str[], int n)
{
int i, f = 0;
for (i = 0; i < n; i++)
if (s == str[i][0]) {
puts(str[i]);
f = 1;
}
if (!f)
puts("該当者無し");
}
819 :
816 :2005/10/25(火) 12:14:19
>>811 負の数のこと考慮してなかったので訂正。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int a,b,i;
scanf("%d %d", &a, &b);
if(b == 0) {
fprintf(stderr, "error: divide by 0");
return -1;
}
if((a > 0 && b < 0) || (a < 0 && b > 0)) {
putchar('-');
}
a = abs(a);
b = abs(b);
printf("%d", a/b);
a = (a % b) * 10;
if(a > 0) {
putchar('.');
for(i = 0; i < 20 && a > 0; i++) {
printf("%d", a/b);
a = (a % b) * 10;
}
}
return 0;
}
820 :
デフォルトの名無しさん :2005/10/25(火) 14:14:43
[1] 授業単元:データ構造とアルゴリズム [2] 問題文(含コード&リンク): 0-1 1-2 2-0 0-3 3-1 1-0 0-2 2-3 3-0 3-2 2-1 1-3 のデータから 0-1 1-2 2-0 0-3 3-1 2-3 の順で抜き出せ。ただしstlの連想コンテナを用いること。 [3] 環境 [3.1] OS: Win [3.2] コンパイラ名とバージョン: VC++ [3.3] 言語: C++ [4] 期限: [2005年10月25日24:00まで] 長文すみませんがよろしくお願いします。
>>820 連想コンテナと言えば、std::mapかstd::multimap(今回はstd::multimapだろう)
になるけど、その抜き出す順序ってのは、どういう規則があるの?
>821 0-1と1-0は同じ 1-2と2-1は同じ 2-0と0-2は同じ 0-3と3-0は同じ 3-1と1-3は同じ 2-3と3-2は同じ 格納順は 0-1 1-2 2-0 0-3 3-1 1-0 0-2 2-3 3-0 3-2 2-1 1-3 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ○ ○ ○ ○ ○ × × ○ × × × × 0-1 1-2 2-0 0-3 3-1 2-3
824 :
デフォルトの名無しさん :2005/10/25(火) 17:44:16
分数の計算をするプログラムを作ってるんですが約分のしかたがわかりません。 教えて下さい。
n を分子、d を分母とすると、 x = gcd(n, d); n /= x; d /= x; gcd は最大公約数。 最大公約数の求め方はぐぐればすぐ出てくると思われ。
826 :
デフォルトの名無しさん :2005/10/25(火) 17:53:52
>>824 約分の定義を考えてみよう
それで得られた数値で分子・分母を割る
827 :
デフォルトの名無しさん :2005/10/25(火) 17:57:08
別に関数を作るってことですか?最大公約数の求め方が分かんないんですけど;;
>>827 >最大公約数の求め方はぐぐればすぐ出てくると思われ。
830 :
デフォルトの名無しさん :2005/10/25(火) 18:02:05
わかんないです(;;)
832 :
デフォルトの名無しさん :2005/10/25(火) 18:04:13
int gcd(int a, int b) { int t; if(b > a) { t = a; a = b; b = a; } while (b > 0) { int r = a % b; a = b; b = r; } return a; }
833 :
デフォルトの名無しさん :2005/10/25(火) 18:04:39
わかんないんですけど(;;)
834 :
デフォルトの名無しさん :2005/10/25(火) 18:05:35
ミスった int gcd(int a, int b) { if(b > a) { int t = a; a = b; b = t; } while (b > 0) { int r = a % b; a = b; b = r; } return a; }
835 :
デフォルトの名無しさん :2005/10/25(火) 18:07:02
なんでreturnでaしか返さないのかわかんないんです(;;)
だめだこりゃ
838 :
デフォルトの名無しさん :2005/10/25(火) 18:09:13
ごめんなさい(;;)このばあいaが最大公約数なんですか?
839 :
デフォルトの名無しさん :2005/10/25(火) 18:11:08
このプログラムの説明をお願いしますm(__)m
もはやエスパーが必要な領域になってると思われ
841 :
デフォルトの名無しさん :2005/10/25(火) 18:11:37
>>840 もはやエスパーよりも、クマーのAAの方が適切かもな。
>>842 まあ、ちょこっと841を擁護するなら、除算と比べれば条件分岐の方が処理早い環境もあるわけで。
>823 コンソールで動かしてみましたが、0-1としか表示されないです・・・ ソースを拝見したところ、一度データを全部格納してから、更に順に ペア探索して、見つかったら削除って感じですかね??? 自分なりに↑のを元に考えてみたのですが insertするときに毎回格納したmultimap内でfirstとsecondと対になるペアを探索して (例えば、最初のデータが0-1なら、multimap内でequal_range(1)で 1-*を検索して、その中からsecondが0のを探すという作業を全データに対して行う) multimap内に、ペアが無い場合はinsertして、結果出力するなり別個にvectorに格納。 ペアがある場合は何もせずに次に進む。 ちょっとプログラム組んでみます
845 :
デフォルトの名無しさん :2005/10/25(火) 19:08:29
エラーが出てしまうんですけど何が違うんでしょう? int gcd(FRACTION v){ FRACTION j; int t; if(j.numerator >= j.denominator){ do{ t = j.numerator % j.denominator; j.numerator = j.denominator; j.denominator = t; }while(t != 0); } j.numerator /= t; j.denominator /= t; return j; }
>>845 ク、クマー
まあ、素でやってるんだろうけど。
gcd 関数は最大公約数求めるだけにして、それとは別に
x = gcd(j.numerator, j.denominator);
j.numerator /= x;
j.denominator /= x;
俺は先日エスパーの能力を手に入れたばかりだから力が足りないかもしれない。
・関数の引数を FRACTION vとしているのに、次の行からは jを使ってしまっている
→jを全部vに書き換える。
・関数の戻り値が int型なのに、return jと書いている。
→return tと書き換える。
あと根本的な問題として、main関数が存在して無いからどんなに頑張っても無理(他に存在してるなら別)
C言語の最初の授業でmain関数が無いと動きませんって習いませんでしたかい
main以外の関数の作り方を習ってないなら、
>>834 の上下二行づつを無視して書き換えればいい
if (j.numerator > j.denominator)
{
t = j.numerator; j.numerator = j.denominator; j.denominator = t;
}
while (j.denominator > 0)
{
r = j.numerator % j.numerator; j.numerator = j.numerator; j.denominator = r;
}
これを途中に組み込んで、
>>846 (xをrに置き換えて)を実行。足りない所は補完しる
848 :
844 :2005/10/25(火) 20:09:25
849 :
教えて厨 :2005/10/25(火) 21:27:56
[1] 授業単元: 画像処理関係
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1009.zip 上のpgm形式サンプル画像ファイルに対して次の3つの処理を行ってください。
(1)画像のノイズをメディアンフィルタ等で取った上で、エッジ検出を行った後のエッジ画像を出力してね。
(2)画像内にちらばっている多角形に対してラベリング処理を行って境界線追跡をするか、
あるいは図形を切り出すなどしてそれら図形の周囲長・面積・円形度・モーメント、その他自分で考案した特徴を計算してください。
(3)(2)で求めた特徴量から2〜3の特徴を選び、各図形が特徴空間のどこに位置するか表示してね。
さらに、これらの図形において三角形と円を識別するにはどのような特徴が適当か考察してください。
[3] 環境
[3.1] OS: Windows/Linux/どちらでも実行できること!
[3.2] コンパイラ名とバージョン: gccかVC++6.0、bccどれでも動くのが望ましい
[3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年10月27日まで]
[5] その他の制限: 制限無し。答えさえ正しければ、何でもOK。
>>849 > 画像のノイズをメディアンフィルタ等で取った上で、エッジ検出を行った後のエッジ画像を出力してね。
は?それがお願いする態度か?
やり直せ。
>>850 先生の配ったプリントにまんまそう書いてあるとか。
YUVの人とかPGMバイナリの人とか、居たなそーいや。
853 :
やり直しました :2005/10/25(火) 22:00:37
[1] 授業単元: 画像処理関係
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1009.zip 上のpgm形式サンプル画像ファイルに対して次の3つの処理を行ってください。
(1)画像のノイズをメディアンフィルタ等で取った上で、エッジ検出を行った後のエッジ画像を出力してください。
(2)画像内にちらばっている多角形に対してラベリング処理を行って境界線追跡をするか、
あるいは図形を切り出すなどして
それら図形の周囲長・面積・円形度・モーメント、その他自分で考案した特徴を計算してください。
(3)(2)で求めた特徴量から2〜3の特徴を選び、各図形が特徴空間のどこに位置するか表示してください。
さらに、これらの図形において三角形と円を識別するにはどのような特徴が適当か考察してください。
[3] 環境
[3.1] OS: Windows/Linux/どちらでも実行できるのが望ましい
[3.2] コンパイラ名とバージョン: gccかVC++6.0、bccどれでも動くのが望ましい
[3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年10月27日まで]
[5] その他の制限: 制限無し。答えさえ正しければよい。
>>850 スレは「解いてください」じゃなくて「解かせてください」だから。
勘違いしないように
>>854 そういう態度とるんなら、解いてやる義理はないな。
もう来なくていいよ。
>>855 折れは単なる閲覧者
>>853 ではない
むしろ「解いてやってる」とか勘違いしてる喪前が来るなよ
>>855 最初から「解いてやる義理」はないんだから
お前こそ来なくていいと思う。
だが元々このスレの目的は「解かせてください」だぞ?「解いてやってる」 と勘違いするヤツは今直ぐこのスレから出てけ
859 :
853 :2005/10/25(火) 22:10:33
自己解決しました。
まあ・・・気に入らんときはスルーな。 発注、受注、閲覧者ともに。 発注側は受注側の確認には答えたほーがいいとは思うが。
>>858 えーと、どこにそんなこと書いてあるのかな。
テンプレの注意点の2番目には、解いてもらう方、になっているな。
>>858 お前が勘違いしているんだよ。
恥ずかしいから出ていってくれない?
864 :
デフォルトの名無しさん :2005/10/25(火) 22:21:15
このスレは、スレ住人の良心によって、課題が解けない哀れな人を助ける目的でたてられたものです。 質問者は解答者に対しては感謝の気持ちを忘れてはいけません。 解答者は良心を忘れてはいけません。
もともとCやC++スレに宿題を質問する奴がウザいので作られた隔離スレ 煽るのも答えるのもご自由に。
あなたが解けないC/C++の宿題を片づけます 何度読んでも解いてあげますではないな。解かさせてくださいでもないが、 どっちかというと質問者の方が立場は上だナ
867 :
デフォルトの名無しさん :2005/10/25(火) 22:22:56
これはある種のボランティア活動です。 2ちゃんねるとは素晴らしいボランティア団体なのです。 感謝されることが私たちスレ住人の一番の宝物です。
まあ、気が向いたら解いてやるよってスレだろ? 発注元は受注側の質問には真摯に答えろよ
869 :
849&853です :2005/10/25(火) 22:29:47
よくわからない議論がはじまっていますが、 私は849と853しか書き込んでません。 そのほかの書き込みは私とは関係がございません。 859で勝手に自己解決したことにされていますが、 もちろん自己解決していませんし、 ふんぞりかえって「解きたまえ」という高圧的態度で 問題を提示しているつもりもありませんので、 ひきつづき皆様の好意のアドバイスを頂きたく思います。 どうぞよろしくお願いいたします。
871 :
教えて厨 :2005/10/25(火) 22:30:57
自己解決しました。
教えて厨なんて名前にしておいてそんなつもりは無いだと? 頭の隅からすみまで腐ってやがる
テンプレ案 あなたが解けないC/C++の宿題を片付けます 【重要】 気に入らない質問や発言はスルーしましょう 【質問者へ】 回答者の便宜のため、質問の際は以下を守ることを推奨します。 ・質問は【質問テンプレ】に従ってください。 ・問題文は、わかりやすいように全文を書きましょう。 ・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。 ・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。 ・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
質問者は全員トリップを付けるようにするのはどうだろうか。
板がID表示制なら面倒がなくていいのだが
>>874 トリップは万能薬ではない。
>>868 そだね。気が向いたら解く。
資料が添付されてなかったり、態度が悪かったすると、気が向かないな。
まあ、気が向かんでも、ネタになるようだったら、無駄な努力はするか。
センセの名前だしてみたり、解答できてるのに画像しか出さんかったり。
かつてコピー!コピー! でいい味だしてたセンセも居るなぁ・・・。
なんで教科書に載ってそうな内容を質問するんだよ。ていうか、教科書よめ。
878 :
教えて厨 ◆AU/OjWxByc :2005/10/25(火) 22:45:33
なぜか荒らされていますが、 自己解決したと勝手に宣言しているのは私ではありません。 ひきつづき悩んでいます。助けを求む。
879 :
教えて厨 ◆AU/OjWxByc :2005/10/25(火) 22:47:17
[1] 授業単元: 画像処理関係
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1009.zip 上のpgm形式サンプル画像ファイルに対して次の3つの処理を行ってください。
(1)画像のノイズをメディアンフィルタ等で取った上で、エッジ検出を行った後のエッジ画像を出力してください。
(2)画像内にちらばっている多角形に対してラベリング処理を行って境界線追跡をするか、
あるいは図形を切り出すなどして
それら図形の周囲長・面積・円形度・モーメント、その他自分で考案した特徴を計算してください。
(3)(2)で求めた特徴量から2〜3の特徴を選び、各図形が特徴空間のどこに位置するか表示してください。
さらに、これらの図形において三角形と円を識別するにはどのような特徴が適当か考察してください。
[3] 環境
[3.1] OS: Windows/Linux/どちらでも実行できるのが望ましい
[3.2] コンパイラ名とバージョン: gccかVC++6.0、bccどれでも動くのが望ましい
[3.3] 言語: C/C++/どちらでも可
[4] 期限: [2005年10月27日まで]
[5] その他の制限: 制限無し。答えさえ正しければよい。
tu-ka何処の学校の宿題?そんな問題出すセンセーいるのか? ひょっとして画像関係を取り扱った会社の開発で必要だから宿題なのか? 問題見ると"学校の宿題"かどうかはかなり怪しく見えるんだけど
>>879 質問者はどういう情報があれば回答を得られるか考えて欲しいもんだが。
以下のものに関する資料が足りないので、どうしようもない。
・メディアンフィルタ
・画像の読み書き
・エッジ検出、ラべリング処理、境界線追跡
・特徴量とはどういうものか
・図形の周囲長・面積・円形度・モーメント
ソースコードや、解説文をもらってるハズだから、提示するように。
882 :
教えて厨 ◆AU/OjWxByc :2005/10/25(火) 23:00:28
>880 とある三流大学の画像関連の科目の宿題です。 C言語で学ぶ実践画像処理というオーム社の本に よく似たサンプルがあるんですが、プログラミングが苦手で自力で組めません。 お願いだから力を貸して〜
>>881 その他の制限は無いんだから、適当にすりゃいいんだよ。
お前はいちいち あーしろこーしろ と言われないとできないのか?
まぁ、会社人なら底辺の仕事しかしていないだろうし、学生なら本当に課題しかしないクズなんだろうな。
先生が趣味で考えてぶち当たった問題を学生に解かしてみようって魂胆だろ。
じゃあまずそのオーム社のサンプルをとりあえず書いてどっかにウプしてくれ とりあえずは
後は
>>881 の言う以下の資料
・メディアンフィルタ
・画像の読み書き
・エッジ検出、ラべリング処理、境界線追跡
・特徴量とはどういうものか
・図形の周囲長・面積・円形度・モーメント
三流大学の宿題とは思えないわ(汗
>>885 おいおい、上から3つまでは別段難しい事無いじゃないか
てか、そこまで判らん奴が手を出して終わる様な問題じゃないぞ
ここで聞くより、画像関係スレで相談してアイデアを出してもらう方が良い位の内容
>>885 pgmの読み書きくらい、常識として知っておくといいよ。
そういば、むか〜しにpgm読み書き含む、宿題用のライブラリ作ったなぁ。一回しか使ってないけど。
メディアンフィルタって行列計算するだけじゃなかったっけ? 9マスでラスタスキャンしながら。
891 :
教えて厨 ◆AU/OjWxByc :2005/10/25(火) 23:32:02
892 :
教えて厨 ◆AU/OjWxByc :2005/10/25(火) 23:39:19
自分で考案した特長量も使えという風になっているのですが、 大したものじゃなくてもいいはずだと思います。 黒画素の比率を数えて黒濃度だとかそういうのでかまわないと思います。
他人事モードだな
単位はでないよ
>C言語で学ぶ実践画像処理というオーム社の本が参考になりそうでした。 んー。参考になるかもしれんが、俺もってねぇし(笑) ・・・もうちっとアタマ使おうな。
>>807 宿題を解く側は多分YUV形式からから24bitRGBに展開するところだけしか興味が持てない
はじめから知っていることにはまったく興味が持てない。
あとはただの作業…
大学のC言語の授業でわからない問題があったんだが 誰か助けてくれ 1年だから相当簡単だと思われる UNIX環境です。 getcharで入力された数字文字をカウントするってやつなんだが 例えば 112233 4455 って感じに途中で改行があった場合に 改行前の数字だけ読み込ませる、って感じ。 要するに上の2行の数字をうったあとCtrl+D押すと 1が2個、2が2個、3が2個、あとは0個って感じに認識させるわけです。 どうやっても2行分全部カウントしてしまう・・・。誰かお助けお願いします。
>>900 あ、ごめん
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
>>899 [3] 環境
[3.1] OS: UNIX(UNIXの何てOSなのかは不明)
[3.2] 不明(gcc?)
[3.3] 言語: C
[4] 期限: 10月28日
[5] その他の制限: まだ全然習ってません。ポインタの手前って感じです。
>>901 #include <stdio.h>
int main(void)
{
int count[256], i;
char c;
for(i=0;i<256;i++)count[i]=0;
while(c=getchar()) {
if(c=='\n')break;
count[c]++;
}
for(i=0;i<256;i++)
if(count[i])
printf("%cは%d個ありました。\n",(char)i,count[i]);
return 0;
}
未確認だけど、改行前の数字だけ認識させる方法ならこうかな #include <stdio.h> #include <ctype.h> int main() { int c, hist[10] = {0}; while(c = getchar(), c != EOF && c != '\n') if (isdigit(c)) hist[c-'0']++; for(c = 0; c < 10; c++) printf("%dx%d\n", c, hist[c]); return 0; }
904 :
デフォルトの名無しさん :2005/10/26(水) 10:35:17
[1] 授業単元:プログラミング演習 [2] 環境 [2.1] OS: LiNUX [2.2] コンパイラgcc [2.3] 言語: C [3] 期限: 10月27日午後4時 [4] 問題文: 画面上で、出力時のファイル名を入力後、任意の長さの文章(半角英数字のみでも良い)を入力し、 最後にQUITを入力することで、入力した文章データを先に入力したファイル名(拡張子はtxtとする)のascii形式データファイルとして保存し終了するプログラムを作成し、実行しなさい。 ここでは、文字入力に応じてメモリ領域の確保を繰り返し、文字列データを可変長配列に格納すること、 その文字列を格納する構造体は、以下のように定義できる。また、メモリ領域の確保は、 標準関数であるmallocを使うこと。 struct Textdata { char textline[NN]; /* 記述する文章の1行分の文字列 NNは1行の最大文字数+1 */ struct Textdata*NextP /* NextPは次の要素へのポインタ */ } 職人さんお願いします<(_ _)>
とりあえず教官を殴ってこい 言ってることが無茶苦茶だ
>>905 殴ってきました。次にすべき事は何でしょうか?
可変長配列を使うのか「以下の構造体」とやらを使うのかはっきりさせる
終了にはわざわざ2バイト文字でQUITを入力するのかな?
4バイト文字かもね
UTF-8かもしれないな。これぞ本当の可変長文字ww
912 :
デフォルトの名無しさん :2005/10/26(水) 16:57:04
2〜100までの数字で素数を表示するプログラムを授業の課題でC言語を作るように言われたんですが、 ヒントをベースにして次まで作って見たんですが… #include<stdio.h> #include<math.h> main() { int a,i,flag; for(a=2 ; a<=100 ;a++){ flag=0; for(i=2 ;i<=a-1;i++){ if( (a%i) == 0 ){; flag=1; break; } } } if(flag){ printf("%d is a prime number.\n",a); 最後から二行目の if(flag〜)の〜に何か付け加えないと うまくプログラムが働いてくれないのですが… 何を入れればよいか全く分かりません…。 教えてください。
913 して括弧対応させたら動いたよ
915 :
デフォルトの名無しさん :2005/10/26(水) 17:01:20
int main(void){ int i; double x,y,x0=0.5,y0=0.5; double a=0.8,b=0.8; double N=1000; double ignore=N/10; x=x0;y=y0; for(i=1;i<N;i++){ printf("%f %f \n",x,y); if(x>=0 && x<=0.5){ x=2*a*x;y=(1/2)*b*y;}else{ x=a*(2*x-1);y=(1/2)*b*(y+1); } } return0; } 0に収束してるわけでもないのに なぜかYの値が0になってしまいます・・・なぜでしょうか
917 :
デフォルトの名無しさん :2005/10/26(水) 17:06:49
[1] 授業単元:プログラミング演習
[2] 環境
[2.1] OS: WindowsXP
[2.2] コンパイラ gcc
[2.3] 言語: C
[3] 期限: 10月27日午後6時
[4] 問題文:
>>915 の計算プログラムを完成
です。失礼しました。
>>904 それやとメンバーの順番がおかしいがな
struct line
{
struct line *next;←普通はこれが先
char text[1]; /* 可変長 */
};
それより、デスマ明けにプロジェクトが頓挫してしもた
10年やってるけどこんなアホなん初めてやわ
もっと早うに連絡してくるんが常識やんけ
ブ゙ツブツブツブツブ゙ツブツブツブツ
ブ゙ツブツブツブツブ゙ツブツブツブツ
ブ゙ツブツブツブツブ゙ツブツブツブツ
ブ゙ツブツブツブツブ゙ツブツブツブツ
・・・そや、勝手に帰ってしもたろ
>>919 intは i だけにしかしてませんから、それは違うと思います。i をdoubleにしても同じ結果でした。
実際に計算する値x,yはdoubleなのでそのようなことは無いかと・・・
921 :
920 :2005/10/26(水) 17:25:16
と思ったら、1/2を0.5に変えたらうまくいきました。そういうことだったんですね。 どうみても1/2 = 0 (int)です 本当にありがとうございました。
922 :
名無し :2005/10/26(水) 17:41:06
[1] 授業単元:電卓 [2] 問題文: 入力:二つの10進数(非負の整数、4桁以下で符号無し)を加算記号"+"、減算記号"-"、で連結し最後に等号を付け加えた式を文字列として入力。 操作:入力された文字列から加算記号、減算記号、等号を区切り記号として二つの10進数を文字列として切り出す。 切り出した文字列を数値に変換する。加減算を行って結果を計算。 出力:計算結果を等号"="の後ろに出力。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [2005年10月29日9:00まで] [5] その他の制限:特にはありません。 ちょっとわからないので、よろしくお願いします。
>>922 ろくにエラーチェックもしてないし冗長だと思うから、まぁ参考程度にしてくれ
最近Pascalばっかやらされてて感覚が鈍ってた_| ̄|○
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
char expr[80];
int i, op1=0, op2=0, len, flag = 0;
fgets(expr, 80, stdin);
len = strlen(expr) - 1;
expr[len] = '\0';
for (i=0;i<len;i++) {
if (isdigit(expr[i])) {
if (!(flag & 1)) {
op1 = op1*10 + (expr[i] - '0');
} else {
op2 = op2*10 + (expr[i] - '0');
}
continue;
}
>>923 の続き
if (expr[i] == '+') {
flag |= 1;
flag |= (1<<1);
continue;
} else if (expr[i] == '-') {
flag |= 1;
flag |= (1<<2);
continue;
} else if (expr[i] == '=') {
if (flag & (1<<1)) {
printf("%s %d\n", expr, op1+op2);
} else {
printf("%s %d\n", expr, op1-op2);
}
break;
}
/* Error handling */
puts("Syntax Error!");
return -1;
}
return 0;
}
>>922 ソース貼ってから気づいたが、わざわざ切り出さないとダメだったのか・・・
ちょっと問題有りだが配列2つ用意して、strtokで切り出すのが手っ取り早い希ガス
参考にもならんな・・・_| ̄|○
926 :
904 :2005/10/26(水) 20:25:38
あら、やっぱり言ってることむちゃくちゃなんですか。 ほんとにわけわからん教授でして、、、、 あぁこれはどうしよう・・・
「可変長配列ってリスト構造のこと言ってます?」と聞いてこい。
>>926 問題の言うことは判らんでもないんだが、プログラムの仕様にviかぶれだと思える頭の悪さがある。
また、文言の脳内置換や脈絡の補完が必要な部分もある。
少なくとも問題の文言通りに組める人はまず居ない。
929 :
名無し :2005/10/26(水) 23:12:59
>>925 参考にさせてもらいます。ありがとうございました。
strtokで切り出すと簡単なプログラムになるのですか?
930 :
904 :2005/10/26(水) 23:14:45
ふーむ、なるほど・・・ おっしゃることは飲み込めました。 脳内置換とか想像でも構わないので 骨組みなど作れないでしょうか?(´Д⊂
>>929 別にそんなことは無いと思うが
ただ、俺のソースだと演算子で分けて2つのオペランドを切り出すという行程を経ずに
直に2つのオペランドを数値として取り出してるから要件的にどうかね?と
932 :
名無し :2005/10/26(水) 23:29:27
文字列を数値に変換する過程を省けるということでしょうか? まだ、Cをはじめたばかりなのでこのような質問をしてすみません
>>930 /*
・可変長配列=リスト構造と仮定
・1行あたり最大255文字(改行含む)と仮定
・行の入力が"QUIT"と完全一致した場合に入力終了するものと仮定
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#defineNN256
struct Textdata
{
char textline[NN]; /* 記述する文章の1行分の文字列 NNは1行の最大文字数+1 */
struct Textdata*NextP;/* NextPは次の要素へのポインタ */
};
void cleanup_textdata(struct Textdata *p)
{
struct Textdata *p_sav;
while(p) {
p_sav = p;
p = p->NextP;
free(p_sav);
}
}
934 :
933 :2005/10/26(水) 23:38:01
int main(int argc, char **argv) { struct Textdata *head = NULL, **p = &head; FILE*fp; charfilename[32+4]; scanf("%s\n", filename); strcat(filename, ".txt"); while(1) { if(!(*p = (struct Textdata *)malloc(sizeof(struct Textdata)))) { cleanup_textdata(head); return -1; } fgets((*p)->textline, NN, stdin); if(!strcmp((*p)->textline, "QUIT\n")) { free(*p); *p = NULL; break; } p = &((*p)->NextP); } if(!(fp = fopen(filename, "w"))) { cleanup_textdata(head); return -1; } for(p = &head; *p; p = &((*p)->NextP)) { fputs((*p)->textline, fp); } fclose(fp); cleanup_textdata(head); return 0; }
935 :
default新規 :2005/10/27(木) 00:08:11
すみません。。こんな課題なのですが出来ますでしょうか? 急に単元が進んで、結構ピンチです。。 性能比較というのは、どういうことなのでしょうか? [1] 授業単元: 再帰と木 [2] 環境 Windows VC6.0 [3] 言語:C [4] 期限: [2005年10月27日23:59提出期限なのですが、出来れば23時ぐらいまでに。。] または [無期限] のいずれか (「できるだけ早く」は不可) [5] その他の制限:標準ライブラリ使用可 ★課題★プログラム10 と プログラム11 の性能比較を行え。 【例】 [user@mypc ~] ./a.out 35 f(35)= 9227465 [user@mypc ~] time ./a.out 35 f(35)= 9227465 1.330u 0.032s 0:02.43 55.9% 0+0k 0+0io 0pf+0w ★再帰呼出し版 (プログラム10) int F(int i){ if (i < 1) return 0; if (i == 1) return 1; return F(i-1) + F(i-2);} ★トップダウン動的計画法(プログラム11) int F(int i){ int t; if (knownF[i] != unknown) return knownF[i]; if (i == 0) t = 0; if (i == 1) t = 1; if (i > 1) t = F(i-1) + F(i-2); return knownF[i] = t; } 宜しくお願いします(M_M)
繧ィ繝ウ繧ウ繝シ繝峨☆繧九→隱ュ繧√∪縺吶°?シ?
>>935 実際、どんな呼び出しが行われるか数える。プログラムをちょいと変更して
int F(int i){
static count=0;
printf("i = %d (%d 回目の呼び出し)\n", i, ++count);
:
}
みたいにすれば分かる。で、両方のプログラムについて引数を少しずつ増やしながら
その増え方を見ればいいのでは?
あとは元のプログラムを使って、例にあるように time で実際にかかる時間の伸びを見るとか。
n を入力とした場合、プログラム10は O(2^n)、 プログラム11は O(n) くらいになると思う、多分。
あとはメモリ効率…っていっても、メモリが問題になるような環境だと時間が
洒落になってないだろうなぁ…ということで私は放置。
938 :
default新規 :2005/10/27(木) 06:17:20
有難うございます。実際に、実行すると、どの程度の差が出るものなのでしょうか。 もし、実行された方がいらっしゃいましたら、教えて頂けませんか?
940 :
POPP :2005/10/27(木) 10:27:16
941 :
名無し :2005/10/27(木) 12:44:21
>>931 文字列を読み込み、整数か記号であるかを判断(isalpha,isdegit等)、次に数字を数値変換(strtoi,strtol等)でその後、演算記号に従って計算と言われたので、strtolを使ったプログラムの方をのせていただけないでしょうか?
せっかく、作っていただいたのですが、お願いできないでしょうか?
942 :
デフォルトの名無しさん :2005/10/27(木) 14:06:08
ある整数値を入力し、その値分の整数型データ用のメモリ領域を動的に確保せよ。 次に各領域に順に1、2、3、… の整数を代入した後、それらの値を逆順に表示するプログラムを作成せよ。
セキュリティホール残しっぱの形で
>>942 をエスパーしてみる。
ちゃんと書いて欲しければ
>>1 見ろ。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i,length, *arrray;
scanf("%d",&length);
array=(int*)malloc(length * sizeof(int));
for(i=0;i<length;i++)array[i]=i+1;
for(i=length-1;i>=0;i--)printf("%d,"array[i];
return 0;
}
兄貴すげー力だ・・・ それしかないよ('A`)
>>942 感謝しろ作ってやったぞ
#include <vector>
#include <cstddef>
#include <iostream>
#include <algorithm>
#include <boost/lambda/lambda.hpp>
int main(){
std::size_t length;
std::cin >> length;
int i = 0;
std::vector<int> v;
std::generate_n(std::back_inserter(v), length, boost::lambda::var(i)++);
std::copy(v.rbegin(), v.rend(), std::ostream_iterator<int>(std::cout));
}
最後1行は↓でも
std::for_each(v.rbegin(), v.rend(), std::cout << boost::lambda::_1);
>>940 #include <stdio.h>
#include <string.h>
#define BUF_SIZE 256
int main() {
FILE *fp = fopen("in.txt", "r");
char *key = "keyword";
char buf[BUF_SIZE];
int i, j, l, n, m = strlen(key);
for (l = 1; fgets(buf, BUF_SIZE, fp); ++l) {
int n = strlen(buf);
for (i = 0; i + m < n ; ++i) {
for (j = 0; j < m; ++j)
if (buf[i+j] != key[j]) break;
if (j == m)
printf("%s found in %d.%d\n", key, l, i);
}
}
}
948 :
島野 :2005/10/27(木) 20:25:35
[1] 授業単元:卒研 [2] 問題文(含コード&リンク): RSA暗号の鍵の作成、暗号化、復号化 [3] 環境 [3.1] OS: FreeBSD [3.2] コンパイラ名とバージョン: gcc 3.3.3らしい [3.3] 言語: c [4] 期限: [2005年11月6日24:00まで] [5] その他の制限: あまり知識が無いんで、量が多くてもできるだけ分かりやすくお願いします。
>>948 ネタか?ほんとに卒研ならOpenSSLのソースでも読んで自力でどうにかしろよ
>>948 RSA社によるリファレンス実装(rsarefという名前で出回っているはず)
を参考にするというか丸パクするしかないだろう。
全部で3000行強のソースだ。
ここでの回答は期待しないように。
[1] 授業単元:プログラミングU [2] 問題文: ある整数値を入力し、その値分の整数型データ用のメモリ領域を動的に確保せよ。 次に各領域に順に1、2、3、… の整数を代入した後、それらの値を逆順に表示するプログラムを作成せよ。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ(バージョン):gcc [3.3] 言語:C [4] 期限:10/29まで [5] その他の制限: include <stdio.h> int main (void) { で始めてください。 よろしくお願いします。
954 :
デフォルトの名無しさん :2005/10/27(木) 21:18:13
955 :
953 :2005/10/27(木) 21:19:48
ちなみに僕は942とは別人です。
[1] 授業単元:プログラミング1 [2] 問題文: 文字列strの中に、文字cが含まれている個数(含まれていなければ0とする)を返す 関数 int str_chnum(const char str[],int c) を作成せよ [3] 環境 [3.1] OS:UNIX [3.2] コンパイラ:cc [3.3] 言語:C [4] 期限:30日 [5] その他の制限: 市販のテキストの問題なのですが、 文字cといっているのに仮引数がint c な意味がわかりません。 よろしくお願いします。
int str_chnum(const char str[],int c) { int count=0; char *p=str; for(;*p!='\0';p++){ if(*p==(char)c)count++; } return count; }
Σ(;゚Д゚)const!
960 :
浩輔 :2005/10/27(木) 21:32:14
[1] 授業単元:卒業研究です [2] 問題文(含コード&リンク):フラクタル画像圧縮により生じた画像劣化の復元について。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ(バージョン):gcc [3.3] 言語:どちらでも可 [4] 期限:2005年10月28日12:00まで [5] その他の制限:画像についてまったくの初心者です。画像の反転とA値化処理までは作ることができました。お願いします。
>>956 文字処理関数はEOFを返すものがあったりするのでintで行われることが多い
int str; while ((str = getchar()) != EOF) { putchar(str); } こういうやつだよ int を使うのは。char str でも通るけどね EOF は -1 だから
すごい変数名のつけ方だな
>>956 俺もその本もってるよw
3日前くらいにその問題やったよ
○○○○の極意だろ?
>>958 ありがとうございます。それを参考に
#include<stdio.h>
int str_chnum(const char str[],int c);
main(){
char s[30];
int ch;
printf("文字列を入力\n"); scanf("%s",s);
printf("検索する文字を入力\n"); scanf("%d",&ch);
printf("%d文字あります\n",str_chnum(s[30],ch));
}
int str_chnum(const char str[],int c)
{
int count=0;
char *p=str;
for(;*p!='\0';p++){
if(*p==(char)c)count++;
}
return count;
}
このようにしたのですが、エラーが出ずにコンパイルは通っても、文字列を数えてはくれません。
考えてはいるのですが、なぜ通らないかわかりません。
よろしくお願いします。
>>961-962 ありがとうございます。
>>964 たぶん違うと思います。ナニナニの極意ではないです。
>>965 > printf("%d文字あります\n",str_chnum(s[30],ch));
→printf("%d文字あります\n",str_chnum(s,ch));
scanf("%d",&ch); は scanf("%c",&ch); では?
968 :
956 :2005/10/27(木) 22:14:02
>>966 なんかwarningが出なくなりました。
ありがとうございます。
>>967 int ch
は関数int str_chnumの仮引数なのですが、問題文の文字cをint cで扱うために
int型で入力させています。
正直、問題文の意味がわからないのですが
>>961-962 さんの話のように
とりあえずintで扱ってからcharにキャストしています。
>>965 Σ(´□`;) ハウ
違ったの!?
吊ってきます('A`)
>>953 分かりにくい説明だな…。
取り敢えずこんな感じか?
#include<stdio.h>
int main(void) {
int size = 0;
int *buf;
printf("数値を入力:");
scanf("%d", &size);
if(0 >= size || (buf = (int*)malloc(sizeof(*buf))) == NULL) return 1;
for(i=1; i <= size; i++)
*buf++ = i;
while(*(--buf) != 1) printf("%d, ", *buf);
printf("%d\n", *buf);
return 0;
}
試して無い。
971 :
名無し :2005/10/27(木) 22:48:14
[1] 授業単元:電卓 [2] 問題文: 入力:二つの10進数(非負の整数、4桁以下で符号無し)を加算記号"+"、減算記号"-"、で連結し最後に等号を付け加えた式を文字列として入力。 操作:入力された文字列から加算記号、減算記号、等号を区切り記号として二つの10進数を文字列として切り出す。 切り出した文字列を数値に変換する。加減算を行って結果を計算。 出力:計算結果を等号"="の後ろに出力。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [2005年10月29日9:00まで] [5] その他の制限:文字列を読み込み、整数か記号であるかを判断(isalpha,isdegit等)、次に数字を数値変換(strtoi,strtol等)でその後、演算記号に従って計算
972 :
教えて厨 ◆AU/OjWxByc :2005/10/27(木) 23:05:09
またお前か
974 :
教えて厨 ◆AU/OjWxByc :2005/10/27(木) 23:17:44
170行目にある、 ratio[i] = 4*PI*size[i]/(l*l); この部分でl*lがlの中身がいつも0なためにゼロ除算になって止まってる ような感じがするんですが、どうしてlの中身がいつも0になるの?
975 :
教えて厨 ◆AU/OjWxByc :2005/10/27(木) 23:37:24
ぬおおお、自己解決したっぽい。 どうやらimage_label_inの中身が空っぽの奴をfeaturesに渡してたのが原因。 labelingで出来たimage_labelをちゃんと渡せば無事うごきました。 あとはsprintfでちゃんとデータを表示するようにput(buf)をいれたら 望みどおりに動いたっぽいんだけど・・・でもなぜかデータを吐いた後に 強制終了されて後味が悪いっス・・・なぜこうなるの??
>>974 labeling()ではimage_labelにラベルをセットしている。
features()ではimage_label_inからラベルを読もうとしている。
978 :
977 :2005/10/27(木) 23:46:37
あーなんだ、さすがに自己解決してたか。 で、強制終了はこれが原因。 char buf2;
979 :
教えて厨 ◆AU/OjWxByc :2005/10/28(金) 00:09:33
buf2の何が原因??
長さ1のchar*型にsprintfで文字列をぶち込んでる。
VC7.1にも、BCB6のようなCodeGuardを添付すべきだな。 この手の失敗が目立つ。
982 :
教えて厨 ◆AU/OjWxByc :2005/10/28(金) 00:26:19
むうう。buf2をbuf2[100]に変えてちょっと動かしてみたんだけど、 やっぱ強制終了されちゃうぜよ。buf2を配列にすりゃいいんじゃないの? なにがいけないのよ
>>982 buf2だけじゃなくてbufも配列にした?
985 :
教えて厨 ◆AU/OjWxByc :2005/10/28(金) 00:46:48
>983 featuresの中のbuf2とグローバルのbuf2だけ配列にしたんだけど。 これだけじゃ駄目?どこの箇所をどう直さないといけないかおしえてちょ
>>985 ソースの前の方にあるchar buf; も char buf[100]; ぐらいにしてみな。
987 :
教えて厨 ◆AU/OjWxByc :2005/10/28(金) 01:22:10
>>987 もっかい
>>1 読み直せ。何がどううまくいかないのか。エラーが出るならエラーメッセージをちゃんと書け。
ついでに、○○行目じゃ分からん。どの関数のどの辺とか言ってくれなきゃ、ブラウザには行ラベルが付いてないから。
>>989 行番号のほうが一意特定できるから嬉しいが
991 :
953 :2005/10/28(金) 10:21:59
>>970 すいません、そのプログラムは以下のようなエラーが出ました。
:In function `main':
:8:error: `i' undeclared(first use in this function)
:8:error: (Each undeclared identifier is reported only once
:8:error: for each function it appears in.)
それとヒントがあったので、一応参考までに貼り付けておきます↓
入力された整数値を 50 とすると、50個分の整数型データの動的確保は、
int *ptr;
ptr = (int *)malloc(sizeof(int) * 50);
で行うことができる。このとき ptr はそのデータの先頭アドレスが代入されている。
992 :
デフォルトの名無しさん :2005/10/28(金) 10:24:31
なあ、画像処理系の問題はめんどくさいからどっかまとめサイトに ppmを読み込む所まで作っておいて、メインの処理のみ記述するって事にしないか? ようするに画像処理のテンプレート作ろうぜって話
993 :
デフォルトの名無しさん :2005/10/28(金) 10:26:45
>>991 めんどくさい奴だな。もう少し理解力つけろ。そんなんじゃ社会に出ても使えない奴だぞ
int i;
↑をint *buf;の行の後ろに追加しろ
994 :
953 :2005/10/28(金) 10:31:24
995 :
鈴木 :2005/10/28(金) 10:33:21
PARCOR係数を使っての拡大縮小の仕方を教えてもらえませんか?
黙れ鏑木
997 :
鈴木 :2005/10/28(金) 10:42:59
教えてくれないんですか?
拡大縮小
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。