- 1 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:34:33 ]
- C言語の入門者向け解説スレです。
・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 19 pc11.2ch.net/test/read.cgi/tech/1190342593/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 97代目 pc11.2ch.net/test/read.cgi/tech/1191937213/
- 495 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 19:56:48 ]
- 問題点を聞かれてるのに、俺プログラムを自慢されても困る
- 496 名前:492 [2007/10/28(日) 20:05:56 ]
- >>493-494
ありがとうございました。||の使い方をかんちがいしていました。。。
- 497 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 20:33:46 ]
- >>491
なんか無駄が多い気がするが、まあそれは眼をつむっておこう だがgetsの入力先配列が要素数2てのは……誤入力もあるだろうし、せめて256くらい確保した方が良い気がする というか、要素数2だとヌル文字入らないじゃん(というか100も入らないし) atoiってヌル文字入らないと変な動作になることあるはず
- 498 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:06:24 ]
- >>497
むむ、 getsでの取得は 例えば入力が50なら、charだから配列[0]に50 で配列[1]に\0が入る=2個で足りるってことじゃないですか? もしgetsでの取得変数がintの場合なら点数最大100(つまり3桁)は最低でも[4]になるのはわかります。 まぁでも、教えてもらっている人にも、配列は無駄でもいいから多く取った方がいいと教わりましたので、多くとる事を、この先心がけていきます! ありがとうございました!
- 499 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 21:21:49 ]
- ごめんなさいボクが馬鹿でした。
ためしにcharでの変数aに入力したものを、出力させるのかいてみて a[0]をやったら、最初の1文字しか出力されませんでした。 本当にありがとうございました。
- 500 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 22:56:33 ]
- int *foo
int* foo の違いを教えてください>< 今までint *foo しか使ってなくて いきなりint* fooが出てきてわけわかりません><
- 501 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 22:57:42 ]
- >>500
次は int * foo だ
- 502 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:00:18 ]
- 宣言時のアヌスの位置くらい自由にさせてあげてください
- 503 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:03:21 ]
- いまだにforの無限ループを見ると悲しくなる( ; ; )
- 504 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:04:11 ]
- >>501
そんなのもあるのですか ソース解読してる途中にこんなの出てきてわけわからんのです すいませn助けてください。ほんと 何でグぐれ場いいのかもわからなくて すんません、マジで
- 505 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:07:39 ]
- >>504
int *foo; int* foo; int * foo; は全部一緒
- 506 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:09:54 ]
- ありがとうございます
なんでこんな風に書き方分けてるのか
- 507 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:14:35 ]
- *は型名にも変数名にも使えないから問題ない
- 508 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:35:53 ]
- 初歩的な質問なのですが
for(int i = size >> 1 ; ; i >>= 1) というループがあったのですが size >> 1 や i >>= 1 というのはどういう意味なのですか?
- 509 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:37:41 ]
- int*foo;もいけるんじゃない?
- 510 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:40:19 ]
- >>508
ビットシフト
- 511 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:44:55 ]
- >>508のだとiをビットシフトするとどうなるんでしょう
あとforの2つ目のところが空白なのもわけがわかりません
- 512 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:46:35 ]
- i >>= 1 すると i の各ビットが右へ 1 桁ずつずれる
forの2つめが空白の場合は条件なしの繰り返し=無限ループ
- 513 名前:デフォルトの名無しさん mailto:sage [2007/10/28(日) 23:53:43 ]
- >>511
iが10(2進数で1010)だとすると5(101)になる 5だとすると2(10)になる。その次はもう予想できるよな?
- 514 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 00:07:56 ]
- >>512-513
ありがとうお兄ちゃんたち!
- 515 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:18:22 ]
- >>506
俺は int* foo; のほうが好きかな 「int型へのポインタを返す」ってのをあらわしてる感じで
- 516 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:35:28 ]
- 俺は
int *foo; のほうが好きかな int *foo, *bar; みたいに複数いっぺんに宣言するときわかりやすいし
- 517 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:35:53 ]
- しかしそれだと、2個目以下に*付け忘れる可能性がある。
- 518 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 01:37:09 ]
- 517は>>515ね
- 519 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 02:21:33 ]
- 大きな配列の初期化って
どうしていくべきですか? 100X100くらいの配列の
- 520 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 02:23:34 ]
- あんな風にしていくべきだと俺は思っている
だがそういう風にするとああいうことも起きるわけでいちがいに どちらがいいとは判断しかねるな
- 521 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 06:11:01 ]
- ど素人におすすめの参考書を教えてください。
- 522 名前:380 [2007/10/29(月) 11:19:52 ]
- 先週質問させていただいた者ですが、mallocでどうしても組めません。
mallocでメモリに格納→格納した文字列を検索後抜き出す動作をもう一度ご教示いただけないでしょうか。
- 523 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 12:46:28 ]
- >>522
先ずは試しにfgets()版を見せてくれ。
- 524 名前:380 [2007/10/29(月) 13:16:03 ]
- >>523
void Hairetsu(void) { FILE *read; char fnameread[90]; char charline[90]; char KensakuName[20]; strcpy(fnameread, "*****.txt"); strcpy(KensakuName, "C3 10237"); StartTime = clock(); printf("%d\n", StartTime); while(KensakuCount < 10) { read = fopen(fnameread, "r"); if (read == NULL) { printf("ファイルがオープンできません\n"); exit(1); } while(1) { fgets(charline, 90, read); if (strcmp(charline, "ENDDATA\n") == 0){ ***ファイルは必ず最後の行にENDDATAと記載されています break; } if (strncmp(charline, KensakuName, 16) == 0) { ***ここで検索に引っかかった行から新たな要素を取り出して再度同ファイル内で検索をかけます ***その際にまた先頭行から読み直してfgetsを用いて検索をしこれをこのif内で3回程度繰り返えします。 } } fclose(read); } }
- 525 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 13:31:08 ]
- >>524=380
「えらい時間」とあるけど、どれくらい掛かるの? 試しに>524相当のロジックを書いて10万と1行のファイルで動かしてみたが、1秒も掛からないんだが。
- 526 名前:380 [2007/10/29(月) 13:37:22 ]
- >>525
これを1行目から順に繰り返すので総読み出し回数は10万行^5になります。 それで更にその中に計算式が組み込まれていますので・・・・
- 527 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 13:45:24 ]
- >これを1行目から順に繰り返すので総読み出し回数は10万行^5になります。
>524からこれは読み取れないわけだがw つーか、それはそもそもアルゴリズムに問題がないか? オンメモリでもそれだけアクセスすればそれなりに遅いと思うぞ。
- 528 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 13:49:43 ]
- どうでもいいが、10万行^5は10^25だな。
仮に1nsで処理できる凄まじいコンピュータがあったとして、ざっと3億年掛かる計算だが。
- 529 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 14:58:18 ]
- ポインタ配列のキューに文字列を挿入するプログラムを作っているのですがうまくいかないです。
挿入後に現在入っているキューを全部表示するようにしたいのですが、最後に挿入した文字列しか表示されないです。 ちなみに変数opをint型に変えると期待通りに出力されます(intのscanfだと数値以外の文字も0と認識してしまうので使えない)が、 char型だとなぜこうなってしまうのでしょう? 実行結果(変数opがchar) Operation(0:enqueue 2:quit)0 input string : a String Queue : [a] head[0] tail[1] Operation(0:enqueue 2:quit)0 input string : b String Queue : [b] head[0] tail[1] Operation(0:enqueue 2:quit) 実行結果(変数opがint) Operation(0:enqueue 2:quit)0 input string : ab String Queue : [ab] head[0] tail[1] Operation(0:enqueue 2:quit)0 input string : bc String Queue : [ab] [bc] head[0] tail[2] Operation(0:enqueue 2:quit) 次レス以降にソースを書きます
- 530 名前:1/2 mailto:sage [2007/10/29(月) 14:58:49 ]
- #include "stdio.h"
#include "stdlib.h" #include "string.h" struct structQ { char Q[5];}; int next (int x){ if(x==4) return 0; else return x+1; } void enqueue(char *s, int head, int *tail, structQ *AllQ){ if(next(*tail)==head) printf("OVERFLOW!\n"); else { strcpy(AllQ[*tail].Q, s); *tail = next(*tail); } } void printQueue(int head, int tail, structQ *AllQ){ int h; printf("String Queue : "); for(h=head; h!=tail; h =next(h)) printf("[%s] ", AllQ[h].Q); printf("\n"); }
- 531 名前:2/2 [2007/10/29(月) 14:59:25 ]
- int main (void){
structQ *AllQ; AllQ = (structQ *)malloc( sizeof(structQ)*(5) ); int head =0, tail =0; char *s, str[100]; char op; // int op; while(1){ printf("Operation(0:enqueue 2:quit)"); scanf("%s", &op); if(op == '0') // scanf("%d", &op); // if(op == 0) { printf("input string : "); scanf("%s", str); s = (char *)malloc( sizeof(char)*(strlen(str)+1) ); strcpy(s,str); enqueue(s, head, &tail, AllQ); free(s); printQueue(head, tail, AllQ); } else if(op == '2') // else if(op == 2) break;//終了 else printf("invalid ope number!\n"); printf("head[%d] tail[%d]\n", head, tail); } free(AllQ); return 0; }
- 532 名前:デフォルトの名無しさん [2007/10/29(月) 15:05:00 ]
- >>529
STL使っておけ vector< string > x; x.push_back("文字列"); x.push_back("名無しです"); x[0],x[1]で文字列にアクセスできる
- 533 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:09:27 ]
- >scanf("%s", &op);
文字列を入力したいんなら、char じゃだめだろ char には 1 文字しか入らない char の配列にしないと
- 534 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:11:49 ]
- >>532
突っ込みどころだらけ。 >#include "stdio.h" cの規格にあるインクルードファイルは""で括ってはいけません。 また、一般的にプロジェクトローカルなもの以外は<>で括るべきです。 >ちなみに変数opをint型に変えると期待通りに出力されます(intのscanfだと数値以外の文字も0と認識してしまうので使えない)が、 %d指定で整数値を入力する場合、入力に失敗した場合は変数が更新されないので、「0と認識してしまう」というのは間違い。 >scanf("%s", &op); 文字型への%s指定は行なってはいけません。%sはあくまでも、文字列入力です。 この呼び出しで恐らくスタック領域の破壊が起こり、他の変数の値がおかしくなったせいでキュー登録に失敗した可能性があります。
- 535 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:12:45 ]
- >>532
cにはSTLなどありません。スレタイも読めないくらい頭が回らないのであれば、無理に回答しなくて宜しいかと。
- 536 名前:デフォルトの名無しさん [2007/10/29(月) 15:26:38 ]
- >>533
opはオペレーションNoの取得なので、1文字です。 指定文字列の取得はchar str[100]に入れています。 >scanf("%s", str); >>535 1文字入力の%cで >scanf("%c", &op); と変えてみました。 キューには格納されているようですが、変な出力結果になってしまいます。 実行結果 Operation(0:enqueue 2:quit)0 input string : ab String Queue : [ab] head[0] tail[1] Operation(0:enqueue 2:quit)invalid ope number! head[0] tail[1] Operation(0:enqueue 2:quit)0 input string : bc String Queue : [ab] [bc] head[0] tail[2] Operation(0:enqueue 2:quit)invalid ope number! head[0] tail[2] Operation(0:enqueue 2:quit)
- 537 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:30:17 ]
- >>536
"%c"を" %c"にして味噌。
- 538 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:32:33 ]
- >>537
できました! ありがとうございます。 %cのスキャンにはスペースが必要なんですね。 実行結果 Operation(0:enqueue 2:quit)0 input string : ab String Queue : [ab] head[0] tail[1] Operation(0:enqueue 2:quit)0 input string : bc String Queue : [ab] [bc] head[0] tail[2] Operation(0:enqueue 2:quit)
- 539 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:35:11 ]
- >>524
ファイルのデータをすべてmallocで確保したヒープ領域に読み込む。 1.fstat関数でファイルサイズを取得する。 2.そのファイルサイズ分をmallocし、そこにファイルの全レコードを読み込む。 レコードサイズ64バイトで10万レコードだと、6.4Mバイトほど。 3.検索はmallocで確保したバッファの中を検索する。
- 540 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:36:30 ]
- >>538
いや、今回はたまたまその前の%sの喰い残しの改行文字を破棄する必要があるので、空白を入れることで回避したと言うだけ。 毎回空白が必要だと言うわけではない。 scanf()の振る舞いについて、下手な入門書に頼らずきちんと確認しておくことをお勧めしておきます。 因みに、printf()とscanf()の指定子を互換性があるかのごとく並列で解説しているような入門書が多く出回っていますが、 互換性はないものと思って理解しておく方が間違いがありません。
- 541 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 15:42:20 ]
- >>540
scanfについて調べたら、改行の読み捨てが必要な場合があるみたいですね。 勉強になりました、ありがとうございます。
- 542 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 18:05:25 ]
- 2ちゃんのトリップ生成法なんですがC言語板をしりたいです
$tripkey = "#istrip"; $tripkey = substr($tripkey,1,); $salt = substr($tripkey.'H.',1,2); $salt =~ s/[^\.-z]/\./go; $salt =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/; $trip = crypt($tripkey,$salt); $trip = substr($trip,-10); $trip = '◆'.$trip; print "$trip";
- 543 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 19:59:39 ]
- 丸投げはスレ違い
- 544 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 20:36:42 ]
- printf系の関数使わないで、浮動小数点数を文字列に変換するにはどうしたらいいでしょうか?
- 545 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 20:47:48 ]
- インクルードひとつも使わないやつ書いてやるぜ
- 546 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 20:51:06 ]
- 面倒になったので一部日本語で説明する
double x;; char top[100] down[100],t,d; 小数点の一から始めて、下向きに数字を読み取ってdownにいれて 一より大きいなら上向きにtopに入れていく 最後に出力
- 547 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 21:53:10 ]
- >>544 行数の関係上汚いコードで申し訳ない。
単なる思いつきで書いたから、特に色々とは突っ込まないで欲しい。 あと、こっちの環境ではまともに動いてくれない。 小数点の精度上、 下位ビットにゴミがあってそれを取り込んでしまう。 まぁ、その辺はなんとかしてくれい。 void DoubleToStr(double f) { char up[256], down[256],temp; int d = f, i = 0, j = 0; double z = f; do { up[i++] = d % 10 + '0'; d = d / 10; } while (d != 0); up[i++] = '.'; up[i] = '\0'; i-=2; while (j < i) { temp = up[j]; up[j] = up[i]; up[i] = temp; ++j; --i; } z = f; d = f; z = z - d; i = 0; do { z = z * 10; d = z; down[i++] = d + '0'; z = z - (double)d; } while (z != 0.0); down[i] = '\0'; strcat(up, down); printf("%s\n", up); }
- 548 名前:プリンがー mailto:aaa [2007/10/29(月) 22:16:02 ]
- 100個の実数データを配列a[100]に読んで、その最大値をmaxという
変数に求め、結果を出力するプログラムを書きなさい。 #include <stdio.h> int main (void) { int i; double a[100],max=0; for(i=0;i<=100;i++){ scanf("%lf",&x[i]); if(x[i]>max){ max=x[i]; } } printf("最大値は%fです。",max); return(0) ; } これであってますか?
- 549 名前:aho mailto:sage [2007/10/29(月) 22:17:53 ]
- >>548
あってるよ〜
- 550 名前:プリンがー mailto:aaa [2007/10/29(月) 22:22:29 ]
- >>549
ありがとうございます。
- 551 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 22:22:40 ]
- あってねぇーよ
double a[100]で100個用意したのはいいが for(i=0;i<=100;i++){ の行で101個目にアクセスしてるだろ。 for(i=0;i<100;i++){ が正解
- 552 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 22:24:32 ]
- 実験データは正数だけかな?
配列に入れる必要性がわからんけど後でプログラムを拡張するのかな
- 553 名前:aho mailto:sage [2007/10/29(月) 22:25:39 ]
- >>550
ばれたか。 やるな、おぬし!
- 554 名前:プリンがー mailto:aaa [2007/10/29(月) 23:00:39 ]
- 1から1000までの数値の中で、2または3の倍数でかつ4の倍数でないものを
出力するプログラムを書きなさい。 #include <stdio.h> int main (void) { int i; for(i=1;i<=1000;i++){ if(i%2=0||i%3=0){ if(i%4!=0){ putchar('\n'); } } } return(0); } これであってますか?
- 555 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:02:21 ]
- memcpy(input,output,size<<1);
//array copy for(i=0; i < (size<<1); i++) output[i] = input[i]; すみません、この二つの違いを教えてください。 初めに下のほうで計算していたら望む結果が出てこなくて 上のとおりやったら出来ました… 同じことをやっていると思ったのですが、どう違うのでしょうか
- 556 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:03:12 ]
- if ((i % 2 == 0 || i % 3 == 0) && (i % 4 != 0))
- 557 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:04:33 ]
- >>554
回したら、ものすごい数の改行が出た。
- 558 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:07:51 ]
- >>555
outputとinputの型によって差がでるんじゃないかな
- 559 名前:プリンがー mailto:aaa [2007/10/29(月) 23:08:15 ]
- >>554
訂正 #include <stdio.h> int main (void) { int i; for(i=1;i<=1000;i++){ if((i%2==0||i%3==0)&&(i%4!=0)){ putchar('\n') } } return(0); } これでいいでしょうか??
- 560 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:09:29 ]
- ×putchar('\n');
○printf("%d ", i);
- 561 名前:プリンがー mailto:aaa [2007/10/29(月) 23:12:32 ]
- >>560
ありがとうございます。
- 562 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:13:39 ]
- あってませんよ
- 563 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:15:45 ]
- >>558
どちらもint型のポインタ(1次元配列)なのですが。 単に求めた結果が出ればいいだけなら、これでいいのですが 初めのソースが合ってると信じて、違う原因がわからないのは自分でも納得がいかないので
- 564 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:15:54 ]
- テキストファイルに aあ と書いてそれを16進形式でテキストファイルに出力すると、
61 82 A0 0D 0A となりました。 ここからこの数を使って aあ と新たなファイルに表示させたいのですが、 a は出力できるのですが あ のやり方がわかりません。 どうしたら日本語の あ が出力できるんでしょうか。 ちなみにaは char temp[50] char moji[]="61"; strcpy(temp,"0x"); strcpy(temp,moji) long int aa=strtol(temp,NULL,16); fprintf(file,"%c",aa); 見たいな感じで出力しました。
- 565 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:22:43 ]
- >>564
char tmp[10]; tmp[0] = (char)strtol("82", NULL, 16); tmp[1] = (char)strtol("A0", NULL, 16); tmp[2] = '\0'; printf("%s", tmp);
- 566 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:23:54 ]
- >>555>>563
その二つはinputとoutputがchar型配列でない限り、違う結果になる >memcpy(input,output,size<<1); ここの第三引数は、バイト単位でのサイズを指定する >for(i=0; i < (size<<1); i++) >output[i] = input[i]; こっちで指定するのは、配列の要素数
- 567 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:25:46 ]
- >>564
printf("%c%c%c",0x61,0x82,0xA0);
- 568 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:26:00 ]
- >>563
memcpyのsize<<1はバイトで for文のsize<<1はint型(4バイト?)分になるんじゃないかな? 試してないから間違ってるかもしれないけど
- 569 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:31:11 ]
- >>566 >>568
なるほど。。。と違いはわかったのですが memcpyだとinputからoutputに何がコピーされているのか混乱してきました。 sizeはint型でinput分の要素数を表しています。 0 1 2 3 4 5 6 7 の要素が入っていて それを計算したものをoutputに出力させているのです for文の方をmemcpyと同じように働かせるにはどうしたらよいのでしょうか
- 570 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:31:45 ]
- >>380
入力に何を与えたら何が出力されるのか書いてくれれば考えてみる >>524 >>526 を読んだが訳分からんかった 検索のキーとなるのは64バイトの内最初の固定 n バイトだけ?(>>524 だと n=16) 1行64バイトって改行文字を含まずに64バイト? 読み込むファイルは検索途中で書き換えられる?
- 571 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:36:06 ]
- >>569
要素数を表してるのになんでビットシフトしてるの?
- 572 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:39:32 ]
- フーリエ変換かなんか 2^n 要素数のアルゴリズムじゃね?
- 573 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:40:24 ]
- >>565>>567
どちらもできましたありがとうございます。
- 574 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:40:48 ]
- >>571
階差数列や漸加式をイメージしてもらいたいのですが 長さの半分の式を移していくという処理をやっています。 なんか頭が熱持ってきました。。。
- 575 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:41:57 ]
- >>572
そうです、2^nの式です。。。わかるものなのですね
- 576 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:44:48 ]
- ソースが全部貼り付けられてるわけじゃないからあくまで推測だが、
sizeが正しく使われてるか確認した方がいいと思う。
- 577 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:48:59 ]
- >>576
for(i=0; i < length<<1 ; i++) input[i] = output[i]; …こうやったら、望む値が出てきました。。。。なぜ。。。。。 計算させるところを勘違いしていたのか、わけがわからなくなってきました。。。。
- 578 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:50:41 ]
- >>569
なんかよく分からんが例として int a[10],b[10],size=10,i; //何らかの代入処理 memcpy(b,a,size * sizeof(int)); //↑は↓と等価 for(i=0; i < size; i++) b[i] = [i]; こんなふうにする あと今気付いたが、memcpyの第一引数と第二引数が反対になってるよ 第二引数がコピー元で、第一引数がコピー先 代入文と同じ順序ね
- 579 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:55:00 ]
- >>578
ありがとうございます。ちょっと頭冷やして、ソースと頂いたレスを理解します。 ほんとなんかすみません
- 580 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 03:23:33 ]
- C言語初心者で、教えて欲しいのですが
sin^2(x) (サインの二乗(x)) はどのようにプログラムに書けば良いのでしょうか?
- 581 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 03:34:41 ]
- >>580
sin(x)の2乗ということですよね #include <math.h> sin(x)*sin(x) /* sin(x)の2畳 */ sin関数を2階呼ぶのが面倒なら double y; y = sin(x); y*y
- 582 名前:581 mailto:sage [2007/10/30(火) 03:36:22 ]
- pow関数を使うという手もありますが
2乗なら掛け算で十分
- 583 名前:580 mailto:sage [2007/10/30(火) 03:41:03 ]
- >>581
こんなにも遅い時間にありがとうございます。 プログラミングもですが、数学もやり直してきます
- 584 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 03:46:08 ]
- 2倍角の公式の方が速い
- 585 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 03:51:51 ]
- exp( ix ) = cos(x) + i sin(x) だから2乗して実部を比較すると
cos(2x) = cos^2(x) -sin^2(x) となる cos^2(x) + sin^2(x) = 1 なので 1 - 2 sin^2(x) = cos(2x) これより、(1+ cos(2x)) / 2 が求める値である
- 586 名前:580 mailto:sage [2007/10/30(火) 04:01:36 ]
- >>585
さらなる補足をありがとうございます。数学の教科書見て勉強してます
- 587 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 12:19:41 ]
- >>585
>>581 より計算量増えてね?
- 588 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 12:48:58 ]
- >>587
そもそも移項で間違ってる
- 589 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 12:55:03 ]
- sin^2(x) == (1-cos(2x))/2だな
>>587 ・関数呼び出しが一回でいい(cf.sin(x)*sin(x)) ・一時的な代入がいらない(cf.y=sin(x);y=y*y;) ってことでこの方法が一番いいかと
- 590 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 12:58:06 ]
- 計算増えるっていっても2倍と1/2と足し算だからもとのよりはいいんじゃね?
- 591 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 13:26:48 ]
- おまえら、数値計算の勉強をやり直せ。
1 - cos(2x) なんて、 x = 0 の近辺で桁落ちして使い物にならないぞ。 double t = sin(x); double s2x = t * t; しか、ありえない。
- 592 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 13:34:29 ]
- 桁落ちw
- 593 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:50:05 ]
- ->
これはどういう意味があるのでしょうか
- 594 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:54:29 ]
- やじるし
- 595 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:55:08 ]
- アロー演算子
構造体のポインタからメンバにアクセスするときはドット演算子ではなくこれを使う
|

|