トップページ⇒tech
1001コメント229KB

C言語なら俺に聞け(入門編)Part 75

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG?S★(532000)
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 74
http://hibari.2ch.net/test/read.cgi/tech/1290857610/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 144代目
http://hibari.2ch.net/test/read.cgi/tech/1291471791/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0153デフォルトの名無しさん2010/12/21(火) 12:33:25
規格票 >> [超えられない壁] >> K&R
0154デフォルトの名無しさん2010/12/21(火) 15:57:59
>>153が真理だな。
規格レベルで話せない奴に限って「K&Rを馬鹿にする奴は…ブツブツ」とか言う
0155デフォルトの名無しさん2010/12/21(火) 16:03:16
(・∀・)ニヤニヤ
0156デフォルトの名無しさん2010/12/21(火) 16:21:11
規格厨 対 K&R厨の戦いか。
どっちも見苦しいな
0157デフォルトの名無しさん2010/12/21(火) 16:23:34
脳内規格じゃないだけ随分とマシになったな
0158デフォルトの名無しさん2010/12/21(火) 17:25:38
n=4のとき、
****
***
**
*
このように表示するプログラムを書いているのですが、ここからどうしてもできません
どなたか教えていただけないでしょうか
#include<stdio.h>
int main(void)
{int n,i,j;
printf("三角形の一辺の長さを入れなさい.\n");
scanf("%d",&n);
for(i=1;i<=n;i++){
for(j=1;j<=i;j++)printf("*");
printf("\n");
}
}
0159デフォルトの名無しさん2010/12/21(火) 17:27:54
4桁の任意の数字があって、その中にある数字が含まれていることをif文であらわす
にはどうすればいいですか?
例えば、5345の中には5が2つある。みたいなのです。
0160デフォルトの名無しさん2010/12/21(火) 17:59:45
ふっふっ
0161デフォルトの名無しさん2010/12/21(火) 18:03:29
>>58
ばーーーーーーか
0162デフォルトの名無しさん2010/12/21(火) 18:05:37
>>158
for(i = n; i > 0; i--) {
for(j = 0; j < i; j++) printf("*");
printf("\n
0163デフォルトの名無しさん2010/12/21(火) 18:20:25
>>159
10で割った余りを数えていく
0164デフォルトの名無しさん2010/12/21(火) 18:58:18
>>159
sprintf()で文字列にして、文字として数える。
0165デフォルトの名無しさん2010/12/21(火) 18:59:14
ほっほっ
0166デフォルトの名無しさん2010/12/21(火) 19:06:43
http://9cguide.appspot.com/14-03.html
[7]文字列の比較 の2番目のプログラムで質問です
forの条件式でi < len + 1となっているのでif (i == len + 1)にはなることはないように思えます
このプログラムは文字列を比較するプログラムとして機能するのでしょうか?
0167デフォルトの名無しさん2010/12/21(火) 19:11:39
もう一度紙に書いて良く考えてみよう
0168デフォルトの名無しさん2010/12/21(火) 19:12:20
>>166
機能するかどうかは動かして試してみればいいじゃん。
ヒントを書いておくと、文字列の一致とは長さも一致している必要があるってこと。
0169デフォルトの名無しさん2010/12/21(火) 19:25:06
>>167-168
うーん、まぁまぁですね。
0170デフォルトの名無しさん2010/12/21(火) 19:31:18
breakに到達しなかった場合はどうやってfor文から抜けるのかな?かな?
0171デフォルトの名無しさん2010/12/21(火) 19:35:19
>>162
ありがとう!
0172デフォルトの名無しさん2010/12/21(火) 19:49:18
一応>>169は別人です

i++でiが12になってからi < len + 1で比較され、12(i)<12(len+1)と条件を満たさなくなり
i=12の状態でfor文を抜けるということでいいんでしょうか?
条件満たすi=11の段階でfor文を抜けると思っていました
0173デフォルトの名無しさん2010/12/21(火) 20:10:55
>>171
いえいえ
0174デフォルトの名無しさん2010/12/21(火) 20:13:09
ふっほっ
0175デフォルトの名無しさん2010/12/21(火) 20:43:55
ふっふっ
0176デフォルトの名無しさん2010/12/21(火) 21:12:21
最近の学生は問題出されると
すぐパソコンに向かってプログラミングしようとする
常識的に考えてフローチャートつくるのが先だろ。
話変わるがソースコードからフローチャートに変換できるツールってない?
自筆で図描くのめんどくさい
0177デフォルトの名無しさん2010/12/21(火) 21:27:15
>>176
書くべきはデータフローだろ
0178デフォルトの名無しさん2010/12/21(火) 22:22:17
>>172
for (A; B; C)

ABCBCB…
0179デフォルトの名無しさん2010/12/21(火) 22:51:13
>>152
K&R はダメだったけど
ANSI でもっとダメになった
C99 でさらに追い打ち

上のほうの人たちが C の何がいいのかをまるでわかっておらず
枝葉末節のために醍醐味をまき散らすように捨て続けてきた

スタック構造をダイレクトに書けるのはいいことで register 渡しまであったのはあれでよかったし
lint は lint で独自の差別化を競えたはずで芽を摘まれなければ今ごろ頼もしかっただろうし
const はせっかく新設までしといて逆がないから write only な論理をきれいに書けないままだし
void* も文法を汚してまで新設しといて予想外に使えないやつだった

long long は待望だったけど 0b や数値定数の空白継続は結局なし
auto 配列の初期化だの可変配列みたいないらんものを大量にマンダトリーにしちまいやがった
0180デフォルトの名無しさん2010/12/21(火) 23:39:31
文字があってその中のある特定の文字の数を数えるには
どのようにプログラムすればいいですか?
プログラムの例を載せてもらえると助かります。
0181デフォルトの名無しさん2010/12/21(火) 23:41:37
あとif文でお願いします
0182デフォルトの名無しさん2010/12/21(火) 23:44:27
void main(void)
{
char moji[]="aiueoaiueoaiueo";
int i,count=0;

for(i=0;moji[i]!='\0';i++){
if(moji[i]=='a'){
//aをカウント
count++;
}
}

printf("aは%d個でつ",count);
}

ばっちりでつ
0183デフォルトの名無しさん2010/12/21(火) 23:47:03
>>180

int charCount(const char* s, char ch)
{
if (*s == '\0')
return 0;
return (*s == ch) + charCount(s + 1, ch);
}

int main()
{
const char* s = "qwertyanxa";
printf("%d\n", charCount(s, 'a'); /* 'a'の個数を数える */
printf("%d\n", charCount(s, 't'); /* 't'の個数を数える */
return 0;
}
0184デフォルトの名無しさん2010/12/21(火) 23:48:37
ありがとうございます
0185デフォルトの名無しさん2010/12/21(火) 23:55:36
>>183
すげぇな。再帰的にカウントしてるなんてとてもじゃないけど思いつかない
カウントする対象の文字が全角だったらどうなるの
0186デフォルトの名無しさん2010/12/21(火) 23:57:40
文字コードが分かってるなら文字単位で再起処理すればいいだけじゃないかな。
スタックの心配はしなくていいか。
0187デフォルトの名無しさん2010/12/22(水) 00:04:13
int charCountSub(int count, const char* s, char ch)
{
if (*s == 0) return 0;
return charCountSub((*s == ch) + count, s + 1, ch);
}

int charCount(const char* s, char ch)
{
return charCountSub(0, s, ch);
}

スタックが心配なときは末尾再帰にすれば。
0188デフォルトの名無しさん2010/12/22(水) 00:05:51
>>187
よくみたらバグってるな。まあいいか。
0189デフォルトの名無しさん2010/12/22(水) 00:07:44
すげぇ
最近C言語とやらを勉強しだしておれにはこのスレ心強すぎる
0190デフォルトの名無しさん2010/12/22(水) 00:08:18
>>187
!!(*s == ch)
こうしなくていいっけ
0191デフォルトの名無しさん2010/12/22(水) 00:12:27
return 0じゃなくてreturn countかな。
0192デフォルトの名無しさん2010/12/22(水) 00:19:23
>>185
Cだけじゃなく関数型言語もやってみな
0193デフォルトの名無しさん2010/12/22(水) 00:45:50
なんでわざわざそんな分かりにくいコードを書くのかと小一時間
0194デフォルトの名無しさん2010/12/22(水) 00:51:45
>>192
関数型言語を勉強するのにオススメは何?
0195デフォルトの名無しさん2010/12/22(水) 00:58:02
Emacs Lisp以外で使われてる関数型言語とかあんの?
0196 [―{}@{}@{}-] デフォルトの名無しさん2010/12/22(水) 01:08:29
プロローグ
0197デフォルトの名無しさん2010/12/22(水) 01:13:05
Common Lisp
0198デフォルトの名無しさん2010/12/22(水) 07:12:50
186でいわれてるスタックの心配ってどういうこと。
スタック領域が飽和状態になって違う領域(ヒープ?)にはみ出てしまうという意味ですか。
初心者の俺には専門用語すぎてカオスすぎる
0199デフォルトの名無しさん2010/12/22(水) 07:15:51
スタックオーバーフローでっgr
0200デフォルトの名無しさん2010/12/22(水) 07:20:13
199
そのスタック領域をオーバーした先はヒープ領域で間違いないですか
0201デフォルトの名無しさん2010/12/22(水) 07:22:08
かんきょうによる
すたっくとひーぷのぽいんたがれんぞくしているとはかぎらない
そもそもひーぷというものがないかもしれない
0202デフォルトの名無しさん2010/12/22(水) 07:24:26
なるほどすっきり^q^
0203デフォルトの名無しさん2010/12/22(水) 08:56:34
コンソールプログラムでメモリを動的確保した時に、
コンソール画面を右上の×で閉じてしまったらメモリって解放されないですよね?
じゃあこの×を押したときに、解放するようにしたいのですが、
良い方法ないでしょうか?
WINAPIを使ったウィンドウのプログラムなら余裕なんですが、コンソールプログラムだと
方法がわかりません。
0204デフォルトの名無しさん2010/12/22(水) 09:02:14
>>203
本当に解放されない?
0205デフォルトの名無しさん2010/12/22(水) 09:03:53
ストリーム関数のエラーを拾って終了処理に移ればいいと思うよ。
0206デフォルトの名無しさん2010/12/22(水) 09:06:59
>>204
自動的に解放されるのでしょうか?

>>205
つまり、scanfとかで停止させている場合、その関数のエラーを
ウィンドウを閉じたと判断して、終了処理させるということですか?
0207デフォルトの名無しさん2010/12/22(水) 09:50:24
>>208
C言語なんてマイナー言語誰も使ってないよw
0208デフォルトの名無しさん2010/12/22(水) 10:09:46
ttp://www.dotup.org/uploda/www.dotup.org1310536.gif
0209デフォルトの名無しさん2010/12/22(水) 11:10:55
C言語はハッカー御用達
0210デフォルトの名無しさん2010/12/22(水) 11:31:20
ハッカー御用達はPerlじゃないの?
0211デフォルトの名無しさん2010/12/22(水) 11:31:40
if分が正常に行われなくて悩んでいます。
環境はVC++です。

{
float length=100;
float length2=200;
float lenlen=length-length2;

if(lenlen>=0){

return false;

}
return true;

}


なぜかfalseが帰ってきてしまいます。
0より小さいはずなのに
ちなみにlenlen>0としたら正常に動きました。

よろしくお願いします。
0212デフォルトの名無しさん2010/12/22(水) 11:38:57
>>211
どーせ書いた処理そのままのせてないんだろう
そんで実際の処理ではlenlenが0になってるんだろう
じっさいのコードでif分岐の直前にlenlenを出力してみたらどうだ?
0213デフォルトの名無しさん2010/12/22(水) 11:40:22
>>211
別のところで未初期化のポインタ使って何か書き込んでないか?
0214デフォルトの名無しさん2010/12/22(水) 11:42:45
>>211
馬鹿なんだから省略とかしちゃだめだよ
ちゃんと全部載せないと
0215デフォルトの名無しさん2010/12/22(水) 11:48:27
たしかに馬鹿なことしてました。
正常に動作してたのに別のところで勘違いしてたみたいでした。
すいませんm(_ _)m
0216デフォルトの名無しさん2010/12/22(水) 11:50:40
うむ、許してやろう
0217デフォルトの名無しさん2010/12/22(水) 12:15:03
>>203
プロセスが終了したら動的にとってきたメモリも解放されると思うけど。
0218デフォルトの名無しさん2010/12/22(水) 14:38:07
>>215
特別に許してやるよ
感謝しろww
02192152010/12/22(水) 15:17:27
>>218
どこの馬の骨とも分からないあんたにそんな事を言われる筋合いは
これっぽっちもないんですけど?
0220デフォルトの名無しさん2010/12/22(水) 15:23:31
ほっほっ
0221デフォルトの名無しさん2010/12/22(水) 15:29:40
ふほほほほほっほほほふfひいいひいいいいいいいいっじじじゃあああああ
02222152010/12/22(水) 15:58:28
キチガイ共乙
0223デフォルトの名無しさん2010/12/22(水) 16:30:01
ふっほっ
0224デフォルトの名無しさん2010/12/22(水) 16:49:14
あずにゃんペロペロ
0225デフォルトの名無しさん2010/12/22(水) 18:05:42
ヘッダファイルの存在価値が全然わからないんですが、何のために
あるんでしょうか?わざわざ別に作る必要ないですよね。
0226デフォルトの名無しさん2010/12/22(水) 18:21:43
ふっふっ
0227デフォルトの名無しさん2010/12/22(水) 18:22:45
>>225
非常に小規模な開発なら、その通り
0228デフォルトの名無しさん2010/12/22(水) 18:28:36
>>227
具体的に教えろ。
0229 ◆QZaw55cn4c 2010/12/22(水) 18:53:52
>>225
ひとつのプログラムを複数の c ファイルで構成するような場合に有用となります。
0230デフォルトの名無しさん2010/12/22(水) 19:20:30
必要ないんだったら一つのファイルにコード書いとけ
0231デフォルトの名無しさん2010/12/22(水) 19:23:52
>>230
説明できないんだ!?w
ばーか。w
0232デフォルトの名無しさん2010/12/22(水) 19:28:18
K&R読んでからもう一回来い
0233デフォルトの名無しさん2010/12/22(水) 19:29:00
>>229
意味がわかりません。
具体例を教えてください。
具体例のわかりやすさは異常。
0234デフォルトの名無しさん2010/12/22(水) 19:29:12
必要ないよ
0235デフォルトの名無しさん2010/12/22(水) 19:29:33
>>233
stdio.h
0236デフォルトの名無しさん2010/12/22(水) 19:30:13
お前ら釣られすぎだろw
0237デフォルトの名無しさん2010/12/22(水) 19:33:47
釣りでしたww
みんな引っかかってくれてありがとうww
0238デフォルトの名無しさん2010/12/22(水) 19:35:37
>>237
どこが釣りなのか教えてくれ
ヘッダファイルをどういうときに使うのか説明できないだろ
0239デフォルトの名無しさん2010/12/22(水) 19:43:40
ふっほっ
0240デフォルトの名無しさん2010/12/22(水) 19:46:10
まさに糞スレ
0241デフォルトの名無しさん2010/12/22(水) 19:50:10
煽って出るものでもない
0242デフォルトの名無しさん2010/12/22(水) 20:21:25
ほっほ
0243デフォルトの名無しさん2010/12/22(水) 22:15:45
ふっほっ
0244デフォルトの名無しさん2010/12/22(水) 23:35:26
どぴゅっどぴゅっ
0245デフォルトの名無しさん2010/12/22(水) 23:50:58
質問だがたとえばchar s[1000000000000];と宣言すると
その時点でスタック領域がオーバーして実行できなくなるが
これを解消するにはメモリを増設することが考えられますが
他に手はないですか
0246デフォルトの名無しさん2010/12/22(水) 23:59:59
>>245
メモリ増設してもムリじゃないか?
0247デフォルトの名無しさん2010/12/23(木) 00:05:04
違うのか汗
0248デフォルトの名無しさん2010/12/23(木) 00:07:22
そのサイズを確保するのは難しいと思うけど、
スタック領域をオーバーするような大きな配列はstaticつけるといいかもね。
0249デフォルトの名無しさん2010/12/23(木) 00:28:04
コンパイルオプションでスタックサイズを変更すればいいけど、その例は大きすぎてダメ。
0250デフォルトの名無しさん2010/12/23(木) 01:19:33
ふっふっ
0251デフォルトの名無しさん2010/12/23(木) 02:10:17
うちの研究所の共有メモリマシンを占有すれば、
ギリギリ取れるサイズだな。
0252デフォルトの名無しさん2010/12/23(木) 02:13:03
ひゃっふっ
■ このスレッドは過去ログ倉庫に格納されています