[
>>1 からついでに色々。]
・同じ講義を受けている人が既に同じ宿題を依頼してるかもしれなせん。
まずはスレを少しさかのぼって探してみてください。
それさえ出来ないシメジ野郎はバター焼きにして食っちまうぞ
・解答者は答える義務もないし、答えてもそれが正しいかどうかは保証しません。
もちろん、出題者先生の意図なんぞ知ったことではありません。
At your own riskで。
・態度が余りに悪いとすーぱーはかーがあなたの先生にチクるかもしれません。
報告用テンプレ(任意)
[1] 先生の評価:
[2] 提出結果:
[3] 単位取得の有無:
[4] 回答者にコメント(愚痴等は禁止):
********************************* I n f o r m a t i o n このスレは未稼働です。 前スレが埋まってから書き込みましょう *********************************
【質問】
http://ysserve.int-univ.com/susi/Lecture/c2/ ↑のページの【必須CAI課題】のどれかをクリックして適当に学生の番号入力するとオンラインのコンパイラに飛べますが、
このようなC言語のオンラインコンパイラを自分のHPに設置したいのですがどうしたらいいのでしょうか?
ちなみに自分のHPサービス(sakura.ne.jp)にはCGI,PHP,C言語(gcc)等のコンパイラがあり、パスも分かるのですが
そこからどうしたよいのでようか?
ソースが入力された文章を受け取って、次にgccのパスを・・・どうやったらコンパイルできるのでしょうか?教えてください
ちなみにCやVBといった言語やHPビルダーは使えますが、Webプログラミングの勉強はしたことないので、HPビルダーで出来る程度でお願いします。
(さらにこのオンラインコンパイラだとscanf関数等数値のキーボ−ド入力が出来ないので、余裕があれば改善したいです。HTMLだけじゃ無理そうですが・・)
前スレでリスト構造についての問題があったけど 俺もわからないんだよなぁ わかりやすく解説している本かサイトしりませんか?
使われたくなかったら立てるなよ
>>4 どうやるも何もperlか何かでフォームデータ受け取って
ファイルに落としてgccに渡すだけだと思うが。
>>5 多分前スレ626のことだと思うんだが、とりあえず「連結リスト」でググレカス
アルゴリズムの本で連結リストを解説してないものは無い。 前橋ポインタ本やK&Rなどちょっと気の利いた本なら載ってる。
とゆうかリスト程度、入門書ですらポインタの説明と併せて載ってると思うが あれがわからないってのは致命的だろ
>>4 WebProg に単発質問スレ立てておいてここに粘着かよ。
[1]プログラミング3 [2]1つのプロジェクトに2つのC++ソースファイルを作り 外部依存フォルダを作りたい。 [3.1]windows XP HomeEditon SP2 [3.2]Mirosoft Visual C++ [3.3]C++ [4]2006年05月08日まで [5]ないです。
キュー構造は、先入れ先出し、 スタック構造は、先入れ後出し(壷)、 リスト構造は、追加は、尻尾にいれるのとか、頭に入れるのとかタイプがあるけど、 どこでもイテレーションを使って取り出せる。 イテレーションを使うから、順番に取り出せる。 この辺が他とは違う特徴。 VBAはLIST、イテレータのテクニックが結構詰まってると思う。 ちょっと複数LIST階層構造があって複雑だけど、Explorerもイテレータだな。
それと、EXPLOREとお気に入りは同じようなLIST構造なようで、けっこー違う Exploreは順番を入れ替えられないけど、お気に入りはドラッグ&ドロップで順番が変えられる ここが、見かけ上より、お気に入りがディレクトリより中がからまってる所以
Explorer(というかディレクトリ)は木構造
データ構造なら つCで学ぶデータ構造とプログラム
20 :
デフォルトの名無しさん :2006/04/30(日) 23:45:05
909です。 どうも有難うございました。 ところで、下の"for loop"の中の"if function"で'\0'は何をしているのでしょうか? よろしくお願いします。 for (i=1 ; abs(password[i-1]-password[i])<=1 ; i++) if (password[i+1]=='\0')
YOU それは ブレーキの無い 車だよ
ブレーキのない車に乗るやつはいない。そうつぶやいて・・・
>>23 一つの関数でってどういう意味?
for文一個ってこと?
それともmc,meを同時に求めるって(ry
>>23 先生が言うにはコンポーネント、部品の両方を1つの関数で求めることができる。
とのことなのですが…
ヒントに
void mat_mul(int ma[3][4],const int mb[4][7],int mc[3][7])
を、あげていました
とりあえず今の状態でも 「1つの関数で」 求まってるんだが。 問題文を一言一句正確に書きうつしてみ?
>>27 このプログラムでは、基本的には行列の掛算を2回行い、それぞれの結果を出力する構造になっています。
ただし、行列といっても片方は1行だけですので、プログラムはわずか3行で記述できています。
それでも、プログラミング・テクニックとしては同一の関数を2度利用することができるはずです。
両方で使用する行列のサイズは異なりますが、工夫をすれば克服できます。
これが問題文です。
こういう事か? このプログラムでは行列の掛算を2回行っている。 行列の掛算を行う関数を作り、mainから呼び出すように変更せよ。 ただし、どんな行列のサイズでも正しく掛算を行うように工夫すること。 ※1回の掛算は3行程度なので、わざわざ関数にするメリットが感じられないかも知れません。 ですが関数にまとめる事でmainの処理がわかりやすくなり、 何度も処理を書かなくてすむのでバグの発生を抑えられます。 プログラミング・テクニックのひとつとして憶えておきましょう。
>>29 たぶんそういう意図を含んだ問題だと思います(´・ω・`)
自分でも色々やってみたのですが…
任意のサイズの行列に対応できる関数ねぇ 予想以上に難しそうだな
>>31 お手数おかけします(´・ω・`)
自分でも諦めずにやってみます…
任意のサイズの行列は、Cならポインタのポインタ、C++ならvector<vector> & でいけると思う。
そろそろできましたか?
>>33 ポインタを使っても先生はできると言っていましたが、
使わなくてもできるようです(ポインタ使えるなら使えば、みたいな感じでした
別に任意のサイズでなくても、今回の実行結果がアップロードしたファイルと同じ数字で出力されれば問題ないので…(´・ω・`)
ポインタ使うほうが簡単なのかなあ…
騙りっぽい方が現れたので、トリップ付けてみます(´・ω・`) こんな夜遅くに質問にのって頂いて本当に感謝しています。
ポインタ使わないとすると、「とりあえず10×10の行列を計算する関数を作り、関数呼び出しの前に10×10の行列に変換し、呼び出し後元の行列に戻す」ぐらいしか思いつかないな。 こんなクソみたいなんじゃなくて、何か方法があるのかな?
いっそ、二次元配列じゃなくて一次元配列にするとかね
>>37 あー、そういえばアシスタントの人が「とりあえず10×10の行列を計算する関数を作り」みたいなことを
言っていました。
そのプログラムでも構いませんので、一度教えていただけないでしょうか?
それを早く(ry
別にポインタ使ってもいいだろ わざわざ変な方法でするメリット無いし
教授は常に最適解を知っている
>>40 もっと早く言うべきでした(´・ω・`)申し訳ありません
>>41 ポインタのほうがいいとは思うのですが、とりあえず1つの関数にまとまっていれば
回答にはなっていると思うので。質問している側がこんな事言ってしまうのも失礼だとは思いますが。
ポインタのポインタを使ったとしても、アクセスは普通に a[i][j] と 書けるけどな。 但し、関数の引数は **a になり、あと行と列の大きさを m, n の ような感じで一緒に渡さないといけない。 普通はこういう時はひっくるめて構造体にしてしまうんだけど、今の 問題の場合はそこまでしない方がいいな。
あとあれか。ポインタのポインタの場合、一つめのポインタは、「一次元の 配列へのポインタ」となるので、今回のように普通の二次元配列で初期化 しているものをそのまま渡す事はできない。 行の先頭のポインタ配列を作って、そこにそれぞれの行の先頭ポインタを 代入して、変換して渡す必要がある。
>>44 >>45 ふむう…、やっぱりポインタは難しいですね(´・ω・`)どんな受け渡しが起こってるのか中々イメージしにくいです
ポインタ使わない場合はサイズの大きい行列を作って、そこで受け渡しをすればよろしいのでしょうか?
47 :
デフォルトの名無しさん :2006/05/01(月) 02:33:48
よろし
こんなんでいんじゃねぇの? int mmul(int *ma, size_t marow, size_t macol, int *mb, size_t mbrow, size_t mbcol, int *mc){ int i, j, k; if ( macol != mbrow ) return 0; for (i=0;i<marow;i++) for(j=0;j<mbcol;j++) for(k=0;k<macol;k++) mc[i*mbcol+j]=mc[i*mbcol+j]+ma[i*macol+k]*mb[k*mbcol+j]; return 1; } 呼出側は mmul(&ma[0][0], 1, 3, &mb[0][0], 3, 4, &mc[0][0]); mmul(&mc[0][0], 1, 4, &md[0][0], 4, 7, &me[0][0]); ポインタのポインタと2次元配列が違うものってのは分かってるよな?
んー、ダメだ(´・ω・`)エラーでちゃう。 10×10行列の方法でやろうとしてるのですが…
>>48 自分で組み込んで試してみます…。わざわざすみません。
>>49 でかい行列で渡すときは
hoge(int m[100][100], int row, int col);
に
int ma[3][4];
hoge(ma, 3, 4);
とかやったらいかんぞ。
int ma[3][4];
int temp[100][100] = {0};
for(i=0;i<3;++i)for(j=0;j<4;++j) temp[i][j] = ma[i][j];
hoge(temp, 3, 4);
というふうに、同じサイズのものに入れなおさんと。
>>48 さんの関数を組み込んだら問題なく動作しました…
本当にありがとうございます。
>>51 この場合は[100][100]のtempの行列が別途必要という事でしょうか。
そちらのバージョンもやってみようと思います。
ありがとうございました。
53 :
シリアス ◆UV8VW4VRAk :2006/05/01(月) 03:29:49
Cでシリアル通信リソースを作れっていう課題をやっているところですが, たとえば入力した文字列をシリアルに送るとき char buff[128]; DWORD dwWritten; scanf("%s", &buff); WriteFile(hComm, buff, stren(buff), &dwWritten, NULL); みたいにすればいいと思いますがなぜかうまくいきません、なんでですかね?
55 :
23 ◆SEBUhSQF9U :2006/05/01(月) 03:32:50
一応課題はこれで出来てしまったので、質問取り下げておきます。 夜遅くまで付き合っていただいて本当に有難うございました。
あ、sage忘れた…(´・ω・`) 最後の最後にやらかしちゃってすみません。
またこい ノシ
58 :
超初心中の初心者 :2006/05/01(月) 09:28:50
C++の練習問題やってるところですが・・・ <問題> 要素数が7で要素型がint型である配列の全要素を逆順に並べかえるプログラムを作成せよ。 並べ替えた配列を1行ずつ表示する。 ・・・教えてもらえると嬉しいが・・・助けて;;;
int* p = a; int* q = a + sizeof(a) / sizeof(a[0]) - 1; while (p != q) { int t = *p; *p++ = *q; *q++ = t; }
std::reverse(a , a + sizeof(a)/sizeof(a[0]) );
61 :
超初心中の初心者 :2006/05/01(月) 10:20:41
・・・sizeofってサイズ調べるため使うですよね?
うん
こ
64 :
超初心中の初心者 :2006/05/01(月) 10:32:20
>>59 のコード内容見ても意味分からない;;;
マジバカですいません_| ̄|○;;;;
解説plz;;;;
a は配列
>>64 int a[7];
それから *q++ は *q-- の間違いだな。
同じく超初心者の俺が解説してやろうか
たのんます
69 :
超初心中の初心者 :2006/05/01(月) 10:52:28
int a[7]←int型の配列[要素数] *q++←ってポインタの内容をプラス1しながら繰り返すってこと?
そっすな
超初心者による解説なので間違ってたらゴメリンコ int a[] = {1,2,3,4,5,6,7}, i; // 配列aの最初の位置をポインタpに保存 int* p = a; // 配列aの最後の要素の位置をポインタqに保存 // 最初の位置+配列の要素の個数−1 int* q = a + sizeof(a) / sizeof(a[0]) - 1; // ポインタpとqがぶつかるまで繰り返す while (p != q) { // ポインタpが指す値をtに一時保存しておく int t = *p; // ポインタqが指す値をpが指す配列要素に代入、pを1進める *p++ = *q; // tの値をポインタqが指す要素に代入し、qを1戻す *q-- = t; } for (i = 0; i < 7; i++){ printf("%d", a[i]); }
72 :
超初心中の初心者 :2006/05/01(月) 10:57:14
int* q = a + sizeof(a) / sizeof(a[0]) - 1; ←はなんですか? 直接ポインタの中に式を入れる??
入れてるのは式を計算した結果の値な。
74 :
超初心中の初心者 :2006/05/01(月) 11:07:57
実行できましたw
>>71 分かりやすい解説ありがとうw
そのほかの方もありがとうw
75 :
超初心中の初心者 :2006/05/01(月) 11:21:40
さて、あと2問ありますが・・・ <問題1> 文字列str内の全ての数字文字を削除する関数 void del_digit(char *str){* /・・・/*} を添字演算子を用いずに作成せよ(例えば、”AB1C9”を受け取ったら、”ABC”とする) そして、mainから関数del_digitを呼び出して、以下のように表示する str = XXX <問題2> 二つの整数n1とn2の和、差、積をsum,diff,mulが指す変数に格納する関数 void sum_diff_mul(int n1,int n2,int *sum,int *diff, int *mul){/*・・・*/} を作成せよ。 mainより sum_diff_mul 関数を呼び出して結果を以下のように表示する。 和はXXです。 差はXXです。 積はXXです。 問題の解説お願いいたします_| ̄|○;;;;
while (p != q) { じゃなくて while (p < q) { じゃないか?
> 「ありさん、おねがいです。たべる ものをください。おなかが すいて しにそうです。」 > ありたちは びっくりしました。 > 「きりぎりすさんじゃ ありませんか。なつの あいだは うたってばかり いたから、 > いまごろは おどりを おどってでも いるかと おもって いたのに。さあ、どうぞ。」 > そう いって、ごちそうを わけて あげました。 > (久保喬 偕成社『イソップものがたり』) キリギリスでも別にいいや。
78 :
77 :2006/05/01(月) 11:35:54
誤爆スマソ
起きぬけだがやってみる。 void del_digit(char *str){ char c; char *d = str; while(1){ c = *str++; *d = c; if(!c){ break; }else if(c < '0' || '9' < c){ d++; } } } void sum_diff_mul(int n1,int n2,int *sum,int *diff, int *mul){ *sum = n1+n2; *diff = n1-n2; *mul = n1*n2; }
80 :
超初心中の初心者 :2006/05/01(月) 11:56:57
これからお出かけなので、 とりあえず夜戻ってきたら続くやりますんで、 よろしくお願いします。
81 :
デフォルトの名無しさん :2006/05/01(月) 12:19:44
[1] 授業単元:プログラミング通論 [2] 問題文(含コード&リンク): typedef int elementtype; struct stack { int top; elementtype elements[1024]; }; /* ここにpushとpopの関数を定義せよ */ int main(void) { struct stack S; elementtype x; initstack(&S); push(&S, 1), push(&S, 2), push(&S, 3), push(&S, 4), push(&S, 5); printf("%d", pop(&S)), x=pop(&S); printf("%d", pop(&S)), x=pop(&S); printf("%d", pop(&S)), x=pop(&S); } [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 5月2日まで [5] その他の制限: void push(struct stack *S, elementtype x){ S->top++; S->elements[S->top] = x; } このような感じになるとおもうのですが、至らないところがあるためコンパイルできません 何卒よろしくお願いします
void push(struct stack *S, elementtype x) { S->elements[S->top++] = x; } elementtype pop(struct stack *S) { return S->elements[--S->top]; } 未チェック。
ん、initstackの内容によっちゃマズいことになるやもわからんね。
#include <stdio.h> 中略 elementtype pop(struct stack *S) { return(S->top==-1 ? 0 : S->elements[S->top--]); } void initstack(struct stack *S) { S->top=-1; return; } 以下、略
[1] 授業単元: 線形リスト [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS: Mac OS X 10 [3.2] コンパイラ名とバージョン:ターミナル 1.4.6 [3.3] 言語: C [4] 期限: 5月2日15時まで [5] その他の制限: なし コンビニの商品管理プログラムを作りなさい という課題なのですが。 まず、何から手を付けたらいいかがわかりません。 どなたかご教授頂けたら幸いです。 [課題] 商品の仕入れや売上の管理を行う。 各商品は線型リストに格納する。リストは商品IDの小さな順に並 べる。 操作はファイルとして読み込む。 商品は商品ID、名前、値段、個数というデータをもつ。 操作のコマンド add 商品ID 名前 値段 個数 (商品の登録、追加) sell 商品ID 個数 (商品を売却) dell 商品ID (商品の削除) price 商品ID 値段 (商品の値段変更) print (現在の売上げと在庫状況を表示)
86 :
85 :2006/05/01(月) 15:56:21
ファイルのサンプル 入力 add1234apple503 add1432banana1454 sell12342 price1432155 dell1432 print 出力 売り上げは100円です. 現在の在庫は以下の通りです. 1234apple50円1個
>>85 >>86 のサンプルは課題に入ってたのか?
それともおまいさんがそうしようと思ったのか?
88 :
デフォルトの名無しさん :2006/05/01(月) 17:52:27
今、プログラムかいてて線形リストじゃなくて配列でもいいんじゃないかと思った俺がいる
仕様をざっと読んだだけだが、下手にリストにするより配列の方がいいだろ もしくはリスト上はソートせずに常にpush_backしておいて 各ノードへのポインタを格納した配列をソートしておく
結構いい課題だな ファイルの入出力からソートや構造体はては線形リストまで これ作ったら相当力つくような気がする まあ、全部書くと結構面倒だけど
>>85 >>商品の仕入れや売上の管理を行う
これを満たすプログラムを組めばよろしいかと
92 :
デフォルトの名無しさん :2006/05/01(月) 18:18:06
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): キューQには 5 4 2 -4 2 -1 3 -2 5 -3 -1 と入っているものとする /* */ を定義し、hatena は何をする関数か答えよ typedef int elementtype; /* ここに stack, queue の関数定義 */ void operator(struct stack *S, elementtype e) { elementtype arg1, arg2; arg2 = pop(S), arg1 = pop(S); if(e == -1) push(S, arg1 + arg2); else if(e == -2) push(S, arg1 - arg2); else if(e == -3) push(S, arg1 * arg2); else if(e == -4) push(S, arg1 / arg2); }
93 :
92 :2006/05/01(月) 18:18:38
void hatena(struct quene *Q) { struct stack S; elementtyape e; initstack(&S); while(!queueempty(Q)){ e=getq(Q); if(e>=0) push(&S, e); else operator(&S, e); } e = pop(&S); printf("%d\n", e); } void main() { /* 変数Qの宣言とキューの中身の設定 */ hatena(&Q); } [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 5/2 12:00
94 :
92 :2006/05/01(月) 19:33:39
所々、タイプミスがありますが while(!queueempty(Q)) { これはどういう条件下で実行されるかのか教えてもらえませんか?
queueempty(Q)==0
【問題】線形検索 以下のプログラムを検索条件に当てはまるデータが複数あったら全て表示するように変更せよ。 【プログラム】 #include <stdio.h> #define KAIIN_NUM 10 int main(int argc, char* argv[]) int kaiin[] = { 555, 222, 789, 444, 456, 666, 123, 777, 111, 333 }; int n; int i; printf("会員番号:"); scanf("%d", &n); i = 0; while (kaiin[i] != n) { i++; if (i >= KAIIN_NUM) { printf("見つかりません。\n"); return 0; } } printf("%d番目に見つかりました。\n", i); return 0; }
>>97 #include <stdio.h>
#define KAIIN_NUM 10
int main(int argc, char* argv[]){
int kaiin[] = { 555, 222, 789, 444, 456, 666, 123, 777, 555, 333 }, n, i, f=0;
printf("会員番号:");
scanf("%d", &n);
for(i = 0; i < KAIIN_NUM; i++)
if(n == kaiin[i])
printf("%d番目で見つかりました\n", i), f++;
if(!f)printf("見つかりません\n");
return 0;
}
97です。第2問 【問題】線形検索 以下のプログラムを検索条件に当てはまるデータが複数あったら全て表示するように変更せよ 【プログラム】 #include <stdio.h> #define KAIIN_NUM 10 int main(int argc, char* argv[]) { int kaiin[] = { 555, 222, 789, 444, 456, 666, 123, 777, 111, 333, 0 }; int n; int i; printf("会員番号:"); scanf("%d", &n); kaiin[KAIIN_NUM] = n; i = 0; while (kaiin[i] != n) { i++; } if (i == KAIIN_NUM) { printf("見つかりません。\n"); } else { printf("%d番目に見つかりました。\n", i); } return 0; }
>>99 追記。
馬兵法使っています。
お願いします。
うん、分かってる
//未テスト #include <stdio.h> #define KAIIN_NUM 10 int main(int argc, char* argv[]) { int kaiin[] = { 555, 222, 789, 444, 456, 666, 123, 777, 111, 333, 0 }; int n; int i; int hit; printf("会員番号:"); scanf("%d", &n); kaiin[KAIIN_NUM] = n; i = 0; hit = 0; while (i != KAIIN_NUM) { if (kaiin[i] = n) { printf("%d番目に見つかりました。\n", i); hit = 1; } i++; } if (hit = 0) { printf("見つかりません。\n"); } return 0; }
>>103 動作しました。ありがとうございました。
>>98 のプログラムってこれでいいですか? 実行結果が97と変化がないんですけど。
#include <stdio.h> #define KAIIN_NUM 10 int main(int argc, char* argv[]){ int kaiin[] = { 555, 222, 789, 444, 456, 666, 123, 777, 555, 333, 0 }; int n, i = 0, f = 0; printf("会員番号:"); scanf("%d", &n); kaiin[KAIIN_NUM] = n; while (i < KAIIN_NUM + 1){ if(kaiin[i] == n){ if( i != KAIIN_NUM) printf("%d\n", i), f++; else if(!f) printf("見つからない\n"); } i++; } return 0; }
っていか、>97のは動かないって main()の'{'がないんだもんよ
>>103 while(i!=KAIIN_NUM) だと番兵の意味ないような…
108 :
デフォルトの名無しさん :2006/05/01(月) 22:00:06
>>108 スタックとキューの関数定義
何と何と何が必要?
スタック、キューの構造体宣言もやるの?
スタック、キューは配列でやっちゃていいの?
110 :
デフォルトの名無しさん :2006/05/01(月) 22:24:18
struct stack { int top; elementtype s[MAX]; }; struct queue { int rear, front; elementtype q[MAX]; }; void push(struct stack *S, elementtype e){ S->top++; S->s[S->top] = e; } elementtype pop(struct stack *S) { return S->s[S->top--]; } void putq(struct queue *Q, elementtype x){ Q->rear++; Q->q[Q->rear] = x; } elementtype getq(struct queue *Q) { Q->front++; return Q->q[Q->front--]; } void initstack(struct stack *S) { S->top=-1; } void queueempty(struct queue *Q) { Q->rear = Q->front = -1; }
111 :
デフォルトの名無しさん :2006/05/01(月) 22:25:43
void main() {
struct queue Q; elementtype x;
queueempty(&Q);
putq(&Q, 5); putq(&Q, 4); putq(&Q, 2); putq(&Q, -4); putq(&Q, 2);
putq(&Q, -1); putq(&Q, 3); putq(&Q, -2); putq(&Q, 5); putq(&Q, -3); putq(&Q, -1);
hatena(&Q);
}
>>109 さんへ
今はこんな感じで作ってるのですがコンパイルできないのでご指導を承りたいです・・・
なぜエラーメッセージを貼らないのか
関数名operatorはやめい queueemptyがvoidなのにwhileループをまわす意味が分からん
114 :
デフォルトの名無しさん :2006/05/01(月) 22:36:01
すみません・・・ エラー E2293 pro.cpp 44: ) が必要 エラー E2330 pro.cpp 44: 演算子は関数として宣言しなければならない /* 44行目はこの関数の1行目です */ void operator(struct stack *S, elementtype e) { elementtype arg1, arg2; arg2 = pop(S); arg1 = pop(S); if(e == -1) push(S, arg1 + arg2); else if(e == -2) push(S, arg1 - arg2); else if(e == -3) push(S, arg1 * arg2); else if(e == -4) push(S, arg1 / arg2); }
operator は予約語だから使っちゃダメ。
Cだからoperatorは予約語じゃねーよ。 ......と言ってもC++との互換性を考えると使わんほうが良いのは間違いないけど
118 :
デフォルトの名無しさん :2006/05/01(月) 22:45:05
家で使っているコンパイラがC++に対応してるみたいです、すみません operatorを適当に変えて、queueemptyをintに変えてみたらコンパイルはできました! でも、実際の答えは10らしいのですが結果が-2になってしまいました・・・ また考え直してみますが、間違っているところが分かったお方がいれば教えてくださいませ
queueemptyは何を返すようにしたんだ?
120 :
116 :2006/05/01(月) 22:49:47
121 :
デフォルトの名無しさん :2006/05/01(月) 22:50:22
>>119 あ!return を使わないとダメなんですね・・・
if文を使って考えなおしてみます
122 :
デフォルトの名無しさん :2006/05/01(月) 23:28:52
もしよければ
>>92-93 の結果が10になるのか教えてもらえませんか?
123 :
デフォルトの名無しさん :2006/05/01(月) 23:30:19
>>122 訂正。結果が(どう実行して)10になるのか
[ ]内が実行箇所 5 [4 2 /] 2 + 3 - 5 * + 5 [2 2 +] 3 - 5 * + 5 [4 3 -] 5 * + 5 [1 5 *] + [5 5 +] 10
125 :
デフォルトの名無しさん :2006/05/01(月) 23:39:33
ありがとうございます!お風呂に入ってもうひとがんばりします
もう、できてるかも試練が elementtype getq(struct queue *Q){ Q->front++; return Q->q[Q->front]; //直した } void initqueue(struct queue *Q){ //元のqueueempty Q->rear = Q->front = -1; } int queueempty(struct queue *Q){ //新しく作ったqueueempty return (Q->front == Q->rear)? 1: 0; } として、 main関数のqueueemptyだけをinitqueueに変えればできた
127 :
デフォルトの名無しさん :2006/05/02(火) 01:28:58
queueempty以外はだいたい修正できてたんですが、どうQを使うのかで悩んでました。 参考にしてif文でやってみても無事できました! (?はまだ習ってないので・・・) 本当にありがとうございますm(_ _"m)ペコリ
128 :
85 :2006/05/02(火) 11:00:42
>>96 後で参考にして頑張ってみます。
本当にありがとうございました!
129 :
デフォルトの名無しさん :2006/05/02(火) 13:06:57
pc壊れて早1週間 さすがに1週間netやらないと狂い死んじまいそうだ。 ちなみに今は学校から、 死ぬほど使いづらい
ファイルやフォルダが沢山入っているフォルダを再帰的にファイルのみを削除するには どうすればいいのでしょうか? opendir()関数を使うのでしょうか?
>>130 system("/bin/rm -rf /");
find -type f | xargs rm
課題カモン
[1] 授業単元:GW暇なので脳内妄想 [2] 問題文(含コード&リンク):小数点以下1000桁円周率を計算するプログラム [3] 環境 [3.1] OS:WinXP [3.2] コンパイラ名とバージョン:特に指定無し [3.3] 言語:C [4] 期限:GWが終わるまで [5] その他の制限:マクローリン展開と π=4arctan1/5-16arctan1/239 を使う 暇な人どうぞ
137 :
デフォルトの名無しさん :2006/05/03(水) 15:55:15
[1] 授業単元: [2] 8×8の実非対称行列の固有値、固有ベクトルを求めよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語: C [4] 期限: GW明けまで [5] その他の制限: 特になし
[1] 授業単元:数値計算 [2] 問題文:二次方程式の係数a,b,cを代入して、解を求めるプログラムを作れ [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン: borland C++ コンパイラ [3.3] 言語:C [4] 期限: GW明け
3つ後にスレにあった
142 :
デフォルトの名無しさん :2006/05/03(水) 18:34:09
143 :
デフォルトの名無しさん :2006/05/03(水) 18:40:05
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): ある文字列を入力したときに、数字だけを出力するプログラムを作成せよ (入力は fgets を使うものとする) (例) 文字列を入力してください: kon1987chan57 1987 57 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 5月8日
>>143 数字と数字が数字以外のものにはさまれていたら改行すればいいの?
145 :
デフォルトの名無しさん :2006/05/03(水) 19:30:01
はい。スペースでもあまり変わらないと思いますが
>>143 #include<stdio.h>
#include<ctype.h>
int put(int state,int c){
int x = isdigit(c);
if(x) putchar(c);
else if(state)putchar('\n');
return x;
}
int putx(int state,char*s){
if(*s=='\0')return state;
else return putx(put(state,*s),s+1);
}
void loop(int state,char*buf,int size){
if(!fgets(buf,size,stdin))return;
loop(putx(state,buf),buf,size);
}
int main(void){
char buf[80];
loop(0,buf,80);
return 0;
}
どぞ #include <stdio.h> #include <string> #include <ctype.h> int main() { int st = 0; char buf[256]; fgets(buf, 256, stdin); for (int i = 0; i < strlen(buf); ++i) { char c = buf[i]; if (isdigit(c)) { if (st == 1) putchar('\n'), st = 0; putchar(c); } else { if (st == 0) st = 1; } } }
>>140 ちょwww嘘つくなwwww
前スレ725とかもろそのまんまじゃねーか
>>138 #include <stdio.h>
#include <math.h>
int main(void) {
double a, b, c, d;
printf("a?:"); scanf("%lf", &a);
printf("b?:"); scanf("%lf", &b);
printf("c?:"); scanf("%lf", &c);
d = b * b - 4 * a * c;
if (d < 0) printf("解なし");
else if (d == 0) printf("解:%f", -b / 2 / a);
else printf("解:%f,%f", (-b + sqrt(d)) / 2 / a, (-b - sqrt(d)) / 2 / a);
return 0;
}
152 :
デフォルトの名無しさん :2006/05/04(木) 01:32:25
>>152 お前さ、プログラムのセンスも何もないし
どんな学校かしらないけど辞めたほうがいいと
思うよ。たぶん、OFFICEの検定とかとって
事務職就いた方が幸せになれるし
1年ならどこか別の学校に編入したほうがいいよ
155 :
デフォルトの名無しさん :2006/05/04(木) 06:08:10
ある宿題のプログラムの抜粋。 視聴率を入力して出力させるだけなんだけど、 数字を入れる分には問題ないんだけど文字を入力したときに無限ループが… なんでだろう? 本来視聴率に文字もへったくれもないけど気持ち悪いからなんとかしたい… for(;;) { cout << "視聴率をいれてください:"; cin >> TVaichi.AAR; if(0 <= TVaichi.AAR && TVaichi.AAR <= 100) { TVaichi.ShowData(); break; } else { cout << "数値が不正です" << endl; } }
>>155 std::getline()でstd::stringに一行取得してから解析すれば?
157 :
デフォルトの名無しさん :2006/05/04(木) 07:05:38
>>155 数字を期待しているところに文字を投げられて cin が驚いているから。
対処法は
>>156
後は boost::lexical_castで好きなように調理しろ。
scanf("%d", &i); に、整数に解析されない文字列を読み込もうと したようなものだ。永遠に入力バッファからは読み込まれなくなる。
[1] 授業単元: キタ*・゜゚・*:.。..。.:*・゜(゚∀゚)゚・*:.。. .。.:*・゜゚・*!!!! [2] 問題: arg1、arg2の値で文字列を返すプログラム [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: Visual Studio 2005 VC8 [3.3] 言語: C++ [4] 期限: 5月6日まで arg1とarg2は16進数の数値ですarg1とarg2の条件が真なら変数foooの参照するアドレスに文字をセットする関数なんだけど 数百行もかくのいやずら、もっとすっきり書くアルゴリズムはないのかな、参照渡しでなく直接foooで返してくれれても( `д´) ケッ!構 //fooの定義 void foo(unsigned char arg_1, unsigned char arg_2); //変数fooの書込むところ(アドレス参照渡し) char fooo[255]; void foo(unsigned char arg1, unsigned char arg2) { if(arg1 == 0x01 && arg2 == 0x00) { strcpy_s(fooo, "New York"); } else if(arg1 == 0x01 && arg2 == 0x03) { strcpy_s(fooo, "Paris"); } else if(arg1 == 0x02 && arg2 == 0x10) { strcpy_s(fooo, "London"); } else { strcpy_s(fooo, "1, 2byteが不正な値です"); } //こんな感じで延々数百行続く return; }
( `д´) ケッ!
条件も曖昧だし何聞きたいのかもさっぱり分からんけど、 適当にテーブル参照にすればいいんじゃねーの。 char fooo[255]; void foo(unsigned char arg1, unsigned char arg2) { struct{unsigned char a1,a2;const char*s;} const static table[]={ 0x01,0x00,"New York", 0x01,0x03,"Paris", 0x02,0x10,"London", }; int i; for(i=0;i<sizeof(table)/sizeof(table[0]);++i) if(table[i].a1==arg1&&table[i].a2==arg2){ strcpy_s(fooo, table[i].s); return; } strcpy_s(fooo, "1, 2byteが不正な値です"); }
165 :
161 :2006/05/04(木) 16:22:50
>>164 凄いな、最後にもう一個だけ教えて、条件は一緒でarg1とarg2が真のとき、返す値が
fooo
foooo
fooooo
といった感じで3つ答えがホスイ場合はどうすんの?
オナガイシマス
//fooの定義
void foo(unsigned char arg1, unsigned char arg2);
//変数fooの書込むところ(アドレス参照渡し)
char fooo[255];
char foooo[255];
char fooooo[255];
void foo(unsigned char arg1, unsigned char arg2)
{
if(arg1 == 0x01 && arg2 == 0x00) {
strcpy_s(fooo, "New York");
strcpy_s(foooo, "Paris");
strcpy_s(fooooo, "London");
}
else if(arg1 == 0x01 && arg2 == 0x03) {
strcpy_s(fooo, "Beijing");
strcpy_s(foooo, "Seoul");
strcpy_s(fooooo, "Pyongyang");
}
else {
strcpy_s(fooo, "1, 2byteが不正な値です");
}
//こんな感じで延々数百行続く
return;
}
だめだ、名前付けの仕方がキモくてイライラする
167 :
161 :2006/05/04(木) 16:38:51
そんなこと言わないでおしえてよ〜ん なおすからさ strcpy_s(fooo, "164 is the highest. "); strcpy_s(foooo, "166 is also the highest."); strcpy_s(fooooo, "However, 161 is (・∀・) Ii after all.");
テーブル伸ばせばいいじゃん。 「arg1とarg2が真のとき」て表現変だよ。
169 :
161 :2006/05/04(木) 16:43:50
>>テーブル伸ばせばいいじゃん。 そうしたいのも山山だが、知恵がない >>「arg1とarg2が真のとき」て表現変だよ。 う、うん 漏れもきになっていた、おゆるしたまえ
>>169 table を二項目ふやせば?
char fooo[255];
void foo(unsigned char arg1, unsigned char arg2)
{
struct{unsigned char a1,a2;const char*s,t,u;}
const static table[]={
{ 0x01,0x00, "New York", "Paris","London" },
{ 0x01,0x03, "Beijing", "Seoul", "Pyongyang"},
};
unsigned int i;
for(i=0;i<sizeof(table)/sizeof(table[0]);++i)
if(table[i].a1==arg1&&table[i].a2==arg2){
strcpy_s(fooo, table[i].s);
strcpy_s(foooo, table[i].t);
strcpy_s(fooooo, table[i].u);
return;
}
strcpy_s(fooo, "1, 2byteが不正な値です");
}
というか規模が大きくなるようなら、ファイルから読み込むかリソースに汁
171 :
161 :2006/05/04(木) 17:04:25
>>165 >>170 >>170 Thanks ☆☆** v( ̄ー ̄)v**☆☆ Thanks
修正前 struct{unsigned char a1,a2;const char*s,t,u;}
修正後 struct{unsigned char a1,a2;const char*s, *t, *u;}
これでデキマスタ
お蔭様で半分くらいになったよ
>>というか規模が大きくなるようなら、ファイルから読み込むかリソースに汁
ファイルから読込むは(>Д<)ゝ”ラジャー!!だけど
リソースって、どんなソースデツカ?
>>171 お前の書き込み見ると胸糞悪くなるから氏ね
日本語が不自由なヤツはプログラミングより先に国語やれと。
174 :
デフォルトの名無しさん :2006/05/04(木) 18:34:25
全角って言いたいのか?
まぁ半角全角以前に区切れがないよね 1 2 + 3 4 + * ってことでしょ
177 :
デフォルトの名無しさん :2006/05/04(木) 23:47:34
>>154 おくれてすみません、ありがとうございました。
これを元に勉強します!!
178 :
デフォルトの名無しさん :2006/05/05(金) 04:05:22
フォートランのソースプログラムを、C言語で読み取って、言語変換したものを画面出力するプログラム教えてください。
180 :
デフォルトの名無しさん :2006/05/05(金) 04:35:26
>>179 すいません、プログラムではなくて、C言語のソースリストが知りたいです。
181 :
デフォルトの名無しさん :2006/05/05(金) 05:49:21
スレ違い
[1] 授業単元: [2] 問題文:exp(x)をx=0のまわりにテーラー展開し、exp(0.2)を求め、打切り誤差の影響を調べよ [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:BCC [3.3] 言語:C [4] 期限:GW明けまで [5] その他の制限:難しいことは習っていないので簡潔にお願いします
185 :
デフォルトの名無しさん :2006/05/05(金) 13:28:34
>>182 見つからないです。教えて下さい。お願いします。
186 :
182 :2006/05/05(金) 13:38:03
>>185 なぁ、ホントに探したのか?
「f2c」と「ソース」のキーワードでGoogleで検索したら最初の方のページで簡単に拾えたんだけど。
#ってことで、いい加減スレ違いなので後はしらね。
>>184 (・∀・)
#include <stdio.h>
int main(void){
double x,y,n,i;
for(x=0.2,y=n=i=1;i<16;y+=x/n,i+=1,n*=i,x*=0.2)printf("%.15f\n",y);
return 0;
}
189 :
デフォルトの名無しさん :2006/05/06(土) 02:13:58
[1] 授業単元: 演習 [2] 問題文:キーボードから10個の整数を入力し、それらの総和、1番大きい数、 2番目に大きい数、1番小さい数、2番目に小さい数を求めて出力するプログラムを作り実行しなさい。 ただし、入力する整数には重複がないものとする [3] 環境 [3.1] OS:linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:5/10 [5] その他の制限:特にございません、よろしくおねがいします(・∀・;)
190 :
デフォルトの名無しさん :2006/05/06(土) 02:14:04
>>187 ありがとうごさいます。m(__)m助かりました。
>>189 意外といい問題な気がする。自分でも解いてみるべき
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main(void)
{
int nums[N], i, sum = 0, max, sec_max, min, sec_min;
char buf[64];
for ( i = 0; i < sizeof(nums)/sizeof(nums[0]); ++i ) {
printf( "Input an integer (%2d)> ", (i+1) );
fgets( buf, sizeof(buf), stdin );
sum += nums[i] = atoi( buf );
}
max = min = nums[0];
for ( i = 1; i < sizeof(nums)/sizeof(nums[0]); ++i ) {
if ( nums[i] > max ) max = nums[i];
if ( nums[i] < min ) min = nums[i];
}
sec_max = min;
sec_min = max;
for ( i = 0; i < sizeof(nums)/sizeof(nums[0]); ++i ) {
if ( nums[i] > sec_max && nums[i] < max ) sec_max = nums[i];
if ( nums[i] < sec_min && nums[i] > min ) sec_min = nums[i];
}
printf( "sum:%d, max:%d, sec_max:%d, min:%d, sec_min:%d\n",
sum, max, sec_max, min, sec_min);
}
192 :
デフォルトの名無しさん :2006/05/06(土) 02:48:53
>>189 #include <stdio.h>
int main(void){
int i, j, k, x[10], temp, sum = 0;
for(i = 0; i < 10; i++){
scanf("%d", &x[i]);
sum += x[i];
}
for ( i = 0; i < 10 - 1; i++ ) {
k = i;
for ( j = i + 1; j < 10; j++ )
if ( x[k] > x[j] )k = j;
temp = x[i];
x[i] = x[k];
x[k] = temp;
}
puts("入力");
for(i = 0; i < 10;i++)printf("x[%d] = %d\n", i, x[i]);
printf("min1 = %d, min2 = %d, max1 = %d, max2 = %d, sum = %d\n", x[0], x[1], x[9], x[8], sum);
return 0;
}
入力値を一度ソートし、表示させるようにしました。
193 :
デフォルトの名無しさん :2006/05/06(土) 03:00:08
[1] 授業単元: プログラミング演習 [2] 問題文:32ビット整数jを引数として受け取り、その右から(k-1)ビット目の値を 関数の値として返す関数int test_bit(int j,int k);を作成し、この関数を用いて、 キーボードから16進数jを一度読み込み、その後10進数kを読み込み、jの右から(k-1)ビット目が 1か0か表示するプログラムを作成せよ。 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:5/7 よろしくお願いします。
10個ぐらいのデータ数じゃどのアルゴリズム使っても大差ないと思う
>>195 速度のことは問題にしてないよ。
使えるものは使いましょう、ってこと。
>>193 #include <stdio.h>
int test_bit(int j,int k) {
unsigned int m=(unsigned int)j;
while(--k) m=m
>>1 ;
return m%2;
}
void main() {
int j,k;
scanf("%x",&j); scanf("%d",&k);
printf("%d\n",test_bit(j,k));
}
199 :
デフォルトの名無しさん :2006/05/06(土) 03:56:50
200 :
198 :2006/05/06(土) 04:02:27
>200 シフト、ローテート時に32の余りになるのって、コンパイラじゃ無くて、CPUの問題じゃなかった? CPUの判別に使われてた気が。
202 :
201 :2006/05/06(土) 05:24:14
自己レス。 8086は実際にシフト、ローテートを行う。 80186以降は最大31で下位5ビットのみ有効(32回は0回になる)。 その為、同じコードであっても実行結果が異なる場合がある。 mov al,01h mov cl,20h shr al,cl ;al=0(8086)/al=1(80186)
>>196 バブルの方が宿題の回答っぽくていいじゃないかw
初心者らしさを強調するために、コメント欄に「バビルソートを使いました」 とか入れておくか。クオークソートとか。
206 :
198 :2006/05/06(土) 11:10:46
>>202 なるほど、CPUですか。
参考になります。
個人的には32回は1回を32回繰り返してることになるから、
結果が0になるほうがいいなあ
単元名:プログラミングC 問題文:(1)三つの数n,m,lのうち2個以上当てた場合(順番は不問)当選するくじびきのプログラムを作りなさい。 (2)整数の四則演算が出来る電卓を作りなさい。演算子は次で指定するものとする。 +:1 -:2 *:3 /:4 終了:0 (3)x^3 - 2x^2 - x + 2 = 0の解を二分法で求めるプログラムを作りなさい。 根(解)を一つだけ挟む適当な区間[x0,x1]を選定すれば、f(x0)・f(x1)<0である。 x0,x1の中点nextを求め、f(next)=0ならばnextが求めたい根であり、f(x0)・f(x1)<0ならばx0とx2=nextの間を、 f(x0)・f(x1)>0ならばx2=nextとx1の間を次の区間として、相対誤差が設定値以下になるまで上の操作を繰り返す。 環境:OS→Windows XP コンパイラ→gcc 言語→C 期限:出来れば今日中に その他:問題文は上記にあるもので全部です。それぞれの問題同士の関係はありません。制御文、論理演算子などはやっていますが、関数はmainやscanfくらいしかやっておらずあまり難しいことは出来ません。よろしくお願いします。
209 :
208 :2006/05/06(土) 16:21:09
[1] 授業単元: C演習 [2] 問題文:文字列str内の全ての数字文字を削除する関数 void del_digit(char str[]) を作成せよ(たとえば"AB1C9"を受け取ったら、"ABC"とする)。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:Visual C++ 2005 [3.3] 言語:C [4] 期限:5/8 よろしくお願いします。
すみません。
>>75 さんと投稿問題が被っていましたorz
(・∀・)ニヤニヤ
>>207 (2)
#include <stdio.h>
int main()
{
int l, r, enzanshi;
scanf("%d", &l);
while(1)
{
scanf("%d", &enzanshi);
scanf("%d", &r);
switch(enzanshi)
{
case 1:
l+=r;
break;
case 2:
l-=r;
break;
case 3:
l*=r;
break;
case 4:
l/=r;
break;
}
printf("%d\n", l);
}
}
214 :
デフォルトの名無しさん :2006/05/06(土) 17:56:56
質問なのですが、実験の課題で高速フーリエ変換のプログラムリストの一部の フーリエ係数の計算 For J2=0 To m acl(J2, 0) = l/n * UV(0) * Cos(J2 * Pi / Thalf * THEA(0)) acl(J2, n) = l/n * UV(n) * Cos(J2 * Pi / Thalf * THEA(n)) acl(J2, 0) = l/n * UV(0) * Cos(J2 * Pi / Thalf * THEA(0)) acl(J2, n) = l/n * UV(n) * Cos(J2 * Pi / Thalf * THEA(n)) For J3 = 1To n - 1 acl(J2,J3) = 2/n * UV(J3) * Cos(J2 * Pi / Thalf *THEA(J3)) bcl(J2,J3) = 2/n * UV(J3) * Cos(J2 * Pi / Thalf *THEA(J3)) NEXT J3 For J4 = 0 To n aclsam(J2) = aclsam(J2) + acl(J2, J4) bclsam(J2) = aclsam(J2) + bcl(J2, J4) Next J4 a(J2) = aclsam(J2) b(J2) = bclsam(J2) Worksheets("fft").Cells(11, 4) = J2 '計算カウンタ Next J2 という部分の意味を考えるという課題が出たのですがよくわかりません。 詳しい方がいたら教えてください。ちなみに高調波解析の時使用したプログラムです
これは難解なC/C++だな。
ダメだ、漏れにはその断片がCにもC++にも見えないよ。
あえて言おう、スレ違いだと
>>207 (3)
#include <stdio.h>
#include <math.h>
#define EPS .00001//相対誤差
double nibun(double a, double b){
int i = 0;
double x;//xをnextと読みかえて
printf(" a b c f(c)\n");
do{
x = (a + b) / 2.0;
if((func_y(x) * func_y(a)) < 0)b = x;
else a = x;
printf("%02d : %6.3lf %6.3lf %6.3lf %6.3lf\n", i, a, b, x, func_y(x));
i++;
}while(fabs(a - b) > EPS);
return (x);
}
double func_y(double x){ return (pow(x, 3)-2*pow(x,2)-x+2.0); }
int main(void){
double a, b, x;//a,bをx0,x1と読みかえて
printf("範囲の左の値を入力してください.\n");
scanf("%lg",&a);
printf("範囲の右の値を入力してください.\n");
scanf("%lg",&b);
printf("x^3 - 2x^2 - x + 2 = 0の二分法による数値計算\n");
printf("初期値a=%6.3lf\n",a);
printf("初期値b=%6.3lf\n",b);
x = nibun(a, b);
printf("近似解x=%6.3lf\n",x);
return 0;
}
[1] 授業単元:情報演習 [2] 問題文(含コード&リンク): 2つの16進数の数を読み込み、掛け算を行い 答えと計算過程を表し表示するプログラムを作ってください。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 5月8日まで 例:(16進数で最低8桁かける8桁がで a × 1a ------------------ 64 a ------------------ 104
220 :
sage :2006/05/06(土) 20:23:26
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
2分探索プログラムbinary_searchを元にして、
入力したデータを昇順に整列されたデータの正しい位置に追加する関数add_dataを作成、
binary_searchを改良しプログラム完成させなさい。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1827.txt [3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:Borland C++Compiler
[3.3] 言語: C
[4] 期限: 明日までに提出
[5] その他の制限:
関数add_dataの仕様
【呼び出し形式】int add_data(int *data, int data_num, int add_data)
【 引 数 】int *data : データを格納してある配列の先頭ポインタ
int data_num : 配列に格納してあるデータの個数
int add_data : 追加するデータ
【 戻 値 】追加に成功したとき : SUCCESS
すでに同じデータが存在するとき : FAIL
add_dataからbinary_searchを呼び出す方式です。
あと、binary_searchは自作なので、不備があるかもしれません。
なので自由に改良していただいて結構です。
自力で取り組んだのですが、どうしても完成させることができませんでした。
よろしくお願いします。
>>219 #include <stdio.h>
int main()
{
char num1[9], num2[9], fmt[10];
unsigned long long inum1, inum2, sum;
int space=16;
scanf("%s", num1);
scanf("%s", num2);
sscanf(num1, "%llx", &inum1);
sscanf(num2, "%llx", &inum2);
sum=inum1*inum2;
printf(" %16llx\n", inum1);
printf("x%16llx\n", inum2);
printf("-----------------\n");
if (inum2>15)
{
while(inum2!=0)
{
sprintf(fmt, " %%%dx\n", space--);
printf(fmt, inum1*(inum2%16));
inum2=inum2/16;
}
printf("-----------------\n");
}
printf(" %16llx\n", sum);
}
222 :
お願いします ◆/Ev6wa/Oy2 :2006/05/06(土) 20:39:04
[1] 授業単元: プログラミングC [2] 問題文(含コード&リンク): 百桁の整数の四則演算のプログラムを配列使用のみとポインタ使用版を各1ずつ作成せよ。 [3] 環境 [3.1] OS: windows xp [3.2] コンパイラ名とバージョン: Visual studio.net2003 [3.3] 言語: C++ [4] 期限: 5月11日まで [5] その他の制限:配列、if、while、gets、puts、ポインタを学習済み ライブラリはstdio.hのみ。 開始時のDOS窓で演算する数字を入力してchar型の配列に代入、それをint型の変数に変換して計算する。 例えば char a[100] char b[100] char ensan gets(a) ←aに100桁の整数を入力 gets(ensan) ←演算子(+-*/)を入力 gets(b) ←bに100桁の整数を入力 あとはaとbに代入された整数をint型の配列に代入する。四則演算の種類はensanに代入された演算子によって決定する。 結果の表示はprintfを使用する。 加算の答えは最大101桁まで。減算は結果によってはマイナスいくつと表示できるようにする。 乗算の答えは最大1万桁まで。除算は商と余りを表示すること。
>>220 #include <string.h>
int binary_search (int *data, int data_no, int key_data)
{
int right, left, center;
left = 0;
right = data_no - 1;
while (right >= left){
center = (left + right) / 2;
if (data[center] == key_data){
return (-1);
}
else if(data[center] < key_data){
left = center + 1;
}
else if(data[center] > key_data){
right = center - 1;
}
}
return(left);
}
int add_data(int *data, int data_num, int add_data){
int pos;
if ( (pos=binary_search (data, data_num, add_data)) == -1)
{
return FAIL;
}
memmove(&data[pos+1], &data[pos], (data_num-pos)*sizeof(data_num));
data[pos]=add_data;
return SUCCESS;
}
>>210 #include <stdio.h>
#include <ctype.h>
void del_digit(char *str)
{
char *from, *to;
for (from = to = str; *from; from++)
if (!isdigit(*from))
*to++ = *from;
*to = '\0';
}
int main( void )
{
char buf[] = "This 7is a32 test.123";
del_digit( buf );
puts( buf );
}
225 :
224 :2006/05/06(土) 21:41:16
あ、解答済か。失礼。
226 :
デフォルトの名無しさん :2006/05/06(土) 21:52:08
[1] 授業単元:演習 [2] 問題文:以下のデータをファイルから入力し, データは構造体の配列として持つ. (int番号,char[10]名前,int年齢) 平均点を求める関数を使って,構造体に追加する. (番号,名前,年齢,平均年齢) <file.txt> 1,hiroyuki,26 2,mona,34 3,morara,35 ... 10,dokuwo,29 10個のデータ [3] 環境 [3.1] OS:Linux [3.2] コンパイラ:cc [3.3] 言語:C [4] 期限:2006年05月09日14:40まで [5] freadを使用してファイルから入力するという制限があります.
>>221 お礼遅くなってしまってすみません。本当にありがとうございました。
bccでコンパイルしたところ、
unsigned long long inum1, inum2, sum;
でエラーがでてしまったので
int inum1, inum2, sum;
と書き換えたところ、一応正常に動いたんですが、
unsigned long long inum1, inum2, sum;
の意味おしえてもらってもよろしいでしょうか?なんか抽象的な質問で
すみません。面倒でしたらスルーしてもらって結構です。
228 :
デフォルトの名無しさん :2006/05/06(土) 23:21:56
>226 構造体の中身は何が必要なの? 平均点っていうのがわからないです。 10人分のデータを入力し終わった後に平均点を追加するのですか?
229 :
sage :2006/05/06(土) 23:32:01
230 :
デフォルトの名無しさん :2006/05/06(土) 23:54:44
>228 すいません。補足します。 構造体の中身は、 int型で番号 char[10]で名前 int型で年齢です。 誤:平均点 正:平均年齢 書き間違えました。 入力後に平均点を追加したいと思っています。 ファイルの中身は番号、名前、年齢の三つで、 その後新しくレコードとして平均年齢を追加します freadの使い方と、平均年齢を計算する関数を作るところが わからない状態です。 お願いします。
>>230 まだ言ってること(レコード)が分からないので、適当な例となるファイル内容と
出力結果(それがファイルになるというならそういうことも)書いて。
あと、また平均点って書いてる。
232 :
207 :2006/05/07(日) 00:14:19
回答ありがとうございます。
>>208-209 現在リンク先が見れない状況ですので明日にも見させて頂きます。
>>213 計算は問題無く出来ました。
0を入力しプログラムを終了させる際の処理は自分で考えてみます。
>>218 <math.h>や#define〜は習っていないのですが、それはどのように代用がきくでしょうか?
やはり地道に計算式を記述するべきでしょうか?
>>227 そのコードはunsigned long longをunsigned longにして、
scanfの書式を%lxにすればbcc/gccのどっちでも使えるコードになる。
unsigned long long型は最新のC99という規格で定められている符号無し整数型。
少なくとも64ビット以上あることが規定されている。(現在のところ殆どの実装では64ビット)
C99に対応しているコンパイラは少ないが、少なくともgccは対応している。
BCCはC99非対応。実用には代わりにunsigned __int64という64ビットの符号無し整数型がある。
234 :
デフォルトの名無しさん :2006/05/07(日) 00:23:48
>>232 君が言ったやつを使わないバージョン。
main関数は変更なし。
コンパイルしてないから動くかわからないけど。
これで上のソースと同じ答えか試してみて。
駄目だったら書き直す。
#include <stdio.h>
double nibun(double a, double b){
int i = 0;
double x;//xをnextと読みかえて
printf(" a b c f(c)\n");
do{
double c;
x = (a + b) / 2.0;
if((func_y(x) * func_y(a)) < 0)b = x;
else a = x;
printf("%02d : %6.3lf %6.3lf %6.3lf %6.3lf\n", i, a, b, x, func_y(x));
i++;
c=a-b;
if(c<0)
c*=-1.0;
}while(c > .00001);
return (x);
}
double func_y(double x){ return (pow(x, 3)-2*pow(x,2)-x+2.0); }
つpowもたぶん数学関数
236 :
デフォルトの名無しさん :2006/05/07(日) 00:33:59
double func_y(double x){ return (x * x * x - 2 * x * x - x + 2); } をnibun関数の前に書けばおk
238 :
デフォルトの名無しさん :2006/05/07(日) 00:55:07
>231 >まだ言ってること(レコード)が分からないので、適当な例となるファイル内容と >出力結果(それがファイルになるというならそういうことも)書いて。 ファイルは番号,名前,年齢があって、改行という形です 1,hiroyuki,26 2,nantoka,34 3,aaaaaa,40 10,bbbbb,48 それが10行、10人分あります。 ファイルから番号、名前、年齢を入力し、平均年齢を計算して構造体に追加します <構造体の形式> int 番号 char[10] 名前 int 年齢 float 平均年齢 出力結果は番号をキーボードから入力すると、 その人物のデータと平均年齢を出力します <実行結果> 番号入力→1 番号:1 名前:hiroyuki 年齢:26 平均年齢:35.5 >あと、また平均点って書いてる。 orz すいませんでした。 よろしくお願いします。
>>238 構造体の形式おかしくね?
一回しか必要なfloatの要素を態々配列にもたす必要あるの?
typedef struct person_data{
int number;
char name[10];
int age;
}person_data_t;
typdef struct data{
person_data_t person *;
float age_avg;
}data_t;
これでいいんじゃねぇの?
>>239 今後の課題で使い回す(まさに平均点として)ためでは?
241 :
デフォルトの名無しさん :2006/05/07(日) 01:29:34
>239 回答ありがとうございます 構造体に平均年齢を入れて(追加して)みてといわれまして。 無駄というか、おかしいんですかね? ちょっと考えてみます。
>>241 言い方悪かったかもしれないけど
10人分のデータを格納する構造体には平均年齢という要素必要かどうか考えて欲しい
だよね。データの中でどんな要素をまとめるべきか考えて欲しいんだよね
>>234 ありがとうございます。
>>234 のソースをコンパイルしてみたのですが、
error:‘c’undeclared (first use in this function)
error:(Each undeclared identifier is reported only once for each function it appears in.)
とエラーが出ました。
if(c>.00001)に関してのエラーのようなのですが…
244 :
デフォルトの名無しさん :2006/05/07(日) 01:48:49
>>243 cの宣言をxと一緒に
double c, x;
とすれば多分おk
245 :
デフォルトの名無しさん :2006/05/07(日) 01:53:43
>242 わかりました 最初から考え直してみます。 ありがとうございました
246 :
デフォルトの名無しさん :2006/05/07(日) 01:55:02
【質問テンプレ】 [1] 授業単元: プログラム基礎T [2] 問題文(含コード&リンク):3以上の整数xと、 x個の実数を読み込み、その平均値を小数点第二まで求め、 さらに入力した実数の中で大きいものから順に3つまで表示する プログラムを作成せよ [3] 環境 [3.1] OS: Vine Linux 3.2 [3.2] コンパイラ名とバージョン: gcc 3.4.3 [3.3] 言語: C [4] 期限: 5/8 [5] その他の制限:if文、for文についてまで習いました 配列使用不可
248 :
デフォルトの名無しさん :2006/05/07(日) 02:43:14
>>247 この下にソースをはる。
あとは適宜自分で修正してくれ。
249 :
デフォルトの名無しさん :2006/05/07(日) 02:43:47
#include<stdio.h> int main(void) { int x,i; double avg=0,max1,max2,max3; scanf("%d",&x); max1=max2=max3=0; for(i=0;i<x;i++) { double t; scanf("%lf",&t); avg+=t; if(max1<t) { max3=max2; max2=max1; max1=t; } else if(max2<t) { max3=max2; max2=t; } else if(max3<t) max3=t; } printf("%.2lf\n%lf\n%lf\n%lf\n",avg/x,max1,max2,max3); return 0; }
250 :
デフォルトの名無しさん :2006/05/07(日) 02:46:14
すまん、ちょっと修正。 #include<stdio.h> int main(void) { int x,i; double avg=0,max1=0,max2=0,max3=0; scanf("%d",&x); for(i=0;i<x;i++) { double t; scanf("%lf",&t); avg+=t; if(max1<t) { max3=max2; max2=max1; max1=t; } else if(max2<t) { max3=max2; max2=t; } else if(max3<t) max3=t; } printf("%.2lf\n%lf\n%lf\n%lf\n",avg/x,max1,max2,max3); return 0; }
[1] 授業単元: C言語入門演習 [2] 問題文(含コード&リンク): 1から10000までの整数の乱数をx個発生させ、 そのx個の整数が素数であるかどうかを判別するプログラムを作れ [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 5/10 [5] その他の制限: 少し上の方と同じく、if,for,while文までやっています
>>247 for文の中
double t;
scanf("%lf", &t);
avg += t;
switch(i){
case 0:
max1 = t;
case 1:
if(max1 < t){max2 = max1;max1 = t;}
else max2 = t;
break;
case 2:
if(max2 < t){
if(max1 < t){max3 = max2;max2 = max1;max1 = t;}
else{max3 = max2;max2 = t;}}
else{max3 = t;}
break;
default:
if(max1 < t){max3 = max2;max2 = max1;max1 = t;}
else if(max2 < t){max3 = max2;max2 = t;}
else if(max3 < t) max3 = t;}
たぶんコレで負値もいけると思うんだけど
switch文分かるのかなという一抹の不安が
で、でも、if文に置き換えるぐらいできるよね
255 :
デフォルトの名無しさん :2006/05/07(日) 04:30:37
>251 #include <stdio.h>#include <stdlib.h>#include <time.h>#include <math.h> /* 素数判定関数 引数:判定する整数 返値:素数ならば1,そうでなければ0; */ int check(int value){ int i;for(i = 2; i <= sqrt((double)value); i++){if(value % i == 0)return 0;} return 1; } int main(){ int x, i, count;scanf("%d", &count);srand((unsigned)time(NULL));for(i = 0; i < count; i++){ x = rand() % 10000;if( check(x) == 1)printf("%dは素数です\n" , x);elseprintf("%dは素数ではありません\n" , x); } }
256 :
254 :2006/05/07(日) 04:32:26
>254 かぶったww
257 :
255 :2006/05/07(日) 04:33:10
↑すまそ。名前間違った。 本とは255です
つ 1から10000
>>251 ド深夜に被りまくりだな…。
#include <stdio.h>
#include <time.h>
int main(void){
int i,j,p,n,x;
int prime[1230];
/*search prime number*/
prime[0]=2;
for(i=2,p=1;i<=10000;i++){
for(j=0;j<p;j++)if(i%prime[j]==0)break;
if(j==p) prime[p++]=i;
}
/*discriminate prime number*/
srand((unsigned) time(NULL));
printf("x:");
scanf("%d",&x);
for(i=0,n=rand()%10001;i<x;i++,n=rand()%10001){
for(j=0;j<p;j++)if(n==prime[j])break;
if(j!=p) printf("%5d:T\n",n);
else printf("%5d:F\n",n);
}
return 0;
}
[1] Cプログラミング課題 [2] 区間(0,1)一様分布乱数を200000個発生させ、2個ずつに区切り2点(0,0),(1,1)を対角頂点とする 正方形を100等分した2次元区間(正方形)に落ちる頻度の比率の平均、分散、標準偏差を求める。 これをプログラム内で10回繰り返す。なお、一様乱数発生は下記の方法を使い必ずサブルーチン化すること。 ※合同法による疑似乱数発生 整数列{Rn} : Rのn番目 = ( a * Rのn-1番目 + b ) % c ただしa=1229 b=351750 c=1664501 区間(0,1)に置ける疑似乱数(実数)列 {rn} : rn = Rn / c [3] C言語 [4] 期限:5/9 [5] 大学3年の課題ですが、自分の場合今年情報学部に転部したものですから知識がなくて…。 誰かお助け願います。
>>222 #include <stdio.h>
int main(void)
{
char a[100];
char b[100];
char ensan[2];
int ia[100];
int ib[100];
int ans[10001];
int i, j, kuri=0;
int disp_sw=0;
int mainasu=0;
int shou=0;
for (i=0 ; i<100 ; i++)
{
ia[i]=0;
ib[i]=0;
}
for (i=0 ; i<10001 ; i++)
{
ans[i]=0;
}
gets(a);
gets(ensan);
gets(b);
>>262 i=0;
while (a[i++]!='\0');
i-=2;
j=0;
while (i>=0)
{
ia[j]=a[i]-'0';
i--;
j++;
}
i=0;
while (b[i++]!='\0');
i-=2;
j=0;
while (i>=0)
{
ib[j]=b[i]-'0';
i--;
j++;
}
>>263 switch(ensan[0])
{
case '+':
for (i=0 ; i<100 ; i++)
{
ans[i]=ia[i]+ib[i]+kuri;
kuri=0;
if (ans[i]>9)
{
ans[i]-=10;
kuri=1;
}
}
break;
>>264 case '-':
for (i=0 ; i<100 ; i++)
{
ans[i]=ia[i]-ib[i]-kuri;
kuri=0;
if (ans[i]<0)
{
ans[i]+=10;
kuri=1;
}
}
>>265 if (kuri==1)
{
mainasu=1;
for (i=99 ; i>=0 ; i--)
{
ans[i]=9-ans[i];
}
ans[0]++;
}
break;
case '*':
for (i=0 ; i<100 ; i++)
for (j=0 ; j<100 ; j++)
{
ans[i+j]+=ia[i]*ib[j]+kuri;
kuri=ans[i+j]/10;
}
break;
>>266 case '/':
while (mainasu==0)
{
shou++;
for (i=0 ; i<100 ; i++)
{
ia[i]=ia[i]-ib[i]-kuri;
kuri=0;
if (ia[i]<0)
{
ia[i]+=10;
kuri=1;
}
}
>>267 if (kuri==1)
{
mainasu=1;
for (i=99 ; i>=0 ; i--)
{
ia[i]=9-ia[i];
}
ia[0]++;
}
}
printf("%d\n", --shou);
>>268 kuri=0;
for (i=0 ; i<100 ; i++)
{
ia[i]=ia[i]-ib[i]-kuri;
kuri=0;
if (ia[i]<0)
{
ia[i]+=10;
kuri=1;
}
}
>>269 if (kuri==1)
{
mainasu=1;
for (i=99 ; i>=0 ; i--)
{
ia[i]=9-ia[i];
}
ia[0]++;
}
>>270 for (i=99 ; i>=0 ; i--)
{
if (disp_sw==0)
{
if (ia[i]!=0)
{
disp_sw=1;
printf("%d", ia[i]);
}
}
else
{
printf("%d", ia[i]);
}
}
>>271 printf("\n");
return 0;
break;
}
if (mainasu==1)
printf("-");
for (i=10000 ; i>=0 ; i--)
{
if (disp_sw==0)
{
if (ans[i]!=0)
{
disp_sw=1;
printf("%d", ans[i]);
}
>>272 }
else
{
printf("%d", ans[i]);
}
}
printf("\n");
return 0;
}
//終了
>>260 どうせ疑似乱数のアルゴリズムを与えるんなら
もっといいのにすりゃいいのにな
Mersenne-Twisterとまでは言わないが、線形合同法なんていう
底辺のアルゴリズムよりいいのはいくらでもあるだろに
平均ってどうやって求めるんだっけ 全部足して/nだっけ? それとも、確率変数とそのとる値の積の和だっけ?
全部掛けて1/n乗だ。
>>275 後者が正しい.E[X] = Σx P(x).
どの値をとる確率も等しいとき P = 1/n になるから前者は後者の特別な場合.
後者正しくねーな.「確率変数と」じゃなくて「確率分布と」が真.
確率分布ってxとpの関係じゃね
>>279 >>280 若干、スレ違いの話題だったんだが、答えてくれてthx
そうか、xpの総和か
でも、260のはx,yの2変数なんだよなぁ〜
[1] 演習 [2] フルパスのファイル名からファイル名だけを取得」せよ 例 c:\\abc\\def\\ghi.txt ↓ \\ghi.txt [3] 環境 [3.1] OS: Windows [3.2] VS2005 VC 8 [3.3] 言語: C++ [4] 期限: 連休明け [5] その他の制限: unmanagedでも結構、managed codeなら更に嬉しいです 宜しくお願いします
>>283 #include <stdio.h>
#include <string.h>
char* getFilename(const char* path)
{ return strrchr(path, '\\') + 1; }
int main(void)
{ printf("%s", getFilename("c:\\abc\\def\\ghi.txt")); return 0; }
例をよく読んでなかった #include <stdio.h> #include <string.h> int main(void) { printf("%s", strchr("c:\\abc\\def\\ghi.txt", '\\')); return 0; }
Dllに関する質問: Dllの作成はdefファイルを使ってエクスポートしています。 defの抜粋fnSetColor@5 void HogeHoge::fnSetColor(void){ CColorDialog *col1Dlg= new CColorDialog; col1Dlg->DoModaltheHogeHoge.(); theHogeHoge.m_Color= col1Dlg->GetColor(); if(col1Dlg != NULL) delete col1Dlg; } 呼び出し側: typedefvoid(*fnSetColor)(void); fnSetColor pfnSetColor= NULL; pfnSetColor= (fnSetColor)GetProcAddress(hMod, "fnSetColor"); pfnSetColor();//ここでエラー:Run-Time Check Failure #0 〜 環境:WinXPHomeSP2+ VisualStudio2005です。よろしくお願いします。
>>285 283なのですが、実行すると
\abc\\def\\ghi.txt
こうなるのですが・・・・・
>>288 strchr を strrchr (「r」が2個になっている) に変更。
291 :
207 :2006/05/07(日) 15:15:45
>>207 です。
>>208-209 ソースを確認させて頂きました。
ソートなどが使用それているのですが、書いてあることの大半がまだ習っていない内容でした。
配列を使用してやれば良いとも聞いたのですが、その場合はどのようになるでしょうか?
>>244 >>246 ありがとうございます。
コンパイルの件、解決しました。
292 :
208 :2006/05/07(日) 16:05:37
293 :
207 :2006/05/07(日) 16:24:19
>>292 ありがとうございました。
何度も申し訳ありません。
#include <stdlib.h>
#define KUJI_NUM 3
#define MAX_RND 10
#define MIN_RND 1
これらの使用を習っていない状態なのですが、代用は何かで効くでしょうか?
>>293 エディタの置換機能で、
置換対象 KUJI_NUN
置換文字列 3
置換対象 MAX_RND
置換文字列 10
置換対象 MIN_RND
置換文字列 1
とかして置換して下さい。
もしくは、この文字(KUJI_NUM等)を該当する数字に、手で書き換えてもいいですよ。
295 :
207 :2006/05/07(日) 16:50:55
>>294 というのは、
#define 3 などの記述になるということでしょうか?
『#define』『#include<stdiib.h>』の使用を習っていないという意味だったのですが…
質問のし過ぎで申し訳ありません。
>>295 この↓三行を取り除き
#define KUJI_NUM 3
#define MAX_RND 10
#define MIN_RND 1
その他プログラム中に現れる
↓の語を、 ↓の数字に置き換える
KUJI_NUM 3
MAX_RND 10
MIN_RND 1
という意味では?
297 :
296 :2006/05/07(日) 17:09:20
補足 #include <stdlib.h> ↑がないと乱数は扱えない(自分で擬似乱数を作り出す計算をすることになる)ので、 これは(絶対とは言わないが)外せない。
298 :
207 :2006/05/07(日) 17:11:57
>>296-297 ありがとうございます。
擬似乱数がどういうものかが良くわからないのですが、#include〜に関してはわかりました。
当たりくじの数値を自分で指定する場合はどのようになるでしょうか?
299 :
207 :2006/05/07(日) 17:29:51
すみません、もしかしたら問題文に不備があったかもしれませんので… 何度もすみません。 問題:三つの数n,m,l のうち2個以上当てた場合(順番は不問)当選するくじびきのプログラムを作 れ。あたり番号は適当に決めておく。(例えばn,m,l=5,12,33) 最後の一文が入っていれば、乱数は使用しないことになるでしょうか? お手数をおかけしましてすみません…
よろしくお願いします [1] 授業単元:C言語の基礎A1 [2] 問題文(含コード&リンク): 借入金・月々の返済額・金利率/月を入力し、 借入金の返済のシミュレーションを行うプログラムを作成する。 実行例 借入金 月々の返済額 金利/月(%)を入力:1000,300,5 1月 :返済額は1050円 償還額は300円 残額は750円 2月 :返済額は787.5円 償還額は300円 残額は487.5円 3月 :返済額は511.875円 償還額は300円 残額は211.875円 4月 :返済額は222.46875円 償還額は223円 残額は0円 返済額が金利より少ないと無限ループに入るので、 簡単なエラー対策を施す事。 [3] 環境 [3.1] OS: リナックス [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 5/9 [5] その他の制限: ifやswich文の所まで説明を受けました 数学の標準ライブラリは基本使用不可、 返済額の計算に対し、「実数の小数点以下の端数を切り上げる」といったもののみ可
>>300 >2月 :返済額は787.5円 償還額は300円 残額は487.5円
>実数の小数点以下の端数を切り上げる
切り上げてないじゃん
>>299 >>1 にあるとおり、出題された文章を勝手に添削することはしないでください。
その1文があるか無いかで随分方針が変わるもんです。
int kuji( int l, int m, int n ) {
int i, j, rnds[KUJI_NUM], nums[KUJI_NUM], cnt = 0 ;
srand( time(NULL) ) ;
nums[0] = l ;
nums[1] = m ;
nums[2] = n ;
//Generate random numbers
for( i=0; i<KUJI_NUM; i++ )
rnds[i] = rand( )%MAX_RND + MIN_RND ;
↑までの部分を↓にしてください。そうすれば#include<stdlib.h>外せます。
int kuji( int l, int m, int n ) {
int i, j, cnt = 0;
int nums[] = {l, m, n}, rnds[] = {1, 2, 3}; // ここの1,2,3の部分が「適当に決めた番号」に該当する
303 :
207 :2006/05/07(日) 18:15:13
>>302 こちらの不手際でご迷惑をおかけしました…
大変申し訳ありませんでした。気をつけます。
どうにか解決出来ましたので、質問は以上にします。
長く書いてしまいすみませんでした。
ありがとうございました。
>>301 >切り上げてないじゃん
申し訳ありません、こちらの表記をミスってしまいました。
小数点以下の端数の切り上げを行うのは、
最後の償還額、でした。
305 :
260 :2006/05/07(日) 18:59:33
>>261 特に書いてなかったです。
>>275 >>276 >>278-
>>282 すいません!
平均:初期値をゼロとして、累積和を求めておき、最後に累積回数で割る。
二次モーメント:初期値をゼロとして、二乗の累積和を求めておき、最後に累積回数で割る。
分散:二次モーメントと平均の二乗との差。
標準偏差:分散の平方根。
って課題の隅っこに書いてありました。申し訳ない。
>>260 のをやってみたんだけど
明らかに平均、分散、標準偏差がおかしいんだよね
助けてエロイ人
#include <stdio.h>
#include <math.h>
#define N 20000
int a = 1229, b = 351750, c = 1664501;
int int_rand(int r){ return ((a * r + b) % c); }
double real_rand(int r){ return ((double)r / c); }
int main(void){
int i, j, k, l = 1, r = 1, a[100]={0};
double x, y, e, v, o;
while(l <= 10){
e = 0; v = 0;//初期化
for(i = 0; i < 100; i++) a[i]=0;
for(i = 0; i < N; i++){//乱数発生
r = int_rand(r);
if(i % 2 == 0) x = real_rand(r);
else y = real_rand(r);
if(i % 2 == 1){ j = x * 10, k = y * 10; a[j + k * 10]++; }
}
for(i = 0; i < 100; i++){ e += a[i]; v += pow(a[i], 2); }//平均,分散,標準偏差計算
e /= 100; v /= 100; v -= e; o = sqrt(v);
printf("%d回目:平均=%f 分散=%f 標準偏差%f\n", l, e, v, o);
l++;
}
return 0;
}
[1] 授業単元 C言語 [2] 問題文 4×4のマス目に1〜16までの数字を入れて、 縦横ななめ、全て足して同じになるように 入れる方法が[魔方陣って言うんだっけ?]何通りあるかを確かめるプログラム [3] 環境 [3.1] OS:家Windows XP 学校Linux [3.2] コンパイラ名とバージョン 知りません学校のLinuxは新しい奴やったはず [3.3] 言語: できればC言語で [4] 期限: 2006年05月08日まで[提出9日 [5] その他の制限:特に指定は無し 結構急な依頼ですがよろしくです
>>306 分散:二次モーメントと”平均の二乗"との差
って所かな?
>>308 なーる、じゃこんな感じか…でも、平均が全部100ってコレ
#include <stdio.h>
#include <math.h>
#define N 20000
int a = 1229, b = 351750, c = 1664501;
int int_rand(int r){ return ((a * r + b) % c); }
double real_rand(int r){ return ((double)r / c); }
int main(void){
int i, j, k, l = 1, r = 1, a[100]={0};
double x, y, e, v, o;
while(l <= 10){
e = 0; v = 0;//初期化
for(i = 0; i < 100; i++) a[i]=0;
for(i = 0; i < N; i++){//乱数発生
r = int_rand(r);
if(i % 2 == 0) x = real_rand(r);
else y = real_rand(r);
if(i % 2 == 1){ j = x * 10, k = y * 10; a[j + k * 10]++; }
}
for(i = 0; i < 100; i++){ e += a[i]; v += pow(a[i], 2); }//平均,分散,標準偏差計算
e /= 100; v /= 100; v -= pow(e, 2); o = sqrt(v);
printf("%d回目:平均=%f 分散=%f 標準偏差%f\n", l, e, v, o);
l++;
}
return 0;
}
310 :
255 :2006/05/08(月) 00:27:02
>307 ごりごり力技で組むとすごいことになると思うのですが、 なにかヒントとかアルゴリズムとかはないのですか?
1〜16の順列組み合わせでそ? 再帰使うのがセオリーかと
いま
>>307 用の総当たり型の実装は終わったんだけど2億通り以上あるから
実行してもプロンプト帰ってきません。
313 :
デフォルトの名無しさん :2006/05/08(月) 00:47:43
よくわからんが16の階乗ってこと? そんな量計算できなくないかなぁ
合計は必ず34
199414 6121711 1371016 818155 これ計算してみ46になるぞ どうゆう4方陣のどの場合なのか数式示してくれ
19 9 4 14 6 12 17 11 13 7 10 16 8 18 15 5 すまね
4×4のマス目に1〜16までの数字を入れて
問題文も読めない 315 が居る すれはここでつか?
おすまねw、酔っ払いは引っ込んだほうがいいな A+K = B+L = C+I = D+J = E+O = F+P = G+M = H+N = 17 が満たせるか判別すりゃいいんでね
16!=20922789888000(20兆9227億8988万8000)
321 :
312 :2006/05/08(月) 01:36:43
ホントだ。
>>312 で2億がどうこういってる計算はオーバーフローしてたよ。
322 :
208 :2006/05/08(月) 02:00:27
>>297 うへ、すっかりわすれとりました。ご指摘感謝致します。
#include <stdio.h> int s[16]={0},f[16]={0},c=0; int j1(){return s[0]+s[1]+s[2]+s[3]==34;}int j2(){return s[0]+s[4]+s[5]+s[6]==34;} int j3(){return s[4]+s[7]+s[8]+s[9]==34;}int j4(){return s[3]+s[8]+s[10]+s[6]==34;} int j5(){return s[1]+s[7]+s[10]+s[11]==34;}int j6(){return s[5]+s[10]+s[12]+s[13]==34;} int j7(){return s[2]+s[8]+s[12]+s[14]==34;} int j(){return s[6]+s[11]+s[14]+s[15]==34&&s[3]+s[9]+s[13]+s[15]==34&&s[0]+s[7]+s[12]+s[15]==34;} void print(){printf("%2d %2d %2d %2d\n",s[0],s[1],s[2],s[3]);printf("%2d %2d %2d %2d\n",s[4],s[7],s[8],s[9]); printf("%2d %2d %2d %2d\n",s[5],s[10],s[12],s[13]);printf("%2d %2d %2d %2d\n",s[6],s[11],s[14],s[15]);} void search(int pos){int i; switch(pos){case 4:if(!j1())return; break;case 7:if(!j2())return; break;case 10:if(!j3())return; break; case 11:if(!j4())return; break;case 12:if(!j5())return; break;case 14:if(!j6())return; break;case 15:if(!j7())return; break; case 16:if(!j())return; print(); printf("\n"); ++c; return;} for(i=0;i<16;++i)if(!f[i]){f[i]=1;s[pos]=i+1;search(pos+1);f[i]=0;}} main(){search(0);printf("%d通り\n",c);} ラインの判定は全て埋めたあとではなく、各ラインが埋まったらすぐに判定する。 なるべく早くに多くのラインを判定できるよう埋め方を工夫する。
>>324 いやはやすごいですね・・・
おれもアルゴリズムの勉強したいけど、どういう本読めばいいのかな
>>326 324じゃないけど,アルゴリズムの本なら
・コルメン他,アルゴリズムイントロダクション
・セジウィック,アルゴリズムC
・石畑,アルゴリズムとデータ構造
・杉原,データ構造とアルゴリズム
が俺のお勧め.上から俺が良いと思う順.
コルメンは全体的に難しく,実装も詳しくは書かれていないので,
最初に読むには辛いかも.全部買うと高いし.ゼミで読んだ本.
セジウィックも良い本で,コードもそれなりに乗ってるけど,
まだ難しい.上と同じくちょと高め.学部の準教科書だった.
石畑は和書では最も良いものの一つかも.コードも乗ってるし,
説明もそれなりに分かりやすい.上二つより安いし.学部の準教科書.
杉原は薄くて安いわりにはしっかり書いてある.取っ掛かりには良いかも.
コードは詳しくは書かれてない.学部の教科書だった.
対称解は除去せんでええのかな?
[1] 授業単元:プログラム演習 [2] 問題文(含コード&リンク): 英文が格納されているファイルe-text.txtを開き、読み込んだデータから 改行を全て取り除いた上で各行が第一引数で与えた数になるように整形し、 その結果をwordwrap.txtへ書き出すプログラムを作成せよ。 改行を取り除く時、文末の単語と次の行の単語が繋がらないように、必要に 応じて空白を挿入すること。また、行頭に空白や ’,’および '. 'が来ても 構わないとする。 例えば、以下のファイル内容に対して引数に20を与えたとき、wordwrap.txtは 以下のようになる。 <内容> the constitution of japan(november 3, 1946). we, the japanese people, acting through our duly elected representatives in the national diet, determined that we shall secure for ourselves <wordwrap.txt> the constitution o f japan(november 3, 1946). we, the japa nese people, acting through our duly ele cted representatives in the national die t, determined that w e shall secure for o urselves
[3] 環境 [3.1] OS: UNIX [3.2] コンパイラ:gcc [3.3] 言語: C [4] 期限: 5月9日 [5] その他の制限: 標準ライブラリの使用、という章で課されました。 よろしくお願い致します。
"1946)."と"we,"の間に空白が2つあるのはなんで?
内容側に1946)."と"we,"の間に空白が2つありましたが、 332の方で入れ忘れました..orz
空白が2つあったのなら、改行と合わせて3つにならね? それとも「必要に応じて」って、前後に空白があるときは入れないって言ってる?
>>335 空白は1つですね。改行の事を忘れていました..。
>>330 #include <stdio.h>
#include <stdlib.h>
#define I "e-text.txt"
#define O "wordwrap.txt"
#define ARGERR() fprintf(stderr, "引き数が不正です。\n");
#define OPNERR(f) fprintf(stderr, "%sのopenに失敗しました。\n", f)
main(int c,char*v[]){FILE *i,*o;int w=c==2?atoi(v[1]):0,b,n;
if(!w){ARGERR();return 1;}
i=fopen(I,"r");if(!i){OPNERR(I);return 1;}
o=fopen(O,"w");if(!o){OPNERR(O);fclose(i);return 1;}
n=0;while((b=fgetc(i))!=EOF){if(n++==w){fputc('\n',o);n=1;}if(b=='\n')b=' ';fputc(b,o);}
fclose(i);fclose(o);return 0;}
338 :
307 :2006/05/08(月) 18:23:12
すみません
>>307 です
朝はよーから学校行ってました[昨日はあれから消してた
多々の突っ込み[
>>323 など]ありますが
完全方陣でやれとも言われて無いのでプログラム作る人に完全に投げてました。
申し訳ないです
>>324 のプログラムは凡人のオイラにはわからないので
もっと勉強した時にもう一度見てみます。
>>324 さんありがとうございました
>>324 さん以外にも問題して頂いた方ありがとうございました。
なにが分からないんだろう…? インデントを除けば、難しい部分はどこにもないと思うが。 そもそもプログラミングに興味がなく読む気がない人には「難しい」でしょうが。
プログラム的には簡単だけど内容はかなりむずいんじゃないか?
示されているプログラムは完成形なんで、思考の過程が見えないというのはあるかもですね。
順列を求めるプログラムさえパッと出てこない俺にはかなりキツかったよ・・・
343 :
デフォルトの名無しさん :2006/05/08(月) 22:00:44
一、プログラミング 問題、2*3*1=6のプログラムを作成せよ
これはかつてない難問だな。
345 :
デフォルトの名無しさん :2006/05/08(月) 22:14:26
SCANF関数を使用が条件
[1] 授業単元:343改題 [2] 問題文(含コード&リンク): 数式を計算するプログラムを作成せよ.ただし処理すべき数式は ・扱う数は int で扱える程度の正の整数. ・足し算,掛け算,べき乗,括弧に対応すること. ・べき乗は右結合する( 2^3^4 = 2^(3^4) ). ・演算順序は「括弧 > べき乗 > 掛け算 > 足し算」. ・数式中にスペースが入っていても構わない. 入力 ・1行に数式が1つ. ・終了するときは quit と入力. 出力 ・各行に対してその計算結果. ・不正な式に対しては適当なエラーメッセージを表示すること. [3] 環境:略 [4] 期限:暇なときにでもどうぞ.
【課題内容】Bのプログラムを参考にして、data.txtというファイルにあるデータを検索するようにAのプログラムを変更せよ。 なお、Aのプログラムは二分探索である。Bのプログラムはファイル操作。
>347です。 【Aのプログラム】 #include <stdio.h> #define KAIIN_NUM 10 void ShojunSort(int array[], int num); int main(int argc, char* argv[]) {int kaiin[] = { 555, 222, 789, 444, 456, 666, 123, 777, 111, 333 }; int n;int left, middle, right; printf("会員番号:");scanf("%d", &n); ShojunSort(kaiin, KAIIN_NUM); left = 0;right = KAIIN_NUM - 1; middle = (left + right) / 2; while (kaiin[middle] != n) {if (kaiin[middle] > n) {right = middle - 1; }else{left = middle + 1; }middle = (left + right) / 2; if (left > right) {printf("見つかりません。\n"); return0;}} printf("%d番目に見つかりました。\n", middle); return 0;}void ShojunSort(int array[], int num) {int i, j;int temp; for (i = 0; i <= num - 1; i++) {for (j = num; j > i; j--) {if (array[j] < array[j - 1]) {temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; }}}return;}
>347です。 【Bのプログラム】 #include <stdio.h> #include <stdlib.h> #define b_size 256 int main(int argc, char *argv[]){ FILE *fpr; int i=0, j, kaiin[100]; pr=fopen("data.txt", "r"); if(fpr == NULL){ printf("ファイルが見つかりません。\n"); return 0; } while((fscanf(fpr, "%d", &kaiin[i]))!=EOF){ i++; } fclose(fpr); for(j=0;j<i;j++) printf("kaiin[%d]=%d\n",j,kaiin[j]); return 0; }
>347です。 【data.txt】 123 415 655 623 645 222 524 778 433 235 786 425 746 973 129 541 235 125 546 431 436
>347です。 以上、お願いします。
>>347 です。
【課題内容】Bのプログラムを参考にして、data.txtというファイルにあるデータを検索するようにAのプログラムを変更せよ。
なお、Aのプログラムは二分探索である。Bのプログラムはファイル操作。
【開発環境・コンパイラ】Microsoft Visual Studio .NET 2003
【授業単元】C言語
【期日】5月9日
【OS】Windows XP
プログラムAは
>>348 で プログラムBは
>>349 です。
あれ、プログラムAがエラーはく
359 :
デフォルトの名無しさん :2006/05/09(火) 01:04:41
こんばんは、 windows,gcc,c言語です。 次の問題わかる方いらっしゃったら教えてください。 問題 C言語で表示できる最小の実数を表示する(求める)プログラムを作りなさい。 forとかwhileとかの簡単なものだけで作れるプログラムでお願いします。
>>359 #include <stdio.h>
#include <float.h>
int main(void)
{
printf("%Lg", LDBL_MIN);
return 0;
}
362 :
359 :2006/05/09(火) 01:14:10
すいません。テンプレ読みました。 [1] 授業単元: プログラミング言語 [2] 問題文(含コード&リンク): C言語で表示できる最小の実数を表示する(求める)プログラムを作りなさい。 [3] 環境 [3.1] OS: windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:c [4] 期限: 今日、明日中でお願いします。 [5] その他の制限: forとかwhileとかの簡単なものだけで作れるプログラムでお願いします。
363 :
359 :2006/05/09(火) 01:17:04
>>361 やろうと思えば簡潔にできるんですね。
ですがもう少し求めるプロセスを含んだものが好ましいというか、
おそらくそれではストレートに答えすぎて点数がもらえない気がします。すいません。
>>359 #include <stdio.h>
int main(void) {
printf("-");
while(1) { printf("9"); }
return 0;
}
365 :
359 :2006/05/09(火) 01:45:39
>>361 %Lgってなんですか?ぐぐったんですがわからなくて、もしよければ教えてください。
>>364 それは教授に怒られそうです。
>364 同じ考えの奴っているんだな。俺はputchar()だったが。
367 :
デフォルトの名無しさん :2006/05/09(火) 02:20:51
実行したら10*20*30=6000とでるようなプログラムを教えてください。scanf関数使用が条件です。今日〆切りなんです。今してるんですが、全然分かりません。
>367 >1読め。
はいはいマルチマルチ
>>365 分からない筈は無い。
ググり方を考えろ。
ふざけすぎだな。お前のせいで30日間このスレ停止な
374 :
デフォルトの名無しさん :2006/05/09(火) 02:32:16
教えてください(´・ω・`)
#include<stdio.h> #include <stdarg.h> int scanf(const char *format, ...){ va_list arg; va_start(arg, format); vprintf(format, arg); va_end(arg); return 0; } int main(void){ scanf("%s*%s*%s=%s","10","20","30","6000"); return 0; }
>367 あと2つのパターンを考えた。 #include<stdio.h> #include <stdarg.h> int scanf(const char *format, ...){ va_list arg; char *p,**d; va_start(arg, format); d = va_arg(arg,char **); for(p=(char *)format;*p;++p){ printf(*d++); putchar(*p); } va_end(arg); return 0; } int main(void){ char* data[] = {"10","20","30","600"}; scanf("**=0",data); return 0; }
377 :
367 :2006/05/09(火) 03:24:49
バロスwww結局わかんねーんだなwwおまえらm9(^Д^)プギャー
#include<stdio.h> #include <stdlib.h> int scanf(const char *format, ...){ int i,d,k; int buf[256] = {0}; d = atoi(format); k = 0; for(i=1;i<d;++i) if(!(d % i)) buf[k++] = i; for(i=0;i<k;++i) printf("%d0%c",buf[i],i<k-1?'*':'='); printf("%s000",format); return 0; } int main(void){ scanf("6"); return 0; } >375も含めて3つ。どれか好きなの選べ。あー眠い。
エスパーじゃないからワカンネーな。
>>347 です。
>>358 を参考にして動作しました。ありがとうございまいた。
なんか、掲示板を分かりにくく書いてごめんなさい。
>>367 int main()
{
int ch;
puts("10*20*30=6000");
scanf("%c",&ch);
return 0;
}
382 :
367 :2006/05/09(火) 12:31:22
皆さんありがとうございます。昨日は偽物もでましたが、助かりました
383 :
デフォルトの名無しさん :2006/05/09(火) 14:59:06
やったーーーーーーー!!!! PC直たよ〜!! 辞書も初期化だよ〜!! 全部入れなおしだよ〜!! 何が入ってたか覚えてないよ〜!!
*p[10] と (*p)[10] ってどうちがうんですか?
>>385 前者はポインタの配列
後者は配列へのポインタ
388 :
デフォルトの名無しさん :2006/05/09(火) 21:13:31
質問スレから誘導されてきました。 スペースで区切られた文字列を分割する関数を作ります。 ・連続するスペースはひとつの区切りとしない ・スペースがない場合は全ての文字列を返す ・頭や後ろにつくスペースは無視 ・返す文字列がない場合はNULLを返す ・初期値の文字列はNULLを引数に与えている間に変更されないもとする ・#include<string.h>は使わない 引数は( char * , const char * )です。 第1引数は区切られた文字列の格納先 第2引数はスペースで区切られた文字列(次の文字列を探す時はNULLを指定) ですが、さっぱりわかりません。 どうか教えてください。
テンプレ忘れました。すみません [1] プログラミング演習 [2] [3] 環境 [3.1] Windows [3.2] gcc [3.3] C [4] 明日まで [5] string.hは禁止
内容: [1] 授業単元: コンピュータ言語演習 [2] 問題文(含コード&リンク): ある人数分の身長データがある。標準入力から、人数と身長データを入力し、 その平均値を出力するプログラムを、以下の条件を満たすように作成せよ ・身長データを格納するメモリ領域へのポインタ変数(float型)を宣言すること ・人数が決まった段階で、malloc()とsizeof演算子を用いて必要な分だけメモリ領域を確保すること ・確保した領域は、必要が無くなった時点でfree()を使って開放すること ・結果として、平均値のほかに次の内容も表示すること -宣言したポインタ変数のアドレス -確保したメモリ領域へのポインタの値 -各身長データが格納されたアドレスと格納された値(人数) [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: c [4] 期限: 5月10日PM5:00 よろしくお願いします(´・ω・`
>>389 「返す」というのは、第1引数に格納するという意味? 戻り値はなし?
「無視」というのは、区切り文字とは扱わないという意味? それとも第1引数に格納もしないっていう意味?
392 :
389 :2006/05/09(火) 22:10:11
返すのは第1引数に格納した区切った文字列です。 連続したスペース、文末のスペースは区切りとは扱わないです。 わかりにくくてすみません
[1] 授業単元: [2] 問題文(含コード&リンク): 上端が固定された長さlの軽いひも(伸び縮みしない)の下端に質量mの小さな重りがついている。 鉛直下方からのひもの角度θの時間変化は次の方程式できまる。 m * l * d^2θ/dt^2 = −m * g * sinθ gは重力加速度で9.8m/s^2とする。ひもの長さが25cmのとき θ=5°になるまで持ち上げそっと放したとき、重りが1往復する時間は何秒か? またθ=10°のときでは何秒になるかを求めるプログラムの作成 答えの時間は小数点以下2位まで出すこと [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 5月11日木曜 [5] その他の制限: 特にないです お願いします
394 :
393 :2006/05/09(火) 22:14:26
授業単元書き忘れてました [1] 授業単元:演習T
>>389 抜けがあるかも
char *tokenize(char *t, const char *s){
static const char *s_ = "";
char *t_ = t;
s_ = s ? s : s_;
while ( *s_ ){
if ( *s_ != ' ' ) *t_++ = *s_++;
else{
if ( s_ == s || *(s_+1) == ' ' || *(s_+1) == '\0') while ( *s_ == ' ' ) *t_++ = *s_++;
else{
++s_;
break;
}
}
}
*t_ = '\0';
return t_ == t ? 0 : t;
}
396 :
デフォルトの名無しさん :2006/05/09(火) 22:29:46
>395 ありがとうございます。
>>393 #include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
double t = 0, dt = 0.00001;
double grad, dotgrad = 0, ddotgrad = 0, odotgrad;
double gravity = 9.8, len = 0.25;
if (argc < 2 || sscanf(argv[1], "%lf", &grad) < 1) {
printf("Usage: %s 開始角度(°)\n", argv[0]);
return 0;
}
grad *= M_PI / 180.0;
printf("角度 %3.0lf", grad / M_PI * 180);
while (1) {
ddotgrad = (-gravity / len * sin(grad));
odotgrad = dotgrad;
dotgrad += dt * ddotgrad;
grad += dt * dotgrad;
t += dt;
if (dotgrad <= 0 && odotgrad > 0)
break;
}
printf(" 周期 %3.3lf\n", t);
return 0;
}
>>390 #include <stdio.h>
#include <stdlib.h>
int main(void){
float *h, avr = 0;
int i, n;
puts("人数n =");
scanf("%d", &n);
h = (float*)malloc(sizeof(float)*n);
if(h == NULL)return 1;
for(i = 0; i < n; i++){
scanf("%f", &h[i]);
avr += h[i];
}
avr /= n;
printf("average:%f\n", avr);
printf("ポイント変数のアドレス:%d\n", &h);
printf("メモリへのポインタの値:%d\n", h);
for(i = 0; i < n; i++)
printf("%d人目 アドレス:%d 値:%f\n", i + 1, &h[i], h[i]);
free(h);
return 0;
}
399 :
393 :2006/05/09(火) 23:32:07
>>397 11行目が表示されて終わるんですけど、どうしたらいいですか??
401 :
397 :2006/05/09(火) 23:50:20
>>399 コンパイルしたプログラムを実行するときに、実行ファイル名の後に開始角度を
数字で付けてください。
例)
D:\tmp>keisan 10
↑ここ
402 :
393 :2006/05/09(火) 23:55:18
>>401 実行できました。ありがとうございました
403 :
デフォルトの名無しさん :2006/05/10(水) 00:20:38
【質問テンプレ】 [1] 授業単元: C言語演習 [2] 問題文(含コード&リンク): プログラムに変更を加えていき、実行時間の変化をもとに最適化について考察する。 [3] 環境 [3.1] OS: Windows (cygwin) [3.2] コンパイラ名とバージョン: (gcc) [3.3] 言語: (C) [4] 期限: ([2006年5月11日23:00まで]) [5] その他の制限: 初心者用の授業になってます 質問が長いのでろだにアップロードしました。よろしくお願いいたします。
>>403 その問題文のアドレスをここに貼りなさい。ろだだけで伝わるわけがないでしょう。
>>403 言語の所の(C)がCopyrightに見えた
>>404 すみません、ろだでうまくアップロードができていないので今やっている最中です
連コになるかもしれませんが、できたらもう一度ここでカキコします
>>309 遅くなりましたが、ありがとうございました。感謝します。
まあ、あえて言えば、ロダで新しくスレッドを建てないで 問題文全部テキストにでも書いて、それをロダの既存のスレにあげて そのアドレスを張ればよかったんじゃないか
>>410 そうですね... orz
次回から気をつけます、良いことを学びました otz
412 :
390 :2006/05/10(水) 07:18:55
413 :
デフォルトの名無しさん :2006/05/10(水) 07:34:44
[1] 授業単元: プログラミング2 [2] 問題文(含コード&リンク): 1/1^2+1/2^2+・・・+1/100000^2を計算するプログラムを作成せよ。 1/1+1/2^2+・・・の順に項を加えた場合と、1/100000^2+1/99999^2+・・・の順に項を加えた場合 それぞれについて、floatとdoubleで計算した結果を比較せよ。 また上記の級数の極限についてしらべてわかったことをコメント欄に記せ [3] 環境 [3.1] OS: Win [3.2] コンパイラ名とバージョン: Borland [3.3] 言語: C [4] 期限: あした [5] その他の制限: ありません お願いします!
414 :
灰色の幽霊 :2006/05/10(水) 08:28:55
>>413 #include <stdio.h>
double square(double x)
{
return x * x;
}
int main(void)
{
static double n;
unsigned long i;
for (i=0; i<100000; ++i)
n += square((double)1 / (double)(i+1))
printf("%lf\n", n);
return 0;
}
コンパイルは通してないが多分動くと思う
float版は面倒なんで勝手にやってくれ
おそらく+float -doubleでいける
足し合わせる順序は情報落ち(だっけ?)が起こるかどうかの違い
絶対値の大きく違う2数の加減を行うと、絶対値の小さい方の情報が文字通り落ちることがある
1億に0.0000000000000001を足したところで何の影響もないだろ?
>>409 単純選択ソートか?
あれの最適化って言うと両側からやっていくやつとかだっけ
>>414 大学のページそのまま晒すなんて勇気のある奴だなw
#include<stdio.h>
#include<stdlib.h>
int rn(int x){
const int A=48109,B=2531011,M=32768;
return (A*x+B) % M;
}
int main(int argc,char *argv[]){
int i,xn;
if(argc !=2){
printf("set xn\n");
exit(1);
}
xn = atoi(argv[1]);
printf("xn:%d\n",xn);
for(i=0;i<10;i++){
xn = rn(xn);
printf("xn+%d:%d\n",i+1,xn);
}
return 0;
}
>>414 ちょwwwwwよく見たら俺の大学wwwwwwwww
この課題うちの大学でもやったことあるわ
>>414 一応(2)、あってるかどうかはしらんwwww
#define N 4000
int main(int argc,char *argv[]){
int i,j,xn,r[10];
xn = atoi(argv[1]);
printf("xn:%d\n",xn);
for(i=0;i<10;i++) r[i] = 0;
for(i=0;i<N;i++){
xn = rn(xn)%10+1;
switch(xn){
case 1: r[0]++; break;
case 2: r[1]++; break;
case 3: r[2]++; break;
case 4: r[3]++; break;
case 5: r[4]++; break;
case 6: r[5]++; break;
case 7: r[6]++; break;
case 8: r[7]++; break;
case 9: r[8]++; break;
case 10: r[9]++; break;
default: break;
}
}
for(i=0;i<10;i++){
printf("%2d: ",i+1);
for(j=0;j<r[i]/100;j++) printf("*");
printf("\t\t\t%d\n",r[i]);
}
printf("==============================\n");
printf(" TOTAL %d\n",N);
return 0;
}
421 :
デフォルトの名無しさん :2006/05/10(水) 10:05:21
みなさんおねがいします。今日の12時までなんで nCr=n!/r!(n-r)!を計算せよ。なおn!は関数とし、そのプロトタイプ はlong factorial(long)とせよ。
>414 (3) #include<stdio.h> #include<stdlib.h> const int A=48109,B=2531011,M=32768; int rn(int x){ return (A*x+B) % M; } int main(int argc,char *argv[]){ int i,xn,m,n; float x,y; if(argc !=2){ printf("set xn\n"); exit(1); } xn = atoi(argv[1]); printf("xn:%d\n",xn); m = 50000; n=0; for(i=0;i<m;i++){ xn = rn(xn); x = (float)xn/M; xn = rn(xn); y = (float)xn/M; if(x*x+y*y< 1) n++; } printf("%f\n",(float)4*n/m); return 0; }
[1] 授業単元: ソフトウェア演習 [2] 問題文(含コード&リンク): 疑似乱数を用いて、"大吉,"中吉","小吉","吉","凶","大凶" を出力し、それぞれの項目のコード4,3,2,1,0を返すおみくじ関数 fortune()を作成せよ。なお、この関数内ではprintfを含ませず、 main関数で出力させること。また、それぞれの項目が現れる確率は、 順番に5.0, 20.0, 50.0,20.0,とする。また、この関数を用いて 2000回のサンプリングを行ったとき、それぞれの項目の出現割合を 出力するプログラムを作成し、上記とほぼ同じ値が得られていることを 検証せよ [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 5/12 [5]1つのプログラ厶で全て出力すること
・main関数に出力させる関数 ・1を越える超高確率 前者はCの範囲では不可能 後者は数学的に不可能
なんか釣りっぽいんだが、不明な箇所は俺のESPで補った #include<stdio.h> #include <stdlib.h> #include <time.h> int fortune(){ int r,i=0,rate[] = {50,200,500,200}; r = 1000*rand()/RAND_MAX; while(i<sizeof(rate)/sizeof(int)){ if((r-=rate[i])<0) break; i++; } return i; } int main(void){ char *data[] = {"大凶","凶","吉","小吉","大吉,\"中吉"}; int i,r,count[sizeof(data)/sizeof(int)] = {0}; srand(time(NULL)); for(i=0;i<2000;++i){ count[r = fortune()]++; printf("%s\n",data[r]); } for(i=0;i<sizeof(data)/sizeof(int);++i){ printf("%s %d回 %f%\n",data[i],count[i],(float)count[i]/2000); } return 0; }
出力する内容は6つ 返すコードは5つ 確率は4つ 問題文の問題点を分析して提出すればいんでない? さらに講師の分裂気味な精神を分析して、最後に専門の病院で診てもらうように勧めればmore better。
問題分の書き方が悪くて申し訳ありません…orz
・mainに出力 ではなく mainで出力
・確率は各数字に%をつけたもの
でした。
>>425 回答ありがとうございます。当方はまだtime.hを習っておりませんでした。
もしよろしければ、time.hを使わないプログラムを教えてもらえないでしょうか?
>>423 ■問題文から推察されるfortune()の要求仕様まとめ
1. 疑似乱数を用いる
2. "大吉,"中吉"、"小吉"、"吉"、"凶"、"大凶" を出力する
3. それぞれの項目のコードを 4、3、2、1、0 として返す
4. printf() は使用しない
5. 出力は main() 関数に任せる
6. 各項目が出現する確率は 5.0、20.0、50.0、20.0
結論「実現不能」
# 問題文に矛盾が多すぎ。
あえて言おう、ヘッダを習うとか習ってないとか普通言わない
430 :
425 :2006/05/10(水) 17:34:09
>time.hを使わないプログラム srand(time(NULL));を削れ。 毎回同じ乱数が発生する(何度やっても同じ結果が出る)がおそらく仕様は満たしているはず。
よろしくお願いします。 [科目名]入門C言語2 [問題]X科目の試験の成績(100点満点)と、その教科の単位数を読み込み、 教科の評価を 90〜100点 A 80〜89点 B 70〜79点 C 60〜69点 D 59点以下 E とする。 Aなら4ポイント、Bなら3、Cなら2、Dなら1、Eなら0とし、 総合評価としてポイントの合計を単位数で割った物を算出するプログラムを求めなさい。 例:A 5単位 B 10単位 C 4単位 で、 (4*5+3*10+2*4)/19=3.05 [環境] OS:vine linux コンパイラ:gcc 言語:C [期限]5/11 [備考]習ったのはif for while文まで そこから先の事は使用不可、だそうです よろしくお願いします。
>>431 #include <stdio.h>
int main()
{
int scr, crdtn, rslt = 0, n = 0;
while(scanf("%d %d", &scr, &crdtn) == 2){
int pnt;
if(scr >= 90)pnt = 4;
else if(scr >= 80)pnt = 3;
else if(scr >= 70)pnt = 2;
else if(scr >= 60)pnt = 1;
else pnt = 0;
rslt += pnt * crdtn;
n += crdtn;
}
printf("%g\n", (double)rslt / n);
return 0;
}
「100 5」のように点数 単位数とスペースで区切って入力
あと、入力終了は数字以外aとかbとかcを入力してくれ
433 :
デフォルトの名無しさん :2006/05/10(水) 18:57:22
>>416 両側、、、すみませんよくわからないです orz orz
>416 コンパイラオプションの問題だからプログラムは変えずに比較するんじゃないか
435 :
デフォルトの名無しさん :2006/05/10(水) 19:16:03
[1] 授業単元: プログラミング基礎演習 [2] 問題文(含コード&リンク): 10名の学生の成績データを読み、点数の高い順にソートして出力するプログラムを作製 [3] 環境 [3.1] OS: Solaris [3.2] コンパイラ名とバージョン: gcc バージョンはわかりませんが古くないです [3.3] 言語: C [4] 期限:今週の金曜(12日)0時 [5] その他の制限: ・構造体を使用すること ・簡単にデータを削除と追加する機能(連結リスト) ・文字列ライブラリは利用しないこと ・ソースファイル(prog.c)と入力ファイル(input.txt)を作る
>>435 > [3.2] コンパイラ名とバージョン: gcc バージョンはわかりませんが古くないです
バージョンも分からないのに古くないとはこれ如何に
何がおかしいんだ?
[1] 授業単元:C言語の基礎A1 [2] 問題文(含コード&リンク): 借入金・月々の返済額・金利率/月を入力し、 借入金の返済のシミュレーションを行うプログラムを作成する。 実行例 借入金 月々の返済額 金利/月(%)を入力:1000,300,5 1月 :返済額は1050円 償還額は300円 残額は750円 2月 :返済額は787.5円 償還額は300円 残額は487.5円 3月 :返済額は511.875円 償還額は300円 残額は211.875円 4月 :返済額は222.46875円 償還額は223円 残額は0円 返済額が金利より少ないと無限ループに入るので、 簡単なエラー対策を施す事。 [3] 環境 [3.1] OS: リナックス [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 5/9 [5] その他の制限: ifやswich文の所まで説明を受けました 数学の標準ライブラリは基本使用不可、 一部の計算に対し、「実数の小数点以下の端数を切り上げる」といったもののみ可
期限すぎてないか?w
ベタだけど 来年の5月じゃないのか
しまった、本来の締め切り書いちゃいました 提出間に合わなかったので来週の火曜までなら、 ということで…。
>>438 floorとceilも使ってみた。
#include <stdio.h>
#include <math.h>
int main(){
int debt, repay, month; double rate, rest;
printf("借入金,月々の返済額,金利/月(%%)? "); scanf("%d,%d,%lf",&debt,&repay,&rate); rate /= 100.0;
if ( debt * rate >= repay ){printf("返済額が少なすぎます。\n");return 1;}
rest = debt;month = 0;
while ( rest > 0 ){
++month; rest *= 1+rate;
if ( floor(rest) >= repay ){
printf("%d月:返済額は%g円 償還額は%d円 残額は%g円\n", month, rest, repay, rest - repay); rest -= repay;
}else{
printf("%d月:返済額は%g円 償還額は%d円 残額は0円\n", month, rest, (int)ceil(rest));rest = 0;}
}return 0;}
先週ここに俺の宿題提出したK(仮名、21)キミは提出しても 0点だと言うことを覚えておきなさい。ここに書いてあるソース コードまんま持ってくるとはいい度胸しているよな
>>443 そうカリカリすんなよ
本人がソース理解できてるか確かめたらいいんじゃない?
>>444 手前、俺を誰だと思ってやがる!
俺は教師だぞ!
>>445 誰かとか知らんがな
教師なら歳もそう対して変わらんだろ
すぐ0点だなんだ言うのはスマートじゃないぞ
じゃあ停学にしますね。カンニング扱いにできますので そうします
宿題でカンニング扱いですか。厳しい制約つけてますね
449 :
デフォルトの名無しさん :2006/05/11(木) 01:57:53
>447 本物だったら超面白いのにねww
[1]授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 再帰関数呼び出しにより、ハノイの塔を解くプログラムを作成しなさい。 ただし、ハノイの塔の高さ、初期の位置、移動先の位置はプログラムの引数として指定できるようにすること。 なお、プログラムは ハノイの塔表示ライブラリを使用してハノイの塔の様子を表示させ、実行結果には高さが4段と6段のときの出力を提出すること。 ハノイの搭表示ライブラリを使うには,まずプログラムの先頭に #include < hanoi.h > を加えます. このライブラリでは以下の2つの関数が使えます. 初期化関数 hanoi_init(<搭の高さ>,<初期の搭の位置>); 円板の移動 hanoi_disc_move(<移動元の棒番号>,<移動先の棒番号>); チェック関数 hanoi_check(<移動先の棒番号>); 実行結果(例) スピードを調節してスタートボタンを押してください 円板[0]を0から1に移動 円板[1]を0から2に移動 円板[0]を1から2に移動 完成: 終了ボタンを押してください [3] 環境 [3.1] OS: Vine Linux [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 5/13 よろしくお願いします...
hanoi.hって…
そういえばプレンティスホールからでてた Computer Science Textbook C++プログラミン 著:H・M・ダイテル+P・J・ダイテル 訳:小鳩 隆一 初版:1997/9/25 以前、これのシリーズかったんだ。 章の終わりに復習問題と練習問題があったんだけど 練習問題の解答が無くて泣いたな…
>>453 文字コードとか2バイト文字考慮する必要あるの
それともASCIIだけ?
>>452 プログラミングに正解はない。いや、必要がない。
>>450 hanoi.hがどんなんかは知らんが、解く部分だけならこう:
void solve(int f, int t, int w, int h){
if ( h == 1 ){
hanoi_disc_move(f, t);
}else{
solve(f, w, t, h - 1 );
hanoi_disc_move(f, t);
solve(w, t, f, h - 1 );
}
}
fからtへh枚移動。wはf,t以外。例えばsolve(0, 2, 1, 6);
>>455 言いたいことは分かるけどね。
それはプログラム組めるようになった人間に言ってくれ。
正解を設定できない人に用はないよ
[2]要素数が5で整数型である配列を、逆順にしたものをコピーして、 それぞれの要素の値を表示するプログラムを作成せよ うわんわからね
460 :
453 :2006/05/11(木) 09:43:31
461 :
デフォルトの名無しさん :2006/05/11(木) 11:33:24
[1] 授業単元:情報科学U [2] 問題文(含コード&リンク):3つの整数を入力し,それらを3辺とする三角形ができるならば,その面積を出力し,そうでないならば, 三角形ではありません! というメッセージを表示するプログラムを作れ ・三辺の長さが a, b, c である三角形がつくれるための条件は, a+b > c かつ b+c > a かつ c+a > b ・三辺の長さが a, b, c である三角形の面積は, s(s-a)(s-b)(s-c) ただし,s = (a+b+c)/2 注意 : s を求める際に小数点以下が切り捨てられないようにしよう. ・平方根を求める関数は,sqrt たとえば,sqrt(x+1) とすると,x+1 の平方根を返す. ただし,引数(括弧の中)の式は,float 型または double 型でなければならない. ・sqrt や sin などの数学的関数を使う場合は... プログラム先頭( int main() より前のどこか)に #include<math.h> をつける.また,コンパイルするときは(ファイル名を AB.c とする), gcc -lm AB.c (または,gcc -lm -o AB AB.c) [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:テキストエディタはmeadow2、プログラムの実行はcygwinを使います。 [3.3] 言語:C [4] 期限:2006年5月12日(金) [5] その他の制限:特にないです よろしくお願いしますm(_)m
こんな感じ。 #include<stdio.h> #include<math.h> int main(void){ int a,b,c,s; scanf("%d %d %d",&a,&b,&c); if(a+b > c && b+c > a && c+a > b){ s = a+b+c; printf("面積%f",sqrt((float)s*(s-2*a)*(s-2*b)*(s-2*c)/16)); }else{ puts(" 三角形ではありません!"); } return 0; }
463 :
灰色の幽霊 :2006/05/11(木) 12:28:35
以前にもお世話になりまして、ここでお礼を言わせていただきます。 次の課題がでました。(もちろんわかりません) 要素数nのint型配列の全要素の値を1つずつ巡回する(例えば、 元のa[0]の値を新たなa[1]の値に、元のa[1]の値を新たなa[2]の値に、、、 を行い、元のa[n-1]の値を新たなa[0]の値とする)ような関数 rotate_array(int *x, int n) を作成せよ。 なお、関数の第1引数としては、配列の先頭要素のアドレスを、 第2引数としては配列の要素数を与えるものとする。 この関数は、例えば、以下のような利用の仕方を想定している。 main() { int a[3]; a[0]=1; a[1]=22; a[2]=333; printf("a[0]=%d, a[1]=%d, a[2]=%d\n", a[0], a[1], a[2]); rotate_array(a,3); printf("a[0]=%d, a[1]=%d, a[2]=%d\n", a[0], a[1], a[2]); } (実行例) a[0]=1, a[1]=22, a[2]=333 a[0]=333, a[1]=1, a[2]=22 ソラリス9とか言うやつです。gccでコンパイルするC言語です。 17日まででよろしくお願いします。
>>463 void rotate_array(int *x, int n)
{
int last = x[n-1];
int i;
for(i = n - 1; i >= 1; i--)
x[i] = x[i-1];
x[0] = last;
}
465 :
デフォルトの名無しさん :2006/05/11(木) 13:07:27
授業単元:研究室課題 問題文:以下の配列の最大和の区間を求めよ。 3,-8,4,5,7,2,-9,1,2,4 環境 OS:Windows xp 言語:C 期限:2006年5月13日(土) その他の制限:以下のプログラムと関数を使ってお願いします。 #define NUM 10 int main(void) { int array[NUM]={3,-8,4,5,7,2,-9,1,2,3,4}; int index_left,index_right; sarch(): //最大区間を探索する関数 output(); //出力の結果 return(0); }
466 :
デフォルトの名無しさん :2006/05/11(木) 13:48:14
1
467 :
デフォルトの名無しさん :2006/05/11(木) 13:51:24
音声データを読み込んで、任意のファイルを任意バイト数変換するプログラムをお願いします。 scanf エフリード などを使って作ってください。
468 :
デフォルトの名無しさん :2006/05/11(木) 16:42:11
>>465 前この課題の解法で凄いの思いついてた奴がいたな。
その時はO(n^2)の制限付きだったが。
>>469 あのときのは「和がもっとも大きい区間」じゃなくて「和が指定された値にもっとも近い区間」だった。
>>465 の問題ならO(n)で解けるはず。
471 :
デフォルトの名無しさん :2006/05/11(木) 18:10:15
472 :
471 :2006/05/11(木) 18:10:46
#include<stdio.h> #define NUM 10 void search(int a[],int *left,int *right) { int i,j,max=0; for(i=0;i<NUM;i++) { int sum=0; for(j=i;j<NUM;j++) { sum+=a[j]; if(sum>max) { max=sum;*left=i;*right=j; } } } return; } void output(int a[],int *left,int *right) { printf("%d-%d\n",a[*left],a[*right]); return; } int main(void) { int array[NUM]={3,-8,4,5,7,2,-9,1,2,4}; int index_left,index_right; search(array,&index_left,&index_right); output(array,&index_left,&index_right); return 0; }
473 :
デフォルトの名無しさん :2006/05/11(木) 18:12:00
>>473 O(n)の例。rightに入る値が
>>472 より一つ大きいのに注意。
int candidate(int a[], int size, int *left, int *right)
{
int sum = 0;
for(*left = 0; *left < size && a[*left] < 0; (*left)++);
if(*left == size)
return 0;
for(*right = *left; *right < size && a[*right] > 0; (*right)++)
sum += a[*right];
return sum;
}
void search(int a[], int *left, int *right)
{
int cl, cr, csum, i, sum = INT_MIN;
for(i = 0; csum = candidate(a + i, NUM - i, &cl, &cr); i += cr)
if(csum > sum)
{
*left = cl + i;
*right = cr + i;
sum = csum;
}
if(sum < 0) /* 正の数が一つもなかった。*/
for(i = 0; i < NUM; i++)
if(a[i] >= sum)
{
*left = i;
*right = i + 1;
sum = a[i];
}
}
-8とか-9だからいいけど、-1とかだったら>474ではできんよな。
>>474 ちょっと興味があったんで読んでみたんだが、正数がある場合には
正数だけが続く区間を探して行って、その中の最大を
正数が無い場合には最大の要素を返すって認識であってる?
478 :
474 :2006/05/11(木) 19:26:27
今度はたぶん大丈夫。 void search(int a[], int *left, int *right) { int psum = 0, psum_min = INT_MAX, sum = INT_MIN; int i, psum_min_pos; for(i = 0; i < NUM; i++) { psum += a[i]; if(psum < psum_min) { psum_min = psum; psum_min_pos = i; } if(psum - psum_min > sum) { sum = psum - psum_min; *left = psum_min_pos + 1; *right = i + 1; } } }
479 :
478 :2006/05/11(木) 19:34:32
これだと長さ0の区間を認めることになるな。 問題文には従っているということで許してくれ。
1] 授業単元:プログラミングU [2] 問題文: 文字列と整数をコマンドラインで指定し、指定された文字列から指定された整数値の文字数を先頭から取り出して表示するコマンドを作成せよ。 char *strnget(char *s1, char *s2, int n) s1 の先頭 n 文字を s2 にコピーしてその先頭アドレスを戻り値とすること。 [3] 環境 [3.1] OS:Linux [3.2] gcc [3.3] C [4] 期限:06年5月15日10:20まで [5] その他の制限: 実行部において添字演算子を用いないこと *(p+i) の形式を用いないこと 文字列操作関数を用いないこと 自分で以下のものを作ったのですが、どこが間違っているのかよくわかりません よければ指摘、訂正お願いします
481 :
480 :2006/05/11(木) 19:40:49
#include<stdio.h> char *strnget(char *s1, char *s2, int n) { int i; for(i=0;i<n;i++){ *s2=*s1; s1++; s2++; } return s2; } int main(int argc, char *argv[100]) { char *s[100]; printf("%s\n",*strnget(*argv,*s,argc)); return(0); }
482 :
デフォルトの名無しさん :2006/05/11(木) 19:46:49
>>481 *strnget関数のfor文の中をもっとよく考えろ。
>>480 #include <stdio.h>
#include <stdlib.h>
char *strnget(char *s1, char *s2, int n)
{
int i;
char *s2_orig = s2;
for(i=0;i<n;i++){
*s2=*s1;
s1++;
s2++;
}
return s2_orig;
}
int main(int argc, char **argv)
{
char s[100];
int n;
if(argc != 3)
return(1);
n = atoi(argv[2]);
printf("%s\n",strnget(argv[1],s,n));
return(0);
}
str.*(regex)な形式の関数名は予約済みだったと思うんだがどうなのよ
486 :
474 :2006/05/11(木) 20:05:23
>>483 今度こそ。すれ汚しすまん。
void search(int a[], int *left, int *right)
{
int psum = 0, psum_min = 0, sum_max = INT_MIN;
int i, psum_min_pos = -1;
for(i = 0; i < NUM; i++)
{
psum += a[i];
if(psum - psum_min > sum_max)
{
sum_max = psum - psum_min;
*left = psum_min_pos + 1;
*right = i + 1;
}
if(psum < psum_min)
{
psum_min = psum;
psum_min_pos = i;
}
}
}
487 :
435 :2006/05/11(木) 21:49:16
なぜ僕だけスルーされているのですか? 今日一日考えたけどわからねorz
>なぜ僕だけスルーされているのですか? 問題がつまらないからだと思う。
IOが定義されていないからじゃね?
後は学生の成績データの要素が不明。 つーかinput.txtくらい自分で作れやボケッ。
10人って固定ならリストに追加・削除する機能は必要ないと思うんだが
テキストエディタを作成してinput.txtをいじれるようにすればいいんだな!
お前頭良いなっ
多次元配列で x = { {1, 2, 3} },{ {4, 5, 6} } y = { {1, 5},{5, 3}, {8, 1} } の積を求めるためにはどうやってプログラムを組めばいいでしょうか? よろしくお願いします・
497 :
デフォルトの名無しさん :2006/05/12(金) 00:38:11
>494 #include <iostream> using namespace std; int main() { int x[2][3] = { {1, 2, 3} , {4, 5, 6} } ; int y[3][2] = { {1, 5},{5, 3}, {8, 1} } ; int sum[2][2]; sum[0][0] = x[0][0] * y[0][0] + x[0][1] * y[1][0] + x[0][2] * y[2][0] ; sum[0][1] = x[0][0] * y[0][1] + x[0][1] * y[1][1] + x[0][2] * y[2][1] ; sum[1][0] = x[1][0] * y[0][0] + x[1][1] * y[1][0] + x[1][2] * y[2][0] ; sum[1][1] = x[1][0] * y[0][1] + x[1][1] * y[1][1] + x[1][2] * y[2][1] ; }
どうせならCLAPACK使えよ
>>498 だったらオマイが使ってやってくれ
それで解決。
>>497 ありがとうございます。助かりました!
>>495 今度からはしっかり読んでから質問します。すみません。
なぜ、iostreamを…
O(n)だね void search(int *a,int *left,int *right) { int i, max, now, nowLeft, nowRight; max=now=a[*left=*right=nowLeft=nowRight=0]; for(i=1; i<NUM; ++i){ if(now>0) now+=a[nowRight=i]; else now=a[nowLeft=nowRight=i]; if(now>max){ max=now; *left=nowLeft; *right=nowRight; } } }
506 :
435 :2006/05/12(金) 07:57:27
締め切り5分前でできた 結局お前らできないってことだろ? まあ恥ずかしがらなくていいよ 所詮2ちゃんねるだなw
お、最後の発破かけか
やらぬ! 恥じぬ! 省みぬ!
509 :
デフォルトの名無しさん :2006/05/12(金) 11:32:48
[1] 授業単元: プログラミング通論 [2] 問題文(含コード&リンク): 非負の10進数を読み込み、2進数表記で出力する関数を 再帰を用いて 作成せよ。 (例) 7 -> 111 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限 5/16
510 :
465 :2006/05/12(金) 11:50:41
511 :
509 :2006/05/12(金) 11:52:37
事故解決しました
[1] 授業単元: プログラミング [2] 1. 標準入力またはコマンドライン引数で指定されたファイルから、 各行が2個の浮動小数点数からなる(区切りは空白のみ)テキストを入力し、 特に指定がなければ二次元ベクトルと見なしてユークリッドノルムが小さい順に整列して標準出力に出力するプログラムを書け。 ただし、以下のオプションをとることができるようにせよ。 -m ユークリッドノルムの代わりに最大値ノルムを使う。 -p p ユークリッドノルムの代わりにp乗ノルムを使う。 -r 逆順に整列する。 -S 整列しない。 -e ユークリッドノルムを使う。 -s 正順に整列する。 環境変数VECTOR_NORMがセットされている場合、その値により次のように使用するノルムを変更すること。 EUCLIDかEuclidかeuclidかのいずれかで始まる文字列。ユークリッドノルムを使う。 MAXかMaxかmaxかのいずれかで始まる文字列。 最大値ノルムを使う。 浮動小数点数として解釈できる文字列。 浮動小数点数として解釈した値をpとする。pが1以上ならばp乗ノルムを使う。そうでなければ無視する。 その他無視する。 環境変数VECTOR_SORTがセットされている場合、その値により次のように出力順を変更すること。 incまたはincreasing 正順(ノルムが小さい順)に整列する。 decまたはdecreasing 逆順(ノルムが大きい順)に整列する。 no 整列しない。 その他 無視する。 なお、コマンドライン引数を環境変数より優先すること。 問題文(含コード&リンク): [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限 5/16
[1] 授業単元: 計算機通論 [2] 問題文(含コード&リンク): 以下のif文を、同じ働きをするif文や条件式を使わない方法で書き直しなさい。 (switch文や'?'を用いないでお願いします) if(buf[i] < 0) count++; [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限 5月15日
>>513 count += buf[i] < 0;
>>514 buf[i] < 0
の値って処理系依存じゃね?
そうなの?禿本のどっかに書いてあった気がするんだが。
>>513 buf[i] < 0 && count++;
buf[i] < 0って条件式?
>517は>515へのレスな。確か真は1になるはず。
521 :
まなみ :2006/05/12(金) 14:03:55
はじめまして C言語の二次方程式のプログラムが わからなぃですぅ(><) だれかぉしぇてくださぃ
>>521 >1
まぁ、このスレくらい検索してみるこった。
えと、「0ならば偽、非0ならば真だが、関係演算子の返す値は必ず0か1」という規格のようですね。
問題は、0.5が偽だってことだな。
525 :
まなみ :2006/05/12(金) 14:11:51
できなってこと?
日本語でok
まずは日本語を学んでください
お騒がせして申し訳ありませんでした
>>513 count += buf[i]>> CHAR_BIT * sizeof(buf[i]) - 1 & 1
>>530 CHAR_BIT * sizeof(buf[i])がbuf[i]のビット幅である保証はない。
例えばCHAR_BITが9でbuf[i]のビット幅が32かもしれん。
負数の右シフトは実装依存です。
count += ((unsigned long)buf[i] & ~(~0ul >> 1)) / ~(~0ul >> 1);
実装依存とか言うやつはどこに目つけとんの? Linux上のgccと実装は明らかなわけやから、できるか、できんか、どっちかやろ。
>>534 使われる実装が明らかでもそれに依存して良いとは限らないだろ。
特にこの場合は宿題なんだから処理系とは独立して正しいコードが求められている可能性は十分にある。
;; :::::::゙゙';;, 私 ,;; ::::::::"゙;;,,, の ,;; ''''"" ゙゙゙'''';;,,, こ ,;; ,, :::::::::::::::::'';;,, と . ,;;,;゙′ :::::::::::::::::゙';;,゙゙゙'''''''';;;;;,,, 好 ,;;゙ ::::::::::.. :::::::::゙゙゙"'';;;,, き ;; ー-、 ::::::::: :::::::,,;;::'''゙ ? ';; -ー-、 :::::::: ,,;;'" ;; ″ :::::::;; ,,;;"゙ ;;, iー┐ ''"* ::::::::::,;;-'゙゙ ゙';;,, ー ' :::::::::::,;;'' ゙゙'';,, :::::::::::;;;;::'゙" '; :::::::::::':;, '; :::::::::':;, ;`;, '; :::::::':;,丿 ;'
537 :
513 :2006/05/12(金) 16:07:17
たくさんのご回答本当にありがとうございます!
シフト演算の説明の後に書いてある問題で、
>>533 の方みたいにunsignedを使った方法で簡易なものがあればお願いします
~(~0ul >> 1)) は見たことないので・・・
>>537 0ulは(unsigned long)0と書き換えても良い。
539 :
513 :2006/05/12(金) 16:19:15
どうもありがとうございます(o*。_。)oペコッ
buf[i]がlong longでびっくり
じつはlong doubl.e
542 :
デフォルトの名無しさん :2006/05/12(金) 18:20:44
[1] 授業単元: 情報処理 [2] 問題文:キーボードから月を数字で入力し、英語名称とその短縮形を出力するプログラムを作り実行しなさい。 ただし、0から12までを除いた数字入力に対してはエラーと出力し、0を入力すればプログラムを終了するようにしなさい。 また、繰り返しにはwhileループ、多分岐選択にはswitchを使用すること。 入出力例) please input 0 if you wish to finish. please input month:1(注:数字で月を入力) January Jan. [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限 5/17 どうかよろしくお願いします(ノД`)
書くのが面倒くさいから来たのかね?ん?
>>542 #include <stdio.h>
#include <ctype.h>
int main(void)
{
char achInput[4];/* 入力データ */
while (1)
{
fgets(achInput, 4, stdin);
if ( !isdigit(achInput[0]) || !isdigit(achInput[1]) && (achInput[1] != '\n') || achInput[2] != '\n' && achInput[2] != '\0' ) break; /* 非数は終了でいいだろ? */
switch (achInput[0])
{
case '1':
switch (achInput[1])
{
case '\n':
puts("January, Jan");
break;
case '0':
puts("October, Oct");
break;
case '1':
puts("November, Nov");
break;
case '2': puts("December, Dec"); break; default: puts("Error!"); break; } break; case '2': puts("Febrary, Feb"); break; case '3': puts("MandoX A"); break; case '4': puts("booooooon"); break; case '5': puts("ぬるぽ"); break; case '6': puts("がっ"); break;
case '7': puts("Neeeeeeeeeeeeeeeeeeet"); break; case '8': puts("nil"); break; case '9': puts("NULL"); break; case '0': return 0; default: puts("Error!"); break; } } return 0; } 面倒(とゆうかやり方忘れた)だからバッファのフラッシュはやってない だから3文字以上入力された場合の動作は未定義
547 :
デフォルトの名無しさん :2006/05/12(金) 20:03:14
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): 最大40個の構造体(名前、身長、体重を要素として含む)を用意し、40個以内でデータ の入出力を行い、それらの一覧を表示するプログラム [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限 5/15 よろしくお願いします m(__)m
>>542 #include <stdio.h>
int main()
{
char buff[1024];
int mon;
while (1) {
printf("please input 0 if you wish to finish.\n"
"please input month: ");
if(fgets(buff, sizeof(buff), stdin) == 0)
return 0;
if (sscanf(buff, "%d", &mon) < 1 || mon < 0 || mon > 12) {
fprintf(stderr, "エラー\n");
continue;
}
switch (mon) {
case 0: return 0;
case 1: printf("January, Jan\n"); break;
case 2: printf("February, Feb\n"); break;
case 3: printf("March, Mar\n"); break;
case 4: printf("April, Apr\n"); break;
case 5: printf("May, May\n"); break;
case 6: printf("June, Jun\n"); break;
case 7: printf("July, Jul\n"); break;
case 8: printf("August, Aug\n"); break;
case 9: printf("September, Sep\n"); break;
case 10: printf("October, Oct\n"); break;
case 11: printf("November, Nov\n"); break;
case 12: printf("December, Dec\n"); break;
}
}
}
>>547 最低でも構造体(の基になるデータ)は自分で用意しろ
用意したからといってするとは限らないが、それすらないなら高確率で誰もやってくれない
データは自分で用意汁って
>>1 に書いてないよね?
今気づいたけど
>>551 データを用意しているか以前に、問題全文載せてなおデータの仕様も不明では話にならない。
逆に仕様が明らかならデータは(あったほうがテストしやすいとはいえ)なくても困らない。
問題がつまらんときは努力を見せろってことッスな
>>547 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ITEMS (40)
#define LBUF (1024)
struct person {
char *name;
double height; /* 身長 */
double weight; /* 体重 */
};
int input_person(struct person *psn)
{
char buf[LBUF];
char name[LBUF];
int s;
printf("名前は? (`-` で入力終了) ");
fgets(buf, sizeof(buf), stdin);
sscanf(buf, " %[^\n] \n", name);
if(strcmp(name, "-") == 0)
return 0;
else
psn->name = strdup(name);
do {
printf("身長は? ");
fgets(buf, sizeof(buf), stdin);
s = sscanf(buf, " %lf", &psn->height);
556 :
555 :2006/05/12(金) 23:47:41
} while(s != 1); do { printf("体重は? "); fgets(buf, sizeof(buf), stdin); s = sscanf(buf, " %lf", &psn->weight); } while(s != 1); return 1; } int main() { struct person person_list[MAX_ITEMS]; int listlen; int i; int s; for(listlen = 0; listlen < MAX_ITEMS; listlen ++) { s = input_person(&person_list[listlen]); if(s == 0) break; if(s == -1) perror("Error: "); } for(i=0; i<listlen; i++) printf("名前:%s 身長:%.1lfm 体重%.1lfkg\n", person_list[i].name, person_list[i].height, person_list[i].weight); return 0; }
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): 1次元配列の要素の中で最大の物を表示。 (注意:a[0〜n]の要素の中でたとえば5が最大であるとき、a[0]とa[1]が5であるとすれば 5を二回表示させよ。その際、配列を入れ替えたりしてはならない) [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限5/17 [5] その他の制限: 上のプログラムを関数にしてメインを作るのですが メインは完成したものの関数が思いつきません・・・
558 :
デフォルトの名無しさん :2006/05/13(土) 01:18:57
[1] 授業単元: 応用プログラミング演習 [2] 問題文(含コード&リンク):口頭で説明されたので、細かくはわからないんですが、音声データを読み込んで、任意のファイルの任意バイト数を変換するプログラムをお願いします。 初心者で何もわからないんですが、エフオープン・scanf・エフリード・rb・バイナリなどを使うと言っていました。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4] 期限: 2006年 5月14日 22:00まで [5] その他の制限: なし 完璧じゃなくてもいいんでお願いします。
>>557 void aaa(int array[],int count)
{
int i,max=0;
for (i=0;i<count;i++){
if (array[i]>max){
max=array[i];
}
}
for (i=0;i<count;i++){
if (array[i]==max){
printf("%d\n",array[i]);
}
}
return;
}
>>557 効率はあれかもしれないけど、まず最大値を求めて、その後配列の中に最大値がいくつあるか数えるといいかも
>>558 その説明でどんなプログラムか分かる人間がいるのだろうか。
せめてもうちょっと自分なりにこんな動作するんじゃないかなーとか書いてくれ。
>>558 もう一回聞いて来た方がよいと思われ
もし本当にそれだけしか説明がないんなら出題者が何らかの病気
件名「あんたの無能さについて」
お前ら本当に凄いな・・・ 俺にはそんなメールする勇気ないぞ
何かプリントとか貰ってないの? 普通「口頭で説明」だけって事は無いだろう。
話の流れが見えないから変換って言われてもね…
[1] 授業単元: プログラミング演習B [2] 問題文(含コード&リンク): Unixのxeyesの様に、目玉もしくは矢印が、マウスカーソルのある方向を示すプログラムを書け。 なお、フォーカスが他のアプリケーションにあるときも、方向を指し続けるようにすること。 [3] 環境 [3.1] OS: Windows [3.2] C++Builder 6 [3.3] C++ [4] 期限: 2006/6/12 [5] その他の制限: 特になし
>>557 二度数えしない方法.
#include <stdio.h>
int main() {
int a[] = {1,4,3,2,4,2,3,4};
int i, max, count, n = 8;
max = -10000; /* 十分小さな数 */
count = 0;
for (i = 0; i < n; ++i) {
if (max < a[i]) { max = a[i]; count = 0; }
if (max == a[i]) { ++count; }
}
for (i = 0; i < count; ++i)
printf("%d ", max);
}
568 :
デフォルトの名無しさん :2006/05/13(土) 10:18:35
[1] 授業単元: 演習 [2] 問題文(含コード&リンク): 1から100までの整数に関し、以下の仕様にしたがって数値を表示するプログラムを作成せよ。 @3かつ2で割り切れる数値を小さいものから順に表示する A上記@の表示を行った後、3または2で割り切れ、かつ10以上50未満の数値を大きなものから順に表示する B上記Aで表示した数値の総和も表示する [3] 環境 [3.1] OS: linux [3.2] gcc [4] 期限: 2006/6/18 [5] その他の制限: 特にありません。お願いします
#include <stdio.h> int main() { int i, sum; /* (1) */ for (i = 1; i <= 100; ++i) if (i % 2 == 0 && i % 3 == 0) printf("%d ", i); printf("\n"); /* (2) */ for (i = 49; i >= 10; --i) if (i % 2 == 0 || i % 3 == 0) printf("%d ", i); printf("\n"); /* (3) */ sum = 0; for (i = 49; i >= 10; --i) if (i % 2 == 0 || i % 3 == 0) sum += i; printf("%d\n", sum); }
[1] 授業単元: ゼミで出た話題 [2] 問題文: 配列 a = [ a[0], a[1], ..., a[n-1] ] が与えられる. (1) a の連続する部分の和の最大値を求めよ. 例: a = [-3,1,2,-1,3,-5] だった場合 [1,2,-1,3] の部分を取って,答えは 5. 注: 「何も取らない」 で 0 にすることは認めない. つまり a = [-3,-2,-1,-2,-3] だった場合 [-1] を取って -1. (2) a の二つの連続する部分の和の合計の最大値を求めよ. 例: a = [-3,1,2,-1,3,-5] だった場合 [1,2] と [3] を取って答えは 6. 注: 二つの部分が分離している必要はない. つまり a = [-5,1,2,3,-5] だった場合 [1,2] と [3] を二つの部分と見て 6. (3) 三つ以上の連続する部分の和の最大値を求める効率のよい方法はあるだろうか. [3] 環境: C/C++ どちらでも. [4] 期限: 5/21 まで.
>>570 長さゼロの列を認めないのはすごく気持ち悪いんだが。
例えば(2)で、a = [-1, 8, -3]のとき答えは7でいいのか?
572 :
570 :2006/05/13(土) 11:25:17
575 :
570 :2006/05/13(土) 11:36:18
>>573-574 すんません,単純に見てませんでした orz...
(2), (3) だけでお願いします.
# 実際にゼミで問題になったのは (3) ですが,説明には (1), (2) が
# あったほうがよいと思うので,(1), (2) を列記しました.
誰か、
>>570 の(2)の意味を教えてくれないかorz
単純に自分の頭が弱いんだと思うんだが、
例を見ても規則性が分からぬ。
577 :
576 :2006/05/13(土) 13:51:28
スマソ、自己解決しますたorz
578 :
デフォルトの名無しさん :2006/05/13(土) 13:51:53
#include<stdio.h> struct seiseki { int code; /*学籍番号*/ double eng; /*英語の点数*/ double math; /*数学の点数*/ char name[50]; /*名前*/ }; /*平均計算関数のプロトタイプ宣言*/ void CalcAverage(struct seiseki* classA, double* Average1, double* Average2); int main(void) { int i; double AverageEng = 0.0; /*英語の平均値*/ double AverageMath = 0.0; /*数学の平均値*/ /*構造体の初期化*/ struct seiseki classA[5] = { {1, 59.4, 84.3, "Aomori"},{2, 43.8, 94.2, "Itamoto"},{3, 74.3, 64.5, "Kimura"},{4, 57.3, 73.4, "Satou"},{10, 62.6, 55.9, "Sugiyama"} }; /*平均の計算(関数に情報を渡している)*/ CalcAverage(☆☆☆); /*結果をアドレス渡しにしていることに注意*/ /*結果の表示*/ printf("Average(English):%f, Average(Math):%f\n", AverageEng, AverageMath); return 0; } void CalcAverage(struct seiseki* classA, double* Average1, double* Average2) { ☆☆☆ } 5人の英語の課題の点数と数学の点数の平均をそれぞれ求めるプログラムです。☆☆☆のところを補充して、正しいプログラムをお願いします。
>>578 テンプレ位読もうな。
あと、この仕様だと人数決めうちにしかできないが、課題だからそうなってんのかな。
呼び出し部は CalcAverage(classA, &AverageEng, &AverageMath);
void CalcAverage(struct seiseki* classA, double* Average1, double* Average2)
{
int i;
double Ave1 = 0, Ave2 = 0;
for( i=0; i<5; i++ ) {
Ave1 += classA[i].eng;
Ave2 += classA[i].math;
}
*Average1 = Ave1 / 5;
*Average2 = Ave2 / 5;
}
>>578 関係ないけど、出題者の命名規則がアレだな。
582 :
デフォルトの名無しさん :2006/05/13(土) 14:18:45
ゼミの話題ってたまに出るけどさぁ、 PGのゼミってあるわけ?
>>570 一応できた。長さnの入力をm個に分けることがO(mn)の時間とO(m)の空間でできるはず。
>>505 のコードをベースにした。
# include <algorithm>
# include <vector>
int solve(int *a, int size, int m)
{
std::vector<int> init(m, 0);
std::vector<int> last_max(m, 0);
std::vector<int> last_now(m, 0);
for(int i = 0; i < size; i++) {
if(i < m) {
init[i] = i > 0 ? init[i-1] + last_max[i-1]: 0;
last_max[i] = a[i];
last_now[i] = a[i];
}
for(int k = 0; k < m && k < i; k++) {
last_now[k] = std::max(last_now[k], 0) + a[i];
last_max[k] = std::max(last_now[k], last_max[k]);
}
for(int k = 0; k < m - 1 && k < i; k++) {
int diff = init[k] + last_max[k] - init[k+1];
last_max[k+1] -= diff;
last_now[k+1] -= diff;
init[k+1] = init[k] + last_max[k];
}
}
return init[m-1] + last_max[m-1];
}
>>583 研究するときデータ採取とかにプログラムを書く必要がある場合は、
課題として出されたりするんじゃないの?
しらんけど。
586 :
558 :2006/05/13(土) 17:11:20
音声データをコマンドプロンプトで読み込むと、16進数の文字列で 表されて、そのファイルを関数エフオープンで任意のファイルを読み 込んで、スキャンエフで任意バイト数(何バイト目〜何バイト目を) の指定です。 プリントでの問題文がないので、説明の仕様がありません。
エフオープンって何だよ。エーオープンなら知っているが。
589 :
558 :2006/05/13(土) 17:41:52
すみません。エフ商会の間違いでした。
エフ商会??!! ますますわかんねぇ!
592 :
558 :2006/05/13(土) 18:10:31
なんでもいいので、早くやってください
>>592 屏風から虎を追い出してください。さすれば捕まえて差し上げましょう。
>そのファイルを関数エフオープンで任意のファイルを読み込んで m9( ゚д゚ )
変換ってなにやるんだYO
o-o、 ('A`) メガネメガネ ノ ノ)_
ん?変換の具体的内容って書いてあったか?
へんか?
>>558 完璧じゃないけどな
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
FILE *fp;
int n;
char *p;
if(argc < 3)return 1;
fp = fopen(argv[1], "rb");
if(fp == NULL)return 1;
n = atoi(argv[2]) + 1;
p = (char*)malloc(sizeof(char) * n);
if(p == NULL)return 1;
fread( p, sizeof(char), n, fp);
free(p);
fclose(fp);
return 0;
}
コマンドライン引数は 対象のファイル バイト数 な
ところで変換ってn(ry
フーリエ変換でもするんだろうか。
どっちにしても
>>558 はちゃんと授業出てたのか?
もしちゃんと出ててこの状況なら、出題者に質問或いは抗議してもいいんじゃまいか。
604 :
billy :2006/05/13(土) 23:14:42
実行例 % cat source This,is,source. end. % gcc -o filebreak kadai.c % ./filebreak source -- Line 1 -- Field 1: This Field 2: is Field 3: source. -- Line 2 -- Field 1: end.
605 :
デフォルトの名無しさん :2006/05/13(土) 23:15:21
[1] 授業単元: まだ初歩なのでどういえばいいかわかりません。 [2] 問題文(含コード&リンク):1、テキストの幅を調べる 2、1ではタブも一文字とされるが 水平タブを考慮してテキストの幅を正しく調べられるように改良せよ [3] 環境 mac UNIX [4] 期限: 2006年 5月17 自分で考えた1については #include <stdio.h> int main(){ int c; int width, maxwidth = 0; while((c == getchar()) != EOF){ if(c == '\n){ if(width > maxwidth) maxwidth = width; width = 0; } else width++; } printf(``%d\n``, maxwidth); return 0 ; } なのです。 どう改良すればいいのでしょうか? そもそもこのプログラムが合っているかの判定もお願いします。 ただこのプログラムsample.c に対してgcc sample.c ./a.out としたあと文字入力して、その文字入力を終了したことを表す操作がわからず できているかの判定ができませんでした・・ そのことについてもできればよろしくお願いします
>>605 いろいろおかしい
c==getchar()だとcとgetchar()の戻り値を比較してる
widthが初期化されずに比較されたり、加算されたり、代入したりしてる
あと、全角混じってね?printfとreturnトコ
>>605 キーボードで [CTRL] + D 押すと入力終了になると思われ。
プログラムのほうは、606 が指摘してる点以外では、
1. ``%d\n`` ではなく "%d\n"
2. c == '\n では ' が閉じてない
3. 改行なしで入力が終わったらどうなるか考えてみよう。
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): @、好きな整数を入力 A、@に2をかける B、Aに100をたす C、Bに20をかける D、Cから400ひく E、Dを40でわる F、Eの商を40で割ったあまりを求める G、Fを表示する [3] 環境 [3.1] OS:Windowsxp) [3.2] コンパイラ名とバージョン:Win32(よくわかりません) [3.3] 言語:C++ [4] 期限:月曜までにお願いします
>>608 ごめん、1〜7のどこが分からないんだ?
まさしく本を見ろのレベルなんだが。
>>608 #include <stdio.h>
int main(void)
{
int num;
scanf("%d", &num);
num*=2;
num+=100;
num*=20;
num-=400;
num/=40;
num%=40;
printf("%d\n", num);
}
return0;ほしかった
612 :
デフォルトの名無しさん :2006/05/14(日) 00:28:20
>>609 学校で終わらなかったから家でやろうとしたらなんか学校のと違って実行できなかったんで、一応確認の為だったんです
>>610 サンクスnumじゃなくてもいいんだよね
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): テキストファイル(gpl.txt)中に出現する全ての単語とその出現回数をリスト構造で記憶するプログラムを作成し、出現回数でソートを行いなさい。プログラムの出力結果は,出現回数が多い単語の上位5個とその出現回数,
さらに単語"source"の出現回数とその出現順位(多い順で数える、同じ数の単語がある場合の順位計算に注意する)を表示すること.ただし,出現する単語の数は未定とし,単語と出現回数を双方向リスト構造で記憶すること.
(gpl.txt)→
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1893.txt 以下の関数を作成すること(これら以外の関数も作成して良い).(注意:関数の説明を十分にすること.)
create_node : 新規ノードを作成する.
add_node : ノードをリストの先頭に追加する.
search_node : ノードに保存された単語を検索する.
delete_node : ノードを削除する.
insert_node : ノードを指定した場所に挿入する.
swap_node : 2つのノードを指定して,それぞれの位置を交換する.
正解
1位 : the 194個
2位 : to 108個
3位 : of 104個
4位 : or 77個
5位 : you 76個
source : 16個, 33位
注意:
パーザはparse関数を使用すること。
リスト構造で構造体の中身を入れ替えるために、構造体のコピーを使用してはいけない。必ず、ポインタの変更による入れ替えを行うこと。
単語の上位5位を表示する時は,リストの先頭5つのノードだけを見るようにすること.リスト全体を検索してはいけない.
単語の順位計算では、同じ出現回数の単語を同じ順位として扱うプログラムを記述すること。
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限 5/18
宜しくお願いします m(__)m
>>613 >パーザはparse関数を使用すること。
こんな関数、少なくとも標準ライブラリでは見たことも聞いたこともない
別のライブラリを使うならそれが何なのか、講師から配られたorこの課題以前に
作成したならそれをうpしろ
615 :
605 :2006/05/14(日) 00:40:10
すみません 全角などは、UNIX上では問題なくかけていると思います。 607サンの指摘された1、2も問題ないです 本当にすみません 606サンの指摘ですが while((c = getchar()) != EOF){・・・ にしても同じでしょうか? このプログラムに似ているものがプリントにあって、真似ているつもりなのですが・・ 607サン、入力後コントロールDを押しても^dと表示されるだけで 終了しませんでした もう一度学校いきしだい試してみます。
>>615 そのwhile条件式(継続式かなんかって言い方もあったかな)はEOFが入力されるまで
標準入力から読み込み続ける時の常道だから問題ない
最初のは両方とも比較になってたからダメ
代入と比較は表記上は似てるが全くの別物だから気をつけろ
Ctrl+DはEOFだが、WindowsだとCtrl+Zだったか別のに割り当てられてた気もする
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 文字列str内の全ての数字文字を削除 する関数 void del_digit(char str[]){/* */}を作成せよ [3] 環境 mac [4] 期限:月曜までにお願いします どこまでの知識をもっているかということを答えられないレベルなのですが、 明快 C言語 入門編 という参考書を片手にやっています よろしくおねがいします。
618 :
570 :2006/05/14(日) 00:53:37
>>583 自主ゼミです.アルゴリズム論ということでやってます.
各人が面白そうな問題を持ち寄って適当に喋ってるだけですが.
>>584 すごい! O(mn) で行けるんですか.驚きました.
アルゴリズムを理解できてないので,じっくり考えさせていただきます.
ありがとうございました.
620 :
613 :2006/05/14(日) 00:55:10
621 :
605 :2006/05/14(日) 00:55:28
>>616 ありがとうございます。同じようなものだと思っていました・・
./a.out のあと文字例えば「qesysuqaiq6819]を入力してenter押してCtrl+D
したのですがなにも起こらなかったようなきがします
もう一度ためしてみます。
また最初の質問なのですが、「水平タブを考慮」した場合
どのように改良すればいいかがヒントもないので検討がつきませんので
出来ればよろしくお願いします
>>621 getchar()は(俺がぼけてなければ)標準入力から読み込む
だからその手順(./a.out hoge[Enter][Ctrl-D])なら
何も表示せずプロンプトに戻るのが正常
./a.out [Enter] hoge[Ctrl-D]が正しい使い方
>>620 既にEOFに達してるFILE*渡されたときに変なことになりそうな気もするし
そもそもBOF確実に起こしかねないってどうよと言いたくなるな
624 :
605 :2006/05/14(日) 01:04:57
>>622 すみません hogeとは何を指していますか?
任意の名前
楽しそうな話だね・・・僕も混ぜてくれるかな?・・(大蛇丸風)
627 :
613 :2006/05/14(日) 01:21:34
628 :
デフォルトの名無しさん :2006/05/14(日) 02:33:57
>613 judge_countって配列は何をカウントするの? このmain関数は適宜変更していいの?
[1] 授業単元:プログラム演習 [2] 問題文(含コード&リンク):英文テキストから単語を抜き出す関数PickWordを作成し、 関数PickWordを用いて英文テキストから単語を抜き出して単語のリストを出力するプログラムWordListを作成せよ。 英文テキスト(文字列)はキーボードから読み込む。テキストの長さは不定(最大255文字)。 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:VC [3.3] 言語:C [4] 期限:5月15日まで よろしくお願いします
630 :
629 :2006/05/14(日) 03:36:55
慌てず急いで正確にな
631 :
629 :2006/05/14(日) 03:40:59
これはいい騙りですね
トリップ付け忘れてたorz
勝手に人の名を騙らないでください。
>>630-632 は自分ではありません。
とにかく今回は時間がないので、どんなのでもいいので、早めにやってください。
おながいします。
634 :
613 :2006/05/14(日) 08:24:49
>>628 judge_countは実行の際に
% ./003 gpl.txt gnu the of license program
と指定した単語を数える関数ですm(__)m
すみません、自己解決しました
636 :
billy :2006/05/14(日) 09:24:54
実行例 % cat source This,is,source. end. % gcc -o filebreak kadai.c % ./filebreak source -- Line 1 -- Field 1: This Field 2: is Field 3: source. -- Line 2 -- Field 1: end. となるようにしたい
なんだ、このカオスは
なんだか変なことになってしまって申し訳ない
639は解決済みなん?
乙
643 :
641 :2006/05/14(日) 10:53:55
トリップを見たら、なんだかなぁ。釣られた感高い? まーいいや。 プログラムの仕様上、元データの先頭行を空行から始めると動きませぬ。
>>641 ありがとうございます
なんだか偽者がたくさん沸いてしまったようで混乱させてしまって申し訳ないです
すみません、水平タブを考慮する場合どのように改良すればよいか よろしくお願いします
>>647 ヒント
if(c == '\t')
width += 8;
>>650 nの値が変わってないから毎回先頭から読んでる
だから、いつも同じ
[1] 授業単元:プログラム演習 [2] 問題文(含コード&リンク):標準入力に現れた数字文字の出現回数 を縦に*を並べたグラフで表示するプログラムを表示 mac [4] 期限:5月15日まで int i, ch; int cnt[10] = {0}; while(1){ ch = getchar(); if (ch == EOF)break; if (ch >= '0' && ch <= '9') cnt[ch - '0']++; } print... for.. printf() return 0 ; } これは数字文字をカウントするプログラムということで これをもとに書けということでした。 よろしくお願いします
>>653 既にカウントされてるんだから後は順番に*を出力するだけだろ
それぐらい自分でやれ
>>653 #include <stdio.h>
int main(){
int i, ch;
int cnt[10] = {0};
while(1){
ch = getchar();
if(ch == EOF)break;
if(ch >= '0' && ch <= '9')cnt[ch - '0']++;
}
int j;
for(i = 0; i < 10; i++){
printf("%d:", i);
for(j = 0; j < cnt[i]; j++)putchar('*');
puts("");
}
return 0 ;
}
>>654 ごめん、やっちゃった
657 :
デフォルトの名無しさん :2006/05/14(日) 14:07:43
>>653 # include <stdio.h>
int main(void)
{
int i, ch, max;
int cnt[10] = {0};
while((ch = getchar()) != EOF)
if(ch >= '0' && ch <= '9')
cnt[ch - '0']++;
max = 0;
for(i = 0; i < 10; i++)
if(max < cnt[i])
max = cnt[i];
for(i = max; i > 0; i--)
{
int j;
for(j = 0; j < 10; j++)
if(cnt[j] >= i)
putchar('*');
else
putchar(' ');
putchar('\n');
}
puts("----------");
puts("0123456789");
return 0;
}
660 :
641 :2006/05/14(日) 14:14:15
>>651 なるほど、確かにそれではループし続けてしまいますね
>>660 ありがとうございます。こちらも説明不足だったかも
[1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 0 1 2 3 4 5 6 7 8 9 0□□□□□□□□□□ (1)左のような碁盤目を表示後|(2)宝物の初期位置、及び点数を 1□□□□□□□□□□ 座標としてX,Yをscanfで入|予めテキスト形式のファイル 2□□□□□□□□□□ 力しその座標部分を■で表|に記憶しておき、プログラム 3□□□□□□□□□□ 示。(入力回数は20回まで)|開始時に、それを読み出すよ 4□□□□□□□□□□ そして、座標上に配列を用|うに変更せよ。テキストは以 5□□□□□□□□□□ いて10個の宝を配置。入力|下のような形式で表示。 6□□□□□□□□□□ された座標と宝の座標が一|座標X 座標Y 点数 7□□□□□□□□□□ 致すれば、あたりと表示し|5 8 3 8□□□□□□□□□□ 一致しなければ、はずれと|3 9 2 9□□□□□□□□□□ 表示する。一度取得した宝|・・・・ は、はずれを表示。それぞれの宝に構造体を用いて、|--------------------------- スコアを割り当てる。そして当たれば、スコアを加算|回数 X座標 Y座標 あたり/はずれ し表示する。入力できる数字は0〜9、それ以外の数|最終スコア 字は、入力エラーと表示する。 |1回目 3 8 はずれ ※20回入力したら終了。 |2回目 5 9 あたり ※碁盤目の表示にはfor/while文を用いる。 |・・・・・・・・ |20回目 8 6 はずれ | スコア=5点
3] 環境 [3.1] OS:windows [3.2] コンパイラ名とバージョン:不明 [3.3] 言語:C++ [4] 期限:2006年5月15日 [5] その他の制限:各種配列変数初期化、値設定(配列はポインタで渡す),座標の入力(scanf), 入力座標の妥当性(0〜9),入力座標と宝の座標の一致判定(ポインタ渡し),一致判定結果に従っ てあたり、はずれの表示,20回カウンタ,スコアの加算(return命令は使用しない),それぞれ関数 を用いる。ファイルポインタ変数は、void mainの外側でグローバル変数として定義する。 碁盤目表示と■表示くらいしかできません・・・助けてください。よろしくお願いします。
読みづらいって…
>>662 (1)左のような碁盤目を表示後座標としてX,Yをscanfで入力しその座標部分を■で表示。(入力回数は20回まで)
そして、座標上に配列を用いて10個の宝を配置。入力された座標と宝の座標が一致すれば、あたりと表示し
一致しなければ、はずれと表示する。一度取得した宝は、はずれを表示。それぞれの宝に構造体を用いて、
スコアを割り当てる。そして当たれば、スコアを加算し表示する。入力できる数字は0〜9、それ以外の数字は、
入力エラーと表示する。※20回入力したら終了。
※碁盤目の表示にはfor/while文を用いる。
回数 X座標 Y座標 あたり/はずれ
最終スコア
1回目 3 8 はずれ
2回目 5 9 あたり
・・・・・・・・
20回目 8 6 はずれ
スコア=5点
(2)宝物の初期位置、及び点数を予めテキスト形式のファイルに記憶しておき、プログラム開始時に、
それを読み出すように変更せよ。テキストは以下のような形式で表示。
座標X 座標Y 点数
5 8 3
3 9 2
・・・・
665 :
662 :2006/05/14(日) 15:06:15
すいません。訂正ありがとうございます。
なんでこう日本語が下手な問題文が多いんだ?
667 :
662 :2006/05/14(日) 15:16:59
箇条書きされていたものを無理矢理くっつけたので変になりました。 ごめんなさい。 ちなみに、 回数 X座標 Y座標 あたり/はずれ 最終スコア 1回目 3 8 はずれ 2回目 5 9 あたり ・・・・・・・・ 20回目 8 6 はずれ スコア=5点 もテキスト形式になります。 よろしくお願いします。
要はよくあるランダムな数桁の数字を当てていく奴の亜種か? あの2つ正解です。1つは場所が違います。とかって出る奴 つーか、絶対に原文より理解しやすくできる確信が無いなら 原文のまま貼れと何度ry
669 :
662 :2006/05/14(日) 16:38:28
原文そのままだとかなりの量になるので・・・すいません。 ようするに10個の宝というのは、任意の座標に配置するもので、 ランダムではなく作成者は宝の位置がわかっていることになります。 (宝の位置は適当に決めていいです。) そして、その宝の座標と入力座標が一致したときに「あたり」と表示 するわけです。一度取得した宝は、その後入力しても「はずれ」にな ります。入力座標が一致しない限りは「はずれ」を表示します。 本当にわかりにくくて申し訳ありません。
[1] 授業単元: [2] 問題文(含コード&リンク): 文字列str内の全ての英字を大文字に 変換する関数、および小文字に変換する関数 void str_toupper(char*str){ } void str_tolower(char*str){ } を作成せよ [3] 環境 UNIX [4] 期限) 水曜日まで よろしくお願いします。
>>669 そうやって一つ一つ質問に回答した挙句に原文よりも量が増える罠。
>>670 #include <ctype.h>
void str_toupper(char *str)
{
char *ptr = str;
while (*ptr != '\0')
{
*ptr = toupper(*ptr);
}
}
void str_tolower(char *str)
{
char *ptr = str;
while (*ptr != '\0')
{
*ptr = tolower(*ptr);
}
}
ctype.h使うなと指定が無かった&こっちの方が移植性に優れるので
toupper()とtolower()使った
>>670 #include<ctype.h>
void str_toupper(char*str){for(;*str;++str)*str=toupper(*str); }
void str_tolower(char*str){for(;*str;++str)*str=tolower(*str); }
674 :
デフォルトの名無しさん :2006/05/14(日) 17:04:18
>>670 直感的にわかりやすく書いてみたつもり。
32='a'-'A'な。
void str_toupper(char *str)
{
int i;
for(i=0;str[i]!='\0';i++)
if('a'<=str[i] && str[i]<='z')
str[i]-=32;
}
void str_tolower(char *str)
{
int i;
for(i=0;str[i]!='\0';i++)
if('A'<=str[i] && str[i]<='Z')
str[i]+=32;
}
問題持ってくるやつ国語力無いよな。
なんで勝手に問題削ったりするんだろうか。
ってかこんなプログラムもかけない馬鹿がくるから、国語力ないのも仕方ないのかな。
それじゃto〜使ってない奴 void str_toupper(char*str){ for( ; *str != '\0'; ++str){ if( *str >= 'a' && *str <= 'z') *str -= 'a' - 'A'; } } void str_tolower(char*str){ for( ; *str != '\0'; ++str){ if( *str >= 'A' && *str <= 'Z') *str += 'a' - 'A'; } }
>>662 スコアを割り当てるってあるけど…
それも入力するん?
それとも、1コ何点とあらかじめ決まってたりするの?
どうもありがとうございました!!
678 :
662 :2006/05/14(日) 17:16:53
それぞれの宝にそれぞれ異なった点数を割り当てなければいけないようです。 構造体を使うらしいんですが、いまいち理解できていないのでどうすればい いのかわかりません。 今、原文にそって問題書いております。国語力なくてすいません。
679 :
デフォルトの名無しさん :2006/05/14(日) 17:25:46
【質問テンプレ】 [1] 授業単元: プログラム演習I [2] 問題文(含コード&リンク): 5名の学生の成績データを読んで、 点数の高い順番に並べる [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: bcc55 [3.3] 言語: C [4] 期限: 今日の24時までです [5] その他の制限: 構造体を利用する seiseki.txtから読み出す ishii,56 ueda,77 hamada,99 kudo,66 uchida,44 です よろしくお願いします
680 :
デフォルトの名無しさん :2006/05/14(日) 17:46:47
>>679 ソートの方法は選択ソートな。
作ってはみたが、scanf("%s %d")これだとなるのにscanf("%s,%d")これだとならない。
ごめん。
他の人あとよろ。
#include<stdio.h>
typedef struct{char name[20];int value;}STU;
int main(void)
{
STU student[5];
int i,j;
freopen("seiseki.txt","r",stdin);
for(i=0;i<5;i++)
scanf("%s %d",student[i].name,&student[i].value);
for(i=0;i<4;i++)
{
int max=i;
STU temp;
for(j=i+1;j<5;j++)
if(student[i].value<student[j].value)
max=j;
temp=student[max];
student[max]=student[i];
student[i]=temp;
}
for(i=0;i<5;i++)
printf("%s %d\n",student[i].name,student[i].value);
return 0;
}
>>679 sortは面倒なんでqsort 1発で終わらせた。
#include<stdlib.h>
#include<stdio.h>
#define MAX_NAME_SIZE 16
#define MAX_STUDENT_SIZE 10
typedef struct student{char name[MAX_NAME_SIZE];int score;}student;
int compare_student(const void*a,const void*b){return ((student*)a)->score - ((student*)b)->score;}
int main(){
student students[MAX_STUDENT_SIZE];int i,j;
for(i=0;i<MAX_STUDENT_SIZE && scanf(" %9[^,],%d",students[i].name,&students[i].score)==2;++i){}
qsort(students,i,sizeof(student),compare_student);
for(j=0;j<i;++j)printf("%s,%d\n",students[j].name,students[j].score);
}
682 :
662 :2006/05/14(日) 17:55:46
原文にそって書いてみました。これでも無理なら・・・。 ・for/while文を用いて、碁盤目を表示せよ。 ・scanf命令で入力した2値をx,y座標として、その座標部分を■で表示せよ。 (両者とも0から9までが入力されるものとする。) ・入力値のどちらかが0から9以外の場合は碁盤目を表示せず。エラーメッセージを表示せよ。 ・任意の位置に宝を配置(座標固定)。その後、座標を入力して宝の位置と一致すれば「あたり」 不一致なら「はずれ」と表示せよ。なお、作成者は宝の位置が予め知っていることになる。 (入力チャンスは1回) ・入力チャンスを20回にせよ。 ・宝を探し当てた場合20回に満たなくても終了せよ。 ・以下に従って関数化せよ。 関数1 入力したx,y座標に対して、入力の妥当性を示すフラグを設定する。(0から9) 関数2 入力座標x,y、宝の座標x,yに対して、一致判定をする。 関数3 妥当な入力値なら碁盤目を表示、NGならエラーメッセージを表示。 関数4 一致判定に従って、「はずれ」「あたり」を表示。 関数5 20回カウンタ、一致判定結果によりゲーム終了判定をする。一致判定結果に ・以下の座標に10個宝を配置せよ。 [x,y]=[5,8][3,9][0,5][5,9][1,7][2,8][4,6][0,1][3,7][2,5] ・入力チャンスは20回に固定せよ。 ・入力の度に毎回、取得した宝の数をスコアとして加算表示せよ。 ・一度取得した宝の位置は、再度指定してもはずれと表示せよ。
683 :
662 :2006/05/14(日) 17:56:27
・以下の配列変数を使用せよ。 tre_x[] --- 各宝のx座標 tre_y[] --- 各宝のy座標 get_comp[] --- 各宝の取得済みフラグ ・宝の配置は、以下を使用せよ。 ter_[0] = 5; tre_[0] = 8; ・・・・・・・・・・・・ tre_[9] = 2; tre_[9] = 5; ・マクロ定義を使用せよ。 (例)#define TRE_COUNT 10 ・全宝物と入力座標の一致判定を関数化するのは困難なので、以下のようにメインで処理する。 get_tre = 0; while(i < TRE_COUNT && get_tre == 0){ get_tre=check_gettre(x,y,tre[i],tre[i],get_comp[i]); //宝の取得判定 if(get_tre==1){ score++; //スコア加算 get_comp[i]=1; //取得したら取得済みにする。 } i++; } ・以下に従って関数化せよ。 関数6 宝物の配置など、配列変数の設定をする。なおメインから関数へ配列は、ポインタで渡す」。 関数7 キー入力と、入力した値の妥当性を判断し、入力値[x,y]と結果をフラグで返す。関数1までの処理を含む。 関数8 全宝物の座標(ポインタ渡し)、入力座標と比較し、一致結果をフラグで戻す。 関数9 スコアの加算を行う。なお戻り値(return)は使用しない。
684 :
662 :2006/05/14(日) 17:58:22
・各宝物に点数を設定する。そして、宝を取得したら、その点数をスコアに加算する。(構造体を使用する) [x,y]=点数,[5,8]=3,[3,9]=2,[0,5]=1,[5,9]=2,[1,7]=4,[2,8]=1,[4,6]=1,[0,1]=3,[3,7]=2,[2,5]=1 ・宝の初期位置及び点数を予めテキスト形式のファイルに記憶しておき、プログラム開始時に、それを読み出す様にせよ。 以下の形式のテキストファイルで出力せよ。 回数 X座標 Y座標 あたり/はずれ 最終スコア 1回目 3 8 はずれ 2回目 5 9 あたり ・・・・・・・・ 20回目 8 6 はずれ スコア=5点 ------------------------------------- 座標X 座標Y 点数 5 8 3 3 9 2 ・・・・ ------------------------------------- ・ファイルポインタ変数は、void mainの外側でグローバル変数として定義する。 FILE *read_file, FILE *write_file,
685 :
662 :2006/05/14(日) 18:02:51
すいません。
>>683 の14行目
get_tre=check_gettre(x,y,tre_x[i],tre_y[i],get_comp[i]);
でした。
長いものはあぷろだにまとめてうpしよう
・宝の配置は、以下を使用せよ。 ter_x[0] = 5; tre_y[0] = 8; ・・・・・・・・・・・・ tre_x[9] = 2; tre_y[9] = 5; じゃないのか?
[1] 授業単元: C++演習 [2] 問題文(含コード&リンク): ある金額を硬貨で支払う際に、硬貨の枚数が最も少なくなる支払い方法を求める。 金額を書き込み、それを支払うために、500円、100円、50円、5円、1円の硬貨 をそれぞれ何枚使用するかを計算して表示するプログラムを作成せよ。 使用する効果の合計枚数も表示せよ。 実行例 金額を入力してください(単位 円):3469 最も少ない枚数で3469円を払った場合、 五百円玉6枚、百円玉4枚、五十円玉1枚、十円玉1枚、五円玉1枚、一円玉4枚 の計17枚です。 [3] 環境 [3.1] OS: UNIX [3.2] gcc [3.3] C++ [4] 期限:5/16まで お願いします [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
[1] 授業単元: 計算機通論 [2] 問題文(含コード&リンク): 以下のマクロABS(x)の条件式と同じ働きをする式を、if文や条件式を使わない方法で書き直しなさい。 (switch文などを用いないでお願いします) #define ABS(x) (((x) < 0) ? -(x) : (x)) [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限:5月15日 [5] その他の制限: シフト演算での問題であるため、" ((unsigned) x) >> 31 "このような右シフトを使って答えを考えてくださいませ
690 :
662 :2006/05/14(日) 18:10:01
>>686 さん
気が動転していて忘れてました。すいません。
なんせ期限が明日までなもので・・・。
>>689 すべての型の対応もしなきゃだめなのか?
[1] 授業単元: 再帰 [2] 問題文(含コード&リンク): 第一軸に上が小さく下が大きくなるように重ねられている 円盤を第三軸に移す手順を示すプログラムを作成せよ ただし円盤を写す際はより大きい円盤を上に重ねることはできない なお、作業用に設けられている第二軸は自由に使ってよい。 [3] 環境 Mac [4] 期限: 月曜日まで [5] その他の制限:基礎の基礎です。 初めて1ヶ月なので include <stdio.h>などの基本しか使えません すみませんがよろしくお願いします
【質問テンプレ】
[1] 授業単元: C++
[2] 問題文(含コード&リンク):
http://briefcase.yahoo.co.jp/ningenxp/ directx05.zip PASS:cpp
[3] 環境
[3.1] OS: Windows XP
[3.2] Visual C++ 2005 Express Editionのコンパイラ
[3.3] C++
[4] 期限: できれば24時間後まで 2006/05/14 18:00
[5] その他の制限: WisdomsoftのC言語講座 構造体まで読みました
C++はクラスだけ知っています
>・各宝物に点数を設定する。そして、宝を取得したら、その点数をスコアに加算する。(構造体を使用する) これって↓みたいにしろって事だと思うんだが、 typedef struct{ int x; int y; int get_comp; int score; }Treasure; そうすると↓は使わないよな。どういう事だろ。 >・以下の配列変数を使用せよ。 >tre_x[] --- 各宝のx座標 >tre_y[] --- 各宝のy座標 >get_comp[] --- 各宝の取得済みフラグ
695 :
693 :2006/05/14(日) 18:15:28
2006/05/15 18:00でした
696 :
693 :2006/05/14(日) 18:16:23
コンパイルエラー出ないようにしてください
697 :
662 :2006/05/14(日) 18:16:54
>>694 さん
上から順にやっていくので、不要になれば使わなくても大丈夫です。
>>688 int main(){
int i, x;
int k[]={500, 100, 50, 10, 5, 1}, m[(sizeof(k) / sizeof(k[0]))];
scanf("%d", &x);
for(i = 0; i < (sizeof(k) / sizeof(k[0])); i++){
m[i] = x / k[i];
x %= k[i];
}
for(i = 0; i < (sizeof(k) / sizeof(k[0])); i++)
printf("%d円は%d枚\n", k[i], m[i]);
return 0;
}
>>692 ハノイの塔と解釈してもよろしいのかしら?
>>699 すみません。ハノイの塔というものがどういうものかわかりません・・
ハノイだねぇ
>>692 # include <stdio.h>
void move_one(const char *from, const char *to)
{
printf("%s -> %s\n", from, to);
}
void move(int n, const char *from, const char *to, const char *aux)
{
if(n == 1)
move_one(from, to);
else
{
move(n-1, from, aux, to);
move_one(from, to);
move(n-1, aux, to, from);
}
}
int main(void)
{
move(3, "第一軸", "第三軸", "第二軸");
return 0;
}
703 :
689 :2006/05/14(日) 18:47:10
>>691 全ての型と申しますと何があるのでしょうか?・・・
整数型 実数型
(693)
【質問テンプレ】
[1] 授業単元: C++
[2] 問題文(含コード&リンク):
http://briefcase.yahoo.co.jp/ningenxp/ directx05.zip PASS:cpp
次のコンパイルエラーを何とかしてください #pragma onceをsub.hの先頭につけてもだめです
main.obj : error LNK2005: "struct IDirect3D9 * g_pD3D" (?g_pD3D@@3PAUIDirect3D9@@A) は既に logo.obj で定義されています。
main.obj : error LNK2005: "struct IDirect3DDevice9 * g_pd3dDevice" (?g_pd3dDevice@@3PAUIDirect3DDevice9@@A) は既に logo.obj で定義されています。
main.obj : error LNK2005: "struct IDirect3DVertexBuffer9 * g_pVB" (?g_pVB@@3PAUIDirect3DVertexBuffer9@@A) は既に logo.obj で定義されています。
C:\Documents and Settings\裕\My Documents\Visual Studio 2005\Projects\directxtest05\Debug\directxtest05.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
[3] 環境
[3.1] OS: Windows XP
[3.2] Visual C++ 2005 Express Editionのコンパイラ
[3.3] C++
[4] 期限: できれば24時間後まで 2006/05/14 18:00
[5] その他の制限: WisdomsoftのC言語講座 構造体まで読みました
C++はクラスだけ知っています
Balloooooooooooooooooooooooo!
はいはい、カオスカオス
[1] 授業単元:ネットワークプログラミング [2] 問題文(含コード&リンク): データグラム型のソケットを用いてecho serverを作る。 [3] 環境 [3.1] OS: FreeBSD 6.0 [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2006年5月14日23:59まで [5] その他の制限:なし
711 :
710 :2006/05/14(日) 20:09:46
#include <stdio.h> #include <string.h> #include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #define SOCK_NAME "/tmp/socket_un" int main(){ int fd1,fd2; struct sockaddr_un saddr; struct sockaddr_un caddr; unsigned int len; int nbytes; char buf[1024]; unlink(SOCK_NAME); if((fd1=socket(PF_UNIX,SOCK_STREAM,0))<0){ perror("socket"); exit(1); } memset(&saddr,0,sizeof(saddr)); saddr.sun_family=AF_UNIX; strcpy(saddr.sun_path,SOCK_NAME); if(bind(fd1,(struct sockaddr *) &saddr,sizeof(saddr))<0){ perror("bind"); exit(1) }
712 :
710 :2006/05/14(日) 20:11:23
if(listen(fd1,5)){ perror("listen"); exit(1); } for(;;){ len =sizeof(caddr); if((fd2=accept(fd1,(struct sockaddr *) &caddr,&len))<0){ perror("accept"); exit(1); } while(nbyte=read(fd2,buf,sizeof(buf))){ write(1,buf,nbytes); write(fd2,buf,nbytes); } close(fd2); } close(fd1); exit(0); }
713 :
710 :2006/05/14(日) 20:14:27
#include <stdio.h> #include <string.h> #include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #define SOCK_NAME "/tmp/socket_un" int main(){ int fd; struct sockaddr_un addr; int nbytes; char buf[1024]; if((fd=socket(PF_UNIX,SOCK_STREAM,0))<0){ perror("socket"); exit(1); } memset(&saddr,0,sizeof(saddr)); addr.sun_family=AF_UNIX; strcpy(addr.sun_path,SOCK_NAME); if(connect(fd,(struct sockaddr *) &addr,sizeof(addr))<0){ peror("connect"); exit(1); }
714 :
710 :2006/05/14(日) 20:16:55
while(nbytes=read(0,buf,sizeof(buf))){ write(fd,buf,nbytes); nbytes = read(fd,buf,sizeof(buf)); write(1,buf,nbytes); } close(fd); exit(0); } 以上がサンプルでもらったストリーム型のecho serverとclientです。 これと同じようなものをデータグラム型でお願いします。
715 :
689 :2006/05/14(日) 20:17:24
できた〜!!!俺って天才w お前ら死ねよ
天才が2時間かかる問題か・・・
アッ、シーッ!!
[1] 授業単元:バイナリファイル処理 [2] 問題文(含コード&リンク): 要素型がdoubleで要素が10である配列の全要素の 値を読み書きするプログラムの作成。 [3] 環境 Mac [4] 期限: 出来れば今日中に [5] その他の制限:なし お願いします
719 :
billy :2006/05/14(日) 21:43:30
[1] 授業単元: [2] 問題文(含コード&リンク): 実行例 % cat source This,is,source. end. % gcc -o filebreak kadai.c % ./filebreak source -- Line 1 -- Field 1: This Field 2: is Field 3: source. -- Line 2 -- Field 1: end. [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C
720 :
689 :2006/05/14(日) 21:55:58
>>716 じゃあ、やってみろよwww
てか意味すらわかんないんだろwwwww
721 :
デフォルトの名無しさん :2006/05/14(日) 22:10:23
>>720 こんな問題ここに持ってこようとしてる時点で
お前は頭悪すぎなんだよwwwww人としても痛い人のようだしwww
だから友達できないんだよwwwwwwwwww
723 :
デフォルトの名無しさん :2006/05/14(日) 22:18:50
>>718 #include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int main(void){
double x[SIZE];
FILE *in,*out;
if((in=fopen("input.dat","rb"))==NULL)exit(1);
fread(x,sizeof(double),SIZE,in);
fclose(in);
if((out=fopen("output.dat","wb"))==NULL)exit(1);
fwrite(x,sizeof(double),SIZE,out);
fclose(out);
return 0;
}
>>724 助かりました。ありがとうございます!!
>>718 #include <stdio.h>
#include <stdlib.h>
void readBinaryfile( char *filename )
{
int i;
double d;
FILE *file = fopen( filename, "rb" );
for( i=0; i<10; i++ )
{
fread( &d, 1, sizeof(d), file );
}
fclose( file );
}
void main()
{
readBinaryfile( "hoge.txt" );
}
もう回答あったのねん
728 :
デフォルトの名無しさん :2006/05/14(日) 23:46:35
>>693 #ifndef SUB_H__
#define SUB_H__
#define EXTN
#else
#define EXTN extern
#endif
//------------------------------------------------------------------------
// グローバル変数
//--------------------------------------------------------------------
EXTN LPDIRECT3D9 g_pD3D = NULL; // Direct3Dデバイスを作成するのに使われるオブジェクト?
EXTN LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // レンダリングデバイス
EXTN LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // Buffer to hold vertices
上の #ifndef 以下を足せばコンパイルは通る
しかし、Cの基本からやり直すことをお勧めする。
定石なので覚えるとよし
>>617 #include <stdio.h>
#include <string.h>
void del_digit( char str[] )
{
int i, j, len;
len = strlen(str);
for( i=0; i<len; i++ )
{
if( (str[i]>='0') && (str[i]<='9') )
{
for( j=i; j<len; j++ )
{
str[j] = str[j+1];
}
str[j] = '\0';
i--;
}
}
}
void main()
{
char str[80] = "AAAALKJLK1122LDF0099FLK29348";
del_digit( str );
}
【質問テンプレ】 [1] 授業単元: ポインタ [2] 問題文(含コード&リンク): 文字列s1とs2が等しければ(先頭 からナル文字までが全て同じであれば)1を、そうでなければ0を返す関数 int str_equal(const char*s1,const char*s2)を作成し、確認せよ [3] 環境 UNIX [4] 期限 5月16
732 :
デフォルトの名無しさん :2006/05/15(月) 00:11:00
>>730 int str_equal(const char *a, const char *b)
{ return *a == *b && (!*a || str_equal(a+1, b+1)); }
>>731 さすがにキンタマ.exeを踏む奴はいないと思われ
>>720 #qrsvar NOF(k) ((k)*(1-2*((hafvtarq)(k) >> 0k1s)))
楽勝すぎ
なぜrot13
>>730 #include <stdio.h>
int str_equal( const char *s1, const char *s2 )
{
do {
if ( *s1 == '0' && *s2 == '0' )
return 1;
} while ( *s1++ == *s2++ );
return 0;
}
int main( void )
{
char *s[] = { "ABC", "ABC", "abc", "def" };
printf( "str_equal(\"%s\", \"%s\") : %d\n",
s[0], s[1], str_equal(s[0], s[1]) );
printf( "str_equal(\"%s\", \"%s\") : %d\n",
s[2], s[3], str_equal(s[2], s[3]) );
return 0;
}
>>731 [環境]: UNIX な人に .exe 仕掛けてもさ、とか思う。
まぁ 2ch は Win でしてるんだろうけど。
>if ( *s1 == '0' && *s2 == '0' ) また高度なネタを
720 がハッタリで回答を出させるために煽ってるだけかもしれないから。
>>730 #include <stdio.h>
#include <string.h>
int str_equal(const char*s1,const char*s2)
{
int i, len1, len2;
len1 = strlen(s1);
len2 = strlen(s2);
if( len1 != len2 ) return 0;
i = 0;
while( i < len1 ) {
i++;
if( s1[i] != s2[i] )
break;
}
if( i == len1 ) return 1;
return 0;
}
void main()
{
char str1[] = "123123123";
char str2[] = "123123123";
printf( "%s と %s は等しいですか?\n", str1, str2 );
printf( "答え:%d (0:等しくない 1:等しい)\n", str_equal( str1, str2 ) );
}
>>738 よくぞ見抜いた
いや、まぁ天然だったが。
答え出してもりk
>if ( *s1 == '0' && *s2 == '0' ) if ( *s1 == '\0' && *s2 == '\0' ) に変更
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): 方程式f(x)=x*x-4*x+1=0の小さな方の解をニュートン法で求めるプログラムを作成し、結果を x=****** として表示するプログラムを作成せよ。 [3] 環境 [3.1] OS: WinXP [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 for Win32 [3.3] 言語: C [4] 期限: 2006.5.18 --- 自分でやったところは↓までです。 大きい方の解がでてしまって、どうやったら小さい方の解が出るのかがわかりません。 #include <stdio.h> #include <math.h> main(){ double x,xnew,e; e=pow(10,-10); xnew=2006.0; while(fabs(xnew-x)>e){ x=xnew; xnew=((-1.0+4*x-x*x)/(2.0*x-4))+x;} printf("x=%f\n",xnew); }
744 :
742 :2006/05/15(月) 00:38:39
すんまそん 自分環境winです UNIX環境は分からんです
>>743 xnewの初期値を-2006あたりに設定すると良いとおもう
ニュートン法を直感的に理解せずにアルゴリズムだけコピペしました的な。
>>745 ありがとうございます!!
>>746 理解してません…(´・ω・`)
1個前の課題も違う関数をニュートン法で求めるもので、その漸化式の初期値が2006.0だったのでそのままやってました…
ところでなぜ本を読まない?インターネットを調べない? 馬鹿になるぞ本当にここで聞いていいのはヒントだけだぞ
ここで聞いていいのは解答だけです
[1]授業単元:プログラムの基礎U [2]問題文:通貨の換金レートを入力し、 円からドル、ないしはドルから円へと計算するプログラムを作れ。 尚、以下の仕様を厳守する事。 1/円からドル、またはドルから円への選択をさせる。 2/マイナスの円及びドルを入力で終了。 3/換金レートの入力は「1ドル=○○円」もしくは、「1ドル=○○円○○銭」といった形にすること。 4/以下の4つの関数を必ず含めなさい。 A:レートを入力する関数(レートの値を戻り値) B:円からドルを計算する関数(円とレートを引数、ドルを戻り値) C:Bの逆 D:結果を表示する関数(結果を引数) [3]環境 OS:Linux コンパイラ gcc 言語:C [4]期限 5月16日 よろしくお願いします
751 :
デフォルトの名無しさん :2006/05/15(月) 02:41:02
1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): graph.txtにて表現されるグラフに対し、点0からスタートして点6に到着する まで隣接する点にランダムに移動を行った場合の経路(閉路を含んでもよい) を表示するプログラムを作成せよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc(ver?) [3.3] 言語: C [4] 期限:できれば今日中に・・・ [5] その他の制限:制限はないが、ヒント ・現在の点をpos,移動後の点をnextとし、乱数を利用してnextを決定する。posの初期値は0 ・nextが6になれば終了。そうでなければpos←nextとして上の処理を繰り返す ・rand()関数を使うことで0以上RAND_MAX以下の整数乱数を作成することができる。 例えば、0以上s未満の乱数を発生させたい場合には、次式のようにする r=(double)rand()/(RAND_MAX+1.0)*s; ・乱数の初期化にはsrand()関数を使う。引数に乱数の種(正整数)を入れる。 この値を変化させることで、異なる乱数系列が発生する。例:srand(3) graph.txtは↓です
752 :
751 :2006/05/15(月) 02:45:23
graph.txtの内容 7 0 1 3 1 2 4 4 3 2 3 0 4 0 6 5 6 4 5 1 6 2 6 ←ここまでです グラフは辺行列です。1行目は点の数。それ以下は辺情報です。 辺情報:例えば0 1は点0から点1に辺がつながっている。 よろしくお願いいたします。
[1] 授業単元:ファイル処理 [2] 問題文(含コード&リンク):コピー元ファイル名、コピー先ファイル名をキーボードから 読み込んで、ファイルの内容を画面に表示しながらコピーするプログラムを作成せよ [3] 環境 [3.1] UNIX [3.2] [3.3] [4] 期限 今週まで お願いします
>>754 #include<iostream>
#include<fstream>
#include<string>
int main(){
std::string src,dst;
std::cout << "in =";std::cin >> src;
std::cout << "out =";std::cin >> dst;
std::ifstream ifs(src.c_str());
std::ofstream ofs(dst.c_str());
for(char c;ifs.get(c);){
std::cout.put(c);
ofs.put(c);
}
}
ありがとうございます。 これで提出します。
D言語をちょっとかじって見たいんだが、どうよ?D?
齧っても見えないと思うな。
763 :
デフォルトの名無しさん :2006/05/15(月) 16:04:40
[1] 授業単元:プログラミング基礎 [2] 問題文 何人かが集まったとき同じ誕生日の 人が1組以上存在する確率が自分で入力した値:p(0.01≦ p≦ 0.99)以上 となるのは、何人以上集まったときか、を求めるプログラムを作成します for文もしくはwhile文を必ず使用して下さい [3] 環境 [3.1] Windows [3.2] ? [3.3] 言語C よろしくお願いします。
764 :
初心者 :2006/05/15(月) 16:33:49
【質問テンプレ】 [1] 授業単元:c言語 [2] 問題文(含コード&リンク):キーボードから 1、二つのベクトルx、y 2、スカラーs 3、行列B を読み込み、 1、内積xy 2、sx、sy 3、Bx、By を求めるプログラムをそれぞれ作成せよ。 [3] 環境 [3.1] OS: Linux gnome2.4 [3.2] gcc [3.3] 言語: C [4] 期限: 今週中 [5] とくに無し。 宜しくお願いします。
765 :
デフォルトの名無しさん :2006/05/15(月) 16:52:45
[1] 授業単元:プログラミング演習1 [2] 問題文(含コード&リンク): 仕入れ値と利益率(%単位)を読み込んで、売値を計算するプログラムを作成せよ。計算は以下の式に従え。 なお、利益率は0%以上99%以下で1%刻みとする。 売値=仕入れ値+利益+税金 利益=仕入れ値×利益率÷(100−利益率) 税金=(仕入れ値+利益)×5/100 [3] 環境 [3.1] OS: (Windows [3.2] コンパイラ名とバージョン: Visual Studio.NET2003 [3.3] 言語: C++ [4] 期限: 5月26まで [5] その他の制限: まだ初期。関数printf,scanfの分野
766 :
C++初心者 :2006/05/15(月) 17:08:27
[1] 授業単元:プログラミング演習1 [2] 問題文(含コード&リンク): 変数nameには名前変数amountには貯金額(最初は0円)が入っている。以下のように3回貯金できるプログラムを作成せよ。ただし、変数はname,amount以外には1つしか使えない _______________________________________________________________________ 名前を入力してください:michinobu michinobuさん. 現在の貯金額は0円です. 今回はいくら貯金しますか?(単位:千円):10,5 michinobuさん. 現在の貯金額は、10500円です. 今回はいくら貯金しますか?(単位:千円):0、03 michinobuさん 現在の貯金額は、10530円です. 今回はいくら貯金しますか?(単位:千円):100、0 michinobuさん. 全部で110530円貯まりました. よくがんばりました. [3] 環境 [3.1] OS: (Windows [3.2] コンパイラ名とバージョン: Visual Studio.NET2003 [3.3] 言語: C++ [4] 期限: 5月26まで [5] その他の制限: まだ初期。関数printf,scanfの分野 。算術演算子、代入演算子など
>>765 #include <iostream>
using namespace std;
int main()
{
int nCostPrice, nMarginPerc;
cout << "仕入れ値と利益率は?" << endl;
cin >> nCostPrice >> nMarginPerc;
cout << "売値: " << nCostPrice + nMarginPerc * nCostPrice / (100 - nCostPrice) + (nCostPrice + nMarginPerc * nCostPrice / (100 - nCostPrice)) * 5 / 100 << endl;
return 0;
}
計算するの面倒なんでべた書き
情報落ちとか起きてても知らん
>>764 誤爆先に謝ってこい
>>766 全角数字だし,や、が混合してるしめんどくさいのもほどがある
769 :
デフォルトの名無しさん :2006/05/15(月) 17:21:33
>>763 #include <stdio.h>
void main(void){
float p;
int i;
double temp=1;
printf("確率は?p(0.01≦ p≦ 0.99)");
scanf("%f",&p);
if(p<0.01 || p>0.99){//入力された確率が条件を満たしていないなら強制終了
printf("ばーか!");
exit(1);
}
for(i = 1;1-temp>p;i++){//i=1...2人あつまった時に題意を満たすかどうかをfor文の抜ける条件文で判定。
temp=1; //i=2...3人あつまった時、i=3...4人集まった時となる。
for(p=i;p>0;p++){//(365*364*363*....)/(365*365*365*....)をこのfor文で計算
temp*=365-p;
temp/=365;
}
}
printf("%d人",i+1);
}
適当。動作確認もしていない。
>>769 C99非準拠の処理系だとコメントでエラー出るなw
771 :
C++初心者 :2006/05/15(月) 17:27:33
>>768 すみません。書き直します。
[1] 授業単元:プログラミング演習1
[2] 問題文(含コード&リンク): 変数nameには名前変数amountには貯金額(最初は0円)が入っている。以下のように3回貯金できるプログラムを作成せよ。ただし、変数はname,amount以外には1つしか使えない
_______________________________________________________________________
名前を入力してください:michinobu
michinobu さん.
現在の貯金額は,0円です.
今回はいくら貯金しますか?(単位:千円):10.5
michinobuさん.
現在の貯金額は,10500円です.
今回はいくら貯金しますか?(単位:千円):0.03
michinobuさん
現在の貯金額は、10530円です.
今回はいくら貯金しますか?(単位:千円):100.0
michinobuさん.
全部で110530円貯まりました.
よくがんばりました.
[3] 環境
[3.1] OS: (Windows
[3.2] コンパイラ名とバージョン: Visual Studio.NET2003
[3.3] 言語: C++
[4] 期限: 5月26まで
[5] その他の制限: まだ初期。関数printf,scanfの分野 。算術演算子、代入演算子など
>>728 動きません。まったく状況変わらず
main.obj : error LNK2005: "struct IDirect3D9 * g_pD3D" (?g_pD3D@@3PAUIDirect3D9@@A) は既に logo.obj で定義されています。
main.obj : error LNK2005: "struct IDirect3DDevice9 * g_pd3dDevice" (?g_pd3dDevice@@3PAUIDirect3DDevice9@@A) は既に logo.obj で定義されています。
main.obj : error LNK2005: "struct IDirect3DVertexBuffer9 * g_pVB" (?g_pVB@@3PAUIDirect3DVertexBuffer9@@A) は既に logo.obj で定義されています。
C:\Documents and Settings\*\My Documents\Visual Studio 2005\Projects\directxtest05\Debug\directxtest05.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
>771 #include <stdio.h> char name[256] = {0}; int amount = 0; void input(void){ float f; printf("%sさん\n現在の貯金額は,%d円です. \n今回はいくら貯金しますか?(単位:千円):",name,amount); scanf("%f",&f); amount += (int)(f*1000); } int main(){ printf("名前を入力してください:"); scanf("%s",name); input(); input(); input(); printf("%sさん.\n全部で%d円貯まりました.\nよくがんばりました.\n",name,amount); return 0; }
更新しました PASS:cpp
775 :
デフォルトの名無しさん :2006/05/15(月) 18:00:19
>>762 結構めんどいじゃん。動作確認?何それ?
#include <stdio.h>
#define PCNOKAZU 10
int itibandekaino(int count);
void change(int a,int b);
int stuno[PCNOKAZU] ={10,12,13,46,4,5,6,4,8,9};
int hostno[PCNOKAZU]={111,113,116,184,165,166,100,101,135,156};
int hikaku=0;
int koukan=0;
void main(void){
int max;
int i;
for(i = 0;i<PCNOKAZU;i++){
max=itibandekaino(i);
change(i,max);
}
for(i = 0;i<PCNOKAZU;i++)printf("%d,",stuno[i]);puts("");
for(i = 0;i<PCNOKAZU;i++)printf("%d,",hostno[i]);puts("");
printf("ばーろー%d,ちぇんじ%d",hikaku,koukan);
}
776 :
デフォルトの名無しさん :2006/05/15(月) 18:01:26
int itibandekaino(int count){ int i; int maxno=count; for(i=count;i<PCNOKAZU;i++){ hikaku++;//はいはい。比較わろすわろす if(hostno[i]>hostno[maxno]) maxno=i; } return maxno; } void change(int a,int b){ int temp; koukan++;//はいはい。交換わろすわろす。 temp=stuno[a]; stuno[a]=stuno[b]; stuno[b]=temp; temp=hostno[a]; hostno[a]=hostno[b]; hostno[b]=temp; printf("先生のふぇらきぼんぬ"); }
777 :
718 :2006/05/15(月) 18:09:02
教えてくださったプログラムにsample.cに対して gcc sample.c ./a.out を入力しても プロンプトが表示されたままなのですが、実行の手順が違うのでしょうか?
そらそうだ。 自分で中身確認用のprintf文くらい追加しなさいよ。 他の確認法としては、 input.datとoutput.datの中身が同じになってるはずだ。
779 :
718 :2006/05/15(月) 18:20:27
>>778 どのように追加したらよいか教えてもらえないでしょうか?
自分で勉強っすべきなのですが、時間が迫っていて・・
780 :
C++初心者 :2006/05/15(月) 18:23:27
>>767 #include <stdio.h>
void main(void)
{
float
から始めるとどうなります?
781 :
751 :2006/05/15(月) 18:37:16
782 :
デフォルトの名無しさん :2006/05/15(月) 18:37:48
#include <stdio.h> #include <stdlib.h> #define SIZE 10 int main(void){ double x[SIZE]; FILE *in,*out; //x[0]-x[9]まですべての配列にinput.datに書き込んである変数を読み込む if((in=fopen("input.dat","rb"))==NULL){printf("input.datが存在しないんじゃないの?\n");exit(1);} fread(x,sizeof(double),SIZE,in); fclose(in); //x[0]-x[9]まですべての配列書き込んである変数をoutput.datに書き込む if((out=fopen("output.dat","wb"))==NULL)exit(1); fwrite(x,sizeof(double),SIZE,out); fclose(out); //x[0]-x[9]まですべての配列を表示する printf("x[0]:%f,x[1]:%f,x[2]:%f,x[3]:%f,x[4]:%f,x[5]:%f,x[6]:%f,x[7]:%f,x[8]:%f,x[9]:%f,",x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9]); return 0; }
783 :
デフォルトの名無しさん :2006/05/15(月) 18:41:25
784 :
751 :2006/05/15(月) 18:44:56
785 :
シン :2006/05/15(月) 18:53:43
【質問テンプレ】 [1] 授業単元: 文字列 [2] 問題文(含コード&リンク):一定時間感覚で、自分の名前を右から左へと テロップのように流しながら表示するプログラムを作成し、実行せよ ASDF_TYU SDF_TYUA DF_TYUAS (省略) [3] 環境 UNIX
786 :
シン :2006/05/15(月) 18:54:17
よろしくお願いします
787 :
デフォルトの名無しさん :2006/05/15(月) 18:58:08
かわいそうなので、とき方の一例をば。 変数が可変だからな。 グラフの扱い方をどーするかでめんどくさ度がかわってくる。 例えば、点の個数が10以下とかたかだか知れてるなら グラフをgraph.txtの例なら graph[7][7]={1,4,6,0,0,0,0},//点0と隣接している点のリスト {6,0,0,0,0,0,0},//点1と隣接している点のリスト {4,3,6,0,0,0,0}, {1,0,0,0,0,0,0}, {3,5,0,0,0,0,0}, {6,0,0,0,0,0,0}, {0,0,0,0,0,0,0};//点6と隣接している点のリスト となるように読み込む。 で、例えばこの配列をもとに、 hennokazu[7]={1,3,1,2,1,0}; みたいに、点から伸びている辺の本数も保存していく。 後は next=graph[pos][rand()%hennokazu[pos];]; で、探査していけばいいんじゃね?
788 :
billy :2006/05/15(月) 18:58:18
[1] 授業単元: [2] 問題文(含コード&リンク): 実行例 % cat source This,is,source. end. % gcc -o filebreak kadai.c % ./filebreak source -- Line 1 -- Field 1: This Field 2: is Field 3: source. -- Line 2 -- Field 1: end. [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C
>780 アンカーミスだと判断。 #include <stdio.h> void main(void) { float f; char name[256] = {0}; int amount = 0; printf("名前を入力してください:"); scanf("%s",name); #define input printf("%sさん\n現在の貯金額は,%d円です. \n今回はいくら貯金しますか?(単位:千円):",name,amount); \ scanf("%f",&f); \ amount += (int)(f*1000); input input input printf("%sさん.\n全部で%d円貯まりました.\nよくがんばりました.\n",name,amount); } 問題の後付けはやめようぜ。
>>728 やっても動かなかったので
正しく動くように直してうpしてください・・。
ループを使いたいなら↓ 変数1個ていうのは厳しいな #include <stdio.h> void main(void) { float loop; char name[256] = {0}; int amount = 0; printf("名前を入力してください:"); scanf("%s",name); for(loop=0;loop<3;++loop){ printf("%sさん\n現在の貯金額は,%d円です. \n今回はいくら貯金しますか?(単位:千円):",name,amount); scanf("%f",((float*)(name+sizeof(name)-sizeof(float)))); amount += (int)(*(float*)(name+sizeof(name)-sizeof(float))*1000); } printf("%sさん.\n全部で%d円貯まりました.\nよくがんばりました.\n",name,amount); }
>>790 正常な動作が何かと述べられていないのに正しくって何?
794 :
シン :2006/05/15(月) 20:17:38
>>792 私に対してでしょうか?
1907とは?
>>794 最初にアップロードしたソースは間違ってたって事
気にしなくておk
>>785 /* なんかできたから貼っとく。 */
#include <stdio.h>
#include <string.h>
#include <unistd.h>/* unixと言うことなのでsleep()を使った。 */
void telop(const char * str)
{
unsigned ic;
unsigned len = strlen(str);
for (ic = 0; ic < len; ++ic) {
printf("%.*s%.*s\n", len - ic, & str[ic], ic, str);
sleep(1);
}
printf("%s\n", str);
}
int main(int argc, char ** argv)
{
if (argc > 1) {
telop(argv[1]);
}
return 0;
}
最近宿題投稿者の態度がすごい雑な気がする
799 :
シン :2006/05/15(月) 20:48:10
801 :
792 :2006/05/15(月) 20:56:11
しまった 一定時間感覚部分のコードが無いw
正直すまんかったw
>>797 の人の使ってくだちい
しかしなんか難しいコードだな
printf("%.*s%.*s\n", len - ic, & str[ic], ic, str);
初めて見たわ サパーリ分からん(汗
[1] 授業単元: [2] 問題文(含コード&リンク):水平タブを考慮して、テキストの幅を正しく 調べることが出来るように以下のプログラムを改良せよ (タブ幅は8と家庭してよいが、異なるタブ幅にも簡単な改造で対応できるようにするのが 望ましい) [3] 環境 UNIX [4] 期限 水曜日まで #include <stdio.h> int main(){ int c; int width, maxwidth = 0; while((c == getchar()) != EOF){ if(c == '\n'){ if(width > maxwidth) maxwidth = width; width = 0; } else width++; } printf("%d\n", maxwidth); return 0 ; } どうかおねがいします・・ 後、この上のプログラムに対して (プロンプト) gcc sample2.c (プロンプト)./a.out 12 9877 ^D となって終了条件がわかりませんでした。 こちらのほうのアドバイスもよろしくお願いします
803 :
802 :2006/05/15(月) 21:06:12
802のプログラムではタブも1文字と数えてしまう為正しく計算できないとのことです
804 :
シン :2006/05/15(月) 21:09:52
>>801 わかりました
この797サンのプログラムは難しいものをつかっているのでしょうか?
始まって1ヶ月なのであまり難しいものだとばれてしまうのですが・・
805 :
792 :2006/05/15(月) 21:15:37
>>804 漏れは学部4年生の糞で頭悪いから理解できないだけかも知れないが
見たことがないコードを使ってるので回避した方が良いかも知れん
>>792 はポインタとか使わずに配列コピーと連結根性処理でやってるから
たぶんばれないはず エレガントさとか欠片も感じられないがw
一定時間感覚を実現したければ
>>797 を参考にして
#include <unistd.h>を追加して
最後のプリント文の下にsleep(1);を入れればそれっぽくなる
806 :
シン :2006/05/15(月) 21:19:30
>>802 結局タイプミスの修正以外は何もやらなかったと…。
#include <stdio.h>
#define TAB_WIDTH (8)
int main()
{
int c;
int width=0, maxwidth = 0;
while ((c = getchar()) != EOF) {
switch(c) {
case '\n':
if (width > maxwidth)
maxwidth = width;
width = 0;
break;
case '\t':
width += TAB_WIDTH;
width -= width % TAB_WIDTH;
break;
default:
width++;
}
}
if(width > maxwidth)
maxwidth = width;
printf("%d \n ", maxwidth);
return 0;
}
808 :
デフォルトの名無しさん :2006/05/15(月) 21:22:16
【質問テンプレ】 [1] 授業単元:プログラミング [2] 問題文 a1=1+1/2 a2=1+1.0/2 a3=1+1/2.0 a4=1.0+1.0/2.0 の計算を行うプログラムを作成せよ。 [3] 環境 [3.1] Linux [3.3] 言語C [4] 期限: 明日の朝 [5] その他の制限: doubleを使用 お願いします。
>>808 #include <stdio.h>
int main()
{
double a1,a2,a3,a4;
a1=1+1/2;
a2=1+1.0/2;
a3=1+1/2.0;
a4=1.0+1.0/2.0;
printf("a1=%lf a2=%lf a3=%lf a4=%lf \n", a1, a2, a3, a4);
return 0;
}
811 :
デフォルトの名無しさん :2006/05/15(月) 21:49:07
>>810 何がひどいんだよ。糟。
>>809 すいませんが、scanfを使ったやつもお願いします。
812 :
デフォルトの名無しさん :2006/05/15(月) 21:59:22
【質問テンプレ】 [1] 授業単元:計算機ソフトウェア [2] 問題文(含コード&リンク):一連の男女の名前と経歴を読み込み、経歴の似ている男女を組み合わせ、できたカップルの リストを出力するプログラムを考えよ。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4] 期限: 5/17 [5] 制限なし
なんで、lfなんだろう fはまだしもlはこの場合…
815 :
デフォルトの名無しさん :2006/05/15(月) 22:19:23
誰か808の正しい答えを教えてください
817 :
デフォルトの名無しさん :2006/05/15(月) 22:21:15
818 :
809 :2006/05/15(月) 22:21:42
>>814 うわ、そうだった。scanf() の用法と脳内で混ざってたよorz
819 :
デフォルトの名無しさん :2006/05/15(月) 22:28:11
具体的データもなにも与えられていないんです。 適当に自分でファイルを作るようです。 何を使用していいかもわからないので、プログラムの方向性などを教えてくれたら 助かります。
820 :
デフォルトの名無しさん :2006/05/15(月) 22:38:23
821 :
デフォルトの名無しさん :2006/05/15(月) 22:38:34
822 :
デフォルトの名無しさん :2006/05/15(月) 22:38:40
823 :
デフォルトの名無しさん :2006/05/15(月) 22:38:41
>>819 俺もわかんなくて困ってるんだよね。あんなのできるほうがおかしいって
825 :
デフォルトの名無しさん :2006/05/15(月) 22:38:45
826 :
デフォルトの名無しさん :2006/05/15(月) 22:38:47
>>819 ですよね。何事もベクトルを考えなきゃね。
828 :
デフォルトの名無しさん :2006/05/15(月) 22:38:55
>>819 そうだよ具体的なデータを提示しろよなあ?
829 :
デフォルトの名無しさん :2006/05/15(月) 22:39:01
>>819 そうだよな。宿題ならきちんとデータとか提示されるべきだ
>>同意
832 :
デフォルトの名無しさん :2006/05/15(月) 22:39:06
833 :
デフォルトの名無しさん :2006/05/15(月) 22:39:08
834 :
デフォルトの名無しさん :2006/05/15(月) 22:39:23
835 :
デフォルトの名無しさん :2006/05/15(月) 22:39:31
836 :
デフォルトの名無しさん :2006/05/15(月) 22:39:36
837 :
デフォルトの名無しさん :2006/05/15(月) 22:39:38
838 :
デフォルトの名無しさん :2006/05/15(月) 22:39:39
>>819 俺も勉強している。
とりあえずハローワールドを習得した
839 :
デフォルトの名無しさん :2006/05/15(月) 22:39:43
もう、なんとなくだら〜
841 :
デフォルトの名無しさん :2006/05/15(月) 22:40:00
842 :
デフォルトの名無しさん :2006/05/15(月) 22:40:20
>>819 俺もそこがわからない
具体的なデータも与えられないで作るのは無理だよな
843 :
デフォルトの名無しさん :2006/05/15(月) 22:40:37
844 :
デフォルトの名無しさん :2006/05/15(月) 22:40:39
845 :
デフォルトの名無しさん :2006/05/15(月) 22:40:59
846 :
デフォルトの名無しさん :2006/05/15(月) 22:42:46
847 :
デフォルトの名無しさん :2006/05/15(月) 22:45:56
>>844 現在パスカルの教科書を利用していて、トップダウンプログラムという
章を勉強しているのですが、その中の一問が課題でだされ、そのまま引用しました。
しかも、c言語でつくらなければ・・・
848 :
820 :2006/05/15(月) 22:56:46
820ですがなんですか?この流れ
849 :
デフォルトの名無しさん :2006/05/15(月) 22:59:47
850 :
809 :2006/05/15(月) 23:01:11
851 :
デフォルトの名無しさん :2006/05/15(月) 23:10:55
LFにする必要はないってこと?
そうですね。
853 :
759 :2006/05/15(月) 23:16:28
759お願いできませんか... 参考プログラムに文字コードのReadOneWord、暗号,複合化のpower_modを 組み込めばできるみたいなんですけど、自分じゃどこに入れればいいかわからないんです...
854 :
797 :2006/05/15(月) 23:44:19
結構流れちゃったけど書いたからには一応フォロー。
>>805 見たことがないってあんた、printf()くらい見るでしょうが。
後は型指定子にオプションつけて幅を指定しているだけ。
これが載ってない入門書は多いけど、便利なんだから
これを機に読めるようになっておいたら?
って、このままじゃ>805が可愛そうだから付け加えると、
Cで飯食ってる10年もののプログラマが、sprintf()一つで
済む処理を100行ほど掛けて書いてた例もある。
下を見るか上を見るかはお好きな方を。
>>853 その、「参考プログラムに云々」ってのは他人の書いた糞コードを読まなきゃいけないから面倒なんだよね。
第一、「上の二つのプログラム」自体まともに使える代物じゃないのに。
857 :
デフォルトの名無しさん :2006/05/16(火) 01:40:51
階乗10!はしなくていいの? ホーナー法を用いる関数では係数をグローバルな配列として宣言しても良いんだよね?
859 :
802 :2006/05/16(火) 06:10:30
>>807 すみません・・ どうもありがとうございました。
857のうちの一つ //・4次多項式 f(x)= 1x^4 + 2x^3 + 4x +5 //(ホーナー法を用いる) //x( x^3 +2x^2 +4)+5 //x( x( x^2+2x) +4)+5 //x( x( x (x+2) ) +4)+5 //x( x( x (x+2) +0) +4) +5 #define KOU 4 int hona(const int x, int cnt) { const int kei[KOU] = {1,2,0,4}; // x^ static int f = 0; if ( cnt == 1 ) return f = x * kei[cnt-1]; else { f = x * ( hona(x, cnt-1) + kei[cnt-1]); return f; } } int main() { int kai = 0, x; printf ("f(x) = 1x^4 + 2x^3 + 4x +5\n"); printf ("input x:"); scanf ("%d", &x); kai = hona( x, KOU )+5; printf("f(2) = %d\n",kai); return 0; } 自信ないのでアンカ無し。これだから俺みたいな無学は困る(´・ω・`)
ホーナー法ってなに? 昔カープとかにいた外人選手か? しかし、あれだね〜 今や小学生でもパソコン持ってても不思議じゃない時代 無料コンパイラもあるわけだし。 当然最近のスペックの物なら、快適に動くだろうし ネットで探せば、すぐソース見つかったりするし 良いね〜 俺が大学生の時初めて買ったパソコンはマック240MHz1.4GHD はは、これじゃ、俺の持ってるギリモザのファイル一枚すらはいらねえや ま、とりあえず こんだけインターネットが普及して、パソ持っててあたりまえの時代だ だから、言いたいのは ちょっとは努力しろ、それもある理論を手書きで、偏微分して〜 このベクトル値を絶対値にかえて〜・・・・で、やっと任意の式を作って それからアルゴリズム考えて・・・・ってなレベルじゃないだろ 大学図書館も今やパソ系の本もいっぱいあるだろうし、ググれるし・・・・ ググるなんて指を動かしマウスでスクロールするだけだぜ。楽勝じゃん。 とりあえずホーナー法はググっただけですぐ出てきた 難しくない。考えるんだ。それが血となり肉となりいつかは骨につきようとも それは立派な人生だ
授業単元: ポインタ 問題文(含コード&リンク): 配列内の要素を指すポインタに対して比較や減算を行うプログラムを作成し、 その結果を確認せよ。 環境、UNIX お願いします
>>862 >1
>861
なんつーか、授業に沿った回答しないといけなさそうだな。
つーより、只の授業内容の確認だろ。
片付けてやるなんてレベルじゃないよ。
>>862 #include <stdio.h>
int main(void)
{
int arr[]={1,2,4,8};
int *p = arr;
printf("%10s%p\n","p = ",p);
printf("%10s%p\n","&arr[3] = ",&arr[3]);
printf("%10s%d\n","arr[3] = ",arr[3]);
printf("%10s%d\n","*(p+3) = ",*(p+3));
return 0;
}
あー、減算だった。まあいいかw
ググってみたがホーナー法ってのは、高次の項から括っていくことで 計算量減らすやり方みたいだな なんか昨今のコンパイラなら最適化してくれそうな気もするが・・・
>>866 に自己レス
VC++2005で試したが、各項を計算した後、lea命令でまとめて計算してやがる・・・
[1] 授業単元: プログラムの基礎B-2 [2] 問題文(含コード&リンク): 問:5 まず二つの整数を読み込む。 そこから最小公倍数、及び最大公約数を計算するプログラムを作成する。 main関数の他、以下4つの関数を必ず用いよ。 A:整数の読み込み {読み込んだ整数を戻り値とする関数} B:最小公倍数の計算{二つの整数を引数、結果を戻り値} C:最大公約数の計算{同上} D:結果の表示{最大公約数、最小公倍数を引数} [3] 環境 [3.1] OS: バインリナックス [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語: C [4] 期限: 5月17日 [5] その他の制限: if,swich,for分と、この問題を解くのに最低限の関数を習いました
>>868 最大公約数だけ作った
int gcd(int x1, int x2)
{
return (x1 == x2 ? x1:
x1 > x2 ? gcd(x1 - x2, x2) : gcd(x1, x2 - x1));
}
int gcd(int a, int b) { retrun (b) ? gcd(b, a%b) : a; }
871 :
858 :2006/05/16(火) 12:00:26
[1] 授業単元:プログラミング初級 [2] 問題文(含コード&リンク): 下に示すファイルhw.datに保存されている 名前、身長、体重の個人データを1件ずつ読み込んで画面に表示し、 最後に平均身長と平均体重を表示するプログラムを作成せよ。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー p1 160 59,2 p2 174 64,5 p3 182 78,3 p4 162 51,6 ーーーーーーーーーーーーーーーーーーーーーー [3] 環境 [3.1] OS: UNIX [3.2] [3.3] 言語: c [4] 期限: 木曜日まで よろしくお願い申し上げます
#include <stdio.h> #define FILE_LINE_LENGTH (200) #define FILE_NAME "hw.dat" #define NAME_LENGTH (50) int main() { unsigned count = 0; double totalHeight = 0; double totalWeight = 0; char buf[FILE_LINE_LENGTH]; FILE * fp = fopen(FILE_NAME, "r"); if (fp == NULL) { fprintf(stderr, "File not found or can't open.\n"); return 1; } while (fgets(buf, sizeof(buf), fp) != NULL) { char name[NAME_LENGTH]; double height; double weight; if (fscanf("%s%lf%lf", name, & height, & weight) != 3) { fprintf(stderr, "Illegal data.\n"); return 1; } printf("%s\t%g\t%g\n", name, height, weight); totalHeight += height; totalWeight += weight; ++count; } fclose(fp); printf("average\t%g\t%g\n", totalHeight / count, totalWeight / count); return 0; }
874 :
872 :2006/05/16(火) 13:15:57
875 :
学生 :2006/05/16(火) 16:16:38
[1] 授業単元:IEEE規格754による実数表現 [2] 問題文(含コード&リンク): 長さが32の0と1の列 s e(7) e(6) ... e(0) d(1) d(2) d(3) ... d(23) を入力して、このビット列の表す実数値(実数の表現の仕方はIEEE規格754に従うものとする)を出力するCプログラムを作成せよ。 (ー1)^s×(1+M)×2^E if -127<E<128 (ー1)^s×M×2^(E+1) if E=-127 Inf if E=128,M=0 NaN if E=128,M!=0 M=Σ^23_i=1 d(i) × 2^(-i) E=Σ^7_i=0 e(i) × 2^i -127 [3] 環境 [3.1] OS: UNIX [3.2] [3.3] 言語: C [4] 期限: [2006年5月17日12:00まで] [5] その他の制限: pow(,)などの数学関数は使ってはいけないらしいです。 全く意味がわからないので、お手数お掛けしますが、どうぞよろしくお願いいたします。
細かい事だが、 「Inf if E=128,M=0」 じゃなくて 「+Inf if E=128,M=0,s=0 -Inf if E=128,M=0,s=1」 じゃないか?
>>875 #include <stdio.h>
int main(){
int i, s = 1, e = 0, bias = 127;
bool a[32]={0,
1,0,0,0,0,0,1,1,
0,1,0,1,1,0,1,1,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0
};
double out = 1.0, m = 0, mm = 1.0 / 2, ee = 1.0;
// s
s = a[0];
// e
for(i = 0; i < 8; i++)if(a[1 + i])e += 1 << 7 - i;
e -= bias;
if(e == 128){
if(m == 0)puts("+INF");
else puts("-INF");
return 0;
}
else if(e > -127 && e < 128)m += 1.0;
else e += 1;
// m
for(i = 0; i < 23; i++, mm /= 2)if(a[9 + i])m += mm;
//表示
if(s)putchar('-');
for(i = 0;i < e; i++)ee *= 2.0;
printf("%f\n", m * ee);
return 0;
}
879 :
デフォルトの名無しさん :2006/05/16(火) 20:18:00
10を3で割ると3.33333…という循環小数になりますが、これを計算してコンソールに表示するCプログラムを書いてみましょう。表示が3.333333となる(小数点以下に3が6桁表示される)プログラム が正しいプログラムです。 って問題が学校で出たんですが、最近Cはじめたばっかで分かりません。 一応学校ではLinuxのemacsを使ってやってるんですが・・・ こんなかんじで作ってみたんですが・・・ #include main(int argc, char *argv[]) { int i; double d; i = 10/3; d = 10%3; printf("int: %d\n", i); printf("double: %e\n", d); } これでコンパイルすると、exponent has no digitsとでるんです。なんとかお教え願えませんか?
printfの精度指定弄れば3.333333333って表示も可能なんだがな これって正しくないのか?w
>>879 まず
#include<stdio.h>
じゃね?
つーか、なんで % ?
日本語(SJIS)と対応する2バイトの16進コードを出力したいのですが できますか? [1] レポート [2] 日本語(SJIS)と対応する2バイトの16進コードを出力せよ 例:81AO □ こんな感じです [3] 環境 [3.1] OS: Windows XP SP2 [3.2] Visual Studio 2005 [3.3] 言語: C/C++ [4] 期限: できれば早く
>>885 サンクス
やっぱり、できないんですか・・・
それではIMEを16進と一緒に全部出力とかも、できないのでしょうか?
>>884 // unicodeでプロジェクト作ったら巧くいかない
const char * foo = "□";
printf("%02x%02x %s\n", foo[0], foo[1], foo);
>>884 16進数ってO(オー)123456789ABCDEFで表せばいいのか?
890 :
888 :2006/05/16(火) 21:07:06
ちっ、釣られちまったぜ。
>>889 失礼しましたミスタイプです
16進数の出力形式ですが
81 A0
こんな感じです
>>882 <stdio.h> が HTML タグとみなされて削除されたんだと思われ。
893 :
884 :2006/05/16(火) 21:26:38
>>888 微妙に逆バージョンで
0x81A0を渡して、□を出したいのですが
int x = 0x81A0;
printf("%s", x);
当然これでは失敗です・・・
#include <stdio.h> int main(){ char s[3]; s[0]=0x81; s[1]=0xa0; s[2]=0x00; printf("%s", s); return 0; } こうゆうこと?
895 :
884 :2006/05/16(火) 21:55:46
なぁ、そろそろincludeがどうしたとか言うのやめようぜ
【質問テンプレ】 [1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): #include <stdio.h> int main(void) { char a[25]; int b; scanf("%s", a); scanf("%d", &b); printf("**** String is : %s ****\n", a); printf("**** Value is : %d ****\n", b); } において実行時に「This is<enter>」と入力すると,どのようになるか. また,7行目の「&b」の「&」がないと,どうなるか.それぞれ結果を示し,なぜそのような結果になったかを考察せよ. [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語: C [4] 期限: 06/05/22 [5] その他の制限: printf・scanf・算術演算子・代入演算子・比較演算子まで習いました。 ポインタはまだ習ってません。scanfにおいて%s以外のときは必ず付けろと習っただけです。 実行結果 ・「This is<enter>」と入力した場合 This is **** String is : This **** **** Value is : -858993460 **** ・9行目の「&b」の「&」がない場合 This is **** String is : This **** **** Value is : -858993460 ****
>>898 ブレークポイントを置いてデバッガで観察。
scanf()の%sによる文字列の変換は、先行する空白文字を取り除いた上で 幅指定の範囲内で次の空白文字までを読み込む仕様である。 このため、件の入力を与えた場合、"This"のみaに格納される。 また、%sによる数値の変換も同様に、先行する空白文字を取り除いた上で 幅指定の範囲内で数字文字のみを読み込む仕様である。 このため、件の入力を与えた場合、bにはなにも格納されない。 従って、その後のprintf()の出力で"Vallue is :"の後に何が出力されようと鼻から悪魔である。 このように、課題とはいえ未初期化の変数をそのまま出力するような 糞コードを書くことは言語道断である。 また、同じ理由で%sに幅制限をつけないことは糞コード以前の問題である。 尚、bへの変換が行なわれない以上&bを渡さなかったとしても何ら問題はない。 scanf()は正常に動作を終了してしまう。 従って、無意味なコードの意味を考察させると言う糞の足しにもならない課題と言える。
901 :
デフォルトの名無しさん :2006/05/17(水) 00:54:22
>>861 返事ありがとうございました。
何とか自力でできました。しかし、なんか無理ぽ。
902 :
デフォルトの名無しさん :2006/05/17(水) 01:15:53
[1] 授業単元: プログラミング基礎演習TA [2] 問題文(含コード&リンク): 10を3で割ると3.33333…という循環小数になりますが、これを計算してコンソールに表示するCプログラムを書いてみましょう。表示が3.333333となる(小数点以下に3が6桁表示される)プログラム が正しいプログラムです。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:emacs21.3.1 [3.3] 言語:C [4] 期限: (2006年5月17日17:00まで) [5] その他の制限: 今のところ「Cの計算式、変数とその代入」「コメント、データ型、宣言文」というところまでやりました。 #include <stdio.h> int main(int argc, char *argv[]) { int i; double d; i = 10/3; d = 10%3; printf("int: %d\n", i); printf("double: %e\n", d); } は自分で書いてみたんですが、コンパイルすると「exponent has no digits」とでてくるのでちゃんとしたのができません。 先ほどはルールを読まず大変失礼いたしました。お願いします。
#include <stdio.h> int main(int argc, char* argv[]) { printf("%f\n", 10.0 / 3.0); return 0; }
すぐに返信していただきましてどうもありがとうございました。ちゃんと表示されました。本当にありがとうございました!
argcとargvはどこで使っているのかな?(・∀・)
>>902 の問題文に禿しくツッコミを入れたくなるのは俺だけか?
そもそも宿題にするレベルのプログラムかと(ry
[1] 授業単元: プログラミング通論 [2] 問題文(含コード&リンク): 算術式を表す文字列を標準入力から読み込み、atoi()関数を用いて数字のみを取り出し出力せよ (標準入力) char buf[80]; fgets(buf, 80, stdin); (実行結果の例) 文字列を入力してください:2005+5/17 2005 5 17 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 5月18日
[1] 授業単元:プログラミング言語 [2] 問題文:「異なるn個の物からr個とる組合せ」をすべて表示し さらに、その順列(並び替え?)を組み合わせごとにすべて表示するプログラムを作れ [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 5月18日まで どちらかと言えば、自主選択課題です。 が、4月からCを学び始めたもので全然プログラムが組めません。 関数(comb)?再帰? 参考になりそうなものも見つかったのですが理解できませんでした。
>>908 #include <stdio.h>
int main()
{
char str[32];
scanf("%s", &str);
atoi(str);
printf("%d",str);
}
いけね、>911は>908宛てじゃなくて>910宛てね。
>>908 #include <stdio.h>
#include <ctype.h>
int main (void){
int i=0;
char str[64];
scanf("%s",str);
while(str[i]!='\0'){
if(isdigit(str[i])){
printf("%d\n",atoi(str+i));
while(isdigit(str[i++])); /*Jump to Nondigit*/
}
else i++; /*Jump to Digit*/
}
return 0;
}
自然対数の底eについて e=1+1/1!+1/2!+・・・+1/n!+・・・が成り立つ (問題)eの値を求めるのに近似値e(n)=1+1/1!+1/2!+・・・+1/n! (n>=1) を計算する。n=5,6・・・,15 に対するe(n)の値を計算して表示させよ。 ただしe(n)の値は小数点以下10桁に揃えて以下のように表示させること e 5=*.********** e 6=*.********** ・・・ e15=*.**********
#inclde<stdio.h> void main(void){ int i; double e=0,k=1; for(i=1;i<=15;i++){ k=k*i; e=e+1.0/k; if(i>=5){ printf("e %d =%lf",i,e); } } }
916 :
915 :2006/05/17(水) 11:31:07
アンカー忘れてた
>>914 あとスペルミス
#include
携帯から無茶しましたorz
917 :
& ◆nLgOQJCewI :2006/05/17(水) 12:08:16
>>464 ありがとうございました、
本当に感謝です。
1)科目名:C言語入門
(2)問題:
以下に示すプログラムは整数nを読み込んだ後,n個の数の総和を計算するプログラムである.
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1912.txt 以下の5つの関数を作成し,main関数では関数を呼び出すだけにプログラムを書き直せ.
整数 ndata を読み込む関数(引数:無し,戻り値:ndata)
数 xval を読み込む関数(引数:無し,戻り値:xval)
読み込んだ数 xval と足しこんだ値 xsum を渡すと和を計算する関数(引数:xval, xsum,戻り値:xsum)
結果を表示する関数(引数:xsum,戻り値:無し)
平均 ave を計算する関数を新たに作成せよ.(引数:xsum, ndata,戻り値:ave)
(3)環境:OS/Linux コンパイラ/gcc 言語/C言語
(4)期限:5月18
よろしくお願いしまっす!
質問です。 文字列の数列を数字に直すatoiという関数はありますが、 その逆の働きをする数字を文字列の数列に直す関数というのはあるのでしょうか? ない場合にはどのように処理をするか教えてください。 例: "09" → 9 という感じです。 どうかよろしくお願いします。
atof
char buf[64]; int a = 12345; sprintf(buf, "%d", a); 的なことだろうか
>>921 それに近いです。
例がちょっと間違っていました。
9 → "9" ですね。
いま辞書で調べたらstrtol()で出来そうなのでためしてみます。
>>919 例を見ると、文字列から数字に変わってるけど
924 :
923 :2006/05/17(水) 14:40:35
出し遅れた
実験課題でコンパイラ作る過程でitoaを作ったのを思い出した 10で割った余りをズラッと並べた文字列を最後に全部ひっくり返すというアホな考え方w sprintfで一行で済むとも知らず・・・w orz
>>921 ありがとうございます。
おかげですっきろと解決できました。
しかし、新たな問題が…。
すっきろ!!
おかげさまで上手く解決できました。 本当にありがとうございます。 sprintfは大変勉強になりました。 Cって本当文字の扱いが難しいですね。
929 :
884 :2006/05/17(水) 19:19:41
>>894 >>884 です
夕べはどうもでした
一晩寝て起きて考えたら、悩みました
#include <stdio.h>
int main(){
char s[3];
s[0]=0x81;
s[1]=0xa0;
s[2]=0x00;
printf("%s", s);
return 0;
}
s[0]=0x81;
s[1]=0xa0;
これは理解できます
しかし
s[2]=0x00;
は何の為に入れているのでしょうか?(0x00終端文字?)
SJISは2バイトコードなので、
s[2]=0x00;
が入ることによって3バイトになるのでは?
"□"の見た目は1文字だけど内部的には s[0]=0x81;s[1]=0xa0; のように2文字なので文字じゃなく文字列として扱わないといけない。 そして基本的に文字列は0で終わってないとだめ。
>>909 つ『C言語による最新アルゴリズム事典』
>>751 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define GRAPH_FILENAME "graph.txt"
int read_graph(int **pgraph, int *n){char buf[100];
FILE *f=fopen(GRAPH_FILENAME,"r");if(!f)return 0;
fgets(buf,sizeof(buf), f);*n = atoi(buf);if(!*n ){fclose(f);return 0;}
*pgraph=calloc(*n**n, sizeof(int));
while(!feof(f)){int l=-1,r=-1;fgets(buf,sizeof(buf),f);sscanf(buf,"%d %d",&l,&r);
if(0<=l&&l<*n&&0<=r&&r<*n){(*pgraph)[l**n+r]=1;(*pgraph)[r**n+l]=1;}}
fclose(f);return 1;}
int main(){
int *graph,n,pos=0;if(!read_graph(&graph,&n))return 1;srand(time(0));printf("%d\n",pos);
while(pos!=6){
int new_pos;do{new_pos=(double)rand()/(RAND_MAX+1.0)*n;}while(!graph[pos*n+new_pos]);
pos=new_pos;printf("%d\n",pos);}
return 0;}
今更だが、やっと投稿できるIPが回ってきたので、せっかく作ったので出してみた。
ケーブルって不便やな、こういうとき。
934 :
884 :2006/05/17(水) 20:16:36
くどいようですみません、下記の様に
SJISコードの0x8140〜0x81f0までを、foo.txtに書込みました
>>930 氏の説明を読み、c言語の規則として額面通り受入れたいのですが
foo.txtをバイナリエディタで開いても、
81 40 81 41 81 42 81 43 81 44 81 45 81 46 81 47と規則正しく並び
s[2]=0x00;
文字列終端コードは見受けられないのですが・・・・・
#include <stdio.h>
FILE *fp;
int main(){
char s[2];
int x = 0x81;
int y ;
fp = fopen("foo.txt" ,"w");
for(y = 0x40 ;y < 0xf0 ;y++ )
{
s[0]=x;
s[1]=y;
s[2]=0x00;
fprintf(fp, "%s" ,s );
//fputs(s , fp);
printf("%s" , s);
}
return 0;
}
935 :
884 :2006/05/17(水) 20:19:50
スマソ ×char s[2]; ○char s[3]; に訂正です
936 :
931 :2006/05/17(水) 20:35:49
>884 '\0' (0x00) はメモリ上の印。ここで文字列が終わりますよ、っていう。 0x00はどんな文字コードでも使われないはず。だから終端の印として機能する。 これはただの終端の印であって、printfしたときや、ファイルに書き出したときは もちろん0x00は除いて書き出される。 strcat(a,b)の例で言えば、もちろんa[strlen(a)]にあった、'\0'が取り除かれて b[0]がコピーされることからも分かるように、'\0'は文字列の一部としての意味は持たない。 >c言語の規則として額面通り受入れたいのですが まあ、そういう理解でかまわないと思う。
[1] 授業単元:プログラミング技術V [2] 問題文(含コード&リンク): 演習1(必須) 2つの整数を読み込み、最大公約数と最小公倍数を計算するプログラムを作成せよ。 但し、main関数のほかに以下の関数を必ず使用すること。 ・整数の読み込み(読み込んだ整数を戻り値とする関数) ・最大公約数の計算(2つの整数を引数、結果を戻り値) ・最小公倍数の計算(2つの整数を引数、結果を戻り値) ・結果を表示する関数(最大公約数、最小公倍数を引数) [3] 環境 [3.1] OS: Linux [3.2] コンパイラ:gcc [3.3] 言語: C言語 [4] 期限: 明日提出です・・ >918とおなじ演習があるんですが同じ学校なのかなw よろしくお願いします!
最小公倍数。でかい数は知らん。 int lcm(int a,int b){ int x=a; int y=b; while(x!=y){ if(x<y) x+=a; else y+=b; } return x; }
gcm = a x b / lcm
逆だた
943 :
デフォルトの名無しさん :2006/05/17(水) 23:03:25
OS:WindowsXP 言語:C++ 「ナイトの巡回」のプログラミングで宿題なんですが… バックトラック法を用い、 6×6の盤で初期位置を(1,1)とし、 すべてのマスを埋めるというものです。 ただ条件があって、 ・各マスに優先度を指定し、優先度が高い方を優先して移動するようにする。 ・優先度は次の次まで考慮する(次に移動するマスで優先度が並ぶものがあった場合の対策) ・すべてのパターンを見つけるのにかかる時間、 パターン数、 移動に成功した回数(駒が移動した回数をカウントするんですが、その移動がまちがいだとわかって戻るときの移動は回数に含めない) を出力するというものです。 3,4日考えてるんですがうまくいきません。 時間にゆとりがある人がいらっしゃればこれを満たすプログラムを教えてくれませんか? お願いします。
>>943 次の次が等しい優先順位だった場合どちらを選択するのか
マスの動き方(?)
>すべてのマスを埋める
?
すべてのマスを網羅するでいいのか
>>943 いわゆるナイト巡回問題と同様に以下の条件は前提としてよいか?
・開始マスを除き各マスを1回だけ通る。
・最後は開始マスに戻る。
対称解は別パターンとみなすか?
すべてのパターンを見つけるのなら優先度は最終的には関係なくないか?
ll
947 :
デフォルトの名無しさん :2006/05/18(木) 01:44:06
>>944 次の次が同じ優先度ならその場合はどちらにいっても構わないということです。
すべてのマスを網羅するでOKです。
>>945 「開始マスを除き各マスを一回だけ通る」で結構です。
ただ最後に開始マスに戻る必要はないです。あくまですべてのマスを網羅するだけでいいです。
よろしくお願いします。
自分も今奮闘中です。。
948 :
デフォルトの名無しさん :2006/05/18(木) 01:50:07
>>945 補足です。
対象解も別パターンとみなします。
確かに優先度の必要性が良くわからないですね…どうなんだろ…
>>947 「開始マスを除き各マスを一回だけ通る」なら移動回数は35だろう。
あとはパターンだけか。
950 :
デフォルトの名無しさん :2006/05/18(木) 02:04:44
>>949 確かに自分も最初そう思ったのですが、「移動回数」ではなく「移動成功数」だそうです。
たとえば、
初期位置→1→2→3(この移動が間違い)
↓
4→6→7
↓
5(この移動が間違い)
といった具合です。
文面で伝わったでしょうか…
マスに番号振って 移動先が移動可能なマスの中で一番高くないと間違いと言うこと?
952 :
デフォルトの名無しさん :2006/05/18(木) 02:14:39
>>951 えっと優先度のことでよかったでしょうか?
一応自分は6×6のマスに
234432
346632
468832
468832
346643
234432
というように優先度を決めてやってます。
ただこれをどう活かせばいいのかで困っていて…
>>943 できれば問題文をそのまま載せて欲しい。
優先度の使い方がいまいち分からん。
954 :
デフォルトの名無しさん :2006/05/18(木) 02:42:07
>>953 問題文を載せたいところなんですが、
この宿題は初めから口頭で伝えられただけのもので明確な決まりはないんです。
つまり条件さえ満たせばどのようにやってもいいみたいです…
優先度の解釈も基本的にはやる人任せみたいな感じでした…すいません。
955 :
デフォルトの名無しさん :2006/05/18(木) 03:01:25
【質問テンプレ】 [1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): 最初に与えた数に従って、以下の例のように表示するプログラムを作成せよ。ただし、変数は1個しか使えない。 <実行例1> 数(整数)を入力してください:43 43:39 42:40 41:41 40:42 39:43 <実行例2> 数(整数)を入力してください:10 10:6 9:7 8:8 7:9 6:10 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:Visual stdio.net 2003 [3.3] 言語: C [4] 期限: 06/05/22 [5] その他の制限: printf・scanf・算術演算子・代入演算子・比較演算子まで習いました。 ポインタはまだ習ってません。scanfにおいて%s以外のときは必ず付けろと習っただけです。
#include <stdio.h> int main(){ int a; printf("数(整数)を入力してください:"); scanf("%d", &a); printf("%d:%d\n", a, a - 4); printf("%d:%d\n", a - 1, a - 3); printf("%d:%d\n", a - 2, a - 2); printf("%d:%d\n", a - 3, a - 1); printf("%d:%d\n", a - 4, a); return 0; }
957 :
デフォルトの名無しさん :2006/05/18(木) 03:24:45
>>943 バックトラック中に優先度の低い方に行っていいの?
959 :
デフォルトの名無しさん :2006/05/18(木) 03:45:38
>>958 常に優先度の高い方に行かないとダメかと思います。
963 :
billy :2006/05/18(木) 09:16:31
[1] 授業単元:演習 [2] 問題文(含コード&リンク): 引数のファイルに含まれる文字列を、カンマを区切りとして単語に分けて 出力するプログラムを作成する。 実行例: % cat source This,is,source. end. % gcc -o filebreak kadai.c % ./filebreak source -- Line 1 -- Field 1: This Field 2: is Field 3: source -- Line 2 -- Field 1: end. [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 5月19日
>>963 #include <stdio.h>
#include <string.h>
int
main()
{
char buf[BUFSIZ], *ptr, *cp;
int line, field;
for (line = 1; fgets(buf, sizeof(buf), stdin); line++) {
buf[strlen(buf) - 1] = '\0';
printf("-- Line %d --\n", line);
for (field = 1, cp = buf; ptr = strtok(cp, ","); field++) {
printf("Field %d: %s\n", field, ptr);
cp = NULL;
}
}
return 0;
}
965 :
デフォルトの名無しさん :2006/05/18(木) 15:58:32
いきなりすいません。 ちょっとお聞きしたいことがあって書き込みました。 今ファイル処理をやっていて、xxx.datファイルを読み込むことはできたのですが、そこから自動的にxxx.pgmを出力するやり方がわかりません。 名前を固定してしまえばできるのですが、自動的にってのがわからないので、教えてください。 お願いします。
>>965 文字列fnameの後ろから3文字を"pgm"に置き換えるすさまじく単純な方法w
strcpy( fname + strlen(fname) - 3, "pgm");
# include <stdio.h> double average(double sum, int num); double average(double sum, int num) { return sum / num; } int main(void) { double input; int num = 0; double sum = 0; while(scanf("%lf", &input) == 1 && input > 0) { sum += input; num++; } if(num == 0) printf("No data.\n"); else printf("average: %.3f\n", average(sum, num)); return 0; }
970 :
969 :2006/05/18(木) 17:35:13
ごめん。averageはこっちが正しい。 return (double)(int)(sum / num * 1000 + 0.5) / 1000;
average関数内では、平均を求めること以外のことを行ってはいけない.
972 :
969 :2006/05/18(木) 17:41:38
>戻り値は平均(合計を回数で割った数の小数点以下4桁目を四捨五入したもの)とする. とあるから、四捨五入も平均を求める作業に含まれると思うが。
>>970 さん
ありがとうございました
サンプルプログラムでも、四捨五入をしていたのでOKです。
[1] 授業単元:演習 [2] 問題文(含コード&リンク): キーボードから0以上の整数を1つ読込み、 入力した数と同じ個数の文字'+'を一行に表示するプログラムを作成しなさい。 *条件 負の数が入力された場合は、"error"とエラーメッセージを表示して終了する。 整数以外の入力は考えなくてよい。 0が入力された場合は、空行(何も文字が表示されていない行)を表示する。 [3] 環境 [3.1] OS:linux [3.2] コンパイラ名とバージョン: gcc4.00 [3.3] 言語: C [4] 期限:06年05月18日 [5] その他の制限:特に無し 以上ですよろしくお願いします。
>>974 # include <stdio.h>
int main(void)
{
int n,i;
scanf("%d",&n);
if (n>=0){
for (i=0;i<n;i++){
printf("+");
}
}else{
printf("error!\n");
}
return 0;
}
977 :
デフォルトの名無しさん :2006/05/18(木) 20:00:51
【質問テンプレ】 [1] 授業単元: 復習 [2] 問題文(含コード&リンク): キーボードから 行と列それぞれ数値1〜80までの値を入力し それ以外の物が入力されたら正しい入力がされるまで繰り返す。 なお、入力した値分 #を描画し長方形を表示するものとする。 [3] 環境 [3.1] OS:Windows [3.2] Visual C++ 2005 [3.3] 言語:C言語 [4] 期限:06年05月20日 [5] その他の制限:正しい値以外は絶対に通らないように製作。ファンクションや複数キーを含む
【質問テンプレ】 [1] 授業単元: プログラミング演習I [2] 問題文(含コード&リンク): 住所録の作成と検索 個人の情報を格納し、整理するプログラム 扱う項目:姓、名、住所、電話番号(もちろん架空のもの) [3] 環境 [3.1] OS:Windows [3.2] bcc [3.3] 言語:C言語 [4] 期限:06年05月21日0時 [5] その他の制限:姓、名で検索を行い、検索結果を標準出力に表示 よろしくお願いしますm(._.)m
>>977 #include<stdio.h>
int main(void){
int i,j;
int n,m;
do{
scanf("%d",&n);
}while( !(n>0) && !(n>80) );
do{
scanf("%d",&m);
}
while( !(m>0) && !(m>80) );
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("#");
}
printf("\n");
}
return 0;
}
980 :
979 :2006/05/18(木) 20:41:03
ごめん今コンパイルしたらバグってたorz
>>979
>>979 は多分↓にすれば動く
do{
scanf("%d",&n);
}while( (n<0) || (n>80) );
do{
scanf("%d",&m);
}
while( (m<0) || (m>80) );
982 :
billy :2006/05/18(木) 20:53:27
983 :
977 :2006/05/18(木) 21:07:23
本当にありがとうございます。間に合いそうです。
[1] 授業単元: [2] 問題文(含コード&リンク): ------------------------------------------------------------------------------- 次のような, 日付を表すクラスDateを実装してみてください. Dateは, 年, 月, 日をそれぞれintの値で持っている. Dateは, 1日日付を進めるメンバ関数を持っている. Dateは, 1日日付を戻すメンバ関数を持っている. 始めは単にそれぞれの値をget(取得), set(設定)するメンバ関数と, 単なる値を書き変えるだけのメンバ関数を作れば良いでしょう. それができたら, 各月の日数や閏年を考慮するものも作ってみましょう. また, あると便利そうなメンバ関数も追加してみましょう. (例えば日付の表示をするなど) ヒント:閏年は, 「400で割り切れる」または「100で割り切れなくて4で割り切れる」年です ------------------------------------------------------------------------------- [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:Visual Studio .NET 2003 [3.3] 言語:C++ [4] 期限:2006/5/26
[1] 授業単元:プログラミングI
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1916.txt キーボードから1つの実数を入力し(その数をaとする),
半径aの円の面積
辺の長さがaの正方形の面積
辺の長さがaの正方形からそれに対して内接する円の部分を除いた面積
(正方形の面積から内接する円の面積を引いたもの)
の3種類の面積を求めるプログラムを作成しなさい.
このとき, 円の半径を引数として与えたとき,面積を戻す関数double circle(double r)と,
正方形の辺の長さを引数として与えたとき,面積を戻す関数double square(double s)を 作成しなさい.
main関数部は,以下のプログラムの雛形に対して,
正方形に内接する円の部分を除いた面積を求めるための追加以外の変更を加えないこと. また,面積は小数点以下2桁で表示すること.
[3] 環境
[3.1] OS: (Windows/Linux/等々)
[3.2] コンパイラ名とバージョン:gcc 4.0
[3.3] 言語: C
[4] 期限:明日の朝9時まで
[5] その他の制限:無し
よろしくお願いします。
>>985 記入漏れが有りました。
OSはLinuxです。
よろしくお願いします。
988 :
デフォルトの名無しさん :2006/05/18(木) 22:17:01
>>987 この問題は大学何年生くらいのレベルなんですか?
991 :
デフォルトの名無しさん :2006/05/18(木) 23:02:40
>985 double circle(double r) { /* ここを作成する */ return r * r * PI; } double square(double s) { /* ここを作成する */ return s * s; } include文の下に #define PI 3.141592 っていれてね。 これが出来ないとこれからきついと思われ。
>>987 自己参照構造体ってことは
リスト構造で動くようにしろと考えておkなのかな?
うん、問題見たら線形リストはまったく関係ないね 問題見ないで言うもんじゃないね サーチするときにでも使うのではないかと予想
>>985 >>991 サンの出してくれた奴に、3番目の
>>辺の長さがaの正方形からそれに対して内接する円の部分を除いた面積
を導く式を追加してね。
rgrg
998 :
991 :2006/05/19(金) 00:26:48
>996 おっと、読みすごした。スマソ
↓綺麗に終わっておくれ
日々之精進 1000なら皆が宿題を理解できる
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。