ぼるじょあがC/C++の宿題を片づけますYO! 42代目
1 :
ぼるじょあ代理 :
2005/04/18(月) 17:00:13 (・3・)アルェー 一回おきに登場することにしたC++房のぼるじょあですYO!
わからない宿題を片づけますYO!
――【注意点】―――――――――――――――――――――――――
・質問は必ず【質問テンプレ】に従ってください。
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
・計算問題は必ず数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
・複雑なAAはスレが荒れたり問題が埋もれる原因になりますので使用を控えてください。
―――――――――――――――――――――――――――――――
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS:
[3.2] コンパイラ(バージョン):
[3.3] 言語:C/C++/どちらでも可 のいずれか
[4] 期限:yyyy年mm月dd日hh:mmまで/無期限 のいずれか
[5] その他の制限:
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm 【歴代スレは
>>2-13 】
>>7 まともなレスつけないぼるじょあなんて必要とされていません。
10 :
3 :2005/04/18(月) 19:08:31
>>9 さん
素早い回答、ありがとうございました。
if文で作るとこまではわかったんですが、中身がどうしたら良いかわからなくて…。
本当に助かりました。
どうもありがとうございました。
11 :
デフォルトの名無しさん :2005/04/18(月) 22:10:48
[1] 授業単元:C言語演習 [2] 問題文: 適当な文字列が10行書き込んであるsample.txtがある。 文字列1 文字列2 … 文字列10 問1:適当な構造体を作成し、sample.txtを開き、データ郡を格納し、DOS窓に 構造体のデータとして 01 文字列1 02 文字列2 … 10 文字列10 と表示せよ 問2:DOS窓でiを入力したら「何行目に文字列を挿入しますか?」と表示し、 適当な行を数値入力後、文字列を挿入する。 問3:文字列挿入後、sample.txtを上書きする。 問4:DOS窓でqを入力すると終了する。 [3] 環境 [3.1] OS:win xp [3.2] コンパイラ(バージョン):gcc [3.3] 言語:C [4] 期限:2005年04月20日 [5] その他の制限:
前スレ976さん、978さん、979さん助言ありがとうございました。 とりあえず、形にしたつもりですがファイルへの出力で ソートした最後の値だけがファイルに保存されてしまいます。 1.0 2.0 3.0 4.0 ・・・ 10.0 というふうにソートした場合、 10.0だけでなく、 1.0 2.0 3.0 4.0 ・・・ 10.0 という風にファイルに保存したいのですが、どのように変えれば出来るでしょうか? 度々申し訳ありませんがアドバイスお願いいたします。
13 :
12 :2005/04/18(月) 23:41:10
>>13 ソースを見せてもらったが、表示と同時に保存している。
完全にロジックがおかしいから、表示が終わってから、改めてfopen()して
書き込むが良い。fopen()は"w"で開く度に、前の同名ファイルが存在しても
削除して上書きしてしまう。
15 :
デフォルトの名無しさん :2005/04/19(火) 00:11:15
>>14 おおおお!出来ました!
皆さんどうもありがとうございました!
>>13 fopen()の引数を "w" から "a" に変えるとかね。
でも、前スレ見てないから
>>13 が、どんな奴かは知らんが
ソースを見た感じファイル操作なんて早すぎる。
配列は正しく初期化されてるかな?
N個の要素を持つ配列を宣言しておいて、N-1個しか使っていないよ。
それでいてソート処理ではN個全てを対象としている。
それらが、ある程度動くようになってからファイルに出力しようよ。
せっかく配列に保持してるんだから、表示と保存処理は別にした方が良い。
ファイルに出力できれば、それで良いって考えは良くないよ。
ソフトウェア開発の仕事をすると、涙を呑んでそんなことをすることもあるが・・・
18 :
デフォルトの名無しさん :2005/04/19(火) 02:11:08
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク):0以上1以下の実数pをキーボードから入力し、ランダムにN人を集め、 誕生日別に分類したとき、生まれた人が一人もいないような日が存在しない確率を考える。 このような確率がp以上であるようなNの最小値を出力するプログラムをお願いします。 [3] 環境 [3.1] OS: WinXP [3.2] コンパイラ(バージョン): gcc [3.3] 言語:C/C++/どちらでも可 のいずれか C
19 :
デフォルトの名無しさん :2005/04/19(火) 02:23:50
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク):n個の文字列をキーボードから入力し、昇順 に並び替えて出力するプログラムを作成しなさい。ただし、文字列の文字数は 30文字以下とし、n<=50とする。 [3] 環境 [3.1] OS: UNIX/Solaris [3.2] コンパイラ(バージョン):gcc [3.3] 言語:C [4] 期限:2005年4月21日まで お願いします。
>>18 こんな感じ?
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int i,N,min=365;
double p,tmp;
srand((unsigned)time(NULL));
printf("Please input p\n");
scanf("%lf",&p);
i=0;
while(i<10000){
N=rand()%365+1;
tmp=1-(double)N/365;
if(tmp<p && N<min){min=N;}
i++;
}
printf("%d\n",min);
return 0;
}
>>18 誕生日というものが1年のうちの各日に均等に生じるという保証がないので、
この問題は回答不可能じゃないかな。
例えば2/29日生まれってのをどうするとか、盆と正月の9ヶ月後の誕生日が多いとか。
つか、 このスレも昔みたいにテンプレ無くせよ
>>22 テンプレ無くすと無駄なやり取りが増えるだけで、スレの無駄。
24 :
デフォルトの名無しさん :2005/04/19(火) 06:46:02
>>23 昔はなかったぞ。
誰だよ、このスレにテンプレつけた奴は?
過去ログほとんど持ってないがテンプレ付いたのは31以降40以前 ・Cでお願いします(文中にない場合もある)と言ってるのに C++の"//"のコメント使うのをはじめ C,C++の記述が混合してたり ・期限が●日だったのにとあとから追加してくるので期限がわからず過ぎてから解答だしたり ・授業単元の趣旨と外れた解答をして「これじゃダメです」ってレス付いたり ・解答もらったけどこっちではコンパイル通りませんとか いろいろあったから初めの出題の段階でできる限りの情報を引き出すためのテンプレかと >・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。 >・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。 テンプレをなくした時のメリットって何ですか? 教えていただけると今後の参考になりますのでお願いします。
27 :
デフォルトの名無しさん :2005/04/19(火) 09:30:37
初心者すぎますが、C++ってなんて読むんですか シープラスプラス??激しくアレな人教えてください
>>28 はじめからこっちで聞くべきでしたねってあっちに
付け加えてんだろうがなんでもかんでも一緒にする房うざすぎ お前がまず氏ね
>>28 マルチの意味わかってんのかね このクソガキは
ビビってひっこんでんじゃねーぞこら でてこいやキチガイ
もういいや
>>28 は消防からやり直して氏ねよ
2chのルールだけ気にしすぎて通常の人間の会話が理解できない房決定
2chやりすぎて脳腐ってんじゃないの?w 氏ね
29 名前:デフォルトの名無しさん[sage] 投稿日:2005/04/19(火) 09:40:28
>>28 はじめからこっちで聞くべきでしたねってあっちに
付け加えてんだろうがなんでもかんでも一緒にする房うざすぎ お前がまず氏ね
30 名前:デフォルトの名無しさん[sage] 投稿日:2005/04/19(火) 09:47:15
>>28 マルチの意味わかってんのかね このクソガキは
ビビってひっこんでんじゃねーぞこら でてこいやキチガイ
31 名前:デフォルトの名無しさん[sage] 投稿日:2005/04/19(火) 09:58:40
もういいや
>>28 は消防からやり直して氏ねよ
2chのルールだけ気にしすぎて通常の人間の会話が理解できない房決定
2chやりすぎて脳腐ってんじゃないの?w 氏ね
190 名前:デフォルトの名無しさん[sage] 投稿日:2005/04/19(火) 09:42:40
>>189 どこがマルチなんだ?wキチガイか 氏ね房うざすぎ おまえが氏ね
191 名前:デフォルトの名無しさん[sage] 投稿日:2005/04/19(火) 09:57:38
もういいや
>>189 は消防からやり直して氏ねよ
2chのルールだけ気にしすぎて通常の人間の会話が理解できない房決定
>>27 はもう遁走か?
口と逃げ足だけは一人前だなw
>>35 釣られてんじゃねーよwwwっぅうえwwww
>>19 #include <stdio.h>
main(){
char cStrings[50][30];
char cWork[30];
int num,i,j;
memset(cStrings,0,sizeof(cStrings));
printf("文字列を入力して下さい。[Enterのみで終了]\n");
for(num=0;num<50;num++){
if (fgets(cStrings[num],30,stdin) == NULL) break;
if (cStrings[num][0] == '\n') break;
}
for(i=0;i<num-1;i++){
for(j=i+1;j<num;j++){
if (strcmp(cStrings[i],cStrings[j]) > 0){
memcpy(cWork,cStrings[i],sizeof(cWork));
memcpy(cStrings[i],cStrings[j],sizeof(cWork));
memcpy(cStrings[j],cWork,sizeof(cWork));
}
}
}
printf("ソート結果\n");
for(i=0;i<num;i++) printf("%s",cStrings[i]);
}
39 :
デフォルトの名無しさん :2005/04/19(火) 15:23:13
[1] 授業単元:情報処理T [2] 問題文(含コード&リンク):x^3+x-2=0の解を[0,3]区間で求めよ。ただし ε=0.0001の場合とε=0.1の場合を求め結果を考察せよ(二分法) [3] 環境 [3.1] OS: WinXP [3.2] コンパイラ(バージョン):? [3.3] 言語:C++ [4] 期限: [5] その他の制限: ソースプログラムε=0.1の時 結果ファイル2個(x=1,-2 ?)
40 :
デフォルトの名無しさん :2005/04/19(火) 16:33:50
>>38 さん
実行できました。助かりました。ありがとうございました。
>>39 εってなんですか。大体解かるが、変数には説明が必要。
使ってるコンパイラが?ってどういうことだよ
43 :
39 :2005/04/19(火) 18:09:43
>>41 すいません
イプシロンです。
EPSでお願いいたします。
44 :
39 :2005/04/19(火) 18:12:41
>>42 ほんとごめんなさい
Microsoft Visual C++ 6.0
です。
>>43 そんなこと聞いていないが…
質問者いじめはもうやめよう…
47 :
デフォルトの名無しさん :2005/04/19(火) 19:44:19
>>39 #include <stdio.h>
#include <math.h>
float func (float x) { return x*x*x+x-2.0; }
float bisec (float (*f)(float), float l, float r, float e) {
float m = (l+r)*0.5, fm = (*f) (m);
if (fabs (r-l) < e || fm == 0) return m;
else if ((*f) (l) * fm < 0) return bisec (f, l, m, e);
else return bisec (f, m, r, e);
}
int main () {
printf ("ε=0.0001: %f\nε=0.1: %f\n",
bisec (func, 0.0, 3.0, 0.0001),
bisec (func, 0.0, 3.0, 0.1));
return 0;
}
思うんだけど、テンプレの環境の項目は要らないんじゃない?環境依存は禁止でしょ?
メ几 木又
too haw sim *
54 :
デフォルトの名無しさん :2005/04/19(火) 22:47:39
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): *********** ********* ******* ***** *** * 上から左右2個ずつ*が減る逆三角形を作りたいのですが、for文の条件がわかりません。 *を増やすのを2個ずつ減らせばいいのは分かるのですが、m=m+2にすると、 平行四辺形になります。どうかヒントだけでもいただけないでしょうか #include <stdio.h> void main(void){ int k,l,m; for(k=1;k<=6;k++){ for(l=1;l<=k;l++){ printf(" "); } for(m=1;m<12;m=m+2){ printf("*"); } printf("\n"); } } [3] 環境 [3.1] OS:win2000 [3.2] コンパイラ(バージョン):わかりませんがMicrosoftVisualC++使ってます [3.3] 言語:どちらでも可 [4] 期限:特になし
55 :
54 :2005/04/19(火) 22:51:40
左側の空白が消えてしまいました。本当はVの形になります。
>>54 こんな感じ?
#include <stdio.h>
void main(void){
int k,l,m;
m=0;
for(k=0;k<6;k++){
for(l=0;l<m;l++){
printf(" ");
}
printf("*");
for(l=0;l<20-m*2;l++){
printf("*");
}
printf("\n");
m=m+2;
}
return 0;
}
57 :
54 :2005/04/19(火) 23:02:45
こちらのスレの方が適切といわれてこちらに書き込みましたが、元のスレで答えていただきました。 マルチっぽくなってしまってすみませんでした。
#include <stdio.h> #define N 11 int main() { int n, i, offset = 0; for( n = N; n > 0; n -= 2, offset++ ){ for( i = 0; i < offset; i++ ) putchar(' '); for( i = 0; i < n; i++ ) putchar('*'); putchar('\n'); } return 0; }
59 :
デフォルトの名無しさん :2005/04/19(火) 23:56:33
>>49 template習ったから、使わせたいんだと思う。
60 :
47 :2005/04/20(水) 00:00:31
というか、この課題ってそんなに難しいものなの? 自称C++のexpertと名乗ってる人達が、自分が想像してた以上にでかい課題だとか言って、 みんな。ひいていくんだけど・・・。 締め切りまで、もう少しだから、馬鹿なりに頑張ってみる。
単に面倒くさいだけなんじゃ…
62 :
47 :2005/04/20(水) 00:08:14
いや、面倒くさいのは、今までにあって対応してくれたから、そうでもないと思う。
63 :
47 :2005/04/20(水) 00:12:07
というか、C++のコード直しを商売にしてる専門のところの人だから・・・。
64 :
47 :2005/04/20(水) 00:18:55
vusual studio 2003で出来ることって、visual studio 2005β版で出来ますよね? コンパイラーとかのせいでは、ないんですよね?
連続投稿なんてうざい事やってるから見放されるんだろうな
66 :
デフォルトの名無しさん :2005/04/20(水) 01:01:24
質問です。 Solaris環境でC++を使っています。 C++で、Unixシステムコマンドを呼び出す方法を教えてください。 %hostname というコマンドを使いたいのです。 よろしくご教授願いします。
system("hostname")
>>47 referenceはエラーでないの?出そうな気がするけど。
とりあえずsize_typeに関しては
template<typename Element>
typename Vec<Element>::size_type Vec<Element>::max_size() const
にすれば大丈夫だと思う。
69 :
デフォルトの名無しさん :2005/04/20(水) 04:47:40
z:\project\se.cpp(368): fatal error C1075: end of file found before the left brace '{' at 'z:\project\se.cpp(28)' was matched これどうすれば??
70 :
デフォルトの名無しさん :2005/04/20(水) 12:14:07
すみません。お助けください。 以下のコードはEUCをUNIコード変換する関数なのですが 逆にUNIコードをEUCに変換するように改造するには どこを触ればいいのでしょうか?基本的にマイナスプラスの世界に なるかと思われますが、よろしくお願いします。 EXPORT BOOL __stdcall ChengeEucToUni(char *File_in){ unsigned char*str_in,*str_out,*p;//文字列変換入出力 unsigned charstr_in_work[MAX_PATH];//入力ワーク unsigned charstr_out_work[MAX_PATH];//出力ワーク unsigned intHighAsc;//上位コード unsigned intLowAsc;//下位コード inti,strLen;//処理カウント/文字列長 chartmpfile[255];//テンポラリファイル名 ifstreamfiled;//出力ストリーム宣言 ofstreamfout;//入力ストリーム宣言 //変数の初期化 memset( str_out_work,'\0',MAX_PATH); memset( str_in_work,'\0',MAX_PATH); str_out= &str_out_work[0]; str_in= &str_in_work[0]; //変換後テンポラリファイル名作成 memset( tmpfile,'\0',MAX_PATH); strcpy(tmpfile,File_in); strcat(tmpfile,"tmp"); //変換元のファイルを開く filed.open(File_in); if(filed.fail()){ AfxMessageBox("変換元ファイル読込失敗"); return FALSE; }
71 :
デフォルトの名無しさん :2005/04/20(水) 12:15:39
//変換後の書込みファイルを開く fout.open(tmpfile); if(fout.fail()){ AfxMessageBox("変換先ファイル読込失敗"); return FALSE; } int fi = 0; //変換元ファイルの終端までループする while(!filed.eof()){ //変換元文字列の取得 filed.getline(str_in,MAX_PATH); /* 文字バイト数取得 */ strLen=strlen((const char *) str_in); /* 先頭位置コピー */ p = str_out; for(i=0;i<strLen;i++){ /* 上位・下位コード取得 */ HighAsc = *(str_in+i); LowAsc = *(str_in+(i+1)); /* 2バイト文字である */ if(HighAsc > 0x7F){ if(HighAsc == 0x8E){ /* 半角カタカナである */ *str_out = LowAsc; /* 1文字分進める */ str_out++; }
72 :
デフォルトの名無しさん :2005/04/20(水) 12:17:16
else{ /* 1バイト目変換 */ /* 偶数である */ if((HighAsc % 2) == 0){ if(HighAsc < 0xDF) *str_out = (unsigned char)(0.5 * HighAsc + 48); else if(0xE0 <= HighAsc && HighAsc <= 0xFE) *str_out = unsigned char(0.5 * HighAsc + 112); } /* 奇数である */ else{ if(HighAsc < 0xDF){ *str_out = unsigned char(0.5 * HighAsc + 48.5); else if(0xDF <= HighAsc && HighAsc <= 0xFD) *str_out = unsigned char(0.5 * HighAsc + 112.5); } /* 2バイト目変換 */ /* 1バイト目が偶数である*/ if((HighAsc % 2) == 0) *(str_out+1) = LowAsc - 0x2; /* 1バイト目が奇数である */ else{ *(str_out+1) = LowAsc - 0x61; if(*(str_out+1) > 0x7E) *(str_out+1) = *(str_out+1) +1; } str_out+=2;
73 :
デフォルトの名無しさん :2005/04/20(水) 12:18:08
} /* 1バイト分すすめる */ i++; } /* 1バイト文字である */ else{ *str_out = HighAsc; str_out = str_out + 1; } } *str_out = '\0'; /* 先頭位置に戻す */ str_out = p; //ファイルに変換データを出力 fout << str_out << endl; //fout.write(str_out,strLen);//改行失敗の為、上記コードに変更 fi++; } filed.close();//変換元ファイルのクローズ fout.close();//変換ファイルのクローズ DeleteFile(File_in);//変換元ファイルの削除 MoveFile(tmpfile,File_in);//変換ファイルを変換元ファイル名にリネーム return TRUE; }//長文すみません
氏ねそしておっ割れえれえええうえぇうぇええうぇうえうええぅえぅぅえぇえwwwwwwwwwwwww
75 :
デフォルトの名無しさん :2005/04/20(水) 12:55:01
>>75 えーと、取り敢えず今までの経過をまとめてくれない?
もう、何がなんだか。
77 :
デフォルトの名無しさん :2005/04/20(水) 13:30:32
[1] 授業単元:C言語 [2] 問題文: 問題1: サイコロを1000回振る。1の目がでた回数を整数型変数oneに憶えさせ、2の目が出た回数を変数twoに憶えさせ、….、6の目が出た回数を変数sixに憶えさせる。サイコロを振り終わってから、どの目が何回でたかを画面に書かせる。 (中級者は、整数型配列 kaisu[6]を宣言し、1の目の出た回数をkaisu[1]に、2の目の出た回数をkaisu[2]に憶えさせる,……のようにすること。 問題2: 問題1で、サイコロを100回振る。どの目が何回でたかを、星の数で表現するようにせよ。 [3] 環境 [3.1] OS: winxp [3.2] コンパイラ(バージョン): gcc [3.3] 言語:C言語 [4] 期限:今日の20時 お願いします。
>>77 >(中級者は、整数型配列 kaisu[6]を宣言し、1の目の出た回数をkaisu[1]に、2の目の出た回数をkaisu[2]に憶えさせる,……のようにすること。
有り得ない。
79 :
デフォルトの名無しさん :2005/04/20(水) 13:48:33
>>77 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define numof(array) (sizeof(array)/sizeof(array[0]))
void roll_dice (int* dice, int dn, int n) {
if (n <= 0) return;
else {
dice[(int) ((float)dn*rand()/(RAND_MAX+1.0))]++;
roll_dice (dice, dn, n-1);
}
}
int main () {
int i;
int dice[6] = {0};
srand (time(NULL));
roll_dice (dice, numof (dice), 1000);
for (i = 0; i < numof (dice); ++i) printf ("%d: %d\n", i+1, dice[i]);
return 0;
}
>>77 #include <stdio.h>
#include <stdlib.h>
/* 精度の悪い乱数を使用しているので、必要なら適宜書き換えること */
int diceThrow(void) {return rand() % 6;}
/* count回数ダイスを投げてdice配列に出現回数を記録 */
void l1(unsigned count, int * dice) {int ic; for (ic = 0; ic < count; ++ic) {++dice[diceThrow()];}}
/* arrayからarraySize分をその値の数の星グラフに */
void l2(unsigned arraySize, const int * array)
{
int ic;
for (ic = 0; ic < arraySize; ++ic) {
int cc;
printf("No.%d:%d\t", ic + 1, array[ic]);
for (cc = 0; cc < array[ic]; ++cc) {printf("星");}
printf("\n");
}
}
int main()
{
int kaisu[6]; int ic;
for (ic = 0; ic < sizeof(kaisu) / sizeof(*kaisu); ++ic) {kaisu[ic] = 0;}
l1(1000, kaisu);
for (ic = 0; ic < sizeof(kaisu) / sizeof(*kaisu); ++ic) {printf("No.%d\t%d\n", ic + 1, kaisu[ic]);}
for (ic = 0; ic < sizeof(kaisu) / sizeof(*kaisu); ++ic) {kaisu[ic] = 0;}
l1(100, kaisu);
l2(sizeof(kaisu) / sizeof(*kaisu), kaisu);
return EXIT_SUCCESS;
}
82 :
デフォルトの名無しさん :2005/04/20(水) 14:16:01
>>80-81 お早い回答ありがとうございます。
走らせてみた所、問題なく動きました。
ただ、ちょっと気になったのが
>>81 の方は何度実行しても星の数が固定なんですが
これは精度が悪い関数を使っているためでしょうか…。
>>79 ケアレスミス多過ぎ。
単純な文法エラーばかりで、動く云々以前にコンパイラが全部エラーだしたぞ。
--- got/vec.cpp 2005-04-20 14:13:01.500000000 +0900
+++ vec.cpp 2005-04-20 14:12:53.140625000 +0900
@@ -82,2 +82,3 @@
throw(std::out_of_range("Vec at: n has to be larger than 0 and less than curSize"));
+ }
return varray[n];
@@ -86,3 +87,3 @@
template<typename Element>
-Element & Vec<Element>::at(size_t n) const
+const Element & Vec<Element>::at(size_t n) const
{
@@ -94,3 +95,4 @@
//operator
-template<typename Element> Vec<Element>::operator[](size_t n){
+template<typename Element>
+Element & Vec<Element>::operator[](size_t n){
return varray[n];
@@ -99,3 +101,3 @@
template<typename Element>
-const Element & Vec<Element>::operator[](size_t n) const;{
+const Element & Vec<Element>::operator[](size_t n) const {
return varray[n];
@@ -139,3 +141,3 @@
template<typename Element>
-void Vec<Element>::resize(size_t newSize, Element x = Element())
+void Vec<Element>::resize(size_t newSize, Element x)
{
>>82 乱数系列を初期化していないため。必要ならsrand()関数を呼べ。
>>77 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define numof(array) (sizeof(array)/sizeof(array[0]))
void roll_dice (int* dice, int dn, int n) {
if (n <= 0) return;
else {
dice[(int) ((float)dn*rand()/(RAND_MAX+1.0))]++;
roll_dice (dice, dn, n-1);
}
}
void ps (int n) {if (n <= 0) return; else {printf ("*"); ps (n-1);}}
int main () {
int i;
int dice[6] = {0};
srand (time(NULL));
roll_dice (dice, numof (dice), 100);
for (i = 0; i < numof (dice); ++i) {
printf ("%d: ", i+1);
ps (dice[i]);
printf ("\n");
}
return 0;
}
86 :
デフォルトの名無しさん :2005/04/20(水) 14:23:45
87 :
デフォルトの名無しさん :2005/04/20(水) 14:30:50
83さんはどのコンパイラー使ってますか? 私はvisual studio 2005β版ですが、 function template has already been defined っていうエラーが7つと、 fatal error C1075: end of file found before the left brace '{' at 'c:\documents and setting\....\vec.cpp(28)' was matched Generating Code... っていうエラーしか出なくて、何がなんだか、よくわかりません。
>>87 もしかして、Vec.cppをコンパイルしようとしてね?
んなもん、できるわけねぇじゃん。
例えば、
#include "vec.h"
void func()
{
P10C::Vec<int> foo;
}
こんなソースを用意してそれをコンパイルしてみ。
_
それで判らなきゃ、タヒね。
しねとかいいやがっておめえがしね!!!!!!!!!!!!!!!!!!!!!!!!!
>>89 どこに「しね」と?
>>90 _
タヒね。
↑これは様々な文字を組み合わせて作った巧妙な「死ね」という文字だ!!!
なんて陰険な奴なんだ!!!!!!!!!!!!!!
92 :
デフォルトの名無しさん :2005/04/20(水) 15:02:04
>>88 いや、一応、main.cpp作ってやってるんですけど・・・。
ちなみに、しねとか、言ってるの私じゃないです。
94 :
デフォルトの名無しさん :2005/04/20(水) 15:04:51
87です。すいません。
>>92 Vec.cppをコンパイルしちゃいけないというのは理解できた?
つーか、>83の差分のパッチは当てたんだろうか。
98 :
デフォルトの名無しさん :2005/04/20(水) 15:28:24
>>95 main.cppをコンパイルしてると思います。
99 :
97 :2005/04/20(水) 15:43:40
100 :
デフォルトの名無しさん :2005/04/20(水) 15:48:41
>>99 ありがとうございます。
凄い。
これは、今の自分には作れませんわ。
ちょっとやってみます。
101 :
83 :2005/04/20(水) 15:52:29
無視されるんならもういいや。
102 :
デフォルトの名無しさん :2005/04/20(水) 15:58:40
>>83 いや、無視してないです。
そこに書いてあるエラーをさっきまで見直してました。
87に書いた通りです。
103 :
70 :2005/04/20(水) 16:15:08
>>97 わたくしの課題の何卒よろしくお願いいたします。
>>102 >83はエラーじゃないよ。修正した箇所をあんたのソースと比較した差分だね。
行頭の-があんたのソースから削除した行で、+が追加した行だ。
>>70 それ、ホントにUniCodeに変換している?
私にはShiftJisに変換しているように見えるのだけど。
それと、先ずはファイル入出力と漢字コード変換ロジックを分離してくれ。
そこまでできていれば、ShiftJis→EUCを実装するのは簡単だ。
106 :
デフォルトの名無しさん :2005/04/20(水) 16:24:57
>>104 ちょっと見てみます。
たぶん、typedefやるときに、find&replaceで一気に直したんだけど、そのとき、少しドジたので、
それも、少し入ってると思います。
107 :
デフォルトの名無しさん :2005/04/20(水) 16:33:13
>>97 再度ありがとうございます。
私は、いつもcompileってのでやってるのではなくて、
build solutionっていうのcompileしてるんですが、やはり
function template has already been defined
ってのが、出てきます。
いつもこういうタイプのを、やる手法でやってるのですが・・・。
βからβ2版に昨日変えたのが、何か関係してるんでしょうか。
97さんだと、これ正常に動きますか?
108 :
97 :2005/04/20(水) 16:40:36
もしかしてソリューションにVec.cpp入ってない? 入ってたら抜くこと。
なんで>107の段階で>97に返事しているのだろう…… しかも指摘済みのことを全然理解しないで先に進もうとしているし。 だんだんみんなが相手にしなくなったのが理解できるね。
110 :
デフォルトの名無しさん :2005/04/20(水) 16:55:07
>>108 compiler変えてみたら、出来ました。
ありがとうございます。
erase, insert functionは、pointerを返すんだけど、thisで良いんでしょうか?
>compiler変えてみたら、出来ました。 ホントに判ってるのかね。
112 :
70 :2005/04/20(水) 16:56:58
>>105 失礼しました。おっしゃる通りunicodeではなくsjisでした。
分離しましたのでお助けくださいませ。お願いします。
EXPORT BOOL __stdcall chgLineEucToSjis(LPCSTR strin,LPSTR strout){
unsigned char*str_in,*str_out,*p;//文字列変換入出力
unsigned charstr_in_work[MAX_PATH];//入力ワーク
unsigned charstr_out_work[MAX_PATH];//出力ワーク
unsigned intHighAsc;//上位コード
unsigned intLowAsc;//下位コード
inti,strLen;//処理カウント/文字列長
memset( str_out_work,'\0',MAX_PATH);//変数の初期化
memset( str_in_work,'\0',MAX_PATH);
str_out= &str_out_work[0];
str_in= &str_in_work[0];
strcpy((char *)str_in,strin);
strLen=strlen((const char *) str_in);/* 文字バイト数取得 */
p = str_out;/* 先頭位置コピー */
113 :
70 :2005/04/20(水) 16:57:42
for(i=0;i<strLen;i++){ HighAsc = *(str_in+i); /* 上位・下位コード取得 */ LowAsc = *(str_in+(i+1)); if(HighAsc > 0x7F){ /* 2バイト文字である */ if(HighAsc == 0x8E){ *str_out = LowAsc;/* 半角カタカナである */ str_out++;/* 1文字分進める */ } else{/* 1バイト目変換 */ if((HighAsc % 2) == 0){/* 偶数である */ if(HighAsc < 0xDF) *str_out = (unsigned char)(0.5 * HighAsc + 48); else if(0xE0 <= HighAsc && HighAsc <= 0xFE) *str_out = unsigned char(0.5 * HighAsc + 112); } else{/* 奇数である */ if(HighAsc < 0xDF) *str_out = unsigned char(0.5 * HighAsc + 48.5); else if(0xDF <= HighAsc && HighAsc <= 0xFD) *str_out = unsigned char(0.5 * HighAsc + 112.5); } if((HighAsc % 2) == 0) /* 2バイト目変換 */ *(str_out+1) = LowAsc - 0x2;/* 1バイト目が偶数である*/ else{ /* 1バイト目が奇数である */ *(str_out+1) = LowAsc - 0x61; if(*(str_out+1) > 0x7E) *(str_out+1) = *(str_out+1) +1; } str_out+=2; }
114 :
70 :2005/04/20(水) 16:58:16
i++;/* 1バイト分すすめる */ } else{/* 1バイト文字である */ *str_out = HighAsc; str_out = str_out + 1; } } *str_out = '\0'; str_out = p;/* 先頭位置に戻す */ strcpy(strout,(const char *)str_out); return TRUE; } それではご教授お願いいたします。m(_ _)m
115 :
97 :2005/04/20(水) 16:58:52
>>110 insert()は挿入されたデータを指すポインタを返すべき。
erase()は削除したデータの次のデータ(或いはend())を指すポインタを返すべき。
つーか、stlの実装見ろって言われてなかったか?
117 :
デフォルトの名無しさん :2005/04/20(水) 17:14:27
>>116 返す値については、何にも言われなかったです。
stlの実装見ろとかは、今のところ言われてないです。
これ、STLのクラスの一番最初の課題なんですが、
C++の段階を100で例えると、どのくらいのレベルのものなんでしょうか?
>>70 //文字列の変換はめんどくさいから漢字一文字分(戻り値は変換済みバイト数)
int sjis2euc(unsigned char * dest, unsigned char * src)
{
unsigned code1 = src[0];
code1 = code1 * 2 - 0xe1;
code1 &= 0x7f;// 1バイトカナの隙間
unsigned code2 = src[1];
code2 -= 0x1f;
if (code2 > 0x7f - 0x1f) {// 0x7fの穴
--code2;
}
if (code2 >= 0x7f) {// 偶数ブロック
code2 -= 0x5e;
++code1;
}
dest[0] = code1 | 0x80;
dest[1] = code2 | 0x80;
return 2;
}
//一バイトカナはこれ(戻り値は上と同じ)
int sjis2eucKana(unsigned char * dest, unsigned char * src)
{
dest[0] = 0x8e;
dest[1] = str[0];
return 2;
}
//後はコードの判断ロジック(暇があったら後でね)
119 :
117 :2005/04/20(水) 18:24:15
>>115 at()内のifはif (n >= curSize)だけで十分。
std::size_tは符合無し整数型と決まっているから。
121 :
118 :2005/04/20(水) 18:49:30
//残り(あ、微妙に仕様が違う気がする) static inline bool isSjisKana(unsigned char src) {return src >= 0xa1 && src <= 0xdf;} static inline bool isSjisKanji1(unsigned char src){return src >= 0x81 && src <= 0x9f || src >= 0xe0 && src <= 0xfc;} static inline bool isSjisKanji2(unsigned char src){return src >= 0x40 && src <= 0x7e || src >= 0x80 && src <= 0xec;} static inline bool isSjisKanji(const unsigned char * src){return isSjisKanji1(src[0]) && isSjisKanji2(src[1]);} //変換の本体 std::string sjis2euc(const char * str) { const unsigned char * src = reinterpret_cast<const unsigned char *>(str); unsigned char * buf = new unsigned char[strlen(str) * 2]; unsigned ic = 0; for (; src[0] != '\0'; ++src) { if (isSjisKana(src[0])) { ic += sjis2eucKana(& buf[ic], src); } else if (isSjisKanji(src)) { ic += sjis2euc(& buf[ic], src); ++src; } else { buf[ic++] = src[0]; } } buf[ic] = '\0'; std::string tmp = reinterpret_cast<const char *>(buf); delete[] buf; return tmp; }
122 :
& ◆E0RpANzUA2 :2005/04/20(水) 19:03:05
>>110 コンパイルの手順の問題ではない
コンパイルエラーなのだから質問の最初から87のエラーを提示すべき
75のソース
://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/320.txt
//===========================================================================
template<typename Element>
Element & Vec<Element>::at(size_t n)
{
if(n < 0 || n >= curSize){ //<<----ここで{ 使用
throw(std::out_of_range("Vec at: n has to be larger than 0 and less than curSize"));
return varray[n];
} //----ifの最後に}がないのでここがif文の終わり
.cppの最後の}でこのメソッド終了 }が不足しているので
fatal error C1075: end of file found before the left brace '{' at 'c:\documents and setting\....\vec.cpp
125 :
70 :2005/04/20(水) 19:25:08
>>121 先生!ありがとうございます。
ですがしかし、技が高度すぎて当方には発生するコンパイルエラーの意味すら
理解できません。inline初めてみました!
126 :
121 :2005/04/20(水) 19:30:37
>>70 あ、肝腎のことを書き忘れてた。
元のソース追っかけるの諦めたから、C++で適当に書いた。
static inline はなくても取り敢えずはいいとして、new/deleteはmalloc()/free()で、
reinterpret_castはCスタイルキャストで、std::stringはchar *でなんとか誤魔化してくれw
127 :
デフォルトの名無しさん :2005/04/20(水) 19:30:47
>>124 83さんが掲示してくれたのを、見直してるときに、それは見つけました。
言うべきでした。すいません。
>>122 リンクエラーならどんなエラーか書けよ。
ついでに言えば、人の指摘を無視するならもう来なくていいよ。
130 :
70 :2005/04/20(水) 19:35:17
>>126 ヒントありがとうございます。
では何とか努力してみます。ありがとうございました!
132 :
デフォルトの名無しさん :2005/04/20(水) 19:37:23
>>128 エラーは
Linking...
Main.obj : error LNK2019: unresolved external symbol "void __cdecl SJC::fillRandomly(void * const,unsigned int)"
(?fillRandomly@SJC@@YAXQAXI@Z) referenced in function "void __cdecl SJC::randomizeAllObjectBits<unsigned int>(unsigned int &)" (??$randomizeAllObjectBits@I@SJC@@YAXAAI@Z)
Debug/Project 1.exe : fatal error LNK1120: 1 unresolved externals
無視はしてないです。
たまに、指摘の内容を調べてて返事が遅れたりしてました。
すいません。
>>132 BlumBlumShub.cpp とやらはコンパイルしてるの?
134 :
133 :2005/04/20(水) 19:42:25
>>132 BlumBlumShub.cpp の
namespace /*anonymous*/ {
と、この { に対応する } をコメントアウトすればうまくいく
>>132 指摘した点を修正せずに先に進むことを無視したと言うのでは?
で、>133の指摘にもあるがMain.objとBlumBlumShub.objがリンクされていない。
IDEの使い方くらいきちんと抑えておきなさい。
136 :
133 :2005/04/20(水) 19:46:03
ごめん、うそついた。
137 :
デフォルトの名無しさん :2005/04/20(水) 19:48:40
>>133 あ、出来ました!!!!!!!
assert が出て、
typename Vec<Element>::pointer Vec<Element>::erase(pointer from, pointer to)
{
assert(from<to);
const std::ptrdiff_t offset = from - begin();
resize(std::copy(to, end(), from) - begin());
return begin() + offset;
}
この部分のassert(from<to);にです。from==toになってるみたいです。
assert(from<=to);にしてみたら、assertは出なくなったのですが、
Message: [bad allocation]
The type reported may not be most-derived.
ってのが、出てきます。
本当、出来そこないで、すいません。
138 :
デフォルトの名無しさん :2005/04/20(水) 19:50:21
>>137 if (from == to) return from;
>>129 テンプレに従わないと宿題として認めない
141 :
デフォルトの名無しさん :2005/04/20(水) 19:58:01
>>137 それ、付け加えたんですけど、同じassertが出ます。
from<toになってるから、assertが出るんですよね。
でも、from<=toにすると、出なくなるんですよね。
もう少し頭使おうよ。 >139はassertionを起こさない修正ではなくbad allocationしない修正。 from == to のときの処理を追加するなら、当然assert()も修正する必要がある。
ノータリンのボケに頭使えっつっても無理な話
144 :
デフォルトの名無しさん :2005/04/20(水) 20:51:39
>>142 assertが出るってことは、from<toってことですよね?
ってことは、それより以前にeraseが呼びだされる前にエラーがあるってことですか?
ヒントを与えて答えさせようなんて無理な話。
こいつ調べることすら出来ないみたいだな 何から何まで教えてくれると思ってるから ここで何でもかんでも聞くんだろうな
それがゆとり教育というものだよ
ゆとり教育と調べることと関係が有るのだろうか…
ゆとり教育用の教科書を見るとその片鱗が覗ける。
これだから無知な奴は。
>>139 のを一番最初にくっつけとけばいいんだって。
結局使わなければ忘れるから、内容が薄くなっても…。
155 :
sage :2005/04/20(水) 22:20:33
[1] 授業単元: 情報処理入門 [2] 問題文(含コード&リンク): ---hoge.txt--- 商品名aaaa 商品名bbbb 商品名cccc 商品名dddd 商品名eeee ---hoge.txt--- 問1:hoge.txtから文字列を読み込み、構造体に格納せよ。malloc()を用い 動的に確保し、双方向リストを作成し、DOS窓に行番号付きで表示せよ。 ---DOS窓--- 01 商品名aaaa 02 商品名bbbb … 05 商品名eeee ---DOS窓--- 問2:問1で作成した双方向リストを用い、「i」を入力したら任意の行に 適当な商品名を追加し、「d」を入力したら任意の行を削除せよ。 問3:問2のコマンド入力後の状態をDOS窓に表示せよ。また、その状態をhoge.txt に反映し上書きせよ。 [3] 環境 [3.1] OS: windows xp [3.2] コンパイラ(バージョン):gcc3.2.3 [3.3] 言語:C [4] 期限:できるだけ早く [5] その他の制限:初心者なので双方向リストのアドレス取得方法が分かりません。 ぼるじょあ様よろしくお願いします。
できるだけはやくっていつだよ
>>156 ぼるじょあに聞いてるんだから、他の奴はだまってろ
できるだけはやくっていつだよ(・3・)
[1] 授業単元: C言語 [2] # 「Boyer-Moore法」を用いる. # 探索を行う関数名は bm_search2 とする. * 引数として以下の3つを受け取る: 1. ファイル中の文字列 haystack 2. 検索対象の文字列 needle 3. 連結リスト(needle のすべての出現位置を格納するため) * 戻り値は,一致した文字列の総数. # プログラムは一致した文字列と前後 10 文字を表示する. # プログラムは一致したすべての文字列を表示する. * 関数 bm_search2 の中で一致した文字列を表示することは禁止する. # プログラムはコマンドライン引数としてファイル名と検索文字列を指定できること. [3] 環境 [3.1] OS:Linux [3.2] わからないです [3.3] C言語 [4] 4月22日までです よろしくお願いします
自分が使ってるコンパイラすら分からないような 無能・無才は素直に単位落としとけよ
161 :
155 :2005/04/20(水) 22:34:16
>>156-158 ぼるじょあ様へ
できるだけ早くとは2005年4月22日です。
よろしくお願いします。
保守
163 :
デフォルトの名無しさん :2005/04/20(水) 23:55:13
C言語でコンパイラはボーランドCです。 あるファイル、例えば 2 6 -7 0 0 6 48 4 5 3 -1 0 8 12 9 0 -7 5 1 9 -2 があった場合に何行何列かを表示するプログラムを 作って欲しいです。ちなみに行数によって列数は変わり ません。条件としてはmalloc関数を使ってほしいです。 だれかお願いしますm(__)m
164 :
デフォルトの名無しさん :2005/04/21(木) 00:09:39
2問あるのですが・・・初心者でわかりません。 3値の中央値(2番目に大きい数)をもとめるアルゴリズムを C言語で実装せよ。(if文を使うこと) 以下を参考にして3×3のマスにおける○×ゲームの表示プログラムを 作成したい。とりあえず以下のように出力させるには? どこに×をおきますか?:2 2 ○○○ ○×○ ○○○
165 :
デフォルトの名無しさん :2005/04/21(木) 00:10:23
上の続きです #include <stdio.h> int main(void) { int i, j, n,m; printf("どこに×を置きますか?:"); scanf("%d %d", &n,&m); for (i = 1; i <= 3; i++) { for (j = 1; j <= 3; j++) { ここを考えること。 } putchar('\n'); } return (0); } となっています。 明日提出なので、できればよろしくお願いします。
int middle(int a, int b, int c) { if(b <= a && a <= c || c <= a && a <= b) return a; if(a <= b && b <= c || c <= b && b <= a) return b; return c; } 2問目 if(i == n && j == m) printf("×"); else printf("○"); 入力に時間がかかったせいで3分もかけてしまった。
167 :
デフォルトの名無しさん :2005/04/21(木) 00:20:22
>>151 それをやったらbad allocationになるんですよ。
168 :
デフォルトの名無しさん :2005/04/21(木) 00:20:38
163もやっていただけませんか? 明日提出でやばいです・・・。 お願いします。
>163 具体的に例題ファイルの場合にはどうなればいいのか説明できますか? 例題ファイルの場合、 3行7列と 画面に表示すればいいということでしょうか? それだとmalloc関数を使う必要がないので違いますよね
172 :
デフォルトの名無しさん :2005/04/21(木) 01:00:23
>170 作りたいプログラムはファイルの中身を表示するのが目的です。 下のプログラムで3行7列は#defineによって定義してますよね。 自分ででもファイルの中は実際はわからないわけですから何行何列 かはプログラム自体がファイルを開いたときに認識するように したいのです。つまり例題ファイルを開いたときに下のプログラム自体が 3行7列を認識して2次元行列ma[][]を表示したいようにしたいのです。 プログラムさえできればmalloc関数は使わなくても大丈夫です。 説明不足があったらすみません。お願いします。 #include <stdio.h> #define COL 7 #define ROW 3 int main(void) { FILE * f; int data[ROW][COL], i, j, is_error = 0; if ((f = fopen("data.txt", "r")) == NULL) return 1; for (i = 0; !is_error && i < ROW; ++i) for (j = 0; !is_error && j < COL; ++j) if (fscanf(f, "%d", &data[i][j]) != 1) is_error = 1; fclose(f); if (is_error) return 1; printf("%d行%d列\n", ROW, COL); return 0; }
173 :
155 :2005/04/21(木) 01:00:49
>>169 ありがとうございました
ぼるじょあ様、なにとぞ問3をお願いします。
174 :
97 :2005/04/21(木) 01:10:06
175 :
169 :2005/04/21(木) 01:11:38
>>173 問3もファイルに書く以外の事はやってあるよ。
じゃあ後はぼるじょあ様にまかせよう。
176 :
デフォルトの名無しさん :2005/04/21(木) 01:55:39
172ですが説明不足でしたかね? それとも説明がわかりにくかったですかね?
>172 >2次元行列ma[][]を表示したいようにしたいのです >printf("%d行%d列\n", ROW, COL); だから、どっちなんだと… >条件としてはmalloc関数を使ってほしいです >プログラムさえできればmalloc関数は使わなくても大丈夫です これも矛盾してるしな。 行と列の数が分かればそれでいいのか? それとも、配列の中身のデータが必要なのか? と>170は聞いているんだ。質問に答えろよ。 読み込む前には行や列の数が分からん、なんて分かってる。 例として、>163を読み込んだときにはどういう結果が出力されるべきなのかを書け。 課題に「ただし、mallocを使う事」とか「ただし、データは一度配列に読み込む事とする」みたいな条件がついてるならそれもな。
178 :
デフォルトの名無しさん :2005/04/21(木) 02:17:43
>177 >だから、どっちなんだと… >行と列の数が分かればそれでいいのか? >それとも、配列の中身のデータが必要なのか? 両方表示していただきたいです。 >これも矛盾してるしな。 malloc関数はどうでもいいです。 個人的に使わないと無理かなと思っただけなんで。 >例として、>163を読み込んだときにはどういう結果が出力されるべきなのかを書け。 2 6 -7 0 0 6 48 4 5 3 -1 0 8 12 9 0 -7 5 1 9 -2 3行7列の行列です。 >課題に「ただし、mallocを使う事」とか「ただし、データは一度配列に >読み込む事とする」みたいな条件がついてるならそれもな。 mallocはどうでもいいです。配列ma[][]をあとで計算に使うので ma[][]に格納して欲しいです。 これで大丈夫ですか?
179 :
デフォルトの名無しさん :2005/04/21(木) 02:20:51
178の続き。 ma[][]じゃなくてdata[][]でした。どちらでもいいです。 すみません。
181 :
デフォルトの名無しさん :2005/04/21(木) 08:22:42
>>97 =174
ありがとうございます。うれしいかぎりです。
でも、またassertionが出るようになったのですが・・・。
Debug Assertion Failed!
C:...\Microsoft Visual Studio 8\...\VC\include\vector
Line:223
Expression'vector literators incompatible
>>181 そのassertionってSTLのvectorからでてる様に見えるんだが。俺の気のせいかなぁ。
183 :
デフォルトの名無しさん :2005/04/21(木) 08:42:09
>>182 そうそう。
その通りだと思います。
それって、STLのVectorが違うってこと?
でも、今までも、他のSTLから出てるエラーはあって、
自分のプログラムを治したら、出なくなったっていうのは、あるんですけど・・・。
185 :
184 :2005/04/21(木) 09:17:54
>>これも矛盾してるしな。 >malloc関数はどうでもいいです。 >個人的に使わないと無理かなと思っただけなんで。 ^^^^^^^^^^ 嘘を付くな嘘を。
>>183 そういうことではなくて、
このソースそのものがvectorに取って代わるものなんではないの?ってこと
なのに、vectorのassertionを出すっていうのは、おかしくないのかなと思っただけ。
どっちもincludeしてたりするのなら、やめた方がいいと思うんだけど。
俺の認識がおかしいならスルーしてくださいな。
↑で説明足らずだったから、追記。 両方のvectorクラスをincludeしてると予想して書くけど、 名前空間が違うから、基本的には両方includeしてても、 おかしいことにはならないと思う。 けど、同様の機能を提供するものをincludeしてるという状況の為、 意識しないミスによって、例えば自作vectorクラス側のオブジェクトを STL::vectorとして扱ってしまっている場所が出てしまう可能性がある。 上記のassertionもその手のバグじゃないかと疑っているということです。
189 :
70 :2005/04/21(木) 10:19:46
>>118 様 お助けください
作成していただいたソースをなんとかVCでコンパイル可能になったのですが
デバッグ時に←個所でエラーが発生してしまいました。
原因がわかりません。ヒントお願いします。
int sjis2euc(unsigned char *dest, unsigned char *src) {
unsigned code1 = src[0];
unsigned code2 = src[1];
code1 = code1 * 2 - 0xe1;
code1 &= 0x7f;// 1バイトカナの隙間
code2 -= 0x1f;
if (code2 > 0x7f - 0x1f) --code2; // 0x7fの穴
if (code2 >= 0x7f) {// 偶数ブロック
code2 -= 0x5e;
++code1;
}
dest[0] = code1 | 0x80;
dest[1] = code2 | 0x80; //← 最初にここを通過させるとメモリ参照系エラーになります。
return 2;
}
int sjis2eucKana(unsigned char * dest, unsigned char * src) { //一バイトカナはこれ(戻り値は上と同じ)
char * str;
dest[0] = 0x8e;
dest[1] = str[0];
return 2;
}
190 :
70 :2005/04/21(木) 10:20:08
static BOOL isSjisKanji1(unsigned char src){return src >= 0x81 && src <= 0x9f || src >= 0xe0 && src <= 0xfc;} static BOOL isSjisKanji2(unsigned char src){return src >= 0x40 && src <= 0x7e || src >= 0x80 && src <= 0xec;} static BOOL isSjisKana(unsigned char src) {return src >= 0xa1 && src <= 0xdf;} static BOOL isSjisKanji(const unsigned char * src){return isSjisKanji1(src[0]) && isSjisKanji2(src[1]);} EXPORT __stdcall sjis2eucMain(char * str) { //変換の本体 char tmp; unsigned char * src = reinterpret_cast<unsigned char *>(str); unsigned char * buf;/// = malloc((char)strlen(str) * 2); unsigned ic = 0; for (; src[0] != '\0'; ++src) { if (isSjisKana(src[0])) ic += sjis2eucKana(& buf[ic], src); else if (isSjisKanji(src)) { ic += sjis2euc(&buf[ic], src); ++src; } else buf[ic++] = src[0]; } buf[ic] = '\0'; free(buf); return tmp; }
191 :
70 :2005/04/21(木) 10:22:09
追記ですが、外部宣言している本体のsjis2eucMain(char * str) のstrには試験的に作ったVBからの呼出し元で 明示的に「あいうえおかきくけこさしすせそ」を格納しており パラメタとしては正常に引き継がれておるようです。
>>183 テストコードが悪い(多分)
>>182 テストコードを見たら、STLのvectorと独自のvector両方に対してテストしてる模様。
193 :
デフォルトの名無しさん :2005/04/21(木) 10:27:44
>>182 ,183,192
確かにSTLのvectorをincludeしてる。
194 :
70 :2005/04/21(木) 10:34:04
失礼しました。 unsigned char * buf;/// = malloc((char)strlen(str) * 2); コンパイル通す為にお馬鹿な事をしていました。 ここを直したらうまく動きました。お騒がせしました。
195 :
デフォルトの名無しさん :2005/04/21(木) 10:34:04
erase function でreserve, operator=,assign とかを使うことって可能ですかね?
196 :
デフォルトの名無しさん :2005/04/21(木) 10:49:18
>>195 ごめんなさい。言うの忘れてました。
もし、capacityがなくなったら、そのたびに、2倍にするそうです。
だから、bad reallocationってメッセージが出てるのでしょうか?
>>196 まず何が起きてるのか言ってくれ。
はっきりいってわけがわからない。
198 :
デフォルトの名無しさん :2005/04/21(木) 11:03:19
>>197 196の訂正。
さっきのvector関連のassertは出なくなって、また
=== A std::bad_alloc EXCEPTION REACHED main() ===
Message: [bad allocation]
The type reported may not be most-derived.
っていうメッセージが出るんです。
つまり、bad allocationなんだと・・・。
これって、capacity==sizeになったとき、
またvectorを増やすけれど、その時の大きさをcapacity*2にするってことなんだけど、
そこから来てる、エラーなのかなって思ったのです。
200 :
デフォルトの名無しさん :2005/04/21(木) 11:16:26
教授の助手に聞いたところ、 reallocationはcapacityを2倍にしようとするんだけど、 その2倍のcapacityがmax_sizeを超えていたら、max_sizeは新しいcapacityを 取られるべきだそうです。 defaultによって、メモリーがなくなったときに、new[],delete[],がthrowする。 size_type max_size(void) constに関して、throw std::length_errorが必要だそうです。 本当、手間取らせちゃってごめんなさい。
201 :
デフォルトの名無しさん :2005/04/21(木) 11:22:32
>>199 はい。
そうすると、198で言った風になります。
202 :
デフォルトの名無しさん :2005/04/21(木) 11:28:38
つけたし。 defaultによって、メモリーがなくなったときに、 new[],delete[],がstd::bad_allocをthrowする。 私の日本語表現、おかしくて、読みずらいかもしれません・・・・。
>>201 おれは問題なくテスト通ってるけどな。
今使ってるソース見せてよ。
204 :
デフォルトの名無しさん :2005/04/21(木) 11:34:12
>>204 insert(pointer before, size_type howMany, const_reference x)
が直ってない
206 :
デフォルトの名無しさん :2005/04/21(木) 11:40:25
size_type max_size() const{ return size_type(-1);} これじゃ、不十分なんでしょうか?
207 :
デフォルトの名無しさん :2005/04/21(木) 11:55:46
むずかしいです。 [1] 授業単元:C言語実習 [2] 問題文(含コード&リンク): 任意の文字列を検索し、指定文字列に置換える関数を作りなさい。 なお、置換文字列は任意の文字列と同じ長さとは限らない。 [3] 環境 [3.1] OS: linux [3.2] コンパイラ(バージョン):gcc [3.3] 言語:C [4] 期限:2005年4月22日まで [5] その他の制限: 23日の授業で提出なので御願いします;
208 :
デフォルトの名無しさん :2005/04/21(木) 12:02:43
英語ですいません。 某サイトによると、 size_type max_size() const; Returns size() of the largest possible vector. size_type capacity() const; Returns the size of the allocated storage, as the number of elements that can be stored. 今まで、ネットで、こういう系統のcppファイルをたくさん集めて研究してたんですけど、 これより、簡単で、size_type max_size() const っていう関数は使ってないんですよね。 なので、ないがしろにしてたけど、これのせいの気がするんですが・・・。
209 :
デフォルトの名無しさん :2005/04/21(木) 12:05:11
>>205 あ、それを直しても、198でいうようなのが出てきます。
assertとかは出ないんですけど・・・。
210 :
デフォルトの名無しさん :2005/04/21(木) 12:06:17
int main(){ int pid; pid=fork(); if(pid==0){ cout<<"a"; } else{ cout<<"b"; } } 上記のコードだと、実行後 aa と出力されてしまいます。 forkから、親側pidにはプロセスID、子側pidには0が返るはずなので、 親はbを、子はaを出力すると思うのですが、私は何か勘違いを しているのでしょうか?
>>207 void replaceString(char* string, const char* from, const char* to)
{
const int len1 = (int)strlen(from);
const int len2 = (int)strlen(to);
char* found = strstr(string, from);
while (found) {
if (len1 != len2) {
memmove(found + len2, found + len1, strlen(found + len1) + 1);
}
memcpy(found, to, len2);
found = strstr(found + len2, from);
}
}
>>209 じゃあ、もう一回直したやつをアップしてみて。
213 :
デフォルトの名無しさん :2005/04/21(木) 12:12:01
214 :
デフォルトの名無しさん :2005/04/21(木) 12:13:57
>>212 すいませんが、212さんのoutputかexe fileアップしてもらっていいですか?
>>213 const_refernce copy(x)
->
const value_type copy(x)
また池沼がこのスレに這いつくばってるのか
217 :
デフォルトの名無しさん :2005/04/21(木) 12:22:39
>>215 そうするとassertが出るので、const_referenceであってると思います。
>>216 そうですよね。
自分でも、嫌になってるから、皆さんには、もっと迷惑かけてると思います。
すいません。
>>217 const_referenceだったら何も修正されないじゃん。
そのassertの内容は?
219 :
デフォルトの名無しさん :2005/04/21(木) 12:56:20
>>218 template<typename Element>
void Vec<Element>::insert(pointer before, size_type howMany, const_reference x){
const size_type prev = size();
const difference_type offset = before - begin();
const_reference copy(x);
copy とか習ってなかったので、よく分からなかったのですが、
const_reference x なので、const_referenceかなと思って。
value_typeにすると、またさっき言ったように、
STLのVectorからのエラーになります。
落ち着け。思いつきであれこれいじっても事態は悪くなるばかりだ。
222 :
70 :2005/04/21(木) 13:17:00
118様!! 「結果」という漢字が正常に変換されません。
223 :
210 :2005/04/21(木) 13:18:23
どなたか、お助けくださいいいいい
224 :
207 :2005/04/21(木) 13:19:49
>>211 void replaceString(char* string, const char* from, const char* to);
main(){
char *string1 ="good mornig america!";
char *string2 ="good";
char *string3 ="bad";
replaceString(string1,string2, string3);
printf("%s\n",sting1);
}
void replaceString(char* string, const char* from, const char* to)
{
const int len1 = (int)strlen(from);
const int len2 = (int)strlen(to);
char* found = strstr(string, from);
while (found) {
if (len1 != len2) {
memmove(found + len2, found + len1, strlen(found + len1) + 1);
}
memcpy(found, to, len2);
found = strstr(found + len2, from);
}
}
ってやったらコアダンプしちゃいました;;
どこが悪いんでしょうか・・・
char string1[] ="good mornig america!"; char string2[] ="good"; char string3[] ="bad";
226 :
デフォルトの名無しさん :2005/04/21(木) 13:47:49
>>Vector classでお世話になったみなさん。 長い間付き合っていただいて、ありがとうございました。 なんか悪いので、締め切りまであと15時間あるので、 自分なりにやってみます。 本当にありがとうございました。
227 :
207 :2005/04/21(木) 13:53:31
すみません・・ついでといっちゃあなんですが・・?? 224はだめで225はOK ↓もOKな理由がわかりません・・・なぜなんでしょうか; main(){ char *string1 ="good mornig america!"; char *string2 ="good"; char *string3 ="bad"; printf("%s\n",string1); printf("%s\n",string2); printf("%s\n",string3); }
VC8のvectorを見てみたが、Debugモードでvectorのiteratorとポインタを比較するとassertに失敗するようになっている。 VC8を使わないか、Releaseモードにすれば大丈夫。
230 :
デフォルトの名無しさん :2005/04/21(木) 14:26:25
>180
ありがとうございました。
>>170 は私が作ったへぼソースw
>まるで自分が作ったかのように質問してるし。
>良識を疑うよw
自分が作ったなんて一言も書いてないです。
もしそのように感じたらすみませんでした。
>>malloc関数はどうでもいいです。
>>個人的に使わないと無理かなと思っただけなんで。
^^^^^^^^^
>嘘を付くな嘘を。
嘘ではないです。宿題を出された日に大学で教授にmalloc関数を
使えばできるよ。と言われたので個人的に解釈してmalloc関数を
使わなければできないと思ったのでそのように書いたのです。
------------------------------------------------------------
言い訳みたいな文になってしまってすみません。
本当にありがとうございました。
>>227 それは、宿題の範疇を超えるんだが(^^;;
簡単に説明すると、
・文字列トークンは普通、(書換えできない)文字列へのポインタとして扱われる。
・例外として文字列配列の初期子として書かれたときは、その文字列配列の初期値を決める。
・配列の名前だけ書く([]を着けない)と、最初の要素へのポインタとして扱われる。
わからんよーなら、丁寧な教科書なら図解つきで載ってるんで、読んでおくれ。
>>70 なんだよ、C++でいいならそのまま使えよ。
Cかと思ってmalloc()辺りの説明したけど、文字列の扱い慣れてないみたいだから
>190みたいな阿呆なコード書いてるんだろうし。
233 :
デフォルトの名無しさん :2005/04/21(木) 15:50:28
>>229 明日学校行って、他のコンパイラーでやってみます。
本当ありがとうございました。
>>233 >229を理解してその台詞? いくらなんでも酷すぎるなぁ。
235 :
デフォルトの名無しさん :2005/04/21(木) 16:46:05
>>234 >>Releaseモードにすれば
マジであほなんで、その仕方がよく分からなかったけど、また聞くと悪いから、
VC8以外のコンパイラーで一度試してみようかなって思っただけです。
236 :
デフォルトの名無しさん :2005/04/21(木) 16:49:14
>>234 今ままでずっと書いてもらったコードを理解するために、色々調べてて
返事おくれました。
STLの授業始まったばかりで、まだ定かではないことがたくさんあって・・・。
ほんと、ありがとうございました。
>>236 前にもIDEの使い方くらい勉強しとけって書かれてたよなぁ。
レスがその場凌ぎ以外のなんにも役に立ってないわけだ。
>>237 ちゃんと勉強するやつがここに来るわけないだろw
239 :
デフォルトの名無しさん :2005/04/21(木) 17:38:04
>>237 マジレスすると、私事なのですが、学校が進むの早いんですよ。
去年の10月にC++の最初、basic classから始まって、
data structure,STL&SLと、とんとんと。
その場凌ぎ以外のなんにも役に立ってないわけじゃなくて、
進むの学校が進むの早すぎて、あれもこれもとやること多すぎで、
消化不良起こしてるんです。
まだC++初めて6ヶ月しか経ってないので。
もちろん、このクラスの以外にも3クラス取ってるわけで・・・。
でも、コンパイラーのこと、書かれていた基礎知識が抜けていて、
マズイのは、ご指摘どうり、自分でも承知しているので、
週末にでも時間作れるように努力して、勉強します。
240 :
70 :2005/04/21(木) 18:03:49
>>232 レスありがとうございます。
AHOなソースにしてしまい申し訳ありません。
何故か当環境でコンパイルすると、ズラーとエラーが出てきてしまいました。
『結果』という文字がなぜうまくいかないのかヒントお願いいたします。
半年もあれば……
>>240 文字列は、char変数には入らない。
stringでエラーを起こしているなら、
#include <string>
すればいい。
教えるの面倒だから、元の方でエラーをなくす努力をしてくれ。
漏れはC++初めて二ヶ月でEffectiveシリーズ三冊やらExceptionalやら ModenやらFAQやら禿本やらboostやらと読んだが… 自分が適当にやってるのを他のせいにするなと言いたい やる気さえあれば誰だって出来る。よっぽどアホでない限りな
的外れな意見だな
Ψ1s=1/sqrt(PI)*γ1^(3/2)*e^(-γ1*r) Ψ2p=1/sqrt(PI)*γ2^(5/2)*r*e^(-γ2*r)*cosθ という式で|Ψ(x,y,z)|^2を、数値的に求め その結果から|Ψ(x,0,z)|^2のグラフを gnuplotでえがくプログラムを組む課題です。 どのようなプログラムを組めばよいでしょうか。
[1] 授業単元:プログラム技術 [2] 問題文(含コード&リンク):3つの商品を買うとき会員券がある場合2割引 無ければ定価で売るプログラムを作りなさい。消費税も5%ととして計算すること [3] 環境 [3.1] OS:Win2k [3.2] コンパイラ(バージョン):Borland C++ Compiler 5.5 [3.3] 言語:C/C++/どちらでも可 のいずれか [4] 期限:無し for文からおかしいので治してみたりしたのですが forを無視する、1つしか入力できない、数を入力してもループが終わらないといったバグがでます。 (型指定)の練習問題で初めて使用したのですが表示がおかしいのもわかりません。 お願いします int pr[2]; int a,b,goke,sin; printf("品物の値段を入力してください\n"); for(a=0;a<=2;a++){ scanf("%d",&a); goke=pr[a]+goke; } printf("会員券があるなら1、ないなら0を入力してください\n"); scanf("%d",&b); if(b==1){ sin=(float)goke*0.8; sin=(float)sin*1.05; } else if(b==0){ sin=(float)goke*1.05; } else{ printf("エラー\n"); } printf("\\%d",sin); return 0;
>>245 LinuxかMacかwindowsかそのほかのUNIXか。
>>245 テンプレに従え。C++なのかCなのかも分らないので宿題として正答はできない。
>>246 3つの商品なのにpr[2]ではおかしいでしょ。
prは品物の値段を入れる変数でaは添え字でしょ。
入力された品物の値段をどこに入れるの。
考えてね。
>forを無視する、1つしか入力できない、数を入力してもループが終わらないといったバグがでます。 for(a=0;a<=2;a++){ scanf("%d",&a); ループに使ってる a で scanf するな! っていうか pr[] に scanf に汁! >(型指定)の練習問題で初めて使用したのですが表示がおかしいのもわかりません。 goke 初期化汁!
251 :
245 :2005/04/21(木) 20:29:26
失礼いたしました。 [1] 授業単元:なし [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS:fedora core [3.2] コンパイラ(バージョン):不明 [3.3] 言語:C [4] 期限:4月末日
252 :
デフォルトの名無しさん :2005/04/21(木) 20:41:02
ファイルの入出力のフローチャートがわかりません
>フローチャート オhル
そうですか。
255 :
デフォルトの名無しさん :2005/04/21(木) 20:58:29
3つ数を入れてもらって合計数を表示するプログラムですが、 どうも合計数がきちんと表示されません。 以下のどこかだと思いますが、どこがおかしいのでしょうか? do{ printf("No%d: = ",++y); scanf("%d",&z); sum += z; putchar('\n');} while(y < 3); printf("合計値は… : %d です!\n\n",sum);
256 :
デフォルトの名無しさん :2005/04/21(木) 21:02:08
[1] 授業単元:プログラミングC言語 [2] 問題文(含コード&リンク): 1.キーボードから整数を入力させ、奇数か偶数かを判定するプログラムを作りなさい。 2.同じく整数を入力させ、素数であるかどうかを判定するプログラムを作りなさい。 [3] 環境 [3.1] OS:Win2000 [3.2] コンパイラ(バージョン):Visual C++ [3.3] 言語:C [4] 期限:明日朝まで よろしくお願いします
>どこがおかしいのでしょうか? たいていは初期化
>奇数か偶数かを判定する if( 数 % 2 )
>>257 神様!!!できました!!!
=0って宣言しなくても勝手に0が入ると思ってたorz
260 :
デフォルトの名無しさん :2005/04/21(木) 21:17:44
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク):int string_to_number(char *p):引数として与えられた文字列pの先頭から整数値を取り出して返す関数。ただし先頭が符号でも数字でもなければ0を返す。 [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ(バージョン):分かれません [3.3] 言語:C [4] 期限:無期限 [5] その他の制限:特になし
>ただし先頭が符号でも数字でもなければ 先頭以外に数字以外の別の文字があった場合はどうする?
>>261 未定義なんだから、別に鼻の穴から悪魔が出てきても(ry
int string_to_number(char *p){ return atoi(p); }
264 :
207 :2005/04/21(木) 22:22:53
>>231 いまポインター関係の本を読んでみてます;
理解するのにちょっと時間がかかりそうですが頑張ります;
ご丁寧にありがとうございました♪
>>260 #include <ctype.h>
int string_to_number(char *p)
{
int n = 0, sig = 1;
switch( *p )
{
case '+': p++; break;
case '-': sig = -1; p++; break;
}
while( isdigit(*p) ){
n *= 10;
n += *p - '0';
p++;
}
return n * sig;
}
>265 intの桁あふれとかは考慮しなくてもいいですか、まぁ宿題レベルだからいいのか
桁あふれ対策は最初にstrcmpしたらよかろ。
>267 ハァ? 265 でなら while() で判断、だろ?
>268 いや、むしろ漏れは 267 の strcmp での対策とやらが知りたい おながい教えて
270 :
デフォルトの名無しさん :2005/04/22(金) 02:45:37
[1] 授業単元:繰り返し処理 for文 [2] 問題文(含コード&リンク): nを与えてn!を計算するプログラムを作成せよ [3] 環境 [3.1] OS:windous [3.2] コンパイラ(バージョン):VisualC++ [3.3] 言語:C++ [4] 期限:無期限 お願いします
int aaa(int i) { int ret = 1; for (; i>1; --i) ret*=i; return ret; }
>>270 #include <iostream>
// 階乗計算関数
template <typename T> T fact(T n)
{
if( n <= 0 ) return 0;
T a = 1;
for( ; n > 0; n-- )
a *= n;
return a;
}
// テスト用main
// コマンドライン引数でnを指定
int main(int argc, char **argv)
{
if( argc < 2 ) return 0;
int n = atoi( argv[1] );
std::cout << fact( n ) << std::endl;
std::cout << fact( (long) n ) << std::endl;
std::cout << fact( (double) n ) << std::endl;
return 0;
}
VCじゃlongもintも同じだ。
コンパイラ泣かせ template<unsigned n> inline unsigned f() { if (n > 1) { return n * f<n ? n - 1 : 1>(); //テンプレート引き数がn-1だとダメなのなんで? } return 1; }
template<unsigned n> inline unsigned f() {return n ? n * f<n ? n - 1 : 1>() : 1;} 書き直したから貼っておこう
[1] 授業単元: C言語プログラミング [2] 問題文 標準入力で指定されたファイルからテキストを入力、 そして標準出力に出力せよ。 *同じ文字が連続して2回入力されたときには1文字消去して出力せよ。 [3] 環境 [3.1] OS: linux [3.2] コンパイラ(バージョン): gcc [3.3] 言語:C [4] 期限:今月中 です。 「同じ文字が連続して2回入力されたときには1文字消去して出力せよ」 というところがなかなか出来ません。よろしくお願いします。
>>278 今月中までなら、もうすこし自分で考えれ。
280 :
デフォルトの名無しさん :2005/04/22(金) 16:31:46
>>263 ありがとうございます。そんな簡単な方法があったんだなんて盲点でした。
>>265 まだ習ってない内容も含んでいますが理解できるようがんばりたいです。
>「同じ文字が連続して2回入力されたときには1文字消去して出力せよ」 3回以上連続している場合はどう解釈すればいい? a.あくまでも2回ごとに1文字消去 つまり3,4回連続なら2文字になる b.最初の1文字だけ表示2文字目以降は消去 つまり3,4回連続でも1文字
[1] 授業単元: わかりません [2] 問題文(含コード&リンク): わかりません [3] 環境 [3.1] OS: わかりません [3.2] コンパイラ(バージョン): わかりません [3.3] 言語:C/C++/どちらでも可 のいずれか わかりません [4] 期限:yyyy年mm月dd日hh:mmまで/無期限 のいずれか わかりません [5] その他の制限: わかりません よろしくお願いします。
>>282 (・3・)アルェー ボクにもわからないYO!
>>284 じゃあそれ以外の未解決分お願いします。
>>274 おーい、factorialは整数のみで定義できる関数だからfloatなどの場合は定義すべきじゃないよ。それは糖だよ。
>>278 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
void output_text (FILE* fin) {
int lc = 0, c = 0;
while ((c = fgetc (fin)) != EOF) if (c != lc) {putchar ((char)c); lc = c;}
}
int main () {
FILE* fin;
char filename[256]; scanf ("%s", filename);
if ((fin = fopen (filename, "r")) == NULL) return EXIT_FAILURE;
else {
output_text (fin);
fclose (fin);
return EXIT_SUCCESS;
}
}
>>287 > #include <stdlib.h>
> #include <string.h>
イラネ
既出問題のまとめサイトってあった方がいいと思う?>ALL
>>290 約42290レスの中からまとめるの?ご苦労様。
質問する奴らはそんなもの見ないけどな。
計算間違えたじゃねえか。
>>291 問題をまとめるとせいぜい1000題以内だと思う。
>>291 その中から問題と解答だけを抽出するならそれほど時間が掛からないと思う。
>>286 それはわかっているけどね。
ただ巨数になりやすいから、結果をdoubleでも出せるようにしたかっただけ。
n = 10.5 とかでも計算しちゃうけど、それはやらないでねw
あと、テンプレート引数にはしかるべき演算子を定義した巨大数クラスも取れるので、いいじゃん。
>>296 誤差で13! != 13.0!になったが。
298 :
297 :2005/04/22(金) 19:52:04
勘違いでした。
templateでHaskellのクラスのようなものってできないかなぁ。例えば、int,long,char,その他の整数型のみを許す型定義みたいな。
SFINAEとかboostのstatic_assertとかでいいんじゃない?
>>300 SFINAEを使えば継承もできるようですね。おおよそHaskellと似たような事もできることが分りました。
ありがとうございます。
機能を完全に再現とはいきませんが。
まとめるのは非常に良いことだが 質問あるたびに誘導ばかりしていると新しいものが生まれないからほどほどに
304 :
278 :2005/04/22(金) 22:16:00
>>281 さん
b.最初の1文字だけ表示2文字目以降は消去 つまり3,4回連続でも1文字
のほうでお願いします。
305 :
278 :2005/04/22(金) 22:19:54
すいません!287さんのレスを見落としていました。 ありがとうございます! 頭が悪いのでパット見分からないのですが、考えてみます!
306 :
デフォルトの名無しさん :2005/04/22(金) 22:37:20
>>290 俺みたいにこのスレをみて実力ためしに問題といてる人間にとっては
勉強になります。ぜひまとめサイト御願いします。m(_ _)m
漏れも疑問に思ったんだが、>276は何故?
>>307 f<0>が実体化された時点で、f<(unsigned)-1>も実体化されるから
#include <iostream> template <int n> struct factorial { enum {value = n * factorial<n-1>::value}; }; template <> struct factorial<0> { enum {value = 1}; }; int main() { std::cout << factorial<6>::value; }
戻り値無しかよ
すてき
>>311 ISO/IEC 14882:1998 3.6.1 Main function -5
... If control reaches the end of main without encountering a return
statement, the effect is that of executing "return 0;"
>>308 さらに f<(unsigned)-2>, f<(unsigned)-3> ...
と実体化されてゆき、コンパイルが破綻するから。
もしくはコンパイルを破綻させないために設定してある
テンプレートの深さの制限を超えるから。
#include<iostream.h> template< unsigned n > unsigned f() { return n * f< n - 1 >(); } template<> unsigned f< 0 >() { return 1; } int main() { std::cout << f< 6 >(); }
316 :
307 :2005/04/23(土) 01:44:50
>>308 THX!
評価の前に実体化しなきゃならんってことかな。
>>316 そういうこと
評価はランタイム、実体化はコンパイルタイム
318 :
307 :2005/04/23(土) 01:46:10
>>314 そっちはgccでコンパイルすると一目瞭然だった。
319 :
デフォルトの名無しさん :2005/04/23(土) 11:12:46
>>314 へー、それは新たに追加されたってこと?
320 :
278 :2005/04/23(土) 13:15:44
>>287 さんのプログラムを実行させてもらいましたが、
入力後何も表示されないのですが、何か足りない部分とかありますか?
>>320 あんたの頭。
それはさておき、入力後すぐにプログラムが終了しているなら入力したファイル名をフルパスにして再挑戦してみよ。
>>319 何が何に追加されたと思って質問しているのかね。
[1] 授業単元: 数値計算プログラミング [2] 問題文(含コード&リンク): 1.正の整数を素数の積に分解する、素因数分解のプログラムを作成。 負の整数を入れると終了するようにする。 2.二次方程式ax^2+bx+cの解を求めるプログラムを作成。(a≠0) [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ(バージョン): gcc [3.3] 言語:C [4] 期限:2005年4月23日23:59 [5] その他の制限: 特にありません。 他の問題は何とかできましたが、この2題がわかりません。 知恵を貸してください。よろしくお願いします。
#include <stdio.h> void print_factors(int n) { int i = 2; while(1) { if(n % i == 0) { printf("%d", i); if((n /= i) <= 1) break; i = 2; printf("*"); } else i++; } printf("\n"); } int main() { int n; while(scanf("%d", &n) > 0 && n > 0) print_factors(n); }
325 :
324 :2005/04/23(土) 17:03:24
訂正 int main() -> int main(void)
326 :
デフォルトの名無しさん :2005/04/23(土) 17:15:40
#include <math.h> #include <errno.h> #include <stdio.h> int main(void) { double a, b, c, det; printf("a:"); scanf("%lf", &a); printf("b:"); scanf("%lf", &b); printf("c:"); scanf("%lf", &c); det = b * b - 4 * a * c; if(det > 0) printf("%f, %f", (- b + sqrt(det)) / (2 * a), (- b - sqrt(det)) / (2 * a)); else printf("%f+%fi, %f-%fi", - b / (2 * a), sqrt(-det) / (2 * a), - b / (2 * a), sqrt(-det) / (2 * a)); if(errno) { fprintf(stderr, "An error ocurred."); return 1; } }
>>324 さん
素早い回答ありがとうございます。
すみません、質問なのですが
while(scanf("%d", &n) > 0 && n > 0)
のscanfの部分をnに変えてしまってはマズイでしょうか?
whileの条件の中にscanfというのは使った事がなくわかりません。
プリント文で値は?と質問した後に、入力させる方式にしたいと思っています。
>>330 少しは自分でやったり考える心は無いのか
>>330 その部分は、
「まずscanfを実行し、エラーがなく、且つnが正の場合に…」と読む。
書き換えたいなら、新しい入力関数
int input(void)
{
int n;
printf("?");
scanf("%d", &n);
return n;
}
を用意して
while((n = input()) > 0) ...
とするか、breakを使って、
while(1)
{
int n;
printf("?");
scanf("%d", &n);
if(n < 0) break;
print_factors(n);
}
とすれば良い。(scanfのエラーチェックは省いた)
>>331 スミマセン、考えても分からなかったもので…。
>>332 丁寧にありがとうございます。
break文を用いた方法でやってみたいと思います。
>>327 もそうですよね?
本当にありがとうございました。
334 :
デフォルトの名無しさん :2005/04/23(土) 23:30:20
すいません、どなたかお願いいたします。 fh=CreateFile(szFn,GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); // ファイルオープン lpBuf=GlobalAlloc(GPTR,GetFileSize(fh,NULL)); // バッファ確保 ReadFile(fh,lpBuf,GetFileSize(fh,NULL),&dummy,NULL); lpInfo=(LPBITMAPINFO)(lpBuf+sizeof(BITMAPFILEHEADER)); offset=*(LPDWORD)(lpBuf+10); // ビットマップまでのオフセット lpBMP=lpBuf+offset; // ビットマップバッファのポインタ CloseHandle(fh); これでビットマップを二つ読み込んで重ねてマスク部分を透過させているのですが 横幅が奇数などになるとうまく透過させることができません。 重ね方は3バイト見ていって0xff 0x00 0xffだったら描画しないとしています。 4の倍数じゃないとうまく表示されないのはわかっているのでがうまくできないのです。 どなたかいいサイト、参考書、やり方などご教授お願いします;;
336 :
デフォルトの名無しさん :2005/04/24(日) 00:30:43
> ――【注意点】――――――――――――――――――――――――― > ・質問は必ず【質問テンプレ】に従ってください。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > ・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > ・計算問題は必ず数式をあげ、どのような計算をするのか詳しく説明してください。 > ・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。 > ・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。 > ・複雑なAAはスレが荒れたり問題が埋もれる原因になりますので使用を控えてください。 > ――――――――――――――――――――――――――――――― 【質問テンプレ】 [1] 授業単元: [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS: [3.2] コンパイラ(バージョン): [3.3] 言語:C/C++/どちらでも可 のいずれか [4] 期限:yyyy年mm月dd日hh:mmまで/無期限 のいずれか [5] その他の制限:
338 :
デフォルトの名無しさん :2005/04/24(日) 12:45:53
こんちは〜、「最強かつ最狂の浮動票集団」ニュー速VIPです。
/ ̄ ̄ ̄ ̄ ̄\ 承知のとおり、5/8(日)はJr板と対戦することになりました。
ノ´ `ヽ 対戦日は、素晴らしい豪脚でν速を叩きのめした競馬板をも超える
ノ /'''ヽヽ ヽ 強力で激しいラシの嵐でJr板を沈める所存であります。
| / ヽヽヽ ヽ そういうわけで、皆さんの変わらぬご愛顧のほどよろしくお願いします。
| / `ヽ| |´ヽ ヽ なお、支援物資(特におっぱい)がありましたら、いつでもうpして下さい。
| | ‐‐―¬ ー―‖
| ⊂ 」 || / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|ノ \ <^> / | < こんなところにいてなんだけど、VIPクオリティってなに?
| ∧ \ _____^_//レ \________________________
レ´| ノ\;;;;;;;;;∀;ヽ
|_ \;JPN;;|ア ●2ちゃんねる全板人気トーナメントinVIP●
. | |\ |;;12;;/||
http://ex10.2ch.net/test/read.cgi/news4vip/1114265328/ ★ 全ての板にVIPクオリティを in ニュー速VIP ★
ご無沙汰しております、「最強かつ最狂の浮動票集団」ニュー速VIPです。
他の組の対戦を見て、いよいよ我々も悠長に構えていられなくなりました。
対戦日は、競馬板が豪脚でν速を差しきってしまったので、
我々は「韋駄天」ことサイレンススズカのような怒涛の逃げでJr板を沈める所存であります。
そういう訳で、皆さんの変わらぬご愛顧のほどよろしくお願いします。
支援物資(特におっぱい)がありましたら、いつでもうpして下さい。
あなたのおっぱいが、ひょっとしたら勝ちぬけの突破口になるかもしれません。
∧_∧ ∧_∧ ┌──────────────
(゙゙ヽ ´∀`)')('(´∀` /゙゙) )) < グローバルVIPクオリティ!!!
(( \ / ヽ / .└──────────────
((⌒) ( ) (⌒))
``ヽ_,) (,__,ノ゙
● 2ch全板人気トーナメント in VIP ●
http://ex10.2ch.net/test/read.cgi/news4vip/1114348627/ ★ 全ての板にVIPクオリティを in ニュー速VIP ★
[1] C言語 [2] BM法のアルゴリズムを説明せよ [4] 4/25 よろしくお願いします
346 :
デフォルトの名無しさん :2005/04/24(日) 22:43:18
[1] 授業単元: ― [2] 問題文(含コード&リンク): 日本経済を立て直せ [3] 環境 [3.1] OS: 代議制 [3.2] コンパイラ(バージョン): ― [3.3] 言語: 日本語 [4] 期限: 早急 [5] その他の制限: 右傾・左傾は不可
>>347 今が日本の実力。
バブルが異常だっただけだ。
349 :
デフォルトの名無しさん :2005/04/25(月) 00:33:52
糞みたいな問題ですみません。 1行3列の行列Aと3行7列のBを掛けて1行3列のCを出力したいんですけど、 C=AB 550 462 480になったんですけど、結果違いますよね。 どこが違うか教えてくれますか? C++です #include <stdio.h> #define L 1 #define M 3 #define N 7
350 :
デフォルトの名無しさん :2005/04/25(月) 00:34:22
int main(void) { int i, j, k; int ma[L][M] = {55,42,30}; int mb[M][N] = {{1,0,1,0,2,3,3},{1,0,0,1,3,2,4},{0,1,1,1,4,3,6}}; int mc[L][M] = {0}; for(i = 0;i < L;i++){ for(j = 0;j < M;j++){ for(k = 0;k < N;k++) mc[i][j] += ma[i][j] * mb[j][k]; } }
351 :
デフォルトの名無しさん :2005/04/25(月) 00:35:00
puts("A="); for (i = 0; i < L; i++){ for (j = 0; j < M; j++) printf("%6d ", ma[i][j]); putchar('\n'); } puts("B="); for (j = 0; j < M; j++){ for (k = 0; k < N; k++) printf("%6d ", mb[j][k]); putchar('\n'); } puts("C=AB"); for (i = 0; i < L; i++){ for (j = 0; j < M; j++) printf("%6d ", mc[i][j]); putchar('\n'); } return(0); }
>>349 1行3列と3行7列をかけたら1行7列じゃねえの?
[1] 授業単元: 秘密 [2] 問題文(含コード&リンク): 40桁の数を素因数分解するプログラムを作成せよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ(バージョン): gcc [3.3] 言語: C [4] 期限: 秘密 [5] その他の制限: 任意の多倍長整数演算ライブラリを使用しても良い。自作もOK。
354 :
デフォルトの名無しさん :2005/04/25(月) 01:58:14
>>356 どうかCのプログラムとして完成させてください。
>>353 随分秘密が多いな。
任意の多倍長整数演算ライブラリを使用していいんだろ?
だったらそれを使えば後はどっかで素因数分解のソースを探せばいいだけじゃん。
359 :
353 :2005/04/25(月) 17:38:20
多倍長整数演算については自分でなんとかしますので、 int型を使った整数演算で数体ふるい法を使った素因数分解のプログラムを教えてくださいませんか?
360 :
353 :2005/04/25(月) 17:39:56
取り合えず、本屋で素因数分解と素数判定という本を買って勉強していますが…
素因数分解のソースも
>>356 に貼っておいたのに・・・・
仕事に使うんだったら、金払って誰か他の人に頼めよ。
>>361 仕事ではありません。
大学の課題です。
そういえば、まとめページの話はどーなったのだらう。 期待しているのだが。
>>363 まとめ中。
忙しいので後回しにしているが、需要があったんだな。
Wikiでいいよね。
ところで、WEBページ用にどの無料鯖を使えばいいだろうか。オススメってある?
366 :
デフォルトの名無しさん :2005/04/25(月) 19:34:32
1] 授業単元: プログラミング技術 [2] 問題文: @フィナボッチ数を20番まで求め、配列に格納し、その後に印字するプログラムを作成せよ。なお、出力は10個ごとに改行せよ。 A40以下入力データを引き数にして、フィナボッチ数を求める部分を関数とするプログラムを作成せよ。 [3] 環境 [3.1] OS: Win Xp [3.2] コンパイラ(バージョン): gcc [3.3] 言語:C [4] 期限:2005年4月28日まで/無期限 [5] その他の制限: 特になし 高校の宿題なのですが自分にはさっぱりで困っています・・ こんなへたれな自分に救いの手をおねがいします・
>>366 #include <stdio.h>
#define K0 0
#define K1 1
void fib(int n, int buf[], int size)
{
int end = n < size ? n : size;
int i = 0;
if( n > 1 ) buf[ i++ ] = K0; else return;
if( n > 2 ) buf[ i++ ] = K1; else return;
for( ; i < end; i++ )
buf[ i ] = buf[ i - 1 ] + buf[ i - 2 ];
}
void print(int buf[], int size)
{
int i;
for( i= 0; i < size; i++ )
printf("%d%c", buf[i], i % 10 == 9 ? '\n' : ' ');
}
#define N 40
int main()
{
int buf[N];
fib( N, buf, N );
print( buf, N );
return 0;
}
368 :
367 :2005/04/25(月) 20:17:12
しまった、出題にちゃんと答えてないや。
369 :
367 :2005/04/25(月) 20:19:08
ん、まてよ。 Aは >> 367 の fib でいいよな。 @はどうだろうな。 >> 367 のNを20にすれば一応望みの出力結果は出るが。
370 :
367 :2005/04/25(月) 20:34:42
そして、訂正 誤 > if( n > 1 ) buf[ i++ ] = K0; else return; > if( n > 2 ) buf[ i++ ] = K1; else return; 正 > if( end > 1 ) buf[ i++ ] = K0; else return; > if( end > 2 ) buf[ i++ ] = K1; else return;
>>365 さんくす&おつされさま。
一応、答える側だったりするんで・・・まとめページのどこそこ参照とかやれるといいなと。
それに、良い問題&良い回答って勉強になる。
Wikiでいいんじゃないかしらん。
Wikiの使えるよさげな無料鯖はわからん。(すまん)
>>366 void fibStep (int* u, int* v) {int tmp; tmp=*u; *u=*v; *v=tmp+*v;}
int* fibAux (int* m, int* u, int* v, int n) {
if (n == 0) {*u = 0; *v = 1; *m=*u; return m+1;}
else {int* tmp; tmp = fibAux (m+1, u, v, n-1); fibStep (u, v); *m = *u; return tmp;}}
int* fib (int* m, int n) {int u, v; return fibAux (m, &u, &v, n);}
int main () {
int a[100], *iter, *endp;
endp = fib (a, 6);
for (iter = a; iter != endp; ++iter) printf ("%d ", *iter);
//for (iter = endp-1; iter != a-1; --iter) printf ("%d ", *iter);
return 0;
}
(●´ー`●)*20
#include <stdio.h> void *for_each(void *begin, void *end, void*(*f)(void*)) { while(begin < end) begin = (*f)(begin); return begin; } void *fib_int(void *n) { int *p = n; *p = *(p-1) + *(p-2); return ++p; } void *print(void *n) { int *p = n; printf("%d ", *p); return ++p; } #define N 40 int main() { int a[N], *it; a[0]=0; a[1]=1; for_each(a+2, a+N, fib_int); for(it=a; it<a+N; it=for_each(it, it+10, print), putchar('\n')); return 0; }
>>373 372のほうが、再起コールでオーバーヘッドあるように見える。
379 :
デフォルトの名無しさん :2005/04/25(月) 22:16:12
380 :
377 :2005/04/25(月) 22:16:46
あー、そういうことか、わかった。 kn-1 と kn-2 のとり方ね。
最適化…
Cに末尾再帰が実装されるのはいつですか
>>353 MathematicaでMathLinkを使うのが早い。
もまいら、つっこみ所はそこぢゃない >フィナボッチ >フィナボッチ の検索結果のうち 日本語のページ 約 672 件中 1 - 20 件目 (0.11 秒) ...orz
>>387 >>367 が見逃した時点で皆スルーやね
>>366 現在、コンパイル出来る環境でないので、通るか分からんが…
#include <stdio.h>
#include <stdlib.h>
#define COUNT 20
#define LIMIT 40
typedef unsigned int Fibonacci;
typedef Fibonacci *FibTable;
void Ans002sub(FibTable Table,size_t Size){Fibonacci i,j;
for(i=j=1,*Table=0;Table++,--Size;j+=i,i=*Table)*Table=j;return;}
FibTable Ans002(size_t Size){FibTable Table=NULL;
if(Size&&Size<=LIMIT&&(Table=malloc(sizeof(*Table)*Size)))
Ans002sub(Table,Size);return Table;}
void Ans001sub(FibTable Table,size_t n){size_t Index;
for(Index=0;Index<n;Index++)
printf("%d%s",Table[Index],(Index%10!=9)?", ":"\n");return;}
void Ans001(){FibTable Table;size_t Count=COUNT;
if((Table=Ans002(Count))){
Ans001sub(Table,Count);free(Table);}else printf("error\n");return;}
int main(){Ans001();return 0;}
@ int n,f[20+1]; f[1]=f[2]=1; for(n=3; n<=20; ++n) f[n]=f[n-2]+f[n-1]; for(n=1; n<=20; ++n) printf(" %4d%s", f[n], (n%10)?"":"\n"); A #define LIMIT 40 unsigned long fib(int n) { static unsigned long f[LIMIT+1]={0}; if(n>LIMIT) return 0; if(n<=2) return f[2]=f[1]=1; return (f[n])?f[n]:(f[n]=fib(n-2)+fib(n-1)); }
>>388 >void Ans002sub(FibTable Table,size_t Size){Fibonacci i,j;
> for(i=j=1,*Table=0;Table++,--Size;j+=i,i=*Table)*Table=j;return;}
何かおかしいような気がして見直してみたら、ミスってた…という訳で
void Ans002sub(FibTable Table,size_t Size){Fibonacci i,j;
for(j=1,*Table=i=0;Table++,--Size;j+=i,i=*Table)*Table=j;return;}
で、多分こうした方が早そうな気も…と言っても殆ど変わらないと思うけど…
void Ans002sub(FibTable Table,size_t Size){Fibonacci i;
for(i=1,*Table=0;Table++,--Size;i+=*(Table-1))*Table=i;return;}
良くあるネタとして #include <stdio.h> #define N01 0 #define N02 1 #define N03 N01 + N02 #define N04 N02 + N03 #define N05 N03 + N04 #define N06 N04 + N05 #define N07 N05 + N06 #define N08 N06 + N07 #define N09 N07 + N08 #define N10 N08 + N09 #define N11 N09 + N10 #define N12 N10 + N11 #define N13 N11 + N12 #define N14 N12 + N13 #define N15 N13 + N14 #define N16 N14 + N15 #define N17 N15 + N16 #define N18 N16 + N17 #define N19 N17 + N18 #define N20 N18 + N19 int main(){ printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",N01, N02,N03,N04,N05,N06,N07,N08,N09,N10,N11,N12,N13,N14,N15,N16,N17,N18,N19,N20); return;}
template< unsigned n > unsigned f() { return f< n - 1 >() + f< n - 2 >(); } template<> unsigned f< 1 >() { return 1; } template<> unsigned f< 2 >() { return 2; } C++ なのが難点
横槍入れるけどごめん。 くだ質に書こうと思ったけど、ココの方が確実な気がしたので質問させて下さい。 C++で多次元配列を引数にする方法って何かありますか? 多次元と言うか、2次でいいんですが。 int *A[] ってポインタ化しないと無理ですかね?
>>393 構造体やクラスのメンバに配列を持てばできる
ただしオーバーヘッドはでかくなると思うぞ
>>393 void foo(const int (&array)[5][8])
{
}
397 :
393 :2005/04/26(火) 10:55:00
>>394 ,395,396
レスさんくすこ。
とりあえずstructで作り始めてみましたが、あんまりよくないかな。
作るだけなら楽な道だと思いますが。一度出来たらいろいろ試してみます。
ありがとうございました。
>>398 決定性アルゴリズムではまず無理だ。
20桁以上だと確率的なアルゴリズムを考えないとダメ。
[1] 授業単元: 離散数学 [2] 問題文(含コード&リンク): 最大公約数を求める関数を作成せよ [3] 環境 [3.1] OS: Vine linux 3.0 [3.2] コンパイラ(バージョン): gcc [3.3] 言語: C [4] 期限: 4/27 [5] その他の制限: 特にありません。
403 :
デフォルトの名無しさん :2005/04/26(火) 21:11:19
>>402 int GCD(int a,int b){
return a?f(b%a,a):b;
}
ユークリッドハァハァ
f()?
きっとfは関数ポインタでGCDが入ってるんだよ!な?な?
>>402 int gcd (int a, int b) {
int g, c, e = 0;
while (a&1 + b&1 == 0) {a = a
>>1 ; b = b
>>1 ; e++;}
while (a&1 == 0) a = a
>>1 ;
while (b&1 == 0) b = b
>>1 ;
while (b != 0 && b != 1) {
c = (a-b); c = c>=0?c:-c;
a = a>=b?b:a;
b = c; while (b&1 == 0) b = b
>>1 ;
}
if (b == 0) g = a * power (2, e);
if (b == 1) g = power (2, e);
return g;
}
408 :
407 :2005/04/26(火) 21:28:28
int power (int a, int b) { int n = 1; while (b) {if (b&1) n = n*a; b = b >> 1; a = a*a;} return n; }
409 :
403 :2005/04/26(火) 21:28:34
ごめwww int GCD(int a,int b){ return a?GCD(b%a,a):b; } (/ω\)ハズカシーィ
40桁くらいならρ法か2次篩法を勧める。
411 :
デフォルトの名無しさん :2005/04/26(火) 22:57:30
>>365 がアルゴリズム集を作ってくれる件について
>>385 末尾再帰自体は昔からCでできますが何か?
413 :
デフォルトの名無しさん :2005/04/26(火) 23:16:41
[1] 授業単元: アルゴリズム論演習 [2] 問題文(含コード&リンク): 1+1/2^2+1/3^2+・・・+1/1000^2 を計算せよ。 [3] 環境 [3.1] OS: LINUX [3.2] コンパイラ(バージョン): gcc [3.3] 言語:C [4] 期限:2005年4月27日 [5] その他の制限: 特になし。 どなたかご教授下さい。
>>413 double f (int n) {
if (n <= 1) return 1.0;
else {return 1.0/((double)(n*n))+f (n-1);}
}
int main () {
printf ("%lf\n", f (1000));
return 0;
}
>>412 Cに末尾再帰最適化が実装されるのはいつですか
416 :
413 :2005/04/26(火) 23:42:42
>>414 ご回答ありがとうございます。
初心的な質問ですが、プログラムの頭に
#include <stdio.h>
は必要ないのですか?
>>416 必要だと思えばつけよ。
ここの回答が、常に完全な形で与えられると思うな。
%lfは間違い。
420 :
デフォルトの名無しさん :2005/04/27(水) 00:06:06
419 晒し age
#include<stdio.h>
double f1(int);
double f2(int);
int main(int argc,char **argv){
double a=f1(1000),b=f2(1000);
printf("%.16f\n%.16f\n%.16e\n",a,b,a-b);
return 0;
}
double f1(int n){/* 大きい方から足す */
double sum=0;
int i;
for(i=1;i<n+1;i++)
sum=sum+1.0/((double)i*(double)i);
return sum;
}
double f2(int n){/* 小さい方から足す */
double sum=0;
int i;
for(i=n;i>0;i--)
sum=sum+1.0/((double)i*(double)i);
return sum;
}
ふと気になって書いてみたけど1.5e-15程度の誤差しか出なかった。
>>413 の出題者がこれをねらいにしてるわけじゃなさそうだから
他ので大丈夫だとは思うが
> sum=sum+1.0/((double)i*(double)i); sum=sum+1.0/((double)i*i); でいいべ
[1] 授業単元: 情報工学実験2 [2] 問題文(含コード&リンク): ポインタを使い動的に配列を確保する方法を利用して、 プログラム実行時に頂点数を柔軟に指定できるようにプログラムを改良せよ。 ヒント n*n個の値を格納するためには、int graph[n*n]として宣言された配列があれがよい 無向グラフであればn*nの配列の約半分は不要である。 ループした辺を認めないのであれば、対角成分は常に偽となる。 [3] 環境 [3.1] OS: WINXP [3.2] コンパイラ(バージョン):Borland C++ Compiler 5.5.1 [3.3] 言語:Cでお願いします。 [4] 期限:4月27日17時
424 :
423 :2005/04/27(水) 01:38:20
プログラム #include <stdio.h> #include <stdlib.h> #define NMAX 10 #define FALSE 0 #define TRUE 1 void inputgraph(int *n1, int graph[NMAX+1][NMAX+1]) { int i, j, n,k; puts ("input the number of vertices:"); if (scanf("%d%*[^\n]", &n) != 1 || n > NMAX) { n = 0; *n1 = n; return; } *n1 = n; for(i = 1; i <= n; i++) for (j = 1; j <= n; j++) graph[i][j] = FALSE; puts("input the numbers of two vertices connected by a side:"); while (scanf("%d%d%d%*[^\n]", &i, &j, &k) == 3) { graph[i][j] = k; graph[j][i] = k; } }
425 :
423 :2005/04/27(水) 01:39:01
/* print the graph data */ void print_graphdata(int n, int graph[NMAX+1][NMAX+1]) { int i, j; puts("graph data: graph(i,j)=F/T"); for (i = 1; i <= n; i++) { printf("%3d",i); for (j = 1; j <= i; j++) { if (graph[i][j]) fputs(" T",stdout); else fputs(" F",stdout); } puts(""); } fputs(" ",stdout); for (i = 1; i <= n; i++) printf("%3d",i); puts(""); }
426 :
423 :2005/04/27(水) 01:40:46
/* main program */ int main() { int graph[NMAX + 1][NMAX + 1]; /* graph[i][j] = 1 if the vertices i, j are connected and graph[i][j] = 0 otherwise */ int n; /* number of vertices */ inputgraph(&n, graph); /* input "n" and "graph[i][j]" */ /* printf("n = %d\n", n);*/ print_graphdata(n, graph); return EXIT_SUCCESS; } 長文失礼しました。 よろしくお願いします。
427 :
デフォルトの名無しさん :2005/04/27(水) 02:52:26
[1] C言語 [2] N*Nの魔法陣を作成せよ。(ただし、Nは奇数とする [3] 環境 [3.1] Unix [3.2] gcc [3.3] C [4] 期限:できるだけ早く 2次元配列に斜めに代入していき、配列がblankならその下の配列に移動して、、、というやり方 らしいのですが、さっぱりです。ソースを書いていただけるとうれしいです。
#include<stdio.h> #define N 3 int main(int argc,char **argv){ int a[N][N],b=N/2,c=N/2+1,d=1,i,j; for(i=0;i<N;i++){ for(j=0;j<N;j++){ a[b++][c++]=d++; b%=N;c%=N; } c=(c+1)%N;b=(b+N-1)%N; } for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("%3d ",a[j][i]); printf("\n"); } return 0; }
429 :
427 :2005/04/27(水) 03:27:37
>> 428 激しく、超感謝です。まじで、本当にありがとうございました。
>>423 何をしたいのか意味が分からんので
ヒントは無視して、ソースから適当に判断したから
検討違いだったらスマソ
あと、コンパイル&実行してないからミスってるかも知れんので
エラーが出たら自分で直してね
#include <stdio.h>
#include <stdlib.h>
#define NMAX 10
int *inputgraph(){
int i,j,k,n,*p=NULL;
puts("input the number of vertices:");
if((scanf("%d%*[^\n]",&n)==1)&&n<=NMAX){
if((p=calloc(n*n+1,sizeof(*p)))){
*p=n;
puts("input the numbers of two vertices connected by a side:");
while(scanf("%d%d%d%*[^\n]",&i,&j,&k)==3)
if(--i<NMAX&&--j<NMAX)p[i*n+j+1]=k,p[j*n+i+1]=k;}}
return p;}
void print_graphdata(int *p){ int i,j,n; n=*p; puts("graph data: graph(i,j)=F/T"); for(i=0;i<n;i++){ printf("%3d",i+1); for(j=0;j<i;j++)fputs(p[i*n+j+1]?" T":" F",stdout); puts("");} fputs(" ",stdout); for(i=0;i<n;i++)printf("%3d",i+1); puts(""); return;} int main(){ int n,*p; n=-1; if((p=inputgraph()))print_graphdata(p); if(p){ n=EXIT_SUCCESS; free(p);} return n ; }
433 :
423 :2005/04/27(水) 05:44:23
>>430 >>432 ありがとうございます。
自分的にはmallocとsizeofをつかって頂点を制限なく取れるように
しようとしていたのですがどれくらいの領域を確保すればよいかよく分からなくて困ってました。
やっぱり素直にNMAXを増やしたほうがよかったんですね。
ありがとうございました。
434 :
デフォルトの名無しさん :2005/04/27(水) 11:05:21
[1] 授業単元: プログラミング2 [2] 問題文(含コード&リンク): ポインタ 構造体 (1) 配列を用いず、ポインタのみを用いて、入力した文字列の並びを反転し大文字と小文字を入れ替える関数を作成してください. ただし、この関数の外(つまり、外部やmainで文字列を格納するとき)では、配列を用いてもかまいません. (例)abc12CDE と入力すると、edc21CBA と出力する. (2) さらに、構造体を用いて、入力したそれぞれの文字の頻度を出力する関数を作成してください. (例)abc12CDE と入力すると、 a = 1 b = 1 c = 2 1 = 1 2 = 1 d = 1 e = 1 と出力する. [3] 環境 [3.1] OS: Linux [3.2] コンパイラ(バージョン): gcc [3.3] 言語: C [4] 期限: 4月28日 [5] その他の制限: なし よろしくお願いします。
436 :
デフォルトの名無しさん :2005/04/27(水) 11:35:58
(1) void string_reverse(const char *src , char *buf){ const size_t length = strlen(src); buf += length; *buf = '\0'; while(*src != '\0') { buf--; if(*src >= 'a') *buf = toupper(*src); else *buf = tolower(*src); src++; } }
更新するの忘れたorz
>>434 void swap (char* a, char* b) {char tmp = *a; *a = *b; *b = tmp;}
char* reverse (char* str) {
char *p, *ep; p = ep = str; while (*ep++); ep -= 2;
while (p < ep) {swap (p, ep); p++; ep--;}
return str;
}
int main () {
char str[] = "abcdef";
printf ("%s\n", reverse (str));
return 0;
}
>>437 EBCDIC の呪いにかかって死んでしまえ
>>434 #include <stdio.h>
typedef struct Cell_tag {
char val_char;
int val_int;
struct Cell_tag* next;
} Cell;
Cell* new_cell (char val_char, int val_int, Cell* cell) {
Cell* cp = (Cell*) malloc (sizeof (Cell));
if (cp == NULL) return NULL;
cp->val_char = val_char; cp->val_int = val_int; cp->next = cell;
return cp;
}
void free_cell_all (Cell* cell) {
if (cell != NULL) {
Cell* next = cell->next;
free (cell);
free_cell_all (next);
}
}
>>434 Cell* push_list (char val_char, int val_int, Cell** place) {
Cell* cp = new_cell (val_char, val_int, *place); *place = cp; return cp;}
Cell* append (char val_char, Cell** cell) {
if (*cell == NULL) return push_list (val_char, 1, cell);
else if ((*cell)->val_char == val_char) {(*cell)->val_int++; return *cell;}
else return append (val_char, &((*cell)->next));
}
void print_list (Cell* cell) {
if (cell == NULL) return;
else {printf ("%c = %d ", cell->val_char, cell->val_int); print_list (cell->next);}
}
void print_freq (char* str) {
Cell* cell = NULL;
while (*str) {append (*str, &cell); str++;}
print_list (cell);
free_cell_all (cell);
}
int main () {
print_freq ("abbcccdddd");
return 0;
}
>>440 ASCIIコード表見て書きました
すみません…
>>443 素直に islower() 使えばいいのに
だな、
446 :
443 :2005/04/27(水) 17:07:34
ってto系ってASCII以外で動かないか…
>>444 islowerってあったんですね
勉強になりました
ASCII以外でも動きますね ごめんなさい
>>427 #include <stdio.h>
#include <stdlib.h>
int mod (int a, int b) {int t = a % b; return t < 0 ? b+t : t;}
int** magic_square (int** square, int n, int x, int y, int m) {
if (!square[y][x]) {
square[y][x] = m;
return magic_square (square, n, mod (x-1, n), mod (y+1, n), m+1);
} else {
int ty = mod (y-2, n), tx = mod (x+1, n);
if (!square[ty][tx]) return magic_square (square, n, tx, ty, m);
else return square;
}
}
int** alloc_matrix (int n) {
int **matrix, i;
matrix = (int**) malloc (n * sizeof (int*));
for (i = 0; i < n; ++i) matrix[i] = (int*) malloc (n * sizeof (int));
return matrix;
}
int** init_matrix (int** matrix, int n) {
int i, j;
for (i = 0; i < n; ++i)for (j = 0; j < n; ++j) matrix[i][j] = 0;
return matrix;
}
void print_matrix (int** matrix, int n) { int i, j; for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) printf ("%3d", matrix[i][j]); printf ("\n"); } fflush (stdout); } int main () { int n=3; print_matrix (magic_square (init_matrix (alloc_matrix (n), n), n, n/2, n-1, 1), n); return 0; }
450 :
デフォルトの名無しさん :2005/04/27(水) 21:35:38
初期状態を□として、○×を交互に表示していきたい。 プロの皆さん。初心者に一分で教えてください。 # ./a.out どこに×を置きますか?:2 2 □□□ □×□ □□□・ どこに○を置きますか?:3 1 □□□ □×□ ○□□
451 :
デフォルトの名無しさん :2005/04/27(水) 21:37:48
続きです。 これの、空いてるところをうめてください。 #include <stdio.h> int main(void) { int i, j, n,m,k=0; int map[4][4]={0,0,0,0,0,0,0,0,0}; int mark=1;//初期状態は× char* str="×";//初期状態は×から開始 while(k<9){ printf("どこに%sを置きますか?:",str); scanf("%d %d", &n,&m);
453 :
デフォルトの名無しさん :2005/04/27(水) 21:38:11
後半 //指定された位置の○×情報を代入 //表示の部分 for (i = 1; i <= 3; i++) { for (j = 1; j <= 3; j++){ } } putchar('\n'); } k++; //以下は,○と×を入れ替える処理 if(mark==1){ mark=2; str="○"; }else{ mark=1; str="×"; } } return (0); }
455 :
デフォルトの名無しさん :2005/04/27(水) 21:43:07
[1] 授業単元: アルゴリズムとデータ構造 [2] 問題文(含コード&リンク): 上に貼り付けちゃいました。 [3] 環境 [3.1] OS: LINUX [3.2] コンパイラ(バージョン): gcc [3.3] 言語:C [4] 期限:2005年4月28日 [5] その他の制限: なし お願いします。
>>415 gccとかなら古くから実装されてるが。
多分O2以上の最適化オプションで末尾再帰最適化もする。
>>456 それじゃ再帰を使った方がきれいで速いコードが書けちゃうんですか?!
まだ学校でも再帰って習ってないです
>>457 常にそうとは限らない。
ループを使った方が良い場合も多い。
>>459 ありがとうございます!
・・・が、451と453にうめてほしかったんです。
461 :
デフォルトの名無しさん :2005/04/27(水) 22:47:53
[1] 授業単元: プログラミング技術 [2] 問題文(含コード&リンク): アメリカ本土への国際ダイヤル通話料金システムは次のようになっている。 @昼間料金(月曜日〜金曜日の午前7時から午後7時まで) 最初の1分まで 300円 1分経過後 6秒ごと 15円 A夜間・休日割引料金(月曜日〜金曜日の午後7時から午後11時まで、および休日(土日祝日、正月三が日)の午前8時から午後11時まで) 最初の1分まで 240円 1分経過後6秒ごと 12円 B深夜料金割引(日曜日〜土曜日の午後11時から翌朝の午後8時まで) 最初の1分まで 180円 1分経過6秒ごと 9円 通話料金と料金システムの区分番号を入力して、それに該当する通話料金を計算して。出力するプログラムを作りなさい。 [3] 環境 [3.1] OS: WINDOWS XP [3.2] コンパイラ(バージョン): gcc [3.3] 言語:C [4] 期限:2005年4月28日 [5]明日までなんでかなりあせってます・・ こんなヘタレに教えてください!お願いします!
> 通話料金と料金システムの区分番号を入力して、それに該当する通話料金を計算して。出力するプログラムを作りなさい。 入力された通話料金をそのまま出力すればいいのか?
通話時間と料金システムじゃないのか しかしそれだと簡単杉か…
いいじゃないか簡単なほうが
普通に出題するなら入力は通話開始時刻と通話時間だと思うが
深夜料金時間帯と昼間料金時間帯がかぶってる
467 :
ゆう :2005/04/27(水) 23:22:25
[1] 授業単元:数値シミュレーション 高速フーリエ変換 [2] 問題文(含コード&リンク):50Hzの正弦波に一様乱数を重ねた信号のフーリエ変換をするプログラムを作る。 [3] 環境 [3.1] OS:UNIX [3.2] コンパイラ(バージョン):? [3.3] 言語:C [4] 期限:2005年05月11日 [5] その他の制限:問題の意味がチンプンカンプンです。 高速フーリエ変換と一様乱数発生のプログラムはわかります。
468 :
デフォルトの名無しさん :2005/04/27(水) 23:29:10
>>467 double pi = 3.14159;
double f = 50;
double rate = /* サンプリングレートがワカラン */;
1)50Hzのデータを用意する。(a[t] = sin(2 * pi * t / f / rate);
2)それに乱数を加える(a[t] = rand() - 0.5 );
3)フーリエ変換
4)出力。
50ヘルツのところだけ突出し、のこりは一様乱数の影響で各周波数がほぼ一定の値になると思うよ。
472 :
461 :2005/04/28(木) 00:11:07
474 :
メモリダイヤル名無しさん :2005/04/28(木) 02:09:10
1] 授業単元:ソートアルゴリズム [2] 問題文(含コード&リンク):電話帳の作成 @電話帳の作成、編集が可能であり、その結果をファイルに保存、読み出しができる事。 また、データの検索、およびソートが可能である事。 メモリダイヤルは1件ごとに追加、編集、削除が行える事。 全件表示の時に名前、電話番号による昇順、降順ソートが可能な事。 メモリダイヤルの登録件数は最大1000件。 許容する文字は 電話番号が'0'〜'9','*','#','-','P'で32桁まで 名前がひらがな英数(シフトJIS)でASCIIで32桁まで Aソート条件 名前は、英字、数字、ひらがなの順番に並び替える事。 電話番号は'P'および'-'を無視した結果を '*'<'#'<'0'......'9'の順番で並び替える事。 名前、電話番号とも昇順、降順でのソートが可能な事。 [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ(バージョン):Visual C++ 6.0 [3.3] 言語:C言語 [4] 期限:2005年5月2日まで [5] その他の制限:
475 :
474の続きです :2005/04/28(木) 02:14:59
476 :
475の続きです :2005/04/28(木) 02:17:22
電話帳の編集時に、 許容外の文字が入力されたらエラーで返したいです。 つーか、これ課題にしてはむずかしすぎないですか??
>474 もまえの説明がまずいのでよくわかんないな 問題文はオリジナルか? "メモリダイヤル"ってなんだ? 配列でいうところのインデックスか? とりあえず struct Data が最大1000件、ってことでいいのか?
478 :
メモリダイヤル名無しさん :
2005/04/28(木) 10:14:58 >477 説明悪くてすいません。 メモリダイヤルは電話帳です。 配列でいうインデックスです。 struct Dataが最大1000件です。 この電話帳に最大で1000件登録できるという事です。 よろしくお願いします。