■掲示板に戻る■ ■過去ログ倉庫めにゅーに戻る■
わたしはCやりたーての人間です
1 名前: C萌え〜 投稿日: 2001/02/25(日) 03:11
なんか課題だしてくれー。
簡単なのからお願いしまーす


2 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 03:43
C++コンパイラ


3 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 03:44
CRLのLinux版。


4 名前: C萌え〜 投稿日: 2001/02/25(日) 03:56
うぅ。難しい。。。うわ〜ん。いじめられてるぅぅ(;;)


5 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 03:57
課題1:"Hello World!"を出力するプログラムを書きなさい。


6 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 04:00
課題2:プログラムを自動的に生成するプログラムをつくって。


7 名前: C萌え〜 投稿日: 2001/02/25(日) 04:02
#include <stdio.h>
int main(){
printf("Hello World!\n");
return 0;
}
こんな感じでしょうか?



8 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 04:03
「"」がないよ


9 名前: C萌え〜 投稿日: 2001/02/25(日) 04:04
プログラムを自動的に生成するプログラム??
簡単にできます??ムズカシイ(;;)


10 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 04:04
int main()
とかになんでこだわるの?


11 名前: C萌え〜 投稿日: 2001/02/25(日) 04:05
>>8
え?どこですか?


12 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 04:06
int main(int argc, char **argv)


13 名前: C萌え〜 投稿日: 2001/02/25(日) 04:07
http://www.kumei.ne.jp/c_lang/intro/no_04.htm
猫でもわかるで現在勉強中でござい〜


14 名前: C萌え〜 投稿日: 2001/02/25(日) 04:09
>>12
みたことありますです。
Win32のプログラムかなんか。
まだそこのレベルまで達しておりませぬぅ。スミマセン


15 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 04:09
九九の表を出力するプログラムを作れ。


16 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 04:13
>11
指令:「"Hello World!"」と出力せよ。



17 名前: C萌え〜 投稿日: 2001/02/25(日) 04:18
//九九の表。
#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;
}



18 名前: C萌え〜 投稿日: 2001/02/25(日) 04:19
しまった
tateとyokoはいらんかった。(;;)


19 名前: C萌え〜 投稿日: 2001/02/25(日) 04:23
"のだし方が!!!まだわかりません


20 名前: 名無しさん 投稿日: 2001/02/25(日) 04:24
コマンドライン引数を足し算して結果を表示するプログラム作って。


21 名前: C萌え〜 投稿日: 2001/02/25(日) 04:24
#include <stdio.h>
int main(){
char chonchon;
chonchon=34;
printf("%cHello World!%c\n",chonchon,chonchon);
return 0;
}



22 名前: C萌え〜 投稿日: 2001/02/25(日) 04:25
>>20
コマンドライン引数の意味がまだわかりませんので
今しばらく。。。


23 名前: C萌え〜 投稿日: 2001/02/25(日) 04:26
include<stdio.h>
void main()
{

printf("%cHello World!%c\n",'"','"');
}



24 名前: C萌え〜 投稿日: 2001/02/25(日) 04:29
げ!コマンドライン引数って
ScreenSaver.scr /sみたいなやつですか?ヤバイ


25 名前: C萌え〜 投稿日: 2001/02/25(日) 04:34
>>23
おおぅ!なるほど。そのまま代入すればよかったのですねぇ。
ソロソロゲンカイチカイカモ


26 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 04:37
なんか、マターリしてるね。


27 名前: C萌え〜 投稿日: 2001/02/25(日) 04:39
マターリヤラサセテクダサイ


28 名前: C萌え〜 投稿日: 2001/02/25(日) 04:40
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');
}
}


29 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 04:45
>>23
なんだよそれ。気持ち悪い

printf("\"Hello World!\"\n");



30 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 04:47
>>24
そのとおり、
>>12 がヒントだよ

それからお願いだからインデントしてくれ、
tabを&nbsp;(&は半角)に変換してから貼り付ければ反映されるから。


31 名前: C萌え〜 投稿日: 2001/02/25(日) 04:48
>>28
コンパクトなソースかつ実行結果見ました。
感動しました。なんだか、、、C萌え〜〜


32 名前: C萌え〜 投稿日: 2001/02/25(日) 04:51
>>30
了解しました。


33 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 04:54
未来予想:
1〜45:さくさくいく。
46〜?:ポインタが出てくると、スレは廃れ深く潜る。



34 名前: C萌え〜 投稿日: 2001/02/25(日) 04:55
コマンドラインから9+3*5などの式を入力して計算するプログラムを
つくれ。



35 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 05:00
なんでvoid mainに戻す?


36 名前: C萌え〜 投稿日: 2001/02/25(日) 05:04
voidで良い。
voidでも困らんもん。
C++ではOKじゃなかったけ。



37 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 05:09
>voidでも困らんもん。
これが
>voidで良い。
理由?
積極的にvoidにする理由は?


38 名前: C萌え〜 投稿日: 2001/02/25(日) 05:12
return 0;がうざいから。



39 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 05:14
俺は個人的にウザクないのでint mainと書くことにします。では。


40 名前: C萌え〜 投稿日: 2001/02/25(日) 05:18
int main()
でなければならない理由を説明してみろ。


41 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 05:22
return 0;がうざいくないから。(藁



42 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 05:32
コマンドライン引数の計算はこれを参考にやってみてね

int main(int argc, char *argv[])
{
 int i;
 for(i = 1; i < argc; i++){
  printf("%s\n", argv[i]);
 }
 return 0;
}


43 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 05:34
>>40
規格にそう書いてあるから。

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

もちろん処理系によっては void main() でも動作を保
証してる場合もありえるし、スタートアップルーチンか
ら自分で書く場合には戻り値の型は何でも良い。っつー
か、その場合には関数名が main() である必要さえない
ね。


44 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 05:38
鼻から悪魔が出てきたら嬉しいじゃねぇーか。


45 名前: C萌え〜 投稿日: 2001/02/25(日) 05:40
>>42
わかりました。
今、>>34のプログラムを作ってるとこです。マダジカンカカル


46 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 05:42
34の方がむずかしいよ。


47 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 06:18
>>33 の予想が的中した模様。


48 名前: C萌え〜 投稿日: 2001/02/25(日) 08:17
寝てからもう一回考えます。スマソ


49 名前: T88H-34D 投稿日: 2001/02/25(日) 10:25
なんで、みんな・・・
int main()
だとか。
void main()
にするの?

void main(void)
でいいのに。。。。 ん?


50 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 10:42
int main(int argc, char *argv[])
{

 return 0;
}
とはじめに書いてからプログラミングすれば
とりあえず問題はないんじゃないんですか?


51 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 11:32
>>34
”などの”ってところが曖昧かも。
「整数の加減乗除+括弧による演算順位の変更」だけでいいんだよね?
また、当然エラーリカバリは勘弁してあげようよ。

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

てめえらぁ、そんなに初心者いじめて楽しいのかぁ!!!(オレは楽しいぞぉ〜)


52 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 12:06
void main()
で宣言してもコンパイル時に自動的に
int main()
に変換されていると聞いた事がある


53 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 15:58
>>52
それはないない。絶対にない。


54 名前: ワシもマターリと 投稿日: 2001/02/25(日) 18:31
ワシもやりたーてです。
ここに書かれている人は、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型のコマンドライン引数は、なぜポインタじゃないのでしょうか。


55 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 18:48
>>34に挑戦する前にもっと簡単な問題に挑戦したほうが健全なのでは?
(このままだと 1 が戻ってこない気がする・・・)

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

なんてのはいかが?



56 名前: C萌え〜 投稿日: 2001/02/25(日) 19:52
>>34スマソ
頑張ってみたけど、まだ無理みたい。。。
できそうで、デキナカッタ
>>55
#include <stdio.h>
int main(){
   char c[100];
   int su[100];
   int tmp=0;
   int kazu=0;
  printf("2進数を書いてチョ\n");
  scanf("%s",&c);
  for (int i=0;i<=100;i++){
   if (c[i]>=48){
   su[i]=c[i]-48;
   printf("%d\n",su[i]);
   kazu++;
   printf("kazu=%d\n",kazu);
 }
 }
  for (int k=0;k<=kazu-1;k++){
  tmp=tmp*2+su[k];
 }
 printf("tmp=%d\n",tmp);
 return 0;
}



57 名前: C萌え〜 投稿日: 2001/02/25(日) 19:53
あらら。インデントが〜


58 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 20:05
argc:argument count
argv:argument vector


59 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 20:38
>>58
"argument vector"?
"argument value" じゃなかったっけ?


60 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 21:08
>>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] にはいるよ

(なんか下手に添削すると達人から突っ込みが
入りそうな気がするけど・・・(^^;))


61 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 21:24
>>60さん
すいません、何で scanf 使っちゃだめなんですか?


62 名前: ワシ 投稿日: 2001/02/25(日) 21:35
#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萌え〜さんのソースを見て、こんな風にしてみました。


63 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 21:39
scanf使うなというやつはただの厨房。
正しい入力に対して動けばいいプログラムを作るときとか
動きがわかって使う分には全然オッケーです。


64 名前: 60 投稿日: 2001/02/25(日) 21:41
そこら辺は話すと長くなるので・・・
とりあえず、”使わない”と覚えててほぼ間違いないです!
(私の意見に文句を言ってくる人がいても
その人も実際(業務など)には使っていないはずです)


65 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 21:47
>64
初期設定とかの固定フォーマットのファイル読み出しには
使うよ。楽だし。

Cで開発はもういやだなあ。JavaのResouceBundleは賢いぜ。



66 名前: 60 投稿日: 2001/02/25(日) 22:12
>>63(早速絡んできたか・・・マターリは遥か彼方へ・・・)
では大ウィザード様、今回の場合に scanf() を使った
びゅーちふぉーなコードを御開陳して下さいませ。
ぼくちんは厨房なのでわかりません。

>>65ほんとに!?
ある意味で尊敬するよ


67 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 22:43
>>60
63ではないが、scanfによるword countの例。

#include <stdio.h>

int main()
{
    int nw = 0;

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




68 名前: 60 投稿日: 2001/02/25(日) 22:51
>>63
ていうか、本当は gets() を使うのも悪いと思うんだけど・・・
(本当に使うなら fgets() )
これについても反対なの?
結構古い議題なんだけどなぁ・・・


69 名前: C萌え〜 投稿日: 2001/02/25(日) 23:01
>>62Thanks!

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

コマンドライン引数がいまいちワカラナイ


70 名前: 60 投稿日: 2001/02/25(日) 23:14
>>67
答えになっていないのでは?


71 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 23:22
>69
コマンドライン引数は >>42 を参考にして >>20 のをまずやってみろ


72 名前: 63大ウィザード 投稿日: 2001/02/25(日) 23:44
>>60

>>56のでいいじゃん。


73 名前: 63大ウィザード 投稿日: 2001/02/25(日) 23:47
>>68==>>60
だからよ、ここは初心者の勉強スレなんだから、
実務のための絶対に落ちないコードを
書くためのスレじゃないんだよ。そこのとこをわかって
レスしてくださいや。


74 名前: デフォルトの名無しさん 投稿日: 2001/02/25(日) 23:47
http://www.catnet.ne.jp/kouno/c_faq/c12.html#20
scanfについて。困ったときのC FAQ。


75 名前: C萌え〜 投稿日: 2001/02/25(日) 23:48
http://www.ht-net21.ne.jp/~sgwr-t/sec11-4.htm
http://homepage1.nifty.com/toshio-k/prog/c/cmdline.html
今ここらへんを見て勉強中・・・。ちょっとワカッテキタカモ



76 名前: 61 投稿日: 2001/02/25(日) 23:55
>>74
ふむふむ。
scanf 使ってると色々問題が起こる可能性があるので初心者には
すすめられないって事かな?
何となくですが分かりました。ありがとう。


77 名前: ワシ 投稿日: 2001/02/26(月) 00:16
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'のポインタが入る。
と、思います。


78 名前: この板にプログラマはいないのか? 投稿日: 2001/02/26(月) 00:46
どーでもいいんだけど
mainの返信はどちらかというとvoidでなくintで書くのが正しい。
本なんかの一般論から言うと
「C言語はUNIXのために作られた言語であり、UNIXでは返した値を使って...」
って事。(ちなみにgccなんかでvoid mainって書くと警告かなんかでなかったっけ?)
じゃあDOSならvoidでいいじゃんと思うかもしれないが。
んなこたぁない。
command.comとかのshellがちゃんとmain返信を取得しているし、
バッチファイルなんかで簡単にその値を取り出すことも可能。

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





79 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 00:49
>>78
一般論もなにも、今までに何度も何度も何度も何度も書かれてるが
ANSI Cの規格上戻り値の型はintに決まってるからint、でええやん。
ま、他はその通り。


80 名前: C萌え〜 投稿日: 2001/02/26(月) 00:52
>>77 OK!一緒にガンバロウ

char型からint型にするのはドウスレバ?
その必要もないのかなぁ?う〜む。シコウチュウ



81 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 00:54
stdlib.h
atoi



82 名前: C萌え〜 投稿日: 2001/02/26(月) 00:55
あっ!48引いて、10*すればイイノカナ?


83 名前: 60 投稿日: 2001/02/26(月) 00:59
>>73
こんな議論しても埒があかないから’C萌え〜さん’や
’ワシ’さんが学習を終えて、1年なり2年なりたった後、
その時に「どちらが正しかったか」判断してもらえばよい
のでは?(ちなみに勝つ自信あり)
下らない意地の張り合いで他人の学習意欲を削ぐような真似
はよそうよ。


84 名前: ワシ 投稿日: 2001/02/26(月) 01:01
>>78 >>79
わかりました。ルールとして受け止め、以後はint main()を使います。
voidにしてたのは、今後、その時々でゼロなり1なりを返すのを忘れて
mainを抜ける事があると怖いので、voidでも動作するなら、voidでいいかな。
と、割り切ってました。


85 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:07
#include <stdio.h>
int main()
{
 char str[100],*p;
 int ans=0;

 puts("2進数を入力せよ");
 gets(str);
 for(p = str ;*p != '\0';p++){
  ans <<= 1;
  ans += *p - '0';
 }
 printf("%d\n",ans);
 return 0;
}


86 名前: C萌え〜 投稿日: 2001/02/26(月) 01:12
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
   int i;
   int tmp=0;
   for(i = 1; i < argc; i++){
   printf("%s\n", argv[i]);
   tmp=tmp+atoi(argv[i]);
   }
   printf("コマンドライン引数の和は%d",tmp);
   return 0;
}



87 名前: C萌え〜 投稿日: 2001/02/26(月) 01:18
>>81さんくす!おかげでデキマシタ。
デキテル?


88 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:20
今度は10進数を入力して2進数で返すやつをつくれば。


89 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:21
だれか今月の「C Magazine」のプログラミング期末試験で
満点取れた人いる?


90 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:24
つうか値と進数入力させてその進数で出力するの作れ>8
多分そのうちprintfもどきが作れるぞ


91 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:26
あんなドキュンな雑誌誰も買いません。立ち読みで済ます。>89


92 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:27
[問1]
次の文章の[1]〜[4]に適切な数値をあてはめなさい.
char型の変数が表現できる値は,少なくとも[1]以上[2]以下である.
int型の表現できる値は少なくとも[3]以上[4]以下である.(各1点×4)


93 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:29
[1]-128
[2]127
[3]-3万くらい
[4]3万くらい



94 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:31
なんで雑誌であんな特集組むかね。
ネタが無いのはわかるけどさあ・・・


95 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:34
去年もやったから、定番化させたいんでしょう


96 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:35
[問2]
main関数が正常終了したことを実行環境に知らせたい場合,
次の@〜Cのうち適切でないものはどれか.
@return 0; Areturn (0); Breturn EXIT_SUCCESS;
Cexit (1); (2点)


97 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:36
恥ずかしながらドジりました。by岩谷


98 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:37
[問1] の答えはどうした?


99 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:37
exit(1);


100 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:38
そうなのか、去年の暮れから買い始めたから知らなかった>定番化

去年の 12月号の「インターネットプログラムの基礎知識」なんかは
役に立ったけど、ドキュソなの? 定期購読止めようかな・・・


101 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:39
kudaranaimondaidane


102 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:42
#include <stdio.h>
#include <string.h>

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

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

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

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




103 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:42
解答と解説
[問1]
[1] -127 [2] 127 [3] -32767 [4] 32767

8ビットあれば,2^8=256通りの状態を値として表現できます.
charの表現できる値が-128〜127の範囲である処理系も
ありますが,C言語の規格では-127〜127の範囲が表現できれば
いいことになっています.同様に,intの表現できる値は
少なくとも-32767〜32767の範囲をカバーしなければならないことが
定められています.


104 名前: 102 投稿日: 2001/02/26(月) 01:45

if(nBit == 1) return *argv[1] - '0';
これひとけた用の表示にしようと思ってたんだけど。
returnさしてまふ。
じっさいは表示している事にしてください。


105 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:46
>>92
[1]SCHAR_MAX
[2]SCHAR_MIN
[3]INT_MAX
[4]INT_MIN
(limits.h参照)
ふぁあ・・


106 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:48
>>105

それは反則


107 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:52
>>102
なんかわかりにくいね。


108 名前: 105 投稿日: 2001/02/26(月) 01:52
>>106
それじゃあなんの為のlimits.hか・・
103の解答では不十分。
105がより正確な(処理系依存にはならない)解答。
だから何?って感じですが・・


109 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:53
[問3]
main関数の書き方として,次の@〜Cのうち正しいものはどれか.
@int main(void) {...}
Avoid main() {...}
Bvoid main(void) {...}
Cvoid main(int argc, char *argv[]) {...} (2点)


110 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:54
これをやるとまたうるさくなるぞ。
答え@


111 名前: 105 投稿日: 2001/02/26(月) 01:55
103はもしかしてCマガからのコピペ?
だとしたら、かなりいただけない解答の様な・・。


112 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:55
>>108
問題は,標準的なC言語(いわゆるANSI C,JIS C)を想定しています.
特別な処理系では,必ずしもこのとおりにならないことがあるかもしれません.

疲れた,もうヤメ


113 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 01:56
ほんとにそんな問題なの?


114 名前: 105 投稿日: 2001/02/26(月) 01:59
>>112
そうそう。もうやめ。


115 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 02:02
もうCマガ廃刊でイイヨ。
P.J.プラウガーの翻訳記事さえどっかにあれば。


116 名前: 63大ウィザード 投稿日: 2001/02/26(月) 02:11
>>83==>>60
ぉぃぉぃ、、俺は別にscanfやgets使用禁止に反対してるわけじゃないぞ…。
勝つとか負けるとかいわれてもねぇ…(藁
ただ、動くプログラムに対してそういうことをつっこむ
誰かの方がよっぽど他人の学習意欲を削ぐような真似を
してるとは思いますけどねヽ(´ー`)ノ


117 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 02:15
>>102
なんかグチャグチャしてるね。入力が正しい二進数文字列と仮定できて、
オーバーフローも無視して良いのら、こんなもんじゃない?

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

nTmp とか nBit とか捨て捨て。


118 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 02:17
Cの学習のためならscanfでいいよ。
それをいちいちつっこむやつは変だよ。


119 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 02:19
載せちゃったからには,問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と答えるようにしましょう.


120 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 02:26
>118
学習ならfgets & sscanfで決まりだと思うが。
(sscanfではなく、)scanf使って妙な挙動で混乱するのは学習の妨げになるだけ。
自分でトークン切り出す方法でも可。
まあどうでもいいけど・・


121 名前: C萌え〜 投稿日: 2001/02/26(月) 02:28
//10進数から2進数へ
#include <stdio.h>
#include <stdlib.h>

int main(){
  int tmp=0;
  char deci[100];
  int amari=0;
  int cnt=0;
  char receive[100];
  printf("10進数を入力してチョ\n");
  gets (deci);
  tmp=atoi(deci);
  printf("tmp=%d\n",tmp);
  while (tmp!=0){
     amari=(tmp % 2);
     printf("amari=%d\n",amari);
     tmp =tmp / 2;
     receive[cnt]=amari;
     cnt++;
  }
  for (int i=1;i<=cnt;i++){
     printf("%d",receive[cnt-i]);
  }
  puts("\n");
  return 0;
}


122 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 02:40
だから値と進数を入力させて、その進数で出力するの作れ>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



123 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 02:43
$./a.out < test.dat


124 名前: C萌え〜 投稿日: 2001/02/26(月) 02:50
>>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;
}


125 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 02:58
10進から2進への変換
#include <stdio.h>

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

 while(mask){
  putchar( dec & mask? '1' : '0');
  mask >>= 1;
 }
 putchar('\n');
 return 0;
}



126 名前: C萌え〜 投稿日: 2001/02/26(月) 03:02
>>90
>>122関数を作れってことでいいのデスカ?
頑張ってミマス


127 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 03:15
それ作った後は、それを参考に vfprintf と上位互換の関数(1)作れ。>127
(1)作った後は、(1)を使って fprintf と上位互換の関数作れ。>127
それ作った後は、vsprintf, sprintf と上位互換の関数を同様に作れ。>127
より安全な、vsnprintf, snprintfも作れ。>127


128 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 03:18
>>127
自分に課題を出す奴。


129 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 03:22
ワラタ >>127
ネタか?


130 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 03:39
127はちゃんと全部作って提出するように。


131 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 04:08
Cやりたてなんですかー

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

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




132 名前: C萌え〜 投稿日: 2001/02/26(月) 04:14
>>125
すごい。なんとなくやってることがワカリマシタ。


133 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 04:55
そろっと終わりが近いね。


134 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 05:38
なんか文字列を入力して最も出現頻度の高い文字を
出力するプログラムをつくれ。
日本語が絡むと面倒なので、半角英数だけでいいよ。
入力
windows
出力
w


135 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 09:36
scanfを使用して標準入力から数値を入力し、
数値を出力するプログラムをつくれ。

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

出力例)
数値を入力して下さい> aaa
エラー:入力された文字は数値ではありません。
数値を入力して下さい> bbb
エラー:入力された文字は数値ではありません。
数値を入力して下さい> 0
入力された数値は0です。



136 名前: デフォルトの名無しさん 投稿日: 2001/02/26(月) 12:18
漢字を含む文字列の中の指定した文字列を
指定した文字列ですべて置き換える処理をせよ。
(エディタとかの置換だね。)


137 名前: 初期不良 投稿日: 2001/02/27(火) 02:00
ここ初めて読んだけど、
Win98 で問題なく動いてた自作ゲームが、
Win2000 でファイル書き込み時にハングアップするようになった原因。
もしかしたらそれかも。とてもチュヴォウだったので
write とか知らなくて、全部テキストにして保存しようとして
fprintf とか fscanf とか使いまくってます。
やる気が出たら直してみよう。
ていうか write って C++ か?


138 名前: デフォルトの名無しさん 投稿日: 2001/02/27(火) 02:43
お〜いC萌え〜や〜〜〜い


139 名前: C萌え〜 投稿日: 2001/02/27(火) 05:45
>>135
//文字は嫌よ♪
#include <stdio.h>
#include <stdlib.h>

int main(){
   int tmp;
   int asc0=48;
   int asc9=57;
   int hantei=1;
   char userin[100];
   int i=0;
   while(hantei==1){
     puts("数値を入力して下さい\n");
     gets(userin);
     puts(userin);
     hantei=0;
     while (userin[i]!='\0'){
       printf("%d\n",userin[i]);
       if (asc9<userin[i]){
         hantei=1;
         puts(&userin[i]);
       }
       if (userin[i]<asc0){
         hantei=1;
         puts(&userin[i]);
       }
       i++;
     }
     printf("%d\n",hantei);
     if (hantei==1){
       printf("エラー:入力された文字は数値ではアリマセン\n");
     }
     printf("i=%d",i);
     i=0;
   }



140 名前: C萌え〜 投稿日: 2001/02/27(火) 05:46
   printf("%d\n",hantei);
   tmp=atoi(userin);
   printf("入力された数値は%dデス\n",tmp);
   return 0;
}


141 名前: C萌え〜 投稿日: 2001/02/27(火) 05:48
コピペミス。。。つなげてクダサイ


142 名前: C萌え〜 投稿日: 2001/02/27(火) 05:56
できそうなやつからプログラムしています。アシカラズ。スミマセン


143 名前: C萌え〜 投稿日: 2001/02/27(火) 05:58
あっ!scanf使用していなかった!!!ゴメンナサイ


144 名前: デフォルトの名無しさん 投稿日: 2001/02/27(火) 10:20
>>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()は禁止しといた方が安全



145 名前: デフォルトの名無しさん 投稿日: 2001/02/28(水) 00:42
>>144
ダメな環境もある。
規格でもうまくいくことは保証されてない。



146 名前: デフォルトの名無しさん 投稿日: 2001/02/28(水) 02:21
C萌え〜さんはなぜ文字コードを数字で直接書くのだ?


147 名前: デフォルトの名無しさん 投稿日: 2001/02/28(水) 04:02
このスレが終わってないことを祈ってageます


148 名前: デフォルトの名無しさん 投稿日: 2001/02/28(水) 05:02
int i;
for(;i<i;)printf("終了");



149 名前: 144 投稿日: 2001/02/28(水) 10:19
>>145
> 規格でもうまくいくことは保証されてない。
しらなかった...

> fflush(stdin);
のかわりに scanf("%*s"); でトークン読み飛ばしは?
一応、fjに載ってたやり方だけど...



150 名前: ワシ 投稿日: 2001/02/28(水) 11:34
週明けから出張続きでしたが、帰ってきたので、遅れた分を今から
勉強させてもらいます。



151 名前: デフォルトの名無しさん 投稿日: 2001/02/28(水) 17:16
>なぜfflush()を入れると暴走しないのか理解できん奴には

方に適合しなかった場合は読み込まれずにバッファに残ってるから?


152 名前: デフォルトの名無しさん 投稿日: 2001/02/28(水) 17:38
>>151 yes
以下から引用
http://queen.heart.ne.jp/cgi-bin/browse?msgid=%3C8j0rso%24fm3%241%40news%2Etut%2Eac%2Ejp%3E
> scanfは仕様上、
> ・変換が行なわれなかった時は、入力が消費されない。
> ・書式"%s"で変換を行なう場合、バッファオーバーランを
>  引き起こす可能性がある。
> (中略)
> 下手な使い方でscanfを使用したプログラムは、簡単に暴走・無
> 限ループに陥る可能性があります。
> # だから、下手な使い方しか出来ない人(=初心者)が、
> # 「scanfは使わない方が良い」と主張する場合はあります。



153 名前: デフォルトの名無しさん 投稿日: 2001/02/28(水) 18:55
>>144
おいこら。fflushはstdinに対しては本来は効果が無いぞ。
fflushはバッファにたまってる出力を吐き出すもんだから、
入力に関しては規格上効果はないぞ。


154 名前: デフォルトの名無しさん 投稿日: 2001/03/01(木) 02:46
rewind(stdin)もだめですか?


155 名前: デフォルトの名無しさん 投稿日: 2001/03/02(金) 03:22
このスレは終わっちゃいねーんだよっ上げ


156 名前: C萌え〜 投稿日: 2001/03/02(金) 04:13
>>155
ありがとデス。
まだまだまだまだC言語に慣れてないので、
なかなかうまくプログラムできないでイマス。
もっといろいろ関数を知っていれば。。。
すぐにできるのかも・・・(デキナイカモ)

アルゴリズム自体はすぐに思い浮かぶのですが。
あぅ(;;)


157 名前: デフォルトの名無しさん 投稿日: 2001/03/02(金) 10:49
>>156
> もっといろいろ関数を知っていれば。。。
一通り目を通しとけ

ANSI 規格 標準関数一覧
http://tyrant.chem-eng.kyushu-u.ac.jp/2nd/Programming/Library/Main.asp



158 名前: デフォルトの名無しさん 投稿日: 2001/03/02(金) 13:47
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;
  }
 }
}
これじゃマズイんですか?


159 名前: デフォルトの名無しさん 投稿日: 2001/03/02(金) 14:28
>>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);
とした方が他人の誤解や混乱を招く確率は減る。



160 名前: C萌え〜 投稿日: 2001/03/02(金) 15:13
>>157さんくす。出直してまいりますデス


161 名前: sage 投稿日: 2001/03/03(土) 07:36
1かわいいな

// コメントは古いコンパイラでつかえないことあるから
/* */ 使う癖をつけとくといいよ



162 名前: 158 投稿日: 2001/03/03(土) 13:26
>>159
癖がついちゃってるね。
printf("%d (%d, %d)\n", count + 1, x, y);
ってのが気持ち悪く感じちゃう。気をつけます。
>>161
俺もそーなってるね。。/*は両方とも右小指で打つから打ちにくいから
ついつい//使っちゃう。でも//だと閉じなくても良いしネストも出来るし。。

なんか>>158のページ見ると初心者が陥りやすいアルゴリズムの欠陥が
あるっぽいけど、何も思い浮かばないんだよね。分かる人いませんか?


163 名前: デフォルトの名無しさん 投稿日: 2001/03/03(土) 14:31
>>161
1はぜんぜんかわいくないです。
1はとてつもないデブで漫画キャラのような渦巻きメガネを
かけています。さらに1年間以上風呂にはいったことがなく、
腐臭を漂わせているばかりか、ふだんからそのぬめっとした
言動で、周りから煙たがられています。


164 名前: デフォルトの名無しさん 投稿日: 2001/03/03(土) 15:13
どうした?鬱か?


165 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 00:31
クイックソートのプログラム書いてるけど、ちょ〜むずかし〜


166 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 02:35
#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の使い方がよくわかりませぬ。


167 名前: 初心者もどき 投稿日: 2001/03/05(月) 02:44
>>166
0〜10まで計11回ループするプログラムですね
わたしにもわかりました。共に頑張りましょう


168 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 02:44
>>166
同じ内容をwhileを使って書いてみれ。


169 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 02:48
#include <stdio.h>

void main()
{
 int a;
 int b;

 b=10;
 while(a++ <= b);
 printf("aは%dです\n",a);
}



170 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 03:31
aを初期化しろよ。
バグメーカ君。


171 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 04:00
>>170
ふぉっふぉっふぉ。それしきのこと、コンパイラが
見逃すはずがないであろー。ふぉっふぉっふぉ。


172 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 04:12
コンパイラの警告を無視する人って時々居ませんか?T^T


173 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 04:16
166 != 169


174 名前: 名無しさん@電話にはでんわ 投稿日: 2001/03/05(月) 04:33
void main() って何だよ
intだろ


175 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 04:45
>>174
うざったいぞー。


176 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 04:55
関数をvoidにしたがる人間は、
自分が作った関数は未来永劫エラーを出さないと信じている
思い上がりではないのか?

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

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

暫定的に #define NORMAL 0
でも返しとけばぁ?


177 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 05:07
intがウザいんじゃなくって、void?int?の議論がウザいんだよ。
聞き飽きた。



178 名前: 君に贈るプログラム 投稿日: 2001/03/05(月) 06:08
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

int main(void)
{
 while(1) {
  malloc(1024);
 }
}



179 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 06:44
>>172
たまに警告さえ出なければいいと思ってるやつもいる。


180 名前: 158 投稿日: 2001/03/05(月) 13:52
だれかお手すきの方>>158>>162を見てもらえませんか?


181 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 14:09
>>180
見たけど、おかしい所は見受けられませんでした。
実際に動かしてみて100ばかりうまく行ってるようならいいんじゃない?


182 名前: 名無しさん@LV2001 投稿日: 2001/03/05(月) 17:51
四則演算ワケワカメ
アルゴリズムワケワカメ


183 名前: デフォルトの名無しさん 投稿日: 2001/03/05(月) 23:16
1達には全然関係ないですが、
Cマガ逝ってよし。
105、108、111〜115の少なくともまともな神経を持った人たちが
逝ってしまった。
鬱だ。



184 名前: デフォルトの名無しさん 投稿日: 2001/03/09(金) 22:36
>>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)になるとループを終えます。