1 名前:デフォルトの名無しさん [2007/11/05(月) 20:38:18 ] あなたが解けない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++の宿題を片付けます 97代目 pc11.2ch.net/test/read.cgi/tech/1193150915/
116 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 11:40:25 ] 【質問テンプレ】 [1] 授業単元:プログラミング基礎 [2] 問題文(含コード&リンク): 入力した文字列(行単位)n個をソートして 昇順に表示するプログラムを作成してください。 ただし同じ文字列は1回だけ表示します。 また、nは1024以下とし、文字列は1024文字までします。 <補足> >以下を加えてください。 #include<stdio.h> #include<string.h> [3] 環境 [3.1] OS:Linux [3.2] わかりません [3.3] C言語 [4] 期限: 11月10日 [5] その他の制限: 文字列の関数 strlen(s):sの長さを数える strcmp(s1,s2):2つの文字列s1,s2を比較し、辞書的に大きい、等しい、小さいに対して 正数、0、負数を返す。 strcpy(s1,s2):文字列s2をs1にコピーし、s1のアドレスを返す。 strcat(s1,s2):文字列s2をs1の後に付け、s1のアドレスを返す。
117 名前:デフォルトの名無しさん [2007/11/08(木) 11:52:35 ] 【質問テンプレ】 [1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 整数除算 a/b (a,b は正または負の整数)を計算する関数 int fdivide(int a, int b )を作成せよ。 a と b とを入力、 fdivide(a,b )を計算して出力するmain 関数を作成し、 プログラムと実行結果を提出せよ。 a/b は a がb未満になるまでaから b を繰り返し 引き続け、その回数を記憶することで実現させる。 [3] 環境 [3.1] OS: (WindowsXP) [3.2] コンパイラ名とバージョン: (bcc) [3.3] 言語: (C++) [4] 期限: ([11月10日]まで) [5] その他の制限:C++ の割り算演算子の利用は禁止 よろしくお願いします
118 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 14:43:16 ] #include <stdio.h> #include <stdlib.h> unsigned fdivide(unsigned a, unsigned b) { unsigned sum = 0; for (unsigned ic = 1; ic < a; ++ic) { sum += b; if (sum > a) return ic - 1; } return a; } int main(int argc, char ** argv) { printf("%d\n", fdivide(atoi(argv[1]), atoi(argv[2]))); return 0; }
119 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 15:00:38 ] >>116 #include <stdio.h> #include <stdlib.h> #include <string.h> #define WORD_LEN_MAX 1024 int cmp(char **a, char **b){ return strcmp(*a, *b); } int main(int argc, char *argv[]){ char buf[WORD_LEN_MAX+1+1], **word=NULL; int len, wordnum=0L, i; while(fgets(buf, sizeof(buf), stdin)!=NULL){ len=strlen(buf); if(len>0 && buf[len-1]=='\n') buf[len-1]='\0'; word=realloc(word, sizeof(*word)*(wordnum+1)); word[wordnum++]=strdup(buf); } qsort(word, wordnum, sizeof(*word), cmp); for(i=0;i<wordnum;i++) printf("%s\n", word[i]); for(i=0;i<wordnum;i++) free(word[i]); free(word); return 0; }
120 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:20:55 ] [1] 授業単元: [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5226.txt [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 11月9日10:00まで] [5] その他の制限: 特にありません どうぞよろしくお願いします
121 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 16:24:14 ] >>120 マルチ乙 pc11.2ch.net/test/read.cgi/tech/1180856695/546
122 名前:デフォルトの名無しさん [2007/11/08(木) 16:40:29 ] >>91 学校特定しました。
123 名前:デフォルトの名無しさん [2007/11/08(木) 17:18:56 ] >>117 #include <stdio.h> int fdivide(const int a, const int b ) { int numerator = a; int denominator = b; int result = 0; int flg; if(numerator < 0) numerator *= -1; if(denominator < 0) denominator *= -1; while(numerator >= denominator){ numerator -= denominator; result++; }; if((a > 0 && b > 0) ||(a < 0 && b < 0)) flg = +1; else flg = -1; return result*flg; } int main() { printf("fdivide(6,2) = %d \nfdivide(1,3) = %d \nfdivide(6,-2) = %d \nfdivide(-6,2) = %d \n" "fdivide(-7,2) = %d \nfdivide(7,-3) = %d \nfdivide(10,1) = %d \n" ,fdivide(6,2),fdivide(1,3),fdivide(6,-2),fdivide(-6,2),fdivide(-7,2),fdivide(7,-3),fdivide(10,1)); return 0; }
124 名前:デフォルトの名無しさん [2007/11/08(木) 18:21:56 ] [1] 授業単元: データ構造(アルゴリズム) [2] 問題文:下記 [3] 環境 [3.1] OS: LINUX [3.2] 言語: C [4] 期限: 11月14日まで] [5] その他の制限: 特にありません どうぞよろしくお願いします
125 名前:デフォルトの名無しさん [2007/11/08(木) 18:24:49 ] >>124 問題文書け
126 名前:デフォルトの名無しさん [2007/11/08(木) 18:25:10 ] 124続き #include <stdio.h> #include <malloc.h> struct tfield { int num[20]; struct tfield *pointer; } ; struct tfield *talloc(void); int main(void) { struct tfield *head, *p; head = NULL; while (p = talloc(), scanf("%d", p -> num)!= EOF){ p -> pointer = head; head = p; } p = head; while(p != NULL){ printf("%d\n", p -> num); p = p -> pointer; } } struct tfield *talloc(void) {return((struct tfield *)malloc(sizeof(struct tfield))); } 上記を、二つのリストをソートした新たなリストを表示するように改変せよ。です
127 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 19:31:55 ] [1] 授業単元:データ構造とアルゴリズム1 [2] 問題文(含コード&リンク):待ち行列シミュレーションするプログラムを作成せよ 完成する関数: void enqueue(char *x) void dequeue() void queue_print() CPPファイル:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5227.txt 作成するプログラムについて:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5228.txt 実行例:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5229.txt ヒント:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5230.txt [3] 環境 [3.1] OS:win xp [3.2] Microsoft Visual Studio .NET 2003 [3.3] 言語:c++ [4] 期限:2007年11月09日9:30まで [5] その他の制限:(どこまで習っているか)構造体、ファイル処理あたりまで よろしくおねがいします。
128 名前:デフォルトの名無しさん [2007/11/08(木) 19:51:08 ] 【質問テンプレ】 [1] 授業単元:プログラミング演習 [2] 問題文(含コード&リンク): n変数の連立1次方程式をガウスの消去法で解くプログラムを作成せよ。 [3] 環境 [3.1] OS: Windows [3.2] gcc 3.4 [3.3] 言語: C) [4] 期限: 明日 [5] その他の制限:配列まで習いました。
129 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 20:28:33 ] [1] 授業単元:プログラミング練習 [2] 問題文(含コード&リンク): あるテキストファイル「memo.txt」にexampleとかかれているとして そのファイルを読み込み、その書かれている単語の1文字ずつ見ていき 母音なら1と、子音なら0と表示するプログラムをつくれ。 exampleなら1010001と表示するように [3] 環境 [3.1] OS:Linux [3.2]GCC [3.3] C言語 [4] 期限: 11月10日
130 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 20:42:05 ] >>129 #include <stdio.h> #include <ctype.h> main() { int c; FILE *fp; if((fp=fopen("memo.txt","r"))==NULL){ printf("file can't open.\n"); return; } while((c=fgetc(fp))!=EOF){ switch(c){ case 'a': case 'A': case 'i': case 'I': case 'u': case 'U': case 'e': case 'E': case 'o': case 'O': putchar('1'); break; default: /* 何がきても0を出力するのならputchar('0');break;だけでいい */ if(isalpha(c)) putchar('0'); else putchar(' '); break; } } putchar('\n'); fclose(fp); }
131 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 23:21:29 ] >>124-126 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5231.c
132 名前:131 mailto:sage [2007/11/08(木) 23:39:48 ] 配列使って書き直し。こっちのほうが安全。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5232.c
133 名前:デフォルトの名無しさん mailto:sage [2007/11/08(木) 23:40:24 ] [1] 授業単元: [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5233.txt [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 11月9日10:00まで [5] その他の制限: 期限まであまり時間がありませんが、どうぞよろしくお願いします
134 名前:デフォルトの名無しさん [2007/11/09(金) 00:17:40 ] どなたか>>127 よろしくお願いします。どうもすみません
135 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 00:27:56 ] >>133 int binarysearch(int v){ /* ここにプログラムを追加 */ int l = 0, r = N-1,x; while( l<=r ) { x = (l + r) / 2; printf("%d %d %d \n",l,x,r); if( v == a[x] ) return 0; /* 見つかった */ if( v > a[x] ) l = x + 1; if( v < a[x] ) r = x - 1; } return -1; } int interpolationsearch(int v){ /* ここにプログラムを追加 */ int l = 0, r = N-1,x; while( l<=r ) { x = l + (v - a[l]) * (r - l) / (a[r]-a[l]); if(x < 0) return -1; if(x >= N) return -1; printf("%d %d %d \n",l,x,r); if( v == a[x] ) return 0; /* 見つかった */ if( v > a[x] ) l = x + 1; if( v < a[x] ) r = x - 1; } return -1; }
136 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 00:32:17 ] >>135 一応な…… v>a[x]の場合、xの位置のデータは答えよりも小さいから、それよりも右に位置する(x+1)を新しいlにする。 v<a[x]の場合、xの位置のデータは答えよりも大きいから、それよりも左に位置する(x-1)を新しいlにする。
137 名前:デフォルトの名無しさん [2007/11/09(金) 00:59:36 ] int binarysearch(int v){ /* ここにプログラムを追加 */ int mid; int left = 0; int right = 9; while(left < right){ mid = (left + right)/2; if(a[mid] < v) left = mid + 1; else right = mid; }; if(a[left] == v) return left; return -1; }
138 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 01:41:38 ] >>134 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5234.txt この問題、やらしいな。 front = 0 , rear = 0; /* 空 */ front = 0 , rear = 1; /* 1つめ追加 */ front = 0 , rear = 2; /* 2つめ追加 */ front = 0 , rear = 3; /* 3つめ追加 */ front = 0 , rear = 4; /* 4つめ追加 */ front = 0 , rear = 0; /* 5つめ追加 */ ってなるので、空の場合と満杯の場合でfrontとrearの関係が同じなる。ということでflagたてて逃げてみた。
139 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 02:24:06 ] >>128 行列におけるガウスの消去法(掃き出し法)はサンプルコードが至る場所にあります。 ttp://www.mit.msn.to/matrix/determinant.html
140 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 02:32:14 ] >>127 しかしC++でやるんならコンテナがあるんだからqueueの実装なんかやるだけ無駄、 空いた時間で、queueを使った応用をしたほうが宿題として合格だな queueの応用問題を考えられないのは教師に欠陥があるからだ
141 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 09:32:28 ] >>138 どうもありがとうございました。 助かりました
142 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 10:49:56 ] [1] 授業単元:C言語入門(第7週ファイルの入出力) [2] 問題文(含コード&リンク): 簡単なファイル暗号化・復号化のプログラムを作成せよ。 今回の暗号化は、改行以外の文字のアスキーコードに1を足し、復号化はその逆を行うこととする。 最初の引数が暗号化(c)と復号化(d)のどちらかを決定し、次が入力ファイル名、最後が出力ファイル名を示す。 引数が間違っている場合は"error"を表示する。 (実行例) $ cat input.txt(読み込むファイルの中身確認) Hello! Good bye... $ ./q2-3 c input.txt output.txt $ cat output.txt Ifmmp" Hppe!czf/// $ ./q2-3 d output.txt newinput.txt $ cat newinput.txt Hello! Good bye... ヒント:ファイルからfgetcで1文字づつ読み込み、int型の変数に入れる。 アスキーコードに1足し、fputcでファイルに書き出す。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: GCC [3.3] 言語: C [4] 期限: 11/11(日) [5] その他の制限: 暗号化(c)、復号化(d)の判別には「!strcmp」を使ってください。
143 名前:デフォルトの名無しさん [2007/11/09(金) 11:06:18 ] [1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): 正規分布に従って、乱数を発生させるプログラムを作成しなさい。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: Borland C++ Compiler5.5 [3.3] 言語: C++ [4] 期限: 11/9 18時 [5] その他の制限: よろしくお願いします
144 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 11:08:42 ] #include <stdio.h> #include <string.h> void encodeDecode(int codeOffset, FILE * fpIn, FILE * fpOut) { int ch; while ((ch = fgetc(fpIn)) != EOF) { fputc(ch == '\n' ? ch : ch + codeOffset, fpOut); } } int main(int argc, char ** argv) { int codeOffset; FILE * fpIn; FILE * fpOut; if (argc > 3) goto error; if (strcmp(argv[1], "c") == 0) { codeOffset = 1; } else if (strcmp(argv[1], "d") == 0) { codeOffset = -1; } else { goto error; } fpIn = fopen(argv[2], "r"); if (fpIn == NULL) goto error; fpOut = fopen(argv[3], "w"); if (fpOut == NULL) goto error; encodeDecode(codeOffset, fpIn, fpOut); return 0; error: fprintf(stderr, "error\n"); return 1; }
145 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 11:13:04 ] >>144 ×argc > 3 ○argc <= 3
146 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 12:13:53 ] >>143 上限と下限は指定しないのか? あと、出力方法は?
147 名前:デフォルトの名無しさん [2007/11/09(金) 12:23:52 ] >>146 >上限と下限は指定しないのか? とりあえず、指定されてないので後から変えられるようにしてもらえますか? あと、マイナスが出ないようにしてもらえると助かります。 >出力方法は? 数字が表示されればいいと思います。
148 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 12:25:30 ] やろうと思ったらC++かよ('A`)
149 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 12:55:18 ] >>144-145 期限まで待つつもりでしたが、お早い回答ありがとうございます。 変数名なども分かりやすく書いてもらったみたいで感謝しております。
150 名前:129 mailto:sage [2007/11/09(金) 14:47:59 ] [1] 授業単元:プログラミング練習 [2] 問題文(含コード&リンク): 129とほとんど同じなんですけど、 main(){ char str1[10]=”four”; /*char型の配列”four”に母音が含まれれば1、子音が含まれれば0と表示する*/ } を作れ。 3] 環境 [3.1] OS:Linux [3.2]GCC [3.3] C言語 [4] 期限: 11月10日
151 名前:イトキン ◆lq89E2SwMI [2007/11/09(金) 15:09:16 ] [1] 授業単元: オペレーティングシステム [2] 問題文(含コード&リンク): コマンドufsinfoを実装し、ソースコードとレポートを提出せよ。 ufsinfoの概要 ufsinfoは、ファイルシステムから次の情報を取り出す。 ○マジック番号(fs_majic) ○ディレクトリ中のファイル名一覧 ◆ディレクトリを引数に指定した場合 ○データブロックの番号の一覧 ◆そのファイルの中身を格納するブロック ufsinfoの書式 ○ufsinfo パス名 スペシャルファイル名 ◆パス名 ファイルシステム中のファイルへの絶対パス ◆スペシャルファイル名 ファイルシステム全体を表すファイル名
152 名前:イトキン ◆lq89E2SwMI [2007/11/09(金) 15:10:24 ] [3] 環境 [3.1] OS: mac OS [3.2] わかりません [3.3] 言語: C言語のみ [4] 期限: 12月5日 [5] その他の制限: mmapは使用禁止 スペシャルファイルでなく、イメージファイル上の動作でok 二重間接まで動作チェックせよ。 Cのみで350行程度でかけるみたいです。 問題文、が長過ぎて、何をここに書けばいいのかまよってしまいました。 問題について聞きたいことがあれば、レスお願いします。
153 名前:デフォルトの名無しさん [2007/11/09(金) 15:40:01 ] 期限過ぎてもいいんで、誰か143お願いします。
154 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 16:16:37 ] >>143 //ボックス=ミューラー法で100個の正規乱数を生成するテスト #include<iostream> #include<math.h> #include<stdio.h> #include<time.h> int main() { int i; double u1,u2,n1,n2; srand(time(NULL)); for(i=0;i<50;i++){ u1=(double)(rand())/RAND_MAX; u2=(double)(rand())/RAND_MAX; n1=sqrt(-2*log(u1))*sin(2*M_PI*u2); n2=sqrt(-2*log(u1))*cos(2*M_PI*u2); std::cout <<n1<<" "<<n2<<std::endl; } return 0; }
155 名前: ◆a3LMU3qR26 [2007/11/09(金) 16:36:08 ] 1] 授業単元:アルゴリズム [2] 問題文:巡回セールスマン問題を解くプログラムを作成しなさい。 今回は、あらゆる場合を全通り調べる方法で解を求めるプログラムでかまいません。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: (gcc [3.3] 言語: Cのみ [4] 期限: できるだけ早く [5] その他の制限: たいていあり
156 名前: ◆a3LMU3qR26 [2007/11/09(金) 16:38:30 ] >>155ですけど for(i = 0; i < n; i++) used[i]=NO; perm(0); return(0); } void perm(int d) { int i,j; int b[MAXN]; int s = adj[a[0]][a[n-1]]; if(d == n){ for(i = 0; i < n-1; i++){ s+=adj[a[i]][a[i+1]]; } } else { for (i = 0; i < n; i++) { if (used[i] == NO) { a[d] = i; used[i] = YES; perm(d + 1); used[i] = NO; } } } } このプログラムを利用したいのですが これだけだとただの列挙になってしまいます 最小値だけをだすにはどうしたらいいでしょうか?
157 名前:153 [2007/11/09(金) 18:46:49 ] >>154 ありがとうございます。 できれば、マイナスの値が出ないようにしていただきたいんですけど、無理ですか?
158 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 18:54:49 ] でてきた正規分布を正軸に好きなだけ平行移動させりゃいいじゃん 分散は変わらないから形は変わらないだろ
159 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 18:56:06 ] 形っていうのは乱数の母集団分布な
160 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 19:25:13 ] 何故マイナスの値を出さないようにしたいのか?その理由気になる。
161 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 19:30:40 ] >>106-107 順番がきましたら、こちらもよろしくお願いします。 期限は日曜日までありますので、土曜日が期限の人を優先していただいて構いません。 正確な期限は11/11(日) PM5時までです。 よろしくお願いします。
162 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 20:50:23 ] >>106 >>161 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5236.c 期限や順番なんて関係無いよ。答える奴は自分がやりたい問題をやるだけ
163 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 21:33:34 ] [1] データ構造 [2] 問題文(含コード&リンク): n個の頂点からなるグラフを、辺の両端の頂点に同じ色を塗らないようにし、すべての頂点を彩色するのに必要な色数を最小化する。 また、頂点iに接続する辺の数を頂点iの次数とよぶ。以下のアルゴリズムで作るように。 (1) @頂点の次数を降順にソートする。 A頂点1に色1を割り当てる B頂点i=2、...nについて、隣接する頂点に割り当てられていない最小の色番号を頂点iに割り当てる。 (2)頂点iの隣接頂点に彩色された異なる色数を頂点iの飽和次数とする。 @最大次数の頂点に色1を割り当てる A飽和次数が最大の頂点を選ぶ。そのような頂点が複数ある場合は、 未彩色の部分グラフにおいて最大次数の頂点を選ぶ。 B選んだ頂点に彩色可能な最小の色番号を割り当てる C全頂点が彩色済みならば終了。そうでないならAにもどる。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2007年11月10日24:00まで(出来れば21:00 [5] その他の制限: 関数と変数の定義 #include <stdio.h> #define TRUE 1 #define FALSE 0 #define MAX_N 2000 /*変数*/ int n; /*頂点数*/ int m; /*辺数*/ double x[MAX_N],y[MAX_N]; /*各頂点の座標*/ int a[MAX_N][MAX_N]; /*隣接行列*/ int color[MAX_N]; /*色*/ int max_color; /*最大の色番号*/
164 名前:163 mailto:sage [2007/11/09(金) 21:34:07 ] 問題例データの読み込み input_fire = fopen(argv[1],"r"); fscanf(input_fire,"%d %d\n",&n,&m); /*頂点数と辺陬の読み込み*/ for(i = 0;i < n;i++){ fscanf(input_file,"%1f %1f\n"&(x[1]),&(y[i])); /*頂点データの読み込み*/ } for(i = 0;i < n;i++){ /*隣接行列の初期化*/ for(j = 0;j < n;j++){ a[i][j] = 0; } } for(i = 0;i < m;i++){ fscanf(input_file,"%d %d\n",&k1,&k2); /*辺データの読み込み*/ a[k1][k2] = a[k2][k1] = 1; /*隣接行列の生成*/ } for(i = 0;i < n;i++){ color[i] = -1; /*解の初期化*/ } 説明文に意味がわからないところがあったらご指摘ください。お願いします。
165 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 21:52:39 ] >>164 でーんつーだーい
166 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 22:25:47 ] [1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5237.txt [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 11/12 [5] その他の制限: よろしくお願いします
167 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 22:35:03 ] >>163 それだと彩色数は最小化されないが
168 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 22:44:59 ] >>167 これ、近似アルゴリズムだから。
169 名前:デフォルトの名無しさん [2007/11/09(金) 22:46:25 ] #include <stdio.h> #include <math.h> double f(double x){ return 1/sqrt(1+pow(x,4)); /*求める定積分*/ } int main(void){ double x,sum=0,h; printf("h:"); scanf("%lf",&h); for(x=2*h;x<1;x+=2*h){ /*範囲指定*/ sum+=(f(x) + 4*f(x-h) + f(x-2*h)) * h/3; /*シンプソンの公式*/ printf("%f %f\n",sum,x); } }
170 名前:デフォルトの名無しさん [2007/11/09(金) 22:47:19 ] for(x=0;x<1-2*h;x+=2*h){ /*範囲指定*/ sum+=(f(x) + 4*f(x+h) + f(x+2*h)) * h/3; /*シンプソンの公式*/ printf("%f %f\n",sum,x);
171 名前:デフォルトの名無しさん mailto:sage [2007/11/09(金) 23:07:34 ] >>162 >>答える奴は自分がやりたい問題をやるだけ と言いつつプログラム作ってくれた>>162 さんに感謝。自分の課題解いてくれてありがとうございます。 わざわざプログラムコード中に説明文まで入れてもらって本当に感謝しています。 m(_ _)m
172 名前:aho mailto:sage [2007/11/10(土) 01:06:59 ] >>142 これ以外に何かあればいってちょ! encrypt()内がちょっと汚いから書き直してね。 void encrypt(char** argv){ int tmp; //文字読み込みバッファ FILE* fp = fopen(argv[2], "rb"); if(!fp){ printf("file open error!\n"); return; } FILE* fout = fopen(argv[3], "wb"); if(!strcmp(argv[1], "c")){ //暗号化 while((tmp = fgetc(fp)) != EOF){ if(tmp == 0x0A){ //改行コード fputc(tmp, fout); continue; } tmp += 0x01; fputc(tmp, fout); } } else if(!strcmp(argv[1], "d")){ while((tmp = fgetc(fp)) != EOF){ if(tmp == 0x0A){ fputc(tmp, fout); continue; } tmp -= 0x01; fputc(tmp, fout); }
173 名前:aho mailto:sage [2007/11/10(土) 01:09:33 ] >>172 } fclose(fout); fclose(fp); } int main(int argc, char** argv){ if(!strcmp(argv[1],"c") && !strcmp(argv[1],"d")){ printf("argument error!\n"); return 0; } encrypt(argv); return 0; } もっと細かい引数のチェック(argcでも判断, 拡張子判断etc)もした方がいいかもね。 疲れたので寝ます
174 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:14:06 ] >>172-173 つ「>>144-145 」 まあ、作りが少し違う参考になるでしょ。
175 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:23:30 ] [1] 授業単元: 確率論 [2] 問題文: www.uploda.org/uporg1104561.txt ここに書きました。 図はこんな感じです。 www.uploda.org/uporg1104531.jpg [3] 環境 [3.1] OS: LINUX [3.2] 言語: C [4] 期限: 11月10日 [5] その他の制限: 特にありません わかりにくいかもしれませんがお願いします。
176 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 01:31:02 ] >>168 それはもちろん知っているが、問題の一行目には最小化すると書かれている
177 名前:153 mailto:sage [2007/11/10(土) 03:10:07 ] >>176 このアルゴリズムでは最小化できないらしいので、アルゴリズムのほうを優先するみたいです。 よくみたら『この近似解法で作成せよ』と書いてありました。申し訳ございません。
178 名前:デフォルトの名無しさん [2007/11/10(土) 06:18:17 ] 誰かいますか?
179 名前:デフォルトの名無しさん [2007/11/10(土) 06:25:27 ] います
180 名前:デフォルトの名無しさん [2007/11/10(土) 06:26:41 ] イター!!! お願いします俺の宿題やってくださいませ
181 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 06:28:07 ] どれどれ。
182 名前:デフォルトの名無しさん [2007/11/10(土) 06:32:14 ] ありがとうございます!!!! えーと 数独の問題をグラフ彩色問題に変換せよ ってもんだいなんですけど どうやらこれをアルゴリズムで説明させる問題らしいんです
183 名前:デフォルトの名無しさん [2007/11/10(土) 06:38:08 ] 縦横と正方形に同じ数字が入ってはいけないっていうことだろう 数字をいろと言い換えればいいだけだろう
184 名前:デフォルトの名無しさん [2007/11/10(土) 06:40:27 ] やっぱそれでいいんですよね! 俺もそれ以外に思い浮かばなくて・・・ 数独アルゴリズムの数字を色って書き換えるだけでいいですよね?
185 名前:デフォルトの名無しさん [2007/11/10(土) 06:58:06 ] 解くアルゴリズムは作らないと行けないのか?
186 名前:デフォルトの名無しさん [2007/11/10(土) 07:01:30 ] 16個のヒントの物は作れるか? 最初にヒントとして配置する数字の数は、24〜32個程度が多く、これ以上だと解くのが簡単になる。 逆にそれ以下にするのは作者の技量も必要になってくる。 問題として成立する初期配置の数字の最少個数はまだ結論が出ていないが、 対称形の問題では18個(初出・パズル通信ニコリ31号 1990年)、 非対称の物では17個(初出・パズラー187号 1997年)のものが確認されている。 ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC
187 名前:デフォルトの名無しさん [2007/11/10(土) 07:05:40 ] 解くアルゴリズムはググッてわかりました ただ、彩色問題とからめた記述がなかったのでどうしようかとおもいまして・・
188 名前:デフォルトの名無しさん [2007/11/10(土) 07:06:38 ] 方針としては、縦か横か、正方形で可能な形を全て埋めてみるといいとおもう 例えば正方形の可能数は9! 通りある 9カ所埋めてみて縦が平気か調べていく
189 名前:デフォルトの名無しさん [2007/11/10(土) 07:14:21 ] 参考になりました! こんな朝早くにありがとうございました
190 名前:デフォルトの名無しさん [2007/11/10(土) 07:24:27 ] 最大でも、9*9! とおりしかないから、全配置を決定しておいてから、初期配置を満たすものをサーチすればいいと思う 9 * (9 !) = 3265920だから解けているからどうかを記録するには3MBくらいだ
191 名前:デフォルトの名無しさん [2007/11/10(土) 07:26:18 ] 1行目が 123456789 だとすると、2行目には上の数字はこないから減らせる
192 名前:デフォルトの名無しさん [2007/11/10(土) 07:50:49 ] 1から9の順列を昇順に求めるプログラム #include <iostream> using namespace std; main(){ int a,b,c,d,e,f,g,h,i,chk[9]={1,1,1,1,1,1,1,1,1},N=0; char **jretu=new char* [9]; for(a=0;a<9;a++) jretu[a]=new char [362880]; for(a=0;a<9;a++){ chk[a]=0; for(b=0;b<9;b++){ if(chk[b]==0)continue; chk[b]=0; for(c=0;c<9;c++){ if(chk[c]==0)continue; chk[c]=0; for(d=0;d<9;d++){ if(chk[d]==0)continue; chk[d]=0; for(e=0;e<9;e++){ if(chk[e]==0)continue; chk[e]=0; for(f=0;f<9;f++){ if(chk[f]==0)continue; chk[f]=0; for(g=0;g<9;g++){ if(chk[g]==0)continue; chk[g]=0; for(h=0;h<9;h++){ if(chk[h]==0)continue; chk[h]=0; for(i=0;i<9;i++){ if(chk[i]==0)continue; jretu[0][N]=a;jretu[1][N]=b;jretu[2][N]=c;jretu[3][N]=d; jretu[4][N]=e;jretu[5][N]=f;jretu[6][N]=g;jretu[7][N]=h;jretu[8][N]=i; N++; }chk[h]=1; }chk[g]=1; }chk[f]=1; }chk[e]=1; }chk[d]=1; }chk[c]=1; }chk[b]=1; }chk[a]=1; }cout<<N;}
193 名前:デフォルトの名無しさん [2007/11/10(土) 08:03:31 ] 32bit変数に、3bitずつデータ入れていけば列に同じ数字があるかどうかはXOR演算で出来るな
194 名前:デフォルトの名無しさん [2007/11/10(土) 08:05:36 ] やっぱり駄目だ 結局9回のループか演算(ifなど)がいるな
195 名前:デフォルトの名無しさん [2007/11/10(土) 08:09:10 ] 123456789 251498736 987654321 に縦方向に同一文字があるかどうかはどう判定する?
196 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 08:58:30 ] >>182 演習問題1は、 >数独(ナンバープレイス) をグラフ彩色問題に変換せよ だからアルゴリズムで説明させるってどういう意味? >(a) あいているマスに1〜9 までのどれかの数字を入れる >(b) 縦・横の各列および太線で囲まれた3 × 3 のブロックに同じ数字が入ってはいけない (b)の定義を以下のように読み替える。 (1)3×3の小ブロック内のマスは全て異なる数字であること (2)あるマスに対して、同じx、yを持つマスは全て異なる数字であること 特定のマス集合に所属するマスが全て異なる数字である事は、 任意のマスを一つ取り出した場合に、そのマス以外の他のマス集合に所属するマスと数字が異なるということと同じである。 これをグラフで表せば、それぞれのマスをグラフの頂点とした完全グラフにおいて、 任意の辺においてその両端の数値が異なることと同義である。 これはグラフ彩色問題の定義である。 というか、お前>>166 だろ?演習問題2ぐらい自分でやれよ。
197 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 09:06:46 ] ついでに、SEQまではとりあえずやってみて秋田。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5238.txt kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5239.txt DSATURは誰か頼む。
198 名前:デフォルトの名無しさん [2007/11/10(土) 09:11:44 ] 数独で16個の初期配置で解けるか調べるプログラム
199 名前:デフォルトの名無しさん [2007/11/10(土) 09:12:24 ] 問題として成立する初期配置の数字の最少個数はまだ結論が出ていないが、非対称の物では17個(初出・パズラー187号 1997年)のものが確認されている。 ja.wikipedia.org/wiki/%E6%95%B0%E7%8B%AC
200 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 09:21:51 ] >>198 「問題として成立する」と「解けるか」は意味が違うだろ、常識的に考えて。 なんなら初期配置0個でも解けるぞ。
201 名前:198 [2007/11/10(土) 09:51:13 ] >>200 解ける = 配置が一意的に求まる 解けている全配置を求めるプログラム書いたが 二つ目が出てこない 時間がかかりすぎる #include <iostream> using namespace std; main(){ int G[9][9],R[9][9],S[9][9]; int x,y[81],m,n,l,d,cnt; for(n=0;n<81;n++)y[n]=0; for(m=0;m<9;m++)for(n=0;n<9;n++)G[m][n]=R[m][n]=S[m][n]=1; d=cnt=0; for(;;){ x=y[d]; m=d/9; n=d%9; l= 3*(m/3) + n/3; if( G[m][x]+R[n][x]+S[l][x]==3 ){ if(d<80){G[m][x]=R[n][x]=S[l][x]=0; d++; y[d]=0;continue;} cnt++;for(int k=0;k<81;k++){if(k%9==0)cout<<endl;cout<<y[k]<<" ";};d--;} ST: if(y[d]<8)y[d]++; else{ if(d==0){cout<<cnt;return 0;} d--; x=y[d]; m=d/9; n=d%9; l= 3*(m/3) + n/3; G[m][x]=R[n][x]=S[l][x]=1; goto ST;} }}
202 名前:198 [2007/11/10(土) 10:08:16 ] 回転や反転の同一視、数字の同一視などを考慮しても全解答を求めるのは困難そうだ もし全配置が決定できれば、初期配置に対してそれを含む解答がただ一つがどうか調べるだけだ
203 名前:デフォルトの名無しさん [2007/11/10(土) 11:03:59 ] ***** **** *** ** *
204 名前:203 [2007/11/10(土) 11:04:43 ] 投稿ミスですorz
205 名前:203 [2007/11/10(土) 11:14:23 ] 下の図形をfor文で作るのですが・・ よくわかりませんorz ***** **** *** ** * 他スレでヒント貰ったのですが・・ 俺の頭じゃ無理だったみたいです・・
206 名前:203 [2007/11/10(土) 11:15:26 ] なんだか一個づれてますが ピラミッド型です。。本当にすみません
207 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:24:40 ] >>203 ピラミッドを作るなら各段'*'の数は奇数のような気が 偶数の段があると上手くいかないような ******* ***** *** *
208 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:30:24 ] >>205 #include <stdio.h> int main() { int i,j; for(i=5;i>0;i--){ for(j=0;j<5-i;j++) printf(" "); for(j=0;j<i;j++) printf("*"); printf("\n"); } return 0; }
209 名前:203 [2007/11/10(土) 11:30:59 ] 宿題見る限りでは偶数も入ってるんですょね・・ 多少いびつな形かもしれません
210 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 11:36:05 ] >>209 すると、問題が不明瞭だな。「ピラミッド型」が未定義だ。 これまでの回答で満足できないなら問題をきちんと確認してこい。
211 名前:203 [2007/11/10(土) 11:37:17 ] >208 ぉぉーー どうもです;;
212 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 12:00:34 ] >>175 ですけどこれじゃあちょっとわかりにくいので 50回移動すると考えれば、考えやすいのかなと。 無制限にこの確率で移動してendにたどり着くことなんて無限にあるんじゃないかと おもってしまった。
213 名前:デフォルトの名無しさん [2007/11/10(土) 12:55:04 ] 0は空マス これ何秒で解ける? 000 000 061 000 200 007 000 940 000 087 000 000 006 000 400 000 000 230 000 078 000 200 006 000 490 000 000
214 名前:デフォルトの名無しさん mailto:sage [2007/11/10(土) 13:40:53 ] 542 783 961 839 261 547 761 945 823 387 524 619 126 839 475 954 617 238 615 478 392 278 396 154 493 152 786 1秒もかからんわ
215 名前:デフォルトの名無しさん [2007/11/10(土) 18:09:05 ] [1] 授業単元:C言語 [2] 元のファイルslist.c: www.uploda.org/uporg1105430.txt.html 自分で途中まで作ったやつ:www.uploda.org/uporg1105431.txt.html [3] 環境 [3.1] OS:Linux (家ではWindowsでMinGW+MSYS+XEmacs) [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:11月14日 [5] その他の制限:特にないです [問題文] 課題:slist.c の改良 1.print_person関数を単方向リストを辿るように変更せよ。(自分なりに解決済み) 2.次の機能を実装せよ。 ・標準入力から一行ずつ名前と年齢を読み込む ・名前と年齢はカンマ(,)で区切る ・"foo,19"など ・単方向リストに格納して出力 3.その他(授業でヒント「単方向リストの反転」が与えられ、自分なりに解決済み) [問題文終わり] 自分で作った方はperson_input()の中が全然できてません。 次に続きます。
216 名前:215 [2007/11/10(土) 18:11:48 ] 構造体に名前と年齢を標準入力して、単方向リストで出力をするプログラムを考えています。 標準入力の際に名前と年齢は「tanaka,20」のように一行にするよう指示されています。 ヒントとして以下が与えられました。 char buf[256] ; char *name; int age; while (fgets (buf, sizeof(buf), stdin)) { char *sep = rindex (buf, '\n'); if (!sep) continue; *sep = '\0'; sep = rindex (sep, ','); if (!sep) continue; *sep = '\0'; name = buf; age = atoi (++sep); } また使用している構造体pは struct person { char *name; int age; struct person *next; }; です。このヒントを用いて一行の標準入力から適切に構造体に入れ、 単方向リストに格納するにはどうしたらいいでしょうか。 while文の中がややこしくて終了の仕方も分からないのでよろしくお願いします。