2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:2010/05/14(金) 23:06:53 ?S★(521521)
C言語の*入門者*向け解説スレッドです。
★前スレ
C言語なら俺に聞け(入門編)Part 63
http://pc12.2ch.net/test/read.cgi/tech/1270909823/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.72【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1267775473/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 135代目
http://pc12.2ch.net/test/read.cgi/tech/1269438098/
★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

2 :デフォルトの名無しさん:2010/05/15(土) 00:27:45
http://pc12.2ch.net/test/read.cgi/tech/1270909823/
>>976じゃ上手くいったのに、>>977で上手くいかないのは
何故でしょうか?
>>977
実行するとアルファベット代入という表示がでてきて
Aと代入したら、数値を代入する間もなくA+10=Kとかいう
実行が勝手にされます。どうしてでしょうか?

3 :デフォルトの名無しさん:2010/05/15(土) 01:23:40
>>2
1つめのscanf()に対する入力時に、
A\n
と入力すると、2文字分の入力となるので、2つめのscanf()は入力を求めずに返る。('\n'は改行)
その結果、
i = 'A';
input = '\n';
となる。ASCIIコードにおいて、
'\n' == 10


4 :デフォルトの名無しさん:2010/05/15(土) 01:30:02
いいかげん初心者のテキストにscanf()使うのやめてほしい。
書いてるやつは、入力と数値変換が一挙にできて簡単だろ程度のことしか考えてないんだろうけど
初心者、はまりまくりじゃん。
使いこなせばどうこう言う奴いるけど、労力かけて、scanf()の癖のある挙動をマスターしても、
初心者向けのテキストを卒業したら、そんなもんまず使わないしな。

5 :デフォルトの名無しさん:2010/05/15(土) 15:44:12
sscanfとかは使うけどな。

6 :デフォルトの名無しさん:2010/05/15(土) 16:16:30
>>1000
gcc -ansi -pedantic

7 :デフォルトの名無しさん:2010/05/15(土) 16:20:30
gcc -std=c99 -Wall -ansi -pedantic

8 :デフォルトの名無しさん:2010/05/15(土) 16:40:06
前スレ>>990だけど、>>992は俺に何を言いたかったの?
「はじめるの遅いね。バカは死ね」ってこと?

9 :デフォルトの名無しさん:2010/05/15(土) 16:40:29
http://pc12.2ch.net/test/read.cgi/tech/1270909823/1000
gcc -pedantic test.c
gcc -std=c99 -pedantic -ansi test.c
ありがとうございました。

10 :デフォルトの名無しさん:2010/05/15(土) 16:59:09
>>8
人生豊かなヤツは趣味なんてたくさんある。
始める時期なんて関係ないよ。

11 :8:2010/05/15(土) 17:05:19
>>10
言われてみれば確かに、中学生当時はサッカーのことばっかり考えてたな俺はw
趣味なんだからいつ始めたってイイよね。THX

12 :デフォルトの名無しさん:2010/05/15(土) 17:07:47
つーか、中学生の頃も、大学生の頃も、オナニーしかしてなかったし。

13 :デフォルトの名無しさん:2010/05/15(土) 17:39:08
>>7
-std=c99 と -ansi を両方指定して意味があるのか
-ansi って -std=c89 の意味でしょ

14 :デフォルトの名無しさん:2010/05/15(土) 17:42:19
そうだね。

15 :デフォルトの名無しさん:2010/05/15(土) 21:04:02
あらためて==と&&って何が違うのかって意識してみたら分からなかった!
教えてエロいひと!
int x = a == b == c;
ってかくとまず(a == b)が評価されてその結果のboolが==cと評価されるようですね。
いっぽう
int x = a && b && c;って書くと
aがfalseならその時点で評価やめ。

っていう違いくらいですか?

16 :デフォルトの名無しさん:2010/05/15(土) 21:04:52
あ、頭ワル
いまわかった。

17 :デフォルトの名無しさん:2010/05/15(土) 21:47:11
そうだね。

18 :デフォルトの名無しさん:2010/05/16(日) 00:00:37
確かに

19 :デフォルトの名無しさん:2010/05/16(日) 01:43:08
C言語で、
各教科の点数を入力して、各教科へのコメントと、全教科の合計と平均を出すプログラミングを作りたいです!
int a,b,c,d,e;
printf("英語の点数を入力してください\n");
scanf("%d",&a);
if(a==1)
printf("さすが\n");
else if(a<40);
printf("ひどい\n");
printf("数学の点数を入力してください\n");
scanf("%d",&b);
if(a==1)
printf("さすが\n");
else if(a<40);
printf("ひどい\n");
printf("国語の点数を入力してください\n");
scanf("%d",&c);
if(a==1)
printf("さすが\n");
else if(a<40);
printf("ひどい\n");


•色々省略
と長くなってしまうのですが、短くしたいのですがどうすればいいですか?
繰り返してる部分を一つもにできますか?

20 :デフォルトの名無しさん:2010/05/16(日) 01:45:42
>>19
配列を使う

21 :デフォルトの名無しさん:2010/05/16(日) 01:46:38
>>20
すいません、初心者なのでまったくわかりません
詳しくお願いします。

22 :デフォルトの名無しさん:2010/05/16(日) 01:49:45
>>19修正
>int a,b,c,d,e;
>printf("英語の点数を入力してください\n");
>scanf("%d",&a);
>if(a==100)
>printf("さすが\n");
>else if(a<40);
>printf("ひどい\n");
>printf("数学の点数を入力してください\n");
>scanf("%d",&b);
>if(d==100)
>printf("さすが\n");
>else if(d<40);
>printf("ひどい\n");
>printf("国語の点数を入力してください\n");
>scanf("%d",&c);
>if(c==100)
>printf("さすが\n");
>else if(c<40);
>printf("ひどい\n");
>•
>•
>•色々省略



23 :デフォルトの名無しさん:2010/05/16(日) 01:55:32

最近、各教科の点数をキーボードから入力して、何か計算する
プログラムの質問が多いけど、なんなのこれ

テーマからして学校の授業かなにかなのかね?
そうなら学校で聞け

そうでないなら、こんな意味の無いプログラムやるな



24 :デフォルトの名無しさん:2010/05/16(日) 01:56:02
>>19
#include<stdio.h>

#define SUBJECT_NUM 5

int main(void)
{
int i, total=0;
double average;
int score[SUBJECT_NUM];
char *subject_name[SUBJECT_NUM]={"英語", "数学", "国語", "理科", "社会"};

for(i=0;i<SUBJECT_NUM;i++)
{
printf("%sの点数を入力してください\n", subject_name[i]);
scanf("%d", &score[i]);
if(score[i]==100) printf("さすが\n");
else if(score[i]<40) printf("ひどい\n");
}

for(i=0;i<SUBJECT_NUM;i++) total+=score[i];
average=(double)total/SUBJECT_NUM;

printf("合計 %d 平均 %.1f\n", total, average);

return 0;
}

25 :デフォルトの名無しさん:2010/05/16(日) 03:03:43
>>23
俺の場合は、学校課題ではないし、習ってもいない。
ただたんに練習だ!

意味がないからやめろ?はぁ?
お前にとっては意味がないかもしれないが、俺にしてみたら、プログラミングを覚える糧になるから必要なんだよ!お前にとっては意味がなくても、他の人には意味をなすものが世の中には沢山あるんだよ!



26 :デフォルトの名無しさん:2010/05/16(日) 03:05:22
>>25
ゴミレスしかできない馬鹿はほっとけばいいよ

27 :デフォルトの名無しさん:2010/05/16(日) 03:09:04
青いな

28 :デフォルトの名無しさん:2010/05/16(日) 03:17:50
そういう台詞は人に質問しなきゃできない人間が言っていいものじゃない

29 :デフォルトの名無しさん:2010/05/16(日) 10:56:55
#include <stdio.h>
int main(void)

{
int a;
int b;

printf("問題数を入力してください:"); scanf("%d", &a);
printf("正解数を入力してください:"); scanf("%d", &b);

printf("問題数%d 正解数%d 正解率%.2f\n", a , b , (double)(b/a) * 100);


return(0);
}

正解率を求めたいんですけど、0%になって出来ません。
どこが間違っていますか?
問題数は121
正解数は93です。

30 :デフォルトの名無しさん:2010/05/16(日) 10:58:23
scanf("%d%*c", &a);
scanf("%d%*c", &b);

31 :デフォルトの名無しさん:2010/05/16(日) 11:02:22
>>29
(double)b / a * 100

32 :デフォルトの名無しさん:2010/05/16(日) 11:06:13
int型の割り算の結果が小数点以下切捨てになって0になってる。
てかデバッガの使い方調べろよ。計算結果を段階的に表示すればどこでおかしくなってるか分かるだろ。

33 :デフォルトの名無しさん:2010/05/16(日) 11:09:35
>>30
アホだw

34 :デフォルトの名無しさん:2010/05/16(日) 11:10:46
ありがとうございます

正解率出ました ()付けちゃ駄目だったんですね・・


35 :デフォルトの名無しさん:2010/05/16(日) 11:20:50
括弧ついててもいいよ。
((double)b/a) * 100とか。

>>33
駄レスするよりはアホじゃないと思うけどなぁ

36 :デフォルトの名無しさん:2010/05/16(日) 11:21:48
b/a*100 じゃだめだろ

37 :デフォルトの名無しさん:2010/05/16(日) 11:53:20
>>35
>>29の質問に対して>>30って答えるヤツがアホじゃないのかよw

38 :デフォルトの名無しさん:2010/05/16(日) 12:11:32
アホじゃなくておっちょこちょいとかじゃねーの

39 :デフォルトの名無しさん:2010/05/16(日) 12:20:39
>>24初心者にはす難しいです。
やってることはあるていどわかるんですが、解説を付けてもらえませんでしょうか?

40 :デフォルトの名無しさん:2010/05/16(日) 12:22:34
ネットでも本でも自分で調べてなんとかする習慣つけないと
>>30みたいなアホになるぞw

41 :デフォルトの名無しさん:2010/05/16(日) 12:27:46
>>30
これはひどい

42 :デフォルトの名無しさん:2010/05/16(日) 12:30:02
すべてfにしてしまうとか
#include <stdio.h>
int main(void)
{
float a;
float b;
printf("問題数を入力してください:"); scanf("%f", &a);
printf("正解数を入力してください:"); scanf("%f", &b);
printf("問題数%.0f 正解数%.0f 正解率%.2f\n", a , b , b/a * 100);
return(0);
}

43 :デフォルトの名無しさん:2010/05/16(日) 12:33:08
文字を読むとき以外は%*cで読み飛ばす必要ないのにな

44 :デフォルトの名無しさん:2010/05/16(日) 12:36:41
>>40
本は買ってあるんですが、

for文の使い方が、いまいちわかりません
int i;
for(i=1;i<6;i++)だと1から5までですけどこれを数字じゃなくて、5教科にしたいんです。英語から社会までみたいに。この場合はどのようにやれば良いか、解説付きで教えてください、お願いします。

45 :デフォルトの名無しさん:2010/05/16(日) 12:41:54
普通のレベルの本なら、全部読んで内容を理解すればその程度のことは
自然に出来るようになってるだろ

46 :デフォルトの名無しさん:2010/05/16(日) 12:44:09
 
変換指定で小数点以下だけを表示したい場合ってどうするんですか?
全然考えても分かりません・・・

47 :デフォルトの名無しさん:2010/05/16(日) 12:56:47
37.7367→7367
printf("%0.4f",37.7367);
わかんね

48 :30:2010/05/16(日) 13:01:22
float a=37.7367;
printf("%f",a-(int)a);

49 :デフォルトの名無しさん:2010/05/16(日) 13:21:00
>>46
0は表示していいの?

50 :デフォルトの名無しさん:2010/05/16(日) 13:51:17
>>37
それよりも駄レスをするほうがアホってことなんじゃないかと

51 :デフォルトの名無しさん:2010/05/16(日) 13:55:26
自分がアホって言われたから駄レスって言ってるだけにしか見えないw
明らかに無駄かつ、問題の答えになってないものをアホだと指摘するのは駄レスじゃない。

どちらかと言えば>>35の後半部分の方がよっぽど駄レス。
ついでに言えば結合順序がわかってないと思われる前半の括弧も無駄w

52 :デフォルトの名無しさん:2010/05/16(日) 13:55:50
>>44
無理です。enumを使っても分かりにくくなるだけ。

それから、初心者だから分からないということですよね。
学校の課題であるなら、今の授業進度についていけていないということになります。
今までの課題および授業のテキストを復習してください。
学校の課題ではないのなら、もう少し簡単なところを勉強してみてはいかがですか。

53 :デフォルトの名無しさん:2010/05/16(日) 13:57:46
>>51
彼は乗算部の括弧を外すことに抵抗があるのかと思ったので、
該当部の括弧を外す必要は必ずしもなく、キャスト対象を変更すればよいという意味のレスをしたつもりだよ

54 :デフォルトの名無しさん:2010/05/16(日) 13:59:22
なんでここトリつけたりつけなかったりするの?

55 :デフォルトの名無しさん:2010/05/16(日) 14:00:19
蛇足だけれど>>35>>30じゃないよ。

56 :デフォルトの名無しさん:2010/05/16(日) 14:01:23
>>49
0は表示しません

57 :デフォルトの名無しさん:2010/05/16(日) 14:01:46
>>30と同レベルのアホが他にもいるとは、頭痛くなってくるなw

58 :デフォルトの名無しさん:2010/05/16(日) 14:06:21
>>56
それだと変換指定じゃ無理じゃないかな。

59 :デフォルトの名無しさん:2010/05/16(日) 14:07:23
間違いを指摘するだけでまともな回答をしないやつは相当イカレてるよな
いつもの人か。夜まで粘着する予定ですか?

60 :デフォルトの名無しさん:2010/05/16(日) 14:09:03
>>31で終わってるだろw

61 :デフォルトの名無しさん:2010/05/16(日) 14:11:40
>>24の解説をお願いします!

62 :デフォルトの名無しさん:2010/05/16(日) 14:14:29
アホが指摘されないで初心者がそれを信じるほうがよっぽどまずいと思うんだ。

63 :デフォルトの名無しさん:2010/05/16(日) 14:16:06
>>61
配列の各要素に点数を入力し、都度すごいとか評価をして、最後に平均を出しています。

64 :デフォルトの名無しさん:2010/05/16(日) 14:17:44
>>61
どの解説が欲しいのかわからないけど。とりあえず。

>char *subject_name[SUBJECT_NUM]={"英語", "数学", "国語", "理科", "社会"};

subject_name[0] に "英語"
subject_name[1] に "数学"
subject_name[2] に "国語"
subject_name[3] に "理科"
subject_name[4] に "社会" が入る。

>scanf("%d", &score[i]);

点数を入力。
この後のif文で、100なら"さすが"、40未満なら"ひどい"と表示。

65 :デフォルトの名無しさん:2010/05/16(日) 14:18:47
>>64
それぐらいはわかってます

66 :デフォルトの名無しさん:2010/05/16(日) 14:22:41
>>64
61です
ありがとうございます!
とてもわかりやすいです。モヤモヤがとれました!

65誰?

67 :デフォルトの名無しさん:2010/05/16(日) 14:24:46
こういう成りすましが湧くから、質問するときはトリップつけたほうがいいよ

68 :デフォルトの名無しさん:2010/05/16(日) 14:27:37
>>67
わかりました

69 :デフォルトの名無しさん:2010/05/16(日) 14:28:31
どこでもやもやしてたのかが分からんね

70 :hello world:2010/05/16(日) 14:29:09
>>67
66です
トリップってなんですか?
名前ですか?

68誰?

71 :デフォルトの名無しさん:2010/05/16(日) 14:29:23
>>69
それがわからないからモヤモヤなんだろ。

72 :hello world:2010/05/16(日) 14:30:24
>>64
charのあとの*っねなんですか?

73 :デフォルトの名無しさん:2010/05/16(日) 14:32:30
こんなとこで構ってもらいたくて必死になるなんて、
どんだけ悲惨な人生送ってきたんだろうな。

74 :デフォルトの名無しさん:2010/05/16(日) 14:35:57
>>72
ポインター型の宣言

char a; // char型の変数aの宣言
char *b; // charへのポインター型の変数bの宣言
char *c[]; // charへのポインターの配列cの宣言

75 :hello world:2010/05/16(日) 14:43:37
>>74
完全には理解できませんが*だけよ違いでこんなにも意味が違うんですね。

2ちゃんは、誰が誰に言っているかがわかりずらいですね

76 :デフォルトの名無しさん:2010/05/16(日) 17:57:38
確かに必要ですね

77 :デフォルトの名無しさん:2010/05/16(日) 19:03:54
char a[]="abcd";
char b[]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
char c[]="bbbbbbbbbbbbbbbbbbbbbbbbb";

unsigned short aa=hash(a);
unsigned short bb=hash(b);
unsigned short cc=hash(c);



任意の文字列に対応した数を(0〜0xFFFFの範囲で)得る関数 hash() を書け
例:
unsigned short hash(char* s)
{
unsigned short a=0;

int i=0;
while (s[i]!='\0') {
a+=(unsigned short)s[i];
i++;
}

return(a);
}

これだと hash("abc") と hash("aad")が同じ数になる。 なるべく数の重複は避けたい。
処理が高速で、かつ、数の重複が起きにくくなるように上記の関数を書き直せ


78 :デフォルトの名無しさん:2010/05/16(日) 19:26:52
真面目にやるなら、MD5とかSHA1とかなんだろうけど、お手軽にこんな感じで。

#include <stdlib.h>

unsigned short hash(char* s)
{
unsigned short a=0;

int i=0;
unsigned seed=0;
srand(0);
while (s[i]!='\0') {
srand(rand(s[i]));
i++;
}

return(rand()/0xffff);
}


79 :78:2010/05/16(日) 19:27:57
srand(rand(s[i])); → srand(rand()+s[i]);

80 :デフォルトの名無しさん:2010/05/16(日) 21:04:51
>>78
その hash() 関数だと、2つのスレッドで平行処理した場合に
エラーがでる可能性があるかもしれません。

hash()関数を1000回、2つのスレッドで平行に使用してみる
http://codepad.org/WHFeip2X

実行結果:
AAAのただしいハッシュ値=[18141]
BBBのただしいハッシュ値=[32333]
err:AAA=[27531]
err:AAA=[27531]
err:BBB=[15226]
err:AAA=[16181]
err:AAA=[27497]
err:BBB=[9702]
err:AAA=[3402]
err:BBB=[15226]
err:AAA=[16181]
err:BBB=[6886]
err:AAA=[28210]
err:BBB=[19267]
err:AAA=[25650]


81 :78:2010/05/16(日) 21:32:46
>>80
こんな感じで。

pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;

unsigned short hash(char* s)
{
 unsigned short a=0;

 int i=0;
 unsigned seed=0;
 int h = 0;

 pthread_mutex_lock(&mtx);
 srand(0);
 while (s[i]!='\0') {
  srand(rand()*s[i]);
  i++;
 }
 h = rand()%0xffff;
 pthread_mutex_unlock(&mtx);

 return h;
}

82 :78:2010/05/16(日) 21:34:43
訂正

srand(rand()*s[i]);

srand(rand()+s[i]);
の方が良いと思います。

前者だと、s[i]が0の場合、全ておなじになってしまうので。

83 :デフォルトの名無しさん:2010/05/16(日) 21:55:08
void main()
{
hash("AAA"); printf("%d\n",rand());
hash("AAA"); printf("%d\n",rand());
hash("AAA"); printf("%d\n",rand());

hash("BBB"); printf("%d\n",rand());
hash("BBB"); printf("%d\n",rand());
hash("BBB"); printf("%d\n",rand());
}

実行結果
828805346
828805346
828805346
746277705
746277705
746277705

ある文字列のハッシュ値を得た直後に rand() を呼び出すと、常に同じ乱数値が返ってくる。
という副作用が気になりました。


84 :デフォルトの名無しさん:2010/05/16(日) 21:59:11
やっぱり、初心者が自己流に作ったコードはダメだね
という典型例

本人は自身満々ぽいけど

85 :デフォルトの名無しさん:2010/05/16(日) 22:03:43
>>83
乱数が欲しかったら、rand()の前に、現時刻で系列を初期化したら?

86 :デフォルトの名無しさん:2010/05/16(日) 22:04:36
>>83
あんまり >>78を真に受けちゃダメ
あれ、どうみても適当に乱数とか交えてゴチャゴチャ計算しただけだから

ハッシュの計算なら、暗号関連でいっぱい実装例があるから
そっちを参考にした方がいい(そのまま実装しなくて、参考にする程度で
いいと思うけど)

87 :78:2010/05/16(日) 22:12:32
>>78にも書いたとおり、
普通のハッシュ関数使えるなら、そっちの方がいいと思うよ。

88 :デフォルトの名無しさん:2010/05/16(日) 22:17:37
>>78は荒らしだぞ
相手にするな

89 :デフォルトの名無しさん:2010/05/16(日) 22:19:20
>>84 = >>86 = >>88 は病気なので触れないでください。

90 :デフォルトの名無しさん:2010/05/16(日) 23:39:39
乱数の(よくない)性質を積極的に利用して、「それなりに分散のいい(リング)テーブル」として流用するアイディアには正直、目から鱗でした。
とてもユニークだし、おもしろいアイディアだと思います。

ユニークな方法を試せば、多少の問題が現れるのは当然ですが、
問題があれば、そのつど修正してけばいいだけだと思います。プログラムは暫近的に書いていけばいいとストラウストラップも言ってた。


91 :デフォルトの名無しさん:2010/05/16(日) 23:55:07
ビヨーンスポッスポッ

92 :デフォルトの名無しさん:2010/05/17(月) 01:33:14
>>91
やwwめwwろwww

93 :デフォルトの名無しさん:2010/05/17(月) 07:18:05
てs

94 :デフォルトの名無しさん:2010/05/17(月) 21:21:09
配列a[5][5]の対角線上の要素をすべて1とし、他の要素はすべて0にするプログラムを、for文を使って作りなさい。

↓↓実行↓↓

10001
01010
00100
01010
10001

95 :デフォルトの名無しさん:2010/05/17(月) 21:28:34
#include <stdio.h>
int main(void)
{
int a[5][5] = {0}, i;

for(i=0; i<5; i++) a[i][i] = a[i][4-i] = 1;

return 0;
}

96 :デフォルトの名無しさん:2010/05/17(月) 21:38:50
int main(void)
{
for(int i=0; i<5; i++)
for(int j=0; i<5; i++)
a[i*5+j] = (i == 4-j || i == j) ? 1 : 0;

return 0;
}

97 :デフォルトの名無しさん:2010/05/17(月) 21:40:23
>>96
ひどすぎるw

98 :デフォルトの名無しさん:2010/05/17(月) 22:31:52
int a[5][5] = {{1,0,0,0,1,},{0,1,0,1,0,},
{0,0,1,0,0,},{0,1,0,1,0,},{1,0,0,0,1,},};
int main(){
for(;0;);
return 0;
}


99 :デフォルトの名無しさん:2010/05/17(月) 22:38:10
int* p = 1;
int *p = 1;
何が違うんですか?

100 :デフォルトの名無しさん:2010/05/17(月) 22:42:05
>>99
何も違わない。
ついでに書くと int * p = 1; も同じ。

101 :デフォルトの名無しさん:2010/05/17(月) 22:53:22
>>98
それは駄目なんです

102 :デフォルトの名無しさん:2010/05/17(月) 22:55:17
>>99
同じだよ。

蛇足だけど、
その場合、int型の*pではなく、int型へのポインタのpに1が入るから、
後々、恐らく不幸なことが起きるよ。

103 :99:2010/05/17(月) 22:57:57
>>100,>>102
thx

>>102
intへのポインタじゃ何で駄目なんですか

104 :デフォルトの名無しさん:2010/05/17(月) 23:07:09
>>103
ポインタに 1 を代入しているのが問題。
大抵の環境ではアドレス 1 には割り込みベクタテーブルがあり、OS によって
保護されていてアクセス違反となり、プログラムが異常終了する可能性が高い。

105 :デフォルトの名無しさん:2010/05/18(火) 00:57:50
> 大抵の環境ではアドレス 1 には割り込みベクタテーブルがあり
> 大抵の環境ではアドレス 1 には割り込みベクタテーブルがあり
> 大抵の環境ではアドレス 1 には割り込みベクタテーブルがあり


106 :デフォルトの名無しさん:2010/05/18(火) 00:59:55
>>104
ユーザプログラムのアドレス1に割り込みテーブルは無いだろうJK

あと、アドレス1にintでアクセスすると境界エラーになる可能性が高い。
x86は、ならないけど

107 :デフォルトの名無しさん:2010/05/18(火) 01:00:03
>>94
#include <stdio.h>
int main(void)
{
int i,j,n;
printf("奇数を入力:");
scanf("%d",&n);
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)printf((((i-j)==0)||((i+j)==(n-1)))?"1":"0");
printf("\n");
}
return 0;
}

108 :デフォルトの名無しさん:2010/05/18(火) 01:04:25
#include <stdio.h>

int main(void)
{
  for(int i=0; i<1; i++){
    puts("10001");
    puts("01010");
    puts("00100");
    puts("01010");
    puts("10001");
  }
  return 0;
}

109 :デフォルトの名無しさん:2010/05/18(火) 01:06:40
なんで1行目すら読めない人が他人の質問に答えられるって思うのはなぜなんだぜ?

110 :デフォルトの名無しさん:2010/05/18(火) 01:13:03
>>94
int main(void)
{
int a[5][5];
int *p = a;
int i;

for(i = 18157905; i > 0; i >>=2) *p++ = n%2;

return 0;
}

111 :デフォルトの名無しさん:2010/05/18(火) 01:16:01
#include <stdio.h>

int main(void)
{
  for(int i=0; i<1; i++){
    int array[5][5] = {1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,1,0,0,0,1};
    puts("10001");
    puts("01010");
    puts("00100");
    puts("01010");
    puts("10001");
  }
  return 0;
}

112 :デフォルトの名無しさん:2010/05/18(火) 01:17:45
>>110
ひどすぎるw

113 :デフォルトの名無しさん:2010/05/18(火) 01:23:42
ごめん

for(i = 18157905; i > 0; i /=2) *p++ = n%2;
若しくは
for(i = 18157905; i > 0; i >>=1) *p++ = n%2;
だ。

114 :デフォルトの名無しさん:2010/05/18(火) 01:25:01
nってw

115 :デフォルトの名無しさん:2010/05/18(火) 02:40:07
出力忘れてるとかw

116 :デフォルトの名無しさん:2010/05/18(火) 04:06:32
はあ・・・w

117 :デフォルトの名無しさん:2010/05/18(火) 04:55:09
出力以前の問題

118 :デフォルトの名無しさん:2010/05/18(火) 04:57:13
出力しろとは書かれてないけどな

119 :デフォルトの名無しさん:2010/05/18(火) 10:56:16
Windowsでgetloadavgに相当する関数はなんですか?

120 :デフォルトの名無しさん:2010/05/18(火) 13:38:20
そもそもロードアベレージを知る術がないんじゃないか?

121 :デフォルトの名無しさん:2010/05/18(火) 14:52:18
(´・ω・`)

122 :デフォルトの名無しさん:2010/05/18(火) 15:18:04
パフォーマンスカウンタかもしくは自力でプロセス数を集計して平均をとるしかなさそう

123 :デフォルトの名無しさん:2010/05/18(火) 15:54:41
idol状態になってるかどうかも調べないとだから結構面倒じゃないのかな。
そうでもないのかな。

124 :デフォルトの名無しさん:2010/05/18(火) 18:12:55
入門の定番はやさしいCとかの本があるけど、
一通りそれらを理解したうえで、次の段階に進む際の定番やオススメの教科書みたいなものがあったら教えて下さい。

125 :デフォルトの名無しさん:2010/05/18(火) 18:37:51
見てるだけじゃ何も学んだことにはならない。思い付いたことをとにかくコードにすべし。
そうこうしてるうちにデータ構造とかアルゴリズムとか気になってくるだろう。

126 :デフォルトの名無しさん:2010/05/18(火) 18:45:53
こういう何の役にも立たないことをキリッって言っちゃう奴って居るよな

127 :デフォルトの名無しさん:2010/05/18(火) 18:52:51
>>124
カニハン先生の「プログラミング作法」
原書は "The Practice of Programming"

128 :99:2010/05/18(火) 21:07:35
>>106
結局、どっちでもおkってことか?
変わりはないんでしょ

「int* i, j, k, l;」と
「int *i, *j, *k, *l;」は違う意味だよな

129 :デフォルトの名無しさん:2010/05/18(火) 21:08:24
>>128
うん違う意味になるね

130 :デフォルトの名無しさん:2010/05/18(火) 21:54:55
>>128
(int*) i, j, k, l; とすればよい

131 :デフォルトの名無しさん:2010/05/18(火) 22:41:10
突っ込みたいけど、突っ込まないぞ

132 :デフォルトの名無しさん:2010/05/18(火) 23:46:19
おすすめのフリーのテキストエディタを教えてください

133 :デフォルトの名無しさん:2010/05/18(火) 23:48:12
vi

134 :デフォルトの名無しさん:2010/05/18(火) 23:55:00
vim

135 :デフォルトの名無しさん:2010/05/18(火) 23:55:55
メモ帳

136 :デフォルトの名無しさん:2010/05/18(火) 23:58:28
vimyo

137 :デフォルトの名無しさん:2010/05/19(水) 00:22:43
jvim

138 :デフォルトの名無しさん:2010/05/19(水) 00:41:12
メモ帳はフリーじゃないんじゃないか

139 :デフォルトの名無しさん:2010/05/19(水) 00:59:27
サクラエディタ

140 :デフォルトの名無しさん:2010/05/19(水) 01:00:03
Visual Studio 2010

141 :デフォルトの名無しさん:2010/05/19(水) 01:13:21
kdevelop

142 :デフォルトの名無しさん:2010/05/19(水) 01:28:37
コマンドプロンプトとかで
test_c < test.txt
みたいな感じでtest.txtの内容をtest_c.cのscanfなどで読み込むことを
何て言うんだっけ?

143 :デフォルトの名無しさん:2010/05/19(水) 01:29:21
リダイレクト?

144 :142:2010/05/19(水) 01:33:55
>>143
そう!それだ!

ありがとう

145 :デフォルトの名無しさん:2010/05/19(水) 02:11:33
emacsって使いにくいもんな…

146 :デフォルトの名無しさん:2010/05/19(水) 02:39:01
>>130
http://codepad.org/FFvyekfG

147 :デフォルトの名無しさん:2010/05/19(水) 03:03:20
>>130

#include <stdio.h>

void main()
{
typedef int* int_ptr;

int_ptr a, b, c;

int aa=10;
int bb=20;
int cc=30;

a = &aa;
b = &bb;
c = &cc;

printf("ptr[%p]=[%d], ptr[%p]=%d, ptr[%p]=%d\n",a,*a, b,*b, c,*c);
}


148 :デフォルトの名無しさん:2010/05/19(水) 07:33:29
>>147
void main() (笑)

149 :デフォルトの名無しさん:2010/05/19(水) 10:58:04
>>147
void main < main < int main

150 :デフォルトの名無しさん:2010/05/19(水) 16:39:37
>>132
秀丸

151 :デフォルトの名無しさん:2010/05/19(水) 16:44:02
>>147
初歩的質問
ライブラリ関数のstdio.hって関数の宣言だけですよね?
それならばその本体はどこのあるの?


152 :デフォルトの名無しさん:2010/05/19(水) 16:47:22
ANSI C限定じゃないんだからvoid mainでもいいんじゃないか

153 :デフォルトの名無しさん:2010/05/19(水) 16:49:11
>>132
notepad++
タダだし・・・ってかVC++じゃだめなの?

154 :デフォルトの名無しさん:2010/05/19(水) 17:18:33
>>151
つ libc
すでにコンパイル済の状態で、ライブラリとして提供される。

155 :デフォルトの名無しさん:2010/05/19(水) 17:19:47
>>151
環境にもよるけどlibc.soとかに。

156 :デフォルトの名無しさん:2010/05/19(水) 17:20:42
かぶったw
Windowsだとmsvcrt.dllにでもはいってるのかな

157 :デフォルトの名無しさん:2010/05/19(水) 17:35:58
>>156
リンク時にランタイムのリンケージが選べる:
 スタティックリンクだと .LIB に、ダイナミックリンクだと dll に実装体が居る

158 :デフォルトの名無しさん:2010/05/19(水) 18:02:21
>>132
Xyzzy

159 :デフォルトの名無しさん:2010/05/19(水) 18:38:34
>>132
俺流

160 :デフォルトの名無しさん:2010/05/19(水) 19:38:34
(20+a)*a<200
を満たす最大の整数ってどうやって求めるんですか?

161 :デフォルトの名無しさん:2010/05/19(水) 19:47:36
2次不等式を解けばいい

162 :デフォルトの名無しさん:2010/05/19(水) 19:51:28
>>155
>>156
151
thenks a lot.


163 :デフォルトの名無しさん:2010/05/19(水) 19:52:17

thanks a lot.

164 :デフォルトの名無しさん:2010/05/19(水) 20:22:44

then ks a lot

165 :デフォルトの名無しさん:2010/05/20(木) 01:03:09
Visual C++ 2008 Express はもうダウンロードできないんでしょうか?

166 :デフォルトの名無しさん:2010/05/20(木) 01:11:23
うん

167 :デフォルトの名無しさん:2010/05/20(木) 01:32:42
>>165 http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/offline.aspx

168 :デフォルトの名無しさん:2010/05/20(木) 03:06:14
>>167
ありがとうございます

169 :デフォルトの名無しさん:2010/05/20(木) 03:15:37
>>168
うむ。頑張りな。ふっ。

170 :デフォルトの名無しさん:2010/05/20(木) 03:22:50
Xを入力した時にプログラムを終了させたいのですがループしてしまいます
どこがいけないのでしょうか?
int c,end=0;

while(1){
printf("*****MENU*****\n");
printf("A:ゲーム\n");
printf("B:音楽\n");
printf("C:表計算\n");
printf("X:終了\n");
printf("**************\n");
printf("------>\n");

while(1){
c=getchar();
if(c != '\n')
break;
}

switch(c){
省略
case'X':
case'x':
end == 1;
break;
default:
printf("\n不正な入力です\n\n");
break;
}
if(end == 1)
break;
}

171 :デフォルトの名無しさん:2010/05/20(木) 03:26:15
end == 1

172 :デフォルトの名無しさん:2010/05/20(木) 07:18:12
end == 1;
??

173 :デフォルトの名無しさん:2010/05/20(木) 07:32:06
end = 1;


174 :デフォルトの名無しさん:2010/05/20(木) 08:02:05
間違ってるところがいけない

175 :デフォルトの名無しさん:2010/05/20(木) 08:30:42
double d = 0.1;
printf( "%lf", d );

みたいなことをするときに「0.10000」じゃなくて、「0.1」とだけ書きたい。
けどケツのゼロを捨てる書式の指定方法なんてあったか?

176 :175:2010/05/20(木) 08:33:38
すいません、補足を。
小数点以下の桁数はわからんので、
printf( ".1%lf", d );
のようなことでは不十分なのです

177 :デフォルトの名無しさん:2010/05/20(木) 08:50:09
%g

178 :デフォルトの名無しさん:2010/05/20(木) 09:17:47
>>177
二文字で解決されるとは!
助かったthx

179 :デフォルトの名無しさん:2010/05/20(木) 14:31:21
>>178
うん

180 :177:2010/05/20(木) 14:34:35
>>179
お前は引っ込んでろw

181 :デフォルトの名無しさん:2010/05/20(木) 18:24:22
>>160
こんなんでどうだろうか?
http://codepad.org/Pq6tH9AZ

182 :デフォルトの名無しさん:2010/05/20(木) 18:28:39
なんで0から始まってるの?

183 :デフォルトの名無しさん:2010/05/20(木) 18:29:11
>>175
printf("%g\n", ... );
はどうだろうか?
http://codepad.org/xYroUg5r

184 :デフォルトの名無しさん:2010/05/20(木) 18:31:46
なんでスレ読まないで書き込むの?

185 :181:2010/05/20(木) 18:33:11
>>182
確かに 0 からはじめているのは適当。すまん。
二次方程式をちゃんとといてあたりをつけることは必要ですね。

186 :デフォルトの名無しさん:2010/05/20(木) 18:33:52
>>184
すまん。

187 :デフォルトの名無しさん:2010/05/20(木) 19:20:00
>>160
http://codepad.org/Q47oumZS

188 :デフォルトの名無しさん:2010/05/20(木) 19:51:16
scanfの引数の前に&をつける理由ですが、
scanf本体の仮引数がポインタで受けるようになっているので&つけることで実引数・仮引数の双方の型を合わせるため、でいいですか

189 :デフォルトの名無しさん:2010/05/20(木) 19:54:28
型を合わせるためなのはまあ合ってるんだけど、
アドレス渡さないと変数に結果入れらんないよね

void foo(int n) { ... }
int a;
foo(a);

で foo 内部で a に値を入れられないのと同じ理屈

190 :デフォルトの名無しさん:2010/05/20(木) 22:24:21
double a;
int b,c;

a/bの商を求めてcに代入する際に、
コンパイルはできても注意(double型がint型で〜)と出てきてしまうのですが、
これを消す方法はありますか?

191 :デフォルトの名無しさん:2010/05/20(木) 22:31:58
#include <stdio.h>

#define ROW 3
#define COLUMN 4

int main(void)
{
double a[ROW][COLUMN];
int i, j;

printf("%d行%d列の行列の各要素を入力してもらいます\n", ROW, COLUMN);
for ( i = 0 ; i < ROW ; i++)
{
printf("第%d行の要素を入力して下さい>>>", i+1);
for ( j = 0 ; j < COLUMN ; j++)
{
scanf("%lf", &a[i][j]);
}
}

printf("各要素の値は次の通りです\n");
for ( i = 0 ; i < ROW ; i++)
{
for ( j = 0 ; j < COLUMN ; j++)
{
printf("a[%d][%d]=%f\t", i+1, j+1, a[i][j]);
}
printf("\n");
}

return 0;
}

192 :デフォルトの名無しさん:2010/05/20(木) 22:37:39
#include <stdio.h>

#define ROW 3
#define COLUMN 3

int main(void)
{

double a[ROW][COLUMN]={ {1, 2, 3}, {5, 6, 7}, {9, 10, 11} };
double b[ROW][COLUMN]={ {1.1, 2.2, 3.3}, {5.5, 6.6, 7.7},
{10.1, 11.1, 12.2} };
double c[ROW][COLUMN];
int i, j;

printf("行列Aと行列Bの和は次の通りです\n");
for ( i = 0 ; i < ROW ; i++)
{
for ( j = 0 ; j < COLUMN ; j++)
{
c[i][j] = a[i][j] + b[i][j];
printf("%8.3f", c[i][j]);
}
printf("\n");
}

return 0;
}
***************************************************************

上の2つのプログラムを参考にして、N×N行列AとBをキーボードから入力し、行列A、行列B、及び行列AとBの積ABを出力するプログラムを作成する

よろしくお願いしますorz

193 :デフォルトの名無しさん:2010/05/20(木) 22:48:17
>>160
http://codepad.org/Wtgf7r1r
答えがあるかもしれない範囲を、上と下をちょっとずつせまくしてって、だんだん答えのある範囲がせまくなってったら、さいごには答えになるんじゃないかな〜? って思いついたので
ためしてみたら、なんか7.~~~~って数字でた。たしざんとかして確かめてみたら199.999999~~ってなった。200よりちいさい。よかった


194 :デフォルトの名無しさん:2010/05/20(木) 23:22:52
c = (int)(a/b);

195 :デフォルトの名無しさん:2010/05/20(木) 23:43:39
例えば
char str[] =""; を
printf("%s",str);とすると、
画面には何も出力されない、という結果になります。
これと同じことをchar型変数で行うことは可能でしょうか?
char c = ''; /*何かを代入*/
printf("%c",c);とした時画面に何も(スペースさえも)表示されない
という処理を行いたいのです。

196 :デフォルトの名無しさん:2010/05/20(木) 23:46:26
何もしなきゃいいんじゃね?

197 :デフォルトの名無しさん:2010/05/20(木) 23:49:38
何がはいってたら表示したくないの?

198 :デフォルトの名無しさん:2010/05/20(木) 23:50:08
>>196
ええとすみません、実はファイル出力したいのです。
形式がCSVで,区切りなのですが、char型を1文字だけ出力する部分で
,c, もしくは ,, こう出力したいのです。
, , こうはしたくないのです。

199 :デフォルトの名無しさん:2010/05/20(木) 23:50:26
>>195
一般的にはムリ。
条件を限定するなら手段があるのかもしれない。


200 :デフォルトの名無しさん:2010/05/20(木) 23:52:06
印字可能な文字だけ出力できればいいのかな。
ってことはそういうロジックでどうぞ、となるんだけど、悩んでるってことはそうでもないのかな

201 :デフォルトの名無しさん:2010/05/20(木) 23:56:48
>>197
何がはいっていたら、というよりも
printfの引数としても、何も表示されない値があれば知りたいのです

>>199
やはり難しいですか…ありがとうございます。
>>200
char型の中身が出力可能な値であれば、出力用文字列に連結して…といった方法でしょうか
たしかにこれでも結果的に意図する処理は可能となります

202 :デフォルトの名無しさん:2010/05/20(木) 23:58:29
>>201
んだから、もしその値があったとして、いつその値を使うの?
常に空も、常に出力もダメなんでしょ?

203 :デフォルトの名無しさん:2010/05/20(木) 23:58:55
>>195
char c = 0;
printf("%c", c);

204 :デフォルトの名無しさん:2010/05/20(木) 23:59:28
>>203
だめよそれ。
./a.out > foo.dat
として内容をみてみればいい

205 :デフォルトの名無しさん:2010/05/21(金) 00:03:41
char outbuf[80];
char c;

c = 0;
sprintf(outbuf, "%c", c);
printf("%s", outbuf);

c = 'a';
sprintf(outbuf, "%c", c);
printf("%s", outbuf);

206 :デフォルトの名無しさん:2010/05/21(金) 00:04:08
>>202
例えば前後に別の文字リテラルが出力されたとして、その間を詰めたい時に
使いたいです

207 :デフォルトの名無しさん:2010/05/21(金) 00:06:03
でもそれを条件をもとにprintfを行うかどうかを分岐するのはいやなんだよね

208 :デフォルトの名無しさん:2010/05/21(金) 00:08:53
>>205
サンプルコードまでつけて頂いて、ありがとうございます。
文字列に格納してから出力するのが一番簡単でしょうか
その方法でやってみようと思います

>>207
はい、できれば。といっても、2〜3行ソースが増えるだけなんですけどね

209 :デフォルトの名無しさん:2010/05/21(金) 00:10:39
いいえ、分岐を行うのが一番簡単で速いです。

210 :205:2010/05/21(金) 00:12:11
>>205の方法にしても0を入れるかどうかの判断が必要なんじゃないか?
と思わんでもないが、納得したならそれでいいや。
階層によっては>>205の方が楽に進むこともあるだろし。

211 :デフォルトの名無しさん:2010/05/21(金) 00:14:50
>>198
だから何もしなければいい。
カンマを打つロジックは必ず通るだろうから。

212 :デフォルトの名無しさん:2010/05/21(金) 00:26:15
>>209
横着してました。その方向でいこうと思います。

>>211
すみません勘違いしてました。そういう意味ですか。
ありがとうございます。

213 :デフォルトの名無しさん:2010/05/21(金) 00:29:04
冗談に聞こえるかもしれんが「何もしない」というのは最も最適なコードなんだぜ?
一番速く処理できてバグの入り込む余地も全く無い完全な形。
やらんでいいことはやらないっていう、良い意味での手抜きはどんどんするべきだ。

214 :デフォルトの名無しさん:2010/05/21(金) 00:30:17
char c = 0;
printf(c?"%c":"",c);

215 :デフォルトの名無しさん:2010/05/21(金) 00:52:11
>>213
真理だな。

216 :デフォルトの名無しさん:2010/05/21(金) 01:38:00
>>192

http://codepad.org/wz1ntxB5

Nは入力させるようにしてしまった。#defineさせたかったんだろうね。。
こんなんでも一応うp

217 :デフォルトの名無しさん:2010/05/21(金) 01:47:06
気持ち悪いコードだw

218 :デフォルトの名無しさん:2010/05/21(金) 01:47:36
>>192
のりかかった船なので作り直した
http://codepad.org/zol3iRyi

219 :デフォルトの名無しさん:2010/05/21(金) 01:52:19
>>217
うむ
良きに計らえ

220 :デフォルトの名無しさん:2010/05/21(金) 07:04:29
>>194
ありがとうございました。

221 :デフォルトの名無しさん:2010/05/21(金) 08:20:56
>>220
いえいえ

222 :194:2010/05/21(金) 09:56:55
>>191 #include <stdio.h>
#define COLUMN 4
void in(double (*data)[COLUMN], char name){ int i, j;
  printf("%d行%d列の行列%cの各要素を入力してもらいます\n", COLUMN, COLUMN, name);
  for ( i = 0 ; i < COLUMN ; i++) {
    printf("第%d行の要素を入力して下さい>>>", i+1);
    for ( j = 0 ; j < COLUMN ; j++)
      scanf("%lf", &data[i][j]);
  }
  printf("各要素の値は次の通りです\n");
  for ( i = 0 ; i < COLUMN ; i++) {
    for ( j = 0 ; j < COLUMN ; j++)
      printf("%c[%d][%d]=%f\t", name, i+1, j+1, data[i][j]);
    printf("\n");
  }
}
int main(void) { int i, j, k;
  double a[COLUMN][COLUMN], b[COLUMN][COLUMN], c[COLUMN][COLUMN];
  in(a, 'A');
  in(b, 'B');
  printf("行列Aと行列Bの積は次の通りです\n");
  for ( i = 0 ; i < COLUMN ; i++) {
    for ( j = 0 ; j < COLUMN ; j++) {
      c[i][j] = 0.0;
      for ( k = 0 ; k < COLUMN ; k++)
        c[i][j] += a[i][k] * b[k][j];
      printf("%8.3f", c[i][j]);
    }
    printf("\n");
  }
  return 0;
}

223 :デフォルトの名無しさん:2010/05/21(金) 11:59:41
>>126
ワロタww

マジで>>125みたいな奴ほど害になる年長者は居ないわ。

224 :デフォルトの名無しさん:2010/05/21(金) 18:43:10
プログラムを書かずにプログラミングが上達する道などないと思うのですがね。
本を読むのは必要条件だが、十分条件ではない。

225 :デフォルトの名無しさん:2010/05/21(金) 18:48:52
読むだけでは全然上達しないというのはおかしな話だとは思わんか?

226 :デフォルトの名無しさん:2010/05/21(金) 18:53:50
俺も224に同意

227 :デフォルトの名無しさん:2010/05/21(金) 18:54:33
よっぽどの天才ならともかく、一般人は読むだけじゃその場は理解したつもりになるだけで、
結局は身につかないと思うけど。

228 :デフォルトの名無しさん:2010/05/21(金) 18:55:41
>>225
読んだことにより、書ける可能性が発生する、とは思うけれども、それを上達というかどうかは微妙。
読んでも書けないようではね。

229 :デフォルトの名無しさん:2010/05/21(金) 18:57:29
とりあえず

・読むだけでも上達するし、実際効率がいい、レベルアップには必須、ただし全く書かないと上達しない
・未経験SE(または唯一日本固有のSEw)のスーパー勘違いがうざい

もうこれでいいだろ喧嘩すんなよ

230 :デフォルトの名無しさん:2010/05/21(金) 18:59:06
読んで上達するのは分析力だよね。でもコーディング力より分析力のほうが世間では求められる

231 :デフォルトの名無しさん:2010/05/21(金) 19:12:03
つまり口だけプログラマーですね

232 :デフォルトの名無しさん:2010/05/21(金) 19:26:48
プログラマがこんな風に言うのを、何度聞いたことがあるだろう?「簡単さ! 1行修正するだけだ!」

233 :デフォルトの名無しさん:2010/05/21(金) 20:11:54
>>230
それはコードを読んで、でしょ?
本なりドキュメントなりを読むことで得られる知識なくして上達はありえないよね。

そういう意味で必要条件と書いているんだろうけど、その知識を得ること自体は上達に含まれないのか?ということ。

234 :デフォルトの名無しさん:2010/05/21(金) 20:13:31
ここで質問に答えてる人ってプロなの?

235 :デフォルト:2010/05/21(金) 20:26:20
急に割り込んで申し訳ありません。学生です。
大学の課題ではないのですが、参考書に載っている説明・解説だけでは自分だけでは理解不能なので教えてください。
参考書に載っている文体を変えずに書きます
@次のプログラムの#####のところを埋めて、3人の点数を入力すると平均点を出力するプログラムを作ってみよう♪
int score[5];
int i;
float sum, average;
for( i = 0; i<=4; i = i+1) {
#####
}
for( i = 0; i<=4; i = i+1) {
#####
}
#####
A @の枠組みを用いて、3人の点数を入力すると最高点を出力するプログラムを作ってみよう♪
B10個の値 x[0]〜x[9] を入力して、x[0]〜x[9]の中に偶数があれば「○」と表示し、偶数がなければ「×」と表示するプログラムを作ろう!!!
(複数偶数があったとしても「○」と表示するのは1回だけにしてみましょう。)

配列、for、ifを用いればできると書かれているのですが平均点が0になったりちんぷんかんぷんです。。。
助けてください。

236 :デフォルトの名無しさん:2010/05/21(金) 20:48:10
>>235
int score[5];
int i;
float sum, average;
for( i = 0; i<=4; i = i+1) {
##### 点数の入力
}
for( i = 0; i<=4; i = i+1) {
##### 平均点の算出
}
##### 平均点を出力

という意図の問題だと思うけどそこは間違えてない?

0になったりするソースを載せてみるといいよ

237 :デフォルトの名無しさん:2010/05/21(金) 20:55:17
問題おかしくないか?
3人の点数なのに5人分のデーターあるぞ


238 :デフォルト:2010/05/21(金) 20:56:01
>>236
二つ目の平均点を算出するところなのですが、何度やっても0点やマイナスなったりするのですが。。。


239 :デフォルト:2010/05/21(金) 21:05:07
>>237
タイプミスです。

240 :デフォルトの名無しさん:2010/05/21(金) 21:07:32
sumの初期化

241 :デフォルト:2010/05/21(金) 21:14:14
sum の初期化をしてもきちんとした値が出力されないのですが。
一応自分が書いたプログラミングはこんな感じです。
#include<stdio.h>
int main(void){
int score[5];
int i;
float sum,average;

for(i=0; i<=4; i=i+1){
printf("成績を入力してください。");
scanf("%d",&score[i]);
}
sum =0;
for(i=0; i<=4; i=i+1){
sum += score[i];
}
average =0;
average = sum / 5;
printf("平均点は%d",average);
return 0;
}

242 :デフォルトの名無しさん:2010/05/21(金) 21:19:37
>printf("平均点は%d",average);

243 :デフォルトの名無しさん:2010/05/21(金) 21:19:51
printf は "%f" とかの方がよくね?

244 :デフォルトの名無しさん:2010/05/21(金) 21:27:09
averageに0を代入する必要はない
あと %d じゃない
printf("平均点は%lf",average)


245 :デフォルトの名無しさん:2010/05/21(金) 21:30:02
>%lf


246 :デフォルトの名無しさん:2010/05/21(金) 21:30:37
for(i=0; i<=4; i=i+1){
printf("成績を入力してください。");
scanf("%d",&score[i]);
}

この部分って問題ないの?scanfの悪癖にはまって以来使わなかった記憶が。。

247 :デフォルトの名無しさん:2010/05/21(金) 21:38:16
>>241
printf("%g", averate);
http://codepad.org/nokvbVQ5

248 :デフォルトの名無しさん:2010/05/21(金) 22:33:14
>sum += score[i];
これって型が違うと警告でない?
sum += (float)score[i];
とキャストした方がいいと思うよ。出力結果は変わらないけど、何の値を扱っているか
必ず意識するのが、経験上バグが少なくなるから
>>246
最近はコマンドラインで入力するプログラムは作らないけど、入力は文字列で
受け付けて、atof() 等で変換するのが良かったと記憶している。





249 :デフォルトの名無しさん:2010/05/21(金) 23:00:21

#include <stdio.h>

int main(void){

double a;
short n;
int i, j , k;

n = -15;

a = (double)87654/5 + (double)n;

printf("a = %f\n", a);

return 0;
}
↑これはコンパイルできたのに、全く同形の 次書き込み続きます


250 :デフォルトの名無しさん:2010/05/21(金) 23:01:55

#include <stdio.h>

int main(void){

double a;
short n; 
int i, j , k;

n = -15;

 a = (double)87654/5 + (double)n;

printf("a = %f\n", a);

return 0;
}

がコンパイルできないんですが・・・・どういうことでしょう?
本当に困ってます。
まじでわからないんですが・・・・
ちなみに改行 行間まで一緒です。
ただカーソルを段落で移動させると動き方が違うんでうしょね
あ余計なこといったかな、とにかく何が原因だろ。


251 :デフォルトの名無しさん:2010/05/21(金) 23:04:37
>>250
全角空白が二箇所ある

252 :デフォルトの名無しさん:2010/05/21(金) 23:11:35
>>250
コンパイラにパスが通ってないとか。
なんかエラーくらい出てないの?

253 :デフォルトの名無しさん:2010/05/21(金) 23:17:04
>>252
睨んでるのは数字、数字が全角か半角とかかなぁ?
全角空白?何それwwいきなりラスボス級の試練とか・・・
見えない全角空白どうやって確認ww

やっぱりコピペとかはやめたほうがいいかな・・・

254 :デフォルトの名無しさん:2010/05/21(金) 23:19:50
コピペするなら、ソースよりエラーメッセージをしろよ

255 :デフォルトの名無しさん:2010/05/21(金) 23:20:38
>>253
何を言っているかよく分からないが、後者のコードには全角空白が含まれている

256 :デフォルトの名無しさん:2010/05/21(金) 23:26:04
全角空白やタブはエディタで可視化出来るだろ

257 :デフォルトの名無しさん:2010/05/21(金) 23:26:43
>>254
Okw 俺がエラメみても分かんないから貼ります

pen.c: In function `main':
pen.c:6: error: stray'129\' in program
pen.c:6: error: stray '@' in program
pen.c:11: error: strary '\129' in program
pen.c:11: error: strary'@' in program
pen.c:16:2: error: warning: no newline at end of file

おそらく全角半角だろどうせwww


258 :デフォルトの名無しさん:2010/05/21(金) 23:27:43
>>256
やり方教えてちょんwww

259 :デフォルトの名無しさん:2010/05/21(金) 23:30:29
>>257
全角半角です。本当にありがとうございました。

260 :デフォルトの名無しさん:2010/05/21(金) 23:34:25
>>258
(1)
short n; 
の行末の全角空白を削除する。

(2)
 a = (double)87654/5 + (double)n;
の行頭の全角空白を削除する。

261 :デフォルトの名無しさん:2010/05/21(金) 23:37:36
>>260
ありがとうwwwwww
これでやっと4つめいける・・・・・・

これだけで1週間考えたからなw何か
目に滲んでくるわw

262 :デフォルトの名無しさん:2010/05/21(金) 23:43:28
>>258
サクラエディタやeclipseは全角空白は □ と表示される。他は知らん

263 :デフォルトの名無しさん:2010/05/21(金) 23:53:56
int nlz(unsigned k){
union {
unsigned asInt[2];
double asDouble;
};
int n;
asDouble = (double)k + 0.5;
n = 1054 - (asInt[LE] >> 20); // little endianなら1,big endianなら0
return n;
}

これがうまく理解できません><
優しく解説してくれるエロい人はいませんか?

264 :デフォルトの名無しさん:2010/05/21(金) 23:54:40
>>248
どのコンパイラで警告出るの?

265 :デフォルトの名無しさん:2010/05/22(土) 00:11:19
>>263
指数部を見ると下から何桁まで利用しているかがわかるので、
それを使って先頭に0が何個必要かを求めてる

266 :デフォルトの名無しさん:2010/05/22(土) 00:14:45
http://codepad.org/KR64vgw2
1.文字列を入力
2.取り除く文字を入力
3.文字を取り除いて表示
というプログラムなのですが、2の行う段階で止まってしまいます。
解説お願いします。

267 :デフォルトの名無しさん:2010/05/22(土) 00:17:53
>>266
- scanf("%*c%c",c);
+ scanf("%*c%c",&c);

268 :デフォルトの名無しさん:2010/05/22(土) 00:24:58
宿題は宿題スレへ

269 :266:2010/05/22(土) 00:32:44
>>267
初歩的なミスでした・・・
ありがとうございます
>>268
これは失礼しました

270 :デフォルトの名無しさん:2010/05/22(土) 06:41:26
はあ・・・

271 :デフォルトの名無しさん:2010/05/22(土) 12:52:28
プログラミングの本ってさ、サンプルがあって、行ごとに何をやってるかが記載されてるんだよね。
でもいいかえれば 他人が作成したコードを見ることにかわりはないんだから、結局本なんて買わずネットで調査すればいいじゃんかと。

272 :デフォルトの名無しさん:2010/05/22(土) 12:57:38
いや、やっぱり商業目的で作られた説明と無償のボランティア的な説明とではそれなりに色々違うと思う

273 :デフォルトの名無しさん:2010/05/22(土) 15:46:19
C言語で1〜10までの範囲でrand関数の値を所得するにはどうすれば良いですか
rnd = rand(10)
これでいいんでしょうか

274 :デフォルトの名無しさん:2010/05/22(土) 15:47:24
すいません。以下のプログラムの最後のwhileのところで実行時エラーになります。
どうなってますか。unsigned charをcharにしたらうまくいったんですがどうなってますか。
{
  system("echo 111 > test_1.txt");

  unsigned char* p_uc;
  p_uc = new unsigned char[10];
  FILE* fp_uc;
  if((fp_uc = fopen("test_1.txt", "r")) == NULL){
    printf("file open error line:%d\n", __LINE__);
    exit(0);
  }
  int i=0;
  while((p_uc[i++] = fgetc(fp_uc)) != EOF){ ; }
}

275 :デフォルトの名無しさん:2010/05/22(土) 15:55:45
>>274
assert(static_cast<unsigned char>(EOF) != EOF):

276 :デフォルトの名無しさん:2010/05/22(土) 15:56:55
>>273
rand() % 10 + 1
(int)((double)rand() * 10 / ((double)RAND_MAX + 1)) + 1

前者の方が速いが、僅かに偏ったり、場合によって周期が短くなったりすることがある
後者の方が遅いが、どんな場合でも安心して使える

277 :デフォルトの名無しさん:2010/05/22(土) 15:59:24
>>274
EOF は負の数だから unsigned char に代入した時点で値が変わる。正しく比較できない。
そのため、無限ループになって配列範囲外にアクセスしている。

278 :デフォルトの名無しさん:2010/05/22(土) 16:00:04
>>273 http://www.kouno.jp/home/c_faq/c13.html#16

279 :デフォルトの名無しさん:2010/05/22(土) 16:03:54
なるほど。EOFってただの-1だったんですね。勉強になりましたありがとうございました。
とりあえず以下で回避できました。
int temp_c;
while((temp_c = fgetc(fp_uc)) != EOF){
  p_uc[i++] = temp_c;
}

280 :デフォルトの名無しさん:2010/05/22(土) 16:39:11
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d%d" &a, &b);
return 0;
}

これコンパイルできなかったんですが・・・
どこらかどうみても
どこも間違ってるとこないような・・
どこが間違ってるんでしょう?

281 :デフォルトの名無しさん:2010/05/22(土) 16:43:27
VSでやっててプロジェクトの作り間違いとかじゃねえの

282 :デフォルトの名無しさん:2010/05/22(土) 16:43:29
いいかげん、全角スペースは飽きた

283 :デフォルトの名無しさん:2010/05/22(土) 16:47:33
block_cnt[j]=ch.shot_cnt;

**省略**

for(int j=0;j<7;j++){
block_cnt[j]=block_cnt[j]-1*BLOCK_TATE/ch.shot_cnt;
if(block_cnt[j]<=0){
block_cnt[j]=0;
}
}

コンパイルはできました。
BLOCK_TATE は 20 、 ch.shot_cnt は 40 です。

block_cnt[j]はdoubleで宣言したのですが、なぜ block_cnt[j] の値が減らないのかを教えてください。
-1*BLOCK_TATE/ch.shot_cnt を -1 に変えればちゃんと減るのですが・・・。
またできれば対応策もお願いします。

284 :デフォルトの名無しさん:2010/05/22(土) 16:50:04
20/40 = 0

285 :デフォルトの名無しさん:2010/05/22(土) 16:57:12
>>280
- scanf("%d%d" &a, &b);
+ scanf("%d%d", &a, &b);

>>281-282
おちつけ

286 :デフォルトの名無しさん:2010/05/22(土) 17:04:19
>>285


280ですがいや意味わかりません・・・
+ -ってなんですか?
この前はscanfで組んだプログラムできたんですが・・
どこが間違ってますか?

287 :デフォルトの名無しさん:2010/05/22(土) 17:06:45
>>286 なんで + - しか見ないんだよ。その後ろ見れば気づくだろ。わざとか?

288 :デフォルトの名無しさん:2010/05/22(土) 17:10:13
>>276
後者も偏りは出るだろ。
最大値が10の倍数でもないかぎり。
偏りを無くしたかったら振り直し法を使うしかないよ。

289 :デフォルトの名無しさん:2010/05/22(土) 17:59:11
んで、Kernighan 先生の本はもう買ったのか?
この本は必須だからな。
まず基礎を固めないと、その上に何を積み重ねても無駄無駄。

290 :デフォルトの名無しさん:2010/05/22(土) 18:31:37
とりあず
intでperioikoiと perioikoinとperioikoron
を変数名にして

perioikoi = 1
perioikoin =1で
perioikoron = perioikoi+perioikoinを実行したら
4ってなるんですけど何でですか?


291 :デフォルトの名無しさん:2010/05/22(土) 18:34:55
>>290 再現用コード貼ってみろ。

292 :デフォルトの名無しさん:2010/05/22(土) 18:38:54
>>291
頼むから作ってくれ・・・
他のこと指摘されそうで怖い。頼む

293 :デフォルトの名無しさん:2010/05/22(土) 18:42:26
>>292
指摘されたら怖いとか、意味がわからん。
問題の原因が知りたいんじゃないのか?

294 :デフォルトの名無しさん:2010/05/22(土) 18:52:58
指摘を恐れる者に成長は無い

295 :デフォルトの名無しさん:2010/05/22(土) 19:02:00
>>293>>294
こですが・・・・
#include<stdio.h>
int main(void)
}
int perioikoi, perioikoin, perioikoron;

perioikoi = 1;
perioikoron =1;
perioikoron = perioikoi + perioikoin;

printf("%d\n", perioikoron);

return 0;
}

実行したら4になります

296 :デフォルトの名無しさん:2010/05/22(土) 19:02:57
間違えた こうです
#include<stdio.h>
int main(void)
}
int perioikoi, perioikoin, perioikoron;

perioikoi = 1;
perioikoinn =1;
perioikoron = perioikoi + perioikoin;

printf("%d\n", perioikoron);

return 0;
}

実行したら4になります
何故でしょうか?
試しに誰か作ってください・・・・・・

297 :デフォルトの名無しさん:2010/05/22(土) 19:03:18
>>290
何が4ってなるんだよ。

298 :デフォルトの名無しさん:2010/05/22(土) 19:04:55
>>296
おまえそれ実行してないだろ。コンパイルすらとおらねぇよ。

299 :デフォルトの名無しさん:2010/05/22(土) 19:05:43
また間違えた
間違えた こうです
#include<stdio.h>
int main(void)
}
int perioikoi, perioikoin, perioikoron;

perioikoi = 1;
perioikoin =1;
perioikoron = perioikoi + perioikoin;

printf("%d\n", perioikoron);

return 0;
}

誰かまじで試しにつくって・・・
perioikoiじゃなくても
piru pirumon pirumonia
でもOK

300 :デフォルトの名無しさん:2010/05/22(土) 19:06:45
もっと区別のつきやすい変数を使ってくれ

301 :デフォルトの名無しさん:2010/05/22(土) 19:07:34
>>300
同じ形式で作ってはってくれませんか?

302 :デフォルトの名無しさん:2010/05/22(土) 19:07:42
>>299
ここにもう一度書くんじゃなくて、コピペしろ
いいか、コピペだ

303 :デフォルトの名無しさん:2010/05/22(土) 19:07:51
自分で実行してから聞けよ

304 :デフォルトの名無しさん:2010/05/22(土) 19:08:39
>>301 自分でやれよ。 a, b, c でいいだろ。

305 :デフォルトの名無しさん:2010/05/22(土) 19:09:03
>>295
まずあれだね変数がみんな似てて見にくいよ
perioikoinが定義されていない

306 :デフォルトの名無しさん:2010/05/22(土) 19:09:18
コピペする前にコンパイルしろ。できてない。{

307 :デフォルトの名無しさん:2010/05/22(土) 19:10:51
もしかして俺らをおちょくってるとか?


308 :デフォルトの名無しさん:2010/05/22(土) 19:12:23
どうせスペルミスだろ

309 :デフォルトの名無しさん:2010/05/22(土) 19:12:48
>>299
まず int main(void)下の } を { にしろ。話はそれからだ

310 :デフォルトの名無しさん:2010/05/22(土) 19:13:08
悪意の込められた変数名を見れば釣りだってわかるだろ

311 :デフォルトの名無しさん:2010/05/22(土) 19:13:26
>>309
そう言ったらコピペしてくれなくなるかもしれないじゃん

312 :デフォルトの名無しさん:2010/05/22(土) 19:13:56
>>302の言ってる事が正論
コピペしなよ


313 :デフォルトの名無しさん:2010/05/22(土) 19:14:37
>>307
おちょくってない。

a,b,cはchar型っぽいのでやめとく

ryu ken begaでやってみた

#include<stdio.h>
int main(void)
{
int ryu, ken, bega;

ryu = 1;
ken = 1;
bega = ryu + ken;
printf("%d\n", bega);

return 0;
}

実行したけど4になる・・・・何故?
誰かやってくれませんか?

314 :デフォルトの名無しさん:2010/05/22(土) 19:15:51
2になるけど

315 :デフォルトの名無しさん:2010/05/22(土) 19:16:34
>>313
> 誰かやってくれませんか?
↓ここ使え。
http://codepad.org/

316 :デフォルトの名無しさん:2010/05/22(土) 19:16:37
本当にそれ以外何もしてないのか?
さっきコピペしてなかったのを見るに、コード隠してるだろ

317 :デフォルトの名無しさん:2010/05/22(土) 19:21:39
OSとコンパイラを教えてくれ

318 :306:2010/05/22(土) 19:22:04
>>313
ところで、エディターは何使ってる?

319 :デフォルトの名無しさん:2010/05/22(土) 19:25:57
どうせコンパイルせずに実行してるとかで、
古い実行ファイルのまま(んでそいつが4を出す)なんだろ。

320 :デフォルトの名無しさん:2010/05/22(土) 19:27:37
Release版でビルドしたけどDebug版を実行してるとか

321 :デフォルトの名無しさん:2010/05/22(土) 19:44:09
本当のこと書くわ・・・・・


ryu=printf(〜〜〜〜)
ken=printf(〜〜〜〜)
bega=ryu+ken
printf(bega)

本当はprintf ryu kenの中身が1になるような
計算の値を変数にいれてるんだ。で実行したら
1
1
2+2=4
になる。

どうやっても
1
1
2+2=4
となる。
どこから2がでてきた・・・

322 :デフォルトの名無しさん:2010/05/22(土) 19:44:39
>>284
#define で20から20.00にしたら解決した
どもでした。

323 :デフォルトの名無しさん:2010/05/22(土) 19:44:48
printfの戻り値は出力バイト数だぞ

324 :デフォルトの名無しさん:2010/05/22(土) 19:45:09
>>321
嘘ばっかじゃねーかw

325 :デフォルトの名無しさん:2010/05/22(土) 19:45:32
>>321
ryu
ken
の値も表示しろ

326 :デフォルトの名無しさん:2010/05/22(土) 19:46:35
>>321
最後までコピペしないのな
教えてもらう気0だろ

327 :デフォルトの名無しさん:2010/05/22(土) 19:48:43
>>323
そうなんですか?
printfの値そのものを変数にしたいんだよ・・・
printfで
printf()=10とでてきた10そのものの値を

変数 int perioikoi

perioikoi= printf()

みたいにしてperioikoiは10であるようにしたい

どうすれば・・・


328 :デフォルトの名無しさん:2010/05/22(土) 19:50:44
何の話をしてるのかわからんw

329 :デフォルトの名無しさん:2010/05/22(土) 19:50:58
>>327
C言語でおk

330 :デフォルトの名無しさん:2010/05/22(土) 19:51:25
>>327
> どうすれば・・・
>>291

331 :デフォルトの名無しさん:2010/05/22(土) 19:53:20
printfが出した数字を変数に代入できないんですか?
色々な値をそのつど変数としたい。


332 :デフォルトの名無しさん:2010/05/22(土) 19:54:19
>>327
C++ならprintfをオーバーロードして参照を返すようにしてやればできるけど、Cなら難しいね。

333 :デフォルトの名無しさん:2010/05/22(土) 19:55:07
>>331
もしかして
int x = printf("1");
で x が 1 になると思ってるの?

334 :デフォルトの名無しさん:2010/05/22(土) 19:56:08
>>332 無茶苦茶いうなw

335 :デフォルトの名無しさん:2010/05/22(土) 19:56:09
>>333
例が悪いぞ

336 :デフォルトの名無しさん:2010/05/22(土) 19:56:22
>>333
思ってた。

実際それがしたい。

337 :デフォルトの名無しさん:2010/05/22(土) 19:57:22
atoiでおk

338 :デフォルトの名無しさん:2010/05/22(土) 19:58:13
int x = 1;
printf("%d\n", x);
でいいだろ1行は無理じゃない?しようと思ったこともないわ

ていうかたぶん可読性が落ちるからやめろ

339 :デフォルトの名無しさん:2010/05/22(土) 19:58:14
>>336
使う関数の仕様ぐらい調べてから使えよ。

で、それなら sprintf() して strtol() すればいいんじゃね?
文字列出力する前に数値で計算したほうがいいと思うけど。

340 :デフォルトの名無しさん:2010/05/22(土) 19:59:07
printfで出力された値をほかの式で使うにはどうしたらいんですか?

実は判別式条件のプログラム作ってるんです。
ちなみに関大理工ねw

あんまり難しい事書くと、高学歴のくせに生意気だと思われるのが
恥ずかしかったんで・・・


341 :デフォルトの名無しさん:2010/05/22(土) 19:59:27
釣りか。お疲れ様でした。

342 :デフォルトの名無しさん:2010/05/22(土) 19:59:56
>>333 それは確かに 1 になるな

343 :デフォルトの名無しさん:2010/05/22(土) 20:00:11
>>338
判別しき何で別に1とは限らないんですよ・・・
2かもしれんし,10,9かもしれん。

無茶いってすいません

344 :306:2010/05/22(土) 20:00:34
printf("%d", (printf("123456789 "),10));

345 :デフォルトの名無しさん:2010/05/22(土) 20:01:24
>>343
int x = (判別式);
printf("%d\n",x);
はだめなのか?

346 :デフォルトの名無しさん:2010/05/22(土) 20:01:38
>>340
聞かれもしないのに自分で高学歴とか言い出すあたり、救いようのないアホだな。

347 :デフォルトの名無しさん:2010/05/22(土) 20:01:56
>>340
printfに与えたパラメータを他の式でも使えばいいんじゃないの。

348 :デフォルトの名無しさん:2010/05/22(土) 20:04:40
>>345
それだ!!!!!!!!!!
わざわざ代入するならprintfで出す必要ないんだ・・・
馬鹿すぎた・・・

ありがとう・・・・

349 :デフォルトの名無しさん:2010/05/22(土) 20:04:53
どーしても、ってならprintfを関数なりマクロなりでラップするとか?
正直アホらしいが。

350 :デフォルトの名無しさん:2010/05/22(土) 20:05:45
久しぶりにすげぇのを見たな。

351 :デフォルトの名無しさん:2010/05/22(土) 20:05:58
int myprint(){
int x

printf (〜);
return x
}

352 :デフォルトの名無しさん:2010/05/22(土) 20:06:05
>>348
よかったな。

353 :デフォルトの名無しさん:2010/05/22(土) 20:06:08
日本語ができないんだから
C言語のソースを貼ればいいのに

354 :デフォルトの名無しさん:2010/05/22(土) 20:09:38
ありがとう・・・・
本間に感謝してる。
パソコン初心者っていうカススレだと絶対埃がどうのこうの言われて
相手にされてないはず・・・・
ここお気に入りに登録しといた。
また質問する。貰うばっかりですまんけど
答えてることで精神が充実する人がいるなら^^

355 :デフォルトの名無しさん:2010/05/22(土) 20:11:59
本間さんよかったね

356 :デフォルトの名無しさん:2010/05/22(土) 20:12:00
今度からソースは一言一句変更せずにコピペしろよ

357 :デフォルトの名無しさん:2010/05/22(土) 20:27:28
>>340
お前みたいなのが関大とか関大も落ちぶれたもんよ....

358 :306:2010/05/22(土) 20:34:53
関大が全部ってわけじゃないだろう、理工学部の…

359 :デフォルトの名無しさん:2010/05/22(土) 20:50:25
#include <stdio.h>
int main(void)
{
int a,perioikoi;
printf("数字を入力して下さい。:");
scanf("%d",&a);
printf((a)?"%d\n":"終わり。\n",perioikoi=a);
return 0;
}
こんなの想像してたw

360 :デフォルトの名無しさん:2010/05/22(土) 22:02:20
もうこれでいいじゃん
printf("%d\n", ryu = 1);
printf("%d\n", ken = 1);
printf("%d\n", bega = ryu + ken);

361 :デフォルトの名無しさん:2010/05/22(土) 22:05:21
いいじゃんね

362 :デフォルトの名無しさん:2010/05/22(土) 22:13:00
なんかよくわからんがprintfの結果を変数に代入したいんならsprintf使えばいいんじゃね?

363 :デフォルトの名無しさん:2010/05/22(土) 22:22:56
error: warning: no newline at end of file
どんだけ修正しても最終的に
このエラーメッセージが一つ出てきます。

これが出ても実行されて成功するのですが、これでなくするためには
どうしたらいいですか?

364 :デフォルトの名無しさん:2010/05/22(土) 22:25:34
>>363
ソースの最後の行で改行する

365 :デフォルトの名無しさん:2010/05/22(土) 22:26:42
書いてあるだろ。英語が通じない人ですか?

366 :デフォルトの名無しさん:2010/05/22(土) 22:35:07
no …否定
newline …改行
at end of file …ファイルの終わりに
訳して「ソースの最後の行に改行がありません」

367 :デフォルトの名無しさん:2010/05/22(土) 22:40:19
だが待て、ソースの*最後の*行に改行がないのは当然じゃまいか

368 :デフォルトの名無しさん:2010/05/22(土) 22:46:14
>>367
意味分からん
ソースの最後を改行コードにしろってwarningだろ

369 :デフォルトの名無しさん:2010/05/22(土) 22:48:37
>>363
コンパイラを変える

370 :デフォルトの名無しさん:2010/05/22(土) 22:58:25
俺は>>367を評価する

371 :デフォルトの名無しさん:2010/05/22(土) 23:02:15
だから、[EOF]だけなのは行じゃないって

372 :デフォルトの名無しさん:2010/05/22(土) 23:07:39
>>367 警告は「ファイルの最後」に改行がないことを指摘している。

373 :デフォルトの名無しさん:2010/05/22(土) 23:17:04
>>366

374 :デフォルトの名無しさん:2010/05/22(土) 23:20:19
改行まで、が行なんだから、
改行の無いのは行未満なんだよ。
改行はセパレーターじゃなくてターミネーターなんだよ。
「最後の行に改行を付ける」だと、

1行目\n2行目\n行未満[EOF]

1行目\n2行目\n\n行未満[EOF]

こうなるわけだ。

375 :デフォルトの名無しさん:2010/05/22(土) 23:28:35
>>366 が適当に訳したのが悪い。

376 :デフォルトの名無しさん:2010/05/22(土) 23:31:33
>>366は途中まで合ってるのに結論が間違ってるという

377 :デフォルトの名無しさん:2010/05/22(土) 23:39:13
訳したものだが英語苦手だ

378 :デフォルトの名無しさん:2010/05/22(土) 23:50:29
#include <stdio.h>
int main(void)
{
double x;
scanf("%lf\n", &x);

return 0;
}
これ実行すると、xにしか代入しないという設定なのに
実行してたとえば3と入れると次の行も出てくるんですか・・・
で次の行に何か数字入れたら終わり・・
どういうことでしょうか?別に
double x, y;
("%d\n", &x, &y);としたわけじゃないのに・・

379 :デフォルトの名無しさん:2010/05/23(日) 00:07:38
\nがなんだか分かって使ってんの?

380 :デフォルトの名無しさん:2010/05/23(日) 00:08:53
>>378
\nなんているのか?
scanfなんてつこうたことないから、分からんが

381 :デフォルトの名無しさん:2010/05/23(日) 00:09:05
\n消してみたら?

382 :デフォルトの名無しさん:2010/05/23(日) 00:41:04
ありがとうございますscanfの中は\nいらないのですね。
・・・でも今度は実行すると
#include <stdio.h>
int main(void)
{
double x;
scanf("%lf", &x);
printf("%d\n", x+100);
return 0;
}
xに何代入しても必ず0になります。
何故でしょうか?

383 :デフォルトの名無しさん:2010/05/23(日) 00:44:54
>>382
%d じゃなくて %f で表示

384 :デフォルトの名無しさん:2010/05/23(日) 00:47:55
最近、浮動小数の時も %d にするのが流行ってるの?

385 :デフォルトの名無しさん:2010/05/23(日) 00:48:59
訂正
最近、浮動小数の時も %d にするのが流行ってるの?
あと %lf を使おう

386 :デフォルトの名無しさん:2010/05/23(日) 00:49:04
流行ってないよ。他に見たことあるの?

387 :デフォルトの名無しさん:2010/05/23(日) 00:49:26
質問する前に、自分でなんとか調べる癖をつけろよ
入門者がそんなレベルの質問してたらスレがいくつあっても足りないんだよ

388 :デフォルトの名無しさん:2010/05/23(日) 00:51:23
>>385 http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html

389 :デフォルトの名無しさん:2010/05/23(日) 00:51:40
>>387
「質問する前に、自分でなんとか調べる癖をつけろよ」なんて書き込みの方が余程無駄。
ここで調べてるんだろ。答える気がないなら書き込むなアホ。
そんな書き込みしてたらスレがいくつあっても足りないんだよ。ドアホ。


390 :デフォルトの名無しさん:2010/05/23(日) 00:54:01
なんで%gっていつも%lfにまけてしまうん
%lfってなんでそんなにつよいん

391 :デフォルトの名無しさん:2010/05/23(日) 00:55:05
>>389
人の時間を使っていることを意識しろよ。

392 :デフォルトの名無しさん:2010/05/23(日) 00:55:46
>>391
釣られんなドドアホ。

393 :デフォルトの名無しさん:2010/05/23(日) 00:56:52
>>389
がっこうのせんせいにでんわするのがはやいですよ^^

394 :デフォルトの名無しさん:2010/05/23(日) 00:57:45
>>388
Ω ΩΩ< な、なんだってー!!
俺も院の先輩に言われたわwww

395 :デフォルトの名無しさん:2010/05/23(日) 01:01:50
>>394
そういう誤解をしている人は入力変換指定子を半分も理解できていない場合が多い
出力時と比べてはるかに高機能なんだけどな

396 :デフォルトの名無しさん:2010/05/23(日) 01:36:22
>>390
scanfのgがfと同一だからさ

397 :デフォルトの名無しさん:2010/05/23(日) 02:00:58
http://codepad.org/FAg02jWC

関数bbbは int 型の引数を受け取るが
int a;
int b;
int c;
bbb(3, a,b,c);

これを

long long a;
long long b;
long long c;
bbb(3, a,b,c);

long long 型の引数を受け取るように改造しろ


398 :デフォルトの名無しさん:2010/05/23(日) 02:38:53
>>396
で、scanfでfを使うように覚えてしまって、出力でもfを使ってしまうと。
lfの流れとまるで同じなんだな

399 :デフォルトの名無しさん:2010/05/23(日) 07:42:32
int p = new int[hensu];

この後pを使ってnewで確保した領域のサイズを得るにはどうしたらいいですか

400 :デフォルトの名無しさん:2010/05/23(日) 08:05:05
ポインタのアスタリスクとアンパサンドについて質問します。
*をつけるとその実体
&をつけるとそのアドレスを示すことは理解してます。

以下の場合、最後のreturnは何をなぜ&をつけているのか説明していただけませんか?

------------------
struct test{
int x;
}TEST, *PTEST;

PTEST pT;

pT = XXX(); // XXX関数はpT(アドレス)に適応したアドレスを返すとする
return &pT->x; //&をつける
--------------------

ここで

------------------
struct test{
int x;
}TEST, *PTEST;

PTEST pT;

pT = XXX(); // XXX関数はpT(アドレス)に適応したアドレスを返すとする
return pT->x; //&を外す
--------------------

&を外すと、C2220: warning treated as error - no 'object' file generatedエラーが出ます
なぜなのでしょうか?

401 :デフォルトの名無しさん:2010/05/23(日) 08:12:05
関数の戻り値の型があなたが隠してるけど、intだから。

402 :400:2010/05/23(日) 08:14:46
補足です

XXX関数の戻り値はPTEST型とします。

>>401
関数の戻り値はintではなく、PTEST型です。

403 :デフォルトの名無しさん:2010/05/23(日) 08:17:02
>399

int *p = new int[hensu];
だよね?

結論から言うと、pから確保したサイズを得ることはできない。
hensuを保持しておかなければならない。


404 :400:2010/05/23(日) 08:22:27
あ、すいません。なんでもないです。
この質問は終了します。
ソースコードよく読んでないだけでした。すいません

405 :デフォルトの名無しさん:2010/05/23(日) 08:22:45
>400>402

関数の戻り値がPTESTであれば、返すのはpTであるはず。

関数のメンバを参照しているとき、その型はメンバの型となる。

struct test{
int x;
}TEST hoge;

とあったときに
hogeの型 TEST
&hogeの型 TEST *

hoge.xの型 int
&hoge.x→&(hoge.x)の型 int *



406 :400:2010/05/23(日) 08:24:32
>>405
すいません

PLONG AAA()
{
PTEST pT;

pT = XXX(); // XXX関数はpT(アドレス)に適応したアドレスを返すとする
return &pT->x;
}

となっているだけで、PLONG型にあわせてるだけでした。
中身だけ見てたために勘違いしてました。
ほんとに申し訳ない

407 :デフォルトの名無しさん:2010/05/23(日) 11:46:08
>>340
>printfで出力された値をほかの式で使うにはどうしたらいんですか?
の意味が良くわからないんですよ。違った角度から説明してもらえませんか?


408 :407:2010/05/23(日) 11:49:54
終わってたのね、すみません。

409 :デフォルトの名無しさん:2010/05/23(日) 12:41:08
?演算子は見づらいけどprintfと一緒に使うと短くできるね。
例えばFizzBuzzとかこれだけだし。
#include <stdio.h>
int main(void)
{
int i;
for (i=1;i<101;i++)printf((i%3)?((i%5)?"%d\n":"Buzz\n"):((i%5)?"Fizz\n":"FizzBuzz\n"),i);
return 0;
}

410 :デフォルトの名無しさん:2010/05/23(日) 12:49:06
>399
::malloc_usable_size()@malloc.h

C言語ならもっと別の方法が2, 3あるけどC++は不便だな

411 :デフォルトの名無しさん:2010/05/23(日) 12:51:48
>>410
そういう処理系依存のものは
そう断りを入れて、環境と合わせて紹介するようにしてくれ

412 :デフォルトの名無しさん:2010/05/23(日) 12:54:45
void *GET_BUF(void)
{
char *addr;

addr = malloc(160);

return addr;
}
解析中に上記のようなコードみつけたんですが、mallocをオーバーラップして意味あるんですか

413 :デフォルトの名無しさん:2010/05/23(日) 12:56:20
>>409
最近、条件演算子でも覚えたのか
iの行方はいかに、()と\nが冗長だな
はい次のかたどうぞ

414 :デフォルトの名無しさん:2010/05/23(日) 12:56:22
>>409
2回も5で割るのは無駄だと直感的にわかろうよ

415 :デフォルトの名無しさん:2010/05/23(日) 12:56:22
C++ならvector使えばいいだけだろ

416 :デフォルトの名無しさん:2010/05/23(日) 12:56:27
常に160バイトのバッファが返される

417 :デフォルトの名無しさん:2010/05/23(日) 12:58:28
>>416>>412

>>414
2回書いた方が速度的にも速い

418 :デフォルトの名無しさん:2010/05/23(日) 12:59:30
>>416
それはわかるんだけどmallocして使い終わったらfreeで返さないといけないでしょう。
これ絶対リークするよ

419 :デフォルトの名無しさん:2010/05/23(日) 13:00:08
>>418
FREE_BUF があればいいんじゃない

420 :デフォルトの名無しさん:2010/05/23(日) 13:11:44
後気になるのは、addrはローカルなので、その範囲はreturnするまで。
returnした後はaddr領域がメモリから消えてしまう。
mallocで割り当てた領域をGET_BUFの戻り値として返しているか心配です

421 :デフォルトの名無しさん:2010/05/23(日) 13:13:02
>>420
それは心配ない
解析とかいうレベルに到達していないね

422 :デフォルトの名無しさん:2010/05/23(日) 13:14:24
int foo() {
 int a;
 a = 1;
 return a;
}

でちゃんと1が返されるのか、
と心配しているのと同じ事だな

GET_BUFの戻り値をちゃんと受けて、それをちゃんとfreeしてるなら、リークしない

423 :デフォルトの名無しさん:2010/05/23(日) 13:16:22
解析歴3年です。コードを見る力は多分にあります

424 :デフォルトの名無しさん:2010/05/23(日) 13:17:37
>>423
何年やってもダメなもんはダメなんだよ

425 :409:2010/05/23(日) 13:23:33
>>413
カッコなくてもよかったかw
短いと思って一つずつ\n付けたがprintf("\n");の方がよかったのかな。
iは101だけどなにかまずい?

426 :デフォルトの名無しさん:2010/05/23(日) 13:34:46
void FREE_BUF(void *addr)
{
  free(addr);
}

427 :デフォルトの名無しさん:2010/05/23(日) 13:36:53
原文をよく読めばわかるが、FizzBuzz問題の本質を誤解している人がいる。

あれは、まず解答を紙に書かなくちゃいけない。
なぜなら基本的な文法が頭に入っているかどうかチェックするため。
これだけ単純な問題でいちいち実際にコンパイルが通るか、実行して結果を確認しているようでは
生産性は上がらない。プロとしては失格。

次に制限時間があること。
時間内に仕様通りのプログラムが書けるかどうか、仕事管理能力を見る。

重要なのはこの2点。「基礎知識があること。締め切りを守ること。」
コードがエレガントかどうか、速いかどうかはここでは採点されない。あくまでも試験問題だからね。
出題者の意図を推し量ることができるってのも社会人として重要なスキルだよ。

428 :デフォルトの名無しさん:2010/05/23(日) 13:43:29
採点されないことは無いだろ
速くてエレガントなら評価は高い

429 :デフォルトの名無しさん:2010/05/23(日) 13:51:47
それは担当者によると思う
たぶん、速度やらを見るためのアルゴリズム系の問題は別に出されることが多いんじゃないか?
処理系やデータ構造にも依存してくるし

430 :デフォルトの名無しさん:2010/05/23(日) 13:56:25
>>428
これはあくまでも「問題が解けたか、解けなかったか」でふるい落とすための物でしょ
「応募者の99%はコードが一切書けないことに頭を悩ませた」、その結果の産物なんだし
プログラマーとして優秀かどうか以前を見極めるための問題なんだから

431 :デフォルトの名無しさん:2010/05/23(日) 14:04:43
1分でエレガントなコードを書いたとして
何も思わない担当者はどうかと思う

432 :デフォルトの名無しさん:2010/05/23(日) 14:04:45
>>427
解けない奴を無条件にふるいにかけるだけでしょ

433 :デフォルトの名無しさん:2010/05/23(日) 14:06:56
FizzBuzzは使い古されてるから
今時そのまま出す担当者はいないと思うけど

434 :デフォルトの名無しさん:2010/05/23(日) 14:07:38
>>431
この問題しってたのか、ぐらいにしか思われなかったり

435 :デフォルトの名無しさん:2010/05/23(日) 14:08:10
まあFizzBuzzならそうだろうなw

436 :デフォルトの名無しさん:2010/05/23(日) 15:29:44
完全に何も知らないやつを落とすのが目的なんだから知ってたんならそれでいいじゃん
凝ったことをやろうとしてうっかりミスで自滅さえしなきゃ

437 :デフォルトの名無しさん:2010/05/23(日) 15:41:12
15の倍数は3の倍数と5の倍数としても扱えばいいのか迷う

438 :デフォルトの名無しさん:2010/05/23(日) 15:41:12
このスレって高圧的でコミュ力なさそうな奴多いなあ。

439 :デフォルトの名無しさん:2010/05/23(日) 15:43:47
>>417
速度気にするならprintfを使わないトコからはじめてくれよ

440 :デフォルトの名無しさん:2010/05/23(日) 15:44:04
「奴」の話なんてどうでもいい


441 :デフォルトの名無しさん:2010/05/23(日) 15:44:18
自己紹介

442 :デフォルトの名無しさん:2010/05/23(日) 15:58:20
処理系によるのだろうが
n%5を変数に入れて使い回した方が速かった

443 :デフォルトの名無しさん:2010/05/23(日) 16:11:14
(゚∀゚)アヒャ

444 :デフォルトの名無しさん:2010/05/23(日) 18:17:26
>>443
#include <stdio.h>
int main(void)
{
int i,a[]={167,2,85,223,169,167,0,191,0,21,0,191,168,0,0,0,94,0,27,159,167,94,0,76,94,168,48,74,43};
for(i=0;i<sizeof(a)/4;i++)printf("%c",a[i]-127);printf("\n\n");
return 0;
}

445 :デフォルトの名無しさん:2010/05/23(日) 19:08:49
文字化けした

446 :デフォルトの名無しさん:2010/05/23(日) 20:27:56
>>445
たいしたものでないので気にしないでw

447 :デフォルトの名無しさん:2010/05/23(日) 20:43:57
#include<stdio.h>
int main(void)
{
char key[] = "A52A2245332A252B435B2222A2B2A2A23A2C32A3B5B2222A52B43532A2352C23A52A2246D2A3533B35K2A4D22A3224A45D2C25B2A32A5D2C25D4A26C4A1";
char *p = key;
int i, c, b = 1;
while(*p)
{
c = 0;
for(i = 0; i < 8; i++)
{
if(*p == '0')
{
if(!*++p)
break;
b = !b;
}
c <<= 1;
c += b;
if((*p)-- == 'A')
*p = '0';
if(*p >= 'A')
b = !b;
}
if(c)
putchar(c);
}
return 0;
}

448 :デフォルトの名無しさん:2010/05/23(日) 20:45:10
>>447
このコード実行してしまったんですが大丈夫ですか?

449 :デフォルトの名無しさん:2010/05/23(日) 21:22:07
殺処分すれば大丈夫だよ。

450 :デフォルトの名無しさん:2010/05/23(日) 22:22:11
>>448
codepadつかえ

451 :デフォルトの名無しさん:2010/05/23(日) 23:49:45
>>447 codepadつかえ
#include <stdio.h>
int main(void){
  char key[] = "A52A2245332A252B435B2222A2B2A2A23A2C32A3B5B2222A52B43532A2352C23A52A2246D2A3533B35K2A4D22A3224A45D2C25B2A32A5D2C25D4A26C4A1";
  char *p = key;
  int c, i, b = 1;
  while(c = *p++){
    if(c <= '9'){
      c -= '0';
      for(i=0; i < c; i++) printf("%c", b+'0');
      b = !b;
    } else {
      switch(c - 'A' + 1){
      case 1: // 'A'
        if(b) printf("1"); else printf("0");
        b = !b; break;
      case 2: // 'B'
        if(b) printf("10"); else printf("01");
        break;
      case 3: // 'C'
        if(b) printf("101"); else printf("010");
        b = !b; break;
      case 4: // 'D'
        if(b) printf("1010"); else printf("0101");
        break;
      case 11: // 'K'
        if(b) printf("10101010101"); else printf("01010101010");
        b = !b; break;
      }
    }
  }
}

452 :デフォルトの名無しさん:2010/05/23(日) 23:51:20
>>451
codepad使え

453 :デフォルトの名無しさん:2010/05/23(日) 23:53:25
    へ          へ|\ へ     √ ̄|        へ
   ( レ⌒)  |\   ( |\)| |/~|  ノ ,__√    /7 ∠、 \ .  丶\      _ __
|\_/  /へ_ \)   | |   | |∠  | |__   | /   !  |     | |_〜、  レ' レ'
\_./| |/   \     .| |( ̄  _) |     )  | |    i  |  へ_,/    ノ   ,へ
  /  / ̄~ヽ ヽ.   | | フ  ヽ、 ノ √| |   ! レノ  |  !. \_  ー ̄_,ー~'  )
 / /| |   | |   | |( ノ| |`、) i ノ  | |   \_ノ  ノ /    フ ! (~~_,,,,/ノ/
 | |  | |   / /    | | .  し'  ノ ノ   | |       / /     | |   ̄
 \\ノ |  / /      | |___∠-".   | |      ノ /       ノ |  /(
  \_ノ_/ /     (____)     し'      ノ/      / /  | 〜-,,,__
     ∠-''~                        ノ/         (_ノ   〜ー、、__)

454 :デフォルトの名無しさん:2010/05/24(月) 00:49:23
構造体のメンバーの平均値を関数を用いて計算させるにはどのようにしたらよいですか


455 :デフォルトの名無しさん:2010/05/24(月) 00:50:14
>>451
なにこれcomウイルス?

456 :デフォルトの名無しさん:2010/05/24(月) 02:24:56
>>454
たとえばどんな構造体ですか?
struct a {
...
};
で定義してください。

457 :デフォルトの名無しさん:2010/05/24(月) 11:48:43
文字列を配列に入力させ、検索したい文字を入力することで、何文字目に
その文字があるかを求めるプログラムを作りたいんですがどうすればできますか?

458 :デフォルトの名無しさん:2010/05/24(月) 11:50:42
>>457 とりあえず自分で書いてみないとできないぜ。

459 :デフォルトの名無しさん:2010/05/24(月) 11:53:03
>>458
どうすればできるかサッパリわからなくて…

460 :デフォルトの名無しさん:2010/05/24(月) 11:55:33
向いてないからあきらめろ

461 :デフォルトの名無しさん:2010/05/24(月) 12:03:08
>>459 まずは文字列を配列に入力させるところだけからでもやってみろよ。

462 :デフォルトの名無しさん:2010/05/24(月) 13:43:31
>>457
strchr
strstr

463 :デフォルトの名無しさん:2010/05/24(月) 15:12:27
#include <stdio.h>
#include <string.h>
int main(int argc, char ** argv)
{
if (argc < 3) {
fprintf(stderr, "入力が不適切。使用法は割愛\n");
return 1;
}
char ch = argv[2][0];
char const * str = argv[1];
char const * rtn = strchr(str, ch);
if (rtn) {
printf("'%c'は\"%s\"の%d文字目\n", ch, str, rtn - str + 1);
return 0;
}
printf("'%c'は\"%s\"内に見つからない\n", ch, str);
return 0;
} // ちょっとリハビリの積もりで書いた。題意とちょっと違うが別に反省していない。

464 :デフォルトの名無しさん:2010/05/24(月) 17:02:46
1から8までの数字を使って毎回異なる数字の羅列を作るにはどのようにすれば作れますか?
例えば
1回目 13254678
2回目 45678123

見たいな感じです

465 :デフォルトの名無しさん:2010/05/24(月) 17:05:16
>>464
毎回乱数を使って入れ替え。
制約が緩ければ簡単だし、厳しければ難しくなるので、
制約条件をきっちり洗い出すことがなにより肝要。

466 :デフォルトの名無しさん:2010/05/24(月) 18:16:21
char s[] = "12345678";
for(int i = 0; i < sizeof(s); i++){
int x = rand()%sizeof(s);
char c = s[x];
s[x] = s[i];
s[i] = c;
}

467 :デフォルトの名無しさん:2010/05/24(月) 18:21:48
>>466
入れ替え回数を sizeof(s) とする根拠をば。

468 :デフォルトの名無しさん:2010/05/24(月) 18:30:59
sizeof(s)より小さければ偏るし(例えば1回なら最大二つしか動かない)、
sizeof(s)より大きければ無駄(同じ場所を1回以上交換しても混ざり方は変わらない)。

だからsizeof(s)

469 :デフォルトの名無しさん:2010/05/24(月) 18:33:49
意味のある乱数を作りたいんですが、どうやって作ればいいですか。
遺伝的アルゴリズムの本読んでも俺の頭ではちんぷんかんぷんだし。

470 :デフォルトの名無しさん:2010/05/24(月) 18:35:04
擬似乱数 - Wikipedia
http://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E4%B9%B1%E6%95%B0

471 :デフォルトの名無しさん:2010/05/24(月) 18:35:20
意味のある乱数は乱数ではない

472 :デフォルトの名無しさん:2010/05/24(月) 18:36:24
>>469
遺伝的アルゴリズムよりはカオス理論とかでググったほうが楽だと思う
単に環境に依存しない再現性のある乱数を作りたいならメルセンヌツイスターとか

473 :デフォルトの名無しさん:2010/05/24(月) 18:37:47
ジャンケンのプログラムなら乱数でいいかもしれんけど、将棋とか碁といった頭を使わないと勝てないような
プログラムでは普通の乱数では解決できないような気がします。俺なんか間違ったこといってますか?

474 :デフォルトの名無しさん:2010/05/24(月) 18:38:53
>>473
あなたのいう「乱数」の定義をしてください

475 :デフォルトの名無しさん:2010/05/24(月) 18:39:21
>>472
ほうほう〆(._.) ぐぐってみる

476 :デフォルトの名無しさん:2010/05/24(月) 18:39:45
乱数でも勝てるかもしれないけど、相当確率低いよ。

無限の猿定理 - Wikipedia
http://ja.wikipedia.org/wiki/%E7%84%A1%E9%99%90%E3%81%AE%E7%8C%BF%E5%AE%9A%E7%90%86

477 :デフォルトの名無しさん:2010/05/24(月) 18:42:35
物分かりが悪いな

478 :デフォルトの名無しさん:2010/05/24(月) 18:46:12
>>468
入れ替え回数を sizeof(s) とすれば、逆に二箇所一対しか交換していないような結果が出にくいのでは。
入れ替え回数を sizeof(s) にすれば一見ばらついているような結果が、たくさんでるだろうが、それはそれで、
「一見ばらついているような結果」しかでない、ある意味偏ったものになりませんか?
要するに、>>466 のアルゴリズムには理論的な根拠が乏しいかと。

479 :デフォルトの名無しさん:2010/05/24(月) 18:50:19
>>473
CPUの手を乱数で処理しようとしているのか。
ある程度の枝刈りを行った上で、候補となる手をいくつか導き、その中から意味のない乱数で選択するのはどうかね

480 :デフォルトの名無しさん:2010/05/24(月) 18:50:22
>>478
全ての箱に対して公平に全ての可能性を与えてるんだけど、それ以上偏りを無くすってどうするの?

481 :デフォルトの名無しさん:2010/05/24(月) 18:54:36
ああ、また難しい話になってきた・・・

482 :デフォルトの名無しさん:2010/05/24(月) 18:54:52
>>480
「すべての箱に公平な可能性」というのが、逆に偏りを生んでいるのでは?感覚的にいえば、ですが。
12345678 を並べ替えた結果がどれも 1/8! の確率で発生するように組む必要があると思うのです。

483 :デフォルトの名無しさん:2010/05/24(月) 18:55:16
>>478
いや、十分だよ。
入れ替え後、s[0]にはいる要素は
入れ替え前のs[0]〜s[sizeof(s)-1]のどれもがありえて、おのおのの確率は1/sizeof(s)となる。
逆に、増やしたり減らしたりすると、無駄どころか確率が変わってくるから逆にアウト

484 :デフォルトの名無しさん:2010/05/24(月) 18:56:12
>>482
成ってるじゃん。

485 :デフォルトの名無しさん:2010/05/24(月) 18:57:02
>>482
ちなみに、1/8!の確率にならない場合は、用いた乱数自体が偏ってる場合ね。

486 :デフォルトの名無しさん:2010/05/24(月) 18:58:55
>>482
これでもいいけど。

char s[] = "12345678";
for(int i = 0; i < sizeof(s); i++){
int x = rand()%(sizeof(s)-i)+i;
char c = s[x];
s[x] = s[i];
s[i] = c;
}


487 :デフォルトの名無しさん:2010/05/24(月) 19:00:35
簡単にするために 123 だけで考えてみる
組み合わせは
123
132
213
231
312
321
の6種のみ

>>466 だと全部で x の取り得る値は 3*3*3=27 通りの組み合わせになる
27通りというのは6で割り切れない
つまりいずれかの組み合わせは他よりも高くなってしまう

488 :デフォルトの名無しさん:2010/05/24(月) 19:01:44
ってあれ、よく見てなかったが、
int x = rand()%sizeof(s);

int x = rand()%i;
じゃないのか?

489 :デフォルトの名無しさん:2010/05/24(月) 19:10:56
将棋は東大将棋にまかせておけ
詰め将棋のソフトやってみたら?


490 :デフォルトの名無しさん:2010/05/24(月) 19:33:11
>>466
これって重複してしまう場合があるんじゃないの?

491 :デフォルトの名無しさん:2010/05/24(月) 19:36:36
>>487
>>488
>>490
もうね、馬鹿は黙ってて!

492 :デフォルトの名無しさん:2010/05/24(月) 19:57:20
>>487
組み合わせが「高くなる」ってどういう意味?

>>490
何が重複するの?

493 :デフォルトの名無しさん:2010/05/24(月) 19:59:02
>>491
必死だな(笑)

494 :デフォルトの名無しさん:2010/05/24(月) 19:59:50
>>492
必死だな(笑)

495 :デフォルトの名無しさん:2010/05/24(月) 20:01:04
>>493
馬鹿
>>494
馬鹿

496 :デフォルトの名無しさん:2010/05/24(月) 20:02:57
解決したのかな?

497 :デフォルトの名無しさん:2010/05/24(月) 20:04:42
元質出てくるまではスレ違いってことで一つ。

498 :デフォルトの名無しさん:2010/05/24(月) 20:12:19
>>492
xの出現順 結果
000 -> 312
001 -> 231
002 -> 213
010 -> 321
011 -> 132
012 -> 123
020 -> 231
021 -> 123
022 -> 132
100 -> 321
101 -> 132
102 -> 123
110 -> 312
111 -> 231
112 -> 213
120 -> 132
121 -> 213
122 -> 231
200 -> 132
201 -> 213
202 -> 231
210 -> 123
211 -> 312
212 -> 321
220 -> 213
221 -> 321
222 -> 312

ゆえに 132 213 231 は他に比べて出現確率が高くなる

499 :488:2010/05/24(月) 20:14:59
>>491
123の3要素の場合を考えてみるね。

int x = rand()%sizeof(s);
123 (4/27)
132 (5/27)
213 (5/27)
231 (5/27)
312 (4/27)
321 (4/27)

int x = rand()%i;
123 (1/6)
132 (1/6)
213 (1/6)
231 (1/6)
312 (1/6)
321 (1/6)

前者が偏ってないというのならそれでもいいけど、聞きかじったアルゴリズムはちゃんと検証しよう。
ちょっとした算数の知識でできるんだからさ。

500 :488:2010/05/24(月) 20:15:48
あらやだ、リロードしてなくてごめん。

501 :デフォルトの名無しさん:2010/05/24(月) 20:18:44
>>498
ゆえにと言われても。

円周率≒3.1415926535897932384626433832795
ゆえに、円周率を10進数で表すと0が現れない。

とか?

502 :デフォルトの名無しさん:2010/05/24(月) 20:20:48
>>501
総当りの結果に対してその反応ですか。
逆に、もっと試行回数を増やせばそのうちならされるのではないかという考え?

503 :デフォルトの名無しさん:2010/05/24(月) 20:21:35
>>501
ちょwwwあたまわるいwww

504 :デフォルトの名無しさん:2010/05/24(月) 20:21:42
ああ、そういうことね。
じゃあ、>>486で。

505 :デフォルトの名無しさん:2010/05/24(月) 20:23:21
>>501
総当りで統計をとって、偏りがあることが明白になり、また偏りのない手法もみつかっているのに、その反応ですか?

506 :デフォルトの名無しさん:2010/05/24(月) 20:26:21
バグ取りしただけで鬼の首を取ったように喜んでる奴

507 :デフォルトの名無しさん:2010/05/24(月) 20:29:22
というと>>503ぐらいか。
あとはバグに気付かず、指摘に対して馬鹿だアホだとわめいてるのが、、複数いたの?もしかして。

508 :デフォルトの名無しさん:2010/05/24(月) 20:30:54
ところで、

int x = rand()%i;

だと0除算が起こるんじゃないの?

509 :デフォルトの名無しさん:2010/05/24(月) 20:34:45
逃げたなww

510 :デフォルトの名無しさん:2010/05/24(月) 20:35:30
一般的なアルゴリズムでもコピペしろってことですね

511 :デフォルトの名無しさん:2010/05/24(月) 20:37:41
偏りに気付きにくいバグの方が困るといえば困るけど、まぁ、どっちもどっちだろこれ

512 :478≠498, 499:2010/05/24(月) 20:38:08
>>506
いや、これは雑感なんですが、デスマーチプロジェクトの終盤になると、バグをみつけた人間がやたらと偉くなって評価が高くなり、
多少のバグがあるにせよ、こつこつとロジックを積み上げてきた人間を踏み潰してしまうことが多々あるんですよ。
そういう実例を目の当たりにしているので >>506 にちょっと共感しています。

>>491, >>495
崩れてはいけません。

513 :デフォルトの名無しさん:2010/05/24(月) 20:41:46
マ板でやれ

514 :デフォルトの名無しさん:2010/05/24(月) 20:42:42
けんかすんなよまったく

515 :デフォルトの名無しさん:2010/05/24(月) 20:52:51
>>512
>>499は俺だけど、別にいいや。

516 :デフォルトの名無しさん:2010/05/24(月) 21:01:09
>>486をコビペしてやってみたらs[2]に0が入るんだけどなんで?

517 :デフォルトの名無しさん:2010/05/24(月) 21:16:54
>>515
すみません。ちょっと誤解をまねく書き方でしたね。私は >>499>>498 のようなしっかりした論拠をもっていない、ただの >>478 という意味でした。

518 :デフォルトの名無しさん:2010/05/24(月) 21:33:38
>>516
ああ、終端文字も入っちゃうね。
これで。

char s[] = "12345678";
for(int i = 0; i < sizeof(s)-1; i++){
int x = rand()%(sizeof(s)-1-i)+i;
char c = s[x];
s[x] = s[i];
s[i] = c;
}

519 :デフォルトの名無しさん:2010/05/24(月) 21:33:53
>>509
ばーーーか。

520 :デフォルトの名無しさん:2010/05/24(月) 21:59:25
>>512のレスが最大の収穫。

521 :デフォルトの名無しさん:2010/05/24(月) 22:35:04
俺は本番稼働前にバグ見つけて袋叩きにあったが。
俺のところがブラックなだけかな。

522 :デフォルトの名無しさん:2010/05/24(月) 22:39:32
それはテストを誰がやってるかによるな

523 :デフォルトの名無しさん:2010/05/24(月) 23:28:31
>>518
ありがとうございました

524 :デフォルトの名無しさん:2010/05/25(火) 00:08:56
普通はfor(i =0;i<unko;i++)なのに
for(i=0;<i> って書いてる人が居たんだ
何この表記

525 :デフォルトの名無しさん:2010/05/25(火) 00:10:33
バグ

526 :デフォルトの名無しさん:2010/05/25(火) 00:13:20
>>524
河童の顔文字

527 :デフォルトの名無しさん:2010/05/25(火) 00:14:08
>>524
manko

528 :デフォルトの名無しさん:2010/05/25(火) 01:02:50
座標における(x,y)がy>1、y<x-1にあるとき、真として1を出すプログラムって
どうするんですか?
printf("%d\n",1<y<x-1);でいいんですか?

529 :デフォルトの名無しさん:2010/05/25(火) 01:06:20
いいよ

530 :デフォルトの名無しさん:2010/05/25(火) 01:08:47
>>528
そのまんま (y > 1) && (y < x - 1) だろ。
そのコードだと (1 < y) < x - 1 になってしまう。

531 :デフォルトの名無しさん:2010/05/25(火) 01:18:35
答えてくれてありがとうございます&&使うんですねやっぱり・・
あのーもうひとつすいません。グラフ範囲はy>√2かつy<x-1でした。
√使うとコンパイルエラーでるんですが・・・

532 :デフォルトの名無しさん:2010/05/25(火) 01:19:45
正しく書けばエラーが出るはずがない

533 :デフォルトの名無しさん:2010/05/25(火) 01:20:34
>>531 http://ja.lmgtfy.com/?q=C+%E5%B9%B3%E6%96%B9%E6%A0%B9

534 :464:2010/05/25(火) 01:27:00
みなさんありがとうございます
今起きたら、たくさんレスがついててビックリしました
勉強になりました

535 :デフォルトの名無しさん:2010/05/25(火) 01:30:42
>>533
すげぇwwその機能ww
ありがとうw

まじで助かった。
√は使えないんだね。

536 :デフォルトの名無しさん:2010/05/25(火) 01:44:13
3桁の整数を桁ごとに切り出して他の変数に格納するにはどうすればいいですか?
int num=123;
から
int a[0]=1;
int a[1]=2;
int a[2]=3;
というような具合です

537 :デフォルトの名無しさん:2010/05/25(火) 01:45:34
>>536 / 10 % 10

538 :デフォルトの名無しさん:2010/05/25(火) 02:00:14
>>537
さんくす

539 :デフォルトの名無しさん:2010/05/25(火) 02:11:37
あぁくそ・・・また問題発生。コンパイルは成功だが・・
#include <stdio.h>
int main(void){
float x;
scanf("%e", &x);
printf("%d\n", x >= pow(3,1/2));
return 0;
}
これでxにpow(3,1/2)入れたら偽だった・・何故だ
>=ってあるから等しいときも含まれるので真だろ。何故だ・・・

540 :デフォルトの名無しさん:2010/05/25(火) 02:20:51
>>539
scanf() で式の解釈〜計算などはできない。あと、戻り値チェックしとけ。

541 :デフォルトの名無しさん:2010/05/25(火) 02:22:12
>539
1/2 -> 0 -> 0.
(int)/(int) -> (int) -> (double)

542 :デフォルトの名無しさん:2010/05/25(火) 02:34:34
それじゃ通じないでしょ。通じさせる気がないんだろうけど。

543 :デフォルトの名無しさん:2010/05/25(火) 02:38:19
王様、馬鹿には通じない文です

544 :デフォルトの名無しさん:2010/05/25(火) 02:47:50
1/2 が 0.5 だという誤解。 1/2 は 0 です。スレ見てないけど。

545 :デフォルトの名無しさん:2010/05/25(火) 02:54:57
>>540>>541さんレスありがとうございます。
しかし一体どういうことでしょうか?floatがまずいのかな?
どうしてもx≧√3において√3の場合真と出したいんだが。
あと戻り値チェックとはなんでしょう?

546 :デフォルトの名無しさん:2010/05/25(火) 02:57:50
まずいのは入門書も読んでないレベルの頭です

547 :544:2010/05/25(火) 02:58:41
まだ、1/2 が 0.5 だと思ってるのか、それが間違ってる。

548 :デフォルトの名無しさん:2010/05/25(火) 03:11:34
>>545
問題点
(1) float, doubleのような浮動小数同士の等値比較はできないと覚えておくこと。
  必ず誤差が発生するため。
  どうしてもやりたい場合は、差が0.01以下などの条件に置き換える。
  例: fabs(x - pow(3.0, 0.5)) <= 0.01
(2) scanf()での入力は、少数値で入れること。(例:1.7320508)
scanf()は数式を解析しない。

--ここから--
#include <stdio.h>
#include <math.h>
int main(void){
double x;
scanf("%lf", &x);
printf("%d\n", x >= pow(3.0,0.5));
return 0;
}
--ここまで--


549 :デフォルトの名無しさん:2010/05/25(火) 03:12:13
>>545
いったいキーボードから何を入力したのですか?

550 :デフォルトの名無しさん:2010/05/25(火) 03:13:51
>>543>>544>>546>>547レスありがとうございます。
そもそもxに代入するとき分数やpow自体代入できません。
scanfにおいてx,y二つ代入するとき、xにpowや分数を代入すると
yを代入できないまま終わります。これだと√3という境界を
含むように√3を代入できなければ困るのですが・・・・・
誰か分かりますか?

551 :デフォルトの名無しさん:2010/05/25(火) 03:16:43
>>539
pow(3, 1/2);
ではなくて、
pow(3, 0.5);
とか
pow(3, 1.0 / 2.0);
とかく。理由は入門書をみてくだしゃあ。


552 :デフォルトの名無しさん:2010/05/25(火) 03:18:11
>>550
では、キーボードからどういうふうに入力するのを想定しているのですか?

553 :544:2010/05/25(火) 03:19:40
>>540 後半はいいこと書いてるけど、前半はマクラ言葉だから意味は無い。視力0.5て書いとけ一応。
540 :デフォルトの名無しさん :2010/05/25(火) 02:20:51
>>539
scanf() で式の解釈〜計算などはできない。あと、戻り値チェックしとけ。

554 :デフォルトの名無しさん:2010/05/25(火) 03:48:59
2次元配列の2つの要素を交換していき
a[3][3]={ {2,3,7} , {4,6,1}, {5,8,0} }

a[3][3]={ {1,2,3} , {4,5,6} , {7,8,0} }
にソートするプログラムを作りたいのですがどのようにすれば作れますか?

具体的には、まず1と2を交換して、3と2を交換して、7と2を交換して・・・という方法です

555 :デフォルトの名無しさん:2010/05/25(火) 03:52:41
なんでわざわざ2次元か、1次元配列でいいのでは?

556 :554:2010/05/25(火) 03:54:05
>>555
そうですね・・・
1次元配列でもいいです

557 :デフォルトの名無しさん:2010/05/25(火) 03:57:41
二次元を一次元に並べなおしてから、また二次元に戻すで、いいにか?

558 :デフォルトの名無しさん:2010/05/25(火) 03:57:45
>>464
「手書きで、紙に鉛筆で書いて求めるなら、どうやってやるかなぁ?」 と考えたら、

たぶん最初に、使っていい数を
1、2、3、4、5、6、7、8
って書いて、

適当に一個選んで、その数字を消して
1、2、3、 、5、6、7、8

その消したところに、最後の数字を持ってきて
1、2、3、8、5、6、7

ってのを何度も繰り返して、だんだん短くしてって
1、6、7、8

最後まで全部使い切ったら終わり。と。
45231678


その手書きの時の考え方を、そのままプログラムにすればいいと思った。
http://codepad.org/sTJSPHtB


559 :デフォルトの名無しさん:2010/05/25(火) 03:59:34
>>557
2次元変換しなくても大丈夫です
1次元配列だけで

よろしくお願いします

560 :デフォルトの名無しさん:2010/05/25(火) 04:00:55
よろしく

561 :デフォルトの名無しさん:2010/05/25(火) 04:01:29
おねがい

562 :デフォルトの名無しさん:2010/05/25(火) 04:02:44
致します

563 :デフォルトの名無しさん:2010/05/25(火) 04:06:36
ので

564 :デフォルトの名無しさん:2010/05/25(火) 04:07:16
どうか

565 :デフォルトの名無しさん:2010/05/25(火) 04:08:54
ーーーーーーーーーーーーーーーーーーー
宿題は宿題スレで

566 :デフォルトの名無しさん:2010/05/25(火) 04:12:27
お願いします

567 :デフォルトの名無しさん:2010/05/25(火) 04:22:24
「キューソート」で検索 qsort

568 :デフォルトの名無しさん:2010/05/25(火) 04:25:41
0が最終的にあそこに収まるっていうところで、これは普通の代数学ではないのかもしれないよ

569 :デフォルトの名無しさん:2010/05/25(火) 04:29:52
>>568
>>540 だろ。
1.0/2.0 = 0.5
1/2 = 0 ... 1
1./2 ?
1/2. ?

570 :デフォルトの名無しさん:2010/05/25(火) 04:54:54
>>554
ただのソートじゃない?

571 :デフォルトの名無しさん:2010/05/25(火) 05:04:51
ちがうよ。>>554のソート後の話。

572 :デフォルトの名無しさん:2010/05/25(火) 05:21:24
>>554
確かに0が最後だとめんどくさい

573 :デフォルトの名無しさん:2010/05/25(火) 05:30:32
>>552
みなさんありがとうございます。そうですね
>>552それが真理ですね・・・√はプログラム上では
無限に少数位が続くから、√3の収束値求めるの無理ですよね。


574 :デフォルトの名無しさん:2010/05/25(火) 05:43:01
3の0乗計算してるって

575 :554:2010/05/25(火) 06:40:25
できました、みなさんありがとうございます
int nu[]={2,8,5,1,7,6,3};
int nu_tmp=0;
for(int i=0;i<8;i++){
if(nu[i]!=i+1){
nu_tmp=nu[i];
for(int j=0;j<8;j++){
if(nu[j]==i+1){
nu[j]=nu_tmp;

}
}
nu[i]=i+1;

}
}

576 :デフォルトの名無しさん:2010/05/25(火) 06:51:55
>>575
ループ回数とか、実行結果とか。
なんか、いろいろ怪しい感じがするけど、大丈夫か?

577 :デフォルトの名無しさん:2010/05/25(火) 07:02:12
>>576
汚いかもしれません・・・
でも、ちゃんと動いてるので

578 :デフォルトの名無しさん:2010/05/25(火) 07:24:07
>>577
気になる点。
(1)配列nu で定義されている要素は7個(nu[0]〜nu[6])だが、forループ内でnu[7]を参照してる。
  →nu[7](8個目)は未定義なので、定義した方がよくない?
(2)実行後、配列nuの要素を表示させてみると 1,2,3,4,5,6,7 が入っている。
  →定義済みの値(8)が消え、未定義の値(4)が入っている。※論理バグの可能性。


579 :デフォルトの名無しさん:2010/05/25(火) 07:27:56
>>578
int nu[]={2,8,5,1,7,6,3};
じゃなくて
int nu[]={2,8,5,1,7,6,3,4};
でした・・・
見てくれてありがとうございます

580 :デフォルトの名無しさん:2010/05/25(火) 11:47:55
自力でやる質問者は珍しい

581 :デフォルトの名無しさん:2010/05/25(火) 12:33:00
回答者側にまわるのも時間の問題。

582 :デフォルトの名無しさん:2010/05/25(火) 15:40:41
インデントテスト

main() {
printf("Hello Wold!!\n");
return 0;
}


583 :デフォルトの名無しさん:2010/05/25(火) 16:36:23
int main(void) {
  printf("Hello Wold!!\n");
}

584 :デフォルトの名無しさん:2010/05/25(火) 17:01:29
int f=0;

//board
int board_x1 = 70+ZAHYOU_2P_X*f;
int board_y1 = 100;
int board_x2 = board_x1+BLOCK_YOKO*7;
int board_y2 = board_y1+BLOCK_TATE*10;

for(f=0; f<2; f++){
//boardの表示
DrawBox(board_x1,board_y1,board_x2,board_y2,black,false);
}

forループの中で使用するboard_x1に加算されたfを反映させるにはどうしたらいいですか?
素直に DrawBox の中で board_x1+ZAHYOU_2P_X*f と書くしかないのでしょうか。



585 :デフォルトの名無しさん:2010/05/25(火) 17:01:45
>>581
同意してやる。

586 :デフォルトの名無しさん:2010/05/25(火) 18:02:38
forループの中で使用するboard_x1  に  加算されたf  を反映させる 
→加算されたfとは何に加算されたのか?

forループの中で使用する  board_x1に加算されたf  を反映させる
→反映させるとは何に反映させるのか?


587 :デフォルトの名無しさん:2010/05/25(火) 18:16:17
すいませんswitch文の中にswitch文書く方法教えてください。
簡単な例で教えてください。大きな枝分かれが3、そこから
枝分かれが5だと。全部で15通りですよね?
switch文で簡単なプログラムをかくとき
caseの数は15個なのか、8個で済むのかどうなんでしょうか?
簡単な例でお願いします

588 :デフォルトの名無しさん:2010/05/25(火) 18:18:24
>>587
15個だな。書くのは面倒だが。

589 :デフォルトの名無しさん:2010/05/25(火) 18:23:10
int a,b;
switch(a){
case 1:
switch(b){
case 1:break;
case 2:break;
case 3:break;
case 4:break;
default:break;
}break;
case 2:
switch(b){
case 1:break;
case 2:break;
case 3:break;
case 4:break;
default:break;
}break;
default:
switch(b){
case 1:break;
case 2:break;
case 3:break;
case 4:break;
default:break;
}break;
}

590 :デフォルトの名無しさん:2010/05/25(火) 18:28:12
関数ポインタの配列でやれば一行

591 :デフォルトの名無しさん:2010/05/25(火) 18:28:42
>>588
え??
8個じゃないんですか?
じゃぁ10×10×10のときは
caseを1000書くんですか??!?

592 :デフォルトの名無しさん:2010/05/25(火) 18:29:23
そうですよ

593 :デフォルトの名無しさん:2010/05/25(火) 18:31:00
全ての場合をかくならswitch多数使う意味なく、switch何て
1つで十分じゃないですか?

594 :デフォルトの名無しさん:2010/05/25(火) 18:32:01
>>591
caseは729個でいいよ。

595 :デフォルトの名無しさん:2010/05/25(火) 18:34:49
>>593
条件を一つのまとめられて、かつ、swtchを使いたいなら、それでいいんじゃないの

596 :デフォルトの名無しさん:2010/05/25(火) 18:35:09
>>586
fが0と1の時とで1p側と2p側をそれぞれ描画させるため、f=0に1を足す感じです。

それでforループの中のfが0から1になったら board_x1 = 70+ZAHYOU_2P_X*f; を更新させたいんですが・・・。

597 :デフォルトの名無しさん:2010/05/25(火) 18:35:47
>>593
お前みたいのはbreak書き忘れそうだからif文だけ使え

598 :デフォルトの名無しさん:2010/05/25(火) 18:43:59
>>596
こうだろうね。

//board
int board_y1 = 100;
int board_x2 = board_x1+BLOCK_YOKO*7;
int board_y2 = board_y1+BLOCK_TATE*10;

for(int f=0; f<2; f++){
//boardの表示
int board_x1 = 70+ZAHYOU_2P_X*f;
DrawBox(board_x1,board_y1,board_x2,board_y2,black,false);
}

599 :デフォルトの名無しさん:2010/05/25(火) 18:57:05
>>598

ありがとうございました。
forの中で更新すればいいんですね。

int board_x1 = 70+ZAHYOU_2P_X*f;
int board_y1 = 100;
int board_x2 = board_x1+BLOCK_YOKO*7;
int board_y2 = board_y1+BLOCK_TATE*10;

for(f=0; f<2; f++){
board_x1 +=ZAHYOU_2P_X*f;
board_x2 +=ZAHYOU_2P_X*f; //これがないと何故かboard_x2が更新されない
//hako
DrawBox(board_x1,board_y1,board_x2,board_y2,Color,false);
}

これでなんとかボードの座標を書きこむ場所を一箇所にまとめられそうです。

600 :デフォルトの名無しさん:2010/05/25(火) 19:00:48
>>597
かす

601 :デフォルトの名無しさん:2010/05/25(火) 19:50:57
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10617.c

ランダムな英字のテキストファイルを読み込み、その中の「a」だけをすべて削除して新しいテキストファイルに出力するプログラムが作りたいです。
作ってみたら、コンパイルは通るのですが実行ができません。
助けてください。

602 :デフォルトの名無しさん:2010/05/25(火) 19:59:44
演算子の優先順位

603 :デフォルトの名無しさん:2010/05/25(火) 20:02:52
おもしろそうなプログラム〜

604 :デフォルトの名無しさん:2010/05/25(火) 20:05:58
>>601
NULL アドレスとその周辺に書き込みしてるから

605 :デフォルトの名無しさん:2010/05/25(火) 20:09:24
>>601
別途 int i; を定義して

while(EOF!=(i=fgetc(fp))) {
  if('a'!=i)
    fputc(i,fout);
}

とかの方がよくないかひ?

606 :デフォルトの名無しさん:2010/05/25(火) 20:10:34
>>601
Windows ならダブルクリックで OK.
*BSD や犬糞なら
$ ./a.out
で OK.

607 :デフォルトの名無しさん:2010/05/25(火) 20:14:06
>char *ch = "a" ;
char ch[] = "a" ;とかchar ch = 'a' ;にした方がいいんじゃないかと

608 :「水田です」:2010/05/25(火) 20:15:13
>>601
while(fgets(str,256,fp) != NULL){;
  char *f = strstr(str, ch);
  if( f != NULL )
    *f='\0';
  fprintf(fout, "%s", str);
  if( f != NULL )
    fputs(++f, fout);
}

609 :デフォルトの名無しさん:2010/05/25(火) 20:40:03
switchの中にswitch使うのが上手くいかないんですが・・・
ringo mikanで個数で値段出すというプログラムどうします?
switch複数使ってどうやりますか?個数は1〜3、値段はどちらも
一個一円ということで。

610 :デフォルトの名無しさん:2010/05/25(火) 20:47:47
小学校出直してきてからプログラミングはじめよう、な?

611 :デフォルトの名無しさん:2010/05/25(火) 20:50:22
>>607
なぜ?

612 :デフォルトの名無しさん:2010/05/25(火) 20:55:21
>>609
int 値段;
int みかんの個数, みかんの値段;
int りんごの個数, りんごの値段;

値段 = みかんの個数*みかんの値段+りんごの個数*りんごの値段;

613 :デフォルトの名無しさん:2010/05/25(火) 21:00:45
>>609
int calc(int ringo, int mikan){
switch(ringo){
case 1: switch(mikan){ case 1: return 2; case 2: return 3; case 3: return 4; }
case 2: switch(mikan){ case 1: return 3; case 2: return 4; case 3: return 5; }
case 3: switch(mikan){ case 1: return 4; case 2: return 5; case 3: return 6; }
}
}

>>612
よく見ろよ。switchの中でswitchを使いたいって言ってるだろ。
switch使わない回答はNGだぜ

614 :デフォルトの名無しさん:2010/05/25(火) 21:00:57
int ringo,mikan,nedan;
switch(ringo){
case 1:
switch(mikan){
case 1:nedan = 2; break;
case 2:nedan = 3; break;
case 3:nedan = 4; break;
default:nedan = -1;break;
}break;
case 2:
switch(mikan){
case 1:nedan = 3; break;
case 2:nedan = 4; break;
case 3:nedan = 5; break;
default:nedan = -1;break;
}break;
case 3:
switch(mikan){
case 1:nedan = 4; break;
case 2:nedan = 5; break;
case 3:nedan = 6; break;
default:nedan = -1;break;
}break;
default:nedan = -1;break;
}

615 :デフォルトの名無しさん:2010/05/25(火) 21:06:03
switch(mikan)
{
default:
switch(ringo)
{
default: nedan = mikan_nedan * mikan + ringo_nedan * ringo;
}
}


616 :デフォルトの名無しさん:2010/05/25(火) 21:07:41
リンゴはchaでA,ミカンはcharでOとします。リンゴ2円 ミカン1円で。
#include<stdio.h>
int main(void){
char x; int n;
switch(x){
x = case 'A' : printf("switch(n){
case 1 : printf("%d\n",2*1);break;
case 2 : printf("%d\n",2*2);break;
case 3 : printf("%d\n",2*3);break;
{");}
長すぎますので書けないのでミカン略。
複雑すぎる。でもこれがしたい。お願いします誰か。

617 :デフォルトの名無しさん:2010/05/25(火) 21:09:19
>>611
初期化してないポインタにデータ直接突っ込むのはどうかなと

618 :デフォルトの名無しさん:2010/05/25(火) 21:11:34
>>617
それは冗談で言っているんだよな

619 :デフォルトの名無しさん:2010/05/25(火) 21:14:47
冗談ではなくマジメに言ってます。
しかもボクプロのプログラマーです。

620 :デフォルトの名無しさん:2010/05/25(火) 21:16:39
>>619
君はいつもの中学生だよね?

621 :デフォルトの名無しさん:2010/05/25(火) 21:20:32
>>616
簡単に書けるプログラムをわざわざ複雑にする理由はなんなの?

622 :デフォルトの名無しさん:2010/05/25(火) 21:21:53
#include <math.h>
int main(void){
double x;
x = (%.20f=M_PI);
printf("%f + %f = %f", x, 1, x + 1);
} これ実行できません・・・
%.20fってのはprintfの中でしかできないんですか?
x = printfとはできないんで、こうするしかないのですが・・・

623 :デフォルトの名無しさん:2010/05/25(火) 21:24:13
何がやりたいのお前

624 :デフォルトの名無しさん:2010/05/25(火) 21:24:20
釣られないぞ

625 :デフォルトの名無しさん:2010/05/25(火) 21:25:10
>>618
>>619は違う人だけど、
char* ch = "a";ってのはchに"a"を入れるってことで、
char ch[] = "a";ってのはchに配列を確保して"a"をいれるってことだと思ったんだ
それとも、同じなのか?

626 :デフォルトの名無しさん:2010/05/25(火) 21:26:06
>>621
いや、構文を理解しないといけないから方法を凝るとかどうでもいい。
使い方を知りたいだけ。簡単にかけようがどうでもいい。

627 :デフォルトの名無しさん:2010/05/25(火) 21:27:31
ポインタと配列の違いが分かってない。
一通り入門書読み終わってから独自のことやろうとしろよ。

628 :デフォルトの名無しさん:2010/05/25(火) 21:28:31
>>625
char *ch = ...;

char *ch;
*ch = ...;
は全く別物

629 :デフォルトの名無しさん:2010/05/25(火) 21:28:36
>>627
すいません
気をつけます(´・ω・`)

630 :デフォルトの名無しさん:2010/05/25(火) 21:29:29
とりあえずπの少数20ケタまでをprintf使わず
変数xとして代入したい。どうしたらいいんですか?


631 :601:2010/05/25(火) 21:31:41
みなさんありがとうございます
なんとか実行できるようにはなりました
しかしどうやら同じ行にaがたくさん入っていると最初のaしか削除されないみたいです
>>608もそうでした
どうやってすべてのaを検索し、削除したらいいのでしょうか

632 :デフォルトの名無しさん:2010/05/25(火) 21:33:37
>>628
char *ch = "a";とchar ch[] = "a";は同じってことでいいのか

633 :デフォルトの名無しさん:2010/05/25(火) 21:35:13
>>630
double でも15桁の精度しかないぞ

10桁の場合なら
x-=fmod(x, 1e-10);

634 :デフォルトの名無しさん:2010/05/25(火) 21:35:54
>>632
違うよ

635 :デフォルトの名無しさん:2010/05/25(火) 21:41:01
>>634
じゃあなんでchar *ch = "a";がおかしくないって言えるのさ

636 :デフォルトの名無しさん:2010/05/25(火) 21:42:17
>>635
秘密だよ

637 :デフォルトの名無しさん:2010/05/25(火) 21:43:58
>>633
floatで15ケタならどうしたらいいですか?
何故intの場合
a = 1とかできるのに
floatは
a = (%.15f=M_PI)とできないのですか?
このaを自由に使いたいのに・・・
a = printfとはできないですからね。

638 :デフォルトの名無しさん:2010/05/25(火) 21:45:51
>>636
まあいいや、どっちでも
今までたまたま動いてきたんだろうが

639 :デフォルトの名無しさん:2010/05/25(火) 21:46:34
>>637
もしかして文字列と整数型の区別できてないんじゃない

640 :デフォルトの名無しさん:2010/05/25(火) 21:47:08
>>631
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
  system("echo babab > file.txt");

  FILE* fp_read = NULL;
  if((fp_read = fopen("file.txt", "r")) == NULL){
    printf("error!!\n");
    exit(1);
  }
  FILE* fp_write = NULL;
  if((fp_write = fopen("afterfile.txt", "w")) == NULL){
    printf("error!!\n");
    exit(1);
  }

  int c;
  while((c = fgetc(fp_read)) != EOF){
    if(c != 'a'){
      printf("%c", c);
      fputc(c, fp_write);
    }
  }
  fclose(fp_read);fclose(fp_write);

  system("cat afterfile.txt");
  return 0;
}

641 :デフォルトの名無しさん:2010/05/25(火) 21:49:23
>>639
できてますよ。
intは整数でしょう
floatは実数でしょう。
このままじゃ・・・
float15ケタどうしますか?


642 :デフォルトの名無しさん:2010/05/25(火) 21:51:32
>>637
float の精度は7桁

a=M_PI;
にしたくない理由は何?

643 :デフォルトの名無しさん:2010/05/25(火) 21:53:42
>>642
それは言いたくないです・・

とりあえず桁を設定したいんです。


644 :デフォルトの名無しさん:2010/05/25(火) 21:54:28
制度は7ケタ程度でいいです。
お願いします。

645 :デフォルトの名無しさん:2010/05/25(火) 21:56:52
>>638
> char *ch = "a";とchar ch[] = "a";は同じってことでいいのか
ちがう、が、両方とも思ったように動く。たまたまではない。

646 :デフォルトの名無しさん:2010/05/25(火) 21:58:07
>>638
char *strstr(const char *s1,const char *s2);
constで引数とってるからだと思うよ

647 :デフォルトの名無しさん:2010/05/25(火) 22:04:06
流れと関係ないけど関数でreturn "";って大丈夫だっけ?

648 :デフォルトの名無しさん:2010/05/25(火) 22:05:22
>>647
戻った先で読むだけで書き換えしなきゃ大丈夫

649 :デフォルトの名無しさん:2010/05/25(火) 22:06:17
>>645
たまたまだよ

>>646
そのconstはstrstrの中で引数はいじられませんよ、ってだけでは

650 :デフォルトの名無しさん:2010/05/25(火) 22:13:46
(1) >>601>>607にしたらコンパイルできない。

(2) >>625について、
char* ch = "a"; は、ポインターchを文字列定数へのポインターで初期化する。(文字列のコピーは発生しない)
char* ch[] = "a"; は、配列chを文字列"a"で初期化する。(文字列のコピーが発生する)


651 :デフォルトの名無しさん:2010/05/25(火) 22:17:13
>>632
char *p = "aaaa";
どこかにある"aaaa"というデータの先頭のアドレスをpに入れる
書き換えはよろしくないので
char const *p = "aaaa";
にするべきだがコンパイラはこのことについてはなにも言ってくれない
char a[] = "bbbb";
aの配列を適切な大きさにとってそこに"bbbb"を書き込む
aを書き換えてももとの"bbbb"には影響しない

652 :デフォルトの名無しさん:2010/05/25(火) 22:17:44
>650
>char* ch[] = "a"; は、配列chを文字列"a"で初期化する。(文字列のコピーが発生する)
char ch[](ryの間違えかな

>1-651
char ch[1] = "a";の場合はどうなるんですか

653 :デフォルトの名無しさん:2010/05/25(火) 22:20:50
rand()で得られた値をバッファを使わずに逆順に出力する方法ありますか?
rand()が11 22 33 44って返してきたら 44 33 22 11と出力する感じで

654 :デフォルトの名無しさん:2010/05/25(火) 22:20:57
文字列として小数を保存しておいてascii文字のまま一桁ずつ計算する処理を書けば何桁でもいけるね俺様天才

655 :デフォルトの名無しさん:2010/05/25(火) 22:21:03
>>650
>char* ch[]
これじゃコンパイラ通らんわな

656 :デフォルトの名無しさん:2010/05/25(火) 22:28:58
>>652
>char ch[](ryの間違えかな

そうだね。


657 :デフォルトの名無しさん:2010/05/25(火) 22:31:11
>>653
何のために?

658 :デフォルトの名無しさん:2010/05/25(火) 22:31:52
>>651
"aaaa"がまず取られるってことか、納得
書き込みしなきゃどっちで書いてもいいか

659 :デフォルトの名無しさん:2010/05/25(火) 22:31:55
>>650の訂正

(2) >>625について、
char* ch = "a"; は、ポインターchを文字列定数へのポインターで初期化する。(文字列のコピーは発生しない)
char ch[] = "a"; は、配列chを文字列"a"で初期化する。(文字列のコピーが発生する)

660 :デフォルトの名無しさん:2010/05/25(火) 22:33:29
>>653
一旦どこかに保存する必要がある
あなたの想定している 「バッファ」 以外に保存すればできる

661 :デフォルトの名無しさん:2010/05/25(火) 22:38:28
>>642
とりあえず精度7ケタのfloatで表す方法ないですかねぇ?

662 :デフォルトの名無しさん:2010/05/25(火) 22:39:07
>>652
> char ch[1] = "a";の場合はどうなるんですか

配列に収まらないのでコンパイルエラー

663 :デフォルトの名無しさん:2010/05/25(火) 22:40:19
>>657
得られる値の総数が不明なので予めバッファを確保しておけないのです

>>660
「バッファ」 以外ってなんです?

664 :デフォルトの名無しさん:2010/05/25(火) 22:40:41
>>653
void func(unsigned n) { unsigned r = rand(); if(n != 0) func(n - 1); else return; printf("%lu ", r); }
無理ですた

665 :デフォルトの名無しさん:2010/05/25(火) 22:42:56
動的にバッファを確保したらだめなの

666 :デフォルトの名無しさん:2010/05/25(火) 22:44:16
>>665
終りの合図が来るまで総数が不明だからいくつバッファを確保したらいいかわかりません。

667 :デフォルトの名無しさん:2010/05/25(火) 22:46:59
乱数に順序などあってないようなものなので前から順に出力しても別にかまいませんよ

668 :デフォルトの名無しさん:2010/05/25(火) 22:48:30
b = M_PI
a = (%.7e=b)

はだめなのですか?マジレス希望。

669 :デフォルトの名無しさん:2010/05/25(火) 22:48:42
>>667
乱数というのは例えばなんで実際は意味のあるデータのリストなんです。
正順からしかアクセスできない長さ不明のリストを逆順に処理したいんです。

670 :デフォルトの名無しさん:2010/05/25(火) 22:50:00
rand呼ぶたびに動的にバッファを確保してスタックにpushして終わりの合図が来たら全部pushすれば
いいだけだと思うんだが。まだ知らされてない設定があるのかな。

671 :デフォルトの名無しさん:2010/05/25(火) 22:51:21
>>670
いやいや!バッファを使わないのが最初の設定なんで!

672 :デフォルトの名無しさん:2010/05/25(火) 22:52:00
>>668
他言語に移行しろ

673 :デフォルトの名無しさん:2010/05/25(火) 22:52:05
>>669
リンクドリストツカウイイデス

674 :デフォルトの名無しさん:2010/05/25(火) 22:54:10
>>662
わざわざ確かめちゃったよ
char ch[] = "aaaa";
ch[1] = 'b';
なら、chは"abaa"
char* ch = "aaaa";
ch[1] = 'b';
だと、強制終了
char ch[]ならRAMに割り付けられて、
char* chだとどこに割り付けられてんのか分かんないってことで
脳味噌にQAC掛けた方がいい奴がいるな

675 :デフォルトの名無しさん:2010/05/25(火) 22:54:20
>>672
ちょww
それはまじで簡便、C言語使わないとだめなんで。
趣味でやってるわけじゃないんで。
誰か〜・・・

676 :デフォルトの名無しさん:2010/05/25(火) 22:55:11
>662
試してみましたか
規格書は読みましたか

677 :デフォルトの名無しさん:2010/05/25(火) 22:55:54
>>669
標準関数使わないで、自作していいなら、それぞれ正順、逆順に
乱数を計算するルーチンを作ればいいだけだけどな。

678 :デフォルトの名無しさん:2010/05/25(火) 22:57:55
>>675
無理つってんだろカス



679 :デフォルトの名無しさん:2010/05/25(火) 23:00:48
>>678
じゃぁ宿題できねぇ・・・

複雑な計算できないじゃん。

680 :デフォルトの名無しさん:2010/05/25(火) 23:02:04
>>677
乱数はどうでもいいんです!
「正順からしかアクセスできない長さ不明のリストをバッファを使わずに逆順に処理する」
このアルゴリズムがあったら知りたいんです!

681 :デフォルトの名無しさん:2010/05/25(火) 23:05:53
floatの存在意義がわからん。
doubleという高精度実数型があるしそっち使ったほうがよくね?

682 :デフォルトの名無しさん:2010/05/25(火) 23:06:21
長さ不明の時点でバッファを使わない処理は俺には無理

683 :デフォルトの名無しさん:2010/05/25(火) 23:08:11
>>682
長さ不明でもリストを辿っていくとちゃんと終りが来るんです。安心してください!

684 :デフォルトの名無しさん:2010/05/25(火) 23:12:12
>>683
リストの終わりまでまず空読みして、サイズを求めることだな

685 :デフォルトの名無しさん:2010/05/25(火) 23:13:58
リストの末尾を表示してpopを繰り返せばいいだろカス

686 :デフォルトの名無しさん:2010/05/25(火) 23:13:59
>>684
それじゃ結局バッファ必要じゃないですか!スカポンタン!

687 :デフォルトの名無しさん:2010/05/25(火) 23:14:01
そもそもバッファって何を示してるの?
配列に代入するまでのテンポラリーのことを指してるのか
配列自体のことを指しているのか

688 :デフォルトの名無しさん:2010/05/25(火) 23:15:42
>>685
勝手にリスト削除したら管理者に怒られるでしょが!

689 :デフォルトの名無しさん:2010/05/25(火) 23:16:25
ひどい質問が増えたな

690 :デフォルトの名無しさん:2010/05/25(火) 23:16:34
このプログラムで目的を達せられないの?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct list{
  int num;
  struct list* prev;
}list;

int main(void){
  int nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

  srand((unsigned) time(NULL));
  int owari_no_aizu = rand() % 10;

  list* p = NULL;
  for(int i=0; i<owari_no_aizu; i++){
    list* p_tmp = (list*)malloc(sizeof(list));
    p_tmp->prev = p;
    p_tmp->num = nums[i];
    p = p_tmp;
  }

  while(p!=NULL){
    printf("%d,", p->num);
    list* p_tmp = p;
    p = p->prev;
    free(p_tmp);
  }
  return 0;
}

691 :デフォルトの名無しさん:2010/05/25(火) 23:17:24
バッファバッファうるせえ奴だな

692 :デフォルトの名無しさん:2010/05/25(火) 23:22:46
>>690
それ思い切りバッファ使ってるじゃないですか!別の領域作ってデータ保存してるし!
再帰とかでうまいことできないんですか。

int nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1};

void test( index )
{
  if( nums[ index ] == -1 )
  {
    return;
  }
  test( index + 1 );
  printf( "%d ", nums[ index ] );
}
こんな感じで。
できれば再帰じゃなくてループでうまいこと出来ませんか!

693 :デフォルトの名無しさん:2010/05/25(火) 23:24:23
動的確保しちゃいけない理由が分からん

694 :デフォルトの名無しさん:2010/05/25(火) 23:24:23
numsはバッファじゃねーのかよカス

695 :デフォルトの名無しさん:2010/05/25(火) 23:24:53
バッファなんて規格にない言葉使うなよ

696 :デフォルトの名無しさん:2010/05/25(火) 23:25:01
>>686
だから、空読みだよ
int i = 0;
while(list[i++] != END_OF_LIST);
とか
で、iだかi-1がサイズだからその後に
1番上と1番下をswap
2ry
ってやれば、バッファはlistの要素1個分の変数で済むわけだ

697 :デフォルトの名無しさん:2010/05/25(火) 23:26:08
>>663
> 得られる値の総数が不明なので予めバッファを確保しておけないのです

何のために逆順にするの?

698 :デフォルトの名無しさん:2010/05/25(火) 23:26:28
>>693
環境がミニマムだったり規約でヒープ禁止だったりするじゃないですか!

699 :デフォルトの名無しさん:2010/05/25(火) 23:28:22
>>697
ツリー構造で葉から根に向かって処理するときとかですよ!
ツリー構造ってアクセスは根>葉の順番でしかアクセス出来ないでしょ!

700 :デフォルトの名無しさん:2010/05/25(火) 23:29:27
お前らいい加減釣られてることに気がつけよ

701 :デフォルトの名無しさん:2010/05/25(火) 23:29:45
>>696
いいですね!でもリストの値書き換えるの禁止でした!すいません!

702 :デフォルトの名無しさん:2010/05/25(火) 23:30:49
>>674
なんか全然無関係の事してるんだがそれ。
> char ch[1] = "a"
がどこにも出てきてないぞ。

>>676
試してない。codepadでやってみたらエラーにならないね。
とりあえず手元にK&RしかないんだがP.273より
> 配列が固定したサイズをもつ場合には、初期値式の数はその配列のメンバーの数を越えてはならない。

703 :デフォルトの名無しさん:2010/05/25(火) 23:31:42
>>701
だったら写し先に逆順で入れてきゃいいだろ
サイズわかったんだから

704 :デフォルトの名無しさん:2010/05/25(火) 23:38:07
これでいいのかな。まだ知らされてない設定があるのかな。
int main(void)
{
  int nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

  // owari no aizu
  srand((unsigned) time(NULL));
  int owari_no_aizu = rand() % 10;

  int counter = 0;
  int i;
  for(i=0; i<owari_no_aizu; i++){
    counter++;
  }

  while(counter > 0){
    printf("%d,", nums[counter]);
    counter--;
  }

  return 0;
}

705 :デフォルトの名無しさん:2010/05/25(火) 23:38:17
こういうことです!
int Rand()
{
  const int nums[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1}; // -1が終りの合図
  static int index = 0;
  return nums[ index ++ ];
}

Rand()で得られる0, 1, 2, 3, 4, 5, 6, 7, 8, 9を
9 8 7 6 5 4 3 2 1 0と表示したいんです。
もちろんnumsの中身はユーザーはわかりません
配列を確保したりnewとかmallocは禁止です!

706 :デフォルトの名無しさん:2010/05/25(火) 23:39:28
>>704
リストに逆順にアクセスしてるやないか!
正順でしかアクセス出来ないと言っとるだろ!

707 :デフォルトの名無しさん:2010/05/25(火) 23:40:28
>>702
"a"は'a'と'\0'だから、問題ないんじゃない?

708 :デフォルトの名無しさん:2010/05/25(火) 23:43:12
>>705
>>664

709 :デフォルトの名無しさん:2010/05/25(火) 23:45:25
typedef struct list{
  int num;
  struct list* next;
}list;
な片方向リンクドリストだとして、先頭を

void func(list* dec){
  if(!dec)return;
  func(dec->next);
  printf("%d,", dec->num);
}
に渡すってのでどうなんだ。リストが長いとそのうちコケるが。

まぁリンクドリストじゃなくて配列でも同じ事できるよな。

710 :デフォルトの名無しさん:2010/05/25(火) 23:47:53
>>673
ドw

711 :デフォルトの名無しさん:2010/05/25(火) 23:48:31
const int nums[]の開始アドレスを取得できないかな

712 :デフォルトの名無しさん:2010/05/25(火) 23:48:48
>>708
>>709
ありがとうございます!

でも再帰の方法は>>692で出しました!
スタックが心配なんでループでうまいこと出来ませんか!?

713 :デフォルトの名無しさん:2010/05/25(火) 23:48:56
nums

714 :デフォルトの名無しさん:2010/05/25(火) 23:49:14
>>679
よく分からんが、精度の高い円周率がほしいということでいいの?
なら計算すればよくね?

715 :デフォルトの名無しさん:2010/05/25(火) 23:50:35
>>707
明白に越えさせてもエラーにならない。
http://codepad.org/Kmcja5MM


716 :デフォルトの名無しさん:2010/05/25(火) 23:50:36
>>705
int Rand()
{
  const int nums[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1}; // -1が終りの合図

  static int searched_size;
  static int search_size_flg = 0;
  int i = 0;

  if(search_size_flg == 0){
    while(nums[i++] != -1);
    searched_size = i - 2; //ぁゃιぃ
    search_size_flg = 1;
  }

  if(searched_size >= 0) return nums[searched_size--];
  else return -1;
}

717 :デフォルトの名無しさん:2010/05/25(火) 23:55:25
>>716
きっさまあああああああああああああ!!!

718 :デフォルトの名無しさん:2010/05/25(火) 23:56:34
まぁ、ガチスレじゃないからどうでもいいけど
>702
ISO/IEC 9899:1999 (E)
6.7.8 Initialization
Semantics
32 EXAMPLE 8 The declaration
char s[] = "abc", t[3] = "abc";
defines ``plain'' char array objects s and t whose elements are initialized with character string literals.
This declaration is identical to
char s[] = { 'a', 'b', 'c', '\0' },
t[] = { 'a', 'b', 'c' };
細かいことだけど、誰も規格書を読んでないという悲しさ

以後、精進せよ

719 :デフォルトの名無しさん:2010/05/25(火) 23:58:38
>>699
ツリー構造の探索は再帰を使ってる?
それならスタック遡るだけでいいよね。(この場合スタックがバッファーなんだろうけど。)

720 :デフォルトの名無しさん:2010/05/26(水) 00:00:49
>>718
>>702のレスはコンパイルエラーになるかどうかが焦点なんじゃないの?
規格で禁止されていることは認識しているようだし。

実際試すとコンパイルエラーにはならないよ(gcc)。
-Werrorつけたら別だけど、そういう話でもないよね。

721 :デフォルトの名無しさん:2010/05/26(水) 00:00:49
>>718
t[4] = "abc";ならt[] = { 'a', 'b', 'c', '\0' };ってことでおkじゃないの?

722 :デフォルトの名無しさん:2010/05/26(水) 00:03:08
それだと溢れた分は切り捨てろといってるように見えるが、どうなの?

723 :デフォルトの名無しさん:2010/05/26(水) 00:03:10
>>681
精度はいらないけどメモリ節約したい場合なんかに使う
数個しか使わないならメモリとか関係ないけど

724 :デフォルトの名無しさん:2010/05/26(水) 00:05:05
>>722
溢れさせなきゃいいのさ
ただしお勧めはできない

725 :デフォルトの名無しさん:2010/05/26(水) 00:05:18
>715
さすがにそれはおかしい
>702が言っているように初期化子リストの要素数は配列の要素数を超えてはいけないのが原則であるが、>718の場合('\000'がはみ出ている)のみ許される訳でそれ以外は許していない
規格引用しろとか言わないでね

gccなら-pedantic-errors付ければ分かるよ

726 :デフォルトの名無しさん:2010/05/26(水) 00:13:33
あー、ナルがはみ出た場合のみ許可されてるんだ。なるほどなるほど。

727 :デフォルトの名無しさん:2010/05/26(水) 00:14:49
けど、それなら>>718はなぜこの場面でそこを引用したのかが分からなくなるな。

728 :デフォルトの名無しさん:2010/05/26(水) 00:19:54
規格を読んでいるつもりだが理解できていないがゆえに適切な引用ができなかったんだなぁ。
精進せよw

729 :デフォルトの名無しさん:2010/05/26(水) 00:21:26
マイコンのレジスタ名の定義で

union {
unsigned char BYTE;
struct {
unsigned char NOV :3;
unsigned char STR4:1;
unsigned char STR3:1;
unsigned char STR2:1;
unsigned char STR1:1;
unsigned char STR0:1;
} BIT;
} TSTR;
としたりしますが、これについて解説お願いします。
メモリにはバイトの領域が確保されますか?

730 :デフォルトの名無しさん:2010/05/26(水) 00:22:56
>>712
再帰で書いてみた、メモリーを使わないで記憶は出来ないという法則。
#include <stdio.h>
int Rand(int *a){
  int b;
  if(*a != -1){
    b = Rand(&a[1]);
    printf("%d ", b);
  }
  return a[0];
}
int main(void){
  int a[]={1,2,3,4,5,-1};
  int b;
  b = Rand(a);
  printf("%d ", b);
}

731 :デフォルトの名無しさん:2010/05/26(水) 00:24:25
>>729
BYTE 8ビット
BIT.NOV 3ビット STR4-0 各1ビット

が同じレジスタ

732 :デフォルトの名無しさん:2010/05/26(水) 00:25:57
いつも思うんだけどビットフィールド使うよりマクロか関数でビット操作した方がわかりやすいしよくねぇか?
ビットフィールドにする利点なんて存在するの?

733 :デフォルトの名無しさん:2010/05/26(水) 00:26:15
ttp://www.comm.info.eng.osaka-cu.ac.jp/~sugi/C_lang2/C2.html#anchor54216
ここの問題2−3かと思ったけど、計算がどうの書いてるから違うか


734 :デフォルトの名無しさん:2010/05/26(水) 00:26:47
>>732
型安全

735 :デフォルトの名無しさん:2010/05/26(水) 00:33:52
>>731
なるほど。わかりました。
変数名のよこの:はなんでしょうか

736 :デフォルトの名無しさん:2010/05/26(水) 00:35:29
ビット数だろ?

737 :デフォルトの名無しさん:2010/05/26(水) 00:39:49
unsigned charとしておきながら実体は3bitだったり1bitだということですか?

738 :デフォルトの名無しさん:2010/05/26(水) 00:41:02
>>735
ビットフィールド

739 :デフォルトの名無しさん:2010/05/26(水) 00:46:16
>>734
だめじゃん
通信とかの規格絡みの構造体作るときに、怠けられること
まあマクロでいいかな

740 :デフォルトの名無しさん:2010/05/26(水) 00:56:12
「コンパイラよりもオレの方がうまく出来る」って奴はマクロ使えばいいと思うよ^^

741 :デフォルトの名無しさん:2010/05/26(水) 00:57:12
いやアセンブリだろ情熱的に考えて

742 :デフォルトの名無しさん:2010/05/26(水) 01:00:07
>>740
コンパイラよりうまく出来るかは分からんが、コンパイラより間違わないわな

743 :デフォルトの名無しさん:2010/05/26(水) 01:01:00


     コンパイラより間違わないわな



744 :デフォルトの名無しさん:2010/05/26(水) 01:01:37
すげえな。もう15年ちかくやってるが、いまでもコンパイラ先生にはよく怒られるぜ。

745 :デフォルトの名無しさん:2010/05/26(水) 01:02:31
今時マクロなんて使わないで頂きたい

746 :デフォルトの名無しさん:2010/05/26(水) 01:04:54
今時Cなんて使わないで頂きたい

747 :デフォルトの名無しさん:2010/05/26(水) 01:07:11
職業PGなら、ビットフィールド禁止の人多いんじゃない?

748 :デフォルトの名無しさん:2010/05/26(水) 01:17:45
>>729
ビットフィールドへのアクセスで実際に発生するメモリ読み書きの回数は
実装依存になるんで、 ハードウェアのレジスタに直結してる値を
ビットフィールドにするのは危ない。 よく確認してから使うべき。

749 :デフォルトの名無しさん:2010/05/26(水) 01:20:41
たから、マイコンメーカーがコンパイラとヘッダファイルを提供してるんだろうが。

750 :デフォルトの名無しさん:2010/05/26(水) 01:54:24
>>747
そうもいかないのがつらいところだ

751 :デフォルトの名無しさん:2010/05/26(水) 02:19:06
つらいですね

752 :デフォルトの名無しさん:2010/05/26(水) 03:18:53
>>680
毎回、先頭から辿り直せば良いよ。

753 :デフォルトの名無しさん:2010/05/26(水) 04:07:13
>>651
これ↓って、

>char const *p = "aaaa";

これ↓の間違いではないのでしょうか?

const char *p = "aaaa";

754 :デフォルトの名無しさん:2010/05/26(水) 04:59:33
>>753
どっちも一緒だよ

755 :デフォルトの名無しさん:2010/05/26(水) 05:25:42
>>754
そうなんだ。
d

756 :デフォルトの名無しさん:2010/05/26(水) 06:56:30
>>749
そういう環境ばっかりじゃないんだよ

757 :デフォルトの名無しさん:2010/05/26(水) 07:34:02
そりゃ大変だ

758 :デフォルトの名無しさん:2010/05/26(水) 09:29:56
[1] 授業単元:プログラミング基礎
[2] 問題文 キーボードから読み込んだ整数のうちの偶数の和の計算を続け、もし2回連続して奇数が読み込まれたら、それ以降は奇数のみの和の計算に切り替える。
そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して偶数の和と奇数の和を表示させる。


[3] 環境
 [3.1] OS: Mac
 [3.2] コンパイラ名とバージョン: cc
 [3.3] 言語: C
[4] 期限: 5月27日 


759 :デフォルトの名無しさん:2010/05/26(水) 09:31:06
>>758
宿題スレでやれ

760 :デフォルトの名無しさん:2010/05/26(水) 09:59:31
宿題はスルーでお願いします

761 :デフォルトの名無しさん:2010/05/26(水) 11:32:25
>>759
>>760
あ、わからないんだったら、無理して答えなくていいから

762 :デフォルトの名無しさん:2010/05/26(水) 12:11:23
誰か答えられる賢い人いない?
>>759>>760は引き続き黙ってていいから

763 :デフォルトの名無しさん:2010/05/26(水) 12:22:18
>>762
時間見てびっくりした

764 :デフォルトの名無しさん:2010/05/26(水) 15:47:06
>>758
仕様がよくわからないのですが、下の??に値を入れてもらえます?

Input Number: 2
偶数の和=??、奇数の和=??
Input Number: 3
偶数の和=??、奇数の和=??
Input Number: 3
偶数の和=??、奇数の和=??
Input Number: 3
偶数の和=??、奇数の和=??
Input Number: 2
偶数の和=??、奇数の和=??
Input Number: 3
偶数の和=??、奇数の和=??
Input Number: 3
偶数の和=??、奇数の和=??


765 :デフォルトの名無しさん:2010/05/26(水) 16:00:24
>>764
Input Number: 2
偶数の和=2、奇数の和=0
Input Number: 3
偶数の和=2、奇数の和=0
Input Number: 3(ここから奇数のみの和に切り替え)
偶数の和=2、奇数の和=3
Input Number: 3(奇数が連続したのでここで終了)
偶数の和=2、奇数の和=3

じゃないのかなー

766 :デフォルトの名無しさん:2010/05/26(水) 17:33:19
>>758
インターフェースのデザインとして不格好だと思う。
いくらテキストベースでも、いくら練習問題にしても、操作方法があまりにも直感的でなさすぎる。

まず、使う人間に対して
「今、偶数を入力した」、「今、奇数を入力した」を、
「わざわざ意識しなくても使えるような前提」(プログラムが偶数、奇数の判断をする)
なのにもかかわらず、

処理を切り替えたり、結果を表示する等の『モード変更』の段階では、
使う人間に対して、「自分が入力した数字が偶数なのか?、奇数なのか?」を判断させている。つまり「暗黙に暗算」をさせている。
これは使う上でのストレスになる。

モードの切り替えは偶数、奇数ではなく、「数に関係ない記号」としての00や01を用いるべきだと思う。
(たとえテンキーしか使えない前提であっても)


767 :デフォルトの名無しさん:2010/05/26(水) 17:47:11
宿題の内容にケチつけるなよ
不毛すぎる

768 :デフォルトの名無しさん:2010/05/26(水) 17:57:55
>>765
その仕様で頑張って作ってみた。 どう?

#include <stdio.h>

typedef enum { EVEN, ODD, FIN } MODE;

int main(void) {
MODE mode = EVEN, pre_is_odd = FIN, is_odd;
int num, odd_sum = 0, even_sum = 0;

for(;;) {
printf("Input Number: ");
scanf("%d", &num);

is_odd = num % 2;

if( pre_is_odd == is_odd ) {
if( mode == EVEN && is_odd ) mode++;
else if( mode == ODD ) mode++;
}

pre_is_odd = is_odd;

if( mode == EVEN && !is_odd ) even_sum += num;
else if( mode == ODD && is_odd ) odd_sum += num;
else if( mode == FIN ) break;
}

printf("偶数の和=%d\n奇数の和=%d", even_sum, odd_sum);
return 0;
}

769 :758:2010/05/26(水) 18:51:39
>>767
回答してもらえないならば黙っててもらえますか?
目障りです。

770 :758:2010/05/26(水) 18:52:22
間違えました。済みません。

>>766
回答してもらえないならば黙っててもらえますか?
目障りです。

771 :デフォルトの名無しさん:2010/05/26(水) 18:53:51
こいつ最高に臭い


772 :デフォルトの名無しさん:2010/05/26(水) 18:53:55
(ノ∀`)アチャー

773 :デフォルトの名無しさん:2010/05/26(水) 18:57:42
>>77
黙れ

774 :デフォルトの名無しさん:2010/05/26(水) 18:58:30
>>771
黙れ

775 :デフォルトの名無しさん:2010/05/26(水) 20:03:21
キリッが抜けてるぞ

776 :デフォルトの名無しさん:2010/05/26(水) 22:10:36
>>770
釣りじゃないなら俺が適当に予想した>>765の挙動でいいのかどうかを教えてくれないか。
それをもとにコーディング済ませちゃった人もいるんだ。

777 :デフォルトの名無しさん:2010/05/26(水) 22:28:13
宿題スレでは終わっていたような。
http://pc12.2ch.net/test/read.cgi/tech/1269438098/986
あっちは実力者ぞろいだから、多少の煽りなぞものともせずにコードがあがってくる。宿題以外の質問でも、それにもかかわらず間髪いれずに回答が出てくる。
このスレいらないんじゃない?

778 :デフォルトの名無しさん:2010/05/27(木) 00:34:08
caseの名札の部分は決まった数字じゃないとだめなんですか?
例えば名札の部分をswitch(x)で名札の部分を(1 < x && x < 10)
とかできないんですか?


779 :デフォルトの名無しさん:2010/05/27(木) 00:35:23
>>778
できません

780 :デフォルトの名無しさん:2010/05/27(木) 00:40:37
>>779
では1≦x≦10のときxに対して関数f(x)
10≦x≦20のときxに対して関数g(x)をする
構文何ですか?whileですかねぇ?while使ったけど
できませんでした。どうやりますか?

781 :デフォルトの名無しさん:2010/05/27(木) 00:41:47
>>780
if を使います

782 :デフォルトの名無しさん:2010/05/27(木) 00:42:06
CプログラマはPHPなんて3日で習得できるほど優秀って本当ですか?

783 :デフォルトの名無しさん:2010/05/27(木) 00:45:43
>>781
ありがとうございます。何故whileはだめなのでしょうか?
あとwhileでやるとコンパイル成功してもバグっってカーソルが
出てきたまま止まったり、printfを中に入れると、ずらずらーと
永遠に同じ計算が出てきてこれもばぐるのですが何故ですか?

784 :デフォルトの名無しさん:2010/05/27(木) 00:47:09
>>783
さすがにエスパーでないので分かりません

785 :デフォルトの名無しさん:2010/05/27(木) 00:49:38
>>782
1日で習得出来た

786 :デフォルトの名無しさん:2010/05/27(木) 00:52:41
>>777
あっちでもこっちでも時間があるときしかしないよ。

787 :デフォルトの名無しさん:2010/05/27(木) 00:53:07
最近このスレは馬鹿が増えたな
質問する前に本でも読んで考えろよ

788 :デフォルトの名無しさん:2010/05/27(木) 00:54:02
逆にPHPプログラマはC言語習得するのにかなりかかるらしいな
覚えるだけならCのが楽だと思うんだが

789 :デフォルトの名無しさん:2010/05/27(木) 00:59:15
ソートに関しての質問です
まずはソースをご覧ください

ttp://www.dotup.org/uploda/www.dotup.org916660.txt

ソート方法としては、バブルソートと言うんでしょうか
隣同士の数字を交換していく、基本的なものを作りたいのですが
コンパイルしても、数値が交換されていません
他にも色んな問題(配列の最後の値が不正)はありますが、それは置いといて
とりあえず値は交換できるはずなのですが、出来ていません
何が問題なのでしょうか?

790 :デフォルトの名無しさん:2010/05/27(木) 01:04:24
>>789
交換できているよ。ほれ。
ttp://codepad.org/33aNo4Zu

791 :デフォルトの名無しさん:2010/05/27(木) 01:12:30
>>790
i<6「-1」は>>790さんが付け足したもののようですね

とりあえず、なぜ-1で正常になるのか、もう少し考えを練ってみます
ヒント有難うございます

792 :デフォルトの名無しさん:2010/05/27(木) 01:16:13
>>791
ループ内で[i+1]にアクセスしているから、ループ終端がi<6だと配列をオーバランしてしまう。

793 :デフォルトの名無しさん:2010/05/27(木) 01:23:56
>>792
たしかに、コンパイルした結果も最後の数値はムチャクチャでした

一応、ちゃんと表示されるようになりましたが
なんかきちんとソートできないので、もう少し作り方を考えて見ます

794 :デフォルトの名無しさん:2010/05/27(木) 01:30:44
>>787
本読んで分からないからここきたんだろww

795 :デフォルトの名無しさん:2010/05/27(木) 01:33:39
C言語で英語の小文字とか大文字a,b,c.A.B.Cなどを使う必要が出てきた
ということは全てchar型で変数を取るということなのでしょうか?
int やfloatではアルファベットあつかってませんよね?

796 :デフォルトの名無しさん:2010/05/27(木) 01:37:11
おっぱいを1cm大きくするプログラムを書いてください

797 :デフォルトの名無しさん:2010/05/27(木) 02:03:33
#include <stdio.h>

float f(float a)
{
    a = a + 1e-20;
    return (a);
}

float g(float a)
{
    a = a * 1;
    return (a);
}

void main()
{
    float x = 0;
    while ((x > -10000000) && (x < +10000000)) {

        if ((x >= 1) && (x <= 10)) { f(x); }
        
        if ((x >=10) && (x <= 20)) { g(x); }
        
        x += 1;
    }
}


798 :デフォルトの名無しさん:2010/05/27(木) 02:04:02
再帰の事がよく分かりません
単純に文章としては「自身を呼び出す関数」と理解できるのですが
それが一体どういう状況で必要になるのか疑問です

799 :795:2010/05/27(木) 02:07:05
夜遅いから書き込み少ないんかなぁ?
Aとかaとかを計算に代入するときって
このA,aはchar型ってことですか?

800 :デフォルトの名無しさん:2010/05/27(木) 02:08:02
再帰はループに書き換える事ができるから必要というわけではないよ
書くのが簡単になるだけ


801 :デフォルトの名無しさん:2010/05/27(木) 02:10:49
基本的に文字はchar型で扱うけどintなんかに入れることもたまにある


802 :デフォルトの名無しさん:2010/05/27(木) 02:18:55
>>798
再帰的にデータを構成したときには便利に使えます。ループで書くのは大変です。
こちらをどうぞ。http://pc12.2ch.net/test/read.cgi/tech/1269438098/996

803 :デフォルトの名無しさん:2010/05/27(木) 02:19:11
>>798
フィボナッチ数列で必要になる。

部分の処理を全体の処理と同じアルゴリズムで処理できる場合に、必要ではないが、簡単に書けるようになるのでよく使われる。

804 :デフォルトの名無しさん:2010/05/27(木) 02:25:00
フィボナッチ数列はむしろ例としては良くないんじゃ
素朴に再帰で書いたらコストが跳ね上がるタイプの問題なんだから

805 :デフォルトの名無しさん:2010/05/27(木) 02:28:37
フィボナッチ数列は再帰で記述するから存在意義があるわけで、再帰で書かないなら存在意義は無い。

806 :デフォルトの名無しさん:2010/05/27(木) 02:28:58
フィボナッチ数列は定義から再帰で書けるが、普通は書かない
再帰だと関数の呼び出しを何度もしなくちゃいけないから糞遅くなるしメモリもその分消費する
普通に繰り返しで書いた方がずっと速い

807 :デフォルトの名無しさん:2010/05/27(木) 02:31:55
何が「普通」なのか不明だが、フィボナッチ数列が再帰の例題以外の用途に出てくることは普通ではないし、フィボナッチ数列に速さを求めることはさらに普通ではない。

808 :デフォルトの名無しさん:2010/05/27(木) 02:33:27
ハノイの塔の問題を解くなら再帰が圧倒的に簡単

809 :デフォルトの名無しさん:2010/05/27(木) 02:39:39
フィボナッチ数列、あるいはそれのある項を求めたい時に再帰なんて使わないよ
再帰でも記述出来るのは事実でも、どんな時に使うかという質問の答えとしては不適切だな
例題としてあって、しかもそれは効率が悪いということを示している
つまりどんな時にも使わないと言ってるようなものだ

810 :デフォルトの名無しさん:2010/05/27(木) 02:50:36
// 配列 a を、真ん中から半分にする関数の場合
// a は配列の先頭アドレス
// a_length は配列 a の長さ
void AAA(int* a, int a_length)
{
    if (a_length == 1) {return;}    // もしも長さが1なら、なにもしないで終了


    int center = a_length / 2;    // 真ん中
    
    // 左側の先頭アドレスと、その長さ
    int* left = &(a[0]);
    int left_length = center;

    // 右側の先頭アドレスと、その長さ
    int* right = &(a[center]);
    int right_length = a_length - center;
}


// 配列 a を、真ん中から半分にしていき、長さが1になるまで続ける関数の場合
void BBB(int a, int a_length)
{
    /* AAA() と同じ */

    BBB(left, left_length);     // 左側を、その真ん中から半分に(この中の結果の左右も、さらにそれぞれ半分に。1までくりかえす)
    BBB(right, right_length);    // 右側を、その真ん中から半分に(この中の結果の左右も、さらにそれぞれ半分に。1までくりかえす)
}


BBB と同じことを、ループで書こうとすると、すごく難しい。


811 :デフォルトの名無しさん:2010/05/27(木) 02:55:09
ハノイをループで書くとどうなるの?

812 :795:2010/05/27(木) 03:01:42
>>801
そうですよね、ありがとうございます。
char型の文字を全てみたいのですがどこにそういうの載ってますか?
}とかョみたいな文字ありますね?これはint型どの整数に値するのか
など。

あとchar型でcharで変数名int scanf("%c",&int)でintに数字で30とか
代入するとprintf("%c\n"int)=1とかなったりするんですが・・・・・
全く意味がわかりません。ただし僕の日本語が分からないというのは
ナシで・・
どういうことでしょう?1週間考えて分かりません。

813 :デフォルトの名無しさん:2010/05/27(木) 03:03:08
>>811
大変なことになる

814 :デフォルトの名無しさん:2010/05/27(木) 03:07:21
>>812
そうですね。http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm なんかに書いたコードと、期待していた結果を書いてもらえればお話がすすむかもしれませんね。

815 :795:2010/05/27(木) 03:09:47
charにscanfに数字を代入することはできないんですか?
100とか30とか。どうなんでしょう?本当にすいません・・
くだらない質問かもしれませんが一週間悩んでます。

816 :デフォルトの名無しさん:2010/05/27(木) 03:24:39
>>815
んー、>>814 を希望。ちょっと御知りになりたいことが伝わってこない。

817 :795:2010/05/27(木) 03:28:34
>>816
ありがとうございます。
誰か分かりますか?char型のscanfには数字代入できるのですか?
できないんですか?

818 :デフォルトの名無しさん:2010/05/27(木) 03:32:32
>>815
できますよ。

char a;
scanf("%c", &a);
printf("%d\n", a);

100を入れるときはdと入力してくださいね。

819 :デフォルトの名無しさん:2010/05/27(木) 03:32:50
つーか日本語変

820 :795:2010/05/27(木) 03:35:44
>>818
ありがとうございます
1000を入れるときは?100はdに対応してたのですよね?
では743,1000など文字に対応してない数字は?

821 :デフォルトの名無しさん:2010/05/27(木) 03:36:36
>>820
1000はcharに入りません
743,1000もcharに入りません

822 :デフォルトの名無しさん:2010/05/27(木) 03:36:47
>>817
んー、できるといえばできるのですが。
#include <stdio.h>
int main() {
  char c;
  scanf("%d", &c);
  printf("%d\n", c);
  return 0;
}
/* end */
コードを書いてお話したほうが意図が伝わりやすいと思うのですが‥‥‥。

823 :デフォルトの名無しさん:2010/05/27(木) 03:38:29
>>820
char は -256〜+255 までしか格納できないので、その範囲をはずれるような数値を扱いたいのなら、別の型を使用します。

824 :デフォルトの名無しさん:2010/05/27(木) 03:39:17
>>823
ずいぶんおおきなcharだな

825 :デフォルトの名無しさん:2010/05/27(木) 03:42:53
>>822
おもいっきりアウト
charに対してint分のデータを書き込むことになる

826 :デフォルトの名無しさん:2010/05/27(木) 03:44:49
>>824
あはは、-128〜127 でしたね。すまそ。

827 :デフォルトの名無しさん:2010/05/27(木) 03:48:35
>>825
んー、じゃ、>>817 は「できない」のですかね?

828 :デフォルトの名無しさん:2010/05/27(木) 03:50:40
>>827
んだから、>>818だって。

829 :デフォルトの名無しさん:2010/05/27(木) 04:09:58
>>828
>>818 は 'a' とか 'b' とかをキー入力したときに、そのアスキーコードが入るコードでしょう?
そうではなくて、'100' とキー入力したときに、100が char で宣言された変数に入るコードはないのでしょうか。
>>822 ではだめでしょうか。

>>817 がそれを求めているかどうかは、ちょっとよくわかりませんが。

830 :デフォルトの名無しさん:2010/05/27(木) 04:15:14
コンピューターが理解できるのは数字だけで、しかも、その数字は、なんと驚くべきことに、0と1だけなのである。

0と1だけで、数を表すために2進数を使います。
たとえば 00000000 と8桁並んでるうちの、最初の桁(最も右側)が1の位、次の桁が2の位、次の桁が4の位、、、、と、対応が決められてます。

0  0  0  0  0  0  0  0
128 64  32  16  8  4  2  1


文字も同様に、数字で表します。
たとえば 「A に対応する数字は 123 である」 という具合に、『各文字に対応する番号』が決められています。
アルファベットや$記号など、主に欧米で使われる文字の、数字と文字との対応表のことを アスキーコード表 といいます。

『アスキー文字』とは、アスキーコード表で、数字との対応が決められてる文字のことです。

たとえばアスキー文字で A に対応してるのが 123 だったとします。(実際の数字は違うとおもいます)
コンピューターに、123という数字を、
「数字として表示しろ」と言えば、数字の123として表示されますし、
「文字として表示しろ」と言えば、文字の A として表示されます。

ためしに printf( "%d", (int)'A' ); とすれば、A に『対応した数字』がわかります。
また、printf( "%c", (char)123 ); とすれば、123 という数字に『対応した文字』がわかります。
printf( "%d は %c \n", (int)i, (char)i ); として、変数 i を、 0から255 まで増やすループの中で実行すれば、数字と文字の対応表を知ることができます。

コンピューターは結局、文字も数字として解釈してます。
だから char 型の変数にも、実際に記録されるのは 文字A に対応した 数字 です。
数字を記録できる変数なら、float でも long でも、原理的には char 同様に1文字を記憶できるはずです。(変換にすこし手間がかかりますが)

余談:
最近主流の UTF8 も、根本の原理は同じで、結局、数字と文字の対応表にすぎません。 ただ、アスキーコード表よりも膨大なだけです。
(あと長さが可変なので、読むのが難しいだけの違いです。) 日本語の shift-jisコードも、原理は同じです。 数字と文字の対応表にすぎません。


831 :デフォルトの名無しさん:2010/05/27(木) 04:19:17
>>829
#include <stdio.h>
int main()
{
char c[] = {'a', 'b', 'c', 'd', 'e'};
printf("%c%c%c%c%c\n", c[0], c[1], c[2], c[3], c[4]);
scanf("%c", &c[0]);
printf("%c%c%c%c%c\n", c[0], c[1], c[2], c[3], c[4]);
scanf("%d", &c[0]);
printf("%c%c%c%c%c\n", c[0], c[1], c[2], c[3], c[4]);
}

これの実行結果を見てだめでないと思う奴がいたら危ない

832 :818:2010/05/27(木) 04:24:23
>>829
> }とかョみたいな文字ありますね?これはint型どの整数に値するのか
彼がアスキーコードを利用することを望んでいるからそう書いたんだよ

833 :829:2010/05/27(木) 04:33:17
>>831
おー、これはわかりやすい。確かに、>>822 はアウトですね。%c を %d にかえると一目瞭然ですね。

「'100' とキー入力したときに、100が char で宣言された変数に入るようにすることは、 scanf() ではできない。」
のですね。

834 :デフォルトの名無しさん:2010/05/27(木) 04:37:20
>>768
亀レスになるけど、この場合、テーブルで管理したほうが判りやすいし柔軟性がありますよ。
サンプルコードは、>>835

835 :デフォルトの名無しさん:2010/05/27(木) 04:38:09
>>821
入る環境もあるだろ。
char は 1 ビットであるという定義しかない。
CHAR_BIT マクロが 8 とは限らない。

>>829
Alt 押しながらテンキーで入力。

836 :デフォルトの名無しさん:2010/05/27(木) 04:38:16
#include <stdio.h>

typedef enum { EVEN, ODD, FIN } MODE;

int main(void) {
MODE mode = EVEN, pre_is_odd = FIN, is_odd;
MODE state_tbl[][2] = {
{ EVEN, ODD },
{ FIN, FIN } };

MODE bool_tbl[][2] = {
{ 1, 0 },
{ 0, 1 },
{ 0, 0 } };

int num, sum[2] = { 0 };

for(;;) {
printf("Input Number: ");
scanf("%d", &num);

is_odd = num % 2;
if( pre_is_odd == is_odd ) mode = state_tbl[mode][is_odd];
pre_is_odd = is_odd;

sum[mode] += bool_tbl[mode][is_odd] ? num : 0;
if( mode == FIN ) break;
}

printf("偶数の和=%d\n奇数の和=%d", sum[EVEN], sum[ODD]);
return 0;
}

837 :デフォルトの名無しさん:2010/05/27(木) 04:42:23
>>835
そんな定義無い

838 :デフォルトの名無しさん:2010/05/27(木) 04:54:57
書き間違えただけだろ。
char = 1 バイト
バイトのビット幅は 8 とは限らない。
昔のメインフレームとか。
C の規格に機種依存する部分はないから
環境依存するビット幅は CHAR_BIT に定義されてる。

839 :デフォルトの名無しさん:2010/05/27(木) 05:00:01
>>835
そこをついてくるレスはあるだろうなとは思ったが、charは1バイトね。
あとどうせならEBCDICではdが100にならないという突っ込みも一緒にしてほしいところだな。

840 :デフォルトの名無しさん:2010/05/27(木) 05:01:44
ちなみにその昔のメインフレームでは何ビットだったの?

841 :デフォルトの名無しさん:2010/05/27(木) 05:14:50
>>829
で、Alt + テンキーはもう試したか?
[Alt押す]→テンキーで 1 0 0 →[Alt離す]
PC/AT 初代からこの機能はあるからな。
本来は CP437 の 256 文字を入力するためのものだが、
S-JIS コードでもなんでも入れられるぞ。
分かったらさっさと寝ろバーカ!

842 :デフォルトの名無しさん:2010/05/27(木) 05:17:54
>>829
で、Alt + テンキーはもう試したか?
[Alt押す]→テンキーで 1 0 0 →[Alt離す]
PC/AT 初代からこの機能はあるからな。
本来は CP437 の 256 文字を入力するためのものだが、
S-JIS コードでもなんでも入れられるぞ。

843 :デフォルトの名無しさん:2010/05/27(木) 07:09:06
>>787
俺が最初初心者質問したのがいけなかったみたい
ごめんね


844 :デフォルトの名無しさん:2010/05/27(木) 07:32:07
どれが if(787 == ??)

845 :デフォルトの名無しさん:2010/05/27(木) 08:27:08
int a[2][3] = {{2, 3}, {4, 5}, {6, 7}};
int a[2][3] = {{2, 3, 4}, {5, 6, 7}};

これってどっちが正しいのですか?
それは、どのような理由なのですか?

以上、宜しくお願いいたします。

846 :デフォルトの名無しさん:2010/05/27(木) 08:33:00
int a[LINES][COLUMNS] だから、{{2, 3, 4}, {5, 6, 7}}; が正しい。

847 :デフォルトの名無しさん:2010/05/27(木) 09:03:26
「だから」って、理由になってねぇよw

848 :デフォルトの名無しさん:2010/05/27(木) 09:05:18

いやその説明でわからないならCは諦めるべし

849 :デフォルトの名無しさん:2010/05/27(木) 09:05:37
http://pc12.2ch.net/test/read.cgi/tech/1261057499/910,914,919,920

850 :デフォルトの名無しさん:2010/05/27(木) 09:05:50
LINES=行
COLUMNS=桁
てことだよ。

851 :デフォルトの名無しさん:2010/05/27(木) 09:06:34
>846にはint a[2][3][4]の場合の説明を是非お願いしたい。

852 :846:2010/05/27(木) 09:12:59
>> 910
int a[2][3]は、intの3個の配列の2個の配列だから。

853 :デフォルトの名無しさん:2010/05/27(木) 09:14:17
基礎質問止めてくれ
入門書で勉強してから来い
面倒くさいわ

854 :デフォルトの名無しさん:2010/05/27(木) 09:17:58
>846にはint a[2][3][4][5]の場合の説明を是非お願いしたい。

855 :デフォルトの名無しさん:2010/05/27(木) 09:19:43
int a[2][3][4][5][6][7][8][9][10]

コピペ用

856 :デフォルトの名無しさん:2010/05/27(木) 09:23:29
>>854
逝って良し


857 :デフォルトの名無しさん:2010/05/27(木) 10:50:13
4次元以上の配列だと途端にイメージが湧かなくなる

858 :デフォルトの名無しさん:2010/05/27(木) 12:46:21
int a[2][3][4]


        □ x 4
        {
            □□□□
        }


    (□□□□) x 3
    {
        □□□□ □□□□ □□□□
    }


(□□□□ □□□□ □□□□) x 2
{
    □□□□ □□□□ □□□□   □□□□ □□□□ □□□□ 
}


コンニチワ ワタシタチ ハ タイヨウケイ ニ スンデマス


859 :デフォルトの名無しさん:2010/05/27(木) 13:12:22
>>858
int a[2][3][4][5][6][7][8][9][10]の場合の説明を是非お願いしたい。

860 :デフォルトの名無しさん:2010/05/27(木) 13:30:47
>>851
>>846じゃないが、あのながれならtables(or sheets) lines columnsになるんじゃないかな

861 :デフォルトの名無しさん:2010/05/27(木) 14:17:23
int a[2][3]

これは何も考えずに見ると

int 整数型
int a 整数型で名前がa
int a[2] 整数型で名前が aの配列
int a[2][3] 整数型で名前が aの配列が3つ並んでいる配列

となる。しかし、どこかが間違っている。

862 :デフォルトの名無しさん:2010/05/27(木) 14:23:15
内から外へ
a
a[2]
a[2][3]
int a[2][3]

a is array of array of int


863 :デフォルトの名無しさん:2010/05/27(木) 16:54:46
[1,2,3]
[3,2,1]
[3,4,5]
[2,6,8]
[1,5,0]



と、値を保存していきたいのですが効率のよい保存方法はありますか?
いちいち変数を定義するのも無駄が多い気がして


864 :デフォルトの名無しさん:2010/05/27(木) 16:55:41
>>863
配列か構造体で

865 :デフォルトの名無しさん:2010/05/27(木) 17:56:04
>>863
レジストリ。
ini ファイルでもいいな。

866 :デフォルトの名無しさん:2010/05/27(木) 18:47:30
>>865
馬鹿は答えなくていいから

867 :デフォルトの名無しさん:2010/05/27(木) 18:49:30
>>863 ファイルに書き出す。

868 :デフォルトの名無しさん:2010/05/27(木) 18:55:43
>>863
main(){
int data[][3] = {
  {1,2,3},
  {3,2,1},
  {3,4,5},
  {2,6,8},
  {1,5,0}
};
}

869 :デフォルトの名無しさん:2010/05/27(木) 20:05:44
一次元ならともかく、多次元配列となると関数の受け渡しが複雑すぎて非常に扱いづらい。
まぁ関数に渡さなければいいんだが。

870 :デフォルトの名無しさん:2010/05/27(木) 20:30:06
関数に渡すときは、先頭アドレスを char * にでもキャストして渡せばいい
で、使うときに必要に応じてキャストすればいい

Cは必要なだけの手間で出来るのがいいところ

871 :デフォルトの名無しさん:2010/05/27(木) 20:40:34
>>866
じゃあレジストリより高効率な方法を挙げてみろよ。

872 :デフォルトの名無しさん:2010/05/27(木) 20:45:17
>>870
>関数に渡すときは、先頭アドレスを char * にでもキャストして渡せばいい
一次元配列になら対応してそうだけど多次元はchar **とかもっと複雑な型を作らないといけなくない? 

873 :デフォルトの名無しさん:2010/05/27(木) 20:49:53
ポインタに貴賎は無いよ。二次元も三次元も平等

874 :デフォルトの名無しさん:2010/05/27(木) 20:54:51
>>870
うまくいかない。ご教授を。
#include <stdio.h>
#define N 3
void f(char *a) {
  printf("%d\n", (int [][N][N])a[0][1][2]);
}
int main() {
  int v[N][N][N];
  v[0][1][2] = 345;
  f((char *)v);
  return 0;
}

875 :デフォルトの名無しさん:2010/05/27(木) 21:28:29
Cでは配列へのキャストは出来ないよ。

876 :デフォルトの名無しさん:2010/05/27(木) 21:28:48
;printf("%d\n", ((int *)[N][N])a[0][1][2]);

877 :デフォルトの名無しさん:2010/05/27(木) 21:30:09
>>874
void f(int a[][N][N]) {
  printf("%d\n", a[0][1][2]);
}

878 :デフォルトの名無しさん:2010/05/27(木) 21:32:03
まちごた

printf("%d\n", ((int (*)[N][N])a)[0][1][2]);

これでうまくいくはず

879 :870:2010/05/27(木) 21:35:47
>>874
うまく多次元配列に戻せないね。すまん

#include <stdio.h> 
#define N 3 
#define value(p,x,y,z)  *(p + x * N * N + y * N + z)

void f(char *a) { 
   int *p = (int *)a;
  printf("%d\n", value(p, 0, 1, 2));

int main() { 
  int v[N][N][N]; 
  v[0][1][2] = 345; 
  f((char *)v); 
  return 0; 


880 :デフォルトの名無しさん:2010/05/27(木) 21:36:45
>>879
>>878でうまく行くよ
一見見にくいキャストだが、ちゃんとシグネチャが一致しているとわかるはず

881 :870:2010/05/27(木) 21:37:08
って878で出来てるじゃん・・

882 :デフォルトの名無しさん:2010/05/27(木) 21:54:10
forとwhileどう違うんですか?何回分かりやすい解説書よんでもわからん・・・
do、for,whileの違い何ですか?全て同じ条件である限りプログラムを実行し続ける
って構文じゃないですか?

883 :デフォルトの名無しさん:2010/05/27(木) 21:54:38
>>882
使えば分かる

884 :デフォルトの名無しさん:2010/05/27(木) 21:56:59
>>883
どう違うんですか?

885 :デフォルトの名無しさん:2010/05/27(木) 21:57:24
while(x) と for(; x;) は同じ。
do while(x) はループの1回目は必ず実行されるという点で、上記と違う。

886 :デフォルトの名無しさん:2010/05/27(木) 21:58:21
その一回目を実行するという意味が分からないんです・・・
どういうことですか?一回目って何のことでしょう?

887 :デフォルトの名無しさん:2010/05/27(木) 21:59:33
do
{

888 :デフォルトの名無しさん:2010/05/27(木) 22:00:06
do /*ここ*/ while(x);
while(x) /*ここ*/

889 :デフォルトの名無しさん:2010/05/27(木) 22:02:36
一回目ってどういうことですか?!?!
まじすいません。最初の実行はforでもwhileでも
doでも一回目は一回目じゃないですか・・・全く
理解できん。俺頭悪すぎる。

890 :デフォルトの名無しさん:2010/05/27(木) 22:04:02
do /*xの値によらずここは1回実行される*/ while(x);
while(x) /*xの値によってはここは1回も実行されない*/


891 :デフォルトの名無しさん:2010/05/27(木) 22:04:45
>>889
さあコンパイラをインストールするんだ

892 :デフォルトの名無しさん:2010/05/27(木) 22:07:38
>>890
全く意味がわからん・・
具体的に例で教えてください。

みかん1個1円、りんご1個2円、簡単プログラムで頼む。
ソースみても分からんから日本語で頼む。まじ頼みます。


893 :デフォルトの名無しさん:2010/05/27(木) 22:08:54
むいてないから死ねばいい

894 :デフォルトの名無しさん:2010/05/27(木) 22:09:37
do-while って実際のソースではあまり見ない気がするんだが、俺だけか。
入門書では頻出なんだがなー

895 :デフォルトの名無しさん:2010/05/27(木) 22:14:33
do {
 /*xの値によらずここは1回実行される*/
 do民主党政権()
} while(!is財政破綻());

while(is革命()) {
 /*xの値によってはここは1回も実行されない*/
 do共産党政権();
}

896 :デフォルトの名無しさん:2010/05/27(木) 22:18:46
>>895
よーわからん・・


897 :デフォルトの名無しさん:2010/05/27(木) 22:19:32
breakは北朝鮮襲来だな

898 :デフォルトの名無しさん:2010/05/27(木) 22:22:26
> 何回分かりやすい解説書よんでもわからん・・・

分かるのか分からないのかはっきりしろ

899 :デフォルトの名無しさん:2010/05/27(木) 22:23:37
>>896
わからなくてもいいから先に進め

900 :795:2010/05/27(木) 22:24:42
>>898
分かりやすいとされている解説書を読んでも、一回実行するってのが
何を意味してるか分からない。頭悪い事は開き直らさせてくれ。


901 :デフォルトの名無しさん:2010/05/27(木) 22:25:36
ソース見てもわからん人間がどうやってソースを理解するつもりなんだ

902 :デフォルトの名無しさん:2010/05/27(木) 22:26:01
{}の中の命令を実行するんだよ

903 :デフォルトの名無しさん:2010/05/27(木) 22:26:28
>>900
使えるPCにまずはCコンパイラをインストールして使えるようにするんだ
話はそれからだ

904 :795:2010/05/27(木) 22:30:19
>>903
それはしてる。

{}の中の実行ってのはwhileやdoやforの中の条件を満たすまでするってこと
でしょ?
最初の?何それ?何の最初なの?みたいな・・・


905 :デフォルトの名無しさん:2010/05/27(木) 22:36:05
解らないとか明らかに釣りだろ。
先に判定するか後で判定するかってだけじゃねえか。


906 :795:2010/05/27(木) 22:36:24
もう死にたい・・・わからなさすぎる。
死にたい、誰か助けてくれ。

907 :デフォルトの名無しさん:2010/05/27(木) 22:38:53
do{ A }while( B );

Aを実行してBで判定してまたAへ

while( A ){ B }

Aで判定してからBを実行してまたAで判定

ってだけじゃないのかよ

908 :デフォルトの名無しさん:2010/05/27(木) 22:41:33
根本的に素養がないんだよ。あきらめれ。

909 :デフォルトの名無しさん:2010/05/27(木) 22:42:48
死にたい人を助けようにも、助けたくないよに1000ペリカ

910 :デフォルトの名無しさん:2010/05/27(木) 22:45:23
>>904
条件を満たす限り実行する、な

for ( ; ; ) {} と while () {} はまず条件を判定し、真なら {} の中を実行する
do {} while (); はまず {} の中を実行してから条件を判定し、真なら継続する

つーか実際に書いてみれば「誰でも」わかる簡単なことだ

911 :795:2010/05/27(木) 22:46:34
>>906
人類の発展から遅れた脳みそを持ったディスアビリティな人もいることを
理解してくれ。完全に左脳しか働かない脳みそだ俺は。
俺の脳みそスキャンにかけてほしい。
>>907
ありがとうございます
do{A}while(B);のAを実行するってのはどういうことですか?
Aは勝手に決めていいんですか?


912 :デフォルトの名無しさん:2010/05/27(木) 22:47:03
試そうとせず聞こうとするのは理解したいのではなく構ってほしいだけなんだと思う

913 :デフォルトの名無しさん:2010/05/27(木) 22:48:26
>882

いい加減、釣りか何かわからんが、ちゃんとさせておく
1)while (式) 文
式を評価して真ならば文を実行することを繰り返す。

2)for (式1; 式2; 式3) 文
はじめに1回だけ式1が評価される。
その後式2を評価して真ならば、文を実行し式3を評価することを繰り返す

3)do 文 while (式)
文を実行し、式を評価して真ならば、文を実行することを繰り返す。

1,2と3のもっとも大きな違いは、3では文は必ず1回は実行されること。

914 :913:2010/05/27(木) 22:56:12
>913

補足。913は注意して用語を選んで使っているけど、それまでの説明は用語が適当なので
注意。

「式を評価する」→式を計算すること
「真」→評価結果が0以外であること
「偽」→評価結果が0であること

「式」、「文」を正確に説明するのはめんどいので、略する。

915 :795:2010/05/27(木) 22:56:34
>>913
うん?? whileとforも違うじゃないですか。
forは式2を評価して真=文を実行、そのあと
式3をほ評価して実行して終了ってことですか?
つまりforってのは3回で終わる構文ですか?
いや違う、式1は評価されるだけだから2回で
終わる構文か。

whil、forはいいがやっぱりどうしてもdoがわからん。
ミカン1円、リンゴ2円だとして、リンゴとミカンという
条件を決めているのだから実行は当たり前じゃないです
か?


916 :795:2010/05/27(木) 22:57:53
>>914
式を計算?実行とどう違うのですか?
計算したら条件変わるんじゃないですか?
ここまで複雑だと何が結果で何が条件か
全くわからん・・・・

917 :デフォルトの名無しさん:2010/05/27(木) 23:02:25
>>915
みかん1円りんご2円というのは、(おそらく)ループ条件に入れるべき要素ではない
これらを使って何がしたいんだ?って話だ

918 :デフォルトの名無しさん:2010/05/27(木) 23:03:19
俺も30過ぎたらここまで頭固くなるのかと想像したら怖くなってきたわ

919 :デフォルトの名無しさん:2010/05/27(木) 23:03:52
三角形の面積を求める問題を出されて「なんで底辺×高さ/2が面積になるんですか」って言われてるような感じだな

920 :デフォルトの名無しさん:2010/05/27(木) 23:04:00
>>916
実際にプログラム書いて動かしてみたのか?

921 :デフォルトの名無しさん:2010/05/27(木) 23:10:31
用意されてる数学関数(sinやcos)の精度を知るにはどうしたらいいですか?

922 :デフォルトの名無しさん:2010/05/27(木) 23:10:38
do{ x = f1(); }while(x != 1);

無条件で{}内へ→f1()を実行しxに結果が入る→xが1でなければ{}内へ→f1()を実行しxに結果が入る→xが1でなければ{}内へ→f1()を実行しxに結果が入る→xが1でなければ{}内へ→…→xが1なら終了


while(x != 1){ x = f(); }

xが1でなければ{}内へ→f1()を実行しxに結果が入る→xが1でなければ{}内へ→f1()を実行しxに結果が入る→xが1でなければ{}内へ→f1()を実行しxに結果が入る→xが1でなければ{}内へ→…→xが1なら終了

923 :デフォルトの名無しさん:2010/05/27(木) 23:12:18
>>921
math.hとkimits.hを見る

924 :デフォルトの名無しさん:2010/05/27(木) 23:17:42
>>896
前者 「(一度ヤラせてみようと言ってヤラせてみたら、)財政破綻するまで民主党政権が続く。」
後者 「革命が起き(続け)なければ共産党政権にはならない。」

925 :795:2010/05/27(木) 23:22:40
>>918
俺まだ20代前半だぞ・・・・
>>917
1円ならみかん、2円ならりんごを出すプログラムだ。
あれ?おかしいな、1円のスイカがあるかもしれんが、
1円っていうだけでみかんに、いや本気でわからんww
設定、結果、条件がこんがらがって何が何だか・・・

926 :795:2010/05/27(木) 23:24:25
いや違うわw
whileの中は関数なんだよな?1円ならみかんならswitchか。


927 :デフォルトの名無しさん:2010/05/27(木) 23:25:27
>>925
アルコールでも飲んでるんじゃないのか?
それか、

928 :デフォルトの名無しさん:2010/05/27(木) 23:27:45
我々には見えないものが見えているんだろう

929 :デフォルトの名無しさん:2010/05/27(木) 23:28:00
>>925
何をしたいのか箇条書きにしてくれ

930 :デフォルトの名無しさん:2010/05/27(木) 23:32:24
if(みかん < 3){ みかんを買う(); }

みかんが3より少なければ、みかんを買う。

while(みかん > 3){ みかんを食う(); }

みかんが3より多い間、みかんを食い続ける。

do { みかんを食う(); } while(美味しい());

みかんを食ってみて、美味しい間、さらにみかんを食い続ける。

931 :795:2010/05/27(木) 23:34:20
>>929
もう一番簡単なプログラム頼む。
x=1〜10ならx-1
x=10〜20ならx-10
これをwhile文でやる。
しかしこれがどうしてもできない。
頼む。そしてこのプログラムがdo whileでできるのかも
頼む。プログラム適当に書く。
while(1<x<10) t=x-1
while(10<x<20)t=x-10
これが上手くできん。おそらくtがかぶるから・・


932 :デフォルトの名無しさん:2010/05/27(木) 23:37:58
>>915

例1
 while (おなかすいた) {
     みかんをたべる
 }



例2
 do {
     りんごをたべる
 } while (おなかすいた);



例1では、お腹が空いてるあいだ、みかんを食べつづけます。
  最初からお腹がいっぱいなら、最初からなにも食べません。

例2では、考える前に、まず1回りんごを食べます。 そしてお腹が空いてるあいだ、ずっと、りんごを食べつづけます。
  最初からお腹がいっぱいでも、お腹に関係なく、かならず1回はりんごを食べます。


933 :デフォルトの名無しさん:2010/05/27(木) 23:38:09
何か、C スレにも C++ スレにも凄いのが居座ってるなw

934 :デフォルトの名無しさん:2010/05/27(木) 23:39:39
1<x<10
この書き方はどこで習ったんだ

935 :デフォルトの名無しさん:2010/05/27(木) 23:39:44
while(1){
if(1<=x && x<=10) x = x-1;
else if(10<=x && x<=20) x = x-10;
break;
}

do{
if(1<=x && x<=10) x = x-1;
else if(10<=x && x<=20) x = x-10;
}while(0);



936 :795:2010/05/27(木) 23:40:13
>>931
の奴コンパイルしたら
a.exe

_←こんなんが出てきてフリーズするんだが何故だ?

コンパイルできたのにフリーズって意味がわからん・・・・

937 :デフォルトの名無しさん:2010/05/27(木) 23:41:17
>>936
単に無限ループしてるだけだ

938 :795:2010/05/27(木) 23:44:35
>>935
やっぱり論理記号使うのか、、
論理記号使わないといけないなら
ちょっとまって他に
x=x-1???俺t=x-1ってしたらフリーズしたんだけど
何故?あとx=x-1の=の部分は+=とかとどう違うの?

939 :デフォルトの名無しさん:2010/05/27(木) 23:45:36
while(1<x<10) t=x-1

while((1<x)<10) t=x-1
↓xが1より大なら
while(1<10) t=x-1

while(1) t=x-1

無限ループ


↓xが1以下なら
while(0<10) t=x-1

while(1) t=x-1

無限ループ

940 :デフォルトの名無しさん:2010/05/27(木) 23:47:21
なんであっちのスレでは!を付けるんだ?

941 :デフォルトの名無しさん:2010/05/27(木) 23:49:11
キャラ作り

942 :デフォルトの名無しさん:2010/05/27(木) 23:49:56
すいません!同一人物は嘘です!調子こきました!

943 :795:2010/05/27(木) 23:50:30
>>937
いや無限ループの場合
コンパイルしたら

x=t-1
x=t-1
.
..
.
..
と出てくる

x=としたらxがかぶるので
正しい数値が出てこない。

944 :929:2010/05/27(木) 23:51:50
>>943
やっぱりC言語で書いてくれ
ニホンゴムズカシイデスって気分だ

945 :デフォルトの名無しさん:2010/05/27(木) 23:52:11
>>938
> 何故?あとx=x-1の=の部分は+=とかとどう違うの?

x = x-1 と x += -1 と x -= 1 は同じ。

946 :795:2010/05/27(木) 23:52:26
自己解決したのでもういいです

947 :デフォルトの名無しさん:2010/05/27(木) 23:53:30
おめでとう。

948 :795:2010/05/27(木) 23:56:35
>>946
ちょw
やめてくれ、まじで人生かかってるんで・・

何となく分かってきました。
ただ論理記号使うんですね
x<2を条件としたいときはどうしたらいいのですか?
x< 2$$2
ですか?

949 :795:2010/05/28(金) 00:01:23
すまん、あまりに質問しすぎた。他の人質問どうぞ。
明日また時間考えて来ます。

とりあえず>>948だけ答えてほしいな。
そしたら寝ます。
本当に迷惑かけました。

950 :デフォルトの名無しさん:2010/05/28(金) 00:03:31
>>948
if(x < 2)

951 :デフォルトの名無しさん:2010/05/28(金) 00:09:07
単に文法の基礎知識が無いだけじゃないか。
入門書1冊読んでこい。

952 :795:2010/05/28(金) 00:09:38
>>950
ありがとう・・・
つきあってくれてありがとう。


953 :デフォルトの名無しさん:2010/05/28(金) 00:11:30
>>952
いえいえ

954 :デフォルトの名無しさん:2010/05/28(金) 00:13:54
「x^2をaからbまで台形則を用いて数値積分する関数」を用いて作成する
よろしくお願いします

#include <stdio.h>

double daikei(double, double, int);

int main(void)
{
double a,b,sekibun,exact;
int n;

printf("x^2をaからbまで台形則を用いて数値積分します。\n");
printf("aとbを入力してください。\n");
scanf("%lf %lf",&a,&b);
printf("分割数nを入力してください\n");
scanf("%d",&n);

sekibun=daikei(a, b, n);

exact=(b*b*b-a*a*a)/3.0;

printf("数値積分値は%20.15lfです。\n",sekibun);
printf("厳密値は%20.15lfです。\n",exact);
printf("誤差は%20.15lfです。\n",exact-sekibun);
return 0;
}

/* ここに関数daikeiを記述する */

955 :デフォルトの名無しさん:2010/05/28(金) 00:22:56
/* ここに関数daikeiを記述する */
#define func(x) ((x)*(x))

double daikei(double a, double b, int n)
{
double d = b-a/n;
double s = 0;
for(int i = 0; i < n-1; i++){
s += func(a+d*i)*func(a+d*i+d)*d/2;
}
return s;
}

956 :929:2010/05/28(金) 00:24:07
>>955
(b-a)/n

957 :デフォルトの名無しさん:2010/05/28(金) 00:27:06
>>955
ありがとうございました
でもコンパイルできません。。。orz

958 :デフォルトの名無しさん:2010/05/28(金) 00:27:58
>>957
32行目の
for(int i = 0; i < n-1; i++)
が未定義のiを含めるって。。。

959 :デフォルトの名無しさん:2010/05/28(金) 00:28:29
>>955の訂正

/* ここに関数daikeiを記述する */
#define func(x) ((x)*(x))

double daikei(double a, double b, int n)
{
double d = (b-a)/n;
double s = 0;
for(int i = 0; i < n; i++){
s += (func(a+d*i)+func(a+d*i+d))*d/2;
}
return s;
}


960 :デフォルトの名無しさん:2010/05/28(金) 00:30:27
>>959
これもコンパイルが。。。

961 :デフォルトの名無しさん:2010/05/28(金) 00:31:12
/* ここに関数daikeiを記述する */
#define func(x) ((x)*(x))

double daikei(double a, double b, int n)
{
int i;
double d = (b-a)/n;
double s = 0;
for(i = 0; i < n; i++){
s += (func(a+d*i)+func(a+d*i+d))*d/2;
}
return s;
}


962 :デフォルトの名無しさん:2010/05/28(金) 00:34:56
>>961
ありがとうございました

なるほど、forの中でiを定義してもだめですね。。

ちゃんと関数の頭のほうで定義しないとw

963 :デフォルトの名無しさん:2010/05/28(金) 00:37:01
>なるほど、forの中でiを定義してもだめですね。。

単にコンパイラが古いCの仕様を使っているだけ。
新しい仕様では全く問題ないよ。

964 :デフォルトの名無しさん:2010/05/28(金) 00:40:48
>>963
なんだか大学の授業ではプログラミングを勉強してもうまくできないな。。。

みんな独学してるかね

課題の中でいつも勝手に見たことないものが出てきてる

965 :デフォルトの名無しさん:2010/05/28(金) 00:42:39
>>964
あたりまえだ。
知ってることばかりなら教わる必要ないじゃん。

966 :デフォルトの名無しさん:2010/05/28(金) 00:45:15
>>965
でも教えてないことを出すのは困るよww



967 :デフォルトの名無しさん:2010/05/28(金) 00:46:41
大学通ってて……。予習復習があってこその講義だから、授業出ても無駄かと。
大抵学則の単位認定の項目に、学外での準備も単位に含まれるなどと明記されているはず。

968 :デフォルトの名無しさん:2010/05/28(金) 00:47:04
1から10まで手取り足取り教わるのは義務教育だけのはずなんだが
今は大学受験も小学生みたいに教わってくるから
大学入って挫折する人が多いね。

969 :デフォルトの名無しさん:2010/05/28(金) 00:48:26
>>967
分かりましたw

970 :デフォルトの名無しさん:2010/05/28(金) 00:50:01
以下、自分もできていなかったことをアドバイスするオヤジたちの書き込みが続きます。

971 :デフォルトの名無しさん:2010/05/28(金) 00:59:54
自分でもc言語を学べるサイトのおすすめはありますか

972 :デフォルトの名無しさん:2010/05/28(金) 01:03:37
次スレ立てたよ
http://pc12.2ch.net/test/read.cgi/tech/1274976173/l50

>>971


973 :デフォルトの名無しさん:2010/05/28(金) 01:10:42
>>972
アドレスを教えてくださいw

974 :デフォルトの名無しさん:2010/05/28(金) 01:12:40
>>973
http://www.kumei.ne.jp/c_lang/

975 :デフォルトの名無しさん:2010/05/28(金) 01:15:54
>>971
本当の基礎だったら苦cがいいかもしれん
http://9cguide.appspot.com/

ただこの程度の知識じゃ何もできるようにならないので注意

976 :デフォルトの名無しさん:2010/05/28(金) 01:16:09
>>974
ありがとうございました
これは助かります

977 :デフォルトの名無しさん:2010/05/28(金) 01:19:57
PCに向かえる貴重な時間は手動かすことに費やすべきかと。
知識の収集は適当に本1冊買って移動時間やその他のすき間時間でこなさないともったいない。

978 :デフォルトの名無しさん:2010/05/28(金) 01:31:06
現在XORによる計算を行っているのですが、

BOX[1]=-51(10進数)
 
これを16進数で表示すると
printf(%x,box[1]);
結果:FFFFFFCD
と表示されてしまいます。
これを16進数でCDと表示するにはどうすればよいのでしょうか?

979 :デフォルトの名無しさん:2010/05/28(金) 01:37:59
>>978
printf(%x,box[1]&0xff);

980 :デフォルトの名無しさん:2010/05/28(金) 01:39:41
結果は正しい。どうしたいのかわからん。
FFF…の部分が間違いだと思ってるんだろうが、正しい。

981 :デフォルトの名無しさん:2010/05/28(金) 01:54:11
>>980
下2桁だけ表示したいんだろ
顧客の隠された要望を正確に汲み取るのも
プログラマの仕事の一つだぜ

982 :デフォルトの名無しさん:2010/05/28(金) 01:54:54
>>979
出来ましたありがとうございました!
printfの最後にそうやってつければいいんですね。
box=box+1みたいなことやってて出来ませんでしたw

>>980
暗号化などで使うんです
-1=FFFFになるのは大丈夫です。
どうもありがとうごxざいました。

983 :デフォルトの名無しさん:2010/05/28(金) 02:27:02
>>980
今、もう一度読み直してみたらどうみても説明不足でしたよね…
出力結果:
255 -1 →FF FFFFFFFF

となりますが、16進数表示で→FF 1
と表示したかったんです。

エスパーレスしてもらえたので助かりましたが。

984 :983:2010/05/28(金) 02:33:59
>>983
出力結果を書き間違えたので忘れてください…
FF 1じゃなくてFF Fですよね。

もう黙ります。
スレ汚しすみませんでした。

985 :デフォルトの名無しさん:2010/05/28(金) 07:18:52
あるサイトのSDKに関する記事の引用ですが
「メモリの管理を自分で行わなければならず、メモリの確保・開放忘れにより、アプリケーションやOSが
不安定になるアプリケーションが作成できてしまいます。」

これの意味はちょっと良くわからないのですが
スレ違いかな?


986 :デフォルトの名無しさん:2010/05/28(金) 07:30:17
>978

色々情報不足なのだが、box[N]の型がunsigned charということなら

printf("%hhx\n", box[0]);

でよい。hhはサイズを指定している。

987 :デフォルトの名無しさん:2010/05/28(金) 09:47:45
>>985
あるサイトがどこかわからないと何とも言えないが。

関数呼び出しの時はスタックに積んで、とか、
mallocのときはヒープからメモリをとか、などという話に関連する。

知らなかったら、↓を一通り読めば、何となくわかると思う。
ttp://www.amazon.co.jp/exec/obidos/ASIN/4891003383

988 :デフォルトの名無しさん:2010/05/28(金) 10:09:20
>>978
本当に"%x"でFFFFFFCDって出力された?
変だな、ansi/isoでは"%x"のときは"abcdef"で"%x"のときは"ABCDEF"って決まっていた筈なんだが。
で、BOXとboxの関係がよく判らないけれど、boxがsigned charか暗黙のsignedであるcharのどちらかへのポインタならば
暗黙の型変換でsigned intに昇格してしまっている。強制的にunsigned charにキャストしてしまえばいいよ。

989 :デフォルトの名無しさん:2010/05/28(金) 11:40:43
>>988
意味ワカンネ!!
お前こそ %X と %x の違いがわかってないんじゃないか
くらだん揚げ足取りばかりすんな

990 :デフォルトの名無しさん:2010/05/28(金) 11:52:26
書きそこねだろ。JK
まぁ、%xではabcdef、%XではABCDEFであることには間違いないよ。
要は、>978は他の記述からも判るように大文字小文字を頓着していないんだろうな。

991 :デフォルトの名無しさん:2010/05/28(金) 12:20:30
>>990
お前大丈夫か?
それは普通に書き間違えてだってわかるだろ、
それを指摘しようとしたお前でさえ間違えてんだぞ
なんでそんなことに執着するの?????

992 :デフォルトの名無しさん:2010/05/28(金) 12:29:23
ただ書き間違えるだけならいいけど、他人の書き間違えを嬉しそうに揚げ足取ってるやつが
書き間違えてると、バカだなあと思う。

993 :デフォルトの名無しさん:2010/05/28(金) 12:30:53
まぁまぁ、そんなに粘着するなよ。照れるじゃないかw

994 :デフォルトの名無しさん:2010/05/28(金) 17:16:42
ソースと出力結果をコピペしなかった質問者が悪いんだよ

995 :デフォルトの名無しさん:2010/05/28(金) 17:24:15
>>994
自演乙

996 :994:2010/05/28(金) 18:18:42
直近のレスってどれだっけとおもって探したら>>860だった。

>>995やめてください><

997 :デフォルトの名無しさん:2010/05/28(金) 18:37:11
すみません。Cをチョコチョコやってる日曜プログラマです。

998 :デフォルトの名無しさん:2010/05/28(金) 18:58:06
はじめまして。Cをごくたまにやる職業プログラマです。

999 :デフォルトの名無しさん:2010/05/28(金) 19:00:39
Cならできるニートです

1000 :デフォルトの名無しさん:2010/05/28(金) 19:02:09
うめ

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

233 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)