1 :
デフォルトの名無しさん :
2010/05/14(金) 23:06:53 BE:265079074-S★(521521)
2 :
デフォルトの名無しさん :2010/05/15(土) 00:27:45
>>2 1つめのscanf()に対する入力時に、
A\n
と入力すると、2文字分の入力となるので、2つめのscanf()は入力を求めずに返る。('\n'は改行)
その結果、
i = 'A';
input = '\n';
となる。ASCIIコードにおいて、
'\n' == 10
いいかげん初心者のテキストにscanf()使うのやめてほしい。 書いてるやつは、入力と数値変換が一挙にできて簡単だろ程度のことしか考えてないんだろうけど 初心者、はまりまくりじゃん。 使いこなせばどうこう言う奴いるけど、労力かけて、scanf()の癖のある挙動をマスターしても、 初心者向けのテキストを卒業したら、そんなもんまず使わないしな。
5 :
デフォルトの名無しさん :2010/05/15(土) 15:44:12
sscanfとかは使うけどな。
gcc -std=c99 -Wall -ansi -pedantic
前スレ
>>990 だけど、
>>992 は俺に何を言いたかったの?
「はじめるの遅いね。バカは死ね」ってこと?
10 :
デフォルトの名無しさん :2010/05/15(土) 16:59:09
>>8 人生豊かなヤツは趣味なんてたくさんある。
始める時期なんて関係ないよ。
11 :
8 :2010/05/15(土) 17:05:19
>>10 言われてみれば確かに、中学生当時はサッカーのことばっかり考えてたな俺はw
趣味なんだからいつ始めたってイイよね。THX
つーか、中学生の頃も、大学生の頃も、オナニーしかしてなかったし。
>>7 -std=c99 と -ansi を両方指定して意味があるのか
-ansi って -std=c89 の意味でしょ
そうだね。
15 :
デフォルトの名無しさん :2010/05/15(土) 21:04:02
あらためて==と&&って何が違うのかって意識してみたら分からなかった! 教えてエロいひと! int x = a == b == c; ってかくとまず(a == b)が評価されてその結果のboolが==cと評価されるようですね。 いっぽう int x = a && b && c;って書くと aがfalseならその時点で評価やめ。 っていう違いくらいですか?
あ、頭ワル いまわかった。
そうだね。
確かに
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 すいません、初心者なのでまったくわかりません
詳しくお願いします。
>>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");
>•
>•
>•色々省略
最近、各教科の点数をキーボードから入力して、何か計算する プログラムの質問が多いけど、なんなのこれ テーマからして学校の授業かなにかなのかね? そうなら学校で聞け そうでないなら、こんな意味の無いプログラムやるな
>>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;
}
>>23 俺の場合は、学校課題ではないし、習ってもいない。
ただたんに練習だ!
意味がないからやめろ?はぁ?
お前にとっては意味がないかもしれないが、俺にしてみたら、プログラミングを覚える糧になるから必要なんだよ!お前にとっては意味がなくても、他の人には意味をなすものが世の中には沢山あるんだよ!
>>25 ゴミレスしかできない馬鹿はほっとけばいいよ
青いな
そういう台詞は人に質問しなきゃできない人間が言っていいものじゃない
#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です。
scanf("%d%*c", &a); scanf("%d%*c", &b);
int型の割り算の結果が小数点以下切捨てになって0になってる。 てかデバッガの使い方調べろよ。計算結果を段階的に表示すればどこでおかしくなってるか分かるだろ。
ありがとうございます 正解率出ました ()付けちゃ駄目だったんですね・・
括弧ついててもいいよ。
((double)b/a) * 100とか。
>>33 駄レスするよりはアホじゃないと思うけどなぁ
b/a*100 じゃだめだろ
アホじゃなくておっちょこちょいとかじゃねーの
>>24 初心者にはす難しいです。
やってることはあるていどわかるんですが、解説を付けてもらえませんでしょうか?
ネットでも本でも自分で調べてなんとかする習慣つけないと
>>30 みたいなアホになるぞw
すべて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); }
文字を読むとき以外は%*cで読み飛ばす必要ないのにな
>>40 本は買ってあるんですが、
for文の使い方が、いまいちわかりません
int i;
for(i=1;i<6;i++)だと1から5までですけどこれを数字じゃなくて、5教科にしたいんです。英語から社会までみたいに。この場合はどのようにやれば良いか、解説付きで教えてください、お願いします。
普通のレベルの本なら、全部読んで内容を理解すればその程度のことは 自然に出来るようになってるだろ
変換指定で小数点以下だけを表示したい場合ってどうするんですか? 全然考えても分かりません・・・
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);
>>37 それよりも駄レスをするほうがアホってことなんじゃないかと
自分がアホって言われたから駄レスって言ってるだけにしか見えないw
明らかに無駄かつ、問題の答えになってないものをアホだと指摘するのは駄レスじゃない。
どちらかと言えば
>>35 の後半部分の方がよっぽど駄レス。
ついでに言えば結合順序がわかってないと思われる前半の括弧も無駄w
>>44 無理です。enumを使っても分かりにくくなるだけ。
それから、初心者だから分からないということですよね。
学校の課題であるなら、今の授業進度についていけていないということになります。
今までの課題および授業のテキストを復習してください。
学校の課題ではないのなら、もう少し簡単なところを勉強してみてはいかがですか。
>>51 彼は乗算部の括弧を外すことに抵抗があるのかと思ったので、
該当部の括弧を外す必要は必ずしもなく、キャスト対象を変更すればよいという意味のレスをしたつもりだよ
なんでここトリつけたりつけなかったりするの?
>>30 と同レベルのアホが他にもいるとは、頭痛くなってくるなw
間違いを指摘するだけでまともな回答をしないやつは相当イカレてるよな いつもの人か。夜まで粘着する予定ですか?
アホが指摘されないで初心者がそれを信じるほうがよっぽどまずいと思うんだ。
>>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未満なら"ひどい"と表示。
>>64 61です
ありがとうございます!
とてもわかりやすいです。モヤモヤがとれました!
65誰?
こういう成りすましが湧くから、質問するときはトリップつけたほうがいいよ
どこでもやもやしてたのかが分からんね
>>67 66です
トリップってなんですか?
名前ですか?
68誰?
71 :
デフォルトの名無しさん :2010/05/16(日) 14:29:23
こんなとこで構ってもらいたくて必死になるなんて、 どんだけ悲惨な人生送ってきたんだろうな。
74 :
デフォルトの名無しさん :2010/05/16(日) 14:35:57
>>72 ポインター型の宣言
char a; // char型の変数aの宣言
char *b; // charへのポインター型の変数bの宣言
char *c[]; // charへのポインターの配列cの宣言
>>74 完全には理解できませんが*だけよ違いでこんなにも意味が違うんですね。
2ちゃんは、誰が誰に言っているかがわかりずらいですね
確かに必要ですね
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の場合、全ておなじになってしまうので。
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() を呼び出すと、常に同じ乱数値が返ってくる。 という副作用が気になりました。
やっぱり、初心者が自己流に作ったコードはダメだね という典型例 本人は自身満々ぽいけど
85 :
デフォルトの名無しさん :2010/05/16(日) 22:03:43
>>83 乱数が欲しかったら、rand()の前に、現時刻で系列を初期化したら?
>>83 あんまり
>>78 を真に受けちゃダメ
あれ、どうみても適当に乱数とか交えてゴチャゴチャ計算しただけだから
ハッシュの計算なら、暗号関連でいっぱい実装例があるから
そっちを参考にした方がいい(そのまま実装しなくて、参考にする程度で
いいと思うけど)
87 :
78 :2010/05/16(日) 22:12:32
>>78 にも書いたとおり、
普通のハッシュ関数使えるなら、そっちの方がいいと思うよ。
乱数の(よくない)性質を積極的に利用して、「それなりに分散のいい(リング)テーブル」として流用するアイディアには正直、目から鱗でした。 とてもユニークだし、おもしろいアイディアだと思います。 ユニークな方法を試せば、多少の問題が現れるのは当然ですが、 問題があれば、そのつど修正してけばいいだけだと思います。プログラムは暫近的に書いていけばいいとストラウストラップも言ってた。
ビヨーンスポッスポッ
てs
配列a[5][5]の対角線上の要素をすべて1とし、他の要素はすべて0にするプログラムを、for文を使って作りなさい。 ↓↓実行↓↓ 10001 01010 00100 01010 10001
#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; }
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; }
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; }
int* p = 1; int *p = 1; 何が違うんですか?
>>99 何も違わない。
ついでに書くと int * p = 1; も同じ。
>>99 同じだよ。
蛇足だけど、
その場合、int型の*pではなく、int型へのポインタのpに1が入るから、
後々、恐らく不幸なことが起きるよ。
103 :
99 :2010/05/17(月) 22:57:57
>>103 ポインタに 1 を代入しているのが問題。
大抵の環境ではアドレス 1 には割り込みベクタテーブルがあり、OS によって
保護されていてアクセス違反となり、プログラムが異常終了する可能性が高い。
> 大抵の環境ではアドレス 1 には割り込みベクタテーブルがあり > 大抵の環境ではアドレス 1 には割り込みベクタテーブルがあり > 大抵の環境ではアドレス 1 には割り込みベクタテーブルがあり
>>104 ユーザプログラムのアドレス1に割り込みテーブルは無いだろうJK
あと、アドレス1にintでアクセスすると境界エラーになる可能性が高い。
x86は、ならないけど
>>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;
}
#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; }
なんで1行目すら読めない人が他人の質問に答えられるって思うのはなぜなんだぜ?
>>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;
}
#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; }
ごめん for(i = 18157905; i > 0; i /=2) *p++ = n%2; 若しくは for(i = 18157905; i > 0; i >>=1) *p++ = n%2; だ。
nってw
出力忘れてるとかw
はあ・・・w
出力以前の問題
出力しろとは書かれてないけどな
119 :
デフォルトの名無しさん :2010/05/18(火) 10:56:16
Windowsでgetloadavgに相当する関数はなんですか?
そもそもロードアベレージを知る術がないんじゃないか?
(´・ω・`)
パフォーマンスカウンタかもしくは自力でプロセス数を集計して平均をとるしかなさそう
idol状態になってるかどうかも調べないとだから結構面倒じゃないのかな。 そうでもないのかな。
入門の定番はやさしいCとかの本があるけど、 一通りそれらを理解したうえで、次の段階に進む際の定番やオススメの教科書みたいなものがあったら教えて下さい。
見てるだけじゃ何も学んだことにはならない。思い付いたことをとにかくコードにすべし。 そうこうしてるうちにデータ構造とかアルゴリズムとか気になってくるだろう。
こういう何の役にも立たないことをキリッって言っちゃう奴って居るよな
>>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;」は違う意味だよな
>>128 (int*) i, j, k, l; とすればよい
突っ込みたいけど、突っ込まないぞ
おすすめのフリーのテキストエディタを教えてください
vi
vim
メモ帳
vimyo
jvim
メモ帳はフリーじゃないんじゃないか
サクラエディタ
Visual Studio 2010
kdevelop
コマンドプロンプトとかで test_c < test.txt みたいな感じでtest.txtの内容をtest_c.cのscanfなどで読み込むことを 何て言うんだっけ?
リダイレクト?
144 :
142 :2010/05/19(水) 01:33:55
emacsって使いにくいもんな…
>>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);
}
>>147 void main < main < int main
151 :
デフォルトの名無しさん :2010/05/19(水) 16:44:02
>>147 初歩的質問
ライブラリ関数のstdio.hって関数の宣言だけですよね?
それならばその本体はどこのあるの?
ANSI C限定じゃないんだからvoid mainでもいいんじゃないか
>>132 notepad++
タダだし・・・ってかVC++じゃだめなの?
>>151 つ libc
すでにコンパイル済の状態で、ライブラリとして提供される。
>>151 環境にもよるけどlibc.soとかに。
かぶったw Windowsだとmsvcrt.dllにでもはいってるのかな
>>156 リンク時にランタイムのリンケージが選べる:
スタティックリンクだと .LIB に、ダイナミックリンクだと dll に実装体が居る
(20+a)*a<200 を満たす最大の整数ってどうやって求めるんですか?
2次不等式を解けばいい
↑ thanks a lot.
↑ then ks a lot
Visual C++ 2008 Express はもうダウンロードできないんでしょうか?
うん
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; }
end == 1
end == 1; ??
end = 1;
間違ってるところがいけない
double d = 0.1; printf( "%lf", d ); みたいなことをするときに「0.10000」じゃなくて、「0.1」とだけ書きたい。 けどケツのゼロを捨てる書式の指定方法なんてあったか?
176 :
175 :2010/05/20(木) 08:33:38
すいません、補足を。 小数点以下の桁数はわからんので、 printf( ".1%lf", d ); のようなことでは不十分なのです
%g
>>177 二文字で解決されるとは!
助かったthx
180 :
177 :2010/05/20(木) 14:34:35
なんで0から始まってるの?
なんでスレ読まないで書き込むの?
185 :
181 :2010/05/20(木) 18:33:11
>>182 確かに 0 からはじめているのは適当。すまん。
二次方程式をちゃんとといてあたりをつけることは必要ですね。
188 :
デフォルトの名無しさん :2010/05/20(木) 19:51:16
scanfの引数の前に&をつける理由ですが、 scanf本体の仮引数がポインタで受けるようになっているので&つけることで実引数・仮引数の双方の型を合わせるため、でいいですか
型を合わせるためなのはまあ合ってるんだけど、 アドレス渡さないと変数に結果入れらんないよね void foo(int n) { ... } int a; foo(a); で foo 内部で a に値を入れられないのと同じ理屈
double a; int b,c; a/bの商を求めてcに代入する際に、 コンパイルはできても注意(double型がint型で〜)と出てきてしまうのですが、 これを消す方法はありますか?
#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; }
#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
>>160 http://codepad.org/Wtgf7r1r 答えがあるかもしれない範囲を、上と下をちょっとずつせまくしてって、だんだん答えのある範囲がせまくなってったら、さいごには答えになるんじゃないかな〜? って思いついたので
ためしてみたら、なんか7.~~~~って数字でた。たしざんとかして確かめてみたら199.999999~~ってなった。200よりちいさい。よかった
c = (int)(a/b);
例えば char str[] =""; を printf("%s",str);とすると、 画面には何も出力されない、という結果になります。 これと同じことをchar型変数で行うことは可能でしょうか? char c = ''; /*何かを代入*/ printf("%c",c);とした時画面に何も(スペースさえも)表示されない という処理を行いたいのです。
何もしなきゃいいんじゃね?
何がはいってたら表示したくないの?
>>196 ええとすみません、実はファイル出力したいのです。
形式がCSVで,区切りなのですが、char型を1文字だけ出力する部分で
,c, もしくは ,, こう出力したいのです。
, , こうはしたくないのです。
>>195 一般的にはムリ。
条件を限定するなら手段があるのかもしれない。
印字可能な文字だけ出力できればいいのかな。 ってことはそういうロジックでどうぞ、となるんだけど、悩んでるってことはそうでもないのかな
>>197 何がはいっていたら、というよりも
printfの引数としても、何も表示されない値があれば知りたいのです
>>199 やはり難しいですか…ありがとうございます。
>>200 char型の中身が出力可能な値であれば、出力用文字列に連結して…といった方法でしょうか
たしかにこれでも結果的に意図する処理は可能となります
>>201 んだから、もしその値があったとして、いつその値を使うの?
常に空も、常に出力もダメなんでしょ?
>>195 char c = 0;
printf("%c", c);
>>203 だめよそれ。
./a.out > foo.dat
として内容をみてみればいい
char outbuf[80]; char c; c = 0; sprintf(outbuf, "%c", c); printf("%s", outbuf); c = 'a'; sprintf(outbuf, "%c", c); printf("%s", outbuf);
>>202 例えば前後に別の文字リテラルが出力されたとして、その間を詰めたい時に
使いたいです
でもそれを条件をもとにprintfを行うかどうかを分岐するのはいやなんだよね
>>205 サンプルコードまでつけて頂いて、ありがとうございます。
文字列に格納してから出力するのが一番簡単でしょうか
その方法でやってみようと思います
>>207 はい、できれば。といっても、2〜3行ソースが増えるだけなんですけどね
いいえ、分岐を行うのが一番簡単で速いです。
210 :
205 :2010/05/21(金) 00:12:11
>>205 の方法にしても0を入れるかどうかの判断が必要なんじゃないか?
と思わんでもないが、納得したならそれでいいや。
階層によっては
>>205 の方が楽に進むこともあるだろし。
>>198 だから何もしなければいい。
カンマを打つロジックは必ず通るだろうから。
>>209 横着してました。その方向でいこうと思います。
>>211 すみません勘違いしてました。そういう意味ですか。
ありがとうございます。
冗談に聞こえるかもしれんが「何もしない」というのは最も最適なコードなんだぜ? 一番速く処理できてバグの入り込む余地も全く無い完全な形。 やらんでいいことはやらないっていう、良い意味での手抜きはどんどんするべきだ。
char c = 0; printf(c?"%c":"",c);
気持ち悪いコードだw
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;
}
プログラムを書かずにプログラミングが上達する道などないと思うのですがね。 本を読むのは必要条件だが、十分条件ではない。
読むだけでは全然上達しないというのはおかしな話だとは思わんか?
俺も224に同意
よっぽどの天才ならともかく、一般人は読むだけじゃその場は理解したつもりになるだけで、 結局は身につかないと思うけど。
>>225 読んだことにより、書ける可能性が発生する、とは思うけれども、それを上達というかどうかは微妙。
読んでも書けないようではね。
とりあえず ・読むだけでも上達するし、実際効率がいい、レベルアップには必須、ただし全く書かないと上達しない ・未経験SE(または唯一日本固有のSEw)のスーパー勘違いがうざい もうこれでいいだろ喧嘩すんなよ
230 :
デフォルトの名無しさん :2010/05/21(金) 18:59:06
読んで上達するのは分析力だよね。でもコーディング力より分析力のほうが世間では求められる
つまり口だけプログラマーですね
プログラマがこんな風に言うのを、何度聞いたことがあるだろう?「簡単さ! 1行修正するだけだ!」
>>230 それはコードを読んで、でしょ?
本なりドキュメントなりを読むことで得られる知識なくして上達はありえないよね。
そういう意味で必要条件と書いているんだろうけど、その知識を得ること自体は上達に含まれないのか?ということ。
ここで質問に答えてる人ってプロなの?
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になったりちんぷんかんぷんです。。。 助けてください。
>>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になったりするソースを載せてみるといいよ
問題おかしくないか? 3人の点数なのに5人分のデーターあるぞ
238 :
デフォルト :2010/05/21(金) 20:56:01
>>236 二つ目の平均点を算出するところなのですが、何度やっても0点やマイナスなったりするのですが。。。
239 :
デフォルト :2010/05/21(金) 21:05:07
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; }
>printf("平均点は%d",average);
printf は "%f" とかの方がよくね?
averageに0を代入する必要はない あと %d じゃない printf("平均点は%lf",average)
>%lf 笑
246 :
デフォルトの名無しさん :2010/05/21(金) 21:30:37
for(i=0; i<=4; i=i+1){ printf("成績を入力してください。"); scanf("%d",&score[i]); } この部分って問題ないの?scanfの悪癖にはまって以来使わなかった記憶が。。
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; } がコンパイルできないんですが・・・・どういうことでしょう? 本当に困ってます。 まじでわからないんですが・・・・ ちなみに改行 行間まで一緒です。 ただカーソルを段落で移動させると動き方が違うんでうしょね あ余計なこといったかな、とにかく何が原因だろ。
>>250 コンパイラにパスが通ってないとか。
なんかエラーくらい出てないの?
253 :
デフォルトの名無しさん :2010/05/21(金) 23:17:04
>>252 睨んでるのは数字、数字が全角か半角とかかなぁ?
全角空白?何それwwいきなりラスボス級の試練とか・・・
見えない全角空白どうやって確認ww
やっぱりコピペとかはやめたほうがいいかな・・・
コピペするなら、ソースよりエラーメッセージをしろよ
>>253 何を言っているかよく分からないが、後者のコードには全角空白が含まれている
全角空白やタブはエディタで可視化出来るだろ
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
>>257 全角半角です。本当にありがとうございました。
>>258 (1)
short n;
の行末の全角空白を削除する。
(2)
a = (double)87654/5 + (double)n;
の行頭の全角空白を削除する。
261 :
デフォルトの名無しさん :2010/05/21(金) 23:37:36
>>260 ありがとうwwwwww
これでやっと4つめいける・・・・・・
これだけで1週間考えたからなw何か
目に滲んでくるわw
>>258 サクラエディタやeclipseは全角空白は □ と表示される。他は知らん
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; } これがうまく理解できません>< 優しく解説してくれるエロい人はいませんか?
>>263 指数部を見ると下から何桁まで利用しているかがわかるので、
それを使って先頭に0が何個必要かを求めてる
>>266 - scanf("%*c%c",c);
+ scanf("%*c%c",&c);
宿題は宿題スレへ
269 :
266 :2010/05/22(土) 00:32:44
270 :
デフォルトの名無しさん :2010/05/22(土) 06:41:26
はあ・・・
271 :
デフォルトの名無しさん :2010/05/22(土) 12:52:28
プログラミングの本ってさ、サンプルがあって、行ごとに何をやってるかが記載されてるんだよね。 でもいいかえれば 他人が作成したコードを見ることにかわりはないんだから、結局本なんて買わずネットで調査すればいいじゃんかと。
いや、やっぱり商業目的で作られた説明と無償のボランティア的な説明とではそれなりに色々違うと思う
273 :
デフォルトの名無しさん :2010/05/22(土) 15:46:19
C言語で1〜10までの範囲でrand関数の値を所得するにはどうすれば良いですか rnd = rand(10) これでいいんでしょうか
すいません。以下のプログラムの最後の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){ ; } }
>>274 assert(static_cast<unsigned char>(EOF) != EOF):
>>273 rand() % 10 + 1
(int)((double)rand() * 10 / ((double)RAND_MAX + 1)) + 1
前者の方が速いが、僅かに偏ったり、場合によって周期が短くなったりすることがある
後者の方が遅いが、どんな場合でも安心して使える
>>274 EOF は負の数だから unsigned char に代入した時点で値が変わる。正しく比較できない。
そのため、無限ループになって配列範囲外にアクセスしている。
なるほど。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; } これコンパイルできなかったんですが・・・ どこらかどうみても どこも間違ってるとこないような・・ どこが間違ってるんでしょう?
VSでやっててプロジェクトの作り間違いとかじゃねえの
いいかげん、全角スペースは飽きた
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 に変えればちゃんと減るのですが・・・。 またできれば対応策もお願いします。
20/40 = 0
286 :
デフォルトの名無しさん :2010/05/22(土) 17:04:19
>>285 280ですがいや意味わかりません・・・
+ -ってなんですか?
この前はscanfで組んだプログラムできたんですが・・
どこが間違ってますか?
>>286 なんで + - しか見ないんだよ。その後ろ見れば気づくだろ。わざとか?
>>276 後者も偏りは出るだろ。
最大値が10の倍数でもないかぎり。
偏りを無くしたかったら振り直し法を使うしかないよ。
んで、Kernighan 先生の本はもう買ったのか? この本は必須だからな。 まず基礎を固めないと、その上に何を積み重ねても無駄無駄。
290 :
デフォルトの名無しさん :2010/05/22(土) 18:31:37
とりあず intでperioikoiと perioikoinとperioikoron を変数名にして perioikoi = 1 perioikoin =1で perioikoron = perioikoi+perioikoinを実行したら 4ってなるんですけど何でですか?
292 :
デフォルトの名無しさん :2010/05/22(土) 18:38:54
>>291 頼むから作ってくれ・・・
他のこと指摘されそうで怖い。頼む
>>292 指摘されたら怖いとか、意味がわからん。
問題の原因が知りたいんじゃないのか?
指摘を恐れる者に成長は無い
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になります 何故でしょうか? 試しに誰か作ってください・・・・・・
>>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
もっと区別のつきやすい変数を使ってくれ
301 :
デフォルトの名無しさん :2010/05/22(土) 19:07:34
>>299 ここにもう一度書くんじゃなくて、コピペしろ
いいか、コピペだ
自分で実行してから聞けよ
>>301 自分でやれよ。 a, b, c でいいだろ。
>>295 まずあれだね変数がみんな似てて見にくいよ
perioikoinが定義されていない
コピペする前にコンパイルしろ。できてない。{
もしかして俺らをおちょくってるとか?
どうせスペルミスだろ
>>299 まず int main(void)下の } を { にしろ。話はそれからだ
悪意の込められた変数名を見れば釣りだってわかるだろ
>>309 そう言ったらコピペしてくれなくなるかもしれないじゃん
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になる・・・・何故?
誰かやってくれませんか?
2になるけど
本当にそれ以外何もしてないのか? さっきコピペしてなかったのを見るに、コード隠してるだろ
OSとコンパイラを教えてくれ
318 :
306 :2010/05/22(土) 19:22:04
どうせコンパイルせずに実行してるとかで、 古い実行ファイルのまま(んでそいつが4を出す)なんだろ。
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がでてきた・・・
>>284 #define で20から20.00にしたら解決した
どもでした。
printfの戻り値は出力バイト数だぞ
>>321 最後までコピペしないのな
教えてもらう気0だろ
327 :
デフォルトの名無しさん :2010/05/22(土) 19:48:43
>>323 そうなんですか?
printfの値そのものを変数にしたいんだよ・・・
printfで
printf()=10とでてきた10そのものの値を
変数 int perioikoi
perioikoi= printf()
みたいにしてperioikoiは10であるようにしたい
どうすれば・・・
何の話をしてるのかわからんw
331 :
デフォルトの名無しさん :2010/05/22(土) 19:53:20
printfが出した数字を変数に代入できないんですか? 色々な値をそのつど変数としたい。
>>327 C++ならprintfをオーバーロードして参照を返すようにしてやればできるけど、Cなら難しいね。
>>331 もしかして
int x = printf("1");
で x が 1 になると思ってるの?
336 :
デフォルトの名無しさん :2010/05/22(土) 19:56:22
atoiでおk
int x = 1; printf("%d\n", x); でいいだろ1行は無理じゃない?しようと思ったこともないわ ていうかたぶん可読性が落ちるからやめろ
>>336 使う関数の仕様ぐらい調べてから使えよ。
で、それなら sprintf() して strtol() すればいいんじゃね?
文字列出力する前に数値で計算したほうがいいと思うけど。
340 :
デフォルトの名無しさん :2010/05/22(土) 19:59:07
printfで出力された値をほかの式で使うにはどうしたらいんですか? 実は判別式条件のプログラム作ってるんです。 ちなみに関大理工ねw あんまり難しい事書くと、高学歴のくせに生意気だと思われるのが 恥ずかしかったんで・・・
釣りか。お疲れ様でした。
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));
>>343 int x = (判別式);
printf("%d\n",x);
はだめなのか?
>>340 聞かれもしないのに自分で高学歴とか言い出すあたり、救いようのないアホだな。
>>340 printfに与えたパラメータを他の式でも使えばいいんじゃないの。
348 :
デフォルトの名無しさん :2010/05/22(土) 20:04:40
>>345 それだ!!!!!!!!!!
わざわざ代入するならprintfで出す必要ないんだ・・・
馬鹿すぎた・・・
ありがとう・・・・
どーしても、ってならprintfを関数なりマクロなりでラップするとか? 正直アホらしいが。
久しぶりにすげぇのを見たな。
351 :
デフォルトの名無しさん :2010/05/22(土) 20:05:58
int myprint(){ int x 〜 printf (〜); return x }
日本語ができないんだから C言語のソースを貼ればいいのに
354 :
デフォルトの名無しさん :2010/05/22(土) 20:09:38
ありがとう・・・・ 本間に感謝してる。 パソコン初心者っていうカススレだと絶対埃がどうのこうの言われて 相手にされてないはず・・・・ ここお気に入りに登録しといた。 また質問する。貰うばっかりですまんけど 答えてることで精神が充実する人がいるなら^^
本間さんよかったね
今度からソースは一言一句変更せずにコピペしろよ
>>340 お前みたいなのが関大とか関大も落ちぶれたもんよ....
358 :
306 :2010/05/22(土) 20:34:53
関大が全部ってわけじゃないだろう、理工学部の…
#include <stdio.h> int main(void) { int a,perioikoi; printf("数字を入力して下さい。:"); scanf("%d",&a); printf((a)?"%d\n":"終わり。\n",perioikoi=a); return 0; } こんなの想像してたw
もうこれでいいじゃん printf("%d\n", ryu = 1); printf("%d\n", ken = 1); printf("%d\n", bega = ryu + ken);
いいじゃんね
362 :
デフォルトの名無しさん :2010/05/22(土) 22:13:00
なんかよくわからんがprintfの結果を変数に代入したいんならsprintf使えばいいんじゃね?
363 :
デフォルトの名無しさん :2010/05/22(土) 22:22:56
error: warning: no newline at end of file どんだけ修正しても最終的に このエラーメッセージが一つ出てきます。 これが出ても実行されて成功するのですが、これでなくするためには どうしたらいいですか?
書いてあるだろ。英語が通じない人ですか?
366 :
デフォルトの名無しさん :2010/05/22(土) 22:35:07
no …否定 newline …改行 at end of file …ファイルの終わりに 訳して「ソースの最後の行に改行がありません」
だが待て、ソースの*最後の*行に改行がないのは当然じゃまいか
>>367 意味分からん
ソースの最後を改行コードにしろってwarningだろ
だから、[EOF]だけなのは行じゃないって
>>367 警告は「ファイルの最後」に改行がないことを指摘している。
改行まで、が行なんだから、 改行の無いのは行未満なんだよ。 改行はセパレーターじゃなくてターミネーターなんだよ。 「最後の行に改行を付ける」だと、 1行目\n2行目\n行未満[EOF] ↓ 1行目\n2行目\n\n行未満[EOF] こうなるわけだ。
>>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);としたわけじゃないのに・・
\nがなんだか分かって使ってんの?
>>378 \nなんているのか?
scanfなんてつこうたことないから、分からんが
\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になります。 何故でしょうか?
384 :
デフォルトの名無しさん :2010/05/23(日) 00:47:55
最近、浮動小数の時も %d にするのが流行ってるの?
385 :
デフォルトの名無しさん :2010/05/23(日) 00:48:59
訂正 最近、浮動小数の時も %d にするのが流行ってるの? あと %lf を使おう
流行ってないよ。他に見たことあるの?
質問する前に、自分でなんとか調べる癖をつけろよ 入門者がそんなレベルの質問してたらスレがいくつあっても足りないんだよ
>>387 「質問する前に、自分でなんとか調べる癖をつけろよ」なんて書き込みの方が余程無駄。
ここで調べてるんだろ。答える気がないなら書き込むなアホ。
そんな書き込みしてたらスレがいくつあっても足りないんだよ。ドアホ。
なんで%gっていつも%lfにまけてしまうん %lfってなんでそんなにつよいん
>>389 人の時間を使っていることを意識しろよ。
>>389 がっこうのせんせいにでんわするのがはやいですよ^^
394 :
デフォルトの名無しさん :2010/05/23(日) 00:57:45
>>388 Ω ΩΩ< な、なんだってー!!
俺も院の先輩に言われたわwww
>>394 そういう誤解をしている人は入力変換指定子を半分も理解できていない場合が多い
出力時と比べてはるかに高機能なんだけどな
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 型の引数を受け取るように改造しろ
>>396 で、scanfでfを使うように覚えてしまって、出力でもfを使ってしまうと。
lfの流れとまるで同じなんだな
int p = new int[hensu]; この後pを使ってnewで確保した領域のサイズを得るにはどうしたらいいですか
ポインタのアスタリスクとアンパサンドについて質問します。 *をつけるとその実体 &をつけるとそのアドレスを示すことは理解してます。 以下の場合、最後の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エラーが出ます なぜなのでしょうか?
関数の戻り値の型があなたが隠してるけど、intだから。
402 :
400 :2010/05/23(日) 08:14:46
補足です
XXX関数の戻り値はPTEST型とします。
>>401 関数の戻り値はintではなく、PTEST型です。
>399 int *p = new int[hensu]; だよね? 結論から言うと、pから確保したサイズを得ることはできない。 hensuを保持しておかなければならない。
404 :
400 :2010/05/23(日) 08:22:27
あ、すいません。なんでもないです。 この質問は終了します。 ソースコードよく読んでないだけでした。すいません
>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型にあわせてるだけでした。
中身だけ見てたために勘違いしてました。
ほんとに申し訳ない
>>340 >printfで出力された値をほかの式で使うにはどうしたらいんですか?
の意味が良くわからないんですよ。違った角度から説明してもらえませんか?
408 :
407 :2010/05/23(日) 11:49:54
終わってたのね、すみません。
?演算子は見づらいけど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; }
>399 ::malloc_usable_size()@malloc.h C言語ならもっと別の方法が2, 3あるけどC++は不便だな
>>410 そういう処理系依存のものは
そう断りを入れて、環境と合わせて紹介するようにしてくれ
412 :
デフォルトの名無しさん :2010/05/23(日) 12:54:45
void *GET_BUF(void) { char *addr; addr = malloc(160); return addr; } 解析中に上記のようなコードみつけたんですが、mallocをオーバーラップして意味あるんですか
>>409 最近、条件演算子でも覚えたのか
iの行方はいかに、()と\nが冗長だな
はい次のかたどうぞ
>>409 2回も5で割るのは無駄だと直感的にわかろうよ
C++ならvector使えばいいだけだろ
常に160バイトのバッファが返される
418 :
デフォルトの名無しさん :2010/05/23(日) 12:59:30
>>416 それはわかるんだけどmallocして使い終わったらfreeで返さないといけないでしょう。
これ絶対リークするよ
>>418 FREE_BUF があればいいんじゃない
420 :
デフォルトの名無しさん :2010/05/23(日) 13:11:44
後気になるのは、addrはローカルなので、その範囲はreturnするまで。 returnした後はaddr領域がメモリから消えてしまう。 mallocで割り当てた領域をGET_BUFの戻り値として返しているか心配です
>>420 それは心配ない
解析とかいうレベルに到達していないね
int foo() { int a; a = 1; return a; } でちゃんと1が返されるのか、 と心配しているのと同じ事だな GET_BUFの戻り値をちゃんと受けて、それをちゃんとfreeしてるなら、リークしない
423 :
デフォルトの名無しさん :2010/05/23(日) 13:16:22
解析歴3年です。コードを見る力は多分にあります
425 :
409 :2010/05/23(日) 13:23:33
>>413 カッコなくてもよかったかw
短いと思って一つずつ\n付けたがprintf("\n");の方がよかったのかな。
iは101だけどなにかまずい?
void FREE_BUF(void *addr) { free(addr); }
原文をよく読めばわかるが、FizzBuzz問題の本質を誤解している人がいる。 あれは、まず解答を紙に書かなくちゃいけない。 なぜなら基本的な文法が頭に入っているかどうかチェックするため。 これだけ単純な問題でいちいち実際にコンパイルが通るか、実行して結果を確認しているようでは 生産性は上がらない。プロとしては失格。 次に制限時間があること。 時間内に仕様通りのプログラムが書けるかどうか、仕事管理能力を見る。 重要なのはこの2点。「基礎知識があること。締め切りを守ること。」 コードがエレガントかどうか、速いかどうかはここでは採点されない。あくまでも試験問題だからね。 出題者の意図を推し量ることができるってのも社会人として重要なスキルだよ。
採点されないことは無いだろ 速くてエレガントなら評価は高い
それは担当者によると思う たぶん、速度やらを見るためのアルゴリズム系の問題は別に出されることが多いんじゃないか? 処理系やデータ構造にも依存してくるし
>>428 これはあくまでも「問題が解けたか、解けなかったか」でふるい落とすための物でしょ
「応募者の99%はコードが一切書けないことに頭を悩ませた」、その結果の産物なんだし
プログラマーとして優秀かどうか以前を見極めるための問題なんだから
1分でエレガントなコードを書いたとして 何も思わない担当者はどうかと思う
>>427 解けない奴を無条件にふるいにかけるだけでしょ
FizzBuzzは使い古されてるから 今時そのまま出す担当者はいないと思うけど
>>431 この問題しってたのか、ぐらいにしか思われなかったり
まあFizzBuzzならそうだろうなw
完全に何も知らないやつを落とすのが目的なんだから知ってたんならそれでいいじゃん 凝ったことをやろうとしてうっかりミスで自滅さえしなきゃ
15の倍数は3の倍数と5の倍数としても扱えばいいのか迷う
このスレって高圧的でコミュ力なさそうな奴多いなあ。
>>417 速度気にするならprintfを使わないトコからはじめてくれよ
「奴」の話なんてどうでもいい
自己紹介
処理系によるのだろうが n%5を変数に入れて使い回した方が速かった
(゚∀゚)アヒャ
>>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;
}
文字化けした
#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; }
>>447 このコード実行してしまったんですが大丈夫ですか?
殺処分すれば大丈夫だよ。
>>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;
}
}
}
}
へ へ|\ へ √ ̄| へ ( レ⌒) |\ ( |\)| |/~| ノ ,__√ /7 ∠、 \ . 丶\ _ __ |\_/ /へ_ \) | | | |∠ | |__ | / ! | | |_〜、 レ' レ' \_./| |/ \ .| |( ̄ _) | ) | | i | へ_,/ ノ ,へ / / ̄~ヽ ヽ. | | フ ヽ、 ノ √| | ! レノ | !. \_ ー ̄_,ー~' ) / /| | | | | |( ノ| |`、) i ノ | | \_ノ ノ / フ ! (~~_,,,,/ノ/ | | | | / / | | . し' ノ ノ | | / / | |  ̄ \\ノ | / / | |___∠-". | | ノ / ノ | /( \_ノ_/ / (____) し' ノ/ / / | 〜-,,,__ ∠-''~ ノ/ (_ノ 〜ー、、__)
454 :
デフォルトの名無しさん :2010/05/24(月) 00:49:23
構造体のメンバーの平均値を関数を用いて計算させるにはどのようにしたらよいですか
>>454 たとえばどんな構造体ですか?
struct a {
...
};
で定義してください。
文字列を配列に入力させ、検索したい文字を入力することで、何文字目に その文字があるかを求めるプログラムを作りたいんですがどうすればできますか?
>>457 とりあえず自分で書いてみないとできないぜ。
>>458 どうすればできるかサッパリわからなくて…
向いてないからあきらめろ
>>459 まずは文字列を配列に入力させるところだけからでもやってみろよ。
#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; } // ちょっとリハビリの積もりで書いた。題意とちょっと違うが別に反省していない。
1から8までの数字を使って毎回異なる数字の羅列を作るにはどのようにすれば作れますか? 例えば 1回目 13254678 2回目 45678123 見たいな感じです
>>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; }
>>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
意味のある乱数は乱数ではない
>>469 遺伝的アルゴリズムよりはカオス理論とかでググったほうが楽だと思う
単に環境に依存しない再現性のある乱数を作りたいならメルセンヌツイスターとか
473 :
デフォルトの名無しさん :2010/05/24(月) 18:37:47
ジャンケンのプログラムなら乱数でいいかもしれんけど、将棋とか碁といった頭を使わないと勝てないような プログラムでは普通の乱数では解決できないような気がします。俺なんか間違ったこといってますか?
>>473 あなたのいう「乱数」の定義をしてください
475 :
デフォルトの名無しさん :2010/05/24(月) 18:39:21
476 :
デフォルトの名無しさん :2010/05/24(月) 18:39:45
物分かりが悪いな
>>468 入れ替え回数を sizeof(s) とすれば、逆に二箇所一対しか交換していないような結果が出にくいのでは。
入れ替え回数を sizeof(s) にすれば一見ばらついているような結果が、たくさんでるだろうが、それはそれで、
「一見ばらついているような結果」しかでない、ある意味偏ったものになりませんか?
要するに、
>>466 のアルゴリズムには理論的な根拠が乏しいかと。
>>473 CPUの手を乱数で処理しようとしているのか。
ある程度の枝刈りを行った上で、候補となる手をいくつか導き、その中から意味のない乱数で選択するのはどうかね
480 :
デフォルトの名無しさん :2010/05/24(月) 18:50:22
>>478 全ての箱に対して公平に全ての可能性を与えてるんだけど、それ以上偏りを無くすってどうするの?
ああ、また難しい話になってきた・・・
>>480 「すべての箱に公平な可能性」というのが、逆に偏りを生んでいるのでは?感覚的にいえば、ですが。
12345678 を並べ替えた結果がどれも 1/8! の確率で発生するように組む必要があると思うのです。
>>478 いや、十分だよ。
入れ替え後、s[0]にはいる要素は
入れ替え前のs[0]〜s[sizeof(s)-1]のどれもがありえて、おのおのの確率は1/sizeof(s)となる。
逆に、増やしたり減らしたりすると、無駄どころか確率が変わってくるから逆にアウト
484 :
デフォルトの名無しさん :2010/05/24(月) 18:56:12
>>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;
}
簡単にするために 123 だけで考えてみる
組み合わせは
123
132
213
231
312
321
の6種のみ
>>466 だと全部で x の取り得る値は 3*3*3=27 通りの組み合わせになる
27通りというのは6で割り切れない
つまりいずれかの組み合わせは他よりも高くなってしまう
ってあれ、よく見てなかったが、 int x = rand()%sizeof(s); は int x = rand()%i; じゃないのか?
将棋は東大将棋にまかせておけ 詰め将棋のソフトやってみたら?
>>466 これって重複してしまう場合があるんじゃないの?
492 :
デフォルトの名無しさん :2010/05/24(月) 19:57:20
496 :
デフォルトの名無しさん :2010/05/24(月) 20:02:57
解決したのかな?
元質出てくるまではスレ違いってことで一つ。
>>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が現れない。
とか?
>>501 総当りの結果に対してその反応ですか。
逆に、もっと試行回数を増やせばそのうちならされるのではないかという考え?
504 :
デフォルトの名無しさん :2010/05/24(月) 20:21:42
>>501 総当りで統計をとって、偏りがあることが明白になり、また偏りのない手法もみつかっているのに、その反応ですか?
バグ取りしただけで鬼の首を取ったように喜んでる奴
というと
>>503 ぐらいか。
あとはバグに気付かず、指摘に対して馬鹿だアホだとわめいてるのが、、複数いたの?もしかして。
508 :
デフォルトの名無しさん :2010/05/24(月) 20:30:54
ところで、 int x = rand()%i; だと0除算が起こるんじゃないの?
逃げたなww
一般的なアルゴリズムでもコピペしろってことですね
偏りに気付きにくいバグの方が困るといえば困るけど、まぁ、どっちもどっちだろこれ
>>506 いや、これは雑感なんですが、デスマーチプロジェクトの終盤になると、バグをみつけた人間がやたらと偉くなって評価が高くなり、
多少のバグがあるにせよ、こつこつとロジックを積み上げてきた人間を踏み潰してしまうことが多々あるんですよ。
そういう実例を目の当たりにしているので
>>506 にちょっと共感しています。
>>491 ,
>>495 崩れてはいけません。
マ板でやれ
けんかすんなよまったく
>>486 をコビペしてやってみたらs[2]に0が入るんだけどなんで?
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;
}
俺は本番稼働前にバグ見つけて袋叩きにあったが。 俺のところがブラックなだけかな。
それはテストを誰がやってるかによるな
524 :
デフォルトの名無しさん :2010/05/25(火) 00:08:56
普通はfor(i =0;i<unko;i++)なのに for(i=0;<i> って書いてる人が居たんだ 何この表記
バグ
528 :
デフォルトの名無しさん :2010/05/25(火) 01:02:50
座標における(x,y)がy>1、y<x-1にあるとき、真として1を出すプログラムって どうするんですか? printf("%d\n",1<y<x-1);でいいんですか?
いいよ
>>528 そのまんま (y > 1) && (y < x - 1) だろ。
そのコードだと (1 < y) < x - 1 になってしまう。
531 :
デフォルトの名無しさん :2010/05/25(火) 01:18:35
答えてくれてありがとうございます&&使うんですねやっぱり・・ あのーもうひとつすいません。グラフ範囲はy>√2かつy<x-1でした。 √使うとコンパイルエラーでるんですが・・・
正しく書けばエラーが出るはずがない
534 :
464 :2010/05/25(火) 01:27:00
みなさんありがとうございます 今起きたら、たくさんレスがついててビックリしました 勉強になりました
535 :
デフォルトの名無しさん :2010/05/25(火) 01:30:42
>>533 すげぇwwその機能ww
ありがとうw
まじで助かった。
√は使えないんだね。
3桁の整数を桁ごとに切り出して他の変数に格納するにはどうすればいいですか? int num=123; から int a[0]=1; int a[1]=2; int a[2]=3; というような具合です
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)入れたら偽だった・・何故だ >=ってあるから等しいときも含まれるので真だろ。何故だ・・・
>>539 scanf() で式の解釈〜計算などはできない。あと、戻り値チェックしとけ。
>539 1/2 -> 0 -> 0. (int)/(int) -> (int) -> (double)
それじゃ通じないでしょ。通じさせる気がないんだろうけど。
王様、馬鹿には通じない文です
1/2 が 0.5 だという誤解。 1/2 は 0 です。スレ見てないけど。
545 :
デフォルトの名無しさん :2010/05/25(火) 02:54:57
>>540 >>541 さんレスありがとうございます。
しかし一体どういうことでしょうか?floatがまずいのかな?
どうしてもx≧√3において√3の場合真と出したいんだが。
あと戻り値チェックとはなんでしょう?
まずいのは入門書も読んでないレベルの頭です
547 :
544 :2010/05/25(火) 02:58:41
まだ、1/2 が 0.5 だと思ってるのか、それが間違ってる。
>>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;
}
--ここまで--
>>545 いったいキーボードから何を入力したのですか?
550 :
デフォルトの名無しさん :2010/05/25(火) 03:13:51
>>543 >>544 >>546 >>547 レスありがとうございます。
そもそもxに代入するとき分数やpow自体代入できません。
scanfにおいてx,y二つ代入するとき、xにpowや分数を代入すると
yを代入できないまま終わります。これだと√3という境界を
含むように√3を代入できなければ困るのですが・・・・・
誰か分かりますか?
>>539 pow(3, 1/2);
ではなくて、
pow(3, 0.5);
とか
pow(3, 1.0 / 2.0);
とかく。理由は入門書をみてくだしゃあ。
>>550 では、キーボードからどういうふうに入力するのを想定しているのですか?
553 :
544 :2010/05/25(火) 03:19:40
>>540 後半はいいこと書いてるけど、前半はマクラ言葉だから意味は無い。視力0.5て書いとけ一応。
540 :デフォルトの名無しさん :2010/05/25(火) 02:20:51
>>539 scanf() で式の解釈〜計算などはできない。あと、戻り値チェックしとけ。
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を交換して・・・という方法です
なんでわざわざ2次元か、1次元配列でいいのでは?
556 :
554 :2010/05/25(火) 03:54:05
>>555 そうですね・・・
1次元配列でもいいです
二次元を一次元に並べなおしてから、また二次元に戻すで、いいにか?
>>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
>>557 2次元変換しなくても大丈夫です
1次元配列だけで
よろしくお願いします
よろしく
おねがい
致します
ので
どうか
ーーーーーーーーーーーーーーーーーーー 宿題は宿題スレで
お願いします
「キューソート」で検索 qsort
0が最終的にあそこに収まるっていうところで、これは普通の代数学ではないのかもしれないよ
>>568 >>540 だろ。
1.0/2.0 = 0.5
1/2 = 0 ... 1
1./2 ?
1/2. ?
573 :
デフォルトの名無しさん :2010/05/25(火) 05:30:32
>>552 みなさんありがとうございます。そうですね
>>552 それが真理ですね・・・√はプログラム上では
無限に少数位が続くから、√3の収束値求めるの無理ですよね。
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; } }
>>575 ループ回数とか、実行結果とか。
なんか、いろいろ怪しい感じがするけど、大丈夫か?
>>576 汚いかもしれません・・・
でも、ちゃんと動いてるので
>>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)が入っている。※論理バグの可能性。
>>578 int nu[]={2,8,5,1,7,6,3};
じゃなくて
int nu[]={2,8,5,1,7,6,3,4};
でした・・・
見てくれてありがとうございます
自力でやる質問者は珍しい
回答者側にまわるのも時間の問題。
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"); }
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 と書くしかないのでしょうか。
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個で済むのかどうなんでしょうか? 簡単な例でお願いします
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; }
関数ポインタの配列でやれば一行
591 :
デフォルトの名無しさん :2010/05/25(火) 18:28:42
>>588 え??
8個じゃないんですか?
じゃぁ10×10×10のときは
caseを1000書くんですか??!?
そうですよ
593 :
デフォルトの名無しさん :2010/05/25(火) 18:31:00
全ての場合をかくならswitch多数使う意味なく、switch何て 1つで十分じゃないですか?
>>593 条件を一つのまとめられて、かつ、swtchを使いたいなら、それでいいんじゃないの
>>586 fが0と1の時とで1p側と2p側をそれぞれ描画させるため、f=0に1を足す感じです。
それでforループの中のfが0から1になったら board_x1 = 70+ZAHYOU_2P_X*f; を更新させたいんですが・・・。
>>593 お前みたいのはbreak書き忘れそうだからif文だけ使え
>>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);
}
>>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);
}
これでなんとかボードの座標を書きこむ場所を一箇所にまとめられそうです。
演算子の優先順位
603 :
デフォルトの名無しさん :2010/05/25(火) 20:02:52
おもしろそうなプログラム〜
>>601 NULL アドレスとその周辺に書き込みしてるから
>>601 別途 int i; を定義して
while(EOF!=(i=fgetc(fp))) {
if('a'!=i)
fputc(i,fout);
}
とかの方がよくないかひ?
>>601 Windows ならダブルクリックで OK.
*BSD や犬糞なら
$ ./a.out
で OK.
>char *ch = "a" ; char ch[] = "a" ;とかchar ch = 'a' ;にした方がいいんじゃないかと
>>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、値段はどちらも 一個一円ということで。
小学校出直してきてからプログラミングはじめよう、な?
>>609 int 値段;
int みかんの個数, みかんの値段;
int りんごの個数, りんごの値段;
値段 = みかんの個数*みかんの値段+りんごの個数*りんごの値段;
>>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だぜ
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; }
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; {");} 長すぎますので書けないのでミカン略。 複雑すぎる。でもこれがしたい。お願いします誰か。
>>611 初期化してないポインタにデータ直接突っ込むのはどうかなと
冗談ではなくマジメに言ってます。 しかもボクプロのプログラマーです。
>>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とはできないんで、こうするしかないのですが・・・
何がやりたいのお前
釣られないぞ
>>618 >>619 は違う人だけど、
char* ch = "a";ってのはchに"a"を入れるってことで、
char ch[] = "a";ってのはchに配列を確保して"a"をいれるってことだと思ったんだ
それとも、同じなのか?
626 :
デフォルトの名無しさん :2010/05/25(火) 21:26:06
>>621 いや、構文を理解しないといけないから方法を凝るとかどうでもいい。
使い方を知りたいだけ。簡単にかけようがどうでもいい。
ポインタと配列の違いが分かってない。 一通り入門書読み終わってから独自のことやろうとしろよ。
>>625 char *ch = ...;
と
char *ch;
*ch = ...;
は全く別物
>>627 すいません
気をつけます(´・ω・`)
630 :
デフォルトの名無しさん :2010/05/25(火) 21:29:29
とりあえずπの少数20ケタまでをprintf使わず 変数xとして代入したい。どうしたらいいんですか?
631 :
601 :2010/05/25(火) 21:31:41
みなさんありがとうございます
なんとか実行できるようにはなりました
しかしどうやら同じ行にaがたくさん入っていると最初のaしか削除されないみたいです
>>608 もそうでした
どうやってすべてのaを検索し、削除したらいいのでしょうか
>>628 char *ch = "a";とchar ch[] = "a";は同じってことでいいのか
>>630 double でも15桁の精度しかないぞ
10桁の場合なら
x-=fmod(x, 1e-10);
>>634 じゃあなんでchar *ch = "a";がおかしくないって言えるのさ
637 :
デフォルトの名無しさん :2010/05/25(火) 21:43:58
>>633 floatで15ケタならどうしたらいいですか?
何故intの場合
a = 1とかできるのに
floatは
a = (%.15f=M_PI)とできないのですか?
このaを自由に使いたいのに・・・
a = printfとはできないですからね。
>>636 まあいいや、どっちでも
今までたまたま動いてきたんだろうが
>>637 もしかして文字列と整数型の区別できてないんじゃない
>>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ケタどうしますか?
>>637 float の精度は7桁
a=M_PI;
にしたくない理由は何?
643 :
デフォルトの名無しさん :2010/05/25(火) 21:53:42
>>642 それは言いたくないです・・
とりあえず桁を設定したいんです。
644 :
デフォルトの名無しさん :2010/05/25(火) 21:54:28
制度は7ケタ程度でいいです。 お願いします。
>>638 > char *ch = "a";とchar ch[] = "a";は同じってことでいいのか
ちがう、が、両方とも思ったように動く。たまたまではない。
>>638 char *strstr(const char *s1,const char *s2);
constで引数とってるからだと思うよ
流れと関係ないけど関数でreturn "";って大丈夫だっけ?
>>647 戻った先で読むだけで書き換えしなきゃ大丈夫
>>645 たまたまだよ
>>646 そのconstはstrstrの中で引数はいじられませんよ、ってだけでは
(1)
>>601 を
>>607 にしたらコンパイルできない。
(2)
>>625 について、
char* ch = "a"; は、ポインターchを文字列定数へのポインターで初期化する。(文字列のコピーは発生しない)
char* ch[] = "a"; は、配列chを文字列"a"で初期化する。(文字列のコピーが発生する)
>>632 char *p = "aaaa";
どこかにある"aaaa"というデータの先頭のアドレスをpに入れる
書き換えはよろしくないので
char const *p = "aaaa";
にするべきだがコンパイラはこのことについてはなにも言ってくれない
char a[] = "bbbb";
aの配列を適切な大きさにとってそこに"bbbb"を書き込む
aを書き換えてももとの"bbbb"には影響しない
>650 >char* ch[] = "a"; は、配列chを文字列"a"で初期化する。(文字列のコピーが発生する) char ch[](ryの間違えかな >1-651 char ch[1] = "a";の場合はどうなるんですか
rand()で得られた値をバッファを使わずに逆順に出力する方法ありますか? rand()が11 22 33 44って返してきたら 44 33 22 11と出力する感じで
文字列として小数を保存しておいてascii文字のまま一桁ずつ計算する処理を書けば何桁でもいけるね俺様天才
>>650 >char* ch[]
これじゃコンパイラ通らんわな
>>652 >char ch[](ryの間違えかな
そうだね。
>>651 "aaaa"がまず取られるってことか、納得
書き込みしなきゃどっちで書いてもいいか
>>650 の訂正
(2)
>>625 について、
char* ch = "a"; は、ポインターchを文字列定数へのポインターで初期化する。(文字列のコピーは発生しない)
char ch[] = "a"; は、配列chを文字列"a"で初期化する。(文字列のコピーが発生する)
>>653 一旦どこかに保存する必要がある
あなたの想定している 「バッファ」 以外に保存すればできる
661 :
デフォルトの名無しさん :2010/05/25(火) 22:38:28
>>642 とりあえず精度7ケタのfloatで表す方法ないですかねぇ?
>>652 > char ch[1] = "a";の場合はどうなるんですか
配列に収まらないのでコンパイルエラー
>>657 得られる値の総数が不明なので予めバッファを確保しておけないのです
>>660 「バッファ」 以外ってなんです?
>>653 void func(unsigned n) { unsigned r = rand(); if(n != 0) func(n - 1); else return; printf("%lu ", r); }
無理ですた
動的にバッファを確保したらだめなの
>>665 終りの合図が来るまで総数が不明だからいくつバッファを確保したらいいかわかりません。
乱数に順序などあってないようなものなので前から順に出力しても別にかまいませんよ
668 :
デフォルトの名無しさん :2010/05/25(火) 22:48:30
b = M_PI a = (%.7e=b) はだめなのですか?マジレス希望。
>>667 乱数というのは例えばなんで実際は意味のあるデータのリストなんです。
正順からしかアクセスできない長さ不明のリストを逆順に処理したいんです。
rand呼ぶたびに動的にバッファを確保してスタックにpushして終わりの合図が来たら全部pushすれば いいだけだと思うんだが。まだ知らされてない設定があるのかな。
>>670 いやいや!バッファを使わないのが最初の設定なんで!
>>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言語使わないとだめなんで。
趣味でやってるわけじゃないんで。
誰か〜・・・
>662 試してみましたか 規格書は読みましたか
>>669 標準関数使わないで、自作していいなら、それぞれ正順、逆順に
乱数を計算するルーチンを作ればいいだけだけどな。
679 :
デフォルトの名無しさん :2010/05/25(火) 23:00:48
>>678 じゃぁ宿題できねぇ・・・
複雑な計算できないじゃん。
>>677 乱数はどうでもいいんです!
「正順からしかアクセスできない長さ不明のリストをバッファを使わずに逆順に処理する」
このアルゴリズムがあったら知りたいんです!
681 :
デフォルトの名無しさん :2010/05/25(火) 23:05:53
floatの存在意義がわからん。 doubleという高精度実数型があるしそっち使ったほうがよくね?
長さ不明の時点でバッファを使わない処理は俺には無理
>>682 長さ不明でもリストを辿っていくとちゃんと終りが来るんです。安心してください!
>>683 リストの終わりまでまず空読みして、サイズを求めることだな
リストの末尾を表示してpopを繰り返せばいいだろカス
>>684 それじゃ結局バッファ必要じゃないですか!スカポンタン!
そもそもバッファって何を示してるの? 配列に代入するまでのテンポラリーのことを指してるのか 配列自体のことを指しているのか
>>685 勝手にリスト削除したら管理者に怒られるでしょが!
ひどい質問が増えたな
このプログラムで目的を達せられないの? #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; }
バッファバッファうるせえ奴だな
>>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 ] );
}
こんな感じで。
できれば再帰じゃなくてループでうまいこと出来ませんか!
動的確保しちゃいけない理由が分からん
numsはバッファじゃねーのかよカス
バッファなんて規格にない言葉使うなよ
>>686 だから、空読みだよ
int i = 0;
while(list[i++] != END_OF_LIST);
とか
で、iだかi-1がサイズだからその後に
1番上と1番下をswap
2ry
ってやれば、バッファはlistの要素1個分の変数で済むわけだ
>>663 > 得られる値の総数が不明なので予めバッファを確保しておけないのです
何のために逆順にするの?
>>693 環境がミニマムだったり規約でヒープ禁止だったりするじゃないですか!
>>697 ツリー構造で葉から根に向かって処理するときとかですよ!
ツリー構造ってアクセスは根>葉の順番でしかアクセス出来ないでしょ!
お前らいい加減釣られてることに気がつけよ
>>696 いいですね!でもリストの値書き換えるの禁止でした!すいません!
>>674 なんか全然無関係の事してるんだがそれ。
> char ch[1] = "a"
がどこにも出てきてないぞ。
>>676 試してない。codepadでやってみたらエラーにならないね。
とりあえず手元にK&RしかないんだがP.273より
> 配列が固定したサイズをもつ場合には、初期値式の数はその配列のメンバーの数を越えてはならない。
>>701 だったら写し先に逆順で入れてきゃいいだろ
サイズわかったんだから
これでいいのかな。まだ知らされてない設定があるのかな。 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; }
こういうことです! 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は禁止です!
>>704 リストに逆順にアクセスしてるやないか!
正順でしかアクセス出来ないと言っとるだろ!
>>702 "a"は'a'と'\0'だから、問題ないんじゃない?
typedef struct list{ int num; struct list* next; }list; な片方向リンクドリストだとして、先頭を void func(list* dec){ if(!dec)return; func(dec->next); printf("%d,", dec->num); } に渡すってのでどうなんだ。リストが長いとそのうちコケるが。 まぁリンクドリストじゃなくて配列でも同じ事できるよな。
const int nums[]の開始アドレスを取得できないかな
nums
>>679 よく分からんが、精度の高い円周率がほしいということでいいの?
なら計算すればよくね?
>>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;
}
>>716 きっさまあああああああああああああ!!!
まぁ、ガチスレじゃないからどうでもいいけど >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' }; 細かいことだけど、誰も規格書を読んでないという悲しさ 以後、精進せよ
>>699 ツリー構造の探索は再帰を使ってる?
それならスタック遡るだけでいいよね。(この場合スタックがバッファーなんだろうけど。)
>>718 >>702 のレスはコンパイルエラーになるかどうかが焦点なんじゃないの?
規格で禁止されていることは認識しているようだし。
実際試すとコンパイルエラーにはならないよ(gcc)。
-Werrorつけたら別だけど、そういう話でもないよね。
>>718 t[4] = "abc";ならt[] = { 'a', 'b', 'c', '\0' };ってことでおkじゃないの?
それだと溢れた分は切り捨てろといってるように見えるが、どうなの?
>>681 精度はいらないけどメモリ節約したい場合なんかに使う
数個しか使わないならメモリとか関係ないけど
>>722 溢れさせなきゃいいのさ
ただしお勧めはできない
>715 さすがにそれはおかしい >702が言っているように初期化子リストの要素数は配列の要素数を超えてはいけないのが原則であるが、>718の場合('\000'がはみ出ている)のみ許される訳でそれ以外は許していない 規格引用しろとか言わないでね gccなら-pedantic-errors付ければ分かるよ
あー、ナルがはみ出た場合のみ許可されてるんだ。なるほどなるほど。
けど、それなら
>>718 はなぜこの場面でそこを引用したのかが分からなくなるな。
規格を読んでいるつもりだが理解できていないがゆえに適切な引用ができなかったんだなぁ。 精進せよ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; としたりしますが、これについて解説お願いします。 メモリにはバイトの領域が確保されますか?
>>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);
}
>>729 BYTE 8ビット
BIT.NOV 3ビット STR4-0 各1ビット
が同じレジスタ
いつも思うんだけどビットフィールド使うよりマクロか関数でビット操作した方がわかりやすいしよくねぇか? ビットフィールドにする利点なんて存在するの?
>>731 なるほど。わかりました。
変数名のよこの:はなんでしょうか
ビット数だろ?
unsigned charとしておきながら実体は3bitだったり1bitだということですか?
>>734 だめじゃん
通信とかの規格絡みの構造体作るときに、怠けられること
まあマクロでいいかな
「コンパイラよりもオレの方がうまく出来る」って奴はマクロ使えばいいと思うよ^^
いやアセンブリだろ情熱的に考えて
>>740 コンパイラよりうまく出来るかは分からんが、コンパイラより間違わないわな
コンパイラより間違わないわな
すげえな。もう15年ちかくやってるが、いまでもコンパイラ先生にはよく怒られるぜ。
今時マクロなんて使わないで頂きたい
今時Cなんて使わないで頂きたい
職業PGなら、ビットフィールド禁止の人多いんじゃない?
>>729 ビットフィールドへのアクセスで実際に発生するメモリ読み書きの回数は
実装依存になるんで、 ハードウェアのレジスタに直結してる値を
ビットフィールドにするのは危ない。 よく確認してから使うべき。
たから、マイコンメーカーがコンパイラとヘッダファイルを提供してるんだろうが。
つらいですね
>>651 これ↓って、
>char const *p = "aaaa";
これ↓の間違いではないのでしょうか?
const char *p = "aaaa";
そりゃ大変だ
[1] 授業単元:プログラミング基礎 [2] 問題文 キーボードから読み込んだ整数のうちの偶数の和の計算を続け、もし2回連続して奇数が読み込まれたら、それ以降は奇数のみの和の計算に切り替える。 そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して偶数の和と奇数の和を表示させる。 [3] 環境 [3.1] OS: Mac [3.2] コンパイラ名とバージョン: cc [3.3] 言語: C [4] 期限: 5月27日
宿題はスルーでお願いします
>>758 仕様がよくわからないのですが、下の??に値を入れてもらえます?
Input Number: 2
偶数の和=??、奇数の和=??
Input Number: 3
偶数の和=??、奇数の和=??
Input Number: 3
偶数の和=??、奇数の和=??
Input Number: 3
偶数の和=??、奇数の和=??
Input Number: 2
偶数の和=??、奇数の和=??
Input Number: 3
偶数の和=??、奇数の和=??
Input Number: 3
偶数の和=??、奇数の和=??
>>764 Input Number: 2
偶数の和=2、奇数の和=0
Input Number: 3
偶数の和=2、奇数の和=0
Input Number: 3(ここから奇数のみの和に切り替え)
偶数の和=2、奇数の和=3
Input Number: 3(奇数が連続したのでここで終了)
偶数の和=2、奇数の和=3
じゃないのかなー
>>758 インターフェースのデザインとして不格好だと思う。
いくらテキストベースでも、いくら練習問題にしても、操作方法があまりにも直感的でなさすぎる。
まず、使う人間に対して
「今、偶数を入力した」、「今、奇数を入力した」を、
「わざわざ意識しなくても使えるような前提」(プログラムが偶数、奇数の判断をする)
なのにもかかわらず、
処理を切り替えたり、結果を表示する等の『モード変更』の段階では、
使う人間に対して、「自分が入力した数字が偶数なのか?、奇数なのか?」を判断させている。つまり「暗黙に暗算」をさせている。
これは使う上でのストレスになる。
モードの切り替えは偶数、奇数ではなく、「数に関係ない記号」としての00や01を用いるべきだと思う。
(たとえテンキーしか使えない前提であっても)
宿題の内容にケチつけるなよ 不毛すぎる
>>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 回答してもらえないならば黙っててもらえますか?
目障りです。
こいつ最高に臭い
(ノ∀`)アチャー
キリッが抜けてるぞ
>>770 釣りじゃないなら俺が適当に予想した
>>765 の挙動でいいのかどうかを教えてくれないか。
それをもとにコーディング済ませちゃった人もいるんだ。
778 :
デフォルトの名無しさん :2010/05/27(木) 00:34:08
caseの名札の部分は決まった数字じゃないとだめなんですか? 例えば名札の部分をswitch(x)で名札の部分を(1 < x && x < 10) とかできないんですか?
780 :
デフォルトの名無しさん :2010/05/27(木) 00:40:37
>>779 では1≦x≦10のときxに対して関数f(x)
10≦x≦20のときxに対して関数g(x)をする
構文何ですか?whileですかねぇ?while使ったけど
できませんでした。どうやりますか?
782 :
デフォルトの名無しさん :2010/05/27(木) 00:42:06
CプログラマはPHPなんて3日で習得できるほど優秀って本当ですか?
783 :
デフォルトの名無しさん :2010/05/27(木) 00:45:43
>>781 ありがとうございます。何故whileはだめなのでしょうか?
あとwhileでやるとコンパイル成功してもバグっってカーソルが
出てきたまま止まったり、printfを中に入れると、ずらずらーと
永遠に同じ計算が出てきてこれもばぐるのですが何故ですか?
>>783 さすがにエスパーでないので分かりません
>>777 あっちでもこっちでも時間があるときしかしないよ。
最近このスレは馬鹿が増えたな 質問する前に本でも読んで考えろよ
逆にPHPプログラマはC言語習得するのにかなりかかるらしいな 覚えるだけならCのが楽だと思うんだが
789 :
デフォルトの名無しさん :2010/05/27(木) 00:59:15
791 :
デフォルトの名無しさん :2010/05/27(木) 01:12:30
>>790 i<6「-1」は
>>790 さんが付け足したもののようですね
とりあえず、なぜ-1で正常になるのか、もう少し考えを練ってみます
ヒント有難うございます
>>791 ループ内で[i+1]にアクセスしているから、ループ終端がi<6だと配列をオーバランしてしまう。
793 :
デフォルトの名無しさん :2010/05/27(木) 01:23:56
>>792 たしかに、コンパイルした結果も最後の数値はムチャクチャでした
一応、ちゃんと表示されるようになりましたが
なんかきちんとソートできないので、もう少し作り方を考えて見ます
794 :
デフォルトの名無しさん :2010/05/27(木) 01:30:44
>>787 本読んで分からないからここきたんだろww
C言語で英語の小文字とか大文字a,b,c.A.B.Cなどを使う必要が出てきた ということは全てchar型で変数を取るということなのでしょうか? int やfloatではアルファベットあつかってませんよね?
おっぱいを1cm大きくするプログラムを書いてください
#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型ってことですか?
再帰はループに書き換える事ができるから必要というわけではないよ 書くのが簡単になるだけ
基本的に文字はchar型で扱うけどintなんかに入れることもたまにある
>>798 フィボナッチ数列で必要になる。
部分の処理を全体の処理と同じアルゴリズムで処理できる場合に、必要ではないが、簡単に書けるようになるのでよく使われる。
フィボナッチ数列はむしろ例としては良くないんじゃ 素朴に再帰で書いたらコストが跳ね上がるタイプの問題なんだから
フィボナッチ数列は再帰で記述するから存在意義があるわけで、再帰で書かないなら存在意義は無い。
フィボナッチ数列は定義から再帰で書けるが、普通は書かない 再帰だと関数の呼び出しを何度もしなくちゃいけないから糞遅くなるしメモリもその分消費する 普通に繰り返しで書いた方がずっと速い
何が「普通」なのか不明だが、フィボナッチ数列が再帰の例題以外の用途に出てくることは普通ではないし、フィボナッチ数列に速さを求めることはさらに普通ではない。
ハノイの塔の問題を解くなら再帰が圧倒的に簡単
フィボナッチ数列、あるいはそれのある項を求めたい時に再帰なんて使わないよ 再帰でも記述出来るのは事実でも、どんな時に使うかという質問の答えとしては不適切だな 例題としてあって、しかもそれは効率が悪いということを示している つまりどんな時にも使わないと言ってるようなものだ
// 配列 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 と同じことを、ループで書こうとすると、すごく難しい。
ハノイをループで書くとどうなるの?
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週間考えて分かりません。
815 :
795 :2010/05/27(木) 03:09:47
charにscanfに数字を代入することはできないんですか? 100とか30とか。どうなんでしょう?本当にすいません・・ くだらない質問かもしれませんが一週間悩んでます。
817 :
795 :2010/05/27(木) 03:28:34
>>816 ありがとうございます。
誰か分かりますか?char型のscanfには数字代入できるのですか?
できないんですか?
>>815 できますよ。
char a;
scanf("%c", &a);
printf("%d\n", a);
100を入れるときはdと入力してくださいね。
つーか日本語変
820 :
795 :2010/05/27(木) 03:35:44
>>818 ありがとうございます
1000を入れるときは?100はdに対応してたのですよね?
では743,1000など文字に対応してない数字は?
>>820 1000はcharに入りません
743,1000もcharに入りません
>>817 んー、できるといえばできるのですが。
#include <stdio.h>
int main() {
char c;
scanf("%d", &c);
printf("%d\n", c);
return 0;
}
/* end */
コードを書いてお話したほうが意図が伝わりやすいと思うのですが‥‥‥。
>>820 char は -256〜+255 までしか格納できないので、その範囲をはずれるような数値を扱いたいのなら、別の型を使用します。
>>822 おもいっきりアウト
charに対してint分のデータを書き込むことになる
>>824 あはは、-128〜127 でしたね。すまそ。
>>828 >>818 は 'a' とか 'b' とかをキー入力したときに、そのアスキーコードが入るコードでしょう?
そうではなくて、'100' とキー入力したときに、100が char で宣言された変数に入るコードはないのでしょうか。
>>822 ではだめでしょうか。
>>817 がそれを求めているかどうかは、ちょっとよくわかりませんが。
コンピューターが理解できるのは数字だけで、しかも、その数字は、なんと驚くべきことに、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コードも、原理は同じです。 数字と文字の対応表にすぎません。
>>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() ではできない。」
のですね。
>>768 亀レスになるけど、この場合、テーブルで管理したほうが判りやすいし柔軟性がありますよ。
サンプルコードは、
>>835
>>821 入る環境もあるだろ。
char は 1 ビットであるという定義しかない。
CHAR_BIT マクロが 8 とは限らない。
>>829 Alt 押しながらテンキーで入力。
#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; }
書き間違えただけだろ。 char = 1 バイト バイトのビット幅は 8 とは限らない。 昔のメインフレームとか。 C の規格に機種依存する部分はないから 環境依存するビット幅は CHAR_BIT に定義されてる。
>>835 そこをついてくるレスはあるだろうなとは思ったが、charは1バイトね。
あとどうせならEBCDICではdが100にならないという突っ込みも一緒にしてほしいところだな。
ちなみにその昔のメインフレームでは何ビットだったの?
>>829 で、Alt + テンキーはもう試したか?
[Alt押す]→テンキーで 1 0 0 →[Alt離す]
PC/AT 初代からこの機能はあるからな。
本来は CP437 の 256 文字を入力するためのものだが、
S-JIS コードでもなんでも入れられるぞ。
分かったらさっさと寝ろバーカ!
>>829 で、Alt + テンキーはもう試したか?
[Alt押す]→テンキーで 1 0 0 →[Alt離す]
PC/AT 初代からこの機能はあるからな。
本来は CP437 の 256 文字を入力するためのものだが、
S-JIS コードでもなんでも入れられるぞ。
>>787 俺が最初初心者質問したのがいけなかったみたい
ごめんね
どれが 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}}; これってどっちが正しいのですか? それは、どのような理由なのですか? 以上、宜しくお願いいたします。
int a[LINES][COLUMNS] だから、{{2, 3, 4}, {5, 6, 7}}; が正しい。
「だから」って、理由になってねぇよw
↑ いやその説明でわからないならCは諦めるべし
LINES=行 COLUMNS=桁 てことだよ。
>846にはint a[2][3][4]の場合の説明を是非お願いしたい。
852 :
846 :2010/05/27(木) 09:12:59
>> 910 int a[2][3]は、intの3個の配列の2個の配列だから。
基礎質問止めてくれ 入門書で勉強してから来い 面倒くさいわ
>846にはint a[2][3][4][5]の場合の説明を是非お願いしたい。
int a[2][3][4][5][6][7][8][9][10] ↑ コピペ用
4次元以上の配列だと途端にイメージが湧かなくなる
int a[2][3][4] □ x 4 { □□□□ } (□□□□) x 3 { □□□□ □□□□ □□□□ } (□□□□ □□□□ □□□□) x 2 { □□□□ □□□□ □□□□ □□□□ □□□□ □□□□ } コンニチワ ワタシタチ ハ タイヨウケイ ニ スンデマス
>>858 int a[2][3][4][5][6][7][8][9][10]の場合の説明を是非お願いしたい。
>>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つ並んでいる配列 となる。しかし、どこかが間違っている。
内から外へ a a[2] a[2][3] int a[2][3] a is array of array of int
[1,2,3] [3,2,1] [3,4,5] [2,6,8] [1,5,0] ・ ・ ・ と、値を保存していきたいのですが効率のよい保存方法はありますか? いちいち変数を定義するのも無駄が多い気がして
>>863 レジストリ。
ini ファイルでもいいな。
>>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
一次元ならともかく、多次元配列となると関数の受け渡しが複雑すぎて非常に扱いづらい。 まぁ関数に渡さなければいいんだが。
関数に渡すときは、先頭アドレスを char * にでもキャストして渡せばいい で、使うときに必要に応じてキャストすればいい Cは必要なだけの手間で出来るのがいいところ
>>866 じゃあレジストリより高効率な方法を挙げてみろよ。
872 :
デフォルトの名無しさん :2010/05/27(木) 20:45:17
>>870 >関数に渡すときは、先頭アドレスを char * にでもキャストして渡せばいい
一次元配列になら対応してそうだけど多次元はchar **とかもっと複雑な型を作らないといけなくない?
ポインタに貴賎は無いよ。二次元も三次元も平等
>>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;
}
Cでは配列へのキャストは出来ないよ。
;printf("%d\n", ((int *)[N][N])a[0][1][2]);
>>874 void f(int a[][N][N]) {
printf("%d\n", a[0][1][2]);
}
まちごた 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;
}
>>879 >>878 でうまく行くよ
一見見にくいキャストだが、ちゃんとシグネチャが一致しているとわかるはず
881 :
870 :2010/05/27(木) 21:37:08
って878で出来てるじゃん・・
882 :
デフォルトの名無しさん :2010/05/27(木) 21:54:10
forとwhileどう違うんですか?何回分かりやすい解説書よんでもわからん・・・ do、for,whileの違い何ですか?全て同じ条件である限りプログラムを実行し続ける って構文じゃないですか?
884 :
デフォルトの名無しさん :2010/05/27(木) 21:56:59
885 :
デフォルトの名無しさん :2010/05/27(木) 21:57:24
while(x) と for(; x;) は同じ。 do while(x) はループの1回目は必ず実行されるという点で、上記と違う。
886 :
デフォルトの名無しさん :2010/05/27(木) 21:58:21
その一回目を実行するという意味が分からないんです・・・ どういうことですか?一回目って何のことでしょう?
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回も実行されない*/
892 :
デフォルトの名無しさん :2010/05/27(木) 22:07:38
>>890 全く意味がわからん・・
具体的に例で教えてください。
みかん1個1円、りんご1個2円、簡単プログラムで頼む。
ソースみても分からんから日本語で頼む。まじ頼みます。
むいてないから死ねばいい
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
breakは北朝鮮襲来だな
> 何回分かりやすい解説書よんでもわからん・・・ 分かるのか分からないのかはっきりしろ
900 :
795 :2010/05/27(木) 22:24:42
>>898 分かりやすいとされている解説書を読んでも、一回実行するってのが
何を意味してるか分からない。頭悪い事は開き直らさせてくれ。
ソース見てもわからん人間がどうやってソースを理解するつもりなんだ
{}の中の命令を実行するんだよ
>>900 使えるPCにまずはCコンパイラをインストールして使えるようにするんだ
話はそれからだ
904 :
795 :2010/05/27(木) 22:30:19
>>903 それはしてる。
{}の中の実行ってのはwhileやdoやforの中の条件を満たすまでするってこと
でしょ?
最初の?何それ?何の最初なの?みたいな・・・
解らないとか明らかに釣りだろ。 先に判定するか後で判定するかってだけじゃねえか。
906 :
795 :2010/05/27(木) 22:36:24
もう死にたい・・・わからなさすぎる。 死にたい、誰か助けてくれ。
do{ A }while( B ); Aを実行してBで判定してまたAへ while( A ){ B } Aで判定してからBを実行してまたAで判定 ってだけじゃないのかよ
根本的に素養がないんだよ。あきらめれ。
死にたい人を助けようにも、助けたくないよに1000ペリカ
>>904 条件を満たす限り実行する、な
for ( ; ; ) {} と while () {} はまず条件を判定し、真なら {} の中を実行する
do {} while (); はまず {} の中を実行してから条件を判定し、真なら継続する
つーか実際に書いてみれば「誰でも」わかる簡単なことだ
911 :
795 :2010/05/27(木) 22:46:34
>>906 人類の発展から遅れた脳みそを持ったディスアビリティな人もいることを
理解してくれ。完全に左脳しか働かない脳みそだ俺は。
俺の脳みそスキャンにかけてほしい。
>>907 ありがとうございます
do{A}while(B);のAを実行するってのはどういうことですか?
Aは勝手に決めていいんですか?
試そうとせず聞こうとするのは理解したいのではなく構ってほしいだけなんだと思う
>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 式を計算?実行とどう違うのですか?
計算したら条件変わるんじゃないですか?
ここまで複雑だと何が結果で何が条件か
全くわからん・・・・
>>915 みかん1円りんご2円というのは、(おそらく)ループ条件に入れるべき要素ではない
これらを使って何がしたいんだ?って話だ
俺も30過ぎたらここまで頭固くなるのかと想像したら怖くなってきたわ
三角形の面積を求める問題を出されて「なんで底辺×高さ/2が面積になるんですか」って言われてるような感じだな
>>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なら終了
>>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か。
>>925 アルコールでも飲んでるんじゃないのか?
それか、
我々には見えないものが見えているんだろう
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がかぶるから・・
>>915 例1
while (おなかすいた) {
みかんをたべる
}
例2
do {
りんごをたべる
} while (おなかすいた);
例1では、お腹が空いてるあいだ、みかんを食べつづけます。
最初からお腹がいっぱいなら、最初からなにも食べません。
例2では、考える前に、まず1回りんごを食べます。 そしてお腹が空いてるあいだ、ずっと、りんごを食べつづけます。
最初からお腹がいっぱいでも、お腹に関係なく、かならず1回はりんごを食べます。
何か、C スレにも C++ スレにも凄いのが居座ってるなw
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
_←こんなんが出てきてフリーズするんだが何故だ?
コンパイルできたのにフリーズって意味がわからん・・・・
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 ↓ 無限ループ
なんであっちのスレでは!を付けるんだ?
941 :
デフォルトの名無しさん :2010/05/27(木) 23:49:11
キャラ作り
すいません!同一人物は嘘です!調子こきました!
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
単に文法の基礎知識が無いだけじゃないか。 入門書1冊読んでこい。
952 :
795 :2010/05/28(金) 00:09:38
>>950 ありがとう・・・
つきあってくれてありがとう。
「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 ありがとうございました
でもコンパイルできません。。。orz
>>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;
}
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; }
>>961 ありがとうございました
なるほど、forの中でiを定義してもだめですね。。
ちゃんと関数の頭のほうで定義しないとw
963 :
デフォルトの名無しさん :2010/05/28(金) 00:37:01
>なるほど、forの中でiを定義してもだめですね。。 単にコンパイラが古いCの仕様を使っているだけ。 新しい仕様では全く問題ないよ。
>>963 なんだか大学の授業ではプログラミングを勉強してもうまくできないな。。。
みんな独学してるかね
課題の中でいつも勝手に見たことないものが出てきてる
>>964 あたりまえだ。
知ってることばかりなら教わる必要ないじゃん。
>>965 でも教えてないことを出すのは困るよww
大学通ってて……。予習復習があってこその講義だから、授業出ても無駄かと。 大抵学則の単位認定の項目に、学外での準備も単位に含まれるなどと明記されているはず。
1から10まで手取り足取り教わるのは義務教育だけのはずなんだが 今は大学受験も小学生みたいに教わってくるから 大学入って挫折する人が多いね。
970 :
デフォルトの名無しさん :2010/05/28(金) 00:50:01
以下、自分もできていなかったことをアドバイスするオヤジたちの書き込みが続きます。
自分でもc言語を学べるサイトのおすすめはありますか
>>974 ありがとうございました
これは助かります
PCに向かえる貴重な時間は手動かすことに費やすべきかと。 知識の収集は適当に本1冊買って移動時間やその他のすき間時間でこなさないともったいない。
現在XORによる計算を行っているのですが、 BOX[1]=-51(10進数) これを16進数で表示すると printf(%x,box[1]); 結果:FFFFFFCD と表示されてしまいます。 これを16進数でCDと表示するにはどうすればよいのでしょうか?
>>978 printf(%x,box[1]&0xff);
結果は正しい。どうしたいのかわからん。 FFF…の部分が間違いだと思ってるんだろうが、正しい。
>>980 下2桁だけ表示したいんだろ
顧客の隠された要望を正確に汲み取るのも
プログラマの仕事の一つだぜ
>>979 出来ましたありがとうございました!
printfの最後にそうやってつければいいんですね。
box=box+1みたいなことやってて出来ませんでしたw
>>980 暗号化などで使うんです
-1=FFFFになるのは大丈夫です。
どうもありがとうごxざいました。
>>980 今、もう一度読み直してみたらどうみても説明不足でしたよね…
出力結果:
255 -1 →FF FFFFFFFF
となりますが、16進数表示で→FF 1
と表示したかったんです。
エスパーレスしてもらえたので助かりましたが。
984 :
983 :2010/05/28(金) 02:33:59
>>983 出力結果を書き間違えたので忘れてください…
FF 1じゃなくてFF Fですよね。
もう黙ります。
スレ汚しすみませんでした。
あるサイトのSDKに関する記事の引用ですが 「メモリの管理を自分で行わなければならず、メモリの確保・開放忘れにより、アプリケーションやOSが 不安定になるアプリケーションが作成できてしまいます。」 ↑ これの意味はちょっと良くわからないのですが スレ違いかな?
>978 色々情報不足なのだが、box[N]の型がunsigned charということなら printf("%hhx\n", box[0]); でよい。hhはサイズを指定している。
987 :
デフォルトの名無しさん :2010/05/28(金) 09:47:45
>>978 本当に"%x"でFFFFFFCDって出力された?
変だな、ansi/isoでは"%x"のときは"abcdef"で"%x"のときは"ABCDEF"って決まっていた筈なんだが。
で、BOXとboxの関係がよく判らないけれど、boxがsigned charか暗黙のsignedであるcharのどちらかへのポインタならば
暗黙の型変換でsigned intに昇格してしまっている。強制的にunsigned charにキャストしてしまえばいいよ。
>>988 意味ワカンネ!!
お前こそ %X と %x の違いがわかってないんじゃないか
くらだん揚げ足取りばかりすんな
書きそこねだろ。JK まぁ、%xではabcdef、%XではABCDEFであることには間違いないよ。 要は、>978は他の記述からも判るように大文字小文字を頓着していないんだろうな。
>>990 お前大丈夫か?
それは普通に書き間違えてだってわかるだろ、
それを指摘しようとしたお前でさえ間違えてんだぞ
なんでそんなことに執着するの?????
ただ書き間違えるだけならいいけど、他人の書き間違えを嬉しそうに揚げ足取ってるやつが 書き間違えてると、バカだなあと思う。
まぁまぁ、そんなに粘着するなよ。照れるじゃないかw
ソースと出力結果をコピペしなかった質問者が悪いんだよ
996 :
994 :2010/05/28(金) 18:18:42
997 :
デフォルトの名無しさん :2010/05/28(金) 18:37:11
すみません。Cをチョコチョコやってる日曜プログラマです。
はじめまして。Cをごくたまにやる職業プログラマです。
Cならできるニートです
うめ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。