C言語なら俺に聞け 145
レス数が950を超えています。1000を超えると書き込みができなくなります。
>>898
それ 256 という定数を変えるとき、いちいちレテラルの中を手書きで直すんですか?
いけてないですね… 入力バッファにちょっとゴミが混じるだけでscanfは使えなくなる。
そんな役立たずは、業務では使うべきではない。使うなら、fgetsとsscanfの方がいい。
我が国のコンピューター教育は残念ながら、業務では役に立たない言語を教えている。 むしろ余程プアな環境でない限り、業務でC言語は使うべきではない >>905
心配しなくても使われる所は限られてるよ。
OSそのものとかデバイスドライバとかな。
それも減りつつあるんじゃないかな。
まあしかし過去の資産がありすぎて捨てられないって感じか。
うまいこと互換性を保ちつつ次の段階へ行ければいいんだろうけどね。 MCUはほとんどがC言語
たまにC++
たまにアセンブラ >>899
その受け取ったデータをどう使うかによる >>914
ばかに見えるから止めた方がいいと思うよ 入力された文字列(例えば10文字程度)を、
数字だけ*に変えるプログラムを作りたいと思ってるんですが、
どうもうまく行きません
どなたか簡単なコード書いてくれませんか >>918
数字は半角の「*」でいいの?
それとも全角の「*」?
それによって処理の複雑さが変わる ああ、あと入力された文字列にはマルチバイト文字が含まれるのか、1バイト文字なのかも明確にしとかないとな >>918
お前さんが書いたコードをあげれば誰か添削くらいはしてくれるかもよ 入力部分には>>897を使わせてもらった
#include <stdio.h>
#include <string.h>
void mask_num(char *s)
{
char *c;
for (c = &s[0]; *c != '¥0'; c++)
{
if (*c > '0' && *c < '9') *c = '*';
}
}
int main()
{
char line[64];
fgets(line, sizeof(line), stdin);
strtok(line, "¥n");
mask_num(line);
printf("%s¥n", line);
return 0;
} プログラムのコードの話してるのに全角は無いわ。
データの話ならむしろ文字コードとかまで考えなきゃならんがな。 >>923
>if (*c > '0' && *c < '9') *c = '*';
if (*c >= '0' && *c <= '9') *c = '*';
だった >>918
を見て「*」を「*」に勝手に読みかえるようじゃ
受け入れ試験時で不具合が見つかって大幅手戻りが発生するぞ void mask_num(char *s)
{
while (*s) {
if (isdigit(*s)) *s = '*';
s++;
}
} 入力して変換して出力するだけでいいならこうかな。
#include <stdio.h>
#include <ctype.h>
int main()
{
int c;
while ((c = getchar()) != EOF)
if (isdigit(c))
putchar('*');
else
putchar(c);
return 0;
} >>926
しかしながら「数字を*に変えるプログラム組んどきましたよ」と言って
本当にASCIIの '*' でなくマルチバイトの "*" に変える処理だったら
発注側から「普通全角はないだろ、お前さん常識ないのか?」と
発言者にとって都合の良い「普通」「常識」の波状攻撃を受けるハメに。
その意味で >>919 と >>920 の態度は正しい。
世の中には自分のミスを認めたくない人もいるけどな。 今回の発注者は>>918だから注意喚起として * じゃないの?
って確認するのは正しいけど全角半角言うならむしろ数字と言うのが半角だけでいいのかを確認した方がいいかと
下手すると 壱萬弐仟参佰四拾伍 が変換されてないじゃないかとか言われるかも知れんし >>924
プログラムのコードの話なんてどこに書いてある? すいません遅れました
添削おねがいします
#include <stdio.h>
void num_star(char *p)
{
while (*p)
if(*p >= '0' && *p <= '9')
*p++ = '*';
}
int main(void)
{
char ch[10];
printf("文字列を入力せよ\n");
scanf("&s",ch);
num_star(ch);
printf("%s\n", ch);
return 0;
} >>933
scanfに"&s"は間違い"%9s"だ
if(*p >= '0' && *p <= '9')は標準関数でif(isdigit(*p))とできるのに勿体ない
p++はifの条件が偽のときに実行されなくなっている 数字以外の文字だけ入力されたら無限ループになって終わらないね。 >>934
関数コールは遅いしサイズも増える
標準ライブラリを全てリンクしてるかわからない
わざわざC言語を使う場面ていうのは
そういうことも多少は心配した方が良いこともある >>936
>標準ライブラリを全てリンクしてるかわからない
必要なものをリンクすればいいし、必要なものをリンクするように出来ているのでは? リンクしない選択をすることもあるのだよ
色々な理由で
特にわざわざC言語を使うような環境では >>936
> 標準ライブラリを全てリンクしてるかわからない
リンク? インプリメントの間違いだろ
何をリンクして何をリンクしないのかは
組み込みでは厳密に指定し結果も確認する
isdigitにはマクロバージョンもある
おそらくお前さんはそんなん知らんと言うだろうな
総じて、現物のコンパイラを細かくいじるということをせずに
上っ面だけ使って満足している手合いか >>936
そういう話は最低限の基本ができてから教えれば十分なことで、始めたばかりの初心者にあれこれ言ってかえって混乱させるのは良くないかと。 >>940
isdigitの指す文字が’0’〜’9’だけとも限らないからな(事実上は問題にならないとしても) digitの定義はlocaleに依存するので制御可能。
基本的にはisdigitが妥当だろうね。
自前でテーブル定義してもよい。大小で判断するのは危険だね。 >>944
> 大小で判断するのは危険だね。
危険だと思う理由は?
'0'〜'9' が連続してることは規格で保証されてる >>945
その規格とやらの文書番号は?
つまり何の規格かと >>946
X 3010:2003 (ISO/IEC 9899:1999)
5.2.1文字集合
ソース基本文字集合及び実行基本文字集合の双方において,10 進数字に関する上の並びにおいて,0 の右側に並んでいる各文字の値は,一つ左側にある文字の値に比べ 1 だけ大きくなければならない。 >>947
あれ本当だ
ということはCの翻訳環境でも実行環境でも
採用を禁じられる文字集合規格がありうるってことか
なんか出過ぎた決めごとだな >>948
> 採用を禁じられる文字集合規格
そんなもの見たことない >>949
「0 の右側に並んでいる各文字の値は,一つ左側にある文字の値に比べ 1 だけ大きく」なっていない文字集合は思いつけませんね…
ftp%3A//ftp.software.ibm.com/software/globalization/gcoc/attachments/CP00037.pdf >>949
いや俺も見たことないけどさ
それはASCII系が絶対的とでも言うほどの多数派で
遙かに遅れたEBCDICもそうなっているからだろ
科学的にそう規定すべき合理性あるか? [[['[] ]]] { {] ]][ '[][][] [][] [][][] [] '[] [] >>951
自分の回りにないならあるものを前提にするのはあたりまえ
そもそも連続してないことにメリットがあるとは思えないし >>951
BCD計算が出来なくなるからCOBOLが動かなくなるわな
CPUの時点で排除しているのは6502系ぐらいじゃね? 再帰関数を使って次の問題の会を出すプログラム書いたんですけど、なんかミスばっかでダメなので、だれかどういうプログラム書けばいいのか教えてもらえませんか?
九つの椅子が
○○○
○○○
○○○
のように並んでおり、はじめに数字の書いた札を持った何人かが座っているとする
例
○○5
○9○
12○
さらに他にも何人か数字の書いた札を持った人がいて、その人たちが空いてる席に順番に座って行くとする
全員座った後、それぞれの点数を数えるとする、ただし点数は前後左右の人が持ってる札の数字を足し算する
例
○○5
○9○
12○
で 3さん→4さん→7さん とすわり
○75
493
12○
となった、9の点数は7+4+3+2
この時、それぞれが自分の点数を常に最大になるように座ったら最終的にはどういう配置になるでしょう?ただし
・それぞれは座る順番を知っている
・その次に座る人達がどこに座るかまで考慮に入れて考える
・自分以外の点数は気にしない
・誰もいないところは0
・次の人が何箇所か座る候補があり絞れない時は常に予想図の最小値をとって考えるとする、つまり極端にリスクを恐れる >>954
この2行にアホが詰まってる
会話の内容も実際の動作も用語もわかってないっていう >>955
面白そうなテーマだから、お題スレに投げてみるのがいいのではないかと誘導
プログラミングのお題スレ Part10
http://mevius.2ch.net/test/read.cgi/tech/1514772904/ >>942
いやだから、
>>934の真ん中がいらないっていう話 形式
#include <ctype.h>
int isalnum(int c);
int isalpha(int c);
int iscntrl(int c);
int isdigit(int c);
int isgraph(int c);
int islower(int c);
int isprint(int c);
int ispunct(int c);
int isspace(int c);
int isupper(int c);
int isxdigit(int c);
機能説明
上記にリストされている関数はすべて ctype.h 内で宣言されており、指定されている整数値をテストします。
c で適切な整数値は、unsigned char または EOF として表現可能なものです。
デフォルトで、これらの関数は ctype.h がインクルード されている場合はマクロとして定義されます。
パフォーマンスを良くするために、関数形式よりマクロ形式を使うのが適切です。 >>962
そういえばそれって locale 考慮すると言っときながら unsigned char でしか
判定してくれないというなんとも言えない仕様だよな。マルチバイトの判定が
できない。まあそんな拡張したら面倒な感じはするのでそのままでもいいが。 C99以後はinlineがあるんだがID:1MVwzpIAdはC89前提?それともK&Rかね >>953
数字が連続していないことにメリットがあるとは思えない
という思考回路では
英字が連続していないことにメリットがあるとは思えるのか?
具体的にどんな? どんな環境かわからないんだからどんな環境でも動くコードが良い レスが長文化してるやつは効いてる効いてるwだが
逆もまた真なり
情報量が非常に乏しいレスしかしなくなったやつw >>969
> 英字が連続していないことにメリットがあるとは思えるのか?
おそらくEBCDICのことを言ってるんだろうけどあれはパンチカードフォーマットから変換しやすくするような体系になってるだけの話 >>961
何ら有益な情報を書けない。只の荒らしでしょ。 今更で悪いけど、文字はまず集合として扱うのが筋だからさ。
大小比較したいなら、一度数値に直せばいいじゃんと思うよ。これについては規格上の正しさという話ではなくて、抽象的な意味にこだわらないと保守性下がるというのが実感としてあるから言うとるのよ。 「こういう仕様になっているのはこういう理由だからだ」という設問
あるいは「もしこういう仕様だったらこういう問題があっただろう」という反実仮想的設問には意味があると思っているから、そういう話で盛り上がる今はありがたいと思っています >>974
元はおれの文
1行でアホが詰まってると、本気で感心した時に書いた >>978
最近のBOTは優秀になったのね。CNTKか何かか? >>974
関係ないことを堂々と書く奴に言われてもな w 数字なのに1足されてないというと、Unicodeでの漢数字かな。 [[[ ][ ]]]\[[]] [[[]]]],[[[ [][] ] O(n)のin-placeなセレクティングネットワーク
O(n)のin-placeなマージアルゴリズム
O(n)のin-placeなマージングネットワーク
O(n log n)の(実用的な)ソーティングネットワーク
は存在しますか?
ここらへんがあると並列ソートがかなり捗るんだけど。 [[[ []]]]*[[ [][] ][] } } {} [[[ こんにちは
c言語で質問です
写真の通りのプログラミングを書きたいのですができません
*などで四角形は作れるのでそれを応用するのだと思うのですが、2段目以降を違うのにするやり方がわかりません
どなたかお願いします。
https://i.imgur.com/09EKR0n.jpg >>986
数学で数列は習ったかい? 一般式で表してそれを二重のforループにするだけだ。 二重ループよりも二個関数作った方が将来のためになるかもな 数列を極めるには、差分法が役に立つが、今ではかなりマイナーな数学分野になっている。 差分法は、微分法の兄弟みたいなもので、差分法の極限をとると微分法になる。 差分法は、研究分野としてはマイナー。差分方程式は地球上ではもうだれも研究していないのではないか。 別に小難しい数学の知識とかいらなくね?
a = 6, b = 4だとして、
ary = malloc(sizeof(int) * a * b);
for (i = 0; i < a; i++) {
for (j = 0; j < b; j++) {
v1 = (i == 0 || j == 0) ? 0 : ary[i - 1][j - 1];
v2 = (i == 0) ? 0 : ary[i - 1][j];
v3 = (j == 0) ? 0 : ary[i][j - 1];
ary[i][j] = v1 + v2 + v3;
}
} いやいや、教科書的にはこうでしょ
for (i = 1; i <= b; i++) {
for (j = 1; j <= a; j++) {
v = j;
for (k = 1; k < i; k++) {
v = v * j;
}
printf("%d, ", v);
}
puts("");
} >>994はなんか勘違いしてたw
b<=2までしか合わんかったわw >>986
2番目の値だけ抜き出すと 2, 4, 8, 16 となっているので、一つ前の値を2倍にしている。
3番目の値だけ抜き出すと 3, 9, 27, 81 なのでひとつ前の値を3倍にしている。
4, 5, 6 番目も同様。
ということは、a の入力の個数だけ要素を入れられる配列を作っておいて、その各要素に
1 〜 a の値を一つづつ入れておいて、その後 b の回数だけループしながら出力して
掛け算してを繰り返せばいい。プログラムにするとこうなる。
https://paiza.io/projects/EIvP4vpEHRgWnXFlka5Vjg 配列でひとつ前の値を保持したくない場合はpow()使って計算するという方法もある。
https://paiza.io/projects/_L8doEZwIG6g0imlZM_Fug
pow()使いたくない場合はループして掛け算を自分でやる。 別に小難しい数学の知識はいらんけど>>994が頭悪いのを晒したのはイタかったな
普通なら恥ずかし過ぎてもうこのスレ覗くこと出来ないレベル レス数が950を超えています。1000を超えると書き込みができなくなります。