1 名前:デフォルトの名無しさん [2008/10/30(木) 07:49:39 BE:113605834-PLT(24065)] あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。 【質問者へ】 回答者の便宜のため、質問の際は以下を行うことを推奨します。 ・質問は【質問テンプレ】を利用してください。 ・問題文は、出題されたまま全文を書いてください。 ・問題文やコードをリンクするときは、一言内容にについて説明をつけましょう。 ・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。 ・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。 ・後から問題に付け足しするのはコラー!!です。付け足しは作業を無駄にしがちです。 ・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。 【質問テンプレ】 [1] 授業単元: [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS: (Windows/Linux/等々) [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: (C/C++/どちらでも可 のいずれか) [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm 【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html 【過去ログ検索】 chomework.sakura.ne.jp/ 【wiki】 www23.atwiki.jp/homework/ 前スレ C/C++の宿題を片付けます 116代目 pc11.2ch.net/test/read.cgi/tech/1222813731/
175 名前:=92 mailto:sage [2008/11/03(月) 23:01:28 ] >>112 問題文(1)は、 lim (i = 0 -> n-1) Σx^i = 1/(x-1) に書き直すと分かりやすかったかも。 元が、lim (i = 1 -> n) Σx^(i - 1) になってると、ちょっと混乱w 連投ごめんなさい。
176 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:06:12 ] >>174 double型って、 符号(1bit) | 指数(11bit) | 仮数(52bit) の64ビットで構成される数の事言ってる?
177 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:11:28 ] >>165 ベキ級数ですから、収束条件は |x| < 1 ですしね。どうなんでしょうね。
178 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:14:45 ] >>112 くらいのプログラムなら初心者にとっては勉強になるモンなんだろな 規格が出来る前は浮動小数点型が>>176 の構成だとは限らなくて 機種依存だったわけだし。 これからも128bit機とかがでたらdoubleの構成が変わるかも?しれん
179 名前:クソースでおじゃっ mailto:sage [2008/11/03(月) 23:20:18 ] >>112 #include <stdio.h> #define BPB 8 // 1byte / 8bit void hoge(double x) { int i,j; char *p; for(i=sizeof(x)-1,p=(char*)&x; i>=0; i--) { for(j=BPB-1; j>=0; j--) { printf("%d",(p[i]>>j)&1); } printf(" "); } } int main(void) { double a[]={1.0, 0.1, 0.0/0.0, -1.0/0.0, 1.0/0.0, -3.14}; int i; for(i=0; i<sizeof(a)/sizeof(a[0]); i++) { printf("a = %lf \n",a[i]); hoge(a[i]); puts(""); } return 0; }
180 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 23:20:21 ] double のデータ構造がどうこうよりビット操作やビットマスクの 勉強としての意義のほうが大きいと思う。
181 名前:デフォルトの名無しさん [2008/11/04(火) 00:14:43 ] [1] 授業単元: プログラミング [2] 問題文(含コード&リンク): y=cos(x)の座標を*でプロットするプログラムを作ります。 範囲は[0, 4π]です。 [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] できるだけ早く [5] その他の制限:ループと条件分岐、putcharを使う よろしくお願いします。
182 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:19:07 ] >>146 う〜〜〜ん・・・・伝わらないよ>< 205×5−1で1024個になるって意味なんですけど。。。 つまり205行5列で1024個ってことなんですけど。 どうでしょうか? 伝われば幸いです。 malloc
183 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:33:06 ] >>178 double(MSDNだとreal*8で引くと良い?)よりもlong doubleが変わりそう。 real*10はFPUが80bitで・・とかのあたりだろうし。 というか、>>172 、>>174 もとの質問番号書いといてくれ。 間に割り込み多すぎて、どれに対する反応かわからんw >>180 だね。 printf("%s", (MSDNの浮動小数点のページの内容)); してもしかたないしw >>182 君の気持ちを受信した。 [204][4]をどうするかの問題は残るが、適当に処理しよう。
184 名前:183 mailto:sage [2008/11/04(火) 00:57:50 ] data.txtを確認しなおしました。 整理すると、 1行目〜205行目 -> [0][0]〜[204][4] (ただし[204][4] にあたる部分はデータなし) 206行目〜410行目 -> [205][0]〜[409][4] (ただし[409][4] にあたる部分はデータなし) ・・・ という感じですね。 で、最後が、 〜209920行目 -> [209715][0]〜[209919][4] (ただし[204][4] にあたる部分はデータなし) で、209920 / 205 = 1024と。 (最後の209921行目はEOFしか入っていないので、データの最後はその前の行) で、mallocは、[0][0]〜[204][4]と同じサイズx1024を確保したいと。 (2次元配列の1箇所だけ空けるわけにいかないので、確保するのは1025 x 1024) だいぶ見えてきたね。
185 名前:183 mailto:sage [2008/11/04(火) 03:38:21 ] >>182 途中経過。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7936.txt 平均、標準偏差などの計算周りを実装。ファイルへの出力部が未実装。 ごめん、原型はなくなった。
186 名前:183 mailto:sage [2008/11/04(火) 04:16:29 ] >>182 あ、一個忘れてた。問題どれが正しいのかわからん。 出力は、 (>>134 によると) ・出力は、縦方向は1024行。横はデータ次第。 ・data.txtのデータ(data[i])が(ave) + 5*(sd)以上の時だけ出力する(画面に?ファイルか?) ・[206][0],[206],[1],・・・,[411][2],[411][3]だけ、 標準偏差(== sd)以上の値をpeak.txtに出力する。 (->とりあえず、[206][0],[206],[1],・・・,[411][2],[411][3]だけでなく、 1024個全部出力しとく。標準偏差1個だけ出力したいわけではなさそうなので。) (>>63 によると) ・data.txtのデータ(data[cnt]) < ave(== 平均値)以下のとき、 標準偏差をpeek.txtに出力する。(分散も?ファイル名あってる?) (もとの問題文(7914.txt)によると) Bが最終的に欲しいものとして、 ・データ1024個ごとのブロック内の最大値と、周波数(そのブロック内の何番目のデータか)を、 peek.txtに出力。 ->これはどうがんばっても、各ブロックごとに1個しか最大値がないので、 縦1列になる。これを横5個とかに並べなおして出力?(横にいくつ並べるかは書いてないが) あと、@の ・各ブロックの、平均値と、最大値と、(ave + 5*sd)以上のデータを、それぞれ 計算する(画面に表示する??)、最大値だけはBでpeek.txtに出力する (かなりがんばって解釈したが、これで良いのか?) @は今回は関係なし?
187 名前:183 mailto:sage [2008/11/04(火) 04:17:42 ] >>182 続き。 とりあえず、(63の条件の) powを使って分散を計算、そこから標準偏差の計算までは実装済み。 以下、すべて予定。 こんな時間に見てなさそうだから、出力は全部画面に向けとく。 ファイルへの出力は、134を信じて、peek.txtに標準偏差が出るようにしておく。 あとは、好きなのをファイル出力に向けなおして。 途中で寝てなければ、そのうちアップする。
188 名前:183 mailto:sage [2008/11/04(火) 05:56:00 ] >>182 いかん、ぼけとった。 >>186 の内容を一部修正。 (>>134 によると) のところ。3個目。 ・出力するのは、標準偏差でなく、個別データだった。(最終行で間違った。) ということは、[206][0],[206],[1],・・・,[411][2],[411][3]だけで良いのか? (今書きかけのプログラムのは、全部出してるが。) ・標準偏差(== sd)以上の値 -> これは、平均値+標準偏差だと思うので、ave + sdにしておいた。 あと、>>185 で貼ったソース。 分散を求めるところでj=0でクリアしているが、ループの他のところでも使っているので、アウト。 分散の計算は、ループから分離した。 そろそろ時間が近いな。。
189 名前:183 mailto:sage [2008/11/04(火) 06:07:37 ] >>182 もう一個発見。 >>183 の (>>63 によると) のところ。 (data[cnt]) < ave(== 平均値)以下のとき標準偏差を出力、 は意味を成さない。 (data[cnt]) < ave(== 平均値)以下のdata[cnt]を出力、が正しそうだ。 それから、不明点。 ・各ブロック([0][0]〜[204][4])とかの何番目にあるか == 周波数 ・何ブロック目か == 周波数 // ([0][0]〜[204][4])が1、([205][0]〜)が2 これのどちらが正しい? 問題文で1024個のそれぞれが周波数に対応としているが、 どっちの1024個かわからんとです。 とりあえず、各ブロック([0][0]〜[204][4])とかの何番目にあるか == 周波数 としたが。。 。。。書いてるうちに、もう一個発見。 [206][0],[206],[1],・・・,[411][2],[411][3]は、区切りがずれとるな。。
190 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 06:09:01 ] 落ち着け
191 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 06:20:04 ] 無駄に複雑化した気が。 てかはじめのままで何でだめなの
192 名前:183 mailto:sage [2008/11/04(火) 07:29:45 ] >>182 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7937.txt とりあえずこんな感じか? 出力の条件がいろいろあったので、それぞれ出しておいた。 出力条件ごとに別ループにしてあるので、 いらないのは、コメントアウトする事。 あと、ファイルに出力したのは、 [205][0],[205],[1],・・・,[409][2],[409][3]の中で、 data > aveを満たすデータ。 横5個で改行。
193 名前:183 [2008/11/04(火) 07:31:43 ] >>191 答え:出力条件が違う。出力フォーマットが違う。出力するものが違う。
194 名前:183 mailto:sage [2008/11/04(火) 07:35:31 ] >>191 その前に、問題文がちがう・・・のが大きかった あと、もう一個理由追加。 無駄にmallocしてるから。(問題の条件にあるから)
195 名前:183 mailto:sage [2008/11/04(火) 07:45:24 ] 入力ファイルは2次元(205x5)でも、 1次元(1024)の配列で処理すれば、本来はいける。 (というか、その方が処理が格段に楽。) 205x5が1024にならない、という突っ込みは、どこか上の方を参照。 最後の1個が欠けたデータなんだ。 今回の問題は、 ・入力データ(17.2MB)を丸ごと配列に押し込む、 ・配列は、double[205 * 1024][5] の制約付き。 これも、どこか参照。 簡単な版作る?
196 名前:183 mailto:sage [2008/11/04(火) 08:10:37 ] 始めの方を元に作り直そうと思ったけど、strtokの使い方があやしいのと、 varの計算が間違ってるのと・・を直さないといけないんだった。 分散を(1/n) * sum(val)^2 - ave^2で求めようとしてるところ。(実際は違う値を求めてるが・・) 今回のプログラムでは、これを本来の(1/n) * sum((val - ave)^2)に 戻した分、ループがかさんで見えるはず。 誤差を気にしないのであれば元の式でもOKらしいが・・ 元の式のままで行くなら、式を置く位置を変更かな。
197 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 08:13:08 ] r;ァ'N;:::::::::::::,ィ/ >::::::::::ヽ . 〃 ヽル1'´ ∠:::::::::::::::::i i′ ___, - ,. = -一  ̄l:::::::::::::::l . ! , -==、´r' l::::::/,ニ.ヽ l _,, -‐''二ゝ l::::l f゙ヽ |、 ここはお前の日記帳じゃねえんだ レー-- 、ヽヾニ-ァ,ニ;=、_ !:::l ) } ト ヾ¨'7"ry、` ー゙='ニ,,,` }::ヽ(ノ チラシの裏にでも書いてろ :ーゝヽ、 !´ " ̄ 'l,;;;;,,,.、 ,i:::::::ミ ::::::::::::::::ヽ.-‐ ト、 r'_{ __)`ニゝ、 ,,iリ::::::::ミ ::::::::::::::::::::Vi/l:::V'´;ッ`ニ´ー-ッ-,、:::::`"::::::::::::::;゙ , な! :::::::::::::::::::::::::N. ゙、::::ヾ,.`二ニ´∠,,.i::::::::::::::::::::/// :::::::::::::::::::::::::::::l ヽ;:::::::::::::::::::::::::::::::::::::::::::/ / ::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ /
198 名前:183 mailto:sage [2008/11/04(火) 09:38:51 ] >>197 チラシ探してくる・・・ の前に、varの計算あってた、ごめん。 何年間かどこかで修行してくるわ。
199 名前:デフォルトの名無しさん [2008/11/04(火) 13:46:53 ] [1] 授業単元:配列 [2] 問題文(含コード&リンク):ファイルを文字単位で読み出し,アルファベット('a' -> 'z')が二回連続して出現する全ての箇所から,アルファベット2文字を単位とした出現回数を int 型二次元配列 count[][] に格納せよ。 ファイルの先頭から最後まで文字単位で捜査し,2回連続してアルファベット('a' -> 'z')が出現した箇所を対象にせよ。 this is a pen であれば,th, hi, is, is, pe, en がカウントの対象となる。 "be" という二文字が出現した回数は count[1][4] (count['b'-'a']['e'-'a'])に格納されるようにせよ。 [3] 環境 [3.1] OS: Mac OS [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 2008年11月5日11:59まで お願いします
200 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 14:31:08 ] [1] 授業単元:プログラミング [2] 問題文(含コード&リンク) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7938.txt [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:11月5日 [5] その他の制限:特になし よろしくお願いします。
201 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 14:54:26 ] >>199 下の方は確認用ね。 #include<stdio.h> #define isUpper(a) ('A' <= (a) && (a) <= 'Z') #define isLower(a) ('a' <= (a) && (a) <= 'z') #define isAlpha(a) (isUpper(a) || isLower(a)) #define position(a) ( isUpper(a) ? (a) - 'A' : (a) -'a') int count[26][26]; int main(){ char ch,prev='\0'; int i,j; FILE* fp; if((fp = fopen("in.txt","r")) == NULL) return 1; while((ch = fgetc(fp)) != EOF){ if(isAlpha(prev) && isAlpha(ch)) count[position(prev)][position(ch)]++; prev=ch; } fclose(fp); printf(" "); for(i=0;i<26;i++) printf(" %c",'a'+i); printf("\n"); for(i=0;i<26;i++){ printf("%c",'a'+i); for(j=0;j<26;j++) printf("%2d",count[i][j]); printf("\n"); } }
202 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 15:17:01 ] >>200 意外と簡単だった♪ void move(int n, int s, int d){ int tmp,i,j; printf("%d:%c --> %c\n",n,'a'+s,'a'+d); tmp=st[sp[s]][s]; st[sp[s]][s]=0; //スタックsからpop st[sp[d]+1][d]=tmp; //スタックdにpush //スタックポインタの操作 sp[s]--; sp[d]++; for(i=0;i<M;i++){ printf("%c ",'a'+i); for(j=0;j<=sp[i];j++){ printf("%2d",st[j][i]); } printf("\n"); } }
203 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 15:29:33 ] >>202 ありがとうございます! 問1と2の複合って感じですかね?
204 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 15:40:19 ] そうそう。 1の部分が sp[s]--; sp[d]++; これで棒に刺さってる枚数をカウントして、 for(i=0;i<M;i++){ printf("%c ",'a'+i); for(j=0;j<=sp[i];j++){ printf("%2d",st[j][i]); } printf("\n"); } で棒の名前と刺さってる板の大きさを列挙する。
205 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 19:08:58 ] 九九を計算して,以下のように表示するプログラムを作成せよ 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 for文、while文を使えとかいってたと思います。 よろしくお願いします。
206 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 19:16:48 ] >>205 int i, j; for( i = 1; i < 10; i++ ) { for( j = 1; j < 10; j++ ) { printf( "%d ", i * j); } printf( "\n"); }
207 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 19:36:34 ] >>206 ありがとうございます。
208 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 19:45:56 ] >>206 実行してみたんですけど、ただ計算するだけでなく 表みたいにしないといけないんです。どうしたらいいですか?
209 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 19:47:57 ] >>208 int i, j; for( i = 1; i < 10; i++ ) { for( j = 1; j < 10; j++ ) { printf( "%2d ", i * j); } printf( "\n"); }
210 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 20:11:47 ] >>209 できました。ありがとうございます。
211 名前:デフォルトの名無しさん [2008/11/04(火) 20:30:10 ] 1/x![X=1から10まで]を求めるにはどうしたらいいでしょうか?
212 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 20:30:17 ] [1] 授業単元: 配列 [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7939.txt (↓途中までですが、考えてみたものです) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7940.txt [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: cc [3.3] 言語: C [4] 期限: 2008年11月5日14:00まで [5] 多次元配列を用いて
213 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 20:35:31 ] [1] 授業単元:プログラミング [2] 2つの3×3行列の入力に対して積を計算し、結果を出力せよ。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:VS2008 [3.3] 言語:C++ [4] 期限: 明後日 [5] その他の制限: 繰り返しfor、2次元配列を使うこと。3重ループになるそうです。 しかし、どのように3重ループを使えばいいのかわかりません。
214 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 20:52:33 ] for(i=0; i<3; i++) for(j=0; j<3; j++) for(k=0; k=3; k++) c[i][j] += a[i][k] * b[k][j];
215 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 22:23:38 ] >>211 #include <stdio.h> int main (void) { int i, j; int kai; double sum = 0; for (i = 1;i <= 10; i++) { kai = 1; for (j = i;j > 0; j--) { kai *= j; } sum += (double)1.0 / kai; } printf("{Σ1/(x!) |1 <= x <= 10} = %f\n", sum); return 0; }
216 名前:デフォルトの名無しさん [2008/11/04(火) 22:34:19 ] [1] 授業単元: プログラミング [2] 問題文(含コード&リンク): y=cos(x)の座標を*でプロットするプログラムを作ります。 範囲は[0, 4π]です。 [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] できるだけ早く [5] その他の制限:ループと条件分岐、putcharを使う よろしくお願いします。
217 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 22:50:06 ] >>216 >[4] できるだけ早く が非常に心証が悪いのですが、お気づきですか?気づかれたほうがいいですよ。
218 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 23:05:47 ] どうでもいい
219 名前:216 [2008/11/04(火) 23:38:43 ] >>217 不愉快な思いをさせてしまい申し訳ありませんでした。 これからは気をつけます。
220 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 23:50:29 ] >>192 レス遅くなりました。 プログラムありがとうございました。 出力の方は自分でなんとか、変えてみます。 助かりました。
221 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 00:09:10 ] >>212 その1のほう。原形とどめてないかも。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7941.txt ttp://www.mashimo.com/2c6.html を使ってテストした。多分大丈夫。
222 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 00:34:20 ] >>217 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7942.txt
223 名前:デフォルトの名無しさん [2008/11/05(水) 00:43:12 ] >>137 レス遅れてしまい申し訳ありません。 プログラムありがとうございました。 これからプログラムの内容を理解していきたいと思います。
224 名前:デフォルトの名無しさん [2008/11/05(水) 00:56:29 ] >>222 ありがとうございました。 とても助かりました。
225 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 01:00:03 ] xy.yu.to/ 始終荒れまくりの海外サーバ絵チャだ 一人の神プログラマーが強すぎてマクロ荒しが全く太刀打ちできてない。 荒しプログラマーは全員退散!! 誰か倒してくれwwwwww 荒らしても荒らしても線が消されてしまう 一体どうやっているのか?!
226 名前:デフォルトの名無しさん [2008/11/05(水) 01:23:50 ] 誰か助けてください。次のプログラムは関数の座標をプロットするプログラムなのですが、 y軸の数字はそのままで、もっと細かくプロットするにはどうすればよいでしょうか。 たとえば、(0.5, 0.25)をプロットするといった具合にです。お願いします。 int main(){ double x,y; y=100.0; while(y>=0){ printf("%.1f", y); x=-10; while(x<=10){ if(y==(x*x)){ putchar('*'); } else { putchar(' '); } x=x++; } putchar('\n'); y=y-5.0; } return 0; }
227 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 01:33:17 ] >x=x++; 関係ないがこれはやめろ
228 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 01:50:19 ] [1] コンピュータの基礎的なもの: [2] 1!+2!+....k!を求めよ: [3] 環境 [3.1] 一応Win: (Windows/Linux/等々) [3.2] VC6.0: (gcc 3.4 VC 6.0等) [3.3] C: (C/C++/どちらでも可 のいずれか) [4] 今晩中です: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) #include<stdio.h> main(){ int i,k; float n,m; printf("k="); scanf("□□",□□); n=0.0; m=1.0; for(i=1;i<=□;i□□){ n□□(m□□i); } printf("1!+2!+...+%□=%□\n",□,□); } forの内部以外のところは埋まりました。 forの内側のnから始まる分が分かりません。
229 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 01:57:32 ] n += (m *= i);
230 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:16:29 ] #include<stdio.h> main(){ int i,k; float n,m; printf("k="); scanf("%d",&k); n=0.0; m=1.0; for(i=0;i<=k;i++){ n+=(m*=i); } printf("1!+2!+.....+%d!=%f\n",k,n); } ありがとうございます。 こんなかんじでやって答えが0にしかならないのですが...
231 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:21:37 ] m=1.0; for(i=0;i<=k;i++){ n+=(m*=i); } これでは常にm = 0.0になってしまうのだが、for ( i = 1; ...)なだろうな
232 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 02:23:37 ] ありがとうございます。いけました
233 名前:デフォルトの名無しさん [2008/11/05(水) 02:27:39 ] どなたか226をお願いします。夜が明けるまでにお願いします。
234 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 03:01:49 ] >>233 cとyの刻み幅を変えるだけでいいと思う #include<stdio.h> int main(){ double x,y; y=100.0; while(y>=0){ printf("%.2f", y); x=-10; while(x<=10){ if(y==(x*x)){ putchar('*'); } else { putchar(' '); } x+=0.5; } putchar('\n'); y-=0.25; } return 0; }
235 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 03:20:02 ] ×c ○x
236 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 03:25:41 ] 1024がどうしたのやつ、まだ引きずってたのか。 前スレで205*5にするのは別に必須でなくて、1024個単位で処理できればいいんでしょ? って確認しておkが出てたはずなんだけどなー 何が分からないかを伝える練習の場となったか。それもまたよかろ。
237 名前:デフォルトの名無しさん [2008/11/05(水) 05:53:10 ] [1] 授業単元:計算機プログラミングII 「ポインタと文字列」 [2] 問題文(含コード&リンク):課題1 2つの任意の長さの文字列をポインタ変数pxとpyを使って入力し, pxとpyの文字列を結合した文字列を他のポインタ変数に記憶し,その 結果を出力するプログラムを作成せよ.ただし,ヘッダファイル string.hで定義されている関数およびsprintfを使用してはいけない. その他,未習のもの(memcpyなど)は使えない. [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2008年11月6日10:30まで [5] その他の制限:ポインタの基礎を習い始めたところだと思います。 配列や文字列、for文、if文、関数ぐらいは簡単に習っています。 [6]出されたヒント:px,pyの長さを数える。たとえば,pxがn個の文字列ならば, 新たなポインタにまずこのn個の文字列が順に入り,その次のところからは, pyの1番目,2番目の文字が入っていく。 という方針であると説明を受けました。
238 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 06:27:37 ] >>237 長さ数えなくてもいける! ただsscanfは微妙によくない気がする!w #include<stdio.h> void concatenate(const char* px, const char* py, char* pz){ while(*px) *pz++ = *px++; while(*py) *pz++ = *py++; *pz = '\0'; } int main(){ char x[256]; char y[256]; char z[256]; printf("x:"); fscanf(stdin,"%s",x); printf("y:"); fscanf(stdin,"%s",y); concatenate(x,y,z); printf("z:%s\n",z); }
239 名前:デフォルトの名無しさん [2008/11/05(水) 09:26:58 ] [1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 下位バイト側を,バイナリで出力するプロ グラムです。 [3] 環境 [3.1] OS: WINDOWS [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 無期限 [5] その他の制限:main()の引数として,argc, argvを使わなくてはいけません。 下のプログラムを元につくります。 よろしくお願いいたします。 #include <stdio.h> union UNION { int i; char ch[4]; }; int main() { union UNION obj; obj.i = 320; printf("%x %x %x %x",obj.ch[0],obj.ch[1],obj.ch[2],obj.ch[3]); return 0; }
240 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 10:29:58 ] [1] 授業単元:プログラミング [2] 問題文: 構造体を用いて配列の和、積を求めるプログラムを作成せよ。 ただし、配列のデータは2つのファイルから開いて使用すること。 配列のデータ例 3 4 1.1 2.2 3.3 4.4 1.0 2.0 3.0 4.0 2.0 3.5 6.2 2.5 [3] 環境 [3.1] OS:windows [3.2] コンパイラ名:gcc [4]11月6日 12:00まで [5]その他: 構造体のメンバーは 行のサイズ unsigned int 列のサイズ unsigned int 行列のデータへのポインタ double ** よろしくお願いします。
241 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:14:23 ] [1] 授業単元: ニューラルネットワーク [2] 問題文 ニューラルネットワークの初期状態が記憶パターン1とよく似ているが少しだけ異なっていたとする。 ニューロンが非同期的に状態更新し、記憶パターン1に近づいていく様子をシュミレーションするプログラムを c++で作成せよ。 [3] 環境 [3.1] OS: Windows Vista [3.2] コンパイラ名とバージョン: わかりませんが、最初から付いていたやつかと…。 [3.3] 言語: C++ [4] 期限: 2008年11月9日 [5] その他の制限: 序盤まではできたのですが後半からさっぱり・・・。下にできた(と思う)所までと、 与えられた問題のヒント、完成例など置いておきますのでどなたか御願いします>< 何か不明な点があったら言って下さい。 ↓ kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7913.zip
242 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:13:43 ] [1] 授業単元:C言語 [2] 問題文 指数関数ex の近似値を返す関数expon(x, n)をつくります。第1引数は浮 動小数点数x で,第2引数はex をTaylor 展開で展開する際の最大次数n になります。 n次項までのTaylor 展開の式は下に示す通りです。 さらに,浮動小数点数y と正の整数m を引数とし,y の小数点m 桁より下を切り捨てて出 力する関数trunc(y, m)をつくりなさい。 次に,これらの2つの関数を用いて,ex の近似値を小数点以下の桁数を指定して出力する プログラムをつくりなさい。 ex ? 1 + x + x2/2! + x3/3! + … + xn/n! △出力例: 指数関数exp(x)の近似値を計算します! x を入力してください:2.5? Taylor 展開の最大次数n は:100? 小数点以下の桁数m は:3? exp(x)の近似値 = 12.182 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 2008/11/7 24:00まで [5] その他の制限:printf("%.*f", m, y); は用いないで定義すること。 よろしくお願いします。
243 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:33:39 ] >>241 vistaにはコンパイラついてませんよ?
244 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:22:14 ] >>221 一つ目の問題、ありがとうございます。 2つ目の問題の、 3×3行列の余因子の二次元配列を使った書き方がわかりません。 全て書けばプログラムがかなり長くなってしまいますし、それでは配列を使わなくても書けるのでは、と思い考えています。
245 名前:デフォルトの名無しさん [2008/11/05(水) 13:49:36 ] [1] 授業単元:数値計算 [2] 問題文(含コード&リンク): data[n][n]に格納された、n次正方行列の逆行列を求めるプログラムを作成せよ。 対角要素に0に近い要素があっても、正しく求められるように工夫せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語: C [4] 期限: 明日 [5] その他の制限: なし お願いします
246 名前:デフォルトの名無しさん [2008/11/05(水) 14:03:52 ] このプログラムで*をもっと表示させるにはどうすればよいですか。 今日中にお願いいたします。 #include<stdio.h> #include<math.h> int main(){ double x, y, pai=3.14; for(y=1; y>=-1; y=y-0.1){ for(x=0; x<=4*pai; x++){ if(y==cos(x)){ putchar('*'); } else{ putchar(' '); } } putchar('\n'); } return 0; }
247 名前:デフォルトの名無しさん [2008/11/05(水) 14:11:58 ] >>246 #include<stdio.h> #include<math.h> int main(){ double x, y, pai=3.14; for(y=1; y>=-1; y=y-0.1){ for(x=0; x<=4*pai; x++){ if(y==cos(x)){ putchar('************************************'); } else{ putchar(' '); } } putchar('\n'); } return 0; }
248 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:11:59 ] もっとってどういう風に?
249 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:44:48 ] >>243 う〜ん、でもコンパイルは最初から普通に出来るんですが… Visual Studio 2008 Express Editionsのページから無料でインストールしたやつを 使用してるんですが、Webインストールした時に一緒に付いて来たとかなのかな… そうだとしたら落としたのはついこないだなのでvarは最新のはずですが…。
250 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 15:52:19 ] そういうときはVS2008と書けばおk
251 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:03:16 ] >>250 あ、なるほど。 お手数おかけしました><
252 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:03:57 ] >>242 n = 14 くらいまでにしておかないと、とんでもない結果になるよ kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7945.txt
253 名前: ◆591LS1rcWk mailto:sage [2008/11/05(水) 16:04:49 ] [1] 授業単元:プログラミング実習 [2] kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7944.txt [3] 環境 [3.1] OS: Win vista [3.2] borland C++ 2.31 [3.3] 言語: C [4] 期限: 11月06日14:00まで Rxh(k)=1/n * Σ(n-1,n=0)x[n]*y[n+k]を計算しRxhを1−7出力するプログラムなのですが 完成し、動作を確認した後途中式に用意しておいた二重forループ無いの17行目 printf("%d---%d\n",sum1,sum2); を消すと正常に稼働しなくなります。 原因解決策などお願いします。
254 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:07:35 ] >printf(x[8]={1,2,3,4,5,6,7,8}n); 何これ?
255 名前:246 [2008/11/05(水) 16:28:39 ] >>248 自分もなんといっていいかわからないのですが、246のままのプログラムでは、cosの値が整数のときしか*が表示されません。 でもpaiの値が小数を含んでいるので、cosの値が小数第何位かになってしまうわけです。 かといって、yの刻み幅をかなり小さくしてしまうと大変なことになってしまいます。 cosの値を四捨五入とかできればいいのですが・・・ そういう場合はどのようにすればよいのでしょうか。
256 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:30:21 ] >>254 一番最初に配列の内容を出力しておくこと という条件でした。 情報足りなくてすいません。
257 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:33:07 ] printf("x[8]={1,2,3,4,5,6,7,8}\n");かな?
258 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 16:55:22 ] #include <stdio.h> int main (void) { float rxh[8]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; int x[8]={1,2,3,4,5,6,7,8}, h[8]={8,7,6,5,4,3,2,1}; int sum1=0,sum2=0,n=8,k,y,z; printf("x[8]={1,2,3,4,5,6,7,8}\n"); printf("h[8]={8,7,6,5,4,3,2,1}\n"); k=0; y=n-1; z=n-k; for(k=0;k<y;k++,z--){ for(n=0;n<z;n++){ sum1 = x[n] * h[n+k]; sum2 += sum1; //printf("%d---%d\n",sum1,sum2); } rxh[k] = (float)sum2/8.0; printf("Rxh[%d]=%2.3f\n",k+1,rxh[k]); sum2=0; } return(0); }
259 名前: ◆591LS1rcWk mailto:sage [2008/11/05(水) 16:58:51 ] リンク先の方を見ると何故か色々欠けているみたいなのでこっちに張り直します。 #include <stdio.h> int main (void) { float rxh[8]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; int x[8]={1,2,3,4,5,6,7,8}, h[8]={8,7,6,5,4,3,2,1}; int sum1=0,sum2=0,n=8,k,y,z; printf("x[8]=[1,2,3,4,5,6,7,8]\n"); printf("h[8]=[8,7,6,5,4,3,2,1]\n"); y=n-1; z=n-k; for(k=0;k<y;k++,z--){ for(n=0;n<z;n++){ sum1 = x[n] * h[n+k]; sum2 += sum1; printf("%d---%d\n",sum1,sum2); } rxh[k] = (float)sum2/8; printf("Rxh[%d]=%2.3f \n",k+1,rxh[k]); sum2=0; } return(0); }
260 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 17:16:18 ] >>258 気づきませんでした。ありがとうございます。 修正して下さった点は k=0;の初期化とrxh[k] = (float)sum2/8.0;の8だった部分を8.0にで合っていますか?
261 名前:213 mailto:sage [2008/11/05(水) 17:53:35 ] >>214 返すのが遅れてすいません。どうもありがとうございます。 一晩考えたのですが… #include <stdio.h> int main() { int a[3][3]; int b[3][3]; int c[3][3]; int i, j, k; scanf_s("%d %d %d %d %d %d %d %d %d", &a[0][0],&a[0][1],&a[0][2],&a[1][0],&a[1][1],&a[1][2],&a[2][0],&a[2][1],&a[2][2]); scanf_s("%d %d %d %d %d %d %d %d %d", &b[0][0],&b[0][1],&b[0][2],&b[1][0],&b[1][1],&b[1][2],&b[2][0],&b[2][1],&b[2][2]); for(i=0; i<3; i++) { for(j=0; j<3; j++) { for(k=0; k<3; k++) { c[i][j] += a[i][k] * b[k][j]; } printf("%d, " ,c[i][j]); } printf("\n"); } } とするととんでもない数字が表示されます。
262 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 18:03:04 ] int c[3][3] = {0};
263 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 18:26:59 ] cを全部0で初期化しないとね。
264 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 18:44:48 ] [1] 授業単元:プログラミング演習 [2] @12個のデータを入力できる1次元配列(int型)を準備し、 キーボードから各自 適当な数字(int型の範囲)を12個入力する. 入力したデータは,準備した配列に格納される. 12個のデータの最大値と最小値を表示するプログラムを作成しなさい. A12個のデータを入力できる2次元配列(int型 3行4列)を準備し, キーボードから各自 適当な数字(int型の範囲)を12個入力する 入力したデータは,準備した配列に格納される. 12個のデータの最大値と最小値を表示するプログラムを作成しなさい. [3] 環境 [3.1] OS windows Vista [3.2] コンパイラ名:gcc [3.3] 言語: C [4]11月12日 13:00まで [5]その他制限:if文、for文、配列などは習いましたが、それ以上はまだ習っていません。よろしくお願いします。
265 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 19:36:54 ] >>262 ,263 できました。どうもありがとうございます。
266 名前:デフォルトの名無しさん [2008/11/05(水) 19:49:16 ] 239をどなたかお願いします。
267 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:00:44 ] >>239 の言ってる意味が分からないんだけど。 argc, argv をどうしたいの? 何の下位バイトを出力するの?
268 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:12:49 ] [1] 授業単元: C言語入門 文字処理の簡単な演習課題 [2] 問題文(含コード&リンク): 適当な1文字を入力し、それが元が何であったかが分からないように何文字かずらして暗号化し、また元に戻すようなプログラムを作りなさい。文字としては英字小文字のみと仮定します。 例を以下に示します。作成するプログラムも同じような出力形式にしてください。 [ 例 ] 入力文字 = x 暗号化された文字 = b 復号化された文字 = x 何文字ずらすか?については、各自で適当に設定して構いません。 ただし、暗号化された文字も、英字小文字でなければなりません。例えば、zに2を足すと、そのままでは英字でない記号になってしまいますが、これを z+1 -> a, z+2 -> b, z+3 -> c, … のようにアルファベットの先頭に戻してやる処理が必要です。 この点を工夫して下さい。 [3] 環境 [3.1] OS:Windows XP [3.2] Visual C++ 2005 [3.3] C++ [4] 期限:11月6日23時まで [5] その他の制限: Char型変数を使うのはわかるのですがそれからがよくわからなくて・・・。 初歩的なことですみませんが、よろしくお願いします。
269 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:15:06 ] >>239 #include <stdio.h> #include <limits.h> #include <stdlib.h> union UNION { int i; unsigned char ch[8]; }; void f(unsigned char c) { unsigned char i; for (i = (1 << (CHAR_BIT - 1)); i != 0; i >>= 1) { if ((c & i) != 0) putchar('1'); else putchar('0'); } } int main(int argc, char *argv[]) { union UNION obj; obj.i = 0; if (argc > 1) obj.i = atoi(argv[1]); printf("%d\n", obj.i); f(obj.ch[1]); putchar(' '); f(obj.ch[0]); return 0; } よくわからないとこは適当に判断させてもらった
270 名前:デフォルトの名無しさん [2008/11/05(水) 21:00:23 ] [1] 授業単元: C言語応用 [2] 問題文(含コード&リンク): テキストファイル CD_DATA|45 DVD_DATA|601 MD_DATA|24 メイン関数と読み込み関数で、テキストファイルの'|'より後ろを構造体に書き込み エラー処理でテキストファイルに'|'が無い時エラーメッセージをだす。 テキストファイルの中の行数が違った時エラーメッセージをだす。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン: [3.3] C [4] 期限:11月6日15時まで
271 名前:デフォルトの名無しさん [2008/11/05(水) 21:00:39 ] >>269 さん どうもありがとうございます。
272 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:44:12 ] >>268 offsset は -26 〜 26、入力文字 in の範囲チェックはどっかでやっておく int offset = 3; char in, en, de; in = getchar(); /* 暗号化 */ en = (in - 'a' + offset + 26) % 26 + 'a'; /* 復号 */ de = (en - 'a' - offset + 26) % 26 + 'a'; printf("入力文字 = %c\n暗号化された文字 = %c\n復号された文字 = %c\n", in, en, de);
273 名前:デフォルトの名無しさん [2008/11/05(水) 22:14:22 ] 宿題への助言をお願いします。 内容は、入力された整数列を文字型配列で読み込み、その整数を以下のような変換規則に従い出力するというものです。 0→D、1→f、2→k、3→E、4→y、5→Q、6→R、7→e、8→B、9→t 以下は作ってみたものとなります。出力結果が文字化けしてしまいます… #include<stdio.h> #include<string.h> #define N 50 int main(){ int i, j; char num[N], txt[N]; printf("%d個までの整数列を入力して下さい : ", N); scanf("%s", &num); for(i = 0; i < strlen(num); i++){ for(j = 0; j < 10; j++){ if(num[i] == 'j') txt[i] = "DfkEyQReBt"[j]; } } printf("\n整数列を変換した文字列は「"); for(i = 0; i < strlen(num); i++){ putchar(txt[i]); } printf("」です。\n"); return 0; }
274 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:24:23 ] >>273 scanf("%s", &num); --> scanf("%s", num); & をトル if(num[i] == 'j') --> if(num[i] = j + '0') 'j' という文字と比べてどうすんの 以上。
275 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:30:26 ] >>274 どうもです。コンパイル通りました(^^ とっても初心者なので、「j + '0'」とするのがどうも理解しにくいところですが…(^^; あと、sage忘れスマソ