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

おまいら!今日からC言語を学んでいくぞー!

■ このスレッドは過去ログ倉庫に格納されています
0001ポポ素 ◆Qgm8RFT0/. 2005/09/24(土) 03:54:30
あたいのスペックは
26歳フリーター、パソコン歴インターネット歴は6年
しかしそれ以外の事は何もできにゃーい…
というわけで今日から参考書を買ってがんばります!
今まさに私みたいに、これからCを勉強するぞって人いたら
よろしくね
0159デフォルトの名無しさん2005/09/26(月) 18:00:15
>>158
returnという関数の呼び出しに見えてしまうから気持ち悪いと言う説が濃厚
その他Lispとは違うんだから括弧は少なくしろと言う説もある
0160デフォルトの名無しさん2005/09/26(月) 18:01:08
括弧は無いのが多数派のような気がするけど、
全部につける人も普通にいるし。

return (a + b);

みたいな計算結果返すんだったらつけたくなるなな
べつにあんま気にしなくてもいいと思うよー。
0161デフォルトの名無しさん2005/09/26(月) 18:03:05
括弧の有無がそんなに重要か?
0162デフォルトの名無しさん2005/09/26(月) 18:04:06
マメ知識

retarn 0; //構文エラー
retarn(0); //リンクエラー
0163デフォルトの名無しさん2005/09/26(月) 18:05:33
>>159>>160
良い意見有難う御座います。
すごく参考になってやる気でますよ(^^;
0164デフォルトの名無しさん2005/09/26(月) 18:07:10
>>162
参考にさせて頂きますよ(`・ω・´)
0165デフォルトの名無しさん2005/09/26(月) 18:15:33
#include<stdio.h>
int main(void)
{
int i,goukei,heikin;
goukei=0;
heikin=0;
for(i=1;i<=50;i++){
goukei=goukei+i;
heikin=goukei/i;
}
printf("1〜50までの和は%dです\n",goukei);
printf("平均は%dです\n",heikin);
return0;
}
できた〜(゜ー゜;Aアセアセ
今度は完璧だぜ!( ´ー`)
0166デフォルトの名無しさん2005/09/26(月) 18:19:16
>return0;

空白をいれましょう。
でないと、コンパイラが[retun]と[0]なのか、
[return0]という変数などなのか、迷います。
0167デフォルトの名無しさん2005/09/26(月) 18:20:37
heikin=goukei/i;
をループのそと(うしろ)に
0168デフォルトの名無しさん2005/09/26(月) 18:22:03
>>166
もともとタブが入ってて書き込んだ段階で消えただけじゃね?
01691672005/09/26(月) 18:22:50
ああすまん。外に出しただけでは駄目だ
heikin=goukei/50;
ね。
平均は整数値でいいの?
0170デフォルトの名無しさん2005/09/26(月) 18:22:56
平均の求め方は、合計を最後に50で割ればいいんでないかい?
for文からは出すんだ!
0171デフォルトの名無しさん2005/09/26(月) 18:24:03
寝起きで
hentai=gouki/i;
に見えた
0172デフォルトの名無しさん2005/09/26(月) 18:24:08
>>165
ガウスの法則って知ってる?
1から100000000でも真面目に足すの?
それに平均を毎回求める必要ないんじゃ?最後の一回だけで。
0173デフォルトの名無しさん2005/09/26(月) 18:25:01
ああ…遅レスすまん
0174デフォルトの名無しさん2005/09/26(月) 18:25:23
>>166
そうでしたか…難しい('A`)

>>167
そうした方が処理回数が減るからという事だからですか?

>>168
自分のミスですた…orz
0175デフォルトの名無しさん2005/09/26(月) 18:25:31
>>165
goukei = goukei + iはgoukei += iとするべき

おそらく作成者の意図はgoukeiにiを加算したいのであってgoukei+iをgoukeiに代入したい訳ではないから
あと、左辺値に副作用があったり、マクロだった場合にどんな動作するか考えるの面倒だからこの記述になれるほうが良い
0176デフォルトの名無しさん2005/09/26(月) 18:33:12
>>169
平均はdobleかflotのがいいんですね!!
 
>>170
for文難しいですよ…

>>171
ワラタw

>>172
応用力というものが足りない事にきずきましたよ('A`)

>>175
高度な意見なので分からない事がありますが、加算するときは
そのようにするのですね!!有難う御座います
0177デフォルトの名無しさん2005/09/26(月) 18:33:13
>>174
処理回数が減るってのはもちろんだけど、
“計算しなくてもいいものは計算しない”は基本中の基本だからね。

平均なんて最後にまとめて計算すればいい話であって
50回計算する意味はないでしょ?

毎回表示したいとか、そういう理由があれば別だけど。
0178デフォルトの名無しさん2005/09/26(月) 18:35:20
>>177
なるほどそういう事ですか!
短く分かりやすいプログラムにしろという訳ですね
勉強してきます(゚∀゚)
0179デフォルトの名無しさん2005/09/26(月) 18:38:11
>>178
という事で、もう一度作り直してください
0180デフォルトの名無しさん2005/09/26(月) 18:43:14
>>179
予想外のフリが…Σ(゚д゚;) ヌオォ!?
ですがプログラムのコピーになってしまうので、
また新しい関数で何か作ってみるので判定して下さい!!
よろしくお願いします<(_ _*)>
では勉強してきまつ
0181デフォルトの名無しさん2005/09/26(月) 18:44:37
>>180
じゃぁ、1+3-5+7-9+11-13+・・・
を50回計算した合計を出力するプログラムを。
0182デフォルトの名無しさん2005/09/26(月) 18:46:45
>>181
やってみます!!
が…む、難しい予感が…
数学苦手だった〜('A`)
0183デフォルトの名無しさん2005/09/26(月) 18:49:32
>>182
じゃあ、ヒントだ
1 3 5 7 9 11 13...これは+2づつ増えている
a=1の時a *= -1を繰り返し実行すると1,-1,1,-1となる


0184デフォルトの名無しさん2005/09/26(月) 18:51:29
>>183
なんとなく分かってきましたよ(`・ω・´)
0185デフォルトの名無しさん2005/09/26(月) 19:13:45
いい感じの流れになってきたな
みんなガンガレ!
0186デフォルトの名無しさん2005/09/26(月) 19:15:56
#include <stdio.h>
int main(void)
{
int i,goukei;
goukei=0;

for(i=1;i<=50;i++)
{
if(goukei==4*i){
goukei+=goukei+i;
}
else if{
i=i*(-1);
goukei+=goukei+i;
}
printf("%d\n",goukei);

return 0;
}
うおぉぉぉ〜むちゃくちゃ怪しいプログラムになってしまた
見にくいですが判定をお願いします…('A`)
01871862005/09/26(月) 19:18:31
まずい!!やっぱりみないで下さい!!
なんつ〜もん晒してんだ漏れは…_| ̄|○
0188デフォルトの名無しさん2005/09/26(月) 19:44:57
>>183
#include <stdio.h>
int main(void)
{
int i,goukei;
goukei=0;

for(i=1;i<=50;i++)
{
if(goukei==4*i+1){
i=i*(-1);
goukei+=goukei+i;
}
else{
goukei+=goukei+i;
}
printf("%d\n",goukei);

return 0;
}
できたかも!!(`∀´)
0189デフォルトの名無しさん2005/09/26(月) 19:58:57
>>181
最初の1と3が共に正の数だからうまく交互に行いにくいな。

>>188
エラーが出た。中カッコがいくつか足りない。
0190デフォルトの名無しさん2005/09/26(月) 20:04:08
>>189
エラーですか…そうなんですよ符号を考えるのが
難しいんですよ。
01911902005/09/26(月) 20:06:35
for文の終了の中括弧がないですね
0192デフォルトの名無しさん2005/09/26(月) 20:18:11
もうひとつヒント
合計に加える値とループのカウンタは別にしても良い

ちなみに元のままだとelse以下がおかしい
0193デフォルトの名無しさん2005/09/26(月) 20:21:20
>>189
えっ 1を入れないで50回じゃないの?
01941892005/09/26(月) 20:22:23
とりあえず俺もやってみた。最初の1はtotalに代入してあるから繰り返し回数は49回。
変数aのトレース付き。

#include <stdio.h>
void main()
{
int a=1, i, total=1;
for(i=0; i<49; i++){
if(a >= 0){
a += 2;
printf("%d ", a);
total += a;
a *= -1;
}
else{
a -= 2;
printf("%d ", a);
total += a;
a *= -1;
}
}
printf("合計=%d\n", total);
}
01951902005/09/26(月) 20:23:25
>>192
>合計に加える値とループのカウンタは別にしても良い
この見極めが難しいですね!(´・ω・)

>ちなみに元のままだとelse以下がおかしい
これはやはりfor文の括弧を付けていないせいですよね?
01961902005/09/26(月) 20:27:01
>>194
天才じゃないっすか(゚д゚lll)
何だったんだ!?漏れのへぼいプログラムは…orz
0197デフォルトの名無しさん2005/09/26(月) 20:32:09
プログラミングはじめてみようと思うのだけど
まず、どんなことから始めれば?
0198デフォルトの名無しさん2005/09/26(月) 20:33:44
>>194
#include <stdio.h>
int main()
{
  int i, total=1, n=3, f=1;
  for (i=0; i<49; i++) {
    total += n*f;
    n+=2;
    f*=-1;
  }
  printf("%d\n", total);
  return 0;
}

これだけでいいよふな
0199デフォルトの名無しさん2005/09/26(月) 20:35:28
>>195
よく見ると他にも間違ってるな、意図を推察して直してやるとこんな感じか?
else以下が違うんじゃなくて条件自体がまずいな

7:if(goukei==4*i+1){ → if((i & 1)==1) {
8:i=i*(-1); → 要らない
9:goukei+=goukei+i; → goukei += 2 * i;
12:goukei+=goukei+i; → goukei -= 2 * i;
0200デフォルトの名無しさん2005/09/26(月) 20:39:16
>>197
まずなんの言語を学びたいかじゃないかな…
あ、ここに書き込んでるってことはCかな?
02011902005/09/26(月) 20:39:49
>>199
・・・・・結局はほとんど違いますね
goukeiの初期化=1にすれば簡単なんですよね
02021892005/09/26(月) 20:45:51
>>196
プログラムの打ち方なんて人それぞれだって。
藻前の個性的なコードとてちゃんと動作すれば何ら問題ないし。むしろ、処理追ってみて少し楽(ry

>>198
3からは計算で求めたかったんで。といっても1を代入してる時点でもう駄目だなorz
02031902005/09/26(月) 20:54:03
>>202
動作するようにガンバリます!
いろいろ見てくださってありがとう御座いました
C言語は意外と面白いと思えただけでもとてもよかったです。
0204デフォルトの名無しさん2005/09/26(月) 20:56:26
#include <stdio.h>

int main()
{
  int i, total=1;
  for (i=1; i<50; i++) {
    total += (i*2+1) * ((i%2) ? 1 : -1);
  }
  printf("%d\n", total);
  return 0;
}

符号も絶対値も i から求めたい…
02051892005/09/26(月) 21:06:24
>>203
コツとしてはTabキーで字下げをすること。{}のペアや範囲が分かりやすくなって全体的に読みやすくなる。(2chに書く時はスペースに直す必要有
メモ帳なんかは改行すると字下げが解除されるから、他のエディタを使うことをお勧めする。
02061902005/09/26(月) 21:17:16
>>205
スペース使うんですか?なぜか整ってしまっておかしいなとは
思っていたんですよ。{}の使い分けをしっかりしてみます。
02071892005/09/26(月) 21:47:49
互いに問題出し合って解いていくのも結構いいかも。参考書開いて黙々とやってるより全然面白い。

という訳で俺から一つ。
整数を5つ入力し、それを数値の多い順にソートするプログラムを作成。
ヒント:3重ネスト
0208デフォルトの名無しさん2005/09/26(月) 22:02:44
>>181
#include <stdio.h>

int main()
{
    printf("%d\n", (1-2*25));
    return 0;
}
0209デフォルトの名無しさん2005/09/26(月) 22:08:57
>>208
2*25=50
1-50=-49
0210デフォルトの名無しさん2005/09/26(月) 22:15:11
■出題まとめ
>>42 HelloWorld!を出しやがれ
>>44 1から50までの和
>>46 ファイルから読み込み大きい数から並べて
>>52 物体が通る軌跡を求めろ
>>106 まずは字句解析と行こうか
>>181 じゃぁ、1+3-5+7-9+11-13+・・・を50回
>>207 ソートするプログラム

■インデントする方法
・メモ帖・秀丸・VSなどの、エディタの置換機能を使います
・& nbsp; (←&とnの間スペースを削ってくれ)を書き込むとスペースに変換されます
・タブやスペースを& nbsp;に置換して書き込むとインデントが整います
▼コツ
・タブを置換したい場合はエディタ上のタブをコピーして検索窓でペーストします
・スペースを置換したい場合はインデントに利用している単位(2,4,8個など)をまとめて
 置換すると最小限で済みます。
 2ちゃんねるの文字数制限にひっかかる場合は試してみてください。
0211デフォルトの名無しさん2005/09/26(月) 22:16:46
>>209
違うのか?
0212デフォルトの名無しさん2005/09/26(月) 22:22:05
1
+3 1回目
-5 2回目
+7 3回目
-9 4回目
+11 5回目
-13 6回目

1回目と2回目を足したら-2
3回目と4回目を足したら-2
というふうに奇数回目とその次の数を足せば-2になる

全部で50回計算するので奇数回目と偶数回目を足したものが25個ある
つまり-2が25個ある

よって-2*25

もともと1があるので
1+(-2*25)
=1-2*25
0213デフォルトの名無しさん2005/09/26(月) 22:22:59
スペースを
  自動変換
    ギコナビかな
       
0214デフォルトの名無しさん2005/09/26(月) 22:38:32
スペースを に変換するプログラムを作ったらどうだw
0215デフォルトの名無しさん2005/09/26(月) 22:40:32
ミスった
スペース・タブを&nbsp;に変換するプログラムを作ったらどうだ
0216デフォルトの名無しさん2005/09/26(月) 22:43:07
>>214-215
&amp;を使えばいい。
0217デフォルトの名無しさん2005/09/26(月) 23:31:24
確かに、
char[] nbsp;
pchar = &nbsp;
とかだとスペースになっちまうなw
0218デフォルトの名無しさん2005/09/26(月) 23:49:58
&&&&t&e&s&t&
0219デフォルトの名無しさん2005/09/26(月) 23:51:35
&ってどういう効果?
0220デフォルトの名無しさん2005/09/27(火) 00:11:44
ポインタ、論理和
0221デフォルトの名無しさん2005/09/27(火) 00:19:24
あ、ごめんなさい&のことです
0222デフォルトの名無しさん2005/09/27(火) 00:26:29
>>214
先生、それは課題でしょうか?
もう少し詳しくお願いします
0223デフォルトの名無しさん2005/09/27(火) 01:26:00
>222

>スペース・タブを&nbsp;に変換するプログラム
" "
0224デフォルトの名無しさん2005/09/27(火) 01:26:55
>>147
遅くなってしまったが、次は構文解析だな

以下のBNF生成規則にそった代入文のパーサを作る

<代入文> := 名前 = <式>
<式> := <式> + <項> | <式> + <項> | <項>
<項> := <項> * <要素> | <項> / <要素> | <要素>
<要素> := ( <式> ) | 名前 | 定数

解析結果は<代入文>をルートとする木構造とし、<演算子, 被演算子1, 被演算子2>のノードで出力する
被演算子がノードになる場合はN(ノード番号)を出力する
0225デフォルトの名無しさん2005/09/27(火) 01:28:13
ごめんなさい
うまく書けなかったのでもう一度書きます
 & a m p ; ってどういう効果ですか?
0226デフォルトの名無しさん2005/09/27(火) 01:28:54
>210
ゲームとかもっとあがってないか? 出題
0227デフォルトの名無しさん2005/09/27(火) 01:29:57
&amp;→&
0228デフォルトの名無しさん2005/09/27(火) 01:31:47
>225
アンド
0229デフォルトの名無しさん2005/09/27(火) 01:42:06
214じゃないけど、課題っぽくしてみた。
いきなりファイル関係をいじるのは難しいかもしれない。ファイルの読み込みは必須だけど、書き出す処理はやめて画面に出力でもかまわない。
猫でもわかる(ryのC++講座にprintfやputsでファイルに出力する方法が書いてある。

ソースファイル中のHTML特殊文字をエスケープするプログラムを作成する。
・起動したらファイル名を入力
・&はamp、<はlt、>はgt、[半角スペース]はnbsp。タブ(\t)は4文字の半角スペースとする。
 例 <→&lt;
・出力するファイル名は、ソースファイル名+".txt"。
参考
・ソースを丸ごとメモリに読み込まない。長いソースでは問題が起こる。1文字ずつ読み込んで書き出す。読み出した文字はchar型の値に代入する。
余裕があれば
・Windows環境だと2バイト文字に問題がある。2バイト文字の上位8ビット(=1バイト)が0x90より大きいなら下位8ビットはエスケープしないこと。
 ちなみにchar型やbyte型の大きさは1バイト。つまり、次に読み出す文字のエスケープ判定をしなければOK。
・入力されたファイル名が正しいか(ファイル名に使えない文字がないか)調べる。
・出力するファイル名がすでに存在しないか調べる。
・上書きするか中断するか選ばせるのも手。yなら上書き、nなら中断、それ以外ならループ。
・"や'もエスケープする。
・エスケープした文字数をカウントしたり、出力したバイト数を計算したりして、出力後結果を表示。

ヒント
fopen fclose fgetc(要キャスト) fputc fprintf
0230デフォルトの名無しさん2005/09/27(火) 01:47:02
だぁーミスった
×0x90より大きい
〇0x80から0x9F、0xE0から0xFF
0231デフォルトの名無しさん2005/09/27(火) 01:54:02
案外奥が深いなw
ここを参考にするといい
ttp://www9.plala.or.jp/sgwr-t/lib/fgetc.html
0232デフォルトの名無しさん2005/09/27(火) 01:55:04
そーいえば、○×ゲームって作るの難しいの?
人vs人のやつ。
0233デフォルトの名無しさん2005/09/27(火) 02:03:40
>232
そんな難しくない方

たてよこななめに並んでいるかどうかを判定する、ってのがこのプログラムのキモ
0234デフォルトの名無しさん2005/09/27(火) 02:16:52
>>233
それが問題かー。どうやって判定するべきか・・・。
0235デフォルトの名無しさん2005/09/27(火) 02:22:58
深く考えなくていいとオモ。
碁やオセロならまだしも、TicTacToeぐらいなら力業でif分並べたって8回の判定で済むんだし。
ループを使って横判定、縦判定、で最後に手動で斜め判定が一番楽かな?
0236デフォルトの名無しさん2005/09/27(火) 02:24:30
全体的な流れは

・3×3の配列を作る --- 例) int tbl[3][3];
・○は1、×は2、何も置いてない所は0 とかってする

・指定した場所に置く時に0かどうか判断して、置けるなら置く
・たてよこななめのどれかで3つ並んだかどうかチェック
・まだ空きが有るかつどちらも3つ並んでなければ、場所指定に置く所から繰り返し

って感じ
0237デフォルトの名無しさん2005/09/27(火) 04:48:28
http://gamdev.org/up/img/3427.phps

○×ゲームつくりました
0238まとめ2005/09/27(火) 05:29:49
■参加方法
解きたい→うp
出したい→うp
■今までに出された問題
>42 HelloWorld!を出しやがれ
>44 1から50までの和
>46 ファイルから読み込み大きい数から並べて
>52 物体が通る軌跡を求めろ
>106 まずは字句解析と行こうか
>124 神経衰弱、ブラックジャック
>125 ぷよぷよ
>126 ブロック崩し、インベーダ
>129 ジャンケンゲーム
>181 じゃぁ、1+3-5+7-9+11-13+・・・を50回
>207 ソートするプログラム
>215 スペース・タブを&nbsp;に変換
>224 次は構文解析だな
>229 HTML特殊文字をエスケープ
>236 ○×ゲームをつくれ
■インデントする方法
・&nbsp;を書き込むとスペースに変換されます
・タブやスペースを&nbsp;に置換して書き込むとインデントが整います
・メモ帖・秀丸・VSなどの、エディタの置換機能を使います
▼コツ
・タブを置換したい場合はエディタ上のタブをコピーして検索窓でペーストします
・スペースはインデント単位(2,4,8個など)でまとめて置換すると単独のスペースを無視できます
・ギコナビなら自動変換機能があります。
0239デフォルトの名無しさん2005/09/27(火) 05:38:19
トランプ系ならまずカードをどうやって表現すっかだな
ジョーカー除いて台札は4×13=52枚
&sp; 種類が4(スペード,ハート,ダイヤ,クラブ)
&sp; 数字が13(A,2,3,...,10,J,Q,K)
0240デフォルトの名無しさん2005/09/27(火) 05:39:51
↑ & n b s p ; ってしないとダメなのか orz
0241デフォルトの名無しさん2005/09/27(火) 05:44:00
すいません
私も入門書を読み終わったところなのですが
http://www.loses.org/software/xaav.htm
このソースが全然読めません
読めないというか意味すら分かりません
ここで始めてる皆さんは分かるのでしょうか?
0242デフォルトの名無しさん2005/09/27(火) 05:51:05
ttp://www.loses.org/download/xaaview.c
の事かな?

> X Window System
> MonaFont

こーゆー環境で動かすもんだ、って以外に特に難しいプログラムでは無いと思うが
初心者にはきついな

02432412005/09/27(火) 05:53:58
すいません
http://www.loses.org/download/xaav-0002.tgz
こっちです
0244デフォルトの名無しさん2005/09/27(火) 05:57:06
>>243
読めないと言われてもなぁ。
とりあえずプログラミング言語ってのは英語や日本語のような自然言語と同じで
文法が分かったって単語が分からなきゃ読めないわけよ。
入門書っていうのは、いわゆる基礎単語と文法の基礎をやっているようなもんで
終わったからといっても、実用アプリのソースを読むには両方不足してるからな。

そのソースはそこまで煩雑な文法は使ってないから、初心者でもXのAPIマニュアル片手に
順番に追っていけば読めると思うよ。時間はかかるかもしれんけど。
0245デフォルトの名無しさん2005/09/27(火) 06:26:54
問題: >>243のコードを言葉で表せ
02462412005/09/27(火) 06:34:50
>>545
難しい
0247デフォルトの名無しさん2005/09/27(火) 06:43:23
>>241がどのレベルで読めないのかが分からないけど
とりあえずいくつか指針を。

・どこから読めばいいか分からない→とりあえずmain関数から
・関数やパラメータの意味が分からない→APIリファレンスを読むか、ユーザ定義関数なら関数を読む
・プログラムそのものが読めない(whileって何だよ、char*って何、etc...)→入門書を読み直す
0248デフォルトの名無しさん2005/09/27(火) 07:21:01
おまいら難易度上がりすぎじゃね?
昨日今日はじめた人間のレベルじゃねえぞ
0249デフォルトの名無しさん2005/09/27(火) 07:34:13
寧ろ、初心者の基準がわからないのだ
0250デフォルトの名無しさん2005/09/27(火) 08:12:06
>243のコードのポイントを挙げるとこんな感じ。
・XWindow/XLibの知識がないとちんぷんかんぷん。
・getopt()という過去の癖のある解析関数を使っている辺りがこれまた馴れを要する。
・コードの使い回しなのか、明らかに手の違うコードが混在している。
・malloc()に対するfree()がない場合があるなど資源の管理が無頓着。
・fprintf()/puts()を連続して使うような手抜きも。つーか、統一しろや。
・'0'と書かずに48と書くようなアナクロコードも。

まぁ素人が参考にするようなコードじゃないね。
0251デフォルトの名無しさん2005/09/27(火) 08:27:18
ポインタ多用してるので読めませんってことじゃねーの?
0252デフォルトの名無しさん2005/09/27(火) 09:47:50
データ構造って、いくつくらいあるんですか?
0253デフォルトの名無しさん2005/09/27(火) 11:12:02
16777215種類くらい
0254デフォルトの名無しさん2005/09/27(火) 11:24:52
アレフゼロくらい
0255デフォルトの名無しさん2005/09/27(火) 11:41:35
>>248
ヨクワカル、ソノキモチ
0256デフォルトの名無しさん2005/09/27(火) 11:47:49
難易度があがればその難易度にふさわしい人間が引き寄せられるのサ
0257デフォルトの名無しさん2005/09/27(火) 12:33:01
うぬ。
焦らずマターリ。
意味不明でも本をボーッと眺めていると、数か月もすれは自然に分かるよ。
0258デフォルトの名無しさん2005/09/27(火) 12:34:27
土曜からはじめたとしたら、
今if文終わってfor文行くとこぐらいじゃね?
■ このスレッドは過去ログ倉庫に格納されています