C言語なら俺に聞け 143
■ このスレッドは過去ログ倉庫に格納されています
>>110 この漸化式は0<m<nという条件のもとなのでn=mの可能性はないです >>110 nCm が整数かどうかは別の漸化式 (n+1)C(k+1) = nC(k+1) + nCk を使って帰納的に証明する >>111 ならば、大きな整数で桁あふれ(overflow)が起きているのかもしれない。 long longを使うか、多倍長整数を使うとよい。 >>113 うーんやっぱりそうですか ありがとうございます (n*n-1Cm-1)/m と計算せず (n/g)*(n-1Cm-1/(m/g)) と遠回りして計算したのは掛け算より前に割り算をして桁あふれを防止するためだったのですが、これだけではまだ読みが甘いみたいですね k>nのときnCkはゼロになるはずだ。間違えている。 >>115 100!が何桁になるかわかっているか? 組み込みの整数使うより 多倍長整数使うような話だな 配列の四則計算かw とりま、1桁辺り1バイトからやって行くと良い。 アルゴリズムは手計算方式で。 cでutf-8文字列の扱い方がよくわからないのですがどうすればいいのでしょう >>125 ソース中にリテラルで書く書式? それともテキストファイルを読み込んでの文字列操作かな。 もしかしてWindowsでの扱い等の環境依存の話だろうか。 そーゆーのって、C言語じゃなくて、ライブラリの仕様なんで、環境わからないと誰も答えられないよな。 プログラム中で扱う時はiconv()で変換しちゃうと楽だな。Windowsは知らんがOSが変換やってくれなかったっけ?忘れた。 #include <stdio.h> int main(void) { int x, y, z; scanf("%d", &x); y = x; for (x = x - 1;x > 1;x--) { z = y % x; if (z = 0) { x = 0; } } if (x = 0) { printf("入力値は素数ではありません\n"); } else { printf("入力値は素数です\n"); } fflush(stdin); getchar(); return 0; } 素数判定用のやつ作ったんだが動かない 問題点教えてください fflush(stdin)は無意味 あとイコールが足りない 等しいかを比較するのは == if () の中であっても = は代入操作 × if (z = 0) ○ if (z == 0) × if (x = 0) ○ if (x == 0) すいませんマジで==忘れてましたw あとはif文でxの値に代入する数字を1にしたら直りました やっぱ自分だけで考えてると基本なことにも忘れてしまいますねw おまえらバカにすることしか頭に無いのか 初心者ならこういうこともあるだろうに 古代においては、(1 == y)としておけば、間違って(1 = y)とした時にコンパイルエラーで発覚する、という言い伝えが有った。 > >#include <stdio.h> > >int main(void) { > int x, y; > scanf("%d", &x); > y = x; > while (x % (y -= 1)) > ; > if (1 == y) { > printf("入力値は素数です¥n"); > } else { > printf("入力値は素数ではありません¥n"); > } > > return 0; >} > >>140 あーそうだな。今でもたまにそう書いてあるソースを見かける。 いつも自分ではやってないので違和感があるw まあでもCみたいな言語だと本当はそう書いておいた方が良いんだろうけどね。 そう言えばこの頃のコンパイラはifで代入だけしてるようなのは見つけて警告出してくれるな。 >>140 の書き方はしないでしょ。 間違って(y=1)とすることが有り得ないから。 などと偉そうに言えるようなレベルじゃないけど、そう思う。 printfの、パラメータに置換される文字列の呼び名は何ですか? %dや%cの総称です 英語だとformat specifier 日本語だと書式指定子とかそんな感じ リテラルには代入できないから、リテラルを左側へ書いておく 今は、MISRA-C で、100項目をチェックする事が義務化されているから、 違反は必ず報告される でも、トヨタのように、5/100 しか取れない企業もある。 95も違反してるw >>140 の話は >>1 の参考サイトにも出てる話だね。 C FAQ 日本語訳 ttp://www.kouno.jp/home/c_faq/ 17.4 に載ってる。 定数と変数の比較なら役に立つけど、変数同士の比較に使えないから 特に良くも悪くもない、という評価。 コンパイラがオプションを備えてるなら警告を出させるのが良いわな。 >>147 トヨタの例を見て分かるようにMISRA-Cは役に立たないという話か 全員が同じレベルで言語の仕様や処理系の実装を理解しているわけじゃないからなあ。 最底辺のレベルを合わせる為にMISRAのような約束事が有用であろう事は想像できるんだが… 俺、車業界のソフト屋じゃなくて良かったと思うわ。 いや、むしろ、いっその事、強制された方が楽か? 初心者です。 C言語には標準出力関数がいくつかあって気になったのですが、 puts("文字列"); puts("文字列"); puts("文字列"); などと書くのと、 printf( "文字列\n" "文字列\n" "文字列\n ); のように書くので結果は同じようになると思うのですが、速度やリソースの消費に違いはあるのでしょうか? どちらが速いとかメモリ消費が少ないとかあれば教えていただきたいです。 >>155 printf() は重い。puts() の方が軽いしコード量も少ない >>157 stdoutがline bufferedなら、どっちもwriteが3回呼ばれる 言語規格的には解析処理のあるprintfのほうが遅そうだけど これぐらい単純なprintfだと、gcc/clang辺りでコンパイルするとputsに最適化される 副作用諸々でputs自体の呼び出し回数を減らすことはないから、puts1回の呼び出しで済むprintfのほうが早い >>160 それはさすがになさそうだ… printf()/vfprint() のCのコードを#include しているわけではなく、単にリンカがランタイムのコードをリンクしているだけなのでは? いいかえると、printf() がCで書かれており、printf() もコンパイルするのなら最適化がかかるだろうが、さすがにそうじゃないだろう? >>162 はい、時代遅れ発見。LLVMとGCCはお互いに競争する形で最適化の技術を進化させているんだよ。 gccはビルトイン関数のprintfを持ってるのに、ライブラリをリンクとか何言ってんだコイツ ランタイムのコードをリンクか、どっちにしろアホ晒してるのは変わらんか >>167 のリンク先を読んだのだが… printfで色々条件、最後が改行だったらputsに置き換え、は分かったけど 最後が改行でない場合はfputs( , stdout)に置き換えるわけにいかんのじゃろか? stdoutがフラッシュされるタイミングが改行だから拙いんじゃね PC で組むなら、たいした問題にならないリソースの心配よりも、 統一して見やすいように気を使うべきだろうね。 fputs( "文字列1\n" "文字列2\n" "文字列3\n" , stdout ); みなさんありがとうございます。 末尾の改行程度しかないprintfはputsに置き換えられるんですね。 ググってみたりもしたんですが、最近のPCであれば速度にほとんど違いが出ない様なことも書いてありました。 171さんの言う通り速度やリソースよりも見やすさや読みやすさの方が大事になりそうですね。 勉強になりました。 塵も積もれば何とやらで すぐ砂時計だの輪っかだのになるのが M$の作風 入力が入れる前に厳密にされてないとprintfは怖くて使いたくないなエラーになるし プログラミング問題とかなら入るの制限されてるから使う時もあるけど 自動で実行ファイルが作成されてその実行ファイルが新しく実行ファイルを作ってその実行ファイルが… みたいな無限増殖するウイルス的なやつって理論上作れるの? 作る気はないがファイル名を自動で生成して上書きするようしていったら全ファイルが空ファイルになるってのも可能なのか? >>177 GetModulePathName+CopyFileで誰でも作れる。違法。 >>177 全ファイルが空になるというのは、イカタコウイルス。可能だが違法。 やり方は直接は教えられないから、Win32APIスレで個別の処理のやり方を細かく質問するといい。 プログラミング全体に言えることだがreturnがよくわからない 戻り値とかはなんとなくわかる 戻り値を表示するわけだからprintf要らずなわけ? >>177 fork() してプロセス作るの繰り返すだけでいいのでは?ファイル作る必要あるか? 作ったとしてもそのファイルの内容は元のやつと同じなんだろ? Windows の場合はどうするか知らない。fork() と同じような動きをするAPIがあるなら それ使えばいい。(cygwinのライブラリ使えばいいか) >>183 君は return を何か別のものと勘違いしてはいないか? >>183 何か関数のコードをここに書いて、自分なりに説明してみ? 優しいお兄さんたちが説明のアラを指摘してくれるよ >>187 じゃホント適当なの int main(void){ int a,b; scanf("%d %d",&a,&b); a=a+b; return a; } 適当に 基本自分はa=a+bの後の行にprintf("%d",a);って入れるけど戻り値を表示するだけならreturnで十分なの?って聞きたい >>188 main関数のreturnの値は0固定だろ。 正常に終了したかどうかを示す数値を返さないとダメなんだし >>188 それどこにも何も出力してないよ。一応 main() での return はプログラムを実行した側に ステータスとして返されたりするがその辺はOSやmain()を呼ぶ側のコード依存だ。 で、それはプログラムの実行中で起きたエラーを伝えるためによく使われている。 0ならエラーなしで1ならエラーみたいに。つまり普通は計算結果を返すためには使わない。 >>189 0固定なの? 苦Cでmainじゃない関数で使ってたけど よく分かんないな >>191 固定と言うか、昔からの慣習で普通は0返すように書くんだよ。UNIXでの慣習ね。Linuxでも同じ。 UNIXではシェルスクリプトで動かした時にエラーかどうかを判定するのに使うことがある。 (シェルの if 文等で直接使える。Windows のコマンドプロンプトでもほぼ同じ)。 0が返されたら正常終了で0以外がエラーね。 まあとにかく歴史的な問題でそうなっていると思って良い。そういう意味では main() からの return だけは特殊なものだと思っていい。 >>188 return a; と書いても基本的にはaの値は表示されないよ。 returnは関数内で計算した結果を呼び出し側に返すだけ。 値を見たければprintf等を使って表示する必要がある。 呼ばれた関数内で(途中経過として)表示するか、 呼び出した側で(関数の結果として)表示するか、は目的次第だが。 main() はOS(WindowsとかLinuxとか)からコマンドとして呼び出される関数、 と考えると分かりやすいかも。 main() 関数のreturnの値はOSに返される。 返された値をどう扱うかはOS側の問題だわね。 return は表示装置に値を戻す(表示する)機能ではない >>191 「自作関数を作る」あたりのページで出てくるsum関数でしょ? あれってただ単に今までmain関数で return 0 しかしていないから、例として同じように書いているだけだと思うよ。 「関数から数値を返す」のページまで行けば return num してるsum関数が出てくるよ。 print関数だけで表示するだけの関数とかならreturn0するけど衝突判定とかならbool型返したりするからな 自分が使っているPCなんかで、 処理を自動で行いたいなと思った時に、 それをC言語を使って実現出来るなら >>199 それ、OS固有のAPIの知識だらけで、Cがきちんと使える能力は測れない >>197 数年かけてLinuxカーネルを読破できたら コールバック関数の型宣言とか、 関数ポインタの扱いを難無く出来るか? とかかな? p = p() で駆動するようなステートマシンで 自分のポインタを返す関数 と それを保持するポインタの宣言とか >>200 「きちんと」とか書いてない要件を作り込んでバグだらけのコードを量産する自称玄人乙 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる