トップページ⇒tech
184コメント60KB

わたしはCやりたーての人間です

■ このスレッドは過去ログ倉庫に格納されています
0001C萌え〜NGNG
なんか課題だしてくれー。
簡単なのからお願いしまーす
0002デフォルトの名無しさんNGNG
C++コンパイラ
0003デフォルトの名無しさんNGNG
CRLのLinux版。
0004C萌え〜NGNG
うぅ。難しい。。。うわ〜ん。いじめられてるぅぅ(;;)
0005デフォルトの名無しさんNGNG
課題1:"Hello World!"を出力するプログラムを書きなさい。
0006デフォルトの名無しさんNGNG
課題2:プログラムを自動的に生成するプログラムをつくって。
0007C萌え〜NGNG
#include <stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}
こんな感じでしょうか?
0008デフォルトの名無しさんNGNG
「"」がないよ
0009C萌え〜NGNG
プログラムを自動的に生成するプログラム??
簡単にできます??ムズカシイ(;;)
0010デフォルトの名無しさんNGNG
int main()
とかになんでこだわるの?
0011C萌え〜NGNG
>>8
え?どこですか?
0012デフォルトの名無しさんNGNG
int main(int argc, char **argv)
0013C萌え〜NGNG
http://www.kumei.ne.jp/c_lang/intro/no_04.htm
猫でもわかるで現在勉強中でござい〜
0014C萌え〜NGNG
>>12
みたことありますです。
Win32のプログラムかなんか。
まだそこのレベルまで達しておりませぬぅ。スミマセン
0015デフォルトの名無しさんNGNG
九九の表を出力するプログラムを作れ。
0016デフォルトの名無しさんNGNG
>11
指令:「"Hello World!"」と出力せよ。
0017C萌え〜NGNG
//九九の表。
#include <stdio.h>
int main()
{
int tate;
int yoko;
int seki;
char tab;
tab=0;
for (int i=1;i<=9;i++){
for (int cnt=1;cnt<=9;cnt++){
seki=i*cnt;
printf("%d",seki);
printf("%c",tab);
}
printf("\n");
}
return 0;
}
0018C萌え〜NGNG
しまった
tateとyokoはいらんかった。(;;)
0019C萌え〜NGNG
"のだし方が!!!まだわかりません
0020名無しさんNGNG
コマンドライン引数を足し算して結果を表示するプログラム作って。
0021C萌え〜NGNG
#include <stdio.h>
int main(){
char chonchon;
chonchon=34;
printf("%cHello World!%c\n",chonchon,chonchon);
return 0;
}
0022C萌え〜NGNG
>>20
コマンドライン引数の意味がまだわかりませんので
今しばらく。。。
0023C萌え〜 NGNG
include<stdio.h>
void main()
{

printf("%cHello World!%c\n",'"','"');
}
0024C萌え〜NGNG
げ!コマンドライン引数って
ScreenSaver.scr /sみたいなやつですか?ヤバイ
0025C萌え〜NGNG
>>23
おおぅ!なるほど。そのまま代入すればよかったのですねぇ。
ソロソロゲンカイチカイカモ
0026デフォルトの名無しさんNGNG
なんか、マターリしてるね。
0027C萌え〜NGNG
マターリヤラサセテクダサイ
0028C萌え〜NGNG
include <stdio.h>
void main()
{
int i,j;
for (i=1;i<=9;i++){
for (j=1;j<=9;j++){
printf("%d*%d=%d\t",j,i,j*i);
}
putchar('\n');
}
}
0029デフォルトの名無しさんNGNG
>>23
なんだよそれ。気持ち悪い

printf("\"Hello World!\"\n");
0030デフォルトの名無しさんNGNG
>>24
そのとおり、
>>12 がヒントだよ

それからお願いだからインデントしてくれ、
tabを&nbsp;(&は半角)に変換してから貼り付ければ反映されるから。
0031C萌え〜NGNG
>>28
コンパクトなソースかつ実行結果見ました。
感動しました。なんだか、、、C萌え〜〜
0032C萌え〜NGNG
>>30
了解しました。
0033デフォルトの名無しさんNGNG
未来予想:
1〜45:さくさくいく。
46〜?:ポインタが出てくると、スレは廃れ深く潜る。
0034C萌え〜NGNG
コマンドラインから9+3*5などの式を入力して計算するプログラムを
つくれ。
0035デフォルトの名無しさんNGNG
なんでvoid mainに戻す?
0036C萌え〜NGNG
voidで良い。
voidでも困らんもん。
C++ではOKじゃなかったけ。
0037デフォルトの名無しさんNGNG
>voidでも困らんもん。
これが
>voidで良い。
理由?
積極的にvoidにする理由は?
0038C萌え〜NGNG
return 0;がうざいから。
0039デフォルトの名無しさんNGNG
俺は個人的にウザクないのでint mainと書くことにします。では。
0040C萌え〜NGNG
int main()
でなければならない理由を説明してみろ。
0041デフォルトの名無しさんNGNG
return 0;がうざいくないから。(藁
0042デフォルトの名無しさんNGNG
コマンドライン引数の計算はこれを参考にやってみてね

int main(int argc, char *argv[])
{
&nbsp;int i;
&nbsp;for(i = 1; i < argc; i++){
&nbsp;&nbsp;printf("%s\n", argv[i]);
&nbsp;}
&nbsp;return 0;
}
0043デフォルトの名無しさんNGNG
>>40
規格にそう書いてあるから。

もちろん規格を破っても良いけど、そのときの動作は一般
には保証されない。環境によっては main から返った瞬間
に stack underflow したり、鼻から悪魔が出てくるかも
しれません。

もちろん処理系によっては void main() でも動作を保
証してる場合もありえるし、スタートアップルーチンか
ら自分で書く場合には戻り値の型は何でも良い。っつー
か、その場合には関数名が main() である必要さえない
ね。
0044デフォルトの名無しさんNGNG
鼻から悪魔が出てきたら嬉しいじゃねぇーか。
0045C萌え〜NGNG
>>42
わかりました。
今、>>34のプログラムを作ってるとこです。マダジカンカカル
0046デフォルトの名無しさんNGNG
34の方がむずかしいよ。
0047デフォルトの名無しさんNGNG
>>33 の予想が的中した模様。
0048C萌え〜NGNG
寝てからもう一回考えます。スマソ
0049T88H-34DNGNG
なんで、みんな・・・
int main()
だとか。
void main()
にするの?

void main(void)
でいいのに。。。。 ん?
0050デフォルトの名無しさんNGNG
int main(int argc, char *argv[])
{

 return 0;
}
とはじめに書いてからプログラミングすれば
とりあえず問題はないんじゃないんですか?
0051デフォルトの名無しさんNGNG
>>34
”などの”ってところが曖昧かも。
「整数の加減乗除+括弧による演算順位の変更」だけでいいんだよね?
また、当然エラーリカバリは勘弁してあげようよ。

それでも独力での回答は無理か?。いきなりその問題はキツイと思う。
(このスレが終わる予感が・・・)

てめえらぁ、そんなに初心者いじめて楽しいのかぁ!!!(オレは楽しいぞぉ〜)
0052デフォルトの名無しさんNGNG
void main()
で宣言してもコンパイル時に自動的に
int main()
に変換されていると聞いた事がある
0053デフォルトの名無しさんNGNG
>>52
それはないない。絶対にない。
0054ワシもマターリとNGNG
ワシもやりたーてです。
ここに書かれている人は、main関数として
int main(int argc, char **argv)
int main(int argc, char *argv[])
この2つを書かれてますが、なぞが2つあります。

argcとargvとは一体どういう意味で名前が付いてるのですか?

もうひとつは、**argv。
*argv[]の方は、「2つ目のコマンドライン引数は文字列で、
ポインタが渡されているため、ポインタ*argv[]でその値を
受け取る(可変長のため、[]になっている)」ということだと
思うのですが、
**argvと、書かれていることもあるのは、なぜでしょうか。

と、すると、またしても疑問が。
2つめの文字列は、ポインタが渡されるのに、1つめの
int型のコマンドライン引数は、なぜポインタじゃないのでしょうか。
0055デフォルトの名無しさんNGNG
>>34に挑戦する前にもっと簡単な問題に挑戦したほうが健全なのでは?
(このままだと 1 が戻ってこない気がする・・・)

コマンドラインから "11001" などの2進数を入力して10進数に
変換して表示するプログラムをつくれ。

なんてのはいかが?
0056C萌え〜NGNG
>>34スマソ
頑張ってみたけど、まだ無理みたい。。。
できそうで、デキナカッタ
>>55
#include&nbsp;<stdio.h>
int&nbsp;main(){
&nbsp;&nbsp; char&nbsp;c[100];
&nbsp;&nbsp; int&nbsp;su[100];
&nbsp; &nbsp;int&nbsp;tmp=0;
&nbsp;&nbsp; int&nbsp;kazu=0;
&nbsp;&nbsp;printf("2進数を書いてチョ\n");
&nbsp;&nbsp;scanf("%s",&c);
&nbsp;&nbsp;for&nbsp;(int&nbsp;i=0;i<=100;i++){
&nbsp;&nbsp;&nbsp;if&nbsp;(c[i]>=48){
&nbsp;&nbsp;&nbsp;su[i]=c[i]-48;
&nbsp;&nbsp;&nbsp;printf("%d\n",su[i]);
&nbsp;&nbsp;&nbsp;kazu++;
&nbsp;&nbsp;&nbsp;printf("kazu=%d\n",kazu);
&nbsp;}
&nbsp;}
&nbsp;&nbsp;for&nbsp;(int&nbsp;k=0;k<=kazu-1;k++){
&nbsp;&nbsp;tmp=tmp*2+su[k];
&nbsp;}
&nbsp;printf("tmp=%d\n",tmp);
&nbsp;return&nbsp;0;
}
0057C萌え〜NGNG
あらら。インデントが〜
0058デフォルトの名無しさんNGNG
argc:argument count
argv:argument vector
0059デフォルトの名無しさんNGNG
>>58
"argument vector"?
"argument value" じゃなかったっけ?
0060デフォルトの名無しさんNGNG
>>56
(とりあえず)要チェックの所!

1.scanf() は使わないように
 C言語についてある程度以上のスキルを持っている人のうち
 99.999%は scanf() は使わないと思う。
 この場合せめて gets() で読み出しては?

2.char c[100] のアドレスは c
 つまり c と &c[0] はおなじだよ

3.c[100] の要素数は 100 個
 for(i=0;i<=100;i++) は101個調べてることになるよん。
 0番目から100番目まで指を折って数えればわかる

4."11001" を後も c[i] を調べてる
 この場合5番目以降の c[i] には何が入っているかは誰もわかりません。
 結果、訳の分からない数(ゴミ)が su[i] にはいるよ

(なんか下手に添削すると達人から突っ込みが
入りそうな気がするけど・・・(^^;))
0061デフォルトの名無しさんNGNG
>>60さん
すいません、何で scanf 使っちゃだめなんですか?
0062ワシNGNG
#include <stdio.h>
void main()
{
char c[100];
int su[100];
int tmp=0;
int kazu=0;
printf("2進数を書いてチョ\n");
gets(c);
/* while(c[kazu] != NULL) */
while(c[kazu] != '\0')
{
su[kazu] = c[kazu] - 48;
printf("%d\n",su[kazu]);
kazu++;
printf("kazu=%d\n",kazu);
}
for (int k=0;k<=kazu-1;k++)
{
tmp=tmp*2+su[k];
}
printf("tmp=%d\n",tmp);
getchar();
}
C萌え〜さんのソースを見て、こんな風にしてみました。
0063デフォルトの名無しさんNGNG
scanf使うなというやつはただの厨房。
正しい入力に対して動けばいいプログラムを作るときとか
動きがわかって使う分には全然オッケーです。
006460NGNG
そこら辺は話すと長くなるので・・・
とりあえず、”使わない”と覚えててほぼ間違いないです!
(私の意見に文句を言ってくる人がいても
その人も実際(業務など)には使っていないはずです)
0065デフォルトの名無しさんNGNG
>64
初期設定とかの固定フォーマットのファイル読み出しには
使うよ。楽だし。

Cで開発はもういやだなあ。JavaのResouceBundleは賢いぜ。
006660NGNG
>>63(早速絡んできたか・・・マターリは遥か彼方へ・・・)
では大ウィザード様、今回の場合に scanf() を使った
びゅーちふぉーなコードを御開陳して下さいませ。
ぼくちんは厨房なのでわかりません。

>>65ほんとに!?
ある意味で尊敬するよ
0067デフォルトの名無しさんNGNG
>>60
63ではないが、scanfによるword countの例。

#include <stdio.h>

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;int nw = 0;

&nbsp;&nbsp;&nbsp;&nbsp;while (scanf("%*s") != EOF)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++nw;
&nbsp;&nbsp;&nbsp;&nbsp;printf("%d words\n", nw);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

006860NGNG
>>63
ていうか、本当は gets() を使うのも悪いと思うんだけど・・・
(本当に使うなら fgets() )
これについても反対なの?
結構古い議題なんだけどなぁ・・・
0069C萌え〜NGNG
>>62Thanks!

scanfを使うなってどこかで聞いたことありますです。(リユウハマダシリマセン)

コマンドライン引数がいまいちワカラナイ
007060NGNG
>>67
答えになっていないのでは?
0071デフォルトの名無しさんNGNG
>69
コマンドライン引数は >>42 を参考にして >>20 のをまずやってみろ
007263大ウィザードNGNG
>>60

>>56のでいいじゃん。
007363大ウィザードNGNG
>>68==>>60
だからよ、ここは初心者の勉強スレなんだから、
実務のための絶対に落ちないコードを
書くためのスレじゃないんだよ。そこのとこをわかって
レスしてくださいや。
0074デフォルトの名無しさんNGNG
http://www.catnet.ne.jp/kouno/c_faq/c12.html#20
scanfについて。困ったときのC FAQ。
0075C萌え〜NGNG
http://www.ht-net21.ne.jp/~sgwr-t/sec11-4.htm
http://homepage1.nifty.com/toshio-k/prog/c/cmdline.html
今ここらへんを見て勉強中・・・。ちょっとワカッテキタカモ
007661NGNG
>>74
ふむふむ。
scanf 使ってると色々問題が起こる可能性があるので初心者には
すすめられないって事かな?
何となくですが分かりました。ありがとう。
0077ワシNGNG
C萌え〜さんの邪魔にならない程度にしますから、ワシも一緒に勉強させて下さい。

#include <stdio.h>
#include <string.h>
void main(int argc, char *argv[])
{
 char c[100];
 int su[100];
 int tmp=0;
 int kazu=0;

 if(argc == 1)
 {
   /*引数が1つしかなかったので、この場合はコマンドライン引数が無かった*/
   printf("2進数を書いてチョ\n");
   gets(c);
 }
   else
 {
   /*コマンドライン引数の値をc[100]へコピー*/
   /*strcpy(&c[0],argv[1]);*/
   strcpy(c,argv[1]);
 }

 while(c[kazu] != '\0')
 {
   su[kazu] = c[kazu] - 48;
   printf("%d\n",su[kazu]);

以下は、>>62と同じ
こんな感じではないでしょうか。
コマンドライン引数が2つだったら、argcは3、argvは[0]〜[2]で、引数として入力された値は[1]と[2]。
コマンドライン引数が3つだったら、argcは4、argvは[0]〜[3]で、引数として入力された値は[1]〜[3]。

AAA.exe 1001 1010 1110とした場合、argv[1]は'1001'のポインタ、
argv[2]は'1010'のポインタ、argv[3]は'1110'のポインタが入る。
と、思います。
0078この板にプログラマはいないのか?NGNG
どーでもいいんだけど
mainの返信はどちらかというとvoidでなくintで書くのが正しい。
本なんかの一般論から言うと
「C言語はUNIXのために作られた言語であり、UNIXでは返した値を使って...」
って事。(ちなみにgccなんかでvoid mainって書くと警告かなんかでなかったっけ?)
じゃあDOSならvoidでいいじゃんと思うかもしれないが。
んなこたぁない。
command.comとかのshellがちゃんとmain返信を取得しているし、
バッチファイルなんかで簡単にその値を取り出すことも可能。

素直にint mainで書いときなさい。
正常終了は0異常終了は1以上の値を返してね。


0079デフォルトの名無しさんNGNG
>>78
一般論もなにも、今までに何度も何度も何度も何度も書かれてるが
ANSI Cの規格上戻り値の型はintに決まってるからint、でええやん。
ま、他はその通り。
0080C萌え〜NGNG
>>77 OK!一緒にガンバロウ

char型からint型にするのはドウスレバ?
その必要もないのかなぁ?う〜む。シコウチュウ
0081デフォルトの名無しさんNGNG
stdlib.h
atoi
0082C萌え〜NGNG
あっ!48引いて、10*すればイイノカナ?
008360NGNG
>>73
こんな議論しても埒があかないから’C萌え〜さん’や
’ワシ’さんが学習を終えて、1年なり2年なりたった後、
その時に「どちらが正しかったか」判断してもらえばよい
のでは?(ちなみに勝つ自信あり)
下らない意地の張り合いで他人の学習意欲を削ぐような真似
はよそうよ。
0084ワシNGNG
>>78 >>79
わかりました。ルールとして受け止め、以後はint main()を使います。
voidにしてたのは、今後、その時々でゼロなり1なりを返すのを忘れて
mainを抜ける事があると怖いので、voidでも動作するなら、voidでいいかな。
と、割り切ってました。
0085デフォルトの名無しさんNGNG
#include <stdio.h>
int main()
{
&nbsp;char str[100],*p;
&nbsp;int ans=0;

&nbsp;puts("2進数を入力せよ");
&nbsp;gets(str);
&nbsp;for(p = str ;*p != '\0';p++){
&nbsp;&nbsp;ans <<= 1;
&nbsp;&nbsp;ans += *p - '0';
&nbsp;}
&nbsp;printf("%d\n",ans);
&nbsp;return 0;
}
0086C萌え〜NGNG
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
&nbsp;&nbsp;&nbsp;int i;
&nbsp;&nbsp;&nbsp;int tmp=0;
&nbsp;&nbsp;&nbsp;for(i = 1; i < argc; i++){
&nbsp;&nbsp;&nbsp;printf("%s\n", argv[i]);
&nbsp;&nbsp;&nbsp;tmp=tmp+atoi(argv[i]);
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;printf("コマンドライン引数の和は%d",tmp);
&nbsp;&nbsp;&nbsp;return 0;
}
0087C萌え〜NGNG
>>81さんくす!おかげでデキマシタ。
デキテル?
0088デフォルトの名無しさんNGNG
今度は10進数を入力して2進数で返すやつをつくれば。
0089デフォルトの名無しさんNGNG
だれか今月の「C Magazine」のプログラミング期末試験で
満点取れた人いる?
0090デフォルトの名無しさんNGNG
つうか値と進数入力させてその進数で出力するの作れ>8
多分そのうちprintfもどきが作れるぞ
0091デフォルトの名無しさんNGNG
あんなドキュンな雑誌誰も買いません。立ち読みで済ます。>89
0092デフォルトの名無しさんNGNG
[問1]
次の文章の[1]〜[4]に適切な数値をあてはめなさい.
char型の変数が表現できる値は,少なくとも[1]以上[2]以下である.
int型の表現できる値は少なくとも[3]以上[4]以下である.(各1点×4)
0093デフォルトの名無しさんNGNG
[1]-128
[2]127
[3]-3万くらい
[4]3万くらい
0094デフォルトの名無しさんNGNG
なんで雑誌であんな特集組むかね。
ネタが無いのはわかるけどさあ・・・
0095デフォルトの名無しさんNGNG
去年もやったから、定番化させたいんでしょう
0096デフォルトの名無しさんNGNG
[問2]
main関数が正常終了したことを実行環境に知らせたい場合,
次の�@〜�Cのうち適切でないものはどれか.
�@return 0; �Areturn (0); �Breturn EXIT_SUCCESS;
�Cexit (1); (2点)
0097デフォルトの名無しさんNGNG
恥ずかしながらドジりました。by岩谷
0098デフォルトの名無しさんNGNG
[問1] の答えはどうした?
0099デフォルトの名無しさんNGNG
exit(1);
0100デフォルトの名無しさんNGNG
そうなのか、去年の暮れから買い始めたから知らなかった>定番化

去年の 12月号の「インターネットプログラムの基礎知識」なんかは
役に立ったけど、ドキュソなの? 定期購読止めようかな・・・
0101デフォルトの名無しさんNGNG
kudaranaimondaidane
0102デフォルトの名無しさんNGNG
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
nbsp;&nbsp;int nTmp, nBit, iDec;
&nbsp;&nbsp;char *pWork;
&nbsp;&nbsp;if(argc != 2) return 1;
&nbsp;&nbsp;if((nBit = strlen(argv[1])) == 0) return 1;
&nbsp;&nbsp;if(nBit == 1) return *argv[1] - '0';

&nbsp;&nbsp;nTmp = 1;
&nbsp;&nbsp;nBit--;
&nbsp;&nbsp;while(nBit--){
&nbsp;&nbsp;&nbsp;&nbsp;nTmp *= 2;
&nbsp;&nbsp;}

&nbsp;&nbsp;iDec = 0;
&nbsp;&nbsp;pWork = argv[1];
&nbsp;&nbsp;while(*pWork){
&nbsp;&nbsp;&nbsp;&nbsp;if((*pWork - '0') == 1){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iDec += nTmp;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;nTmp /= 2;
&nbsp;&nbsp;&nbsp;&nbsp;pWork++;
&nbsp;&nbsp;}
&nbsp;&nbsp;printf("DEC = %d", iDec);
}

ちょっと遅いですが
2進数を10進数で表示。
これじゃまちがい?
無駄おおい?

0103デフォルトの名無しさんNGNG
解答と解説
[問1]
[1] -127 [2] 127 [3] -32767 [4] 32767

8ビットあれば,2^8=256通りの状態を値として表現できます.
charの表現できる値が-128〜127の範囲である処理系も
ありますが,C言語の規格では-127〜127の範囲が表現できれば
いいことになっています.同様に,intの表現できる値は
少なくとも-32767〜32767の範囲をカバーしなければならないことが
定められています.
0104102NGNG
あ
if(nBit == 1) return *argv[1] - '0';
これひとけた用の表示にしようと思ってたんだけど。
returnさしてまふ。
じっさいは表示している事にしてください。
0105デフォルトの名無しさんNGNG
>>92
[1]SCHAR_MAX
[2]SCHAR_MIN
[3]INT_MAX
[4]INT_MIN
(limits.h参照)
ふぁあ・・
0106デフォルトの名無しさんNGNG
>>105

それは反則
0107デフォルトの名無しさんNGNG
>>102
なんかわかりにくいね。
0108105NGNG
>>106
それじゃあなんの為のlimits.hか・・
103の解答では不十分。
105がより正確な(処理系依存にはならない)解答。
だから何?って感じですが・・
0109デフォルトの名無しさんNGNG
[問3]
main関数の書き方として,次の�@〜�Cのうち正しいものはどれか.
�@int main(void) {...}
�Avoid main() {...}
�Bvoid main(void) {...}
�Cvoid main(int argc, char *argv[]) {...} (2点)
0110デフォルトの名無しさんNGNG
これをやるとまたうるさくなるぞ。
答え�@
0111105NGNG
103はもしかしてCマガからのコピペ?
だとしたら、かなりいただけない解答の様な・・。
0112デフォルトの名無しさんNGNG
>>108
問題は,標準的なC言語(いわゆるANSI C,JIS C)を想定しています.
特別な処理系では,必ずしもこのとおりにならないことがあるかもしれません.

疲れた,もうヤメ
0113デフォルトの名無しさんNGNG
ほんとにそんな問題なの?
0114105NGNG
>>112
そうそう。もうやめ。
0115デフォルトの名無しさんNGNG
もうCマガ廃刊でイイヨ。
P.J.プラウガーの翻訳記事さえどっかにあれば。
011663大ウィザードNGNG
>>83==>>60
ぉぃぉぃ、、俺は別にscanfやgets使用禁止に反対してるわけじゃないぞ…。
勝つとか負けるとかいわれてもねぇ…(藁
ただ、動くプログラムに対してそういうことをつっこむ
誰かの方がよっぽど他人の学習意欲を削ぐような真似を
してるとは思いますけどねヽ(´ー`)ノ
0117デフォルトの名無しさんNGNG
>>102
なんかグチャグチャしてるね。入力が正しい二進数文字列と仮定できて、
オーバーフローも無視して良いのら、こんなもんじゃない?

int
atoi_2(const char *s)
{
    int val = 0;
    do {
        val <<= 1;
        val += *s - '0';
    } while (*++s != '\0');
    return (val);
}

nTmp とか nBit とか捨て捨て。
0118デフォルトの名無しさんNGNG
Cの学習のためならscanfでいいよ。
それをいちいちつっこむやつは変だよ。
0119デフォルトの名無しさんNGNG
載せちゃったからには,問2,3の解答・解説も書いときます.
これ以降を知りたい方は,立ち読みでもしてください.

[問2]
�C
解説
main関数からのreturnに指定した値は,同じ値を引数としてexit関数を
呼び出したのと同じ意味になります.main関数が正常に終了したことを
意味する値はEXIT_SUCCSESSまたは0なので,特別な意味を持たせる
場合を除いて,正常終了時に1を与えるのは一般的には不適切です.
なお,exit関数やEXIT_SUCCESSを使う場合は,stdlib.hをインクルード
する必要があります.
return 0;とreturn (0);は同じ意味で,後者は単に定数0をカッコで囲んだ
だけです.カッコで囲む意味はないのですが,なんとなく付けている
プログラムもよく見かけます.

[問3]
�@
解説
標準規格では,main関数の型はintであることになっています.
仮引数がある場合には,
int main(int argc, char *argv[]) {...}
のような定義になります.ふだんはvoid main()と書いている方も,
このような試験問題のときはintと答えるようにしましょう.
0120デフォルトの名無しさんNGNG
>118
学習ならfgets & sscanfで決まりだと思うが。
(sscanfではなく、)scanf使って妙な挙動で混乱するのは学習の妨げになるだけ。
自分でトークン切り出す方法でも可。
まあどうでもいいけど・・
0121C萌え〜NGNG
//10進数から2進数へ
#include <stdio.h>
#include <stdlib.h>

int main(){
&nbsp;&nbsp;int tmp=0;
&nbsp;&nbsp;char deci[100];
&nbsp;&nbsp;int amari=0;
&nbsp;&nbsp;int cnt=0;
&nbsp;&nbsp;char receive[100];
&nbsp;&nbsp;printf("10進数を入力してチョ\n");
&nbsp;&nbsp;gets (deci);
&nbsp;&nbsp;tmp=atoi(deci);
&nbsp;&nbsp;printf("tmp=%d\n",tmp);
&nbsp;&nbsp;while (tmp!=0){
&nbsp;&nbsp;&nbsp;&nbsp; amari=(tmp % 2);
&nbsp;&nbsp;&nbsp;&nbsp; printf("amari=%d\n",amari);
&nbsp;&nbsp;&nbsp;&nbsp; tmp =tmp / 2;
&nbsp;&nbsp;&nbsp;&nbsp; receive[cnt]=amari;
&nbsp;&nbsp;&nbsp;&nbsp; cnt++;
&nbsp;&nbsp;}
&nbsp;&nbsp;for (int i=1;i<=cnt;i++){
&nbsp;&nbsp;&nbsp;&nbsp; printf("%d",receive[cnt-i]);
&nbsp;&nbsp;}
&nbsp;&nbsp;puts("\n");
&nbsp;&nbsp;return 0;
}
0122デフォルトの名無しさんNGNG
だから値と進数を入力させて、その進数で出力するの作れ>121
インタフェース
void file_n_to_radix(FILE *fp, int number, int radix);
テストソース
int main() {
  file_n_to_radix(stdout, 123, 2); fputc('\n', stdout);
  file_n_to_radix(stdout, 123, 8); fputc('\n', stdout);
  file_n_to_radix(stdout, 123, 10); fputc('\n', stdout);
  file_n_to_radix(stdout, 123, 16); fputc('\n', stdout);
}
テストソースの出力結果
1111011
173
123
7b
0123デフォルトの名無しさんNGNG
$./a.out < test.dat
0124C萌え〜NGNG
>>92
#include <stdio.h>

int main(){
int baito=8;
int dekasa=0;
int tmp=1;
dekasa=baito*sizeof(char);
printf("intのサイズは%d\n",dekasa);
for (int i=1;i<=dekasa-1;i++){
tmp=tmp*2;
}
printf("マイナス%dから",tmp);
tmp=1;
for (int k=1;k<=dekasa-1;k++){
tmp=tmp*2;
}
tmp--;
printf("プラス%dまで\n",tmp);
return 0;
}
0125デフォルトの名無しさんNGNG
10進から2進への変換
#include <stdio.h>

int main()
{
&nbsp;int dec;
&nbsp;unsigned long int mask = 0x80000000;
&nbsp;puts("10進数を入力せよ");
&nbsp;scanf("%d",&dec);

&nbsp;while(mask){
&nbsp;&nbsp;putchar( dec & mask? '1' : '0');
&nbsp;&nbsp;mask >>= 1;
&nbsp;}
&nbsp;putchar('\n');
&nbsp;return 0;
}
0126C萌え〜NGNG
>>90
>>122関数を作れってことでいいのデスカ?
頑張ってミマス
0127デフォルトの名無しさんNGNG
それ作った後は、それを参考に vfprintf と上位互換の関数(1)作れ。>127
(1)作った後は、(1)を使って fprintf と上位互換の関数作れ。>127
それ作った後は、vsprintf, sprintf と上位互換の関数を同様に作れ。>127
より安全な、vsnprintf, snprintfも作れ。>127
0128デフォルトの名無しさんNGNG
>>127
自分に課題を出す奴。
0129デフォルトの名無しさんNGNG
ワラタ >>127
ネタか?
0130デフォルトの名無しさんNGNG
127はちゃんと全部作って提出するように。
0131デフォルトの名無しさんNGNG
Cやりたてなんですかー

ではこれからはパートナーと色々相談して、色々な体位で
プレイしてみましょう。

って、こんなんじゃダメ?

0132C萌え〜NGNG
>>125
すごい。なんとなくやってることがワカリマシタ。
0133デフォルトの名無しさんNGNG
そろっと終わりが近いね。
0134デフォルトの名無しさんNGNG
なんか文字列を入力して最も出現頻度の高い文字を
出力するプログラムをつくれ。
日本語が絡むと面倒なので、半角英数だけでいいよ。
入力
windows
出力
w
0135デフォルトの名無しさんNGNG
scanfを使用して標準入力から数値を入力し、
数値を出力するプログラムをつくれ。

数値でない場合、標準出力にエラーを出力し、
数値が入力されるまで繰り返せ

出力例)
数値を入力して下さい> aaa
エラー:入力された文字は数値ではありません。
数値を入力して下さい> bbb
エラー:入力された文字は数値ではありません。
数値を入力して下さい> 0
入力された数値は0です。
0136デフォルトの名無しさんNGNG
漢字を含む文字列の中の指定した文字列を
指定した文字列ですべて置き換える処理をせよ。
(エディタとかの置換だね。)
0137初期不良NGNG
ここ初めて読んだけど、
Win98 で問題なく動いてた自作ゲームが、
Win2000 でファイル書き込み時にハングアップするようになった原因。
もしかしたらそれかも。とてもチュヴォウだったので
write とか知らなくて、全部テキストにして保存しようとして
fprintf とか fscanf とか使いまくってます。
やる気が出たら直してみよう。
ていうか write って C++ か?
0138デフォルトの名無しさんNGNG
お〜いC萌え〜や〜〜〜い
0139C萌え〜NGNG
>>135
//文字は嫌よ♪
#include <stdio.h>
#include <stdlib.h>

int main(){
&nbsp;&nbsp; int tmp;
&nbsp;&nbsp; int asc0=48;
&nbsp;&nbsp; int asc9=57;
&nbsp;&nbsp; int hantei=1;
&nbsp;&nbsp; char userin[100];
&nbsp;&nbsp; int i=0;
&nbsp;&nbsp; while(hantei==1){
&nbsp;&nbsp;&nbsp;&nbsp; puts("数値を入力して下さい\n");
&nbsp;&nbsp;&nbsp;&nbsp; gets(userin);
&nbsp;&nbsp;&nbsp;&nbsp; puts(userin);
&nbsp;&nbsp;&nbsp;&nbsp; hantei=0;
&nbsp;&nbsp;&nbsp;&nbsp; while (userin[i]!='\0'){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",userin[i]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (asc9<userin[i]){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hantei=1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; puts(&userin[i]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (userin[i]<asc0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hantei=1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; puts(&userin[i]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;
&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",hantei);
&nbsp;&nbsp;&nbsp;&nbsp; if (hantei==1){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("エラー:入力された文字は数値ではアリマセン\n");
&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp; printf("i=%d",i);
&nbsp;&nbsp;&nbsp;&nbsp; i=0;
&nbsp;&nbsp; }
0140C萌え〜NGNG
&nbsp;&nbsp; printf("%d\n",hantei);
&nbsp;&nbsp; tmp=atoi(userin);
&nbsp;&nbsp; printf("入力された数値は%dデス\n",tmp);
&nbsp;&nbsp; return 0;
}
0141C萌え〜NGNG
コピペミス。。。つなげてクダサイ
0142C萌え〜NGNG
できそうなやつからプログラムしています。アシカラズ。スミマセン
0143C萌え〜NGNG
あっ!scanf使用していなかった!!!ゴメンナサイ
0144デフォルトの名無しさんNGNG
>>135 回答例
#include <stdio.h>

int main(void)
{
  int i;

  printf("数値を入力して下さい>");
  while(scanf("%d", &i) != 1) {
    printf("エラー:入力された文字は数値ではありません\n");
    printf("数値を入力して下さい>");
    fflush(stdin);
  }

  printf("入力された数値は%dです\n", i);
  return 0;
}

scanfでも暴走しないプログラムを書く事は可能
ちなみにfflush()をコメントにし、数値でない値を入力すると暴走する。

なぜfflush()を入れると暴走しないのか理解できん奴には
scanf()は禁止しといた方が安全
0145デフォルトの名無しさんNGNG
>>144
ダメな環境もある。
規格でもうまくいくことは保証されてない。
0146デフォルトの名無しさんNGNG
C萌え〜さんはなぜ文字コードを数字で直接書くのだ?
0147デフォルトの名無しさんNGNG
このスレが終わってないことを祈ってageます
0148デフォルトの名無しさんNGNG
int i;
for(;i<i;)printf("終了");
0149144NGNG
>>145
> 規格でもうまくいくことは保証されてない。
しらなかった...

> fflush(stdin);
のかわりに scanf("%*s"); でトークン読み飛ばしは?
一応、fjに載ってたやり方だけど...
0150ワシNGNG
週明けから出張続きでしたが、帰ってきたので、遅れた分を今から
勉強させてもらいます。
0151デフォルトの名無しさんNGNG
>なぜfflush()を入れると暴走しないのか理解できん奴には

方に適合しなかった場合は読み込まれずにバッファに残ってるから?
0152デフォルトの名無しさんNGNG
>>151 yes
以下から引用
http://queen.heart.ne.jp/cgi-bin/browse?msgid=%3C8j0rso%24fm3%241%40news%2Etut%2Eac%2Ejp%3E
> scanfは仕様上、
> ・変換が行なわれなかった時は、入力が消費されない。
> ・書式"%s"で変換を行なう場合、バッファオーバーランを
>  引き起こす可能性がある。
> (中略)
> 下手な使い方でscanfを使用したプログラムは、簡単に暴走・無
> 限ループに陥る可能性があります。
> # だから、下手な使い方しか出来ない人(=初心者)が、
> # 「scanfは使わない方が良い」と主張する場合はあります。
0153デフォルトの名無しさんNGNG
>>144
おいこら。fflushはstdinに対しては本来は効果が無いぞ。
fflushはバッファにたまってる出力を吐き出すもんだから、
入力に関しては規格上効果はないぞ。
0154デフォルトの名無しさんNGNG
rewind(stdin)もだめですか?
0155デフォルトの名無しさんNGNG
このスレは終わっちゃいねーんだよっ上げ
0156C萌え〜NGNG
>>155
ありがとデス。
まだまだまだまだC言語に慣れてないので、
なかなかうまくプログラムできないでイマス。
もっといろいろ関数を知っていれば。。。
すぐにできるのかも・・・(デキナイカモ)

アルゴリズム自体はすぐに思い浮かぶのですが。
あぅ(;;)
0157デフォルトの名無しさんNGNG
>>156
> もっといろいろ関数を知っていれば。。。
一通り目を通しとけ

ANSI 規格 標準関数一覧
http://tyrant.chem-eng.kyushu-u.ac.jp/2nd/Programming/Library/Main.asp
0158デフォルトの名無しさんNGNG
http://www.nalgo.co.jp/book-c-prog.html
↑にある問題です。メインの処理部分のみ書きます。

//count出力した件数 x,yは座標 direction方向 +で(-1,1)、-で(1,-1)
//ONum出力する件数
for (count = 1, x = 0, y = 0 ,direction = 1; count <= ONum; count++) {
 printf("%d (%d, %d)\n", count, x, y);
 if (direction > 0) {
  x++;
  y--;
  if (y < 0) {
   y = 0;
   direction *= -1;
  }
 }
 else {
  x--;
  y++;
  if (x < 0) {
   x = 0;
   direction *= -1;
  }
 }
}
これじゃマズイんですか?
0159デフォルトの名無しさんNGNG
>>158
> for (count = 1, x = 0, y = 0 ,direction = 1; count <= ONum; count++) {
>  printf("%d (%d, %d)\n", count, x, y);
間違いではないが...
Cでは慣用句としてN回の繰り返しは
for(i = 0; i < N; i++)
と表記する事が多い

上記の引用は
for (count = 0, x = 0, y = 0 ,direction = 1; count < ONum; count++) {
 printf("%d (%d, %d)\n", count + 1, x, y);
とした方が他人の誤解や混乱を招く確率は減る。
0160C萌え〜NGNG
>>157さんくす。出直してまいりますデス
0161sageNGNG
1かわいいな

// コメントは古いコンパイラでつかえないことあるから
/* */ 使う癖をつけとくといいよ
0162158NGNG
>>159
癖がついちゃってるね。
printf("%d (%d, %d)\n", count + 1, x, y);
ってのが気持ち悪く感じちゃう。気をつけます。
>>161
俺もそーなってるね。。/*は両方とも右小指で打つから打ちにくいから
ついつい//使っちゃう。でも//だと閉じなくても良いしネストも出来るし。。

なんか>>158のページ見ると初心者が陥りやすいアルゴリズムの欠陥が
あるっぽいけど、何も思い浮かばないんだよね。分かる人いませんか?
0163デフォルトの名無しさんNGNG
>>161
1はぜんぜんかわいくないです。
1はとてつもないデブで漫画キャラのような渦巻きメガネを
かけています。さらに1年間以上風呂にはいったことがなく、
腐臭を漂わせているばかりか、ふだんからそのぬめっとした
言動で、周りから煙たがられています。
0164デフォルトの名無しさんNGNG
どうした?鬱か?
0165デフォルトの名無しさんNGNG
クイックソートのプログラム書いてるけど、ちょ〜むずかし〜
0166デフォルトの名無しさんNGNG
#include <stdio.h>
void main()
{
int a;
int b;

b=10;

for (a=0;a<=b;a++){
printf("aは%dです\n",a);
}
}

int型とforの使い方がわかった〜!
えーっと、voidってのはなんですかね。
あと、whileの使い方がよくわかりませぬ。
0167初心者もどきNGNG
>>166
0〜10まで計11回ループするプログラムですね
わたしにもわかりました。共に頑張りましょう
0168デフォルトの名無しさんNGNG
>>166
同じ内容をwhileを使って書いてみれ。
0169デフォルトの名無しさんNGNG
#include <stdio.h>

void main()
{
 int a;
 int b;

 b=10;
 while(a++ <= b);
 printf("aは%dです\n",a);
}
0170デフォルトの名無しさんNGNG
aを初期化しろよ。
バグメーカ君。
0171デフォルトの名無しさんNGNG
>>170
ふぉっふぉっふぉ。それしきのこと、コンパイラが
見逃すはずがないであろー。ふぉっふぉっふぉ。
0172デフォルトの名無しさんNGNG
コンパイラの警告を無視する人って時々居ませんか?T^T
0173デフォルトの名無しさんNGNG
166 != 169
0174名無しさん@電話にはでんわNGNG
void main() って何だよ
intだろ
0175デフォルトの名無しさんNGNG
>>174
うざったいぞー。
0176デフォルトの名無しさんNGNG
関数をvoidにしたがる人間は、
自分が作った関数は未来永劫エラーを出さないと信じている
思い上がりではないのか?

そんな思い上がりを、神は決して許さない。

値を返さない関数も、ステータスのためにリターンバリューは
取っておくべきだ。

暫定的に #define NORMAL 0
でも返しとけばぁ?
0177デフォルトの名無しさんNGNG
intがウザいんじゃなくって、void?int?の議論がウザいんだよ。
聞き飽きた。
0178君に贈るプログラムNGNG
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

int main(void)
{
 while(1) {
  malloc(1024);
 }
}
0179デフォルトの名無しさんNGNG
>>172
たまに警告さえ出なければいいと思ってるやつもいる。
0180158NGNG
だれかお手すきの方>>158、>>162を見てもらえませんか?
0181デフォルトの名無しさんNGNG
>>180
見たけど、おかしい所は見受けられませんでした。
実際に動かしてみて100ばかりうまく行ってるようならいいんじゃない?
0182名無しさん@LV2001NGNG
四則演算ワケワカメ
アルゴリズムワケワカメ
0183デフォルトの名無しさんNGNG
1達には全然関係ないですが、
Cマガ逝ってよし。
105、108、111〜115の少なくともまともな神経を持った人たちが
逝ってしまった。
鬱だ。
0184デフォルトの名無しさんNGNG
>>166
引用こっから。

#include <stdio.h>
void main()
{
int a;
int b;

b=10;

for (a=0;a<=b;a++){
printf("aは%dです\n",a);
}
}

int型とforの使い方がわかった〜!
えーっと、voidってのはなんですかね。
あと、whileの使い方がよくわかりませぬ。

ここまで

main()の前のvoid はmain()終了時になにも値を返さないということです。
main(void) と記述されている時はmain()は何も引数を持たないということです。
混同しないように気をつけて。
それからwhile 文は条件判定式が真(0ではない)の間中実行され、
条件判定式が偽(0)になるとループを終えます。
■ このスレッドは過去ログ倉庫に格納されています