C言語なら俺に聞け 150

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (アウアウクー MM57-IE4z)
垢版 |
2019/02/06(水) 13:39:03.21ID:c4bnQMl3M

次スレを作る時は上記1行をコピーして2行に増やして必ず1行目に入るようにしてください。

C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 149
https://mevius.5ch.net/test/read.cgi/tech/1540731704/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/02/16(土) 08:47:05.29ID:DIoBwVhC0
みなさんpragma onceじゃなくてifndef派なんですね
2019/02/16(土) 08:52:07.39ID:q1DAaOKG0
>>155
> INT2STRって関数がバッティングしてる
> 便利な関数だからいろんなヘッダファイルに仕込んでるんだけど
その関数を定義した"int2str.h"を作って
#pragma onceなり#ifndefなりでインクルードガードしておく
各ヘッダーファイルは"int2str.h"をインクルードすればいいだけ
2019/02/16(土) 09:05:18.00ID:P5gjDjW+0
>>155

「便利な関数だからいろんなヘッダファイルに仕込んでるんだけど」

普通は
「便利な関数だからライブラリ化していろんな実装ファイルでインクルードしてる」
とするべきでしょ。

ヘッダファイルの使い方も間違ってるような…
2019/02/16(土) 09:09:29.43ID:P5gjDjW+0
>>161
たぶんint2str.hはヘッダーファイルじゃなくて実装ファイルでインクルードすべき性質のものだよね。

細かいことかもしれないけど、ヘッダーファイルでインクルードすると他のファイルへの影響が増えるから、必要がない限りは実装ファイルの方でインクルードするべきだと思う。
2019/02/16(土) 09:19:18.44ID:mG+jUdie0
関数の実体をヘッダーにおいているのか
inline キーワードが使えるなら… という話かな?
2019/02/16(土) 09:40:04.81ID:suSnt5KvM
>>163
いやそんなことはみんなわかっててでも本人やりたいならこうすればいいよって言ってるだけだろ
2019/02/16(土) 09:59:46.09ID:t+1YRxqBa
これはみんなボケてるの?
2019/02/16(土) 10:56:39.56ID:BHwuOYP40
ワザとだろう
2019/02/16(土) 10:58:48.72ID:yq1cCgqT0
ありがとう、みんなが背中押してくれたから決心が付いた(`・ω・´)

ヘッダーファイルint2str.hを作って
関数INT2STRの実体はint2str.cに記述、
int2str.hには

#ifndef _INT2STR_H
#define _INT2STR_H
...
#endif

でくくって多重定義を防ぐ(`・ω・´)b
2019/02/16(土) 13:29:20.93ID:GySit7mC0
#include <stdio.h>

int f(int i){
switch(i){
defalut:
return i;
}
}
int main(void) {
printf("%d\n", f(2));
return 0;
}

このコードを実行するとfの入力が何であっても0が出力されるんですけどなぜですか?
2019/02/16(土) 13:46:58.56ID:3/SZoFmmd
>>169
一応手元で試したらちゃんと2がでたよ。
printfでなくてmain関数の結果を表示してるとか?
2019/02/16(土) 13:49:29.31ID:BHwuOYP40
>>169
defalut:
2019/02/16(土) 14:04:34.91ID:WseEcsSPM
defaultがラベルになる?switch の中に return だけになるのか?switch 素通りして関数の最後に return 無いけど return 0 になるのか?これコンパイルとおるの?
少なくともコンパイル警告は出るはずだから、素人は警告無視すんな
2019/02/16(土) 14:11:52.03ID:BHwuOYP40
ラベルは、警告出ないだろう
これ昔ハマったことあるw
2019/02/16(土) 14:29:47.26ID:z2OC1C8Ix
あー、これね。
これそのものじゃないけどcaseを書き忘れて同じようにハマった経験あるわ。
2019/02/16(土) 14:34:18.78ID:h+JOL/Xg0
初心者なんですけどファイルをfopenで開いてからcloseせずに別のモードでまたfopenするのは問題ありですか?
176デフォルトの名無しさん (ワッチョイ bf02-yQ/S)
垢版 |
2019/02/16(土) 14:41:10.94ID:FAU3Sbcr0
>>169
コピペして実行してみたがこちらでは 4195622 が出力されたw

gcc -Wall でコンパイルしてみると「ラベル ‘defalut’ が定義されていますが使用されていません」が出る。
綴り間違いだな。l と u が入れ違いになっている。
2019/02/16(土) 14:58:25.69ID:GySit7mC0
ありがとうございました!
綴が違っていたことに気づきませんでした!
2019/02/16(土) 15:18:12.53ID:jgcdGKnj0
なるほど -Wreturn-type とか -Wall つけないと int 型の関数に return が無くても警告出ないのか
2019/02/16(土) 15:31:05.97ID:3/SZoFmmd
>>170
コピペせずに手打ちでやったから "defalut" に気づかなかった。。
180デフォルトの名無しさん (ワッチョイ bf8c-l0e6)
垢版 |
2019/02/16(土) 15:42:31.02ID:GG6HVTci0
バグの大半は手書き
2019/02/16(土) 16:44:51.50ID:/Su8h7T90
>>175
単一のファイルを複数回、fclose()しないでfopen()するってことかな。
複数の FILE* が単一のファイル(名)を操作してる状態。

FIO24-C. すでにオープンされているファイルをオープンしない
ttps://www.jpcert.or.jp/sc-rules/c-fio24-c.html
↑によると「(前略)同一のファイルを同時に複数回オープンできるかどうかも、
処理系定義とする」ってことだから、一般的には好ましくないね。

すでにfopen()されててまだfclose()されてないファイルに対する
2回目のfopen()が成功する(場合もある)か、常に失敗するかも「処理系定義」だし。
2019/02/16(土) 18:01:42.08ID:OrPj8CII0
>>159,168 予約識別子はやめとこう。
2019/02/16(土) 19:51:50.72ID:h+JOL/Xg0
>>181
詳しい説明ありがとうございます
2019/02/17(日) 08:39:19.73ID:uUoaBuH/0
んじゃこうだな

#ifndef STDIO_H_
#define STDIO_H_ 1
...
#endif
2019/02/19(火) 10:01:13.72ID:IvpU5OFea
おまいらならFEのC言語問題余裕の全問正解なわけ?10分もかからんくらい?
2019/02/19(火) 10:15:05.54ID:+p6oUoec0
少し古いが第一種情報とエンベデッドスペシャリスト程度はクリアしてる
即答クイズじゃないんだから時間気にするのは間抜けだぞ
187デフォルトの名無しさん (ワッチョイ 275f-3QuV)
垢版 |
2019/02/19(火) 17:04:59.95ID:uTkGj35D0
>>185
ああいう問題は実務では存在しないから簡単ではないよ。
2019/02/19(火) 18:44:17.22ID:BOKvhiPA0
マジで言い訳でもなんでもなく
業務のときと使う脳味噌が全然 違う。
普段 ファイルを単純に移動させるにも 外環境からどういう邪魔が入りうるか
プール単位で跨ぐときどういうセキュリティーホールがあるか
とかいうことを重箱の隅をつつくように考えてるのに

条件分岐を一度も使わずに素数生成しろ みたいな問題が出てくるんだもん
しかも出/入力データの危険性は一切考えない、っていうパターンがほとんど。
2019/02/19(火) 18:54:53.10ID:BVj1SDNF0
>>188
>条件分岐を一度も使わずに素数生成しろ
おもしろい問題じゃないですか、三項演算子 OK ならできそうですね
2019/02/19(火) 18:56:33.83ID:+p6oUoec0
そういった類の具体的な問題対処能力を試してみたいのであればスペシャリスト系の過去問でも見てみれば?
エンベデッドかデータベース試験の午後の記述問題あたりがいいと思う
https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_mondai.html
2019/02/19(火) 19:25:12.60ID:rpeG63p80
情報処理試験は実務やってたらAPよりスペシャリストのほうが簡単だわ。
2019/02/20(水) 17:11:05.26ID:5682Vwfvx
「100以下の素数を表示するブログラムを作りなさい」
どんなプログラムを作るかで実務向きかどうかを判断できるらしい。
2019/02/20(水) 17:34:21.53ID:yWD0fIVX0
で、実務向きと判断される人はどういう風に回答するんだろうかw
2019/02/20(水) 17:56:41.12ID:V5JGZApS0
「100以下の素数を表示するブログラムを作りなさい」だと
手打ちの固定テーブル(初期化済み配列)って解答もありそうだな。

2重のforループで「エラトステネスのふるい」を回して0/1の配列を生成。
値を表示する/しないは、要素2個の関数ポインタを格納した配列ってトリック。

そもそもfor, whileや三項演算子は「条件分岐」じゃないのか?
みたいな疑問を感じ始めると答えられないね。
2019/02/20(水) 18:03:03.37ID:/pFWY/nZ0
単純に考えれば素数を漏れなく見つけるにはエラトステネスのふるいによるしかない
いかにして無駄な計算を避けるかが重要
プラグラム言語よりもいかに数学的素養の能力を身に着けているかが問われる
馬鹿正直に2から100までループを回すようならまったく実務には向いてない
整数論の基礎だけで100以下の判定に必要な要素は2,3,5,7だけであることはすぐにわかる
プログラムに落とし込む以前の問題
2019/02/20(水) 18:09:44.13ID:yWD0fIVX0
該当する素数一覧が埋め込まれた文字列を表示するプログラムが一番速そう
2019/02/20(水) 18:34:58.50ID:MxetRGgJd
俺は拡張性がちらついてエラトステネスにしたくなるわ。どれだけの実行速度が求められるのかわからないとどの方法でやるか決心がつかなくてタイムアップしそうw
2019/02/20(水) 18:48:50.68ID:WptMO45ba
>>192
問題の意図や目的を明示せずに解かせた答えだけみても、その人がどんな意図でその回答を出したのかは断定できないから、これだけで実務がどうこう言うのは短絡的だとは思うよ。
よくある性格診断とかで、○○を選んだあなたは××な性格です〜ってのがあるけど、解説を聞いてもまったく説得力のない決めつけがほとんどだし。それよりはいくぶんましだけど。
2019/02/20(水) 18:51:44.09ID:yWD0fIVX0
実務的には、「要求を満たし、簡潔にして高速で間違いがないこと」位かな
2019/02/20(水) 18:53:27.21ID:onU160B4F
>>199
いや拡張性をサッとそえとく心配りは必要だろ
2019/02/20(水) 18:55:22.57ID:MxetRGgJd
夜な夜な素数配列DBをどんどん作ってくれるプログラムと、素数配列DBから値を引っ張ってくれるプログラムの組み合わせでファイナルアンサーだ!
2019/02/20(水) 18:55:39.06ID:AQq/x/Ljd
3以上の素数は奇数であること。
n以下の素数を調べるときは、ルートn以下の約数を調べればいいこと。

整数論を勉強したなら、これくらいは知っておいて欲しい。
203デフォルトの名無しさん (アウアウウー Sa4b-s2oh)
垢版 |
2019/02/20(水) 19:05:39.41ID:agArr1lpa
>>199
組み込み用でメモリが非常に少ないマシン用のプログラムの場合もう一捻り必要。
204デフォルトの名無しさん (アウアウウー Sa4b-s2oh)
垢版 |
2019/02/20(水) 19:07:07.48ID:agArr1lpa
ま、いいや。うちに帰ってから俺が変なプログラム作ってみるよ。
2019/02/20(水) 19:09:30.26ID:V5JGZApS0
>>196 こんな感じね。
#include <stdio.h>
int main(void)
{
 puts("2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97");
 return 0;
}
どうやって文字列を作ったかはヒミツ。本当に合ってるかは不明。

「素数なら表示し、素数でなければ表示しない」の部分は
テーブルがすでに出来てるとすれば、
tbl[i] && printf("%d\n", i);
てな具合に論理演算子の短絡評価を使う手もあるか。


パズルとしては面白いけど、実用で何の意味があるのか、
金払って受験する資格試験の問題としてどうなのか、疑問だなぁ。
2019/02/20(水) 19:12:37.32ID:AQq/x/Ljd
素数の知識がなければ暗号解読やハッキングができないかも。
2019/02/20(水) 19:33:00.95ID:/pFWY/nZ0
この流れだと

世の中のあらゆる暗号鍵はあらかじめ配列に格納することで突破可能、どうやって配列を作るかは秘密

とか言い出しそうだな
本質が分かってない
素数を高速に表示することが目的ではなく素数を少ない計算量で見つける事が本来の目的
2019/02/20(水) 19:46:25.77ID:V5JGZApS0
>>188 「条件分岐を一度も使わずに素数生成しろ」
>>192 「100以下の素数を表示するブログラムを作りなさい」

2つの問題に同時に応えてるコメントがあるみたいね。
「条件分岐を使わずに100以下の素数を表示するプログラム」てことで。
かく言う自分もそのクチなんだけど。
2019/02/20(水) 19:56:53.43ID:jAMIqMc60
>>207
そのアイディアに近いものはレインボーテーブルと呼ばれていて、すでに実用化されている。
2019/02/20(水) 20:08:03.07ID:/pFWY/nZ0
>>209
レインボーテーブルはハッシュの検索高速化のための技術だと認識してたけど、素数を利用した暗号鍵の
Decryptにも実用レベルで応用できるのか?
2019/02/20(水) 20:23:16.84ID:jAMIqMc60
一般的なコンピューターでは素数暗号の解読は困難だね。A5/1 Security Projectが進めばどうなるかわからないが。
2019/02/20(水) 20:25:26.46ID:jAMIqMc60
Windowsのユーザーアカウントくらいなら数日あれば。。。
213デフォルトの名無しさん (アウアウクー MM7b-3QuV)
垢版 |
2019/02/20(水) 20:27:13.73ID:EKI9LXSlM
>>192
「100以下の素数を表示するブログラムを作りなさい」

これ素数の定義が問題に記載されておないとただの数学の問題になってしまうな。
2019/02/20(水) 20:30:13.22ID:P8vN2pc30
>>195
>整数論の基礎
素数だけで構成する積による表現がすべて自然数について存在すること、ならびに、この積の表現が一通りであることを証明してください


>整数論の基礎
単に掛け算の交換則だけでいいのでは?
2019/02/20(水) 20:31:37.35ID:P8vN2pc30
>>197
エラトステネスの篩にも欠点があります。
篩の大きさだけ広大なメモリ空間を確保しなければなりません
限られたメモリ容量で超巨大な素数を求めることは可能ですか?
2019/02/20(水) 20:32:29.86ID:P8vN2pc30
>>202
>3以上の素数は奇数であること。
>n以下の素数を調べるときは、ルートn以下の約数を調べればいいこと。

あえて聞きます、証明はどのようなものに?
2019/02/20(水) 20:33:15.91ID:P8vN2pc30
>>205
それは表示した数が、果たして素数かどうか、を示してはいませんよね
2019/02/20(水) 20:33:54.09ID:P8vN2pc30
>>206
RSA 暗号はもう古いです、今は elgamal 暗号がトレンドです
2019/02/20(水) 20:33:59.13ID:jAMIqMc60
>>215
「ある整数の倍数の存在が周期的であること」を利用すれば、メモリーを節約できる。
2019/02/20(水) 20:34:54.39ID:P8vN2pc30
>>207
>素数を少ない計算量で見つける事
個人的には、素数の原始根を求める方法が知りたいです、いまんところ力技で解くしかないかと
2019/02/20(水) 20:37:58.24ID:P8vN2pc30
>>219
たしかに 2 と 3 の公倍数である 6 をもとに
6n + 1, 6n + 5 だけをテーブルに載せる、とかは可能ですね
私はやったことがない、それはどうでもいいとして、これをコード化(coding-realized) したのも見たことがありません、いつか誰かやるだろうと思っていたんですが、なかなか表に表れませんね
2019/02/20(水) 20:44:12.93ID:jAMIqMc60
>>216
3以上の素数pが奇数でない、すなわち偶数であれば、偶数の定義より、pは2で割り切れるが、pに2以外の約数があれば素数でない。矛盾。□
2019/02/20(水) 20:48:00.19ID:ZC/ijL840
>>201
サーバー側ならこれが攻守最強だな。隙がねぇ……
2019/02/20(水) 20:56:41.09ID:jAMIqMc60
>>216
時間切れ。すまん。
2019/02/20(水) 20:59:36.97ID:P8vN2pc30
>>222
>pに2以外の約数があれば
ここがおかしい
2019/02/20(水) 21:00:10.59ID:jAMIqMc60
>>221
素数プログラミングの競技に参加してやってみれば?
2019/02/20(水) 21:01:27.72ID:jAMIqMc60
>>225
「約数2があれば」に訂正。
2019/02/20(水) 21:02:29.11ID:P8vN2pc30
>>227
うむ、それでいい感じですね
2019/02/20(水) 21:06:35.67ID:jAMIqMc60
倍数の周期性を使えばBuzzFizz問題の応用(多重化)でメモリーが節約できるはず。
2019/02/20(水) 21:10:58.63ID:jAMIqMc60
バッチ処理で素数生成するなら、途中から計算を再開できるようにしておくとよい。
2019/02/20(水) 21:12:34.79ID:jAMIqMc60
>>216
「素数生成 ルート」でWeb検索。
2019/02/20(水) 21:39:38.70ID:IdoLDUDuM
巨大な素数の一覧
https://ja.wikipedia.org/wiki/%E5%B7%A8%E5%A4%A7%E3%81%AA%E7%B4%A0%E6%95%B0%E3%81%AE%E4%B8%80%E8%A6%A7

1億桁を超える素数を発見すれば懸賞金が手に入るぞ
お前ら頑張れ
2019/02/20(水) 22:33:31.62ID:bRSP0nNv0
大学の授業でやってるがわけわからん
2019/02/21(木) 04:51:28.69ID:k7mDakXF0
「3以上の素数は偶数ではない」って、
「2以外の2の倍数は素数ではない」と言い換えられるよね。
対偶命題の真偽は等しい、ってことで。
「3以上」「2以外」の部分の処理がちょいと面倒かも知れんが。
素数の定義から自動的に成立する、トートロジーって気もする。

実用的には、チェックすべき対象が一気に半減するから
決して役に立たないつまらない事実とは言わないけど。
2019/02/21(木) 05:47:41.57ID:0ZBMuCH70
なぜ「nの倍数」のうち「2の倍数」だけを特別視するんだ?
2019/02/21(木) 06:56:30.22ID:k7mDakXF0
たぶん2の倍数に特別に「偶数」って名前がついてるから。

て言うか「2の倍数」を「偶数」と呼び替えるせいで
「3以上の素数は偶数ではない」がそれらしい命題に見える心理的効果。
2019/02/21(木) 07:07:07.36ID:0ZBMuCH70
じゃあ例えば3の倍数を俺数と呼ぶことにすれば
「5以上の素数は俺数ではない」がそれらしい命題に見えるわけか
2019/02/21(木) 09:23:02.63ID:hmZcoRew0
>>237
実際にそういう理屈で俺数をちゃんと名前つけて定義してた気がする
2019/02/21(木) 10:06:27.81ID:vm8j2cEaM
https://ja.wikipedia.org/wiki/%E5%9C%8F%E8%AB%96

集合論的な数学理論の構成では集合やその元に対して写像や関係を導入し、それらが満たすべき公理を列挙する。その公理を満たすような「構造」を持った個々の集合が理論の具体的な実現を示していて、それら一つ一つの実現に共通の性質が公理から演繹的に証明される。
2019/02/21(木) 10:43:14.10ID:hP/J64Xh0
10進数で扱ったときに下一桁だけで素数でないか判定できるし
2019/02/21(木) 11:52:49.43ID:TYXtdJfXM
https://ja.wikipedia.org/wiki/%E4%BB%A3%E6%95%B0%E4%BD%93

一般には、素数は代数体の整数環の素元として定義される(そこでは反数などの同伴なものも素数に含まれる)。このため、有理整数環での素数は有理素数と呼ばれることもある。
自然数あるいは実数の中での素数の分布の様子は高度に非自明で、リーマン予想などの現代数学の重要な問題との興味深い結び付きが発見されている。
2019/02/21(木) 12:21:11.52ID:9bhJdGzC0
>>240
意味ないじゃん
下位一桁で素数か判定できるなら有り難いが
2019/02/21(木) 12:24:22.12ID:ZaAjcalq0
2の倍数は1個となりにあるけれど3の倍数は2個となりにあるわけじゃないからだろ
2019/02/21(木) 12:26:58.45ID:hP/J64Xh0
世界の半数の人間を一気に殺せるとしたら、スゴイ兵器だろう
2019/02/21(木) 12:45:09.74ID:AfMCgFa5H
もういいからいいかげんCの話しろよ
2019/02/21(木) 12:48:37.97ID:FW7y2HsrM
https://ja.wikipedia.org/wiki/%E5%90%88%E5%90%8C%E7%AE%97%E8%A1%93

ガウスの貢献はこの集合、今日整数の合同類 の環 ℤ/nℤ と呼ばれる代数系、の構造を詳らかにするものであった。第一に加法に関して考えれば、これは 1 を生成元とする巡回群を定める。第二に乗法に関しては、これは法 n に依存して性質が異なり、法 n が素数ならば体が得られる。このような方法により、計算の記述は簡素化される。
2019/02/21(木) 13:04:43.82ID:SFQD6HMZx
やっぱり理系はみんな素数が好きなのねん
2019/02/21(木) 13:23:11.53ID:ZaAjcalq0
平方剰余の相互法則は奇数の素数でしかなりたたないから2は特別らしい
249デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/21(木) 20:15:32.30ID:lsmx9sV60
ダメプログラマだらけだな。
2019/02/21(木) 20:25:59.92ID:m+qFL4AC0
プログラマ以前のただのC言語の評論家の集まりだからな
数学の素養どころか一般的な定番アルゴリズムすら理解しているのか怪しいのがいくらでもいる
251デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/21(木) 20:29:14.38ID:lsmx9sV60
「100までの素数」は単にロジックが書けるかどうかの話で、素数の話ではないだろうに。
2019/02/21(木) 20:33:10.06ID:m+qFL4AC0
配列に数字を並べて表示するだけの処理の何処にロジックがあるのやら
あれではただのゴリ押しだ
2019/02/21(木) 20:52:13.17ID:S9yUyDkx0
誰かがこの問題から実務向きかどうかがわかる、なんて言うからいけない
2019/02/21(木) 21:00:34.34ID:3Jj6vI7vd
最近知ったことだが、clangとclang++には、-pedantic -Wallの他に-Weverythingというオプションがある。これを使えば最大限に警告してくれる。
255デフォルトの名無しさん (ワッチョイ a95f-qM0Q)
垢版 |
2019/02/21(木) 21:25:46.65ID:lsmx9sV60
とりあえず、Cできない娘は受付時に言うとか、ホームページにわかるようにしてくれないとキツイ。
2019/02/21(木) 21:49:34.71ID:hP/J64Xh0
ロジックはアタマの中に
2019/02/22(金) 11:10:49.03ID:Wvys6/Wz0
>192
「オッケーグーグル、『100以下の素数を表示するブログラム』を端末にダウンロードして!」
258デフォルトの名無しさん (アウアウウー Sa21-0aQJ)
垢版 |
2019/02/22(金) 15:27:06.91ID:bcwEHSMYa
С言語
2019/02/22(金) 15:32:39.50ID:MGDdaAr30
偶素数と奇素数
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況