1 :
ポポ素 ◆Qgm8RFT0/. :
2005/09/24(土) 03:54:30 あたいのスペックは 26歳フリーター、パソコン歴インターネット歴は6年 しかしそれ以外の事は何もできにゃーい… というわけで今日から参考書を買ってがんばります! 今まさに私みたいに、これからCを勉強するぞって人いたら よろしくね
2 :
デフォルトの名無しさん :2005/09/24(土) 03:55:01
ガンガレ
3 :
デフォルトの名無しさん :2005/09/24(土) 03:59:06
何か定期的にこういうスレ建つよな
立ったスレ全部相手にしてたらゲ製作でノイローゼになった奴みたいになるぞ
5 :
ポポ素 ◆Qgm8RFT0/. :2005/09/24(土) 04:52:17
そんなこといわずに よろしくお願いします☆
悪くない
7 :
◆2GoFr2QJSw :2005/09/24(土) 08:58:01
よし、オレも初心者なんで参加する!
とりあえず、やめるときはやめる宣言しろ。
俺も初心者だけど参加 目票は処理系つくること
俺も参加するよ
11 :
デフォルトの名無しさん :2005/09/24(土) 09:44:08
なかなか面白そうだな〜参加希望
じゃ俺、非常勤講師やるよ
13 :
デフォルトの名無しさん :2005/09/24(土) 09:52:12
じゃあ俺も参加するよ コンパイラはどれがいいの?
15 :
デフォルトの名無しさん :2005/09/24(土) 11:58:13
■■■■■■■■■■■■■■■■ ■ ■ 違う板にコピペすると、四角の枠の中に ■ _,,..,,,,_ ■ メッセージとURLが現れる不思議な絵。 ■ / ,' 3 `ヽーっ ■ ■. l ⊃ ⌒_つ ■ ■ `'ー---‐'''''" ■ ■ ■ ■ ■
16 :
デフォルトの名無しさん :2005/09/24(土) 12:02:47
で?
んで、C言語で何のアプリをつくるのさ?
18 :
デフォルトの名無しさん :2005/09/24(土) 12:15:39
ほんとにやる気があるなら質問位には答えてやろう。 っつっても職業プログラマじゃなくてアマチュアだがなw
もう「単独スレ勃てんな脳足りん。帰れ。」とか言うのも疲れた。
>>19 質問です!
なんでそんなに偉そうなんですか?
えらそうってか、気軽に質問オッケーよ!みたいなノリに見えるが。
23 :
19 :2005/09/24(土) 13:09:59
>>21 そんなの決まってるじゃないか。気分だw
特に意味はない。
「わたしが教官のグレン団長である 話しかけられたとき以外は口を開くな 口でクソたれる前と後に“サー”と言え 分かったか、ウジ虫ども!」 「サー!イエッサー!」 この方式で教えよう。
サーアイアイサー
27 :
デフォルトの名無しさん :2005/09/24(土) 14:07:57 BE:73258324-
俺も参加するよ。とりあえず
>>14 の無料のやつをダウソ中
俺漏れも
麻呂も麻呂も
ふー、なんとかインストールできた・・・
>>31 定番だけど猫は見とくべき。
猫で基礎を固めて、基礎以上のことは何か
作りたいものを作りながら学ぶといいかも。
例えばゲーム作るなら Win32 API、DirectX、WinMM とかを
"実際に利用することで" 学ぶ。この辺は「使い方」を知ってれば十分だから。
それと平行して STL とか boost も使っていけば
ほぼ作れないものはなくなる。
こっちはあると綺麗なコード、バグの少ないコードが書けるようになる。
なにげに良スレになってきた予感
漏れも参加しまっす
まず人の書いたプログラムを読めるようになれ 書き方も大事だが、そっちが先だ
>>32 >>33 おお、ありがとうございます。早速お気に入りに追加しますた。
しかし読めば読むほど自分の無知が露見してくるorz
C言語の前にPCの基本用語から勉強しなきゃなぁ('A`)
>人の書いたプログラムを読めるようになれ めんどくさいよなあこれ
コメント無しで void *org; org = *(void **)(*(DWORD *)target + offset); *(void **)(*(DWORD *)target + offset) = proc; return org; こんなの書かれてたら泣く。
ttp://www.nmn.jp/~hidai/c/ 本稿の目標としては、大学の簡単な課題がこなせる程度になることとしましょう。
(言語は道具であり、目的ではありません。C言語のすべての機能を網羅するよりC言語を学習するものにとって何が必要かを考えて編集しました。)
量が適切でいいかも
42 :
デフォルトの名無しさん :2005/09/24(土) 17:06:14
わかったから初心者どもはまず”HelloWorld!”を画面に出すプログラムを作りやがれ
>>41 DXLIBは本来のDirectXプログラミングが出来なくなるくらい
言語仕様が簡単になるらしいけどそのへんどうなんすか
画面に出すプログラム もっとプログラムが必要な"1から50までの和を計算して表示"とかの方がいいぞ
>>42 Hello World は、プログラムを書くことよりも、
ソースを書く→コンパイルする→実行する
っていう流れを学ぶ目的が大きいんじゃないかと思う。
つまりは開発環境の使い方だな。
プログラムの書き方を学ぶなら○×ゲームでも作ったほうがよっぽど良い。
46 :
デフォルトの名無しさん :2005/09/24(土) 17:20:19
>>45 そんな事は分かりきっているから説明するな
>>42 が出来たらファイルから数字を読み込み大きい数から順に並べて画面に表示するプログラムを書け
条件
1.ファイルには数字が文字形式(テキストエディタで読める形式)で保存されている
2.1行に1つ数字が入っている
3.数字の範囲は(0〜65535)
4.数字は最大100個
5.ライブラリ関数qsortは使用しないこと
Hello, WorldからいきなりIOと配列とソートアルゴリズム覚えさせるのってどうよ
>>43 本来のDirectXプログラミングをしたことが無いのでわかりません。
50 :
デフォルトの名無しさん :2005/09/24(土) 17:35:29
>>48 IOと繰り返し、分岐の組み合わせで出来ている上にアルゴリズム自体高校生でも考え付くレベルなのでちょうど良い
ifでの分岐はこれ、whileでの分岐はこれなんて感じで覚える必要もないだろ
じゃあ俺は寝る役ね!
52 :
デフォルトの名無しさん :2005/09/24(土) 17:40:01
>>51 もう終ったのか?じゃあ、次だ
100×100(単位は気にするな)の壁に囲まれた領域がある、そこの(50,0)から(50,50)に壁がある
(0,0)から適当な角度で物体を打ち出した時に物体が通る軌跡を求めろ
条件
1.物理法則に従ってもいいし、従わなくても良い
2.物体が壁にぶつかったときは反射する(これも厳密でなくて良い)
3.暇があったら図示しろ
誰かこの一人で爆走してるバカを止めてくれ
別に止めんでもいいだろ 誰もついていかないから
初心者向きでプログラム作る時のネタってどんなのがいいかな? やっぱゲームかな? 簡単なところから行くと数当てとか...
57 :
デフォルトの名無しさん :2005/09/24(土) 17:48:32
>>54 じゃあ、応用だ
とりあえず、3Dになっていて壁に囲まれた通路をイメージしてくれ
その壁の中をやっぱりなんか物体を飛ばした時の軌跡を求めろ
求め方がわからん
59 :
デフォルトの名無しさん :2005/09/24(土) 18:09:41
>>58 >>52 に戻ろう
まず、物体の座標を(x、y)であらわす所は理解できてるか?
(0,0)から物体を速度v、角度θで打ち出すと時間をtとして描く軌跡はx=(v×cosθ)×t、y=(v×sinθ)×tになる
※めんどくさいので以後はv×cosθをvx、v×sinθをvyとする
時間tと時間(t+1)の間に(x,y)の描く位置に壁があったらぶつかったと判断できる
ここまで解ったか?
ここID無いんだな。NG登録効かんのか
61 :
デフォルトの名無しさん :2005/09/24(土) 18:26:47
そうか、もうやめるよ
プログラミングを独習するには10年かかる
http://www.yamdas.org/column/technique/21-daysj.html > 研究者 (Hayes, Bloom) によると、チェス、作曲、絵描、ピアノ演奏、水泳、テニス、そして神経心理学や
> 位相幾何学の研究を含む、広範な分野のいずれについても、専門技術を身につけるにはおよそ十年か
> かるそうだ。近道など実在しないようなのだ。4歳にして音楽の神童だったモーツァルトでさえ、世界的な
> 楽曲を作り出すまでに13年以上の時間を要したのだ。サミュエル・ジョンソン[訳注2]は、「どんな分野に
> おいても、生涯にわたる努力なくして優れたものには達し得ない。それよりも安い代償で手に入れること
> はできないのだ」と、それには十年以上かかると考えた。
>>62 そんなにかからないと思うぞ。
私の場合 C++ やり始めて3年でほぼやりたいことは
一通り出来るくらいにはなれたから。
ただ、何度挫折しても挫けないほどの根気と、
何かが作りたいっていう意思がないとキツイかもな。
C++自体を一通りできるようになるには数年もあれば十分だと思うけど、 使いこなすには経験をためる必要があって、それにはやっぱり10年くらいかかると思う。 とプログラミング始めて2年の俺が言ってみる。
>>63 そこまでどうやって辿り着いたのか、軽く書いてもらえると、
後進としては助かる。
課題まとめ
>>42 HelloWorld!を出しやがれ
>>44 1から50までの和
>>46 ファイルから読み込み大きい数から並べて
>>52 物体が通る軌跡を求めろ
67 :
デフォルトの名無しさん :2005/09/24(土) 19:02:27
>>42 #include <iostream>
int main()
{
using namespace std;
cout << "hello, world" <<endl;
return EXIT_SUCCESS;
}
>>44 #include <iostream>
int sum(int num)
{
if (num==0)
return 0;
return num+sum(num-1);
}
int main()
{
using namespace std;
cout << sum(50) <<endl;
return EXIT_SUCCESS;
}
まずアセンブラやらないと分からないんだけどな
>>44 #include <iostream>
int main()
{
using namespace std;
int i,no = 0;
for(i=1;i<51;i++) no+=i;
cout << "1から50までの和 = " << no <<endl;
return EXIT_SUCCESS;
}
今日はシェルソート見た。感動した。
>>65 まぁ、
>>33 に書いたのとほぼ同じ感じ。
ふと何か作ろうと思い立って、必要なライブラリを使いこなすため
いろいろ調べて、試行錯誤しながら製作。そして途中で挫折。
そんなことを何度も繰り返してた。
MMORPGを作ろう!とかWinnyもどきを作ろう!とか今思えば無茶だったけど…
まぁ、なんかやるたびに新しいことが身についたと思う。
>>70 アセンブラは決して "必須" じゃないからだいじょぶ。
アセンブラが使えると、デバッグや高速化が楽になるだけで。
まぁ、MMX とか SSE とか使うにはアセンブラ必須だけどね。
ここはあえてコードを難しくするのが暗黙の了解なのか?
76 :
デフォルトの名無しさん :2005/09/24(土) 19:58:36
>>74 アセンブラは考え方として重要じゃないか?
ポインタにはまったらアセンブラの勉強するとすぐ理解できる
ぶっちゃけた話、P2Pが普及している現在、ある程度IDEは持ってます。 これからはそれらを破棄します。 文法を覚えたら、自分の金で買います。当然ですね。 頑張ろう。
>>76 確かにそのとおり。だけど、
だからといって必須ってわけではない、ってことを言いたかった。
82 :
79 :2005/09/24(土) 21:00:30
>>73 漏れは、for文の判定は'<'だけと決めている。
が、他の人はどうでもいい。
>>81 使ってないよ、集めただけ。
懺悔したんだから赦してよ。
85 :
デフォルトの名無しさん :2005/09/24(土) 21:15:47
ウーン、コ
86 :
デフォルトの名無しさん :2005/09/24(土) 21:19:38
C は難しい。 もう挫折しそうだ....
88 :
デフォルトの名無しさん :2005/09/24(土) 21:38:10
おまいらプログラムにツッコミ入れるのはいいんだが理由ぐらい書こうぜ 理由もわからず書き方変えたって何にもならないぞ 素人ギャラリーもたくさん見てるんだから意識しろ
>>46 #include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
const char *filename="number.txt";
int iNumber[100], NumMax=0;
void CreateNumberFile()
{
int articles=rand()%100+1;
ofstream fout(filename);
for (int i=0 ; i<articles ; i++)
fout << rand()%65535 << endl;
fout.close();
}
void ReadNumberFile()
{
char tmp[80];
int i=0;
ifstream fin(filename);
while (!fin.eof())
{
fin >> tmp;
sscanf(tmp, "%d", &iNumber[NumMax++]);
}
NumMax--;
fin.close();
}
90 :
デフォルトの名無しさん :2005/09/24(土) 22:15:42
>>89 の続き
void swap(int *tmp1, int *tmp2)
{
int tmp=*tmp1;
*tmp1=*tmp2;
*tmp2=tmp;
}
void Sort()
{
for (int i=0 ; i<(NumMax-1) ; i++)
{
for (int j=i+1 ; j<NumMax ; j++)
{
if (iNumber[i] < iNumber[j])
swap(&iNumber[i], &iNumber[j]);
}
}
}
void DisplayNumbers()
{
for (int i=0 ; i<NumMax ; i++)
cout << iNumber[i] << endl;
}
int main()
{
CreateNumberFile();
ReadNumberFile();
Sort();
DisplayNumbers();
return EXIT_SUCCESS;
}
91 :
デフォルトの名無しさん :2005/09/24(土) 22:21:41
VIPのGWにC言語を覚えるスレの残党ですが同じ奴いる?
>>91 上から見てたけど
時間の無駄だと思ったから見るのやめたぜ
93 :
デフォルトの名無しさん :2005/09/24(土) 22:33:37
問題以外みてなかったから状況把握してなかったorz 新たな先生降臨待ち
突然スマンが、Amazonのカスタマーレビューにホームページ関連 って書いてあったんだけど、ホームページ作れるって事?
先生はなぁ 他スレ周りに忙しいんだぞぉ 生徒のほうから来てくれないと 教えきれないんだぞぉ
やっぱり、なんか強烈に作りたいものがあるほうが上達も早いんかなぁ。 今のところ、単に知りたいだけだもんなぁ。。。 プログラミングってオサレでカコイイって程度の。
97 :
デフォルトの名無しさん :2005/09/25(日) 00:00:37
コンパイラやインタプリタを作りたい 教えろ
98 :
デフォルトの名無しさん :2005/09/25(日) 00:03:18
>>97 まず、ドラゴンブックかなんかその辺の本を1冊仕入れて来い
100 :
デフォルトの名無しさん :2005/09/25(日) 00:05:05
101 :
デフォルトの名無しさん :2005/09/25(日) 00:16:29
徐々に簡単な問題から出していっていつの間にかコンパイラ作れるようになってるって感じで頼む
ちょっとワロタ
入力と処理と出力だ
105 :
デフォルトの名無しさん :2005/09/25(日) 00:34:10
スレタイがC言語と書いてあるのに C++のコードばかり出てくる所はスルーなの? ++房勘弁してほしい、いやまじで。
>>101 コンパイラでいいな
まずは字句解析と行こうか
これはLexとかでも良いんだけど自分で作ったほうが勉強になる
ソースリストの中の英字の単語、数字、記号を識別し<種別、名称(数値)>の形で出力していくプログラムを作る
種別は以下の通り
・予約語(種別1):if else while const var procedure
・名前(種別2):予約語以外の英字で始まる英数字
・定数(種別3):数字
・演算子(種別4): = + - * /
・区切り符号(種別5):{ } ( ) ;
/"lヽ ( ,人) (・д・) チンコー \ノ ノ/ 〜(__人_) 〜 ノ (
>>96 なにか作りたいものが決まってれば、
「それに必要なこと」が決まるから、
漠然としてるよりは実践的に学べると思う。
プログラミングの技術って、どこで差がつくかっていうと
「〜がしたい」→「こうすればいい」 の連想をどれだけ知ってるか。
こういう連想をたくさん知ってれば知ってるほどいわゆる上級なプログラマ。
基礎的なことやコーディング規約なんてのは誰も大差ない。
109 :
ポポ素 ◆Qgm8RFT0/. :2005/09/25(日) 02:05:13
あたいが知らない間にここ盛り上がってるし!w 参考書かってきたよー C言語の絵本っての、 いろいろ探してみて最初だし絵がかいてるしこれがいいかなっておもって 他にも何かいい本あったら教えてね♪ 早速読んでみたんだけどもういきなり挫折しそうな内容 でもあたいがんばるけんね! みんなもがんばろう!
110 :
デフォルトの名無しさん :2005/09/25(日) 02:47:25
はじめてでつまづきそうな時に、 役に立ちそうな本なら「ポインタの極意」がオススメ。 ポインタ以外のところも分かりやすい。 少し慣れてきたら「新・ANSI C言語辞典」を見るといい。 ヘタな解説書であいまいな知識を得るより、 正確な知識を早めに蓄えておくことが肝心。 みんな、がんばろうぜ! おれもがんばるぜ!
111 :
◆ReQBwuiv5U :2005/09/25(日) 04:54:59
CのCGIの書き方教えて欲しいです。 HelloWorld!の表示の仕方はどうやるんですか?
112 :
ポポ素 ◆Qgm8RFT0/. :2005/09/25(日) 08:30:50
>>109 さんありがとう!
参考にさせてもらうね♪
前レスでC++とか私の知らないのがたくさんあるね
ほんと今わたしは扉のノブを触ったくらいのところだね…
>>111 さんCGIって何?
ごめん、初歩的な質問で…
一応調べたんだけど
コンピュータによって作成される画像 ((CGおよび実写とCGの合成映像のこと));
とかでてきたけど意味がわからないし…
>>113 Perl の時と同じく、Content-type ヘッダが必要。
特に Perl と変わる点はないから普通に書けばいい。
環境変数とかバッファサイズとかセキュリティに関わる部分は十分注意。
ex.
#include <stdio.h>
int main( int argc, char** argv )
{
printf("Content-type: text/html\n\n");
printf("Hello World.\n");
return 0;
}
ヘッダを省略するとtext/plainとして扱われるんだっけ 文字列を出力するだけならなくてもいいんじゃねーかな
Content-Typeなしだと500エラーでした。
■■■■■■■■■■■■■■■■ ■ ■ 違う板にコピペすると、四角の枠の中に ■ _,,..,,,,_ ■ メッセージとURLが現れる不思議な絵。 ■ / ,' 3 `ヽーっ ■ ■. l ⊃ ⌒_つ ■ ■ `'ー---‐'''''" ■ ■ ■ ■ ■
>>115 text/plainとして扱うのはブラウザの仕様であって
HTTP的にはcontent-typeは省略すべきではない(SHOULD)みたい
省略されたら"application/octet-stream"だね
>>118 Content-type は省略できないこともないけど、
\n\n は省略不可。
HTTP のレスポンスは、レスポンスヘッダ+空行+Body の形をとるけど、
\n\n がないと、レスポンスヘッダだけになり、
HTTP として不正なデータになる。
…Apache の場合はね。もしかするとこの辺適宜解決してくれる
Web サーバもあるかもしれない。
C言語の勉強にCGIを使うというのもいいな。特にPerlやPHPから始めた人には。
>>120 PerlやPHPから始めた人はね
初心者じゃApacheとかでCGIの実行環境作るのが大変だろ
WinならAnHTTPD使えないの?
>>122 そういう事じゃないって
ApcaheとAnHTTPDの設定じゃ俺はApacheのが楽な位だよ
初心者向きでプログラム作る時のネタってどんなのがいいかな? やっぱゲームかな? トランプゲームが理解しやすい 一番簡単(と思われるのが)神経衰弱 あとブラックジャックとか ポーカーは役判定とかが結構難しい
ぷよぷよ
126 :
デフォルトの名無しさん :2005/09/25(日) 16:34:40
ブロック崩しとかインベーダ
○×ゲームが作りたいな
俺が始めて作ったゲームはジャンケンゲームだったな…
>128 それだ! 1.人間:石/鋏/紙の指定入力 2.CPU:乱数を使って石/鋏/紙の指定 3.勝敗判定 まさに初心者向け
>>129 おおっ!それいいなあ!!ちょっとがんばるよ。
int n; char *te[] = { "ぐー","ちょき","ぱー"}; printf("ぐー...0 ちょき...1 ぱー...2\n"); scanf("%d",&n); printf("あなた : %s\n",te[n]); printf("CPU: %s\n",te[n == 0 ? 2 : n-1]); printf("あなたのまけです。");
132 :
デフォルトの名無しさん :2005/09/25(日) 19:12:28
>>131 絶対勝てない
相手の手は乱数で決めないとね
統計データ取ると人間は絶対勝てなくなるよ
以下怒涛のscanf叩きが始まります↓
ってかscanf以外に知らないよ
scanfは入力文字をストリームとして解釈するからなあ(ry
char buf[256]; int num; fgets(buf,sizeof(buf),stdin); sscanf(buf,"%d",&num); こっちのがいいんじゃね
なるほど。やってみる。 bufって何かの略?
buffer
わかった、bufferか。 ネーミングセンスはいいと思う。少なくとも俺より。
132が釣りなのかだいぶ悩む
乱数:取り出したい値 = rand() % n; これで 0 〜 n-1 の値が取り出せる (※) ちなみに srand(time(NULL)); しないといつも同じ乱数列になってしまうので rand()を使う前にどこかでやっとく事。 ※:C-FAQとかググルともちっと違うやり方で取り出した方が良いよ、となっている
>>145 106じゃないけど一カ所ツッコミを。
その実装だと
"abc123" は名前と認識される。これは正しいけど、
"123abc" が定数と認識されちゃうね。これは間違い。
この場合は定数でも名前でもないと判断する。
148 :
デフォルトの名無しさん :2005/09/26(月) 11:34:06
>>145 ,
>>147 悪くはないのだが、後の事を考えると出力は直接printfするのでなく一旦データ構造に保持して、
それを最後にまとめて出力する様に改良してみてくれ
以後の出題もコード生成(出力)以外の時以外は出来る限り内部にデータ構造を作ってからにしよう
#include<stdio.h> int main(void) { printf("HELLO\n"); return(0); } できた〜!!(゜ー゜;Aアセアセ
>>150 ガ━━━━━━(゚д゚lll)━━━━━━ン!!!
そうでしたか…
勉強してきます…
誰かC言語でオリジナルデスノート対決しようぜ!!
>>150 ・・・?
別にコンパイルエラー起きないはずだし、正しい記述じゃね?
>150はあってるよ。 括弧は要らない。 ただし、つけても害はない。 でも、見難い。
156 :
デフォルトの名無しさん :2005/09/26(月) 16:29:44
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) {
>>155 では括弧はあってもなくてもいいんだけれども
ない方が見やすいプログラムと言う事ですかね?
159 :
デフォルトの名無しさん :2005/09/26(月) 18:00:15
>>158 returnという関数の呼び出しに見えてしまうから気持ち悪いと言う説が濃厚
その他Lispとは違うんだから括弧は少なくしろと言う説もある
括弧は無いのが多数派のような気がするけど、 全部につける人も普通にいるし。 return (a + b); みたいな計算結果返すんだったらつけたくなるなな べつにあんま気にしなくてもいいと思うよー。
括弧の有無がそんなに重要か?
マメ知識 retarn 0; //構文エラー retarn(0); //リンクエラー
#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アセアセ 今度は完璧だぜ!( ´ー`)
166 :
デフォルトの名無しさん :2005/09/26(月) 18:19:16
>return0; 空白をいれましょう。 でないと、コンパイラが[retun]と[0]なのか、 [return0]という変数などなのか、迷います。
heikin=goukei/i; をループのそと(うしろ)に
>>166 もともとタブが入ってて書き込んだ段階で消えただけじゃね?
169 :
167 :2005/09/26(月) 18:22:50
ああすまん。外に出しただけでは駄目だ heikin=goukei/50; ね。 平均は整数値でいいの?
平均の求め方は、合計を最後に50で割ればいいんでないかい? for文からは出すんだ!
寝起きで hentai=gouki/i; に見えた
>>165 ガウスの法則って知ってる?
1から100000000でも真面目に足すの?
それに平均を毎回求める必要ないんじゃ?最後の一回だけで。
ああ…遅レスすまん
175 :
デフォルトの名無しさん :2005/09/26(月) 18:25:31
>>165 goukei = goukei + iはgoukei += iとするべき
おそらく作成者の意図はgoukeiにiを加算したいのであってgoukei+iをgoukeiに代入したい訳ではないから
あと、左辺値に副作用があったり、マクロだった場合にどんな動作するか考えるの面倒だからこの記述になれるほうが良い
>>169 平均はdobleかflotのがいいんですね!!
>>170 for文難しいですよ…
>>171 ワラタw
>>172 応用力というものが足りない事にきずきましたよ('A`)
>>175 高度な意見なので分からない事がありますが、加算するときは
そのようにするのですね!!有難う御座います
>>174 処理回数が減るってのはもちろんだけど、
“計算しなくてもいいものは計算しない”は基本中の基本だからね。
平均なんて最後にまとめて計算すればいい話であって
50回計算する意味はないでしょ?
毎回表示したいとか、そういう理由があれば別だけど。
>>177 なるほどそういう事ですか!
短く分かりやすいプログラムにしろという訳ですね
勉強してきます(゚∀゚)
179 :
デフォルトの名無しさん :2005/09/26(月) 18:38:11
>>178 という事で、もう一度作り直してください
>>179 予想外のフリが…Σ(゚д゚;) ヌオォ!?
ですがプログラムのコピーになってしまうので、
また新しい関数で何か作ってみるので判定して下さい!!
よろしくお願いします<(_ _*)>
では勉強してきまつ
>>180 じゃぁ、1+3-5+7-9+11-13+・・・
を50回計算した合計を出力するプログラムを。
>>181 やってみます!!
が…む、難しい予感が…
数学苦手だった〜('A`)
183 :
デフォルトの名無しさん :2005/09/26(月) 18:49:32
>>182 じゃあ、ヒントだ
1 3 5 7 9 11 13...これは+2づつ増えている
a=1の時a *= -1を繰り返し実行すると1,-1,1,-1となる
>>183 なんとなく分かってきましたよ(`・ω・´)
いい感じの流れになってきたな みんなガンガレ!
#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`)
187 :
186 :2005/09/26(月) 19:18:31
まずい!!やっぱりみないで下さい!! なんつ〜もん晒してんだ漏れは…_| ̄|○
>>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;
}
できたかも!!(`∀´)
>>181 最初の1と3が共に正の数だからうまく交互に行いにくいな。
>>188 エラーが出た。中カッコがいくつか足りない。
>>189 エラーですか…そうなんですよ符号を考えるのが
難しいんですよ。
191 :
190 :2005/09/26(月) 20:06:35
for文の終了の中括弧がないですね
192 :
デフォルトの名無しさん :2005/09/26(月) 20:18:11
もうひとつヒント 合計に加える値とループのカウンタは別にしても良い ちなみに元のままだとelse以下がおかしい
193 :
デフォルトの名無しさん :2005/09/26(月) 20:21:20
>>189 えっ 1を入れないで50回じゃないの?
194 :
189 :2005/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); }
195 :
190 :2005/09/26(月) 20:23:25
>>192 >合計に加える値とループのカウンタは別にしても良い
この見極めが難しいですね!(´・ω・)
>ちなみに元のままだとelse以下がおかしい
これはやはりfor文の括弧を付けていないせいですよね?
196 :
190 :2005/09/26(月) 20:27:01
>>194 天才じゃないっすか(゚д゚lll)
何だったんだ!?漏れのへぼいプログラムは…orz
197 :
デフォルトの名無しさん :2005/09/26(月) 20:32:09
プログラミングはじめてみようと思うのだけど まず、どんなことから始めれば?
>>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;
}
これだけでいいよふな
199 :
デフォルトの名無しさん :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;
>>197 まずなんの言語を学びたいかじゃないかな…
あ、ここに書き込んでるってことはCかな?
201 :
190 :2005/09/26(月) 20:39:49
>>199 ・・・・・結局はほとんど違いますね
goukeiの初期化=1にすれば簡単なんですよね
202 :
189 :2005/09/26(月) 20:45:51
>>196 プログラムの打ち方なんて人それぞれだって。
藻前の個性的なコードとてちゃんと動作すれば何ら問題ないし。むしろ、処理追ってみて少し楽(ry
>>198 3からは計算で求めたかったんで。といっても1を代入してる時点でもう駄目だなorz
203 :
190 :2005/09/26(月) 20:54:03
>>202 動作するようにガンバリます!
いろいろ見てくださってありがとう御座いました
C言語は意外と面白いと思えただけでもとてもよかったです。
#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 から求めたい…
205 :
189 :2005/09/26(月) 21:06:24
>>203 コツとしてはTabキーで字下げをすること。{}のペアや範囲が分かりやすくなって全体的に読みやすくなる。(2chに書く時はスペースに直す必要有
メモ帳なんかは改行すると字下げが解除されるから、他のエディタを使うことをお勧めする。
206 :
190 :2005/09/26(月) 21:17:16
>>205 スペース使うんですか?なぜか整ってしまっておかしいなとは
思っていたんですよ。{}の使い分けをしっかりしてみます。
207 :
189 :2005/09/26(月) 21:47:49
互いに問題出し合って解いていくのも結構いいかも。参考書開いて黙々とやってるより全然面白い。 という訳で俺から一つ。 整数を5つ入力し、それを数値の多い順にソートするプログラムを作成。 ヒント:3重ネスト
>>181 #include <stdio.h>
int main()
{
printf("%d\n", (1-2*25));
return 0;
}
■出題まとめ
>>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ちゃんねるの文字数制限にひっかかる場合は試してみてください。
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
213 :
デフォルトの名無しさん :2005/09/26(月) 22:22:59
スペースを 自動変換 ギコナビかな
スペースを に変換するプログラムを作ったらどうだw
ミスった スペース・タブを&nbsp;に変換するプログラムを作ったらどうだ
確かに、 char[] nbsp; pchar = &nbsp; とかだとスペースになっちまうなw
&&&&t&e&s&t&
&ってどういう効果?
ポインタ、論理和
あ、ごめんなさい&のことです
>>214 先生、それは課題でしょうか?
もう少し詳しくお願いします
>222 >スペース・タブを&nbsp;に変換するプログラム " "
>>147 遅くなってしまったが、次は構文解析だな
以下のBNF生成規則にそった代入文のパーサを作る
<代入文> := 名前 = <式>
<式> := <式> + <項> | <式> + <項> | <項>
<項> := <項> * <要素> | <項> / <要素> | <要素>
<要素> := ( <式> ) | 名前 | 定数
解析結果は<代入文>をルートとする木構造とし、<演算子, 被演算子1, 被演算子2>のノードで出力する
被演算子がノードになる場合はN(ノード番号)を出力する
ごめんなさい うまく書けなかったのでもう一度書きます & a m p ; ってどういう効果ですか?
>210 ゲームとかもっとあがってないか? 出題
&→&
>225 アンド
214じゃないけど、課題っぽくしてみた。 いきなりファイル関係をいじるのは難しいかもしれない。ファイルの読み込みは必須だけど、書き出す処理はやめて画面に出力でもかまわない。 猫でもわかる(ryのC++講座にprintfやputsでファイルに出力する方法が書いてある。 ソースファイル中のHTML特殊文字をエスケープするプログラムを作成する。 ・起動したらファイル名を入力 ・&はamp、<はlt、>はgt、[半角スペース]はnbsp。タブ(\t)は4文字の半角スペースとする。 例 <→< ・出力するファイル名は、ソースファイル名+".txt"。 参考 ・ソースを丸ごとメモリに読み込まない。長いソースでは問題が起こる。1文字ずつ読み込んで書き出す。読み出した文字はchar型の値に代入する。 余裕があれば ・Windows環境だと2バイト文字に問題がある。2バイト文字の上位8ビット(=1バイト)が0x90より大きいなら下位8ビットはエスケープしないこと。 ちなみにchar型やbyte型の大きさは1バイト。つまり、次に読み出す文字のエスケープ判定をしなければOK。 ・入力されたファイル名が正しいか(ファイル名に使えない文字がないか)調べる。 ・出力するファイル名がすでに存在しないか調べる。 ・上書きするか中断するか選ばせるのも手。yなら上書き、nなら中断、それ以外ならループ。 ・"や'もエスケープする。 ・エスケープした文字数をカウントしたり、出力したバイト数を計算したりして、出力後結果を表示。 ヒント fopen fclose fgetc(要キャスト) fputc fprintf
だぁーミスった ×0x90より大きい 〇0x80から0x9F、0xE0から0xFF
そーいえば、○×ゲームって作るの難しいの? 人vs人のやつ。
>232 そんな難しくない方 たてよこななめに並んでいるかどうかを判定する、ってのがこのプログラムのキモ
234 :
デフォルトの名無しさん :2005/09/27(火) 02:16:52
>>233 それが問題かー。どうやって判定するべきか・・・。
深く考えなくていいとオモ。 碁やオセロならまだしも、TicTacToeぐらいなら力業でif分並べたって8回の判定で済むんだし。 ループを使って横判定、縦判定、で最後に手動で斜め判定が一番楽かな?
全体的な流れは ・3×3の配列を作る --- 例) int tbl[3][3]; ・○は1、×は2、何も置いてない所は0 とかってする ・指定した場所に置く時に0かどうか判断して、置けるなら置く ・たてよこななめのどれかで3つ並んだかどうかチェック ・まだ空きが有るかつどちらも3つ並んでなければ、場所指定に置く所から繰り返し って感じ
238 :
まとめ :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 スペース・タブを に変換 >224 次は構文解析だな >229 HTML特殊文字をエスケープ >236 ○×ゲームをつくれ ■インデントする方法 ・ を書き込むとスペースに変換されます ・タブやスペースを に置換して書き込むとインデントが整います ・メモ帖・秀丸・VSなどの、エディタの置換機能を使います ▼コツ ・タブを置換したい場合はエディタ上のタブをコピーして検索窓でペーストします ・スペースはインデント単位(2,4,8個など)でまとめて置換すると単独のスペースを無視できます ・ギコナビなら自動変換機能があります。
トランプ系ならまずカードをどうやって表現すっかだな ジョーカー除いて台札は4×13=52枚 &sp; 種類が4(スペード,ハート,ダイヤ,クラブ) &sp; 数字が13(A,2,3,...,10,J,Q,K)
↑ & n b s p ; ってしないとダメなのか orz
243 :
241 :2005/09/27(火) 05:53:58
>>243 読めないと言われてもなぁ。
とりあえずプログラミング言語ってのは英語や日本語のような自然言語と同じで
文法が分かったって単語が分からなきゃ読めないわけよ。
入門書っていうのは、いわゆる基礎単語と文法の基礎をやっているようなもんで
終わったからといっても、実用アプリのソースを読むには両方不足してるからな。
そのソースはそこまで煩雑な文法は使ってないから、初心者でもXのAPIマニュアル片手に
順番に追っていけば読めると思うよ。時間はかかるかもしれんけど。
246 :
241 :2005/09/27(火) 06:34:50
>>241 がどのレベルで読めないのかが分からないけど
とりあえずいくつか指針を。
・どこから読めばいいか分からない→とりあえずmain関数から
・関数やパラメータの意味が分からない→APIリファレンスを読むか、ユーザ定義関数なら関数を読む
・プログラムそのものが読めない(whileって何だよ、char*って何、etc...)→入門書を読み直す
おまいら難易度上がりすぎじゃね? 昨日今日はじめた人間のレベルじゃねえぞ
寧ろ、初心者の基準がわからないのだ
>243のコードのポイントを挙げるとこんな感じ。 ・XWindow/XLibの知識がないとちんぷんかんぷん。 ・getopt()という過去の癖のある解析関数を使っている辺りがこれまた馴れを要する。 ・コードの使い回しなのか、明らかに手の違うコードが混在している。 ・malloc()に対するfree()がない場合があるなど資源の管理が無頓着。 ・fprintf()/puts()を連続して使うような手抜きも。つーか、統一しろや。 ・'0'と書かずに48と書くようなアナクロコードも。 まぁ素人が参考にするようなコードじゃないね。
ポインタ多用してるので読めませんってことじゃねーの?
データ構造って、いくつくらいあるんですか?
16777215種類くらい
アレフゼロくらい
難易度があがればその難易度にふさわしい人間が引き寄せられるのサ
うぬ。 焦らずマターリ。 意味不明でも本をボーッと眺めていると、数か月もすれは自然に分かるよ。
土曜からはじめたとしたら、 今if文終わってfor文行くとこぐらいじゃね?
1日目 インスコ 2日目 Hello World 3日目 変数の概念 4日目 変数 5日目 基本的な演算子 6日目 制御構造if、else、else if、swich 7日目 制御構造for、while、do while、break、continue、GOTO
260 :
デフォルトの名無しさん :2005/09/27(火) 13:05:28
>>258 人にもよるが、そんなにマターリやるとすぐあきる
鉄は熱い内に打て
それに対面でやってるわけじゃないんだ
このスレの内容どっかに保存しといて後でゆっくり見てもいい
261 :
デフォルトの名無しさん :2005/09/27(火) 13:34:44
>>248 うむ、分かったからおぬしもどれか課題をやってみなされ
>>250 >・XWindow/XLibの知識がないとちんぷんかんぷん。
それなりには読めるだろ
>・getopt()という過去の癖のある解析関数を使っている辺りがこれまた馴れを要する。
俺も普通に使ってるが・・・
>・コードの使い回しなのか、明らかに手の違うコードが混在している。
癖が統一されてると思うけど
>・malloc()に対するfree()がない場合があるなど資源の管理が無頓着。
一個は途中で不要になるから開放してて、もう一つは最後まで使われるからしてねーんじゃねーの?
>・fprintf()/puts()を連続して使うような手抜きも。つーか、統一しろや。
適切だと思うけど、int, short, charをかなり使い分けてるからスピードを大切にしてるんだと思うけど
>・'0'と書かずに48と書くようなアナクロコードも。
それは個人の趣味。
>>251 >ポインタ多用してるので読めませんってことじゃねーの?
この場合、必要だから使ってるだけで無駄には使ってない
ポインタのポインタがいい味出してるな
getoptの何が悪いんだ? この場合longにする必要もないし 過去とか古いってなんでもいうのはWindowsユーザぐらいだぞ
>>263 いや、単に「CUIが使えないユーザー」かと
option.separate_value = 'x'; option -> window_size = 1; option -> window_coordinate = 1; この3つは#define するか値をそのまま書いた方が読みやすい というかseparate_arg()の引数が5個もあるけど 最初の2つ引数はまるで無駄になってる。
ボインタってやつの使い方を教えて下さい
→
268 :
デフォルトの名無しさん :2005/09/27(火) 18:10:32
>>266 ・関数で引き渡し元の変数の中身を変更したい場合に使用する
・動的に確保したメモリーがどこにあるのか保持する
php で言う参照渡しと同じか
>>237 Warning : function has no prototype
3427.c line 5 {
と出たけど。
おかしいな…C初心者スレをお気に入りに入れてたはずなんだけど…
>>180 こんなのはどうでしょうか?
#include<stdio.h>
main()
{
int i,a,total;
for(i=0, a=1,total=0; i< 50; i++,a+=2)
{
if(a == 1)
total += a;
else if(i % 2 == 1)
total += a;
else
total -= a;
}
printf("%d",total);
return(0);
}
亀レスだけどa*=-1はなるほどなと思いました
良スレハケーン!
278 :
180 :2005/09/27(火) 23:33:54
>>274 自分も遅レスですが、for文で「,」で区切れば
初期化の数増やせるんですか!
レベル低いですね俺って…(´д`)
この壺はよい壺だ
>>181 って計算50回するんじゃなくて、1,3,5,7…99まで(50個)を計算しろってことなの?
そういうことじゃねーの?
だったら「50回計算」なんて書くなよーw 50個の数字があったら計算は49回だろwwwwwwww
公式使って求めた答えだけ表示してても意味無いと思うんだが …まあいいか #include<stdio.h> int main() { int i,j,a,total; for(i=1,j=1,a=3,total=1;i<50;i++,a+=2) { total+=a*j; j*=-1; } printf("%d",total); return 0; }
>>284 最初からこうしろ
for(i=1,j=1,a=3,total=1;i<50;i++,a+=2,j*=-1,total+=a*j){}
286 :
まとめ :2005/09/28(水) 00:33:32
■参加方法 問題を解きたい→どんどん解け 問題を出したい→どんどん出せ ■今までに出された問題 >42 HelloWorld!を出しやがれ >44 1から50までの和 >46 ファイルから読み込み大きい数から並べて >52 物体が通る軌跡を求めろ >106 まずは字句解析と行こうか >124 神経衰弱、ブラックジャック >125 ぷよぷよ >126 ブロック崩し、インベーダ >129 ジャンケンゲーム >181 じゃぁ、1+3-5+7-9+11-13+・・・を50回 >207 ソートするプログラム >215 スペース・タブを に変換 >224 次は構文解析だな >229 HTML特殊文字をエスケープ >236 ○×ゲームをつくれ ■インデントする方法 ・ を書き込むとスペースに変換されます ・タブやスペースを に置換して書き込むとインデントが整います ・メモ帖・秀丸・VSなどの、エディタの置換機能を使います ▼コツ ・タブを置換したい場合はエディタ上のタブをコピーして検索窓でペーストします ・スペースはインデント単位(2,4,8個など)でまとめて置換すると単独のスペースを無視できます ・ギコナビなら自動変換機能があります。
こんなもんか void sort(int a[],int b){   if(b>1){     int c,i,j,m,n,x;          x=(a[0]+a[b/2]+a[b-1])/3;          i=0;     j=b-1;     m=0;     n=b-1;          while(1){       while(a[i]<x)         i++;       while(a[j]>x)         j--;       if(i>=j)         break;       c=a[i];       a[i]=a[j];       a[j]=c;     }          sort(a,i);     sort(&a[i],b-i);   }   return; }
あ、mn消し忘れた
わぁー!ついていけないー!(;;) 'A'と"A"の違いって何? ごめん、一人レベルの低い質問して…
''は文字 ""は文字列 "a" == {'a', '\0'}
ウソっていうかまぎらわしいだけ
>>291 え?違うの?
return(0);ってどういう意味なんですか?先生型ヘボい質問よろしく☆
あたいがつかってる参考書にはどこにものってなくて
なくてもいけるんだけど、コンパイルしたとき
関数を返してくださいみたいな表示がでてくる。
例えば
#include (studil.h)
main() {
printf("プギャ〜!");
{
でreturn(0); がなくてもプギャーは表示されるんだけど
return(0); があるのと無いのって具体的に何が違うのかな…
やっぱりあった方がいいんですか?
ハァ…細かい疑問だらけだよー
>>293 簡単にいえば
mainでreturn 0;するとmain関数に0を返す。 これは普通は通常終了を意味する。
他の関数でreturnした値はその関数の返す値となる
>>293 本来ならmainは値を返さないといけないんだけど(返値の型はintだし)
C++ではmain関数に限り、何も書かなければコンパイラが勝手にreturn 0;があるものとしてコンパイルしてくれる。
C言語ではダメだから、C++コンパイラで勉強する場合でも一応書く癖をつけておいた方がいいけど。
>293 マジレスしようと思ったが突っ込むところが多すぎて面倒なんでやめた。 mainの前にvoidって書いとけ。 何も書かないか、 intって書いたときはreturn 0;しとけ。 >294 >295 不十分。
>>243 のプロフィールのキャッシュ
> プログラミングは高校の授業で数回ポケコンでやったことがある程度です
> その授業はprintfで簡単な計算結果を表示するだけでした
>>
> XAAVは以上のプログラミング経験の中で作ったものです
> printfとscanfしか知らなかった中で作ったので、大多数の時間をC言語の理解に費やしました
> C言語を調べながら3日程で作りましたのでそこら中に間違った箇所があるかもしれません
> バグを見付けられたかたは指摘の程をお願いします
これをほぼ0の知識の中で三日間で作れるものなのか?
神なのか?
XAAVって何なの?
>298 正直すまんかった。 処理系の話まで説明する元気はなかった。
>>297 簡単にって書いたつもりだけどそれでもダメなのか?
int main( void)
{
printf("プギャ〜!");
return 0;
}
って訂正してから言わなきゃダメだった?
しかもLCもしなきゃだめだった?
環境書いてないからどうしようもないんだけど…
>302 型の話からすべきだと思っただけ。 たぶんそれでは理解できないと思ったから。 ていうか俺もちゃんと説明してないんだから不十分とかいえんわな、悪かった。
>>296 いいんじゃないでつか?
タブをスペース4つに変換するコード、だよね。
ちょっと欲を出して、タブを4の倍数列の位置になるように調整するようにしてみては。
普通のエディタではタブ1個も、スペース1個+タブ1個も同じ列に揃うよね。
前後のスペースを考慮して変換するスペースの個数を変えてみるとか。
はじめたころってささいなことが気になって先に進めなくなるんだよな
intとか知ってるだろ?
>>307 うん、変数ってのだよね、
整数型だっけ、
型じゃん
型…わかんね… 一度出直してきます…
なにがわからないの?? おぃちゃんに分からないこといってみ?? できる限りの説明ならするよ
↓これがどういう仕組みなのかわかんない。
誰か和訳してください。
unsigned pop(unsigned x){
//受け取った整数の立っているbitの数を返す関数
x -= x >> 1 & 0x55555555;
x = (x&0x33333333) + (x
>>2 & 0x33333333);
x = x + (x
>>4 ) & 0x0f0f0f0f;
x = x + (x
>>8 );
x = x + (x
>>16 );
return x & 0x3F;
}
『ハッカーのたのしみ』って本読んでみれ
>>311 おいちゃーーーん!!!!!!!
型、、型って何?…
型自体の意味がわからないよ。
>>315 型っていうのは
>>308 でいってる通り
整数型(int), 短整数型(short int), 長整数型(long int)とかそういうの
例えば
int atai;
としたら、整数型のataiが確保される。
これはわかるでしょ?
>>303 は多分
int main( void)
の型の話をしてると思うんだけど、mainがintだからreturnで返す値もint(整数)型の値を返す必要があるの
普通はmainが返す値はプログラムの終了コードになって、終了コードが0なら通常終了, 1ならエラー終了みたいになってる
これでもなんかわからないかな?
追記 なんでmainがintかっていうとmainも関数だから値を返す必要があるの 基本的にmainの呼出し元はOSだから、0が通常終了0以外がエラー終了とかが約束的になってるの
318 :
デフォルトの名無しさん :2005/09/28(水) 07:39:09
>>316 >>317 おいちゃんむずーーーい(><)
とりあえず、
最後にリターン0で返せば
そのプログラムが通常終了になるってことでいいのかな?
でそれをしないと終了しないとか?
で、C++のコンパイラだと、最後にそれ書かなくても
かってに書いてることにしてくれるとか(前レス参照で)
>mainがintだから 誤解生み捲くりそうな表現だな。
>>318 今はあんま深く考えずに
int main()
と書いたら、最後にreturn 0;と書く物だと覚えておけばいいよ。
323 :
デフォルトの名無しさん :2005/09/28(水) 15:34:52
325 :
デフォルトの名無しさん :2005/09/28(水) 16:15:19
>>323 mainと言う関数の戻り値がintであっても、mainと言う識別子の評価結果はintではないですね
型は int(*)() 辺りでしょうか?
○int x = main();
×int x = main;
( * )
上: int型変数xを、関数mainの戻り値で初期化する。 下: int型変数xを、変数mainの値で初期化する。
>>325 変数mainは危ない様な気が。
それと個人的意見だが、勉強中の香具師はノート(テキスト)を取っといた方がいいと思う。一度見て覚えても忘れる事なんてざらにあるし。
先頭にはまとめ(
>>286 )を貼っとくといいかも。
330 :
デフォルトの名無しさん :2005/09/28(水) 19:31:18
int (*s)() = main; なら通った
331 :
デフォルトの名無しさん :2005/09/28(水) 20:04:15
初心者用の問題 1:キーボードから「Nullpoint」を入力したら「ッガ!!」を返すプログラムを作ってください 「Nullpoint???」や「???Nullpoint」などでは「ッガ!!」をしなくてもかまいません 2:上記のプログラムに「Nullpoint」以外を入力したら「フーン、で?」を返すプログラムを作ってください 3:上記のプログラムの挙動を「return」と入力するまで繰り返すプログラムを作ってください 4:「Nullpoint???」や「???Nullpoint」などでも「ッガ!!」を返すように改良してください この問題のポイントはキーボードからの入力をどう判定するかにあります。 1ができれば2は難しくないはずですが、 文字列の桁あふれや'\n'の扱いに慣れていない人は、3でつまずくかもしれません。 分からない時は、堂々と質問しましょう。
( ´D`)<ハーイ
>>322 typeにはマクロかenumで
#define TOKEN_KEYWORD 0
type = TOKEN_KEYWORD;
みたいに後でめんどくさくならないようにした方がいいよ。
1 #include <stdio.h> #include <stdlib.h> int main(){ char str[100], ans[] = "Nullpoint"; int i; printf("入力して下さい\n"); scanf("%s", str); for (i = 0; str[i] != '\0'; i++) if (str[i] != ans[i]) exit(0); printf("ッガ!!\n"); return 0; }
2 #include <stdio.h> #include <stdlib.h> int main(){ char str[100], ans[] = "Nullpoint"; int i; printf("入力して下さい\n"); scanf("%s", str); for (i = 0; str[i] != '\0'; i++) if (str[i] != ans[i]){ printf("( ´_ゝ`)フーン\n"); exit(0); } printf("ッガ!!\n"); return 0; }
337 :
デフォルトの名無しさん :2005/09/28(水) 20:42:04
>>335 文字列リテラルの仕組みが良く分かっているようですね
次回はぜひ標準ライブラリの関数を使ってみてください
>>335 の関数を自作できる人ならば
strcmp()関数も自作できることでしょう
>>335 strがデカイとansが変なところに行くんじゃ?
んなわけないね。すまそ。
>>322 110行目でコンパイルエラー。
×plist=(list*)malloc(sizeof list);
○plist=(list*)malloc(sizeof(list));
strがansに関係している所は
>if (str[i] != ans[i]) exit(0);
の部分だけですね?
ここでは、両方に共通の変数[i]が使われています。
[i]はその前の文の
>for (i = 0; str[i] != '\0'; i++)
によって i = 0 に初期化されているので、
strとansの1文字目から判定を始めることが補償されています。
このとき、strが極端に長い文字列リテラルになっていたとしても、
ansは最初の宣言時の
>char str[100], ans[] = "Nullpoint";
の初期化によって、'N''u''l''l''p''o''i''n''t''\0'という、
十文字分の文字列リテラルであることが補償されています。
もしもstrが極端に長い文字列リテラルであったとすると、
[i]の値が9になった時、ans[9]は'\0'を示しますが、
STR[9]が文字の終端である'\0'になることはありません。
つまり、
>if (str[i] != ans[i]) exit(0);
は真となり、 exit(0); が実行されるので、
ansを超えてヘンな所に行く前に、プログラムは終了します。
ですから、
>>335 でも問題はありません。
しいていうならば、
この関数を他のプログラムのmain関数から呼び出す部品として使う時に、
exit を使っていると、呼び出しもとの main関数に戻れないので、
return を使うようにしたほうがいいかもしれません。
……と、書いているうちに、自己解決されたようですね。遅レススマン
3はなんとか出来たけど、おいらの力じゃ4は苦労しそう・・・ #include <stdio.h> #include <stdlib.h> int strcmp(char s1[], char s2[]) { int i; for (i = 0; s1[i] != '\0'; i++) if (s1[i] != s2[i]) return 1; return 2; } int main(){ char str[100]; int ans;
while(1){ printf("入力してください\n"); scanf("%s", str); ans = strcmp(str, "return"); if (ans == 2) break; ans = strcmp(str, "Nullpoint"); if (ans == 2) printf("ッガ!!\n\n"); if (ans == 1) printf("( ´_ゝ`)フーン\n\n"); } return 0; }
先生出来ましたyo 1) #include<stdio.h> main() { char buf[256]; char str[10]="Nullpoint"; int i; gets(buf); for(i = 0; i < 9; i++){ if(buf[i] == str[i]) continue; else break; } if(i == 9) printf("ガッ!!"); }
.file"test.c" .def___main;.scl2;.type32;.endef .section .rdata,"dr" LC0: .ascii "HELLO\12\0" .text .globl _main .def_main;.scl2;.type32;.endef _main: pushl%ebp movl%esp, %ebp subl$8, %esp andl$-16, %esp movl$0, %eax addl$15, %eax addl$15, %eax shrl$4, %eax sall$4, %eax movl%eax, -4(%ebp) movl-4(%ebp), %eax call__alloca call___main movl$LC0, (%esp) call_printf movl$0, %eax leave ret .def_printf;.scl3;.type32;.endef
>>342 関数による値の受渡しがよくできていますね。
ただ。strcmp()関数というのは、
標準ライブラリ<string.h>で定義されている関数の名前なので、
同じような挙動をする関数でも、別の名前に変えたほうがいいでしょう。
>>344 こちらもいいですね。continue;とbreak;の使い方が効果的です。
この関数を自作できる人なら strncmp()関数を自作できることでしょう。
>>344 と
>>335 では、
「Nullpoint???」を入力した時のプログラムの挙動が違います。
>>335 では「ッガ!!」されませんが、
>>344 ではされます。
この違いは文字列リテラルを扱う上で意外に重要になるので、
両方のやり方を場合に応じて使い分けられるようになることが、
初心者卒業の目安になることでしょう。
>>345 誤爆やスレ違いをした時には一言詫びる余裕が持てると、
人間関係が円滑にすすむかも知れませんよ。
おまえらは!!!!!11!! strcmp←まず、この関数の使い方を勉強しろ
ところで、以前他の方も指摘していましたが、 mainの関数を宣言する時に、 >main() と宣言した上で、 retur; による返り値を返さずにプログラムが終了すると、 コンパイラによっては警告を出してきます。 これは、main関数が int main (void) または int main (int argc, cha *argv[]) と定義されているためです。 この定義の意味はおおざっぱにいうと、 この関数の名称は main といい、 ()の中の値を使って {}の処理を行い、 intの値を返す関数です。という意味になります。 ですから、int の値を返さないで終了しようとすると、 「値を返し忘れていませんか?」とコンパイラが心配してくれるのです。 ただし、main だけで int main と宣言していない時には、 これは値のない関数なのだろうと、納得するコンパイラもあります。 この場合は、return; による値がなくとも、 あるいは return; を使わずに終了していても、警告はされません。 また、int main ではなく void main と宣言した場合は、 void というものが「空っぽの値」という意味なので、 この main 関数は値が返って来ない関数です、という意味になり、 retur; で値を返すと、警告又はエラーになってしまいます。 ですから、main だけでの宣言は避けて、 int main と宣言して returnで値を返すか、 void main と宣言して return で値を返さないか、どちらかにするとよいでしょう。
>>347 一理ある。
けど、問題の解決策を先ずは自分で考えてから、strcmpを知るのもありなんじゃないかな?
先に strcmp を知っていた人は、逆に問題として、自分で strcmp を作ってみてください。
他の標準ライブラリの関数も、自分でできるものがないか試してみると勉強になりますよ。
その時の参考や解答になるような本として、「新ANSI C言語辞典」をオススメしておきます。
4 標準関数とやらを使ったら4もでけた ヽ(´ー`)ノ #include <stdio.h> #include <string.h> int main(){ char str1[100], *p; while(1){ printf("入力してください\n"); scanf("%s", str1); if (strcmp(str1, "return") == 0) break; p = strstr(str1, "Nullpoint"); if (p != NULL) printf("ッガ!!\n\n"); else printf("( ´_ゝ`)フーン\n\n"); } return 0; }
>>349 言ってる事はもっともだが、俺ルールを続けるのはあまりよくない
仕組みを理解したら早い段階で標準ライブラリを使うようにする事
プログラムは常に誰が見ても判りやすくなる様に心掛けよう
明日の自分は他人である。
#include <stdio.h> int main(void) { char *needle = "Nullpoint"; char buffer[1024]; if (fgets(buffer, sizeof buffer, stdin)) { for (int i = 0; buffer[i]; i++) { int j = 0; while (buffer[i + j] == needle[j]) j++; if (needle[j] == '\0') { puts("ガッ!!"); return 0; } } } return 0; }
void mainはダメでしょ
>>347 おまえはまずシフトキーの長押し練習汁w
>>348 ちなみにC++とC99ではreturnがないままmain()を抜けるとreturn 0;を行うとなっている。
356 :
344 :2005/09/29(木) 00:11:08
>>346 実行してくれたんですね。ありがとうございます☆
あとstrncmp()関数のことをもう少し詳しく教えてください
>>357 基本は自己採点
偶に出題者か関係の無い他人が採点してくれる
■参加方法
問題解きたい→どんどん解け
問題出したい→どんどん出せ
採点したい→どんどんしろ
■今までに出された問題
>42 HelloWorld!を出しやがれ
>44 1から50までの和
>46 ファイルから読み込み大きい数から並べて
>52 物体が通る軌跡を求めろ
>106 まずは字句解析と行こうか
>124 神経衰弱、ブラックジャック
>125 ぷよぷよ
>126 ブロック崩し、インベーダ
>129 ジャンケンゲーム
>181 じゃぁ、1+3-5+7-9+11-13+・・・を50回
>207 ソートするプログラム
>215 スペース・タブを に変換
>224 次は構文解析だな
>229 HTML特殊文字をエスケープ
>236 ○×ゲームをつくれ
>331「Nullpoint」を入力したら「ッガ!!」
■インデントする方法
・ を書き込むとスペースに変換されます
・タブやスペースを に置換して書き込むとインデントが整います
・メモ帖・秀丸・VSなどの、エディタの置換機能を使います
▼コツ
・タブを置換したい場合はエディタ上のタブをコピーして検索窓でペーストします
・スペースはインデント単位(2,4,8個など)でまとめて置換すると単独のスペースを無視できます
・ギコナビなら自動変換機能があります。
■解答はソース丸貼りか↓にうp
ttp://gamdev.org/up/
>>357 そこでgotoを使うのはちょっとなぁ・・・
その程度ならループ内で処理できるでしょうに
このスレはム板の勢いオブジイヤーですね
>>299 まさに神
俺は専門学校で目茶苦茶覚えが早いっていわれて褒めちぎられたけど
三日目だとやっと関数覚えたくらいだな
ポインタのポインタなんて理解すらできないと思う
sizeofの括弧って必須だったっけ?
>>364 int var; として、
size(int) ○
size int ○
size(var) ○
size var ×
付けといた方が良さそうだな
367 :
デフォルトの名無しさん :2005/09/29(木) 09:21:23
出題:コードブレーカー(ゲーム)を作りやがれ 難易度★★☆☆☆ コンピュータがランダムに3桁の数(以後、コード)を生成 プレイヤーはコンピュータの出すヒントを元にコードを推理していく ・コードは同じ数字を使用していない ・プレイヤーが3桁の数字を入力すると、コンピュータはヒントをひとつ出力 ・ヒントの出し方は下記の通り 数字と桁が一致していれば、『ヒット』、数字は合っているが桁が違う場合は『ブロー』 (例)コード=135の場合 入力 ヒント 246・・・0ヒット 0ブロー 012・・・0ヒット 1ブロー 123・・・1ヒット 1ブロー 153・・・1ヒット 2ブロー 135・・・正解!
作ってもいいけど何が面白いんだ?
所謂ヒット&ブローと同じだね。 ヒット&ブローというと4桁だけど。 普通に紙と鉛筆だけでもできるからコンピュータ普及前からあるゲームだ。 ミニゲームとして謎解き系のゲームに含まれていたりするから知っている人は多いと思う。
>>1 そろそろ飽きてきたかな?
でも君を責めはしない。
仕事や授業で締め切りに追われながら
毎日必死にCを使う状態にある人でないと、
とても身に付くものではないよ。
Cはプロ用の言語という事実を知らない人が多すぎる。
371 :
デフォルトの名無しさん :2005/09/29(木) 10:41:02
>>368 プログラムを作るのが面白いんであって、出来た物が面白いかどうかなんて関係ないだろ
じゃあ「プログラムを作るのが面白い」でいいじゃん
ケンカ売っておいて開き直りかよwww
結果さえでれば他は何でもいいんだよ
>>367 重複しない数字3つを生成するところから分からない・・・orz
ねぇねぇ、やっぱ数学の知識って必須よね? 俺もやってみようかと思ったけど、数学駄目ぽ
377 :
デフォルトの名無しさん :2005/09/29(木) 12:01:47
>>375 1.変数aに0から9の乱数を作る
2.変数bに0から9の乱数を作る
3.変数b==aなら2へ戻る
4.変数cに0から9の乱数を作る
5.変数c==aなら4へ戻る
6.変数c==bなら4へ戻る
378 :
デフォルトの名無しさん :2005/09/29(木) 12:04:21
>>375 1.0−999の乱数を作る
2.100の位、10の位、1の位を取り出す
3.100の位==10の位なら1へ
4.100の位==1の位なら1へ
5.10の位==1の位なら1へ
379 :
デフォルトの名無しさん :2005/09/29(木) 12:06:47
>>375 1.要素数10個の配列を作る
2.配列に順に0−9を入れる
3.0−9の乱数を2つ作る
4.配列の要素2つを入れ替える
5.十分な回数繰り返す
>>376 数学はあるに越したことはないけど
なくても何とかなることは多い。
あとは慣れ。
数学に強い人は理論的思考が得意な人が多いから、
最適化とか綺麗なコーディングとかの点で多少有利な程度。
381 :
375 :2005/09/29(木) 12:19:28
先生方サンクス! いろんな手法があるんですね
383 :
デフォルトの名無しさん :2005/09/29(木) 13:13:36
>>380 数学といってもレベルによる
汎用コンピュータ言語は全般的に中学で習う数学のレベルは欲しい
まあ、高校とか大学の数学でも基本的なことは中学と変わらないんだけどね
>>382 配列の初期化をmemsetでやってるのは、
どのレスの辺りからの流れ?
>>384 他スレで教えてもらいますた
たぶんゲ製作
>>382 input関数を改良してみよう
・数字を3桁一気に入力できるように
・入力に重複があった場合、再帰的に自分の関数を呼んでるので、
どんどんネストが深くなる(入力しだいで無尽蔵)
>>382 ・乱数系列の初期化をしていないから起動直後は毎回同じ数字になる。
・乱数を10の法で得るのはランダムネスが下がるから感心しないが……まぁいいか。
・マジックナンバーの3を散りばめ過ぎ。マクロ定数にでもしておけばinput()の修正だけで>369の言うヒット&ブローになるのに。
・馴れないうちは複文化推奨。殊にdo-whileを生で使うのは読み難いと言う弊害もある。
・make_answer()はwhileよりforの方がinput()と統一が取れてよくないか? いや、嫌なら構わんが。
・input()で末尾再帰とはいえ再帰はいかがなものかと。承知でやるなら止めないが。
・scanf()は感心しないなぁ。
・配列初期化をmemset()でやるのも……わかっててやるならいいが、わかっているかな?
・標準入力とgetch()を混ぜて大丈夫かな?
・nのみで終了か。Nだと終了しないのね。
>・配列初期化をmemset()でやるのも……わかっててやるならいいが、わかっているかな? 詳しく!
>>388 配列のメモリイメージを即座にイメージでき、0フィルすることで何が起きるか判断できるなら使っても医院で内科医。
但し、「取り敢えず0を埋めておけば安全だろう」という考え方は間違い。
callocでいーじゃん
0xDEADとか0xBEEFオススメ
1から50までの和を表示するプログラム作ってみたんだけど、これでOK? #include <stdio.h> int main(void) { int answer; int i; answer = 0; for(i=1; i<=50; i++) { answer = answer + i; printf("%d\n",answer); } return 0; } これやったら答え1250になったんだけど、これであってる? 確かめる方法ある?
50(1+50)/2よって答えは1275 たぶん…
ヒント:階差数列
>>394 ごめん答え言っちゃった…(´・ω・`)
>>392 俺がそのプログラムを実行すると1275になったわけだが。
>>393 なるほど、そういう求め方があるのですね。
>>394 階差数列・・・聞いたことないです。調べてみます。
>>396 こちらでもう一度実行してみたところ、1275でした。
どうやら見間違えたようです。
教えてくださった皆さん、ありがとうございました。
ところでanswer = answer + i;はanswer += iと書ける。
>>398 書けるじゃない、この場合はそう書くべき
402 :
デフォルトの名無しさん :2005/09/30(金) 00:46:53
別にどっちでもいいよ
ヒット&ブローというと4桁だけど #include <stdio.h> #include <stdlib.h> #include <time.h> #define KETA 3 int main(void){ int i,p,v,c,n,z,a[10]; for(i=0; i<10; ++i) a[i]=-1; srand(time(NULL)); a[z=p=rand()%9+1]=0; for(i=1;i<KETA;) if(a[p=rand()%10]<0){ a[p]=i++; z=z*10+p;} for(c=1;c<=10;++c){ printf("\n[%2d] >> ",c); scanf("%d",&n); for(v=0,i=KETA-1;i>=0;--i,n/=10) v+=(a[p=n%10]==i)?10:(a[p]>=0)?1:0; if(v==10*KETA) break; printf("%14c## %2dH %2dB",' ',v/10,v%10); } printf("\n\n <<%d>>\n",z); return 0; }
それでもいいと思うけど、実質初心者スレなんだから 初心者にも読める形でかいたほうがいいと思うぞ
>・標準入力とgetch()を混ぜて大丈夫かな? なにか問題あるの?
>387はgetch()を知らないんだよ。
static int ans_, usedNumber_[10]; static int getAns(void){ return ans_; } static void unUsed(void){ int i; for(i=0; i<10; ++i) usedNumber_[i]=-1; } static int evalUsedNumber(int p, int seq){ if(usedNumber_[p]==seq) return 10; if(usedNumber_[p]>=0) return 1; return 0; } static void setAns(int p, int seq){ usedNumber_[p]=seq; ans_=ans_*10+p; } void makeAns(void){ int i,p; unUsed(); setAns(rand()%9+1, 0); i=1; do{ p=rand()%10; if(usedNumber_[p]<0) setAns(p, i++); }while(i<KETA); } int isCorrect(int cnt){ int i,p,num,eval=0; printf("\n[%2d] >> ",cnt); scanf("%d",&num); for(i=KETA-1;i>=0;--i){ p=num%10; eval+=evalUsedNumber(p,i); num/=10; } if(eval<10*KETA) printf("%14c## %2dH %2dB",' ',eval/10,eval%10); return (eval==10*KETA); } void dispAns(void){ printf("\n\n <<%d>>\n",getAns()); } int main(void){ int cnt; srand(time(NULL)); makeAns(); for(cnt=1;cnt<=10;++cnt) if(isCorrect(cnt)) break; dispAns(); return 0; }
>407 どうせなら setAns(), setUsedNumber(), getUsedNumber() 用意しれw
409 :
408 :2005/09/30(金) 04:27:30
...って setAns() ダブっちゃうねorz
410 :
デフォルトの名無しさん :2005/09/30(金) 06:35:16
■参加方法
問題解きたい→どんどん解け
問題出したい→どんどん出せ!最近不足気味
採点したい→どんどんしろ
■今までに出された問題
>42 HelloWorld!を出しやがれ
>44 1から50までの和
>46 ファイルから読み込み大きい数から並べて
>52 物体が通る軌跡を求めろ
>106 まずは字句解析と行こうか
>124 神経衰弱、ブラックジャック
>125 ぷよぷよ
>126 ブロック崩し、インベーダ
>129 ジャンケンゲーム
>181 じゃぁ、1+3-5+7-9+11-13+・・・を50回
>207 ソートするプログラム
>215 スペース・タブを に変換
>224 次は構文解析だな
>229 HTML特殊文字をエスケープ
>236 ○×ゲームをつくれ
>331「Nullpoint」を入力したら「ッガ!!」
>367 コードブレーカー
■インデントする方法
・ を書き込むとスペースに変換されます
・タブやスペースを に置換して書き込むとインデントが整います
・メモ帖・秀丸・VSなどの、エディタの置換機能を使います
▼コツ
・タブを置換したい場合はエディタ上のタブをコピーして検索窓でペーストします
・スペースはインデント単位(2,4,8個など)でまとめて置換すると単独のスペースを無視できます
・ギコナビなら自動変換機能があります。
■解答はソース丸貼りか↓にうp
ttp://gamdev.org/up/
>124 神経衰弱、ブラックジャック >125 ぷよぷよ >126 ブロック崩し、インベーダ このあたりもうちょっと分解して出題してくれないかな
>>411 分解って、どういうこと
部品に分割してくれって事でいいのか?
リアルタイムなゲーム(
>>125 、
>>126 )の基本は以下の流れとなる
スタート→オブジェクト初期化→画面表示→自分を操作→敵を移動→当たり判定→終了判定→画面表示へ戻る
413 :
デフォルトの名無しさん :2005/09/30(金) 09:36:23
P2Pソフトの作り方おしえろ
415 :
デフォルトの名無しさん :2005/09/30(金) 19:08:45
>>412 ふつうのぷよぷよでは、入力に迷っている間にぷよが落ちてしまうのですが、
>>412 の手順だとこちらが入力に迷っている間はぷよも動かないと思うのですが、
それでもいいのでしょうか?
416 :
デフォルトの名無しさん :2005/09/30(金) 19:12:10
>>416 ヒントをお願いしてもいいですか?
それは標準ライブラリで実現可能ですか?
なにかのdllが必要ですか?
やっぱスレッド使うの? ぷよやアルルのアニメーション、入力操作を全部別々で そのあたりを詳しく教えてくれるとありがたいのです
お前の現在の知能では無理
説明できねーならカエラ
>>417 標準ライブラリでは無理。
SDLがお手軽。
スレッド使った方が便利な箇所もあるだろうけど、必須じゃないよ
>>412 にあるような流れを、短い周期で繰り返すわけ
アニメーションなら、ループが回ってくるたびに少しずつ動かしていくし
キャラの操作なら、いま入力があるかどうかを調べてキャラを動かす(入力なければ動かさない)
中学のときに陸上部サボってはコンピュータ部に遊びにいってたな 学校にはPC-9801があって、300ページ程度のいろいろな専門書が50冊くらいあった それを読んでぷよぷよを四ヵ月くらいかけて作ったのを覚えてる(対戦しかできないけど グラフィックはスーパーファミコンを持って来て一ドットづつ目視でコピー 横に並べて見てもほとんど区別付かないくらい精巧にできたよ グラフィックが大部分をしめてFDで二枚だった(2HDか2DDかは忘れた) 今でも仕事さえ無ければ二週間で程度で作れると思うな 適当にコードが書ければ難しくないと思う
>>417 画面表示→ちょっと待つ→入力あり→自分を操作…
└ ←入力なし ←┘
>>423 それって天才じゃない?
俺は理解できないエラーが出たら3日は潰れる
で、質問スレで質問して袋叩きにされる
>>423 今の奴は
>>421 みたく外部ライブラリに頼り切ってるからな
自分で自分に必要なライブラリも作ろうとはしない
腐り切った世の中になったもんだ
>>425 その考えがよくないだろ
理解できないのならもう一度作り直す
これが基本
他人にきくなんかもってのほか
429 :
423 :2005/09/30(金) 21:00:04
>>425 どこが?
自分で書いてるんだから理解できないエラーなんてまず起きなかった
しかも聞ける奴なんていないから(顧問ですらコード書けない)全部自分でしなければならない
今だとネットとかで人に聞けば解決できると思ってるから、自分で考えないから何もできなくなってるのかも
>>426 そうかもな
便利なライブラリがあるなら使うけど、本当にそれが自分に必要なのか考えなきゃな
自分で作ったほうが動作が早いし扱いやすいなら自分で作るべき
ハードウェアのためにロジックを書くのは無駄だと思うのです どこぞのゲーム会社社員が書いたライブラリとMSが定めたAPI どちらを選ぶかで何か得るものがあるとは思えない 欠陥だらけのAPIを修復する作業を通じて、本当にあなたは何か得たのですか?
432 :
デフォルトの名無しさん :2005/09/30(金) 21:05:02
>>431 敗北宣言乙
有害だから根拠のない精神論やめろ
とりあえず、リアルタイムキー入力はWindows環境なら_kbhit()と_getch()で良いんじゃない? Unix環境はtermio辺りだけど専門外なので詳しい人どうぞ どっちにしてもゲーム作った人がうpするときは自分の環境も記入の事
おまえら難しい話ばっかすんなよ! スレ違いじゃ!
437 :
デフォルトの名無しさん :2005/09/30(金) 21:25:25
itanium2の乗っているマシンでcのプログラムをつくっています。 gccでコンパイルしているのですが、 warningが出てコンパイルができません。 以下のようなエラーです。 warning: cast to pointer from integer of different size 引っかかっている場所は、 double *ini=(double *)malloc(sizeof(double)*1000000); という場所です。配列iniのサイズが小さいうちは以下のように double ini[10000] とすれば、通るのですが、大きなメモリ領域を確保しようと mallocを使うと上のようなエラーが出て、コンパイルできません。 調べてみると、64ビット系で起こるエラーであるということは わかったのですが、回避の仕方がわかりません。 どなたかご存じの方がいらっしゃったらお教えください。 OSはレッドハット8でカーネルは2.4.24です。
438 :
437 :2005/09/30(金) 21:28:04
スレ違いだったら、どこにポストしたらいいかご指導頂ければと思います。
>>437 > cast to pointer from integer of different size
440 :
デフォルトの名無しさん :2005/09/30(金) 22:03:18
結局ぷよぷよの作り方がわからない
>>440 真面目につくりたいなら、ゲ製作板とかで聞いた方がいいかもなー
443 :
421 :2005/09/30(金) 22:13:04
言語の標準でない他人が作ったライブラリを使うことが腐ってる、と考えてる人がいるなんて始めて知ったよ。 SDL_GetKeyState使うのも、strcmp使うのもなにも変わらないと思うけど。
scanf_sってどうですか ベンダー依存になりますがこれなら使ってもいい?
>>443 >>429 >便利なライブラリがあるなら使うけど、本当にそれが自分に必要なのか考えなきゃな
>自分で作ったほうが動作が早いし扱いやすいなら自分で作るべき
429ではないけれど、
SDLが悪いというのではなく、道具を選ぶことを怠るのが悪いと言いたいのでは?
万能包丁は便利だけどリンゴノ皮をむくには果物ナイフの方がいいかもしれないし、
サシミを切るには刺身包丁の方がいいかもしれない。
この場合の万能包丁や果物ナイフや刺身包丁の比喩のうち、
どれがSDLでどれが標準ライブラリなのか、なんて議論はナンセンスなわけで。
様々な道具がある中で何を選ぶかが問題なんじゃないかな。
そして、選ぶ時の選択肢は多い方がいいと思う。
ちょっと待て
>>423 は別にライブラリについて語ってるわけでもないのに、なんでまた
>>426 になるんだ?
で、なんでまたおまいらライブラリの是非について語ってるわけ?
標準ライブラリ以外認めないなら仕事にならんぞ、Javaとか特に
問題なのはライブラリを使うことじゃなくて、 ライブラリをブラックボックスとして使ってる人が増えたことだと思う。 中身を知らずに、分かろうとせずに使う。それが低レベル化に繋がってる。
win32apiやcライブラリもブラックボックスなんだが
先生!状態遷移ってどうやって管理してますか? 紙に○と→でメモしても多くなってくるとややこしくなっちゃいます
>>449 中身は隠されているけど推察はできる。
win32apiでもCライブラリでもSDLでも推察はできる。
推察をしようとしない人が多いのが問題だといいってるんだよ。
苦しくなってきたな
455 :
デフォルトの名無しさん :2005/09/30(金) 22:46:12
VRAMやワークエリアに直接アクセスできた時代がなつかしい そこでだ!おまえら勉強用に1チップMSXを買うっていうのはどうだ? 値段も手ごろ、資料は十分、サンプルもベーマガの歴史分だけある しかも経験者は数百万人以上いる 今回はMSX2相当になりスロットも2つ 前回の主だった要望が全て反映されてる BASICはもちろんZ80マシン語やハードウェアハックなど実力を養ういいチャンスだぞ
遠慮させて頂きます
まぁでも、実際当時のパソコンみたいに直接ポートをアクセスできるようなイメージの方が 簡単なゲームは作りやすい罠。 グラフィックも懲りようがなかったからシンプルでよかったし。
>>455 アクセスできないのってWindowsだけじゃないの?
461 :
x :2005/10/01(土) 00:19:28
出遅れたが今からオレも参加する
460はなにいっちゃってんの?? 我が目を疑ったよ
おいらが知らない間にこのスレ大分進行してるお(^^;)
>>410 とりあえずハローワールドだけかけたよ、今はここまでがあたいの限界…
#include <stdio.h>
main()
{
printf("Hello World");
return 0;
}
どうでしょうか…
ポポ素たん結婚して〜
・main()ではなく、int main(void) ・"Hello World"ではなく、"Hellow World\n"
>>463 この前の話聞いてなかったのか・・・ orz
そのコードは規格的には間違えてるよ・・・
コンパイラが勝手に修正してくれてるだけ・・・
>>463 文字列の最後の'!'が抜けてる
コレ些細なようで重要
469 :
ちぁ ◆7YYts5tb9s :2005/10/01(土) 03:53:58
入門書を読んだ後の後の人のために こういうものはどう作ればいいのかとかそういうのを書こうと思うんだけど 例えば何を書いたらいいかな? こういうのの解説が読みたいって人もプリーズ
教える事もわからない人間が書くなや
聞かれたことに答えない人間が書くなや
>>469 ネットワークの仕組み〜winny風P2Pソフトウェア開発への布石
>>472 入門書読み終わった程度の奴にソケットならまだしもP2Pはおもしがきついだろ
475 :
デフォルトの名無しさん :2005/10/01(土) 04:21:01
>>470 大体市販の入門書っていうのは
分かる奴が分からない奴は何が分からないか調べて書くと思うぞ
そいつも分からないことはかけないだろ
頼りない船頭だと言ってるんだろ
頼りないと思うなら乗らなければいいだけだろ だれも強制なんかしてないんだから
泥舟に乗る入門書を読み終わった程度の人も大変だな
必死だなこいつ かつあげかなんかにあってよっぽどイライラしてるんだろうな
したけどされてないぞ
なにもしない奴よりはましだとおもうけど
なにもしないほうがましな時もあるね。 C言語のクソ本やクソサイトは存在だけで迷惑だからなぁ… クソコード書く人間増やすなよ…
>>44 やってみたyo
#include <stdio.h>
int main(void)
{
int i, num = 0;
for (i = 1; i <= 50; i++)
{
num += i;
if (i != 50)
printf("%d たす\n", i);
else
printf("%d は\n", i);
}
printf("\n%d ですた\n", num);
return 0;
}
#include <iostream> int main() { int sum = 0; for (int i = 1; i <= 50; i++) { sum += i; } cout << sum << endl; return 0; }
時々で良いから階差数列の事、思い出してあげて下さい
時々で良いからCとC++の違いを思い出してあげてください
488 :
デフォルトの名無しさん :2005/10/01(土) 09:27:18
藻舞いらこれからはJavaだろ?
そこでDelphiですよ
int main()でreturnを通らずに関数の終わりまで到達した場合 C: 何か適当な値がreturnされる。 C++とC99: そこにreturn 0;と書いたのと同じことになる。(main以外の関数ではCと同じ)
Java興味あるけどここと同じようなスレある?
Delphiはないなぁ
過去 Java 現在 PHP 未来 Python
C#とDは?
495 :
デフォルトの名無しさん :2005/10/01(土) 09:46:32
俺は、C、C++を使いたいのに、 強制的にJavaだよ・・・ 今は、Javaばっかりでウンザリする
>>495 Javaでいいよ。
Cはシステム記述言語。
アプリ書きには生産性が悪すぎる。
しかしテンプレートは使ったらもうやめられない。
Perlカワイソス
次の問題まだー?
んじゃお題。○×ゲーム。 Man vs Man が出来たら Man vs Com も。 いわゆる AI なわけだが○×の AI は割と簡単。
我侭かもしれませんがC言語の勉強になる問題お願いします
>>504 それじゃとりあえずC言語のコンパイラを書きなさい。
何が悪いかわかってらっしゃらないようだ
ド素人のおいらが今から挑戦します
わかってない人にお題を与え、 プログラムを一から書かせても、 それはCの勉強にはならんだろう。 自己の乏しい知識のみで書くのだからな。 むしろ、○×ゲームの優れたソースを示し、 それを解読・改造させるべきではないのか? 教え方が間違っているような気がする。
511 :
デフォルトの名無しさん :2005/10/01(土) 14:18:40
ぷよぷよは大体わかったからスーパーマリオ頼む ブロックと当たり判定どうやってんの?
>>510 乏しい知識でソースを読んでも「わかったつもりになる」だけじゃないのか?
自分で作ったバグを自分で修正してこそ得られるものもあると思うが
>MSX2相当 >Z80マシン語 MSX2なら8bitじゃなかろーに?
16bitはTurboRのみ 国産RISC CPUのR800を積んだ名機でした 2+まではZ80
>>510 プログラムは書けなきゃ意味がない。
いくら読んでも書けなきゃ何もしないのと同じ。
自分で書いたあとに優れたソースを読むのがいいよ、たぶん
○×とコンパイラは過去に出てるので次出して
519 :
デフォルトの名無しさん :2005/10/01(土) 15:16:49
9月から大学でCのプログラミングの授業が 始まったんですけどついていけません・・・ 誰か良い勉強方法を教えてください!
>>519 学校辞めればいいじゃん
馬鹿は無理してやらなくていいよ
初心者用の問題 1・200510.txt ファイルに「2005.10.01 start」を書き込むプログラムを作ってください 「2005.10.01 start」はユーザが入力するものとします。 2・上記のファイルに書かれた「2005.10.01 start」の次の行に、 「2005.10.30 end」を書き込むプログラムを作ってください。 この「2005.10.30 end」もユーザが入力するものとします。 3・上記のファイルに書かれた「2005.10.01 start」と「2005.10.30 end」の間に、 「2005.10.02 test-1」を挿入するプログラムを作ってください。 この「2005.10.02 test-1」もユーザが入力するものとします。 4・上記のファイルに書かれたなかから、 「2005.10.02 test-1」の行だけを削除するプログラムを作ってください。 これらのプログラムでは、実行時に複数のファイルを作成しても構いませんが、 最終的に、200510.txt に書き込み(または削除)されるようにしてください。
初心者用の問題 三角形の各辺の長さを表す整数を入力として、 ・正三角形 ・二等辺三角形 ・不等辺三角形 ・三角形じゃねー を判断する [制約] 三辺の長さをパラメータとし、以下の値を返す関数を作って使う事 ・正三角形なら1 ・二等辺三角形なら2 ・不等辺三角形なら3 ・三角形じゃねーなら-1
○×製作者への課題 ・3x3に留まらず、5x5、或いは自由に設定できるように拡張せよ。 ・三次元○×を考えよ。例えば4x4x4限定でもよいが、どう見せるか工夫のし甲斐があるだろう。 #実は3x3x3だと明らかにゲームを破綻させる問題がある。回避できるか検討せよ。
>>510 どっちが早いかは人それぞれ
実践か解析していくのか好きなほうでやれば良い
>>522 戻り値は一致する辺の数を返すのがいいんでない?
正三角形は3、不等辺三角形は1って感じで。
>525 一致する辺の数を返す関数を作る そいつを使って ・正三角形なら1 ・二等辺三角形なら2 ・不等辺三角形なら3 でいいんじゃね?
>>525 不等辺三角形は1、って一致する辺の数かよ?
一致する辺がない != 三角形ではない のでちうい
一致する辺が2
一致する辺が3
だろ?
先生!! 521の1の問題はこれでいいんですか!? スペースが出力の対象になるかが心配ですけど… include <stdio.h> int main(void) { FILE *fp; fp=fopen("200510.txt","w"); fprintf(fp,"2005.10.01 start"); fclose(fp); return 0; }
>>528 問題をよく読みましょう
ファイル名は決まってるけど、入力は任意だよ
>>529 Σ(´□`;)すいません
出直してきます…
>>519 授業は教える側のペースで進むから、その速度で理解できない人は当然出てくる。
だから適当に良書と言われている簡単なCの入門書を読んで自分で勉強しよう。
授業でわからなかったとことか、次にやる部分とかを中心にやれば単位も余裕でもらえるさ。
どーでもいいけど全体を設計してから些末にこだわってくれ。
先生!! 今度はできましたか!? 521の1 include <stdio.h> int main()void { FILE *fp; int i; fp=fopen("200510.txt","w"); fscanf(fp,"%s",&i); fprintf(fp,"%s",i); fclose(fp); return 0; }
↑かなり間違ってました… スルーして下さい
>>533 コードはコンパイラにとおして自分で動作を確認してから提出しよう
>>535 礼儀がなってませんでした…
コンパイラDLしてきます
>コンパイラDL まじかよ!
>>537 なにか間違ってましたか!!(;´д`)
537じゃないが、今までコンパイラなしでやろうとしてたのかと小一時間(ry
パソコンが家にないし買えないけどプログラムの勉強をしたいって以外で、まずコンパイラを用意しないなんてことが あり得るなんて思わなかった。 想定外。
もう荒らしにきません。 死んできます
>誰か良い勉強方法を教えてください! ヒント:家庭教師
>>527 おいおい、>522と>525をあわせれば
正三角形:3
二等辺三角形:2
不等辺三角形:1
非三角形:-1
だから辻褄は合ってるだろ?
要は、>522のように正三角形を1とするか>525のように正三角形を3とするかの違いだろ。
>544 "一致する辺の数"っていってるのに 1 = 同じ長さの辺が無い ってのが理解しがたいんだと思われ 例えば 正三角形:3 二等辺三角形:2 不等辺三角形:0 非三角形:-1 ならどーよ?
>124 神経衰弱、ブラックジャック >このあたりもうちょっと分解して出題してくれないかな 神経衰弱 ・マーク4種(スペード/ハート/ダイヤ/クラブ)、数字13種(A,2,...,10,J,Q,K) の計52枚使用 ・シャッフルしてテーブルに並べる。例えば13×4とする ・プレイヤーはテーブルから2枚を指定する。 2枚の数字が同じならテーブルから取り除く(≒次に指定できなくする) ・全部取り除かれたら終了 →拡張 ・複数人数で対戦できるように ブラックジャック ・マーク4種(スペード/ハート/ダイヤ/クラブ)、数字13種(A,2,...,10,J,Q,K) の計52枚使用 ・シャッフルして台札とする。 ・プレイヤーの手札として最初に2枚配る。 ・プレイヤーはもう1枚必要かどうか指定し、台札から取り出す...を繰り返す。 ・手札の追加不要の場合は点数を計算し終了。 →拡張 ・対CPUで対戦できるように(コインを賭けてやり取りするようにするもよし)
> for (i = 0; i < 3; i++){ > if (array[0][i] == 1) strcpy(line1[i], "○"); > if (array[0][i] == 2) strcpy(line1[i], "×"); > } > for (i = 0; i < 3; i++){ > if (array[1][i] == 1) strcpy(line2[i], "○"); > if (array[1][i] == 2) strcpy(line2[i], "×"); > } > for (i = 0; i < 3; i++){ > if (array[2][i] == 1) strcpy(line3[i], "○"); > if (array[2][i] == 2) strcpy(line3[i], "×"); > } 【常識】同じような処理をソース上で繰り返してはいけない ・ループで記述 ・場合によっては関数化
>>549 できればやり方を教えて頂ければありがたいのですが・・・
もっと短くできると思ったのですが、どうしたらいいのかわからなくて・・・
>550 1.lineも配列の配列にする 2.二重のforループで
>>551 ありがとうございます
さっそくやってみます
> 【常識】同じような処理をソース上で繰り返してはいけない 誰が決めたんだ?
誰が? 常識って"誰か"が決める事なのか?
民意です
>>553 ・プログラムが無駄にでかくなる
・重複部分を変更する時に面倒(部分的に忘れてバグ招くこともある)
コピペソースは悪 ヒント:動作するきれいなソースコード
> printf("縦:"); > if (scanf("%d", &x) != 1) return 1; : > printf("横:"); > if (scanf("%d", &y) != 1) return 1; ...厳しすぎorz (英文字入れると即死亡)
> 【常識】同じような処理をソース上で繰り返してはいけない これは違うんじゃないの? 同じ処理を繰り返さないのは同意できるけど 同じような処理だと、別に書いたほうが速度的にもコード的にも良くなることもある
>>560 コンパイラがloop unrollして最適化することもあるしな。
同じようなって時点で共通部分があるってことだろ そこだけでも関数化すりゃええやん
"こともある "っつー事は例外ってことだろが? 大抵は >556
コード的には良くないな 速度的にねらって書く人は次元が違うし 今日からCを学ぶ人には繰り返すなと言うだろ
「同じような」という言葉が意味するところが曖昧 次からは使わないように
>>559 疑問に思ったら自分でも相手の書いたとおりに実行してみよう。
scanf("%d",...)は、数字以外の入力があると(他の関数でその文字を引き取らない限り)
何度呼び出しても永遠にこぬ数字を待ち続けてしまう。
>559 Error1してほすいって事だね >死亡
>566 もまえ...よく嫁w
どうやってもすぐ終了してしまう・・・
Cだけだとマウス使えないのでWin32API使っていい?
もれは hantei(int n)の「同じような」処理の繰り返しが気になりますたよ >559
>572 つーかむしろもれは hantei() で結果表示せず、呼び元ですりゃええやんって思つた >559
永遠にこぬ数字を待ち続けてしまう 萌えw
575 :
566 :2005/10/01(土) 21:11:58
>>569 えーと、取り敢えず>559と遡って>558は読んだけど。
>575 > if (scanf("%d", &y) != 1) return 1; ってなソースについての話題だということなのは読んで理解できたのか?
577 :
566 :2005/10/01(土) 21:22:37
>>576 だから、scanf()は何度呼び出しても数字以外の文字は入力できないと書いたのだけど?
578 :
566 :2005/10/01(土) 21:23:35
あー、納得。行間を読んでもらえてなかったのか。 正直すまんかった。
はあ?「何度呼び出しても」だぁ? だからそーゆー話題ぢゃねーってw
あー、納得。ロジックを追う事ができてなかったのか。 正直すまんかった。
お前ほらふき?
>>566 scanf()の問題点を指摘するより先ず、そこがmain()ルーチンだと言うことが問題だ。
ソースくらい読んでから指摘しろ。
>>566 にレスする香具師ら
釣られるな。
583 :
デフォルトの名無しさん :2005/10/01(土) 21:34:03
さっぱりわからない・・・。 ハローワールドと1から50までの和を計算するプログラム(階差数列使ってない) を作り終わった俺は次に挑戦するものとして妥当なものは何だろう?
>そこがmain()ルーチンだと言うことが問題だ どんな問題だ?教えちくりくり
ファイル操作でもいかが? 上の方に問題あったな
588 :
デフォルトの名無しさん :2005/10/01(土) 21:38:15
589 :
デフォルトの名無しさん :2005/10/01(土) 21:38:57
>589 どっちかっつーと小学校の算数だな
592 :
デフォルトの名無しさん :2005/10/01(土) 21:44:43
>>590 小学校かぁ・・・
そういや、テキストエディタ作れるレベルにいくのが目標だったよ・・。
それ目指して頑張ります。
文字打てて保存できるぐらいのやつ。
あんまりファイル操作って面白い話題がないんだよな... ・1〜50の和計算の応用で、ファイルに書かれた数値の和計算 ・電話帳ファイルへの登録、検索 → 上級編:削除 ・○×の応用:ゲームの手順をファイルに保存、後で読み込んでゲームを再生 とかどうかな?
595 :
デフォルトの名無しさん :2005/10/01(土) 21:57:02
>>594 ファイルに書かれた数値の和を計算 をやってみます。
プログラムの流れとしては、
ファイルから読み込んだ数値を変数に代入〜
みたいな感じでやってみます。
ポインタを使用する超超簡単な問題をお願いします
>>592 三角形の3辺ABCは、
Aの2乗=Bの2乗+Cの2重、がなりたつ。
というのが分かれば後は何となくできるはず。ガンガレ
このスレ一気にレベル高くなり杉。 もっと落としてくれよ。
流れぶったぎって独り言 役が決まっている部分は関数化するといい。 (既出だけど)○×判定部分はgudge()とか、税金の加算なら*1.05(*105/100)はtax()とか、ファイルに保存するならsave_file()とか。 役割を洗い出す作業ができれば、C++やJavaのオブジェクト指向で綺麗にモデリングできる。 それに関数をさけることで速度低下を気にする時代は終わった。あとから単調に糞長いソースをバグ取りするのは死ぬほど面倒だし挫折する。 main()内が30行を越えるくらいになれば関数化を勧める。無理矢理する必要はないけどね。
>>591 細かいようだけど最後の、
>もう一度やりますか?(はい= 1 / いいえ= 2)\n->
で1以外を入れたら2でなくても終了するのは直した方が良いかも。
はい == 1 / いいえ != 1
>役割を洗い出す作業ができれば、C++やJavaのオブジェクト指向で綺麗にモデリングできる ウソツキ
それでもできないよりはできるほうがはるかにましだ。
【問題】 100,000までの素数の数とその計算にかかるコストを求めよ もっともコストが少ない者を優勝とする 締め切りは10月2日の終わりまで コストは次の通り(コストの計算にかかるコストは考慮しなくてよい) 1 代入 1 +- 2 */% 3 ループ これ以外のコストは0とする あらかじめ答えや類するものを用意するのは禁止 偶数はチェックしなくてよい 抜け道イパーイあるので実力に応じた方法でご参加ください
607 :
デフォルトの名無しさん :2005/10/01(土) 22:57:55
>>606 ループにかかるコスト の定義が曖昧だなぁ。
ループ一周につき無条件でコスト3かかるのか?
途中でbreakした場合は?
条件分岐のコストは0でいいのか?
>>606 *と/%のコストが同じなのはいかがなものか。
>>607 +-を使った計算やa=bといった代入を使うたびに足される点数
少ないほうが勝ち
>>608 終了判定で発生
>>609 ゲームバランス考えたら落しどころかなと
おまいら、おちつけwwww 解る奴はともかくこれじゃ初心者は何の何にレスしてるかわからんぞwww 雑談はともかくプログラムの採点の場合元のソースにレス付けろ 【>>xxxの採点】こんなのを1行目とか名前に入れてしまえ
ジャンル:ポインタ 難易度:低 問題:aとbはそれぞれいくつになりますか?実行せずに考えてください。 #include <stdio.h> void add1(int *a, int b) { b *= 2; *a += b; } void add2(int *a, int *b) { *b *= 2; *a += *b; } int main() { int a, b; a=2; b=3; add1(&a,b); add2(&a,&b); printf("a=%d\n", a); printf("b=%d\n", b); return 0; }
a=14, b=6
>>613 どうしてそうなるんですか?
手順を追って説明をお願いします
ジャンル:ファイル 難易度:低〜中 問題: その1: 実行回数を数えるカウンタを作ってください 初めて実行するときはファイルがないので作成し"1"を保存して終了します 2度目以降はファイルを読み込み1加算し保存します 実行するたびに2,3,4,5と増えていきます その2: 1万回を超えたら(その1)とは別のファイルに現在の日付と時刻を書き出して カウンタを1にもどしてください ファイルが無い場合は新規作成し日付と時刻は次の行に追加で書き込むようにしてください その3: 複数起動しても大丈夫なように修正してください ※OSの不具合を考慮する必要はありません
>どうしてそうなるんですか? 実際に動かして見ろよ まず
>>616 612 = 614 で、613に説明つきの回答を要求してるんじゃまいか?
>実際に動かして見ろよ
問題
>そこがmain()ルーチンだと言うことが問題だ どんな問題だ?教えちくりくり
再度呼ばれることなく終了するってことでそ
おまいら、おちつけwwww 解る奴はともかくこれじゃ初心者は何の何にレスしてるかわからんぞwww 雑談はともかくプログラムの採点の場合元のソースにレス付けろ 【>>xxxの採点】こんなのを1行目とか名前に入れてしまえ
漏れの脳内インタプリタは a = 20 b = 12 を吐いた バグか...orz
>>621 俺の脳内インタプリタは
>>613 と同じだったな
add1のbには*が付いて無いからmainのbはadd1を抜けた時点では変わらないぞ
俺の脳内インタプリタはエラーを吐いたよ。 処理し切れませんって。 みんな脳内インタプリタ性能よすぎ
624 :
621 :2005/10/02(日) 01:11:13
add1()から抜けるときにbの値をお持ち帰りしてたよ… a=14,b=6になりました
Delphi興味あるけどここと同じようなスレある?
>>625 いまさらDelphiも無いとおもうが、自分で立てたほうが良いんじゃない?
627 :
デフォルトの名無しさん :2005/10/02(日) 02:15:25
>>612 答えはa=14, b=6でいいんだよね。よっしゃよっしゃ。
ちょっと頭がズキズキしてきたから寝る。
628 :
デフォルトの名無しさん :2005/10/02(日) 02:28:41
お前らが分からないことはなんだ? ポインタくらいか? 説明書いてやるよ
>>628 ああ。ポインタの説明書いてくれ
チラシの裏にでもな。
>>628 ファイルポインタについての説明がほしい
632 :
デフォルトの名無しさん :2005/10/02(日) 04:55:22
633 :
デフォルトの名無しさん :2005/10/02(日) 05:50:44
俺も問題出してみる ジャンル:型 難易度:低 問題:以下のコードは正しい結果を出力しません。間違いを指摘しなさい。 #include <stdio.h> int main(void) { //table配列の10個の要素の値の平均を求め、出力する。 int table[] = { 16, 21, 17, 32, 24, 21, 27, 19, 24, 28 }; int i; double sum = 0; for( i = 0; i < 10; i++ ){ sum += table[i] / 10; } printf("%f\n\0", sum); scanf("%d", &i); return 0; }
お前が分からないから聞きたいだけだろ?
足しながら割ってるから外に出せばいいんじゃないの? 型の問題じゃないじゃん
ごめん そういう意味か そういう意味で型なのか
638 :
デフォルトの名無しさん :2005/10/02(日) 05:57:51
>>633 table[] が整数型だから?
ポインタの問題が欲しいにょろ
sum += table[i] / 10.0; にすればオッケーオッケー
型変換って規格なん? 勝手にされるとかなり不便なんだけど
毎回割ると誤差がでるから 最後に割ったほうがいいってことかな for( i = 0; i < 10; i++ ){ sum += table[i]; } sum /= 10;
stdio.hを見るとファイルポインタは構造体で、現在のシーク位置や 読み書きの挙動を決定するフラグが入ってるっぽい。 なんとsizeof(FILE) == 32
>>640 double d;
d = 1;
error: 整数を実数型に代入することはできません。
とか言われたらそれはそれでいやだが。
>>643 なんで?
勝手に変換するからできないだけで、変換しないようにすれば普通に代入できると思うけど
>>643 その場合はキャストされないと代入されるかと。
>>644 ん、整数と実数の内部表現はだいぶ違うよ。
うわぁ〜〜〜〜〜〜〜〜〜〜〜 あいたたたたたたた
奥が深けぇ〜 聞いてるだけで勉強になった
649 :
デフォルトの名無しさん :2005/10/02(日) 06:17:05
>>647 痛かったら我慢しないで救急車呼んだほうがいいにょろ
650 :
デフォルトの名無しさん :2005/10/02(日) 06:57:38
>>615 その1出来たヽ(・∀・)ノ
でもその3全然わかんねー
perlならファイルロックすればいいけどC言語にそんな命令あったっけ?
#include <stdio.h>
int main()
{
FILE *fin, *fout;
int counter;
char *filename="counter.txt";
//ファイルを読み込むか、無ければカウント数を1にセット
fin=fopen(filename, "r");
if (fin!=NULL)
{
fscanf(fin, "%d", &counter);
fclose(fin);
counter++;
}
else
{
counter=1;
}
//カウント数をファイルに書き込む
fout=fopen(filename, "w");
fprintf(fout, "%d", counter);
fclose(fout);
return 0;
}
みんなすごいね スレ主のはずのあたいはぜんぜんついていけず…(∵)
なんかあたらしくかいたの??
test
age
ポポ素たん結婚してお
>>642 処理系依存だからFILE構造体の中は触っちゃダメ。
>>633 ・この程度の平均処理なら、sumはintでいいね。
・printf()は%fを使う人が多いけど、寧ろ%g推奨。%fは不必要に小数点以下6桁まで出てしまう。
・文字列リテラルに"\0"を含めることは(意図的に利用する場合を除き)無意味。
・配列の要素数は人間が数えるべきじゃないし、コンパイラは既に知っている。
・ましてループが終わった段階ではループ制御変数がまさしくその値になっている。
よって、>633の場合こうなる。
--
int table[] = ...;
int i;
int sum = 0;
for (i = 0; i < sizeof(table) / sizeof(*table); ++i) {
sum += table[i];
}
printf("%g\n", (double) sum / (double) i);
/* 要素数を取得するのに毎度毎度sizeofの割り算をするのがいやならマクロを組むといい */
--
尚、C++ではこんなコード書いてたらダメ。
657 :
デフォルトの名無しさん :2005/10/02(日) 09:09:01
>>615 の3は排他処理のこと?
flock版を作ったけど、もしかして意味間違ってる…?
>>657 このアップローダ形式って今は見られるし見やすいとは思うんだけど、例えば過去ログ落ちして
アップローダから削除もされると情報として無価値になってしまわない?
現在進行形で見てる人だけでいいならそれでも構わないけど、わりと有用なスレになってるし
ここに直接プログラムを書いたほうが後々のことを考えるといいかも。
660 :
デフォルトの名無しさん :2005/10/02(日) 12:14:09
>>615 の解答(
>>657 を転載)
#include <stdio.h>
#include <time.h>
int read_count(const char *filename)
{
FILE *fin;
int counter;
//ファイルを読み込むか、無ければカウント数を1にセット
fin=fopen(filename, "r");
if (fin!=NULL)
{
fscanf(fin, "%d", &counter);
fclose(fin);
counter++;
}
else
{
counter=1;
}
return counter;
661 :
デフォルトの名無しさん :2005/10/02(日) 12:14:40
void write_count(const char *filename, const int counter) { FILE *fout; //カウント数をファイルに書き込む fout=fopen(filename, "w"); fprintf(fout, "%d", counter); fclose(fout); } void write_log(const char *logfilename) { //日付と時刻をファイルに書き込む FILE *fout; time_t now; struct tm *tm_now; char buf[80]; now = time(NULL); tm_now = localtime(&now); sprintf(buf, "%d/%d/%d - %d:%d:%d\n", tm_now->tm_year+1900, tm_now->tm_mon, tm_now->tm_mday, tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec); fout=fopen(logfilename, "w+"); fprintf(fout, buf); fclose(fout); }
662 :
デフォルトの名無しさん :2005/10/02(日) 12:15:12
int main() { const char *filename="counter.txt"; const char *logfilename="log.txt"; int counter; counter=read_count(filename); if (counter > 10000) { write_log(logfilename); counter=1; } write_count(filename, counter); return 0; }
663 :
デフォルトの名無しさん :2005/10/02(日) 12:21:00
>>660-662 で全部です
>>615 その2に対する解答です
採点よろしくお願いします
その3がわからないのでヒントをお願いします
ファイルロックの問題とは思いますが手元の本(K&R)には
そういった命令が見当たりません(今読み返してる最中です)
>>612 add1の関数内では
a=8
b=6
になる
aはポインタだからmainでも計算結果が残る
bはコピーされた別の変数だから残らないので
add1が終わったmain関数ではa=8,b=3
add2の関数内ではa=14,b=6
両方ポインタだからmainの変数も内容が変わる
答えはa=14,b=6
ファイルに何か記号を書き込み、実行ファイル終了時にそれを消すとか変えるとかすればいいのでないのかな そして、記号があるときは他からは書き換えられないようにすればいいのでないのかな 素人考えだけど
他から書き換えられないようする方法がわからないです
他から書き換えられても別に問題ないだろ 要はロックできるかどうかだろ
標準Cにロックの関数とかはないから、 Windowsなら#include <windows.h>でLockFile UNIXならlockf (fcntl)なりflock
flock(fileno(fp), LOCK_EX); これですか?lockfだとundefined functionエラーがでてしまいました
んな環境依存な方法使わんでもロックくらいできるだろうに。
そりゃ初耳だ
ロックファイル作ってもできるが、強制終了後に残ったゴミの 処理とか、よけいめんどい。
ファイルのパーミッション落としたら?
>>673 異常終了した時の事を考えたらパーミション変更は得策じゃないな
Windowsだったらどうするの。
676 :
デフォルトの名無しさん :2005/10/02(日) 21:07:43
>>676 マルチの宿題ですのでスルーします( ノ゚Д゚)ヨッ!
燃料投下。 問題。 文字列を受け取って、その並びを逆順にして返す関数を書きなさい。 簡単すぎ?
問題 数字の文字列を受け取って、3桁区切りに','カンマを付けた文字列を返す関数を書きなさい 簡単杉?
なんで自分が分からないことを問題と言うことにして投げてくんの?
>>679 文字列を受け取って逆順という事で、以下の手順
1.受け取った文字列の先頭と最後の文字を入れ替える、
2.2文字目と最後から2文字目を入れ替える
3.上記を文字列の真ん中まで繰り返す。(※最後まで繰り返すと元に戻るので注意)
>>680 intの範囲に限定すると、表現できる数値は2^31〜-2^31の範囲(2147483648)で10桁、符号用に1桁、カンマが3回入るのでchar out[15]で宣言すればよい
あとは、3桁ずつ割った余りを後ろから順に割り当てていけば良い
1.1000で割った余りをout[12]から出力(右詰、商が0で無いなら"0"埋め)
2.1000で割った商が0でないなら、out[11]にカンマを出力
以下適当に
実は >680 は >679 を使うと良いらしい...
684 :
デフォルトの名無しさん :2005/10/03(月) 04:48:05
sleep(5); というところで implicit declaration of function `sleep' というウォーニングがでるのですがなぜですか?
686 :
684 :2005/10/03(月) 04:53:34
知合いにプログラミングをしたいといって全ての環境を(パソコンもふくめ)用意してもらったので分からないのですが unameすると、Open-BSD_Model-MA となります 多分その友達がOpenBSDに手をいれたものだと思います
>>686 #include <unistd.h>
しても出る?
688 :
684 :2005/10/03(月) 04:59:04
>>687 それででなくなりました
ありがとうございました
でもなんでウォーニングがでるだけでヘッダが無いのにエラーがでないんですかね?
英語読む気は無いの?
690 :
684 :2005/10/03(月) 05:03:55
sleepの機能の暗黙の宣言がありません でいいでしょうか? どうかいしゃくしたらいいかわからない・・・
なんで環境作ってもらった人に聞かないの? カーネルとかOSに手を入れれる人だからかなりの腕の持主だと思うけど
>>688 libcはリンクされてるからヘッダがなくても呼び出すことはできる。
コンパイル時に引数の数や型のチェックされないけど。
693 :
684 :2005/10/03(月) 05:10:32
>>691 その人はなんか自分で使うものは自分で作るのが一番とかいって
OSも自分で作ったりしてるマニアです
あんまり喋ったりしたくありません。
それにプログラミングで分からないことは自分で考えて解決するべきで
数日考えても分からない箇所以外は聞くなといわれています
>>692 そうですかわかりませんけどありがとうございました
>>680 へたくそですが作ってみますた
#include <stdio.h>
void reverse(char str[], char tmp[]){
int i, j, k = 0;
for (i = 0; str[i] != '\0'; i++);
for (j = i - 1; j >= 0; j--, k++)
tmp[k] = str[j];
tmp[k] = '\0';
}
void insert_comma(char tmp[], char ans[]){ int i = 0, j = 0, cnt = 0; while(tmp[i] != '\0'){ if (cnt == 3){ ans[j] = ','; j++; cnt = 0; continue; } ans[j] = tmp[i]; i++; j++; cnt++; } ans[j] = '\0'; }
int main(){ char str[250], tmp[250], ans[500], ans2[500]; gets(str); reverse(str, tmp); insert_comma(tmp, ans); reverse(ans, ans2); puts(ans2); return 0; }
>あんまり喋ったりしたくありません。 お友達嫌われたもんだなw
ワロタヨーーーーーーーーーーー >その人はなんか自分で使うものは自分で作るのが一番とかいって 自分の手料理が一番っていってるとあんまり変わらないと思うけど 何がご不満?
OS作るのが手料理か
三分間ハッキング
>>698 丁度いい、朝飯にWindows互換OSでも作ってくれ。
ごめん、作る手間じゃなくて 自分が好きなように、自分が必要なものを作るっていういみでは似たようなものっていいたかったんだけど・・・
>>702 だからOS作るのは手料理みたいなもんなんだろ?えらいひとなんだねえ
俺も今年の四月から週末二日をほぼ毎週ログハウス作りにかよってる 息子(12才)、娘(9才)と嫁を連れて行くのが楽しみで仕方が無い 息子の友達の家族とかもよんだりして楽しいよ 丸太っていうのが阿呆みたいに高いけど自分が好きなように、自分の作りたいように作るっていうのは 非常に素晴しい あ… これは関係ないか… ごめん
不満?とんでもない関心してるだけですよ?
このスレッドは簡単なOSも作れない程度の人間のためのものだからな
>>708 今日からC言語を学んでいくぞーという人にOS作れと言うのはちょっとねー
>>708 作れるって言うならOracleやPowerPointの動くOS作ってよ。話はそれからだ。
なに? このばか
車輪の再発明をしないことこそ学ぶべきだな。 性能の劣る再発明ならなおさら。
こいつも阿呆だな
とりあえずOS作ってみてよ。誰も使わないジコマンOSをさww
そりゃ自分が使いやすいように作ったら 自己満足のOSになる罠 あほなのか?
>>714 君が何のOSを使ってるかはしらないけれど
君なりにいろいろディレクトリの配置とか決めてるんじゃないの?
それが自分が使いやすいようにって事
他人がその環境を使って使いやすいと思うとは限らないでしょ?
717 :
デフォルトの名無しさん :2005/10/03(月) 07:58:31
>>679 #include <stdio.h>
void reverse(char *str)
{
if (str[0]==NULL)
return;
else
reverse(&str[1]);
printf("%c", str[0]);
}
int main()
{
char *str="vip quolity";
reverse(str);
return 0;
}
>逆順にして返す 返す
>>717 再帰は遅いしCRTリンクを必然にしてしまうからあんまり感心しない。
大体にそれは逆順にstdoutに出力してるだけ。文字列の反転じゃないじゃん。
おもいっきし愚直に書けばこうかな。
#include <string.h>
void strrev(char *str)
{
char* p1 = str;
char* p2 = str + strlen(str) -1;
char tmp;
while (p1 < p2) {
tmp = *p1;
*p1 = *p2
*p2 = tmp;
p1++;
p2--;
}
}
こうか #include <string.h> char* strrev(char *str) { char* p1 = str; char* p2 = str + strlen(str) -1; char tmp; while (p1 < p2) { tmp = *p1; *p1 = *p2 *p2 = tmp; p1++; p2--; } return *str; }
721 :
デフォルトの名無しさん :2005/10/03(月) 08:17:55
>>680 #include <stdio.h>
#include <string.h>
void kanma(char *str)
{
if (str[0]==NULL)
return;
if ((strlen(str)%3)==0)
printf(",");
printf("%c", str[0]);
kanma(&str[1]);
}
int main()
{
char *str="1234567890";
kanma(str);
return 0;
}
CRTリンクって何?
>>722 VC++なんかだとATLプロジェクトの利用でCランタイムをリンクしない小さなバイナリが吐けるの。
再帰コールはCランタイムによって提供される機能だから、必然的にCRTが必要になる。
>>723 よくわかりました
ありがとうございます
>>723 再帰なんてコンパイラはただの関数呼び出しのコードを吐けばいいだけだからCRTは関係ないだろ。
日本語も反転できるようにしてみた。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> #define BUFFER 256 #define MBMAX 2 void reverse(char *dest, const char *src) { wchar_t wbuf1[BUFFER], wbuf2[BUFFER]; int i, j; size_t len; mbstowcs(wbuf1, src, BUFFER); len = wcslen(wbuf1); for (i = len - 1, j = 0; i >= 0; i--, j++) wbuf2[j] = wbuf1[i]; wbuf2[j] = L'\0'; wcstombs(dest, wbuf2, BUFFER); }
int main(void) { char buf[BUFFER]; setlocale(LC_ALL, ""); fgets(buf, BUFFER - 1, stdin); buf[strlen(buf) - 1] = '\0'; reverse(buf, buf); puts(buf); return 0; }
730 :
デフォルトの名無しさん :2005/10/03(月) 09:28:11
>>726 だから、その吐き出した再帰コール関数をサポートするのがCランタイムライブラリなの。
Schemeみたいに見た目上再帰をサポートするものでも実行時にループに展開する言語処理系もあるし
再帰がまったく実現できないものもある。
アセンブラで再帰呼び出しができるか試してみたら?
>>731 コンパイルしてアセンブリソースをダンプしてみたけど、再帰関数に直接CRTが関わってる箇所は一個もないんだが・・・
どこに使われてるの?
>アセンブラで再帰呼び出しができるか試してみたら?
特にできなくなる理由が見あたらないんだけど・・・
教えてエロい人
>>730 ようするにprintfとかの標準関数の本体が入っていると思えばいい。
>>731 サポートなんて必要ないの。
アセンブラでも再帰呼び出しは普通の関数呼び出しと同じようにできる。
なぜか?やることは普通の関数呼び出しと何も変わらないからに決まっている。
ちなみに再帰をループにするのはC/C++でも行われることもあるが、それは最適化の問題でコンパイラの仕事。
736 :
デフォルトの名無しさん :2005/10/03(月) 11:02:16
関数スタックフレーム作成にCランタイム必要なんてのはi8080/Z80のCコンパイラ位しかみたことない
737 :
デフォルトの名無しさん :2005/10/03(月) 12:28:41
CRTCRTうsるせー。そんな言葉知るか!!!!111
crtはOSとプログラムのインターフェースだから 「そんな言葉知るか」という発言を聞くと、ああ 「インターフェースを軽視するのだから単体で動くプログラムしか書いたことがないのだな」 と考えてしまう
>>738 はCRT分かってる?
分かってるような肝するが分かってないような着もする
>>694 > void reverse(char str[], char tmp[]){
> 以下略
この関数に関してはちゃんと動いてるっぽい。
気になる点は、まず仮引数の名前。どっちが入力でどっちが出力なのかが
分かりやすい名前だとありがたい。
それから、仮引数の順番。これは単なる私の好みなのかもしれないけど、
出力となるほうを左に持って来て欲しい。なぜそうして欲しいかと言うと、
引数の戻り値として結果を返す関数とかでも、結果の型を知ろうとすると、
当然左側に目が行くし、代入文だって右から左に入れるっていうイメージだから。
以上2点を踏まえている
>>727 さんの、
> void reverse(char *dest, const char *src)
は、非常に読みやすい。const が付いてるので、
「ああ、この関数では、src が示すメモリの中身は変更しないんだな」と、
はっきりさせてくれている点もすごくいい。
今思ったんだけど、プログラミング言語ってconstをデフォルトにしたほうがいいんじゃないか?
何言ってるかさっぱりなんですが
次の問題おねがいします
あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛ ポインタを使う利点や意味がわかんねえああああ ポインタが何かは理解できたが 使わんでもええやん! ポインタ使わないとCを理解してないとか言われたし どーなん!?
>>746 ポインタを使わないでできることをポインタを使わないだけなら寧ろよく理解できているのではないかと。
ポインタを無闇と使うことこそ理解が足りてないと思う。
全部ポインタにしなくていいんだ・・・ よかったありがとうさんきゅう!
cの関数における引数は、すべて値渡しだから、 下位関数側で値を設定する引数はすべて引数のポインタを渡さなければならない ということが理解できていれば充分だよ
でも他人のソースを読む場合は、ポインタを駆使してるものがあったりするから困るね。
751 :
デフォルトの名無しさん :2005/10/03(月) 17:21:07
必要な機能を実現するために使っているのか、処理を最適化する為に使っているのか見極められれば完璧
ポインタ謎い 調べれば調べるほど謎い 数値を受け取った関数は、 それを元に計算して、戻り値として返す。 「しかし変数の中身を直接変更したい場合に困る」 この変数の中身を直接変更しなきゃならない場合がわからない・・・。 あーもうわかんね!
あー 関数内から呼び出し側の変数を操作したい時・・かな? すっごい連投すんまそヒマだったらこの馬鹿めにかみくだいてポインタを・・・
自己理解してきた・・・
簡単なポインタの問題おねがいします
757 :
デフォルトの名無しさん :2005/10/03(月) 17:39:04
【問題】
4つの<>で区切られた5つのデータがあります
(※データに<や>は含まれますが<>は含まれません)
左から名前、メールアドレス、日付、本文、タイトルです
タイトルは1行目だけに含まれています。
それぞれの長さはわかりません。0文字以上です。
これがたくさんあります(大抵は1001行以下ですが超えることもあります)
これをHTMLに整形してもらいます
全体の一番初めは<html><body>です
タイトルを<h1>(タイトル)</h1>で囲みます
整形済みのデータが複数行並びます
最後に</body><html>を入れます
次に1行ごとの整形方法を示します
(行数):<font color=green>(名前)</font>(日付)<br>(本文)<br>
これを行数分だけ繰り返します
最後に拡張子をhtmlで保存して完成です
元になるデータが入ったファイルはこちらです
http://pc8.2ch.net/tech/dat/1127501670.dat 整形後の例)
<html><body>
<h1>おまいら!今日からC言語を学んでいくぞー!</h1>
1 :<font color=green><b>ポポ素 </b>◆Qgm8RFT0/. <b></b></font>:2005/09/24(土) 03:54:30<br>あたいのスペックは <br>
26歳フリーター、パソコン歴インターネット歴は6年 <br>しかしそれ以外の事は何もできにゃーい… <br>
</body><html>
(´・ω・`)
一行の長さがどれくらいになるのかわからないファイルを読んで 処理するのは、すごくむずかしいです。
ヒント:realloc、線形リスト
【問題】何が表示されるでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { typedef struct seiseki_tag { int no; struct seiseki_tag *next; } seiseki; seiseki *head=NULL; seiseki *pos, *prev; int i; head=(seiseki*)malloc(sizeof(seiseki)); pos=head; for (i=0 ; i<10 ; i++) { prev=pos; pos=(seiseki*)malloc(sizeof(seiseki)); pos->no=i; pos->next=NULL; prev->next=pos; } pos=head->next; while(pos!=NULL) { printf("%d\n", pos->no); pos=pos->next; } return 0; }
>>14 の無料のやつ落したけど、
そもそも使い方がわかりません。コンパイルしたら
Error test01.rc 1 10: Cannot open file: stdio.h
とか言われる……。設定の仕方が悪いのかな。
こういう初歩の初歩みたいな質問はどこでやったらいいんでしょうか……
一度に何個も出題するな
>>762 そんな質問するなよ。
付属の説明や解説サイト見ればできるようになっている。
>>762 だからreadmeを嫁とあれほd(ry
>>764-765 readmeは読んだyo! 読んでもわかんないんだyo!
解説サイトって何処ですか?
>>766 じゃあバカでも使えるコンパイラ買って来いや
お前ら宿題がネタだとなぜわからないかな
ジャンル:ポインタ 難易度:低 問題:このプログラムには2箇所間違いがある 画面に2と表示されるように修正しなさい #include <stdio.h> int main() { int *a; int b=1; a=b; //間違い1 b++; printf("%d", a); //間違い2 return 0; }
( ´D`)ノ<アーイ
#include <stdio.h> int main() { int *a; int b=1; a = &b; b++; printf("%d", *a); return 0; }
774 :
デフォルトの名無しさん :2005/10/03(月) 19:23:03
#include <stdio.h> int main() { int *a; int b=1; /* a=b; */ b++; printf("%d", b); return 0; }
>>767-768 初心者捕まえてバカバカ言うことないだろー
いじわるーヽ(`Д´)ノ ウワァァン!!
>>773 正解
問題の題意を汲み取った完璧な回答です
100点
>>774 正解
出題者の想定してなかった意外な回答です
120点
>>757 1行目にタイトルが含まれていないんですけど・・(´・ω・`)
778 :
デフォルトの名無しさん :2005/10/03(月) 20:38:41
>>777 ポポ素 </b>◆Qgm8RFT0/. <b><><>2005/09/24(土) 03:54:30 <> あたいのスペックは <br
> 26歳フリーター、パソコン歴インターネット歴は6年 <br> しかしそれ以外の事は何もでき
にゃーい… <br> というわけで今日から参考書を買ってがんばります! <br> 今まさに私み
たいに、これからCを勉強するぞって人いたら
<br> よろしくね <>おまいら!今日からC言語を学んでいくぞー!
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
あるじゃん
>>775 初心者という単語をバカの免罪符にされてはかなわんな
>>775 ばーかばーかm9(^Д^)プギャー
ガキ臭い
#include <stdio.h> int main(void) { printf("775は馬鹿ですw"); return 0; } //勉強になったろ?
とりあえず、C言語の初歩missionCってのを買った 明日からやって見る
<>を「\n」に置換するか <>で区切れば。
とりあえずマリちゃん萌え
>>784 >ワープロ(ソフトでなく単体ハードのね)についてたタイピング練習ゲームみたいな
馬鹿にするなよ。ワープロのタイピングゲームには流麗なイベントCGなんてついてなかったんだから。
>>776 うそwww120点?
ポインタ使わなかったから0点かと思った
789 :
デフォルトの名無しさん :2005/10/04(火) 01:36:20
ポインタの問題もっとほしいのにゃ
お題 回転シフト n文字の文字列が与えられたとして、m文字目(n>m)までを回転シフトする関数を作れ 例) ABCDEFG の 3文字目までを回転シフト → DEFGABC 制約1)ポインタ使うこと 制約2)作業領域は 1文字分だけしか使ってはいけない →応用)上記制約の元、できるだけ高速にシフトできるものを作れ
(´・ω・`)わかりません
792 :
デフォルトの名無しさん :2005/10/04(火) 05:49:21
制約がよくわからにゃい
これじゃポインタ使わない方がよさそうだけど #include<stdio.h> int main(void) { char *p="ABCDEFG"; int i; for(i=0;i<7;i++){ putch(*(p+(i+3)%7)); } return (0); }
>>790 一生懸命考えましたが、初心者なのでこれが限界です_| ̄|○
もっと短くしたいのでアドバイスよろしくお願いします
#include <stdio.h>
int main(){
char str[100], *str_p, ans[100], *ans_p, *p;
int num, i;
str_p = str;
ans_p = ans;
p = str;
printf("文字列を入力してください:");
gets(str);
printf("整数を入力してください:");
scanf("%d", &num);
str_p = str_p + num; while(*str_p){ *ans_p = *str_p; str_p++; ans_p++; } for (i = 0; i < num; i++){ *ans_p = *p; ans_p++; p++; } *ans_p = '\0'; printf("%s\n", ans); return 0; }
そんなつまんない問題じゃなくてもっと作ってて楽しいやつにして
>>796 どんなのが楽しいんだ?
俺が新人研修で使ったのは、簡単な画像処理だったなぁ。
BMPの読み込み、書き出しだけはスケルトンで用意しておいて、
エフェクト部分の関数だけ作らせる。モザイクとかグレースケール化とか。
ポインタの基礎とビットシフトさえ使えれば作れるからそれなりに好評だったけど
このスレのレベルよりはちょい高めだろうか
モザイクやグレー化に何故ビット処理?
32bitABGRでピクセルごとの値を与えて、NTSC加重平均でグレースケール化してたから。
801 :
デフォルトの名無しさん :2005/10/04(火) 09:00:17
802 :
デフォルトの名無しさん :2005/10/04(火) 10:03:35
>>801 ポインタの勉強としては良いが、実際のプログラムでこんな事はするな
絶対にだ
こんなことをしなきゃならないのは設計が悪い
出される問題文の日本語が変だし、回答として示されているプログラムを見ると、
基本的な認識の共有が回答者側に出来ていない気がします。
>>790 > n文字の文字列が与えられたとして、m文字目(n>m)までを回転シフトする関数を作れ
> 例) ABCDEFG の 3文字目までを回転シフト → DEFGABC
「3 文字目までを回転させる」と言われれば、4 文字目以降は回転させないんだな、
と考えるのが普通じゃないか? 例で示されているほうを信じたとして、俺が問題を
書き直すとすれば、「与えられた文字列の全体を m 文字分回転させる」という表現
になる。
>>793 >>794 問題文は、「……する関数を作れ」とあるわけだから、その機能を main 関数内に
閉じ込めてしまうのは違うと思う。問題文にきちんと従えと言いたい訳じゃなくて、
キーボードから入力させた文字列を回転させるのか、ファイルから読んだ文字列を
回転させるのか、もっと他のどこかから持って来た文字列を回転させるのか、という
選択を、関数を「使う側」に任せる形で切り離した方が勉強になると思うのです。
回転させた結果をどうするか(ファイルに書くのか画面に出すのか)という選択も然り。
ユーザー定義関数・について質問なんですが、 プロトタイプ宣言で調べていると 戻り値のデータ型 関数名(データ型 引数1,データ型 引数2…) ; ↑のようになっています。 それで猫やこのスレでもたびたび、戻り値のデータ型の所が voidになってるのですが、これで宣言すればどんな型の戻り値でも 対応してくれるものなんですか?
画像処理の問題やりたいから出せ
>>804 void型は何も返さない
今抽出して見て見たがvoid型の関数を使ってるやつは
ポインタのアドレスを渡して使ってるから何も返さなくても値が変更される
>>804 ちがうよ。
戻り値のデータ型が void ってなってる関数は、戻り値を返せないよ。
この関数は値を返しません、っていう印として、 void を書きます。
この説明で、
「全く完全にちっともさっぱり値を返さない関数に意味があるのか?」とか、
「値を返さない関数の内部から、外部に向けて情報を渡すことは100%不可能なのか、」
という疑問を持ってくれるとうれしいんだけどな。
>>806 そうなんですか(゚∀゚)ありがとうございます!!
アドレスの場合にはvoidでもいいという事ですか。
勉強になりました!
>>807 猫でも返せないと言っていたんですが、実際には情報を
返せてますが、これはどういう事なんですか?
>>809 >>806 >今抽出して見て見たがvoid型の関数を使ってるやつは
>ポインタのアドレスを渡して使ってるから何も返さなくても値が変更される
読んでくれよ(´・ω・`)
>>810 すいませんでした・・・以後、気をつけます(。_。)
何となく理解できました!答えてくださった方々
ありがとうございました<(_ _*)>
812 :
デフォルトの名無しさん :2005/10/04(火) 11:48:17
>>790 /*よろしくおねがいします*/
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 80
void rotate(char *str, const int shift)
{
int str_length;
int i;
char str_tmp;
if (shift<=0)
return;
str_length=strlen(str);
str_tmp=str[0];
for (i=0 ; i<(str_length-1) ; i++)
{
str[i]=str[i+1];
}
str[str_length-1]=str_tmp;
rotate(str, shift-1);
return;
}
813 :
デフォルトの名無しさん :2005/10/04(火) 11:48:48
>>812 の続き
int main()
{
char str[MAX_LENGTH];
char char_shift[MAX_LENGTH];
int int_shift;
printf("%d文字以内の文字列を入力してください(1バイト文字のみ使用可)\n", MAX_LENGTH);
fgets(str, MAX_LENGTH, stdin);
str[strlen(str)-1]='\0';
printf("何文字分シフトさせますか?\n");
fgets(char_shift, MAX_LENGTH, stdin);
sscanf(char_shift, "%d", &int_shift);
printf("%sを%d文字シフトさせます\n", str, int_shift);
rotate(str, int_shift);
printf("%s\n", str);
return 0;
}
>>805 24bitビットマップをグレイスケール化するプログラムを書け
無茶か
>>815 ヘッダとかの知識がないと無理だと思われ。
非透過GIF画像の色を適当にかえるプログラム ヘッダ(先頭の30バイトくらい)をちょっといじれば出来る
質問なんですが、void kansuu(char *a){...}という関数があったときに、 これはcharの変数のポインタを渡してあげて関数内で中身を変更してもらうという意味ですか? charの配列の名前を渡すと、配列の中身を変更してもらうということですか?どっちでもOK?
>>805 xpm2ppmを作れ。xpmフォーマットもppmフォーマットも気の利いたグラフィックツールなら読めるし、
どちらもテキストベースだ。資料もWebで充分見つかるだろう。
>>818 どっちの意味でも使えるけど、説明がなくchar *なら普通は後者の配列を想像する。
>>818 一概には言えない。
例えば、その関数は単に文字列を受け取りたいだけかもしれない。
821のいうように文字列を受け取りたいだけならconst char *にすべきなんだけど、 実際にはそうしていないプログラムも多いんだな。
ppmでググったらいかがわしいサイトがでてきた いくら二次元が好きだからって時と場所を考えてくださいです><
あー、俺も昔それひっかかった 大学の演習で ppm 画像関連の課題が出て、ぐぐったらそこにぶちあたったよ
>>818 数バイト程度ならまだしも、数十キロのエリアを実体で渡す事は...
と言うわけで、仕様書次第 関数マニュアルみれ
しかしこういう所みてると
有効桁数50桁の割り算作れとか言いたくなるよなぁ〜
採点できないからグッとこらえて..
826 :
デフォルトの名無しさん :2005/10/04(火) 17:25:17
何のためなんだろう・・・
828 :
デフォルトの名無しさん :2005/10/04(火) 18:28:03
>>827 俺か?826に語りかけてるのか?このはずかしんぼめ!!
過去問解きたい人のために決まってるじゃないかおバカさん
かーみーちゅー
俺も遅れながら勉強しようと思って、このスレ最初から見たけどさ、 猫のページでC++1.51が必要って時点で、既に挫折したんだけど・・・ 調べてみると今は、6.0じゃないと駄目だって言うし・・・ どうしろと?
何故無理にバージョンを合わせる
だって、バージョン合わないと、わからなくね? 俺、エクセル2002の資格もってるけど、会社のエクセル2000、やっぱ分かりづらかったもん ましてや、C言語なんて、きっちりいっしょの事やっていかないと、途中で分からなくなりそう・・・
買えば?
買えばって、今は売ってないって聞いたけど?
>>831 >>833 CやC++自体はISOやJISが標準を定めていて、どこもこれに従っているから、
とりあえず自分の環境でのコンパイルの仕方さえわかれば、後は基本的に猫でも何でも問題ない。
>>833 バージョンが下がると「あれがないこれがない」になるから使いづらくなる。
逆に上がるほうなら使いやすくなるのか、というわけでもないけどさ。
>>836 ふーむ、ならばやってみるかな・・・
再三悪いけど、買うのはそれれ6.0でいいの?
なんかVisual Studio .NET 2003 Professional
とかいうのもあるけど、どっちがいいとかあったら教えて
無理に買わなくても、無料配布されてる2005β2でいいんじゃない?
一番手っ取り早いのは Borland のフリーのコンパイラじゃねー? ダウンロードして解凍して設定ファイル書き換えれば1時間以内にプログラミング開始できる。 Linux とか FreeBSD いれてみる余裕がハードディスクにあるなら、是非それを勧めるけどね。 手にはいるソースコードとドキュメントの、質と量が半端じゃない。 「strlen 関数って、中身どうなってんだ?」と思ったときにすぐに見に行ける環境って、 初心者にとって最高だと思う。
最近はkodersあたりですぐ調べられるからなぁ
844 :
デフォルトの名無しさん :2005/10/05(水) 02:02:06
どなたか いろんな数nについてn!を計算するプログラム nCr=n!/r!(nーr)!を計算する関数のプログラム 2次方程式 ax2+bx+c=0の解を複素解まで求められるような関数のプログラム 作っていただけませんか??
回文判定(易しい) 2バイトかな文字列を入力させ 回文になっているかどうかを判定するプログラムを作れ 例)たけたぶやけた 応用→回文を作るプログラムを作れ(意味のある文を作るのは難易度高し)
>803 回転シフトというのは ABCDEFG → BCDEFGA この操作を1として、 → CDEFGAB → DEFGABC 最初の文字列の3文字目まで、という意味で書いた >「与えられた文字列の全体を m 文字分回転させる」 なるほど ついでにこの問題の解答(?)としては 文字列を2つに分けて AB Aをひっくり返し [AR]B Bをひっくり返し [AR][BR] 全体をひっくり返す [[AR][BR]]R = BA とするのが良いとされている 要素が多い場合でも 1要素分の作業領域しか使わずにすみ それなりに早いプログラムとなる
>694 void reverse(char str[]){ int i,j; char tmp; for (i = 0; str[i] != '\0'; i++); /* i=strlen(str); */ for (j = 0; j <i-1; ++j,--i){ tmp=str[j]; str[j]=str[i-1]; str[i-1]=tmp; } } とかすれば別の領域が不要になる
すげー・・・なにげに良スレになってる・・・
850 :
デフォルトの名無しさん :2005/10/05(水) 06:10:57
ポポ素たん結婚してー
おはよーみんな!!!
>>850 …正解(;。;)
あたいはあたいのペースでがんばるね…
なんかすごいね皆さん、はたしてこれらのソースを理解できる日が
あたいにもくるのかな?…
また分からなくなったら聞くね…そのときは先生方、よろしくお願いしま〜す♪
>>851 あたいでいいのかい?笑
まだC言語のドアのノブを握ってまわそうとしてる所くらいの知識だよん★
>>826 か、かみさま!(笑)
ありがとう!(^^)早速お気に入り登録★★★
>>844 #include <stdio.h>
#include <assert.h>
#define ASSERT assert
int input()
{
char buf[10];
int ret_num=0;
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d", &ret_num);
return ret_num;
}
int kaijo(int num)
{
ASSERT(num>=0);
if (num<2)
{
printf("1 = ");
return 1;
}
printf("%d * ", num, num-1);
return num*kaijo(num-1);
}
int main() { int ans, num; printf("数値を入力してください\n"); num=input(); printf("%dを入力しました\n", num); printf("計算をはじめます\n"); ans=kaijo(num); printf("%d\n", ans); return 0; }
856 :
デフォルトの名無しさん :2005/10/05(水) 09:50:04
>>846 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
//マクロ定義
#define ASSERT assert
#define BUFSIZE 4096
//プロトタイプ宣言
int iskaibun_2byte(char *src);
int main();
//実装部
//! 回文か判定します
/*!
1文字以上の2バイト文字のみの文字列が必要です
半角文字が含まれるとうまく動きません
戻り値
回文なら1
回文でないなら0
*/
int iskaibun_2byte(char *src)
{
int src_size, i;
src_size=(int)strlen(src);
ASSERT( (src>0) && (src_size%2==0) );
for (i=0 ; i<src_size ; i+=2) { if(src[i] != src[src_size-i-2]) return 0; if(src[i+1] != src[src_size-i-1]) return 0; } return 1; } //!全角カナを受け取り回文か判定するプログラム int main() { char buf[BUFSIZE]; printf("全角カナで回文を入力してください\n"); fgets(buf, sizeof(buf), stdin); buf[strlen(buf)-1]='\0'; if (iskaibun_2byte(buf)) printf("回文です\n"); else printf("回文じゃないです\n"); return 0; }
fgets()は末尾に改行文字があることを保証していない。改行文字であるか確認するべき。 標準入力が閉じられることを考慮して、戻り値もチェックしておいたほうが無難。 strlen()の戻り値をキャストするのはなぜ? コンパイラを黙らせるためのキャストは避けるべき。
860 :
デフォルトの名無しさん :2005/10/05(水) 12:00:47
>>857-858 ワイドキャラかマルチバイト文字列関数で書いてくれw
まあ、動くのは認めるけど
ちょっと
>>46 で質問なんですけれど、
たとえばファイルは、
1334
234
5698
556
76
のように1つの行に1つの数字のみ書いてあると仮定していいんでしょうか?
いいと思うよ
つっこみどころ満載だと思いますが
>>46 です。
#include <stdio.h>
int main(void)
{
FILE *file;
int s[100];
int i,j,n;
file=fopen("number.txt","r"); //number.txtは読み込むファイルです
for(i=0;(fscanf(file,"%d",&s[i])!=EOF);i++){
for(j=i;j>0;j--)
if(s[j-1] < s[j]){
n=s[j];
s[j]=s[j-1];
s[j-1]=n;
};
};
for(j=0;j<=i-1;j++)
printf("%d\n",s[j]);
fclose(file);
return 0;
}
あんまり突っ込むところはないけど、fclose()はループ直後がいいかな。 #要らなくなったらできるだけ早く開放しましょう。
おれも
>>46 やってみた。
自作の sort と、ライブラリの qsort 両方試してみたら、qsort メチャはやい。
もちろん要素数は 100 じゃなく、65536 個で試してみた。
遅いほうのソート関数。
void sort(unsigned short *ia, int size) {
int i, j, tmp;
for (i=0; i<size-1; i++) {
for (j=i+1; j<size; j++) {
if (ia[i] < ia[j]) { tmp = ia[i]; ia[i] = ia[j]; ia[j] = tmp; }
}
}
}
データとして現れる数字は、0-65535だから、
私の環境では unsigned short int が 2byte なのでぴったり。
ある意味、最速のソート。 データ数が多い場合qsortより遥かに速い。 void sort(unsigned short*ia,int size){ int count[65536]={0}; for(int i=0;i<size;++i)++count[ia[i]]; for(int i=65536;--i>=0;) for(int j=count[i];--j >= 0;) *ia++ = i; }
>>866 おめでとう。遅いコードを書けたということはqsort相当に向けて改善の余地がたくさんあるということジャマイカ。
>>790 こんな感じで作ってみました。
作ってから
>>847 を見たけど、なるほどそういう方法があるのかと思っちゃいますね。
#include <stdio.h>
void rotate(char *str, int m)
{
char *head=str, temp;
int i;
for(i=0; i<m; i++){
temp = *str;
while(*str != '\0'){
*str = *(str+1);
str++;
}
*--str = temp;
str=head;
}
return;
}
int main(void)
{
char p[]="ABCDEFG";
rotate(p, 3);
printf("%s\n", p);
return 0;
}
870 :
デフォルトの名無しさん :2005/10/05(水) 19:18:42
今日からC言語の授業が始まったのですが分からないので質問します 宿題で「画面にクラス・番号を表示して次の行に名前を表示するプログラムを作れ」というのがでました まったく分からないので教えてくれませんか?
#include <stdio.h> int main(void) { puts("クラス:番号\n名前"); }
872 :
デフォルトの名無しさん :2005/10/05(水) 19:23:39
>>871 ありがとうございますm( __ __ )m
かなり助かりました〜
#class <number> int main(name) { }
874 :
870 :2005/10/05(水) 19:25:55
あれ? 今頃気づいたのですが問題の最後に「2回printf文を使う」って書いてあるorz すみませんが もういちどお願いできますか?
>>874 なんというか、これで詰まってるようじゃ先が心配だが......
#include <stdio.h>
int main(void)
{
printf("クラス:番号\n");
printf("名前");
}
875 わざわざvoidかかなくても・・・。
877 :
875 :2005/10/05(水) 19:49:49
あー、871のを適当にコピペしたから残ってた。
答えを教えるよりヒントだけのほうがよくねえ?
879 :
870 :2005/10/05(水) 19:53:20
>>875 今日はまだprintfの意味しか教えてもらっていないので全然分からないんですorz
ありがとうございました
ロクなヒントも出せないくせに
俺が悪かったよ
このスレ見てて難しいけどやりがいあってすごい楽しそうだなーと思った。 まったくわからないけど今日から参加おk?
>>884 せめて入門書のようなものを一冊読んでからにしない?
>>885 そう…明日コーチャンフォー逝って買ってくるわ。
わかった出直してきまつ
まだ誰も解いてない問題ある?
色々あるけどnlog2nのソートってどれ使っても似たようなもん?
892 :
デフォルトの名無しさん :2005/10/06(木) 00:38:46
Nの階乗を求めるプログラムができない。 Nにゼロまたはマイナスの値が入力された場合、エラー出力は行わず再びNの値の 入力をユーザに促し、入力を待つところがうまく書けない。 #include <stdio.h> int fact(int N); main() { int N; printf("N = "); scanf("%d",&N); N = fact(N); printf("N! = %d\n" , N); } int fact(int N) { if(N == 0) return(1); else return( N * fact(N - 1)); }
>>847 の方法ってこれでいいかな。
void reverse(char *str, int left, int right){
char temp;
for( ; left<right; left++, right--){
temp = str[left];
str[left] = str[right];
str[right] = temp;
}
return;
}
void rotate(char *str, int m){
int length = strlen(str);
reverse(str, 0, m-1);
reverse(str, m, length-1);
reverse(str, 0, length-1);
return;
}
>>892 do{
printf("N=");
scanf("%d",&N);
}while(N<=0)
とかはダメかな
895 :
デフォルトの名無しさん :2005/10/06(木) 00:50:51
>>895 >>894 でいけるよ。
階乗計算はdo-whileを抜けてからやるから問題ない。
あと変数は小文字がいいかと。
#include <stdio.h>
int fact(int n);
int main()
{
int n;
do{
printf("N=");
scanf("%d",&n);
}while(n<=0);
n = fact(n);
printf("N! = %d\n" , n);
}
int fact(int n)
{
if(n == 0) return(1);
else return( n * fact(n - 1));
}
ところで0の階乗は1と定義されていなかったっけ?
898 :
デフォルトの名無しさん :2005/10/06(木) 01:08:22
899 :
デフォルトの名無しさん :2005/10/06(木) 01:10:57
>>897 0とマイナスは無視して書かないといけません。
>893 voidなら 最後のreturnは いらないよ
>>900 voidでも書いておけって人もいるし、そこは結構宗教論になるからなぁ。
どちらでもいいんじゃない?
>>860 わからないので調べてきました
charの替わりにwchar_tを使えってことでいいですか?
905 :
デフォルトの名無しさん :2005/10/06(木) 11:40:35
任意の長さの文字列の単語を辞書順に並び替えて最終結果だけ表示するプログラムが作りたいんですが、まったく分かりません。教えていただけないでしょうか?
元のデータはどういった形でメモリに収められているんだ それとも自由に全部つくっていい問題? qsortで終わりだと思うが問題は一字一句変えずに全部転載してくれ
907 :
デフォルトの名無しさん :2005/10/06(木) 12:16:51
wchar_tってC言語?MS独自?
>>908 Cに含まれている。特定のヘッダをインクルードすると使えるようになる。
C++ではintやcharと同じ基本型となった。
>>910 まさか。
文からして大学の宿題の丸投げだろ。
たぶんこんなん↓
JANUARY APRIL
FEBRUARY AUGUST
MARCH DECEMBER
APRIL FEBRUARY
MAY JANUARY
JUNE → JULY
JULY JUNE
AUGUST MARCH
SEPTEMBER MAY
OCTOBER NOVEMBER
NOVEMBER OCTOBER
DECEMBER SEPTEMBER
エクセル使えば一瞬で解ける
914 :
910 :2005/10/06(木) 16:35:47
>>910 のやつは、勉強のために書いてみました。結構苦労した。
長くなっちゃったので、こっちには載せなかったんだけど、
できましたら、突っ込み宜しくお願いします。
ああ、二通り解釈あるのか 納得
916 :
デフォルトの名無しさん :2005/10/06(木) 17:00:02
このプログラム何がおかしいんですか? #include<stdio.h> void func1(int x, int y); int func2; void func3(int x, int y); void func4(int *p, int *q); void func5(int x); int a = 1, b =2; main() { int a = 3, c = 4; printf("in main a = %d\n",a); printf("in main b = %d\n",b); printf("in main c = %d\n",c); func1(++c, b); a = func2(); func3(a,c); printf("in main2 a = %d\n",a); printf("in main2 b = %d\n",b); printf("in main2 c = %d\n",c); b = func4(&a, &c); printf("in main3 a = %d\n",a); printf("in main3 b = %d\n",b); printf("in main3 c = %d\n",c); func5(a); }
917 :
デフォルトの名無しさん :2005/10/06(木) 17:02:30
>>916 の続き
void func1(int x ,int y)
{
double z;
z = x / y;
printf("in func1 x = %d\n",x);
printf("in func1 y = %d\n",y);
printf("in func1 z = %.3f\n",z);
}
int func2()
{
int b = 5, c = 6;
printf("in func2 a = %d\n",a);
printf("in func2 b = %d\n",b);
printf("in func2 c = %d\n",c);
return(b);
}
void func3(int x, int y)
{
a = x + y;
}
int func4 (int *p. int q)
{
*p = 7;
*q = 8;
return(*p + *q);
}
void func5(int x)
{
printf("in func5 a = %d\n",a);
}
>>619 ×int func2;
○int func2();
新しい問題まだぁ〜?
暇だから石取りゲーム作れ なるべく強いCPU希望
石取りゲームの詳細を
ググったら伊藤家の食卓のゲームだった しかも必勝法あり ツマンネ
俺からもついでにお題 ジャンル:ランダムの取り扱い 問題:ランダムにパーツを組み合わせて簡単な顔AAを作る 詳細: あらかじめ「輪郭」「目」「口」といったパーツを文字配列に用意しておき、(格納の仕方は各自工夫する) 実行時に各パーツからランダムに1つ選び出して組み合わせ、AAにして出力する。 標準関数のsrand、randを用いること。 ちなみにここで言う簡単なAAとは、(´・ω・`)や(・∀・)のようなものを指します。 暇だったらドウゾ
やってみるお
輪郭、頬、繭、目、鼻、もし複数行になっていいならカツラや帽子、髪の毛だな 他にパーツあったっけ?
複数行だとちょっと難しくなりそうだな
文字の横幅が何ドットかって取得できる?
コンソール出力なら等幅固定でいいと思うお
通信やりたい
あ、微妙に間違ってた
>>931 顔の右輪郭と左輪郭もランダムかよw
);皿・[
↑こんなのとか。w
我が家にはconio.hさんがいません。
935 :
933 :2005/10/06(木) 19:45:39
たぶん getch のために conio.h 必要なんだろうから、getchar に変えちゃった。 それから、-Wall でコンパイルすると、「time ってなんだよ?」って言って来たので、 time.h を include しました。
コンパイラによって全然違うんだな〜
937 :
デフォルトの名無しさん :2005/10/06(木) 20:08:14
#include<stdio.h> #include<stdlib.h> #include<math.h> void main(void) { /* 宣言 */ FILE *fout; float a,b,c,d,e,n,m,r; char fnout[20]; printf("nとrを入力してください(ただしn>r):"); printf("n= \n"); scanf( "%5d" , &n); printf("r= \n"); scanf( "%5d" , &r); /* nの階乗 */ a=1.0; while(n>1.0){ a=a*n; n--;} どこが間違ってますか?!
938 :
デフォルトの名無しさん :2005/10/06(木) 20:09:25
937の続き /* rの階乗 */ b=1.0; while(r>1.0){ b=b*r; r--;} /* n-rの階乗 */ c=1.0; e=n-r; while(e>1.0){ c=c*e; e--;} /* 計算結果 */ d=(a/(b*c)); お願いします!
まず何がしたい
>>937 組み合わせを求めたいんだよね。
scanf( "%5d" , &n); 間違い
scanf( "%5f" , &n); 正解
でも最後のdの計算をいじればd以外はintでいいと思うけど。
winnyの技術買ってきた
PDFでWinnyに流されるんでしょ? 今買おうか迷ってるんだが・・・
>>942 スレにふさわしく、C言語にてwinnyを1から作ってみよう。
>>942 内容めちゃ難しい?
ネットで買おうかどうか迷ってる
>>940 英語のとおりやろ
cppファイルどこに置いてんのさ
>>946 とりあえず、Administrator\My Documents\Visual Studio Projects\CPP
となってます
ちなみにCPPフォルダだけは自分が作りました
ハローワールドのファイルを格納するために
で、アドミニストレーターのフォルダに直接ぶち込んだら、出来ました・・・
アドミニストレーターに、CPPフォルダを作ってそこにいれても、できませんでした
つまりアドミニストレーター以上は、フォルダを作れないみたいです。
これってひょっとして、アドミニストレーター以降も、フォルダ名打ち込まないといけないんですか?
Winnyの技術読み終わったらソケットの勉強はじめるぜ
ある本で >「int」は、「main関数が整数を返す」という意味です。 >return文を使って「0」を返している。 と書いてあったのですが「返す」とはどういうことでしょうか? 先輩方教えてください。
>>945 難しいけどじっくり読めばわかる感じ
内容のわりに、スゲーわかりやすく書いてる
>>949 返すとは結果を伝えると言えばいいかな。
main以外の関数を使い出せばわかってくると思う。
>>951 そうなんですか。恩に着ます!
何せ今日から始めたもんで。
953 :
デフォルトの名無しさん :2005/10/07(金) 00:07:50
>>949 さんとは別人ですが、便乗質問します。
いろいろ google した結果、 main 関数の返す値は、プログラムの終了コード(終了ステータス)に
なることがわかりました、UNIX だと、直前に終了したプログラムの終了コードを確認するには、
sh だと、echo $? で、csh だと echo $status で表示させることが出来ることもわかりましたが、
Windows のコマンドプロンプトでは、どうやればいいでしょうか。
>>867 既知のアルゴリズムだよ。
ただ実際にはqsortやマージソート、ヒープソートなんかが使われるのは
この方法にはいろいろ問題があるわけで
・整数しか扱えない。
・数字のとりうる値の範囲が大きいとメモリを馬鹿食いする。たとえば32ビット値なら要素数2^32の配列が必要になる。
考え方自体は有用ではある。
ちょっと改良すればハッシュ法なんかに応用できる。
うお。乗り遅れた
958 :
ポポ巣 ◆Qgm8RFT0/. :2005/10/07(金) 07:28:06
//ネットワークプログラミングはじめました。まずは初期化。 #pragma comment (lib, "WSock32.lib") #define WIN32_LEAN_AND_MEAN #define MAJORVERSION 2 #define MINORVERSION 2 #include <windows.h> #include <winsock2.h> #include <stdio.h> int main() { WSADATA wsaData; int err; err=WSAStartup(MAKEWORD(MAJORVERSION, MINORVERSION), &wsaData); if (err != 0) { printf("エラーコード %d\n", err); switch (err) { case WSASYSNOTREADY: printf("ネットワークサブシステムがネットワークへの接続を準備できていない\n"); break; case WSAVERNOTSUPPORTED: printf("要求されたwinsockのバージョンがサポートされていない\n"); break; case WSAEINPROGRESS: printf("ブロッキング操作の実行中であるか、またはサービスプロバイダがコールバック関数を処理している\n"); /*
*/ break; case WSAEPROCLIM: printf("winsockが処理できる最大プロセス数に達した\n"); break; case WSAEFAULT: printf("第二引数であるlpWSAData は有効なポインタではない\n"); break; default: printf("原因不明\n"); } } else { printf("正常に初期化できました\n"); } printf("iMaxSockets %d\n", wsaData.iMaxSockets); printf("iMaxUdpDg %d\n", wsaData.iMaxUdpDg); printf("lpVendorInfo %x\n", wsaData.lpVendorInfo); printf("szDescription %s\n", wsaData.szDescription); printf("szSystemStatus %s\n", wsaData.szSystemStatus); printf("wHighVersion %d.%d\n", HIBYTE(wsaData.wHighVersion), LOBYTE(wsaData.wHighVersion) ); printf("wVersion %d.%d\n", HIBYTE(wsaData.wVersion), LOBYTE(wsaData.wVersion) ); /*
*/ err=WSACleanup(); if (err == SOCKET_ERROR) { printf("リソース解放失敗\n"); } else { printf("リソース解放成功\n"); } return 0; } //EOF
ちょっとコードが丁寧すぎる印象を受けた
皆さんは入門書読み終わったら、次どんな本読みましたか?
964 :
デフォルトの名無しさん :2005/10/07(金) 16:58:57
>>963 いまでも入門書はしょっちゅう手にして確認するけど、
にーちゃんの本棚のCマガジンとかは良く読んだ。
あと、関係ないけど、新スレに書く前にこっち埋めようぜー。
>>964 Cマガジンですか?さっそく本屋行って見てきます!
>>963 「C言語ポインタ完全制覇」と「定本Cプログラマのためのアルゴリズムとデータ構造」を読んだ。
本もいいけど、勉強におすすめのソースコードとかが知りたい。
入門書は読んだことがない。 善いも悪いもCのソースならWebでいくらでも転がってる。
ググって出てこないもんは無いけど 通して読むようなのないなぁ、書籍でも ANSI規格書が昔は無料だったらしいけど 今は1万円以上するしちょっとつらい K&R買ったけど全部載ってるわけでもなし MSDNが良さそうだけど目次が全然でてこないorz
>>968 JISのPDFはタダで読める。
MSDN(日本語)ではこうたどっていくとC関連の記事がある。
開発ツールと言語→Visual Studio .Net→製品ドキュメント→Visual C++
→Visual C++ リファレンス→Visual C++ ライブラリ→Visual C++ のリファレンス
→Visual C++のライブラリ→ランタイム ライブラリ リファレンス
970 :
その1 :2005/10/07(金) 19:18:47
次スレの
>>9 unix 版。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
int main(int argc, char **argv) {
const char *hostname = "www.google.co.jp";
const char *path = "/";
const unsigned short port = 80;
int sock;
struct hostent *host;
struct sockaddr_in server;
int read_size;
char buf[1024];
971 :
その2 :2005/10/07(金) 19:19:58
if ((host=gethostbyname(hostname))==NULL) return -1; bzero(&server, sizeof(server)); server.sin_family = AF_INET; bcopy(host->h_addr, &server.sin_addr, host->h_length); server.sin_port = htons(port); if ((sock=socket(AF_INET, SOCK_STREAM, 0))==-1) return -1; if (connect(sock, (struct sockaddr *)&server, sizeof(server))==-1) return -1; sprintf(buf, "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n", path, hostname); write(sock, buf, strlen(buf)); while ((read_size = read(sock, buf, sizeof(buf)))>0) write(1, buf, read_size); close(sock); return 0; }
973 :
デフォルトの名無しさん :2005/10/08(土) 11:33:22
なんか新スレはどんどん進んでいる様だけど、このスレを埋めて行くぜ。 問題。 自分の環境で使うことが出来るC言語の型 (char, short int, int, long int 等など) と、そのサイズを標準出力に吐き出すプログラムを書け. 出力例 char 1 short int 2 int 4 long int 4 制約 型のサイズはプログラム内に直接書くのではなく、sizeof 演算子を用いて、 実行時に取得して表示すること。 挑戦項目 その型が持つことが出来る最大の数と最小の数も出るようにしておくと便利かも。 完成したプログラムは、環境変数 PATH が指すディレクトリのどこか一つにいれておくと便利かも。
>>973 こういう横やりを入れるのも何だけど、sizeofはコンパイル時に定数式扱いされるから
実行時に取得してるわけじゃないんだけどね
973って・・・・・・・・・・・・・・・・・・
>>974 まさに横やりだな。
実行形式ファイルは実行するまでは
何の効果も生み出さないのだから、
実行時に取得される、と理解して何の不具合もないだろ。
ホント、ヲタはどうでもいいところにこだわるな。
>>976 おまいさん、RTTI使ったことないだろ。
さすがに初心者にそこまでの注意を払わせるのはどうかと思うが、
実行時にコストを支払うのか、コンパイル時に支払うのかの違いは大切だぞ。
>>977-978 話をそらすな。
このスレの主題に照らして
>>974 がどれだけ無意味な発言であるか。
君らは技術に溺れ、場に応じた適切なレベルの
コミュニケーションを取れないタイプの間だな。
人にものを教えようなどと思わない方がいいぞ。
あと俺は
>>973 とは別の通りすがりだ。
981 :
デフォルトの名無しさん :2005/10/08(土) 12:10:14
>あと俺は
>>973 とは別の通りすがりだ。
そんな事は誰も聞いてない件について。
アイアムザパニーズに近いものを感じるなw
>>980 そういう下らない論争をする君が一番場違いだということに気づかないのか?
スレが埋まっていいんだけどさ。
そもそも間違いを指摘してなぜ悪い?
初心者相手なら嘘を教えていいとでも?
適切なフォローはこの場合「今は気にしなくていい」であって
「実行時だと理解していい」ではないだろう。嘘を教えてどうする。
983 :
デフォルトの名無しさん :2005/10/08(土) 12:13:12
>>980 場に応じた適切な発言できてないのは、いったい誰なのやら。
985 :
デフォルトの名無しさん :2005/10/08(土) 12:15:19
973みたいな教え方してると、プリプロセッサ命令とかでも誤解が生じそうだよママン
973ちゃん落ち着いて!ママよ!
梅
梅
>>981 >>977 を読め。俺を
>>973 だと思っている。
君も場の状況を見ず思いつきで発言するタイプだな。
コミュニケーション能力が足りない人間が多いな。
>>982 実行時に取得しているのと表面的には
変わらないのだから嘘ではない。
初心者のキャパはすごく小さいのだ。
他人のレスに横やりいれてスレの流れを乱すな。
990 :
973 :2005/10/08(土) 12:23:03
>>974 さんと、それ以降の方々。
大変勉強になります。
私が
>>973 の問題で伝えたかったことは、自分のためにプログラミングするのも
楽しいよな。ってことです。
あと、ある程度C言語をわかってる人は、あんまり難しい問題を出すんじゃなくて、
今日からC言語を学ぼうと思った人でも、「これなら出来るかも」と思えるような
問題を出して行くといいんじゃないかと思います。
あ、すげー伸びてる。
991 :
デフォルトの名無しさん :2005/10/08(土) 12:23:43
これは酷い自演だなwwwwwwwwwwwwww
この流れで973みたいな問題だす973もアレだよね
993 :
デフォルトの名無しさん :2005/10/08(土) 12:25:06
なんでも良いけどパート2まで来るなよ。 邪魔だから。
>>990 あんた根本的に考え違いしてるよ
自分がプログラミングやり始めた頃のこと思い出してみろよ
表面的に同じなら同じだと言い張れるってのがすごいな。
#defineがexeが実行した時に置き換えられてると思ってそう
これはもう埋めしかないね
梅
999
1000!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。