1 名前:デフォルトの名無しさん [2008/10/01(水) 07:28:51 BE:151474728-PLT(18888)] あなたが解けない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++の宿題を片付けます 115代目 pc11.2ch.net/test/read.cgi/tech/1217741118/
242 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:17:33 ] >>241 妙な授業単元に問題文 ついでに抜けてる部分を修正できると思えない人間 言葉からにじみ出てくる、「俺は悪くないよ」オーラ 世の中ろくなもんじゃないよ
243 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:28:25 ] それは本当の優しさなのだろうか。
244 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:53:39 ] 下記の問題をやっていただける方いませんか?よろしくお願いします [1] 情報処理 [2] ある自然数nがある。 このnを和に分解するすべての場合を列挙しなさい。 なお、以下の例のように順列でも組み合わせでもかまわない。 例 n = 4 1 1 1 1 1 1 2 1 2 1 1 3 2 1 1 2 2 3 1 n = 4 1 1 1 1 1 1 2 1 3 2 2 3 1 [3] [3.1] Linux [3.2] gcc4.0 [3.3] C言語 [4] 10月15日23:59 [5] 再帰について習いました
245 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 01:18:06 ] >>244 #include<stdio.h> #define N_MAX 100 int g_result[N_MAX]; void bar(int result_num, int n){ int i; if(n<=0){ for(i=0;i<result_num;i++) printf(" %d", g_result[i]); printf("\n"); return; } for(i=1;i<=n;i++){ g_result[result_num]=i; bar(result_num+1, n-i); } } void foo(int n){ int i; if(n>N_MAX) return; for(i=1;i<=n-1;i++){ g_result[0]=i; bar(1, n-i); } } int main(void){ int n=4; printf("n = %d\n", n); foo(n); return 0; }
246 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 02:55:57 ] じゃあ僕は組み合わせで。 #include<stdio.h> #include<string.h> int partition(int n,int m,char *exp); int main(void){ int i,n,c; do{ printf("nを入力してください。 n="); scanf("%d",&n); c=0; for(i=n;i>0;i--) c += partition(n,i,""); printf("Total:%d\n",c); }while(n != 0); return 0; } int partition(int n,int m,char *exp){ int i,c=0; char ex[100]=""; if(n==m){ printf("%s%d\n",exp,m); return 1; } if(m==0) return 0; if(n>m){ sprintf(ex,"%s%d+",exp,m); for(i=m;i>0;i--) c += partition(n-m,i,ex); return c; } return 0; }
247 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 02:57:17 ] >>245 どうもありがとうございました。
248 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 02:58:05 ] >>246 こちらもどうもありがとうございました。 >>245 ,246 ソースを理解していきたいです。
249 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 11:00:03 ] どなたか >>205 お願いできませんでしょうか・・
250 名前:デフォルトの名無しさん [2008/10/13(月) 12:54:17 ] [1] 授業単元: C [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7781.txt [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:VB2008 [3.3] 言語: C++ [4] 期限: 10/14まで [5] その他の制限: 特になし。 どなたか、お願いします。
251 名前:デフォルトの名無しさん [2008/10/13(月) 14:09:18 ] >>249 ネットでぱくれ
252 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:34:26 ] 2次方程式ax^2+bx+cの根を計算するプログラムをかきなさい。 という問題です。 //二次方程式の根を計算するプログラム #include <stdio.h> void main () { double a, b, c, d; printf("3つの数字を入力してください"); scanf("%d %d %d", &a ,&b ,&c); d = b*b-4*a*c; printf("二次方程式の根は%d\n",d); } のように書いたのですがすべて答えが同じになってしまいます お願いします。
253 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:36:35 ] %d →%f
254 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:38:04 ] >>252 > 2次方程式ax^2+bx+cの根を計算するプログラムをかきなさい。 > > という問題です。 > //二次方程式の根を計算するプログラム > #include <stdio.h> > void main () { > double a, b, c, d; > printf("3つの数字を入力してください"); > scanf("%d %d %d", &a ,&b ,&c); > d = b*b-4*a*c; > printf("二次方程式の根は%d\n",d); > } > > のように書いたのですがすべて答えが同じになってしまいます > お願いします。 > scanf("%d %d %d", &a ,&b ,&c); scanf("%lf %lf %lf", &a ,&b ,&c); > printf("二次方程式の根は%d\n",d); printf("二次方程式の根は%f\n",d);
255 名前:235 [2008/10/13(月) 16:30:13 ] >>238 お礼が遅れてすいません、ありがとうございます。 …しかしながら…自分の説明不足のせいで大変申し訳ないのですが、 問題文中の「辞書順」=「大文字小文字も区別する」ということなのです…。 つまり、 A<a<B<b<C<c<D<d<・・・・・・・・・・・・・<X<x<Y<y<Z<z このように並べ替えたいのです。 >>238 さんのプログラムを参考に自分でももう少し考えてみますが、あまり自信がないので手助けしていただけたら幸いです…。 大変申し訳ないです。
256 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:26:45 ] >>253 >>254 ありがとうございます。 どうやら自分が勘違いしてたようで根は二次方程式の解そのものみたいです。 少し自分でも書きなおしてみましたが教科書には a=0の場合は1次方程式,b=0かどうかをチェックする必要がある。 二次方程式は判別式の符号をチェックする必要があるとかいてありそれがよくわかりません。 よろしくおねがいします。 #include <stdio.h> #include <math.h> void main () { double a, b, c, d; printf("3つの数字を入力してください"); scanf("%lf %lf %lf", &a ,&b ,&c); d = sqrt(b*b-4*a*c); printf("二次方程式の根は%lf,%lf\n",-b+d/2*a,-b+d/2*a); }
257 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:38:24 ] >>256 判別式が負だったらどうすればいいの 解なしと表示するのか虚数まで表示するのか
258 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:59:25 ] >>257 虚数表示でいいと思います。
259 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:37:42 ] >>235 >>255 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7782.c main()はあまりいじってない。もっとクールな比較関数を誰か頼む。
260 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:49:40 ] それなんてstrcasecmp
261 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:51:29 ] こうするだけでよくね? #include<stdio.h> #include<string.h> #define WORD_NUM_MAX 1000 #define WORD_LEN_MAX 64 int main(void){ char word[WORD_NUM_MAX][WORD_LEN_MAX+1+1], tmp[WORD_LEN_MAX+1], *p; char filename[256]; int i, j, word_num; int icmp; FILE *fp; printf("Input filename : "); scanf("%255[^\n]", filename); if((fp=fopen(filename, "r"))==NULL) return 1; for(word_num=0;word_num<WORD_NUM_MAX;word_num++){ if(fgets(word[word_num], sizeof(word[0]), fp)==NULL) break; if((p=strchr(word[word_num], '\n'))!=NULL) *p='\0'; } fclose(fp); for(i=0;i<word_num;i++){ for(j=0;j+1<word_num-i;j++){ if((icmp = stricmp(word[j], word[j+1])) == 0 && strcmp(word[j], word[j+1])>0 || icmp >0){ strcpy(tmp, word[j]); strcpy(word[j], word[j+1]); strcpy(word[j+1], tmp); } } } for(i=0;i<word_num;i++) puts(word[i]); return 0; }
262 名前:259 mailto:sage [2008/10/13(月) 20:19:53 ] >>260 >>261 strcasecmp()もstricmp()も A<a<B<b<C<c<D<d<・・・・・・・・・・・・・<X<x<Y<y<Z<zの順にならないと思うのだが。 strcasecmp()は、実際にthe The The the the みたいになってうまくいかなかった。 stricmp()も、比較前に文字列を小文字にするから、同じだろう。
263 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 20:40:25 ] 小文字で比較して一緒だったら、大文字も考慮して比較すればいいと思ったけど、だめなのかなぁ。
264 名前:259 mailto:sage [2008/10/13(月) 21:07:41 ] if ( ((icmp = stricmp(word[j], word[j+1])) == 0 && strcmp(word[j], word[j+1])>0) || icmp >0 ) たしかに、論理的にもこれでいけますね。 stricmp()なかったので、作ってやってみました。
265 名前:デフォルトの名無しさん [2008/10/13(月) 21:56:11 ] >>250 の、すごろくをどなたかお願いします。
266 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:57:22 ] >>261 The book // 1番目 the apple // 3番目 tHe earth // 2番目 これを並べ替えると the apple // 3番目 The book // 1番目 tHe earth // 2番目 こうなったよ
267 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 22:17:21 ] >>258 #include <stdio.h> #include <math.h> int main() { double a, b, c, d, x; printf("a^2 * x + b * x + c = 0となるa, b, cを入力してください\n"); scanf("%lf %lf %lf", &a ,&b, &c); if (a == 0) { puts("2次方程式ではありません"); return 1; } b /= a; if (c == 0) { printf("x = %g, 0\n", -b); } else { c /= a; b /= 2; /* x^2 + 2b'x + c = 0の形へ */ d = b * b - c; /* 判別式 */ if (d > 0) { if (b > 0) { x = -b - sqrt(d); } else { x = -b + sqrt(d); } printf("x = %g, %g\n", x, c / x); } else if (d < 0) { printf("x = %g ± %gi\n", -b, sqrt(-d)); } else { printf("x = %g\n", -b); } } return 0; }
268 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 22:18:01 ] C言語による最新アルゴリズム事典には、解の公式をそのまま使うと、 |b| ≒ √(b^2 - 4ac)のとき桁落ちを起こすから、桁落ちしないほうだけ公式で求めて、 残りは解と係数の関係(解α, βとしてαβ = c / a)で求めろって書いてあるからそうした。
269 名前:259 mailto:sage [2008/10/13(月) 22:56:37 ] >>266 のおっしゃる通りでした。 一瞬、そのテストケースもあったのか、と思ったが、 >>[2] 問題文(含コード&リンク):任意の長さの文字列(英字のみ)データ(>>235 ) だから、スペースが入る文字列はテストケースとしては、条件外になる。 しかし、指摘通り今回の問題では、>>261 では、スペースをのぞいてひとつの文字列に見せかけて食わせたとき、大文字優先の原則に従っていなくなりますね。 私は、単語だけと思っていたけど、英字だけの文字列だったのね。 これ以上出ると荒れそうなので、私が出るのは止めておくが、誰か>>259 よりクールな比較関数頼む。
270 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 23:12:12 ] >>250 >>265 ほい、 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7783.txt でも、VB2008じゃないんで… VC6なんて、iostreamとかの .h とかは自分の環境に合わせてくれ それと、ゴール出来ない双六が出来る可能性もあると言えばある
271 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 23:44:10 ] てか、strcmpだけで正しく辞書順になるんじゃね?頭こんがらがってきた\(^o^)/
272 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 23:55:22 ] >>271 いやasciiコードだとして英字が A-Zがならんでその次にa-zになるじゃん
273 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 00:22:14 ] でも、strcmpの戻り値は辞書式で比較した値でしょ?? msdn.microsoft.com/ja-jp/library/e0z9k731 (VS.80).aspx 難しく考えなくていいんじゃない??
274 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 00:47:53 ] Order by case insensitive dictionary order,dictionary order. Are you OK?
275 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 00:58:30 ] >>235 >>238 にこれを追加して strcmp を mystrcmp に変更すれば希望通りになる筈 int mystrcmp(const unsigned char *a, const unsigned char *b){ static int table[256], is_table_initialized=0; int i; if(!is_table_initialized){ for(i=0;i<256;i++) table[i]=i*2; for(i=0;i<26;i++) table['a'+i]=table['A'+i]+1; is_table_initialized=1; } for(;*a!='\0';a++,b++) if(*a!=*b) break; return table[*a]-table[*b]; }
276 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 02:04:40 ] >>273 「辞書式順序」 (dictionary order)というのは英和辞典なんかの並び順のことじゃないぞ。 きちんとした定義を持った数学用語。 ja.wikipedia.org/wiki/%E8%BE%9E%E6%9B%B8%E5%BC%8F%E9%A0%86%E5%BA%8F 1文字目が同じなら2文字目の大小で比較し、 2文字目も同じなら3文字目の大小で比較し、……という順序付けのこと。 >>275 なんかももちろん辞書式順序。 strcmpは各文字の大小比較を単純に文字コードの値で比較しており、 それだと>>273 の言うとおりなので、>>255 の要求には沿わないわけ。
277 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 13:19:06 ] どなたか>>162 の問題をお願いできないでしょうか?
278 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 13:23:04 ] >>277 このスレを「すごろく」で検索
279 名前:デフォルトの名無しさん [2008/10/14(火) 15:00:10 ] [1] 授業単元:プログラミング言語 [2] 問題文:直角三角形の直行する2辺の長さ、a、bともに正の整数(n≧0)が与えられた時、斜辺の長さcをプリントするプログラムを書き、数例に対して実行せよ。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C言語 [4] 期限:2008年10月15日まで [5] その他の制限:floatを使えと指示されました。 習い始めたばかりでまったくと言っていいほどわかりません。呆れるほど簡単な問題かもしれませんが、よろしくお願いします!
280 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 15:08:38 ] >>279 俺にも出来そうな問題がきた #include <stdio.h> #include <math.h> int main(void) { int a, b; float c; printf("a = "); scanf("%d", &a); printf("b = "); scanf("%d", &b); c = (float)sqrt(a * a + b * b); printf("\n答え %f\n", c); return 0; } >数例に対して実行せよ。 の意味がわからないので入力値で計算させた
281 名前:デフォルトの名無しさん [2008/10/14(火) 15:22:09 ] >>280 ありがとうございます! もう一つお聞きしてもよろしいですか? 書いていただいたプログラムをこのままコピーしてコンパイルして実行したら未定義のシンボルsqrtとか重大なエラーとか出てきてしまったんですが、 この場合はどうすればよろしいのでしょうか?
282 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 15:23:58 ] >>281 gcc -lm hoge.c かな
283 名前:デフォルトの名無しさん [2008/10/14(火) 15:29:34 ] >>282 できました!!本当にありがとうございます!!! こんな見ず知らずの勉強不足クソ野郎にもかかわらず、ご親切に教えていただきまして大変感謝しております。 ありがとうございました!
284 名前:デフォルトの名無しさん [2008/10/14(火) 15:39:34 ] sqrtくらい実装した方がいい
285 名前:デフォルトの名無しさん [2008/10/14(火) 15:47:42 ] たとえばroot(n,c) cのn乗根の作り方 x=n√cとおくとx^n=cとなる。f(x)=x^n-cという関数の根を求めればいい 一般に、f(x)の根はニュートン法で計算できる。 点aでfに接する直線の方程式は、y = f'(a)(x-a) + f(a) これがy=0としてxについてとくと、x = a + f(a)/f'(a) この値を新たにaとしておいて、同様の操作をすると収束すれば解が求まる。
286 名前:デフォルトの名無しさん [2008/10/14(火) 15:56:34 ] コンパイルは通してないがおおかたこんな通りだろう float pow(int n, float c){ int k; float a=1; for( k=0; k<n; k++)a*=c; return a; } float root(int n, float c){ int k; float a=c; for( k=0; k<50; k++) a += (pow(n,a)-c)/(n*pow(n-1,a)); return a; }
287 名前:デフォルトの名無しさん [2008/10/14(火) 16:03:24 ] #include <stdio.h> float pow(int n, float c){ int k; float a=1; for( k=0; k<n; k++)a*=c; return a; } float root(int n, float c){ int k; float a=c; for( k=0; k<50; k++) a -= (pow(n,a)-c)/(n*pow(n-1,a)); return a; } float sqr(float c){ return root(2,c); } int main(){ printf("√2 =%f\n",sqr(2)); printf("√3 =%f\n",sqr(3)); }
288 名前:デフォルトの名無しさん [2008/10/14(火) 16:06:45 ] 微分、積分して関数で返すライブラリってある?
289 名前:デフォルトの名無しさん [2008/10/14(火) 16:44:57 ] こっちの方が速い #include <stdio.h> #define GOSA 0.00001 double pow(int n, double c){ int k; double a=1; for( k=0; k<n; k++) a*=c; return a; } float root(int n, float c){ double x=c,y,z; while(1){ y=pow(n-1,x); z=x*y; if(z>c-GOSA && z<c+GOSA)break; x -= (z-c)/(n*y); printf("root( %d , %.1f )の計算経過 %f\n",n,c,x); } return x; } float sqr(float c){ return root(2,c); } int main(){ printf("√2 =%f\n\n",sqr(2)); printf("√3 =%f\n\n",sqr(3)); }
290 名前:デフォルトの名無しさん [2008/10/14(火) 16:52:47 ] これでいいか #define GOSA 0.00001 float sqr(float c){ double x=c,y; while(1){ y=x*x; if(y>c-GOSA)if(y<c+GOSA)break; x -= (y-c)/(2*x); printf("sqr( %.1f )の計算経過 %f\n",c,x); } return x; }
291 名前:デフォルトの名無しさん [2008/10/14(火) 17:04:40 ] みなさまに質問があります。若干スレチになるかもしれんが、一つ力を貸してくれないだろうか…
292 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 17:09:06 ] 質問ならもっとふさわしいスレがあるだろう ここは宿題をやってもらうスレ
293 名前:デフォルトの名無しさん [2008/10/14(火) 17:09:39 ] 標準ライブラリ速いな どうやったら速度を抜けるだろうか? #include <stdio.h> #include <math.h> #include <time.h> #define GOSA 0.0001 float sqr(float c){ double x=c,y; while(1){ y=x*x; if(y>c-GOSA)if(y<c+GOSA)break; x -= (y-c)/(2*x);} return x; } int main(){ double sum; int n,cl; sum=0; cl=clock(); for(n=0;n<1000000;n++)sum+=sqr(1000); cl=clock()-cl; printf("time=%d sum=%f\n",cl,sum); sum=0; cl=clock(); for(n=0;n<1000000;n++)sum+=sqrt(1000); cl=clock()-cl; printf("time=%d sum=%f\n",cl,sum); }
294 名前:デフォルトの名無しさん [2008/10/14(火) 17:09:52 ] >>292 そうだな。すまん。
295 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 19:18:31 ] ソースみればいいだろ標準の
296 名前:デフォルトの名無しさん [2008/10/14(火) 19:55:39 ] [1] 授業単元: C言語 [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7784.txt [3] 環境 [3.1] OS: Windows [3.2] Linux [3.3] 言語: C [4] 期限: 明日の朝 [5] その他の制限:出来るだけ簡単に 意味不明なんでお願いします。
297 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 20:59:43 ] #include <stdio.h> int main(void) { FILE *fp; int m, p1, p2, s1 = 0, s2 = 0; char *member[] = {"", "会","特","非"}; if((fp=fopen("data03.dat", "r"))==NULL) return 0; printf("種別 購入金額(円) 支払い金額(円)\n"); while(fscanf(fp, "%d%d", &m, &p1)==2) { switch(m) { case 1: p2 = p1 * 9 / 10; break; case 2: p2 = p1 * 7 / 10; break; case 3: p2 = p1 < 15000 ? p1 : p1 - 1000; break; } printf(" %s %15d%15d\n", member[m], p1, p2); s1 += p1, s2 += p2; } printf("---------------------------------------\n"); printf("合計%15d%15d\n", s1, s2); return 0; }
298 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 21:08:06 ] >>296 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7785.txt
299 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 22:36:32 ] [1] 授業単元: C言語 [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7786.txt [3] 環境 [3.1] OS: Windows [3.2] Linux [3.3] 言語: C [4] 期限: 明日の昼 [5] その他の制限:出来るだけ簡単に
300 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 22:42:31 ] >>296 == >>299 ?
301 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:03:00 ] >>299 手ごわかったぜ #include<stdio.h> int nabeatu(int num){ if(num%3==0) return 1; for(;num>0;num/=10) if(num%10==3) return 1; return 0; } int main(void){ int i, n=100, nabeatu_count=0, stop_flag=0; printf("自然数を入力してください。\n"); scanf("%d", &n); for(i=1;i<=n;i++){ if(nabeatu(i)){ nabeatu_count++; if(nabeatu_count>10 && n-i>30){ static int is_first=1; if(is_first){ printf("〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜\n" " すいません、打つの大変なので中略します><\n" "〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜\n"); } is_first=0; stop_flag=1; }else{ if(!stop_flag) printf(" %5d%.*s", i, !(nabeatu_count%5), "\n"); if(nabeatu_count%5==0) stop_flag=0; } } } return 0; }
302 名前:デフォルトの名無しさん [2008/10/14(火) 23:15:36 ] 成績をつけるプログラムを教えてほしいです。 80点以上100点以内 A 65点以上80点未満 B 50点以上65点未満 C 0点以上50点未満 D それ以外の整数に対しては「ありえない」と出す
303 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:18:00 ] >>302 if elseでも並べておけば?
304 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:19:28 ] >>303 A・B・C・Dに分けれたのですが、101など100を超える場合を組み込めません
305 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:22:00 ] if else if else if else if else ありえない
306 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:22:47 ] #include <stdio.h> int main(void) { int score; scanf("%d",&score); if(80<=score&&score<=100) printf("A\n"); else if(65<=score&&score<80) printf("B\n"); else if(50<=score&&score<65) printf("C\n"); else if(0<=score&&score<50) printf("D\n"); else printf("ありえない\n"); return 0; }
307 名前:デフォルトの名無しさん [2008/10/14(火) 23:22:53 ] [1] 授業単元:データ構造 [2] 再帰的二分探索 入力の引数をint x(求める値)、int v[]、int n(要素数)の三つを用いて ループを使用せずに関数の再帰呼び出しを使うこと。 外部変数で値の受渡しはしてはいけない。 [3] 環境 [3.1] OS: Windows [3.2] gcc [3.3] C [4] 期限: 10月15日16:00まで [5] 探索する配列はソート済みのものと考えてよい。
308 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 23:26:38 ] >>306 できました。 ありがとうございました。
309 名前:298 mailto:sage [2008/10/14(火) 23:43:34 ] >>301 友達になれそうだなw
310 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:01:48 ] 質問です ある整数が格納されている配列seisuu[4]がある。 その配列の添え字に対応して優先度が格納される配列priority[4]を考える。 整数が小さいほど優先度は高くする。優先度は最高が4最低が0。 格納されている整数が0の場合は優先度は0。 格納されている数字は同じ場合もある。 というのを考えているのですが、 for(i=0 ; i<4 ; i++){ priority[i] = 1; /* 初期化 */ } for(i=0 ; i<4 ; i++){ if(seisuu[i] == 0){ priority[i] = 0; /* 整数が0なら優先度も0 */ }else{ /* 整数が0以外のものを発見 */ for(j=i+1 ; j<4 ; j++){ /* 発見した次の配列から数字のある配列を探索 */ if(seisuu[j] != 0){ /* 0以外の配列を発見 */ if(seisuu[i] < seisuu[j]){ /* 最初の方が小さいなら */ priority[i]++; /* 最初の方の優先度をアップ */ }else if(seisuu[i] > seisuu[j]){ /* 発見した方が小さいなら */ priority[j] = priority[i]+1; /* 発見した方の優先度を最初の方の優先度+1 */ }else{ /* 整数が同じなら */ priority[i] = priority[j]; /* 優先度を同一とする */ } } } } } このように考えてみたのですが、何か違うような気がします。 指摘等宜しくお願いします。
311 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:05:25 ] 5 3 2 3 と入っていたら 2 1 0 1 としたいということ?
312 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:20:04 ] >>311 レスありがとうございます 整数 :5 3 2 3だと 優先度:1 2 3 2 としたいです
313 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:40:31 ] >>312 要素数が4個固定ならガチで見てもいいと思うけど、 増減ありなら、構造体にでも詰めて、ソートしてからの方がいいように思う。
314 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 00:45:00 ] >>307 int *func(int x, int v[], int n){ int c; c=n/2; if(n<=0) return NULL; if(x<v[c]) return func(x, &v[0], c); if(x>v[c]) return func(x, &v[c+1], n-c-1); return &v[c]; }
315 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 01:24:52 ] >>300 YES >>301 ちょwこれはwwマジすかww これを参考に考えて見ますwあざす^^
316 名前:デフォルトの名無しさん [2008/10/15(水) 01:33:31 ] 1] 授業単元: 関数 [2] 問題文(含コード&リンク): 3次元のfloat型の配列 a[3]、b[3]、c[3]を頂点の座標とする三角形ABCを考える。 1.ベクトルの長さを計算する関数を作れ、ただし関数の宣言は以下のようになるようにせよ。 float Vnagasa(float *x); 2.ベクトルの差 z=y−xを計算する関数を作れ。ただし関数の宣言は以下のようになるようにせよ。 void Vhiku(float *x, float *y, float *z); 3.ベクトルの外積z=x×yを計算する関数を作れ。ただし関数の宣言は以下のようになるようにせよ。 void Vgaiseki(float *x, float *y, float *z); 4.上記1,2,3を用いて、ベクトルx、y、zを頂点とする三角形の面積を計算する関数を作れ。 float Vmenseki(float *x, float *y, float *z); 5.1,2,3,4に関してそれぞれ正しく動作しているかどうか確認するプログラムを作れ。 6.ベクトルx、y、z及び原点からなる三角錐の表面積を計算するプログラムを作れ。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限: 2008年10月20日16:00まで [5] その他の制限: 自分で関数の宣言をしなくてはならない 4番からがうまく出来ません お願いします
317 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 02:53:16 ] [1]C言語初級 [2]次のコードを並べ替えて動作するものにせよ。また 動作仕様を簡潔に述べよ。(コンパイル可能なコードと 動作仕様署を提出) for(k=0,j=1;j<=i/2;j++) k+=j; int main(int argc,char **argv){ if(i%j==0) int i=1,j,k,l,c=0; for(l=0,j=1;j<=k/2;j++) if(( i==l )&&(i<k)){ } } } l+=j; #include <stdio.h> return 0; c++; if( k % j==0 ) while(c<=10){ printf("(%d,%d)¥n",i,k); i++; [3] Solaris/Gnu C++/C [4]10/31正午まで 急ぎませんがよろしく御願いします。この手の問題 苦手中の苦手です。
318 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 03:09:27 ] /* for(k=0,j=1;j<=i2;j++) k+=j; if(i%j==0) int i=1,j,k,l,c=0; for(l=0,j=1;j<=k2;j++) if(( i==l )&&(i<k)){ } } l+=j; #include <stdio.h> c++; if( k % j==0 ) while(c<=10){ printf("(%d,%d)¥n",i,k); i++; int argc,char argv */ int main(){ return 0; } なにもせずに終了するプログラム
319 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 03:38:14 ] >>316 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7787.txt 6番は正しいか単体テストはしてない、答えが分るテストデータは自分で用意してくれ
320 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 08:33:14 ] >>317 #include <stdio.h> int main(int argc,char **argv){ int i=1,j,k,l,c=0; while(c<=10){ for(k=0,j=1;j<=i/2;j++) if(i%j==0) k+=j; for(l=0,j=1;j<=k/2;j++) if( k % j==0 ) l+=j; if(( i==l )&&(i<k)){ printf("(%d,%d)\n",i,k); i++; } c++; } return 0; } /*何も表示しないプログラム*/
321 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 10:48:31 ] うわあ。並べ替え分からんなあと思いながらやってたら>>320 と全く同じでワロタw
322 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 12:24:48 ] [1] 授業単元:マルチタスクプログラミング [2] 問題文(含コード&リンク): funcA 1〜5を表示する funcB A〜Eを表示する メインにてスレッドを生成し、生成したスレッドにfuncBを走らせる。 メインスレッドはfuncAを走らせる。 そのうえで表示結果が 「1A2B3C4D5E」となるようマルチタスクプログラムを作成せよ。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ:VisualStudio2005 [3.3] 言語:C++ [4] 期限:10/17(金) [5] その他の制限:特に無し イベントのやり取りでスレッドを制御せよとのことなのですがサンプルを提示して 頂けると助かります。スレッド等イメージをまだ把握しておらず… 申し訳ないですが宜しくお願いします。
323 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 13:26:06 ] 並べ替え問題はこうだと思う。 友愛数を求めるアルゴリズム。 ja.wikipedia.org/wiki/%E5%8F%8B%E6%84%9B%E6%95%B0 #include <stdio.h> int main(int argc,char **argv){ int i=1,j,k,l,c=0; while(c<=100000){ for(k=0,j=1;j<=i/2;j++) if(i%j==0) k+=j; for(l=0,j=1;j<=k/2;j++) if( k % j==0 ) l+=j; if(( i==l )&&(i<k)){ printf("(%d,%d)\n",i,k); } i++; c++; } return 0; }
324 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 13:39:56 ] まちがった。こうだ〜! 友愛数を小さい方から10個見つけるプログラム。 #include <stdio.h> int main(int argc,char **argv){ int i=1,j,k,l,c=0; while(c<=10){ for(k=0,j=1;j<=i/2;j++) if(i%j==0) k+=j; for(l=0,j=1;j<=k/2;j++) if( k % j==0 ) l+=j; if(( i==l )&&(i<k)){ c++; printf("(%d,%d)\n",i,k); } i++; } return 0; }
325 名前:320 mailto:sage [2008/10/15(水) 13:44:18 ] >>323 なるほど forには{ }がなくてifには { }があるので2文以上入るんだろうなと思ったんだよ /* 友愛数を10個表示するプログラム */ #include <stdio.h> int main(int argc,char **argv){ int i=1,j,k,l,c=0; while(c<=10){ for(k=0,j=1;j<=i/2;j++) if(i%j==0) k+=j; for(l=0,j=1;j<=k/2;j++) if( k % j==0 ) l+=j; if(( i==l )&&(i<k)){ printf("(%d,%d)\n",i,k); c++; } i++; } return 0; }
326 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 14:15:14 ] >>322 後始末無視して簡単に書いてみた #include<windows.h> #include<stdio.h> HANDLE eventA,eventB; DWORD func(HANDLE self,HANDLE other,const char*str){ while(*str) WaitForSingleObject(self,INFINITE) , putchar(*str++) , SetEvent(other); return 0; } DWORD WINAPI funcA(LPVOID p){return func(eventA,eventB,"12345");} DWORD WINAPI funcB(LPVOID p){return func(eventB,eventA,"ABCDE");} int main(){ eventA = CreateEvent(0,0,1,0); eventB = CreateEvent(0,0,0,0); HANDLE f[] = {CreateThread(NULL,0,funcA,0,0,0),CreateThread(NULL,0,funcB,0,0,0)}; WaitForMultipleObjects(2,f,1,INFINITE); printf("\n"); }
327 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 14:23:45 ] >>326 ホント面倒かけて申し訳ない。 なにやってるか全くわからないけどとりあえず張り付けてデバッグします ありがとう
328 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 16:26:42 ] [1] 授業単元:数値計算 [2] 問題文(含コード&リンク): このアーカイブにはいってるprog.cのファイルの逆の処理をする プログラムを作ってほしいのですが。プログラムの説明はソースの一番上にかいてあります。 www1.axfc.net/uploader/He/so/147917 パスはsageです。知りたいところがあれば聞いてください [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C言語 [4] 期限: 10/16 の12時くらい
329 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 16:34:57 ] /ディレクトリ以下ファイルを強制的に全部消去し、消去した ファイルのサイズの平均を求めるプログラムの逆の動作って どうやって定義するのでしょうか?
330 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 16:35:43 ] できない
331 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 17:04:22 ] >>328 ソースファイルだけあげればよかったのに。 a.outとかバックアップとかいらないしそもそもgzファイルじゃなくてtgzだろとか
332 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 17:28:25 ] いや確認用に
333 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 17:47:08 ] どこの馬の骨が作ったともしれないバイナリを実行するぐらいなら自分でコンパイルするだろ。 スレ的にも。
334 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 18:19:19 ] >>332 ふてくされるなよ
335 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 19:37:00 ] [1] 授業単元:プログラミング [2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7788.txt [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C言語 [4] 期限: 10/16 よろしくお願いします
336 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 20:03:36 ] >>335 if(*(s+i)==' '){ これを!とか,とかでも通るようなor条件をバカみたいに作ればいいと思うよ。
337 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 20:09:51 ] だよな。 そんなこともわからずにプログラムかいてるのか
338 名前:sage [2008/10/15(水) 20:35:06 ] [1]プログラミング及び演習 [2]標準入力から読み込んで標準出力へ書き出すプログラムのいろいろ #include <stdio.h> #define MAX 128 int main(void) { char buf[MAX]; while (fgets(buf, MAX, stdin) != NULL) fputs(buf, stdout); /* function */ return 0; } を参考に行番号を付加するプログラムを自作してみて下さい. 例えば,こんな感じで出力されれば OK です. 1: #include <stdio.h> 2: 3: int main(void) 4: { 5: int c; 6: 7: while ((c = getchar()) != EOF) putchar(c); 8: 9: return 0; 10: } [3] 環境 [3.1] OS:Windows [3.2] コンパイラ:VisualStudio2005 [3.3] 言語: [4]期限: 10/21 [5]簡潔でも構わないので解説があると助かります よろしくお願い致します
339 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:01:14 ] >>337 自分のできる範囲でバカみたいにかいた上で、これはもうちょっと どうにかならんのかねって疑問がわき、そこでやっとASCIIコード体系なりis系関数なりを知って 感激しつつ改善するに至るんだが、いきなり結果を得ても何も理解できないし苦痛だよね。
340 名前:デフォルトの名無しさん [2008/10/15(水) 21:02:19 ] 自分の学籍番号,氏名をキーボードから入力し, 画面に表示するプログラムを文字型配列を用いて作成せよ
341 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 21:05:33 ] >>338 int i = 0; while (fgets(buf, MAX, stdin) != NULL) printf("%d: %s", i++, buf);
342 名前:338 mailto:sage [2008/10/15(水) 21:30:57 ] >>341 回答ありがとうございます。 試してみたのですが エラー E2342 numcpy.c 6: パラメータ '__s' は signed char * 型として定義されてい るので int は渡せない(関数 main ) と出てしまいました。 また自分の説明不足なのですが、まだ明解C言語入門編第8章という 初歩的なところまでしか学習しておらず、%sという表現が理解できません。 御手数おかけして大変申し訳ないのですが、もう少し簡単な回答を頂けないでしょうか?