1 :
デフォルトの名無しさん :
2010/05/28(金) 01:02:53
★質問に答えず揚げ足とりばかりするのは止めてください。
do for rand()の3つを使って、次のプログラムをかけっていうが分からない。 x軸、y軸平面において、中心(0,0)半径1の円の中の座標を5個ランダムに 表示するプログラム。必ずdo while とforを使えということです。 #include <stdio.h> #include<math.h> #include <stdlib.h> int main(void) { int i; for (i=0 ; i<5 ; i++) printf("%d\n",do{rand(x),rand(y)}while(x^2+y^2<1)); return 0; } これじゃだめですよね。どうしたらいいですか?
strcatで二つの文字を連結したいんだけど間に空白スペース入れるにはどうすればいいですか?
>>4 #include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
double x, y;
srand(time(NULL));
for(i=0; i<5; i++) {
do {
x = 2.0 * rand() / RAND_MAX - 1;
y = 2.0 * rand() / RAND_MAX - 1;
}while(x * x + y * y > 1);
printf("%f, %f\n", x, y);
}
return 0;
}
質問です 入力した文字列を反転して出力するプログラムを作りました #include<stdio.h> #include<string.h> int main(){ char str[256]; //反転前 char str_r[256]; //反転後 int len,i,j; printf("入力>"); gets(str); len=strlen(str); j=len; for(i=0;i<len;i++){ str_r[i]=str[j-1]; j--; } printf("%s\n",str_r); return 0; } これで文字列を入力すると3文字や7文字などの特定の字数のときは問題ないのですが、 それら以外の字数の文字列を入力すると反転した文字列が出力された後に『や・などのゴミがついてしまいます 何故でしょうか?
>>6 うんx^2+y^2>1
?
x*x+y*y<1では?
円の内部ですよ?
>>10 x*x+y*y>1なら円の外部では??
あとRAND_MAX - 1; じゃなくて
RAND_MAX 1;では?RAND_MIN -1;
では?
>>11 もう一度よく考えてみて
それでも分からなかったら実行してみるんだ
>>12 実行したら
>>6 はあってるっぽいけど
>>6 は何故そうなる?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
double x, y;
srand(time(NULL));
for(i=0; i<5; i++) {
do {
x = rand()
y = rand()
}while(x * x + y * y > <1);
printf("%f, %f\n", x, y);
}
return 0;
}
じゃだめなんですか?
#include <stdio.h> #include <stdlib.h> int main(void) { int i; double x, y; srand(time(NULL)); for(i=0; i<5; i++) { do { x = rand() y = rand() }while(x * x + y * y <1); printf("%f, %f\n", x, y); } return 0; } どう見ても間違いじゃなさそうなプログラムで実行してみた。 結果× 理由 t.c:14 prase eroor before y クソが。yの前は何もねーのに何がエラーだよ。 意味わかんねーよ・・・
初歩の初歩からやり直せw
その行に何も無い場合は、前行を疑う 特に、ありがちなのはセミコロン抜け
>>16 普通にここが初歩なんだが。
x = 2.0 * rand()
2.0って何だ?あとRAND_MAX -1って意味わからん。
どういう意味?RANDは自由に値を取るのにMAX?
>>5 strcat(a, " ");
strcat(a, b);
>>18 誰がRANDが自由に値を取るって決めたんだよw
>>5 #include <stdio.h>
#include <string.h>
int main(void) {
char a[] = "abcdefg";
char b[] = "uvwxyz";
char c[1024];
strcpy(c, a);
strcat(c, " ");
strcat(c, b);
puts(c);
return 0;
}
/* end */
>>20 RANDは0から10ケタ以上の特定のある整数までの数を自由に動く
乱数だと説明してあった。それなのにRAND__MAXが-1とか意味わかんね。
もう死にたい
RAND_MAXってのはその特定の整数のことな。 (double)rand() / RAND_MAX にすると0から1までの乱数が得られる。 2.0 * rand() / RAND_MAX で2倍すると0から2までの乱数が得られる。 2.0 * rand() / RAND_MAX - 1 で そこから1をひくと-1から1までの乱数が得られる。
24 :
デフォルトの名無しさん :2010/05/28(金) 21:43:29
nの数読み込んだ後にa[n]の配列にn個の数字を入れにはどうすればいいでしょう? r r+1 r+2 ・・・ nと(数字 半角 数字・・・)で一括して読み込みたいのですが scanf()はリターンキー押すまで読み込みませんしn個の%dが置けませんでした
ループでscanf()すればenterした瞬間に一括で読み込まないか?
一列読み込んでから配列に入れる。
x*x+y*y>1でいいの?あってるの?
なんであってないと思うんだw do whileループが何をしてるのかよく考えてみろ
あってねぇよな? 円の公式高校の時習ってないの?
お前は不等式を高校で習ってないのかw
数学の質問じゃなくてプログラムの質問しろやー
32 :
24 :2010/05/28(金) 22:00:24
書き方間違えたorz r r+1 ・・・ nを入力し終わるまで改行をしないで読み込みたいんですが・・・ 下記のように実装したいのですが 1行目 チーム数: 6(ここでnを読み込み) 2行目 チーム1の成績: 0 2 1 3 4(n-1個の試合数の結果を読み込み) 3行目 チーム2の成績: 0 1 7 3 7(n-1個の試合数の結果を読み込み)
int i, n, a[256], b[256]; scanf("%d", &n); for(i=0; i<n; i++) scanf("%d", a + i); for(i=0; i<n; i++) scanf("%d", b + i);
34 :
24 :2010/05/28(金) 22:08:52
>>25 解答きてた・・・
ありがとうございます
早速試してみます
35 :
24 :2010/05/28(金) 22:11:38
>>30 x*x+y*y>1だと円の外部の条件でしょ?
俺は内部の条件と言ったんですが。
>>37 ワロタww
だかれそれは円の外部の条件だろうがww
ちょww
何で
>>5 で上手くいくんだよww
不等式逆にしたら外部になった。
whil()は()の条件の間って意味だろ
何故だww
もうアホすぎるから while 1で常に無限ループさせて、 その中で if then break で良くね?
OKww 分かった。noのとき実行を表示するんだなww 俺馬鹿すぎワロタww。 ありがとう皆。
違う。条件の反対がそのまま真になるから、その条件をみたすまで 模索し続けるってことかw これでも数学偏差値70だからなw まーありがとう。
点を取るスキルだけは立派なんだろうけど 学生のうちに勉強の仕方を習得しろよ
サヴァンかアスペか知らんけど、かわいそう
46 :
デフォルトの名無しさん :2010/05/29(土) 02:15:41
>>4 必ず一定時間で終了する。
#include <stdio.h>
#include <stdlib.h>
#define _USE_MATH_DEFINES
#include <math.h>
int main(void)
{
for(int i = 0; i < 5; i++){
double r = (double)rand()/RAND_MAX;
double th = (double)2*M_PI*rand()/RAND_MAX;
double x = r*cos(th);
double y = r*sin(th);
printf("[%d] x=%f y=%f\n", i, x, y);
}
do{}while(0);
return 0;
}
Fランが好んで使うレトリック→「点を取るスキル」 いや、お前がFランなのは、点を取るスキルがないからではなくて、お前の頭が悪いからだからww
>>46 極座標か。「ランダム」の意味にこだわる人には受け入れがたい結論だ。
>>47 いやいや人を勝手にFラン認定するなよ
テストの点も取れるし、お前よりは頭もいいと思うよ
点を取るスキルってのは確かにあるのに
それが分からないの?
ww←これ使うやつの方が頭悪そうに見える
void main() (笑)
52 :
4 :2010/05/29(土) 02:27:50
てか2ちゃんやってて役に立つ板は質問板、娯楽ではAA板他はそうそうない。 ここはこれから4年卒業するまで使わせてもらうから。 ここ2週間ここで質問しなかったら本当大変な事になってる。 感謝してる。10歳の女の子のセックス動画持っててお前らに見せてやりたいが 逮捕されるんで控えとく。お前ら本当にありがとう。
53 :
4 :2010/05/29(土) 02:29:42
ここはプログラマーが多いのかPC触ってる人多いのでレスも早い。 絶対に逆ギレだけはしないようにするからこれからも付き合ってくれ^^
自分で面白いと思ってやってんのか、寒過ぎ
55 :
4 :2010/05/29(土) 02:31:50
開き直って荒らしても成長しないぞ
ああ、えらくテンパってるから教えようと思ったけど解決してたか。
式だけ見ると円の外を示す条件になってるからコード見るのに不慣れだと間違えるんだろうなって思った。
>>52 なんかそのようなの前も見た気がする。よく来てるんですね。
58 :
4 :2010/05/29(土) 04:01:56
61 :
4 :2010/05/29(土) 04:47:09
>>59 いや数学だけは偏差値高かった・・
だが理科が苦手w何でだろうw
プログラムって理科的なのかな?
今日から2日間家にこもって48時間
プログラム課題に取り組むお("・ω・`)しんどいわー
がんばるわー
数学できるようなヤツはそもそもこんなところで質問なんかしない
Lispの括弧のような意味が「w」の中に秘められているのだろうか
>>61 >理科
中学生か。どおりで自意識過剰なんですね、よくわかります。
>>65 高校だと、化学・物理・地学・生物だよな〜。
理科総合ってのが……
>>52 3年間、と本当のことをいったらいいのに。
このようなプログラムがあるとき、配列の範囲外に書こうと していることを検出する方法はないでしょうか? #include <stdio.h> int i[5]; int main(void) { int *iptr; iptr = i; iptr[5] = 10; printf("%d\n",iptr[5]); return 0; }
>>70 出来ない。なおC++でも出来ない。
#include <stdio.h>
int i[5];
int main(void) {
int *iptr;
const int i_size = sizeof(i)/sizeof(*i);
iptr = i;
if(5 < i_size){
iptr[5] = 10;
printf("%d\n",iptr[5]);
} else puts("ERR");
return 0;
}
配列へのアクセスをクラス化して中でチェックするとか
73 :
70 :2010/05/29(土) 10:30:14
そうですか。。 おかしな挙動をしているプログラムのバグがこのパターンだったのですが、 デバッグに凄く苦労しました。gdbのwatchが超便利でなんとか原因がわかった のですが、なにかもっと的確に判る方法がないものかなと思っています。 どうもありがとうございました。
配列はvectorに統一する これならVC++は常に範囲チェック自動でする
メモリ確保量を調べる関数がある。 _msize・・・ ヒープに割り当てられたメモリ ブロックのサイズを返します。 これ使うと安全に書き込める場所が判明するけど、はじめの確保量よりでかい。 さらにここの数字の数倍を書き込んでも異常停止しない。 なのでデバッガで発見するのは無理だ。
76 :
70 :2010/05/29(土) 10:51:19
すみません、もうひとつ教えて下さい。 70のようなバグは何か名前がついてますか? こういうのはバッファーオーバーランとは言わないですよね。 なんと表現したらいいんでしょう?
ERROR_NOACCESS 998 メモリ ロケーションへのアクセスが無効です。
>>74 固定長でも常にvectorというのは流石に無い
boost::array使え
79 :
デフォルトの名無しさん :2010/05/29(土) 13:31:05
すんません これのコアダンプ理由と対策をおせーてください // fff.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 3 typedef struct { char b[30]; } stSub; typedef struct { char a[30]; stSub *sub; stSub *sub2; } stMain; void func2(stSub **sub){ stSub *p; int i=0; *sub=(stSub *)calloc(MAX,sizeof(stSub)); p=*sub; for(i=0;i<MAX;i++){ sprintf(p[i].b,"hoge_%d",i); } //printf("%s\n",p[0].b); } つづく
80 :
デフォルトの名無しさん :2010/05/29(土) 13:31:48
void func(stMain **main){ int i=0; stSub **tmp[MAX]; stSub *tmpSub; *main = (stMain *) calloc (1,sizeof(stMain)); strcpy((*main)->a,"fugafuga"); /* 一つ目*/ func2(&(*main)->sub); for(i=0;i<MAX;i++){ func2(&(*tmp)[i]); } (*main)->sub2=(stSub *)calloc(MAX*MAX,sizeof(stSub)); tmpSub=(*main)->sub2; for(i=0;i<MAX;i++){ memcpy(tmpSub,*tmp[i],sizeof(stSub)*MAX); tmpSub+=sizeof(stSub)*MAX; } } int main(){ int i=0; stMain *main; func(&main); printf("main=%s\n",main->a); for(i=0;i<MAX;i++){ printf("%s\n",main->sub[i].b); } for(i=0;i<MAX;i++){ printf("%s\n",main->sub2[i].b); } }
81 :
デフォルトの名無しさん :2010/05/29(土) 13:33:31
関数内で動的に構造体とその中の構造体配列を確保しようとしてるんですが・・・・ freeしてないのは無視してください
gdb使えよ
>>78 そっちがないだろ。標準装備で動くようにすべき。わざわざboostいれて使い分けるのは不便。
>>80 書き方が気持ち悪くて読みにくい
func2(&(*tmp)[i]);
tmpSub+=sizeof(stSub)*MAX;
85 :
84 :2010/05/29(土) 13:49:51
stSub **tmp[MAX];
86 :
デフォルトの名無しさん :2010/05/29(土) 13:51:05
>>84 本当ですね
あなたの顔みたいに気持ち悪くて読みにくいですね・・・・
てか、スレ違いじゃね? > fff.cpp
88 :
デフォルトの名無しさん :2010/05/29(土) 16:53:17
回答する気がない人はスルーします
前スレでも言った気がするんだけど、このスレって素直にアドバイスすりゃ良いだけなのに一言多い奴がいるよな。 いちいち噛み付いてたらアドバイスされる方も心穏やかじゃねーだろ。 っていうか一体どんだけ性格悪いだよw
お前がなw
大抵の質問は普通に答えられてる
>>4 みたいなアホとかずうずうしい教えてくんが煽られてるだけ
>>89 ここはQがボケてAが突っ込むっていうネタスレだろ
ソースファイルの文字コードは何を使っていますか?
96 :
デフォルトの名無しさん :2010/05/29(土) 19:25:04
UTF-8
ASCIIが最強
ASCIIなら、UTF8もSJISもEUCもコード一緒。サイズ一緒。
99 :
デフォルトの名無しさん :2010/05/29(土) 19:30:46
ソースファイルの中でASCII以外の文字を使うとき、文字コードは何を使ってるの?
自分はSJISかUTF16だ。windowsがこれしか対応していない。
えっ
>>101 "\x01\xFA"などバイナリデータを直にソースへ書けば
扱えるのはSJISかUTF16LEのみだろ。
EUCやUTF8の日本語を書き込んで、それがコメント以外なら最終的にはUTF16LEに変換される。
ですよねー
たとえば、ファイルへのパスがUTF8で表現されていて それをcharかwchar_tの配列へ転送しても正しい操作はできないが。 UTF16LEをwchar_tの配列へ転送すればアクセス可能
LINUXならば、UTF8のパスデータを配列へいれたら、正しい操作ができる。 それがwinとの違い。ベースコードは設定で変更可能かもしれない。
ASCII には ¥ なんて無いぞ。 それは ASCII じゃなくて JIS七単位符号だ。
windowsの\区切りが非常識だな。 /で世界統一すべき。
ですよねー
printf("あほ/n");
問題: 79,80のコードを、初心者でも読めるような簡単な形式に書き換えろ
void func( const char* fmt, ... ) { printf( fmt, ... ); } みたいに可変長引数をそのままprintfに渡すこと出来ますか?
他の言語なら出来る
vprintf
>>111 fmtに"%s"とかを入れるってことか
知らんわあ
600851475143という数字が32bitOSでオーバーフローするんだけどしない方法ある?
>>117 long long を使う
double を使う
多倍長整数を使う
>>117 600851475143進数を使えばいいよ。"1"と表現できるようになる。
long long だな
10だろが。しかし600851475142の表現が長くなる。
アホかおまえは
16bitのshort型変数があります。 例えば 0xABCCだとすると上位3バイトの値を変えずに、下位1バイトの 0b1100を0b1010とするような演算をしたいんですが、どうしたらいいでしょうか?
>>124 #include<stdio.h>
int main(void)
{
unsigned short x=0xABCC;
printf("x=%X\n", x);
x=(x&0xFFF0)|0xA;
printf("x=%X\n", x);
return 0;
}
下記のプログラムがなぜ正常に動くのか分かりません。 if(r)のrにはscanfの戻り値(0か1)が入るんですよね? なので自分的にはこの場合if(r == 1)が正しいのではないかと思うのですが。 #include<stdio.h> int main(){ int i = 0; int r; r = scanf("%d", &i); if(r){printf("整数%dが入力されました\n", i);}//入力が整数の場合 else{printf("整数以外が入力されました\n");}//入力が整数意外の場合 return 0; }
>>126 いきなりEOFがきたら r==-1 になる
で?
r==1 が正しい
r==1だったらrが2の場合できなくなるんじゃね?
任天堂とライセンス契約するとSDKとエミュレータもらえるからそれPCに繋いでソフト作るんだよ。 C言語とC++使えるよ
>>130 r は変換に成功した数だから
>>126 の場合には EOF か 0 か 1 しか返らない
135 :
126 :2010/05/30(日) 00:39:42
「10日で覚えるC言語」に載っているプログラムなんですが、 一日考えてもif(r)の意味が分かりません。 「rが○○だったら〜をする」なら分かるのですが、 この場合「rだったら〜をする」ですよね?意味分からなくないですか? でもプログラムは正常に動くからきっと自分の考えが間違ってるんだと思うのですが。
>>135 if(r)は、「rが0でなければ」だよ。
if(A) { B } else { C } Aが0以外だったらBへ Aが0だったらCへ
>>124 16ビットは2バイト。 バイトじゃなくてニブル。
2を引く。
>>135 俺もC言語始めるって時に知恵袋で「10日で覚えるC言語」進められたんだけど、
実際のところいい本なの「10日で覚えるC言語」って?
付け焼刃みたいな知識のための本なら買う必要ないよ。Cほど普及してる言語ならネット上に情報が溢れてるし 10日で覚える〜は知らんがCの絵本ってのは糞だったな
初心者はガンガン参考書買った方がいい。日本経済的に。
>>136 ,137
そういう意味があるんですか!
ありがとうございました!!!!
ずっともやもやしてたのでとてもスッキリしました。
>>139 自分は全く知識も無く、本屋で目立つところにあったから(10日で覚えられるし)買ってみました。
正直3日分やるのに何十日も掛かってます・・・。
今回の事も本に書いてなかったし。
>>140 その後、文字ばかりで飽きてきたのでCの絵本を買ってしまいました・・・。
int r; if(r)〜みたいな書き方って俺は避けるけど、実際の現場だと結構使われてるね
>>143 日本経済に貢献したんだ、良かったな
とりあえずコードを書いて見ていろいろ試そうな
148 :
126 :2010/05/30(日) 01:11:47
>>144 なるほど、参考になります。
>>145 はい。がんばります;
自分は通勤中に本を読み、帰ってから実践するという毎日なので書籍は重宝してるのですが
かばんに入る小さなノートPC買ってWEB見ながらプログラム書いたほうが勉強になるのかな。
>>147 書いてるけど?
何で書かないと思ったの?
通勤中にプログラム書くと頭がおかしくなって死ぬ
152 :
126 :2010/05/30(日) 01:27:33
言葉に重みがありますねw これを理由にVAIO Pとか欲しいと思ってたのですがやめときます。 知識が無いから良い本なのかすら分からない。何かお勧め無いですかね。
153 :
デフォルトの名無しさん :2010/05/30(日) 01:31:03
>>143 意味があるというか、判定式の返り値が、偽なら0で真なら非0ってことだよ
だから、本来ならif(r != 0)ってした方がいいと思う
printf("TRUE: %d\n", 1 == 1);
printf("FALSE: %d\n", 1 == 0);
TRUE: 1
FALSE: 0
>>154 自分にとっては if(r) は頻出イディオムだから if(r!=0) より読みやすい
もちろん 0 に意味があるなら 0 と比較するけど
156 :
デフォルトの名無しさん :2010/05/30(日) 01:48:33
>だから、本来ならif(r != 0)ってした方がいいと思う 思いだけは頂いておくわ。
if(r != 0)の方がいい、とかいうのはC言語知らないだけだから 気にしないでいい int変数以外にも、ポインタがNULLでないことを判定する場合に if(p) みたいな書き方することも多いので、さっさと慣れたほうがいい
>154 FALSEが0なのはいいとして、TRUEを1とするかどうかは注意して考えた方がよい。 偽は0, 真は1ではなく非0だから。TRUEと等しくないから偽とはならない。 そう考えると0と比較しなくてはならない。そうすると if (isHoge != 0) ・・・ と書くことになるが、否定形の文章が読みにくいように、否定のコードが読みにくいことが多い。 真偽を表すことが明確ならば if (isHoge) とかく方がよいと思う
if(isHoge == TRUE) や if(isHoge != TRUE) は止めた方がいいという流れで、 if(isHoge == FALSE) や if(isHoge != TRUE) は止めた方がいいとはならない。
if(isHoge == FALSE) や if(isHoge != FALSE) も基本的に止めた方がいい 意味的にその方が読みやすい場合は例外だが、滅多に無い
#define NOT(x) !(x)
#define OR || #define AND &&
#define TRUE FALSE
C系の言語の ! は目立たないのが難点。スペースを空けずに if(!p)とか書くと ! の有無がぱっとわからない。 ベル研がDECのミニコンじゃなくてIBMのミニコンを導入していれば、 否定演算子がPL/Iみたいに¬になっていたかも。 もっとも、それはそれで-と区別しにくいけど。
if (! p) と書けばいい
!が離れてると落ち着かないなw
↓スペースや改行についての宗教論争開始
コメント入れれば解決w if(!p){//これは否定 }
終了
落ち着かないけどlやiと紛らわしくはなくなる
配列データをテキストファイルに保存するにはどうすればできますか?
fopen for(int i=0; i<sizeof(array); i++) { fputc(array[i], fp) } fclose
そのまま順に読み込んでBASE64にかえれば? バイナリをそのまま出力するところで、base64を間に入れる。 バイナリでは駄目なんでしょ。
改行はともかく空白を有効に使えないヤツ結構多いよな if(!i) よりも if ( ! i ) のほうが明らかに間違えずに読み取れると思うが タイプ量のためだけに詰めるという自己中だらけ
別に空白打つタイプが億劫なわけじゃないだろ (´・ω・`)が( ´ ・ ω ・ ` )だとウザいだろ
>>175 その辺は自分が読むときに整形ツール通せばいいだけ
そもそも読みにくくしてるのは括弧な気がする pythonみたいに括弧が無ければ読みやすい if !i: と if i: が違うのはすぐ分かる。もっとも、pythonでは if ~i: だけど
==を=にしたことはあってもif(!i)を読み間違えたことはないなあ
!iとiならともかく if(lfdsafsdfasd)とif(!fdsafsdfasd)の区別はどうだろうか
そんな変数名にするヤツが悪い……と思ったけどシステムハンガリアンだとありえるのか
182 :
デフォルトの名無しさん :2010/05/30(日) 18:21:54
183 :
デフォルトの名無しさん :2010/05/30(日) 19:46:17
初心者です。 ある関数で代入された変数を他の関数で使いたい時どうすればいいんでしょうか? 変な質問ですいません。
185 :
デフォルトの名無しさん :2010/05/30(日) 19:58:33
int main(void){ int a[10]; return 0; } void func(){ int b[10]={1,2,3,4,5,6,7,8,9,10}; return 0; } これでmain関数の方にb[10]の値を出したいって感じです。
int main(void){ int a[10]; func(a); return 0; } void func(int* array) { int b[10]={1,2,3,4,5,6,7,8,9,10}; for(int i = 0; i < 10; i ++) { array[i] = b[i]; } return 0; }
187 :
デフォルトの名無しさん :2010/05/30(日) 20:04:59
>>186 ありがとうございます!ちょっとやってみようと思います。
>183 大きく分けると3通りの方法がある 1) 大域変数を使う static global; foo() { global = 128; return 0; } /* fooで代入 */ bar() { return global; } /* barで使う */ 2) スタティックな変数とポインタを使う foo(p) int **p; { static q; q = 128; *p = &q; return 0; } /* fooでqのアドレスをpにいれてやる */ bar() { int *p; foo(&p); return *p; } /* barで使う */ 3) staticな変数を返す foo() { static x; x = 128; return &x; } /* fooで代入し返す */ bar() { int *p; p = foo(); return *p; } /* barで使う */ 値だけ使うんならもっと楽だけど
189 :
デフォルトの名無しさん :2010/05/30(日) 20:19:07
>>188 ありがとうございます!勉強になります。
get送信する方法教えてください。
193 :
デフォルトの名無しさん :2010/05/30(日) 21:29:49
SendGet()
ソケットで送ればいいよ。
get送信についてネットで調べればOKです
というほどのもんでもないと思うけど。
キーボタンAを押すと同時に他のキーボタンBも押し、キーボタンAを離すとキーボタンBも離す といったプログラムを作りたいのですがどうすればいいのでしょうか
ここで質問するよりネットで調べた方が直ぐにわかるよ
検索するのは最後の手段
すでに最後だ
>>201 最大値を更新する際に、その添え字を記憶しておく。
>>201 for( j=1 , max = 0 ; j < 10; j++) if( array[max] < array[j] ) max = j;
printf("一番大きな数字は%d回目です",max);
>>209 だからお前いっつも空気悪くするのいい加減自重しろ
バカはスルーしろよw
自分じゃ問題解けないからって、横から茶々入れるだけの人って何が楽しいんだろうな。 自分の書き込み見返してあまりのバカさ加減に死にたくなったりしないのかな。
と、問題が解けずに無意味な書き込みしてる奴が言ってもな・・・・
ああ、自分のミスを突っ込まれて大恥かいても「ん」の一言で済ます人かw あんだけ厚顔無恥なら生きるの楽しいだろうな
バブルソート知らなかったうえに、引用元のwikiすらまともに読めない低脳だってことを さらしてたら、俺だったら宿題スレに再臨なんかできないけどなw
開き直って生き恥を晒し続ける
>>219 は良い反面教師だね
あれは正しいほうが途中で諦めなかったからなんとか認めさせることが出来たけど、 かなりひどい態度で理解力だったぞw
>>217 ん、バブルソートのときは、「あれま」と思いましたが、まあ、それはそれ。
たしかに昔に比べると無恥になりましたが、それもたくさん宿題をといてるので、ひとつくらい大失敗をやらかしても、と考えるようになりました。
楽しくなりましませんが、楽にはなりました。
225 :
デフォルトの名無しさん :2010/06/01(火) 21:05:08
日本語も不自由なようです。
>>224 単純に知らなかったことよりも、指摘された後の態度の方が問題
宿題の題意も誤読すること多いし、知能低いのにプライドばっかり高すぎ
何の話してるか知らないけど、両方とも消えてくれない?w
>>226 ん、確かに誤読は多いことは認めますが、指摘されたらその都度変更をかけています。それが問題でしょうか?
所詮、宿題スレ。知能が高いところじゃないですし。
プライドが高い?んー、そう見えますかね。
言い訳と負け惜しみばっかりだなw
このコテハンと
>>230 が延々にスレチやってるだけじゃん。消えろ馬鹿
目くそ鼻くそだろ
C言語の魅力は何でしょうか? やはりポインタですか?
少ないメモリで早く動く気がするところ
>>235 つまり、C自体の魅力は特に無いが
たまたまCに触れる機会が多かっただけということでしょうか
うるせえな
人間にとっての魅力というより機械にとっての魅力だよ
結局は「機械にとっての魅力」が その人にとっての魅力と思えるかどうか、という所に行き着くと思います。
241 :
デフォルトの名無しさん :2010/06/02(水) 01:10:30
C言語を学ぶ前にアセンブラから勉強したほうがいいでしょうか。 アセンブラ知らずにCのポインタでつまずく人ってたくさんいそうなので。
そんなくだらん質問してるヒマがあったらプログラムの一つでも作れ
244 :
デフォルトの名無しさん :2010/06/02(水) 01:20:12
int main(void) { char *str = "aiueo"; str = "hoge"; str = "sample"; puts(str); /* "sample"が表示される */ return 0; } char *str = "aiueo";で初期化したアドレス、str = "hoge";で代入したアドレスが 分からなくなりましたが、リークするわけでもないので、別に気にしなくていいですか
246 :
デフォルトの名無しさん :2010/06/02(水) 01:21:47
>>243 ポインタとはメモリ上のアドレスを指し示すもの。*を使って関節参照とかできる。
この点は、アセンブラでは*の代わりに()をつかうだろ。それと似てるから参考にはなる。
247 :
デフォルトの名無しさん :2010/06/02(水) 01:23:16
>>245 サンクス。勉強になりました。これで心落ちなく眠れそうだわい
249 :
デフォルトの名無しさん :2010/06/02(水) 01:30:03
>>248 241、244、246、247は同じです
250 :
デフォルトの名無しさん :2010/06/02(水) 01:31:54
基本情報処理の午後の部でアセンブラを少しかじった程度ですが、 Cを効率よく学習するんだったらアセンブラから先にやっといたほうがよかったかなぁと思いました。
自分がCのポインタで躓いてると思うのならやれば?人がどうとか関係ないだろ
252 :
デフォルトの名無しさん :2010/06/02(水) 01:36:31
253 :
デフォルトの名無しさん :2010/06/02(水) 01:36:57
確かにアセンブラをある程度やってからの方がCのポインタはすんなり理解できるだろうな。
6502 がオススメ。 まあ別に 65816 でも良いけどな。
はあそうですか
先生 ポインタがわかりません
読んで字のごとくpointするものです。
Javaしかわからん、、、
char****************************************************************************************
変数の位置を覚えるもの それだけ
初心者はそのような考えでいいかもな
262 :
デフォルトの名無しさん :2010/06/02(水) 08:04:04
263 :
デフォルトの名無しさん :2010/06/02(水) 08:05:43
264 :
デフォルトの名無しさん :2010/06/02(水) 08:09:21
最後の一つです。
ttp://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0047 ↑に対してなんですが
int main() {
char i,j,cup[3]={0,0,1},t;
while(0<=scanf("%c,%c",&i,&j)){
t=cup[i%3];
cup[i%3]=cup[j%3];
cup[j%3]=t;
}
for(i=0;i<3;i++){
switch((int)cup[i]){
case 1:
if(i==0)
printf("B\n");
if(i==1)
printf("C\n");
if(i==2)
printf("A\n");
break;
default:
break;
}
}
return 0;
}
も通りません。お願いします。
問題見てないけど、 >while(0<=scanf("%c,%c",&i,&j)){ これはダメだろ
>>262 直線の公式はax+by+c=0の形を使えよ
無駄な条件分けしなくてよくなるぞ
>>263 while(2==scanf("%d,%d",&tkane,&tmono))
printf("%d\n%d\n",kane,int(((double)mono)/((double)t)+0.5));
俺の環境では、rint使えないけど↑でどうかな
昔のpostgres(1996年くらい)のソースに マクロ定義で、 src/backend/access/index/indexam.c ---------------------------------------- #define GET_REL_PROCEDURE(x,y) \ CppConcat(procedure = relation->rd_am-> ,y); \ if (! RegProcedureIsValid(procedure)) \ elog(WARN, "index_%s: invalid %s regproc", \ CppAsString(x), CppAsString(y)) ---------------------------------------- 何てのがあるんですが、 relation->rd_am-> ,y) の部分、->の右辺がないんですが、どういう意味になるんですか? 今のgccでコンパイルしようとすると does not give a valid preprocessing token て怒られるんですが、 今のコンパイラの仕様だとどういう表現が妥当なんでしょうか??
>>270 そうじゃなくて、
CppConcat(procedure = relation->rd_am->y); \
が正しい
/* * CppAsString * Convert the argument to a string, using the C preprocessor. * CppConcat * Concatenate two arguments together, using the C preprocessor. * * Note: the standard Autoconf macro AC_C_STRINGIZE actually only checks * whether #identifier works, but if we have that we likely have ## too. */ #if defined(HAVE_STRINGIZE) #define CppAsString(identifier) #identifier #define CppConcat(x, y) x##y #else /* !HAVE_STRINGIZE */ #define CppAsString(identifier) "identifier" /* * CppIdentity -- On Reiser based cpp's this is used to concatenate * two tokens. That is * CppIdentity(A)B ==> AB * We renamed it to _private_CppIdentity because it should not * be referenced outside this file. On other cpp's it * produces A B. */ #define _priv_CppIdentity(x)x #define CppConcat(x, y) _priv_CppIdentity(x)y #endif /* !HAVE_STRINGIZE */
わぁ、なるほどそこまでみてませんでした。 x##y の表現がなんか問題になってるっぽいですね。
275 :
デフォルトの名無しさん :2010/06/02(水) 19:20:44
char *str = "hello,world"; printf("%p\n",str); /* @ */ str1 = "test"; printf("%p\n",str); /* A */ str1 = "hello,world"; printf("%p\n",str); /* B */ 上を実行させるとAは@とは異なるアドレスが表示されて予想通りでしたが Bは@と同じアドレスでした。 いったい何がおこってるのかさっぱりわかりません。
276 :
275 :2010/06/02(水) 19:21:43
ミスった。こっちです。 char *str = "hello,world"; printf("%p\n",str); /* @ */ str = "test"; printf("%p\n",str); /* A */ str = "hello,world"; printf("%p\n",str); /* B */
同じ文字列なんだから同じとこから読んだほうが無駄がないだろ?
細かいな
279 :
275 :2010/06/02(水) 19:42:11
#include <stdio.h> int main(void) { char *str1 = "hello,world"; char *str2 = "hello,world"; char *str3 = "hello,world"; char *str4 = "hello,world"; char *str5 = "hello,world"; printf("%p\n",str1); printf("%p\n",str2); printf("%p\n",str3); printf("%p\n",str4); printf("%p\n",str5); return 0; } 異なるポインタ変数に渡しているのにアドレスはどれも一緒でした。
そりゃ、同じアドレス渡してるんだから当たり前、としか言い様がないが。
どうせ書き換えられないんだから 同じアドレスでも気にする必要ないと思うが
282 :
275 :2010/06/02(水) 19:56:27
不思議だ。 無駄がないといえば無駄がないが。"hello,world"のアドレスを意識せずにそのまま使えるし・・。
ポインタと配列の違いくらい身に付けてから書き込めよな
この場合、ポインタと配列の違いは関係ないけどなw
>>282 同一のリテラルを同じところに配置するかどうかは自由だからだよ。
バイナリエディタでexe覗いたら、それほど不思議でもないと思うだろうけど 勉強したかったらCOFFとかPEあたりを読んでみるといいね 一応説明すると、文字列とかは.rdataセクション(読み込みのみ許可領域)に配置されるんだけど コンパイラが同じ物と判断したのは纏めちゃうから、そういう風になる
289 :
デフォルトの名無しさん :2010/06/02(水) 22:32:47
>>265-269 無事に前の二つは通りました。
ありがとうございます。
ただやはり
>>264 がまだ分かりません。
サンプルは通るので、入力の処理は問題ないと思います。
290 :
デフォルトの名無しさん :2010/06/02(水) 22:42:29
じゃあこういうのも 1 つに纏められるかな? char *a="visible", *b="invisible"; あるいはこんなのとか。 char *c="hoge", *d="hoge\0moge", *e="fuga\0hoge";
>>290 なんでこれまでの流れを見て試そうという気にならなかったの?
293 :
デフォルトの名無しさん :2010/06/02(水) 23:11:45
おれのかってでしょ。
良い表現があったので訂正だけしとく、文字列など→同一リテラル
>>289 多分scanfの改行の問題かな、応急処置してみた
while(2==scanf("%c,%c%*c",&i,&j))
296 :
デフォルトの名無しさん :2010/06/03(木) 04:21:54
なんかもういいです。
最後の表示部分が冗長だからかな?
298 :
デフォルトの名無しさん :2010/06/03(木) 06:35:12
>>295 有難うございました。確かに改行の問題でした。
感謝です。
299 :
デフォルトの名無しさん :2010/06/03(木) 07:31:25
305 :
300 :2010/06/03(木) 09:50:47
いや、俺の方がキモい。
いやいや、ここは俺が
307 :
sage :2010/06/03(木) 13:32:42
%dのdって何由来なんでしょう?
>>307 仕様書に名前の由来は書いていないから推測でしかないのですが、
decimal
スレチかもしれませんが RGB値できれいに虹色のグラデーションを表現したいとき どうやってやるのが綺麗でしょうか? やっぱり赤・黄・緑・水色・青・紫をならべて 間の値は線形で変化…とかでしょうか 太陽光のスペクトルみたいに自然な感じが理想です
315 :
デフォルトの名無しさん :2010/06/03(木) 21:21:20
scanf関数は標準関数から外すべきだ。 scanfを連続で使おうとすると、前入力した分の\nが勝手に入ってしまう。 誰だよこのバグ関数作った人は。
\nをお前が入力したからだろ
318 :
デフォルトの名無しさん :2010/06/03(木) 22:13:58
>>317 \n入力しない方法を教えてくれよ。
というかscanfの中にfflushいれとけば解決できんじゃね?
>>318 入力ストリームに対するfflush()は未定義動作だよ
flush は出力だよな。 なんでこれ使おうとする奴は後を断たないんだろ。
>>318 Enterキーじゃなくて、CTRL-D
stdin に rewind( ) するなら、まだ分かるけどな。
犬アピールうぜえ。 シェアは圧倒的に Win が上なんだから 基本的には Ctrl-Z と言うべきだろ。 ガラパOSごときが自己主張してくんなよ。
ガラパOS、、、超漢字のことを悪く言うもんじゃないよ。
スーパー301が無かったら日本は、世界はこんな事になってなかったかもしれんのだぞ
今頃、超漢字の入ったPCを世界中の人が使っていたはずだ
さすがにそれはないが、Tronを使った家電などは日本中に今も稼動している
そういやNTベースのネットワークプリンタとかウイルス感染してたな あれってサービス呼ばないと直せないんだっけか
330 :
デフォルトの名無しさん :2010/06/04(金) 02:47:27
>>328 稼働はしているが、割合も実数も確実に減少している。
1 バイトは 12 ビットにするのがバランス良かったのにな。 せめて 10 ビットは欲しい。 或いは、かな漢字をバイトで表せるように 16 ビットにするという手もあるか。
じゃあwcharでいいじゃんね
いいじゃんね
蓮舫「1バイトにしなければいけない理由はなんでしょうか。2バイトじゃダメなんでしょうか?」
今の ARM シリーズって、実質32ビットバイトみたいなもんだろ? それより細かな単位ではメモリアクセスできないし。
かなりの初心者です いきなり失礼します キーボードから直接入力するif文って #include <stdio.h> int main(void) { int res; printf("文字いれろ\n"); scanf("%d", &res); if (res == 1) printf("はな\n"); printf("んん…\n"); return 0; } みたいに半角数字だとできるんですが、 「あああ」などの日本語だとエラーが出て困ってます char str[100];とかで頑張っても無理でした res って半角英数のみの対応なんでしょうか? あとif には res しか使えないのでしょうか?
>>337 「1 を入れたらこの文が出る」というのはできたのです
『あああ を入れたらこの文が出る』というのができないのです
「あああ」の前に「Hello」ができるようになってから質問にこい。
入力された文字列が「あああ\n」に等しいかをgetch で一文字ずつ見ていく。
>>339 Hello自体は出力できるのですが、やはりifをつけると無理って言われます
その判定してるコードを貼れよ
どんな「エラーがでて困って」いるか言ってみろよ。
>>341 だから半角英数文字列の Hello ができようになってから質問しろよ
それができないのに全角とか無理
345 :
デフォルトの名無しさん :2010/06/04(金) 14:47:35
すみません、C言語をCGIにしてWEBアプリケーションを作ったのですが SSLを導入しようと考えており、その際はベリサインなどに 申し込まないといけないのでしょうか?
>>345 とりあえず動けばよいのなら不要
一般公開して信頼されたいのであればあったほうがいい
限定公開とかなら、クライアント側で個別で証明書をインストールしてもらうことも可能
347 :
デフォルトの名無しさん :2010/06/04(金) 15:09:00
今、調べたんですがプライベート内なら自宅CAとか可能?みたいですね 一応、目的としては商業ホームページで公開する予定です そうですか、となるとベリサインなどに申し込む必要ありですね サンクスですた!
C言語と全く関係ないな…
>>347 ベリサインってたしか試験用に証明書発行してくれる
350 :
デフォルトの名無しさん :2010/06/04(金) 20:36:07
>>336 俺もかなり初心者なのでえらそうなことはいえないが。
scanf("%d", &res); はキーボードから入力された整数の値をresという変数に代入するものです
>res って半角英数のみの対応なんでしょうか?
よってresには半角数字のみ対応です。英数の"英"は対応してない。
「あああ」などの文字列を比較したい場合は、strcmpを使おう。
用途は検索して調べてね
もう今後は初心者は scanf より gets だけ使えよ。
もう今後は初心者は文字列型があって動的型付けの言語使えよ
>>336 #include <stdio.h>
int main(void)
{
int res;
printf("数字を入力して下さい: 1 or 2 : ");
scanf("%d",&res);
if (res==1)printf("はな\n");
else printf("んん\n");
return 0;
}
#include <stdio.h>
int main(void)
{
char res[100];
printf("文字を入力して下さい:");
scanf("%s",res);
printf("%s\n",res);
return 0;
}
/* * This define all the handler that the driver export. * As you need only one per driver type, please use a static const * shared by all driver instances... Same for the members... * This will be linked from net_device in <linux/netdevice.h> */ struct iw_handler_def { /* Array of handlers for standard ioctls * We will call dev->wireless_handlers->standard[ioctl - SIOCIWFIRST] */ const iw_handler * standard; /* Number of handlers defined (more precisely, index of the * last defined handler + 1) */ __u16 num_standard; #ifdef CONFIG_WEXT_PRIV __u16 num_private; /* Number of private arg description */ __u16 num_private_args; /* Array of handlers for private ioctls * Will call dev->wireless_handlers->private[ioctl - SIOCIWFIRSTPRIV] */ const iw_handler * private; /* Arguments of private handler. This one is just a list, so you * can put it in any order you want and should not leave holes... * We will automatically export that to user space... */ const struct iw_priv_args * private_args; #endif };
355 :
354 :2010/06/04(金) 23:27:42
struct iw_handler_def p80211wext_handler_def = { .num_standard = sizeof(p80211wext_handlers) / sizeof(iw_handler), .num_private = 0, .num_private_args = 0, .standard = p80211wext_handlers, .private = NULL, .private_args = NULL, #if WIRELESS_EXT > 16 .get_wireless_stats = p80211wext_get_wireless_stats, #endif }; この . の意味がわからない。 これはどういう効果の演算子なのですか?
手元VC6しかないからわかんないけど、gccの拡張? 多分、構造体のメンバの初期化を名指しでやっているんだと思うんだけど。
指示付きの初期化子はC99なんだからgcc拡張とか言ってやるなよ
普通にCって言ったとき、C99は含まれていないほうが多い気がする。
C99をサポートしてる書籍もコンパイラも限定されてるから
で?
最近「で?」とだけレスするの流行ってるの?
362 :
デフォルトの名無しさん :2010/06/05(土) 00:39:59
流行ってないよ。何で流行ってると思ったの?
よく見かけるからさ
で?
struct iw_handler_def p80211wext_handler_def; p80211wext_handler_def.num_standard = sizeof(p80211wext_handlers) / sizeof(iw_handler); p80211wext_handler_def.num_private = 0; p80211wext_handler_def.num_private_args = 0; p80211wext_handler_def.standard = p80211wext_handlers; p80211wext_handler_def.private = NULL; p80211wext_handler_def.private_args = NULL; #if WIRELESS_EXT > 16 p80211wext_handler_def.get_wireless_stats = p80211wext_get_wireless_stats; #endif つまりこういうこと? だとしたら宣言直後に各メンバに一個一個代入してくように書き換えれば同じ意味?
変数がconstでもメンバの並びが変わっても安心
メンバの並びは関係ないだろ
const付けて初期化してみろよ
メンバの並びは関係あるだろっていうかちゃんと意味があるだろ
やーだー
371 :
デフォルトの名無しさん :2010/06/05(土) 10:33:46
普通にローカル変数を宣言したあとに、このまま初期化せずに値を参照してはいけないという話をきくがなぜですか。 ゴミを参照したって別に罰があたりませんよね?
それはうんこしてもけつふかなくていいというならごかってに
買ってきたばかりの食器を洗わずに使うとか。
int rand() { int n; return n; }
375 :
デフォルトの名無しさん :2010/06/05(土) 10:42:23
たとえが不適切ですがちゃんと初期化で洗ってやりますよ
376 :
372 :2010/06/05(土) 10:44:04
int i=0; scanf("%d%*c", &i); /* "1" */ printf("%d", i);
手術で執刀部位を目をつぶって気分で決めるようなものだな
>>371 実際使う限りは適当な値が入ってるだけだが、
Cの規格でその操作は未定義と決まってる(未定義というのはなにが起こるってもしらねーぞっていうような意味)
のでやっちゃいけないというわけ
>378 規格のどこに>371が未定義であると書いてあるのか教えてください
別にやっちゃいけないわけではない
確かにやっちゃいけないわけじゃない やっちゃいけないって書いてあるのは規格じゃなくてコーディング規約か
>>378 未定義なの?俺も規格のどこに書かれてるのか知りたい
未定義になる言語もある
どの言語?
動的型付けの言語
386 :
378 :2010/06/05(土) 13:42:28
388 :
デフォルトの名無しさん :2010/06/05(土) 15:58:34
ff
389 :
デフォルトの名無しさん :2010/06/05(土) 16:00:14
ちょっと、またわけのわからないことになりました。 while(〜〜〜〜){scanf("%d",&a); scanf("%c",&b);} だとエラーになるんですがなぜですか? 繰り返しなんだから 制御式満たして文字打ち込めば永遠に改行されるはずなのに ・・・なぜでしょう?
エラーが出たらエラーメッセージも貼りましょう。 出来る限りソース全文をあげましょう。
scanf("%d%*c",&a); 改行が読み飛ばされる scanfのエラー戻り値はEOF以外の場合0
392 :
デフォルトの名無しさん :2010/06/05(土) 16:16:52
>>390 いやエラーは出てないのよ。
でも実行したら止まってる。
繰り返しかもしれんが
scanfの繰り返しは入力→改行→改行だろう。
変数の文字型が違うからばぐったのかな?
とりあえずプログラム自体に意味はない。
形式が試せるか確かめただけ。
#include<stdio.h>
int main(void){
int a;
char b;
while(a != 3)scanf("%d",&a);
scanf("%c",&b);
}
「エラーになる」と「自分が思うように動作しない」は違います。使い分けましょう。
>scanfの繰り返しは入力→改行→改行だろう。 なにを言ってるかわからない
395 :
デフォルトの名無しさん :2010/06/05(土) 16:25:20
>>394 whileは繰り返し構文でしょ?
何故何をいってるのか分からないのか。
実行↓
3
3
3
3
3
3
3
こうやって永遠入力したい。
お前がループ構文の条件というものを相変わらず理解してないことはわかった。
398 :
デフォルトの名無しさん :2010/06/05(土) 16:27:30
399 :
4 :2010/06/05(土) 16:28:34
>>397 何故わかったwwwwwwwwwwwwwwww
気を使って1週間来なかったんだよ。
さすがに教えてくれよ。
aに3を入力する a!=3が0になる ループから抜ける
___ / \ /ノ \ u. \ !? / (●) (●) \ | (__人__) u. | \ u.` ⌒´ / ノ \ /´ ヽ | l \ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ____ / \!?? / u ノ \ / u (●) \ | (__人__)| \ u .` ⌒/ ノ \ /´ ヽ | l \ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
402 :
4 :2010/06/05(土) 16:31:50
満たしてないからw
404 :
391 :2010/06/05(土) 16:35:52
文字じゃなくて、数字入れてみろX
405 :
4 :2010/06/05(土) 16:36:44
aに3を入力すると a!=3が満たされるとな?
407 :
4 :2010/06/05(土) 16:38:09
>>406 あぁたまたたまかぶっただけ
a != 3
??
a
$%
45
3323
`
C
d
323
d
333
とこんな風にしたい。
とりあえずaを初期化しろ
こんな風って、それで何がわかると思うんだよw
>>392 おまえ質問者ならもっと丁寧な言葉を使え
永遠に入力ループしたいだけなら while(1) でいいんじゃね?
412 :
4 :2010/06/05(土) 16:51:32
>>411 実際は繰り返し入力した数字を足したいんですが。
でもwhileの(制御式)はいいんだけど
{}の中身が複雑になりすぎて・・・
どうしたらいいんだ・・もう死にたい。
>>410 俺はそいつとは違うけど、こんなところで威張り散らしてどうすんだよ・・・・
どんだけリアルで人から敬われてないんだよ
>でもwhileの(制御式)はいいんだけど ちっともよくないぞw
aが初期化されてないから aが最初から3ならループに入りすらしないよね
417 :
4 :2010/06/05(土) 16:56:04
少し外に出て頭冷やして見直せ
419 :
413 :2010/06/05(土) 16:57:34
3じゃなく4とか2は入れてみなかったのか。
423 :
4 :2010/06/05(土) 17:04:28
>>418 一週間考えて分からなかったんだが・・・
>>420 whileとscanfは組み合わせ無理なんすか?
プログラム
実行↓
8
9
3
4
3
6
合計=33
whileつかってね。
>>423 宿題か?
一週間経ったのならそろそろ答え合わせとかしたんじゃないの
426 :
4 :2010/06/05(土) 17:07:53
>>424 宿題。
答え合わせないよ。
まだ終わってない人いるからね。
int i = 0, sum = 0, n; while(i < 6) { scanf("%d", &n); sum += n; i = i + 1; } printf("%d\n", sum);
428 :
4 :2010/06/05(土) 17:08:50
うん、早く教えて
429 :
425 :2010/06/05(土) 17:08:58
430 :
4 ◆nNHcoCEvyo :2010/06/05(土) 17:11:14
>>428 まじでやめろ
>>427 ありがとうございます。
いや、項の数は任意がいいんですが・・・
実際そのプログラムは作ったんです。
終了条件がわからないとどうしようもないが
while(scanf("%d", &n)==1) sum += n;
というか宿題の意味なしてないし、宿題なら宿題スレに行けよ
434 :
4 ◆nNHcoCEvyo :2010/06/05(土) 17:15:23
>>431 0を足したところで終了
またcharで演算子=をつけたところで終了
がいいかなぁと思うんですが。
そのためのchar
while(a!=3) って日本語でいうと?
#include<stdio.h> int main(void){ int a=0,b=0; while(1) { scanf("%d",&a); b+=a; if (!a)break; } printf("%d\n",b); return 0; } 入力が0で終わり。
437 :
4 ◆nNHcoCEvyo :2010/06/05(土) 17:19:21
>>436 ありっす・・・
ところで
while(1)ってなんですか?
習ってません。
return 0;も習ってない・・・
学校の教えとしてC言語の参考書は先読みしないようにって
言われてるんです。
whileも関数も知らずに質問するから、意味不明なことになる
439 :
デフォルトの名無しさん :2010/06/05(土) 17:23:23
#include <stdio.h> int main(void) { int a = 0; int b = 0; do { scanf("%d", &a); b += a; } while (a != 0) printf("%d\n", b); return 0; } 俺の嫌いなdo-while文.
というか高校?大学だと参考書の先読みするなとか言う以前に入学の時から書けるやついるだろ 先読みさせないのは差が開くばかりだと思うんだが
>>437 while (1)は無限ループ、for (;;)と同じ。break文で抜け出す。
return 0;は問題なく終わったとき0を返す。
先読みした方が楽しいよ。
先読み禁止なんて小学生までだろw
っていうか先読みするなって言われたとおりにしてる時点でそんなにプログラミングに興味ないんじゃね
444 :
4 ◆nNHcoCEvyo :2010/06/05(土) 17:28:32
>>439 ありっす。
char
で
=を入力したときにプログラム終了させるには?
>>440 高校なわけねぇだろwww
こんな高度なことしねぇっすよ・・・
先読みさせないは嘘だよ・・・忘れてくれ。
つか先読みせんでwhile使えってどーゆーことよ。
446 :
4 ◆nNHcoCEvyo :2010/06/05(土) 17:30:30
先読みさせないは高校の先生の言ってたことね。 大学の先生はそんなこと言わない。 でも大学でも知ってることだけで作業するってのがクレバーなんだと思う。 時間をかけて演繹的にやる方法は確実だけど要領が悪いと思う。
447 :
391 :2010/06/05(土) 17:31:20
#include<stdio.h> int main(void){ int a=1, sum=0; while(a != 0) { a = 0; scanf("%d", &a); sum += a; } printf("%d\n", sum); }
448 :
デフォルトの名無しさん :2010/06/05(土) 17:31:21
4の現在の質問ってどこから始まってるの?
>>4 ではないんだよね?
>こんな高度なことしねぇっすよ・・・ なんの冗談だよw
450 :
デフォルトの名無しさん :2010/06/05(土) 17:32:00
大学生なら自分で進んで勉強しろよ。
電卓作ってるなら他の演算子の判定も入れたりできるけど
別に数式を描くわけでもないのに'='だけのために文字型で受け取って
数文字か'='かその他の文字かを判定するのは少し馬鹿らしい
>>446 何も知らない奴が知ってることだけでってw
お前教科書以外にプログラミングの本読まないわけ?
その時点で周りに差をどんどん付けられてるぞ
どれが4でないか教えてほい
普通に授業出て理解できてればこんなところに質問には来ないと思うんだ。
でもここは宿題スレじゃないし、あまつさえ質問スレであるかどうかも疑わしい
455 :
4 ◆nNHcoCEvyo :2010/06/05(土) 17:41:44
>>450 それは恥ずかしいです。確かに夏休みは遅れ取り戻しの勉強はするが
先取り学習は絶対しないと決めてる。先取り学習したら応用力が身に付かない
と思う。
>>453 最低限のことしかかいてないし、応用課題ばかりな件。
プログラム得意な奴もエラー多発で挫折してる・・・
そろそろバイトだから落ちるけど、まじで東大の数学より
プログラムのほうがむずいわww
大学生なのに夏休みにプログラミングするのかww 情報学科?
457 :
デフォルトの名無しさん :2010/06/05(土) 17:44:05
> 東大の数学より > プログラムのほうがむずいわww Fランの俺に謝れ\(^o^)/
458 :
デフォルトの名無しさん :2010/06/05(土) 17:44:09
普通にするだろw サークルの温泉旅行にもノートPCくらい持ってくわ
サークルの温泉旅行なのにプログラミングってどんだけ暗いんだよ
東大のCの講義なら、この時期こんな低レベルなことやってないだろうがなw
>>460 うちの大学にいる
「東工大の講義なら、この時期こんな低レベルなことやってないだろうがなw」
とか言ってた東工大出身の教員が
全然プログラム書けなくてワロタ
462 :
デフォルトの名無しさん :2010/06/05(土) 17:49:00
>>459 プログラミングが暗いとか言ってる時点で、住む世界が違う
自称東大だの「住む世界が違う(キリッ」だの・・・・ ウザすぎだろここの奴ら
>>455 ←こいつ高校時代の教師にヤバイ思想を刷り込まれてるな。学問に向いてないよ
466 :
◆nNHcoCEvyo :2010/06/05(土) 17:58:05
>>465 理系だけど別に研究職つくつもりは毛頭ないんで^^
高校の教員目指してるんで。
>>447 何故
intにa,sum二つ変数使うんですか?
aだけでよくないですか?
理解力に欠ける人間は生徒の言うことが理解できずに押し付けるだけのカス教師にしかなれないだろ。
>>466 お前それで自分の生徒にまたその考えを植えつけるのか
理系ならポリアの「いかにして問題をとくか」とか読めよ。これはプログラマの推薦図書でもあるし
あとその本にインスパイアされた「数学ガール」も読んどけ、読みやすいから。
知らないことは出来なくて良いのだろうか調べれば分かることなのに。
実際お前は2chに質問してるわけだろ?つまり他力本願なやり方で調べている。矛盾してるよ
お前には何にしろ教わりたくないなあ
>>466 入門書とかK&Rとか読むといいと思うよ?
請求書を例に考えてみるといいsumは合計
>>469 K&Rは初心者には勧められないらしいよ。古くもあるしもともと初心者向けに書かれてないって
上手くまとめてあるからとりあえず持っとくと良いらしいが
472 :
◆nNHcoCEvyo :2010/06/05(土) 18:10:56
#include<stdio.h> int main(void){ int a = 0; while(a != 0) { a = 0; scanf("%d", &a); a += a; } printf("%d\n", a); } これでいいような気がしますが・・・・
473 :
デフォルトの名無しさん :2010/06/05(土) 18:11:44
らしい らしい
馬鹿の考え休むに似たりって諺がこれほどぴったり当てはまるのも珍しいw
a = a + a でいいのか?
>>474 反論を恐れてアンカーも付けられないヘタレに言われたくないw
突っ込みどころしかないが、面白かったのは >int a = 0; >while(a != 0) { ここw
まずループに入らない。 仮に入れたとしてもscanf()でaを読み込んだ時点でそれまでの合計が消える。
>>476 アンカーもなにも、この流れで馬鹿っていったら◆nNHcoCEvyo以外にはいないだろw
>>473 これは本当だよ。K&R読んだことある?
自分も絶賛大学生なんだができない奴に限って変数を作らない。 メモリ気にしてるのかは知らんがそんなのできてからの話だろ?
482 :
デフォルトの名無しさん :2010/06/05(土) 18:18:17
>>480 K&R読んだことあるよ。
本当ならなぜ伝聞推定の助動詞を使うんだ?
>>482 俺は読んだことないから。でも一般的な批判だから教えてやったんだよ
なんだ。読んだこと無いヤツの聞き込みか。
というか、どんな本であれ正しく理解できるとは到底思えない 勝手な俺解釈をもとにしておかしいおかしい言うだけだろ
別に少ない情報だけから考えるというのはいい頭の訓練になるし、 そもそも宿題で教えてない事やると怒られるだけだろうけど、 先読みしてもその情報を使わなければいいだけだな 先読み禁止とか、智への深い渇望が感じられないな そういう奴に共通するセリフは 「〜だから俺は〜しなくても構わない」という類いのセリフだな 俺は面白そうだからと別学科の授業も沢山受けたもんだ
理解する前に先に進んでも意味ないから こいつは先読みする以前の問題だ
>>487 権威を叩いて自分の権威を高めようという小物の意図がミエミエ
>>490 じゃあダイクストラの"Go To Statement Considered Harmful"はどうよ?
当時一般的なgo to文を叩く小物?ダイクストラは大物だから叩いてもおk?
問題は中身だと思うのだが
>>487 ポインタがよく理解できてないアホの寝言にしか見えないw
初心者に勧めるのに適切かという議論から逸れてる
初心者にいきなり難しい参考書を読ませようとする人はアホなの?
理系なら良いけど文系には当てはまらない考え方だな>自分から率先して〜
文系って普段なにやってるの?
コンパ
他にもっと簡単な参考書があるかもしれないが、K&Rが難しいってわけでもないだろ。 K&RでCを始めた人間がこの世にゴマンと居るのだから、別にK&Rで初めることに一切問題はない。
理系がコードをコンパイルしてる間にも、文系はコンパとな?
文系でもやるヤツは自分から先に進むけど。
>>496 っていうか堂々と「大学は勉強する場所じゃない」とか言っちゃうのが文系
うちの親父とかもそう
>>500 いや、そりゃそうだけど例外を一般化してどうすんのっていう
文系は一般的には学問的姿勢が身についてないどころか真っ向から逆らってる感じ
お前は文系とか学問の何を知ってるんだ?w
有名大学生なら、K&Rからでいいんじゃないの?
>>503 逆にお前はそれらについて何を知ってるの?
そういうこと聞き出すのって詭弁じゃねーの?
K&Rから始められないようなレベルで理系大学生ってのが大問題な気もするが。
大昔の名著を教科書にする教授いるよな。もう書式とか言葉遣いまで古いの。アホかと
>>4 みたいなのが理系大学生なんだから、理系って底抜けのアホだよねw
あ、このスレにも文系がいるのか
>>508 一般と特殊を区別できないお前が底抜けのアホだろ。
文系・理系でわけることに意味ないだろ。 底辺理系より一流文系のほうが上だし。
whileの意味くらい先読みせんでもわかるよなふつー。
つか文系ならwhile(a!=3)がわからないってどうなのよ
理系は実験やらなんやらで色々大変そうだなー、ってのが文系だった俺のイメージ。 文系は手抜こうと思ったらどこまでも抜けるからな。
自分で抜かなくてもいいしな。
>>517 ィ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;゙t,
彡;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ヽ
イ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;r''ソ~ヾ:;;;;;;゙i,
t;;;;;;;リ~`゙ヾ、;;;;;;;;;;;;;;;;;;;;ノ i,;;;;;;!
゙i,;;;;t ヾ-‐''"~´_,,.ィ"゙ ヾ;;f^! / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ト.;;;;;》 =ニー-彡ニ''"~´,,...,,. レ')l. < おまえは何を言っているんだ
t゙ヾ;l __,, .. ,,_ ,.テ:ro=r''"゙ !.f'l. \____________
ヽ.ヽ ー=rtσフ= ; ('"^'=''′ リノ
,,.. -‐ゝ.>、 `゙゙゙゙´ ,' ヽ . : :! /
~´ : : : : : `ヽ:. ,rf :. . :.: j 、 . : : ト、.、
: : : : : : : : : : ヽ、 /. .゙ー:、_,.r'゙: :ヽ. : :/ ヽ\、
:f: r: : : : : : : : !丶 r-、=一=''チ^ ,/ !:: : :`丶、_
: /: : : : : : : : :! ヽ、 ゙ ''' ''¨´ / ,i: : : l!: : : : :`ヽ、
〃: :j: : : : : : : ゙i `ヽ、..,,__,, :ィ":: ,ノ:: : : : : : : : : : : :\
ノ: : : : : : : : : : :丶 : : ::::::::: : : : /: : : : : : : : : : : : : : : :\
そもそも!=がなんのことかわかってねぇだろ。
ああ、理系って可愛い女の子すっごい少ないよね クラスに一人とかで、ほぼ不細工w
いや、そうでもないよ。
お前ら彼女居るの?
馴れ合いスレになって来たんだが?文系のせい?
学力にコンプレックスがあるんじゃない?
学力なんて社会出たら役に立たないだろjk
社会に出る瞬間に役立つだろ
>>525 学力すら獲得できないヤツなんて役に立たない以前に、害悪。
こんな流れになるのも
>>4 がアホすぎるのがいけないだよ!
興奮のあまりなまってるぞ、どこの田舎者だw
>>527 いや勿論そうだけどそういうこと言ってるんじゃないよ
大体大学入った後も学力とか学歴にこだわるヤツってそれしか取り柄がない
>>526 確かに社会に出る時点で学力によって階層化されるから
その社会では周りと同程度である学力は意味をなさないな
>>530 学歴がないヤツほど、「オレが出世できないのは学歴がないせいだ」とか言って、学歴にこだわってるけどな
533 :
デフォルトの名無しさん :2010/06/05(土) 19:05:18
まあ、学歴なんて大したものじゃないんだから、グダグダ言う前に、学歴くらい身につけておけって事だろ。
>>532 ああ、そういうパターンもあるねww
それは本当に惨めだな。
でも大抵は色白の非リアが自己正当化のために学歴でもって下の人間を見下す、ってパターンが多いよね
535 :
デフォルトの名無しさん :2010/06/05(土) 19:06:30
>>534 > でも大抵は色白の非リアが自己正当化のために学歴でもって下の人間を見下す、ってパターンが多いよね
多く無い。
それは偏見だろ
学歴で見下せることの出来る人間がいる職場って、どんだけ底辺の職場なんだよw
>>537 いや職場じゃないって。
大体は2chでウサ晴らしてるでしょそういうヤツは。
何だ、2ちゃんねる内の話か。
>>534 からすっごい学歴コンプレックスを感じるw
色白の非リアってとこに悪意が籠ってるだろ?そういう見下し方はどうなのかね チャリ通ってだけで焼けるから、それでも白いのはもう遺伝子レベルだよ
2chみたいな匿名掲示板で学歴持ち出して見下すなんてアホすぎるだろw
勝手に見下されたと思い込んでる方がポジション低過ぎなんだよ。
>>542 学歴板にだって、このスレにだってそういう連中が実際居るのに何をおっしゃる
学歴板以外での学歴の話題は学歴板に誘導される それは学歴板がネタ雑談板でありキチガイ隔離板だからだ それを一般的な2chのように言うな
学歴板はともかく、このスレにそんなヤツいるか? 勝手に劣等感持ってるヤツならいるみたいだが。
いや、矛盾してね?それ 学歴板以外でもそういう話題が出るってことは2chでそういう話題が出ること自体が一般的だってことだろ
>>547 一般的ではないよ
犯罪者は捕まるが、犯罪は一般的ではないだろ
>>547 お前みたいなヤツこそ隔離されるべきだな
if(img_robot_flag[player_flag]>=4){ img_robot_flag[player_flag]+=img_robot_cnt[player_flag]/64; img_robot_cnt[player_flag]+=2; } (中略) if(img_robot_cnt[player_flag]>255){ img_robot_cnt[player_flag]=0; } 全体がwhileループで回っているとして、これでimg_robot_flag[player_flag]が1ずつ増えてくれません。 情報が少なくて分かりづらいと思いますが、その理由を教えてください。 もう一個別のifで囲んだりして遠回りすると予定通り動くのですが・・・。
printf()でimg_robot_cnt[player_flag]を表示させて見た?
DrawFormatString( 170, 30, White, "img_robot_cnt[player_flag] = %d", img_robot_cnt[0]/64 ); この形では問題なく1ずつ加算されてます。 ですが+=の形にするとどうしてもうまくいきません。 またint()で囲んでも駄目でした。
>>552 に追記で
上記のDrawFormatStringで表示させるときには、
>>550 の
img_robot_flag[player_flag]+=img_robot_cnt[player_flag]/64
を消してます。
またimg_robot_flag[player_flag]+=img_robot_cnt[player_flag]/64がある場合には
img_robot_flag[player_flag]が12になったり14になったりと挙動がおかしいです。
img_robot_cnt[0]/64とimg_robot_cnt[player_flag]/64は player_flagが0じゃないと別物だけどそこらへんは?
player_flagも0です、すいません。
codepad辺りでうpすれば?
img_robot_cnt[player_flag]が0から255まで変化するんなら、 +される値も0から3まで変化して当たり前だと思うんだが。
ロボットの画像を通常、右、左で4コマ*3枚をimg_robot[0][12]に格納しています。 そこで DrawRotaGraphF(int(board_x1+zahyou_x[f]), int(board_y2-BLOCK_TATE*1),1.0f,0.0f,img_robot[f][img_robot_flag[f]],TRUE); に対応させてカウンタが0〜255まで(img_robot_cnt[player_flag]が0〜3まで)まで動く際に、 それぞれパラパラ漫画のように表示される具合です。
RoboCodeみたいなやつってのは分かるんだけど 中略ってとこに原因がないと考える根拠は?
以下のように自己解決しました。 if(img_robot_flag[player_flag]>=4){ img_robot_flag[player_flag]=img_robot_flag[player_flag]-img_robot_flag[player_flag]%4+img_robot_cnt[player_flag]/64; img_robot_cnt[player_flag]+=2; } 前のままだと、img_robot_cnt[player_flag]が64になったとき、66になったとき、68になったとき〜で それぞれimg_robot_flagに1を加算していたためうまく表示出来なかったようです。 お騒がせしました。
おめでとう。
562 :
デフォルトの名無しさん :2010/06/05(土) 20:23:47
while(1)が無限ループならwhile(2)でもwhile(10000)でもいいんじゃないか。なぜ1なんだ。 そこまで1にこだわる理由はなんだ
じゃあgotoで
while("forever")最強
for(;"ever";)だろ
foreverで1つの単語だし!
567 :
デフォルトの名無しさん :2010/06/05(土) 20:38:45
forの場合は条件指定しなくても無限ループ作れる for(;;) こっちのほうが使いやすい。
>>562 0(偽)か0以外(真)かだから1でも10000でもいいがメンドイので1をよく使うってか定番だね。
570 :
562 :2010/06/05(土) 20:56:14
>>569 なんとなくそんな理由だと思いました。すっきりしました
-0 の場合はどうなるの? PC では試せないが。
>>487 別に
while (*p++ = *q++)
;
がしごくわかりにくい、とは思ったこともなかったのですが、そんなもんですかね。
そんなものだよ世間知らず君
要素がchar型でもint型でもおkなスタックって作れますか? 大学の課題で使いたいんですが、pushやpopを型に応じて2種類定義するのはなんかカッコ悪いので
>>575 演算子とか入れても大丈夫なんでしょうか?
>>576 演算子ってchar型で'+'とか'-'ってこと?
それなら別にいいんじゃないの。
>>577 そうです
式を逆ポーランド記法にしたいので
ありがとうございました
その値が、char型かint型かを区別する必要があるなら、型情報も入れておかないとだめかもね。 charなら0、intなら1で、型情報、値の順で積んでいくようにして 1500+3000なら、 1, 1500, 0, '+', 1, 3000 みたいな感じに。
忘れてました 標準入力から読み込んだ文字列を並び替えて、作業用にこのスタックを使うつもりです 逆ポーランド記法にした後は別のキューに入れて計算します あと構造体のメンバに不定値があっても、それを参照しなければコンパイルや実行に影響は無いですか?
馬鹿の考え休むに似たり
このスレで覚えた諺使いたくてしょうがないのか? 可愛いやつだw
何事も使わないと身につかないからな。
ことわざを使うにはスレに書かれてないか調べてからじゃないとだめなのか
だめじゃない
「馬鹿の考え」じゃなくて「下手の考え」。もとは囲碁の格言だ。
次スレのタイトルは「ことわざなら俺に聞け(入門編)」でよろしいか
いいよ
構造体のメンバに不定値 不定値の部分は共用体を使いませう。
592 :
デフォルトの名無しさん :2010/06/06(日) 03:01:11
Cに限った話じゃないが、設計をスルーしていきなりプログラミングしようとする人が多いです まずはフローチャートをかけと。設計しろと。Cは単なる道具にすぎないんだよ!
能書きはいいからまず組め。
>>592 フローチャートはやめてデータフローダイアグラムにしておいてくれ
595 :
592 :2010/06/06(日) 03:11:52
と大学の教授の口癖だったんだ。 設計ができてもCを使いこなせないとプログラミングできっこないよ
>>592 ポールグレアム曰く、アメリカ人はとりあえず書き始め、その途中で修正を加えながら完成させる。
日本人はその前によく設計する。だからアメリカの車は糞で、日本の車は素晴らしいが、
プログラミングや映画についてはアメリカ人が得意。絵もそうだが、途中で修正するのは当然だって。
珠玉のプログラミングではとりあえず分かりやすい疑似コードで考えてそれを具体的なコードになおす
みたいなことが書いてあったかな。フローチャートって人に説明するにはいいけど、そこまで重要かな?
人(未来の本人も含む)に説明できるソースコードが書けるなら別にフローチャート(等の補足資料)は要らないけどな。
Cを使いこなすってのはCプログラミングにおいてのみ重要なことだろ 授業ではCを使ってたかもしれないが、それがCの授業じゃなくプログラミングの授業なら Cは目的でなく単なる道具だからな
599 :
デフォルトの名無しさん :2010/06/06(日) 03:26:28
>>596 第三者にみせて、処理の流れに矛盾がないかどうかチェックしてもらうことは意味のあることだと思う。
高級言語で書けばそのままで既にフローチャートの代わりになってるだろ。 低級言語時代の遺物だろフローチャートの類なんて。
よくわからんで設計したら、フローとかあってもなくて同じでしょ。(ハマるだけ)
処理単位じゃなくてデータ単位で書くほうがよかろ
603 :
デフォルトの名無しさん :2010/06/06(日) 03:39:23
>>596 UnixとかのOSもいきなりコーディングから始めたの?だとしたらすごいよな。
「ポインタが理解できない理由」という本にUnixの疑似プログラムが記載されていたけど
みてて複雑に絡み合っててすぐには理解できなかった。
あれを設計なしにコーディングして途中で修正加えて完成させたってのか・・。
だれも設計しないなんて言ってないよ 完璧な設計をいつまで作ってなかなかコーディングし始めない人を批判してるんだよ
設計がおかしいとコードを書けなくなることがある
で?
最近「で?」とだけレスするの流行ってるの?
ここまで1セットです。
バランスですよ、バランス。 いきなりコードを書くのは良くないが、いつまでも設計図を書いているのもよくない。 バランス感覚を養うただ一つの方法は経験を積むことです。
テキストのデータを配列に格納するにはどのようにすればできますか? file.txtのデータが 0.1 -0.5 0.32 0.65 0.76 -0.45 となっていて、それを配列w[100]に順番に格納していきたいです よろしくお願いします
FILE* file = fopen( "data.txt", "r" ); char buf[ 256 ]; double w[ 100 ]; int i = 0; while( fgets( buf, 256, file ) != NULL ) { w[ i ] = atof( buf ); i ++; } fclose( file );
613 :
610 :2010/06/06(日) 14:23:52
もうひとつお願いします double w[ 100 ]={ 0.1 , 0.5 , 0.32 ,0.65 , 0.76 , -0.45 , ・・・}; の配列をtxtファイルに1行づつ書き込んでいくにはどうすればいいですか? なんどもすみません
FILE* file = fopen( "data.txt", "w" ); char buf[ 256 ]; double w[ 100 ] = { 0.1 , 0.5 , 0.32 ,0.65 , 0.76 , -0.45 }; for( int i = 0; i < 10; i ++ ) { sprintf( buf, "%f\n", w[ i ] ); fputs( buf, file ); } fclose( file );
>>614 ありがとうございました
うまくいきました
616 :
デフォルトの名無しさん :2010/06/06(日) 20:49:09
staticのことで単刀直入に質問しますが main関数内で変数を宣言するとき、頭にstaticつけようがつけまいが結果は変わりませんよね?
いいえ
思い切り変わります。
>>616 static だと
初期化される
ヒープに確保される
なので結果が変わる事もあります
621 :
616 :2010/06/06(日) 21:04:07
ヒープ領域に確保されるんですか。勉強になりました。 変数の寿命という点では同じですよね?
んなわけねー
staticなローカル変数なんか使っちゃイカン
main後もプログラムは動くんだぜ
メイン関数内の変数をstaticにする利点がわからない
631 :
616 :2010/06/06(日) 21:42:10
>>627 main関数内で、大きな配列を扱うときにstatic入れるのは
自動で0初期化するためですか?
>>627 ヒープ使え、ヒープ
staticだとメモリ足らなかったら起動できずに
OSがエラーメッセージ吐くぞ
ヒープ使ってたら自分でメッセージ出せる
>>630 レジスタ知ってて.dataとか知らないのか
静的領域って起動時に自動的に確保されるヒープ領域みたいなもんだと 思ってたけど違うのか
みたいなもんは等しいってわけじゃないから
ヒープと表現すると不具合あるってこと?
プログラムがメモリ上にロードされる時に ヘッダ、命令、可変データ、不変データ、スタックを置くためのメモリが確保される staticで確保されるメモリはこのうち可変データ(非const)と不変データ(const)だ ヒープはそれとは別に確保される領域
データ領域が2つに別れてるのは もちろんメモリ保護のある状況だけだかんな
プロテクトモードの由来だな。
>>446 大学でそれってクレバーじゃないよ。もっともひどいやり方だよ。
バークレーでいいよ。
そいつに何言っても無駄w
で?
printf("で?\n");
で?って流行ってるの云々
組み込みならstatic使えばいいし メモリ確保を遅延する環境はどうしようもない
試した事ないから知らないんだけど シグナルも飛ばずに即死するの? >遅延確保に失敗した場合
面白くないぞ。話題について行けない中学生
中学生がこんな幼稚なことするわけないだろw
linuxでヒープ使い切ったらどうなるか試したことないや 少なくともmallocは0を返さないはずだよね
FILE *f; int c; f = fopen("a.txt", "rb"); while ((c = fgetc(f)) != EOF) { printf("%X\n", c); } UTF8で”あ”と1文字だけ書かれたa.txtをバイナリモードで開いて バイトコードを出力するプログラムを書いたんですが E3 81 82 A という結果になります。”あ”はUTF8でE38182なんでOKですが最後のAは謎です。 これはどっから来てるんでしょうか???
>>656 ありがとうございます。改行でした。
実はa.txt内には直接改行は入ってないんですが、なんで改行出てきちゃうんでしょうか??
vi で編集した?
>>658 はいviです。
環境はMac snow leopardのMacVim7.2です。文字コードutf-8、改行コードはunix(LF)です。
>>659 最後の行に改行を追加する旨警告メッセージが出なかった?
vi系は原則最後に改行文字を出力するから。
vi は、わりと行指向のエディタです。 viで普通にファイルを作成すると、行の最後に改行文字がつきます。 ファイルが一行だけでも同じことで、改行文字が最後につきます。 ファイルの最後に改行文字がないようなファイルを編集すると、 保存時にファイルの最後に改行文字が付加されます。
>>660-661 viが自動的に追加していたんですね。
ありがとうございます。本当に助かりました。
>>650 >>654 ディフォルトの設定のままだとNULLは返らない。
その場合、遅延確保に失敗したら即死する。
但し、確保しようとしたプロセスが死ぬとは限らない。
>
>>663 え、アドレス空間ぜんぶ空いてない場合でもNULLが返らないの?
あー、流石にその場合はNULLだね。
あ、そうなんだ。 じゃあ連続領域が確保できるかどうかについてはその時点で検証しないということ?
標準入力で abc123 de-50fg みたいに入力してatoiで123と-50をintの配列に格納するときはどうすればいいでしょうか 上の文字列(abc...)の要素を先頭から順に見て(文字列のポインタを増やして) 数字が来たら(細かい分岐はとりあえず無視)atoiの引数にポインタ入れて整数にして格納ってできますか? ちなみにポインタよくわかってないです
668 :
デフォルトの名無しさん :2010/06/07(月) 20:03:38
すごい発見しました。staticをなんとポインタ変数の頭につけてみたんです。 static int *ip;→この時点でipはNULL初期化される。
これはひどい釣り
670 :
デフォルトの名無しさん :2010/06/07(月) 20:12:10
>>669 本当にNULL初期化されるから試してみなされ。
このスレレベル落ちすぎだろ
static付けるとbssに割り当てられるから、起動時に初期化されるだけ
>>670 質問者にとっては珍しい出来事かもしれないが、回答者にとってはそれ当たり前なので、勘弁してください。
674 :
デフォルトの名無しさん :2010/06/07(月) 20:18:41
676 :
デフォルトの名無しさん :2010/06/07(月) 20:42:53
>>675 調べてきた
メモリにロードされたプログラムの中で、初期値のない静的変数が割り当てられるセグメントのこと。
block started by symbol の略。
でも0初期化されるから「初期値のない」じゃ説明がつかないな
Cのスタートアップ処理がいい加減だと、bss領域とかが初期化されないこともある
bssの処理をランタイムがやってる時点で糞アホだな どこの組み込み系OSだよ
昔、はまってた奴がいたんだよ
>>667 strtol()してポインタが進んでいたらそれを格納してポインタを更新、そうでなければポインタを一つ進める
パソコンアプリみたいにお膳立てしてくれる環境ばかりじゃないんだよ
なんで組み込み屋って偉そうなの?
ちゃちなプライドにしがみ付いていないと溺れっちまうからさ
規格違反の処理系を使わなければいけない可哀想な人なんだから優しくしてあげなよ
規格違反?
携帯開発で病んでしまったんだろう
>>685 どういう意図で疑問形にしたの?
なんか胡散臭いレスだな。
胡散臭くてごめんくさい
689 :
デフォルトの名無しさん :2010/06/07(月) 23:41:25
質問ですが、#include<stdio.h>の次のint main(void)ってありますよね? このmainは何を表してるんですか?intは関数の型ですよね?voidは引数の 型は何でもいいってことですよね?mainとは何ですか?ここ適当にmanyとか にしていいんですか?全く分からないのですが・・
入門書とか読まずにやっているのか?
>>689 voidは何も無しってこと。何でもいいんじゃなくて、何も無し。
mainとはエントリポイントに指定されている関数。そこからプログラムが始まる。
692 :
デフォルトの名無しさん :2010/06/08(火) 00:10:12
>>691 いろいろなソース見てみると
int XXXXX()のXXXXの部分はmainばかりじゃないんですが
この場所は勝手に自分で作ったらいけないんですか?
あとmainだとどういう特性があるんですか?
>>690 入門書は分かりにくい、挫折した。
関数は自分で作って良いけど…説明するのメンドイわ じゃあ、#include<stdio.h>って言ってるけど、これが何か分かってるわけ? 分からなくて良いからとりあえずそんなもんだと思って進め。あとで分かる
なんの本も無しにどうやって勉強するんだよ。
つーか何を見てるんだろう 何も読んでないのにmain出てくる訳ないし
まずは、仕様を読めと タダで読めるんだし一読しとけ?
入門サイトくらい見て全て理解して質問しろよ
スレのレベルが落ちすぎ
初心者にいきなり仕様書読めとかいう馬鹿がいるのかよ
700 :
デフォルトの名無しさん :2010/06/08(火) 00:25:10
>>692 > いろいろなソース見てみると
> int XXXXX()のXXXXの部分はmainばかりじゃないんですが
> この場所は勝手に自分で作ったらいけないんですか?
自分で勝手に作ってもいいよ。実際に「int XXXXX()」でもいい。
> あとmainだとどういう特性があるんですか?
>>691 に書いてあるけど、そこからプログラムが始まる(プログラム開始時にmain()が呼び出される)という特性がある。
>>700 の補足になるが
コンパイラはmainという名前の関数から始まると思っているから、コンパイル時に教えてやるという面倒な作業が増える
WinMain関数などはさらに面倒なことを定義してるので、素直にそれを使った方が他の人にも自分にもやさしい
702 :
デフォルトの名無しさん :2010/06/08(火) 00:39:47
何故仮因数ってのを設定する必要があるんですか? 実引数の型を後でどうせ設定するんでしょ?
実引数は可能であれば暗黙で仮引数の型にキャストされるよ。
いんすうって読む?
705 :
デフォルトの名無しさん :2010/06/08(火) 00:43:01
>>695 >>696 本だとイメージがわかない、一応持ってるけど読んでも全くわからん。
自分で作りますよね?
int many(void)としたらmanyはどう作用するんですか?
>705 many自体はコンパイルできるが、標準Cではmain関数から実行されると決まっている。 manyだけで実行できるプログラムは書けない。 だけど、本も何も無しでわかるの? 持っている本は何?とっかかりとして本が悪すぎるのでは無いかな。
C言語 でググれば初心者向けの解説サイトはたくさん出てくる
710 :
デフォルトの名無しさん :2010/06/08(火) 02:30:30
>>708 犬でもわかるC言語
main関数は全ての関数の総元って考えてOK?
新たに関数設定するときmany()はどこに書けばいいのですか?
何故main(){}の中だけで作業しないんですか?
{}の中に作業全て行えばいいじゃないですか。
main()の前に記述するか、宣言だけしてmain()の後に記述する main()の中に書くと長くなるし、同じ操作を行いたい時また書かなきゃいけないだろ というかもうここで質問すんな死ね
はい。cのプログラムでは必ず main() が実行されます。この関数だけ特別です。 関数を定義するのは、一番外側でしか行えません。 mainなどの関数の中では関数を定義できません。一番外側ではないので。(もちろん、関数を使うだけならできます) 以下は、hello world と表示し、数字を1増やし、その数字も表示する。 これを3回繰り返すプログラムです。 #include <stdio.h> int i=0; void main() { printf("hello world"); i = i+1; printf("%d", i); printf("hello world"); i = i+1; printf("%d", i); printf("hello world"); i = i+1; printf("%d", i); } この 「hello world と表示して、数字を1増やし、数字も表示する」という部分は、結局3回とも同じ手順ですよね? だから、この部分を関数としてまとめてしまえば、目的がシンプルになって読みやすくなります。 main() を見て「なにかを3回するんだな」ということが簡単にわかります。 #include <stdio.h> int i =0; void many(void) { printf("hello world"); i = i+1; printf("%d", i); } void main() { many(); many(); many(); } 「many() が具体的に何を行うか?」は、とりあえず知らなくても、main()で「なにかを3回するんだな」と読めます。 こうすればいちいち処理の詳細を知らなくても簡単に読めます。 関数は、こうやって「プログラムを簡単に読めるようにするため」に使います。 簡単に読めるプログラムを書くのは、高速なプログラムを書くのと同じくらい高度で知的な作業です。
Cにはクラスがないのが残念だけどね
なければ作ればいい
#include <stdio.h> int i = 0; void main() { printf("hello world"); i = i+1; printf("%d", i); printf("hello world"); i = i+1; printf("%d", i); printf("hello world"); i = i+1; printf("%d", i); } これは712とまったく同じことをするプログラムですが、すごく読みづらいです。 現実は、こういう入り組んだ処理の流れの中から、「つまり自分は何がしたいのか?」を探し出す作業になるはずです。 プログラムを読みやすく書き直すことは、すごく難しいことだと思います。 オブジェクト指向も関数型言語も、結局目的はここです。簡単に読めるようにするためです。難解に書いて偉そうにするためではありません。 簡単にする方法は、ソースだけを見てても、なかなか見えてきません。 でも、ソースを一行一行読みながら、紙に○や線で図形を書いてみると、「自分は何をしたかったのか?」が本当の意味で見えてくる場合が多いです。 ソースを読むときは、紙にらくがきしながら読むといいです。紙や黒板にらくがきしながら考えると、言葉ではなく映像として浮かび上がります。 人間にとって映像は、言葉よりも遥に扱いが容易なので、考察に向いてます。(コンピューターとは逆ですね) ソースだけで考えるよりも、らくがきと平行して考えたほうが、ずっと理解が容易になるのでおすすめです。(人に説明するときも同じ) そういう「らくがき方法」を、カッチリと定義したものに、UMLやBootch法などがあります。 「これはとても高級なことなのだ」とハッタリをかましたがる人もいますが、あれは結局、万人向けの”らくがき方法マニュアル”にすぎません。 自由ならくがきを書いてると、「これはUMLに添ってない図だ!」と横槍を入れて嘲笑ってくる人もいるでしょうけど、気にしなくていいです。 自分の頭の中のらくがきを、そのまま紙に書き写して思考するのが、それこそが各自にとっての最良の思考ツールなのですから。
716 :
デフォルトの名無しさん :2010/06/08(火) 04:34:15
>>712 めっちゃ分かりやすい、ありがとうございます。
やっぱり実用書は理屈しか書いてないんでイメージしにくいです。
もっと想像力を鍛えます。関数を呼び起こすってのはプログラムの文を
そのまま呼び起こすってことなんですね!
>>717 つまりお前の頭がどうしようもなく悪いってこと
C言語幼稚園 さくら クラス みかん クラス りんご クラス
>>719 オブジェクト指向を勉強してからおいでよ
722 :
デフォルトの名無しさん :2010/06/08(火) 16:56:16
『C には××がない』 ↑ こういう奴は C 以外を使えばいい ××とやらが printf なだけでお手上げなタイプは
>>712 からの流れで言ってるのが分からない男の人って
流れが読めなかったからって意地張るなよ
712から713につながる流れとやらが理解できないw
>>726 >>727 マジで言ってんの?ただ関数を書くよりクラスで書いた方がよりその意味ではより効果的だということだよ
継承とポリモーフィズムなどの点において
>>728 話がいきなり interface まで飛躍するのか
そんな流れにはついていけないよ
objective-c にでも行けばいい
見てみたけど、知ったかしたいだけじゃない
objective-cってC++以上に糞だな
個人的にはCにOOPとかいらないけど、クラス(C++のStructで宣言出来る奴)ぐらいならほしい
>>734 OOP的用途なら FILE と f* 関数群で それとなくやっちゃってるし…
文法的に
コンストラクタ/デストラクタ で 生成/消滅の入れ子構造が書きやすい というのは大きいと思う
# が 順序依存が発生するようだと、ちょと工夫
736 :
デフォルトの名無しさん :2010/06/08(火) 18:36:30
> CにOOPとかいらない 802.3 に証明書とかいらない、みたいな違和感がある
>>735 OpenGL もそうだよな。
要は使い方次第なのに、それが解ってないやつほど不満ばっか垂れるんだよな。
OpenGLて
739 :
デフォルトの名無しさん :2010/06/08(火) 19:12:05
malloc使うとき、メモリ不足で割り当てに失敗した場合NULLが返されます。 NULLが返されたとき、異常系処理としてプログラム終了のコード書きますよね? 自分は終了コード書かず、プログラムを継続させたい。 それには、使用されないメモリを解放して空き領域を作ればいい。 言うのは簡単だが、使用されないメモリがどれか判断がつきません。 どうしたらいいですか。
>>739 自分の管理下での話なら GC(ガベージコレクション)あたりをググる
他人のアプリも含めたシステム全体についての話は…
あ き ら め る
malloc()できないのにプログラム継続とかw
>>739 あるプロセスが他のプロセスの事情を判断することは非常に困難だから、OS がメモリ不足といってきたらそれまで、だと思います。
743 :
734 :2010/06/08(火) 19:35:13
確かにOOPがいらないと書くと語弊があるようですね 継承がないクラスぐらいの意味合いでした
744 :
739 :2010/06/08(火) 19:35:18
やっぱり終了コード書かないといけないか。 せめてメモリの空き領域を知りたいですが、そんな都合のいい関数ないよね。
>>744 OSによる。
連続して確保可能な最大の空き と 全空きの合計 とは一致しないこともあるんで…
空きを知ったところで、あまりおいしくない。
自分がどれだけ使っているかを知る → こんだけ使ってるからヤバいかも?
というアプローチはありかもね
>>739 まずは不要になったら即freeするコードにしてみてはいかがか。
747 :
デフォルトの名無しさん :2010/06/08(火) 20:10:03
>>744 昔は coreleft とかあったよ
その後ゲイツ OS の「進化」によって意味がなくなってきたんだけど
今でもシングルタスクな環境では作れば意味はあるね
748 :
739 :2010/06/08(火) 20:42:40
>>746 その「不要」をどうやって判断するかが難しい
750 :
デフォルトの名無しさん :2010/06/08(火) 21:52:31
関数を設定例えば double dorille(double x){}と設定して int main(){}の中で呼び出してプログラム実行すると 即終了となるのは何故でしょう?理由が分かりません。
>>750 エスパーするとgetchar();を入れればおk
>>751 それは邪道。
pif ファイルを作れ。
753 :
デフォルトの名無しさん :2010/06/08(火) 23:10:08
自作の関数は呼び出しが不可能なのか・・
わざとなのかも知れないが、言語能力が低すぎるんじゃないか?
>double dorille(double x){} double値をリターンしてないわけだがなんで実行できるの
また4だろw
fgetsでstdinからポインタにintの値を入れたいのですが どう処理すればよいでしょうか。 int *pt fgets((char *)pt, **, **, stdin )と、キャストしてる時点でもう無理ですかね?
>>758 int *pt
fgets((char *)pt, sizeof pt, stdin);
で OK.
760 :
759 :2010/06/08(火) 23:47:20
入力は Alt を押しながらテンキーでな。
>>758 仮にできたとしても、文字列で入ってくるけどいいのか?
>>759 ありがとうございます。
ただ、
>>761 さんの仰る通り文字列で入ってくるみたいです。
整数としてその後の処理で扱いたいのですが・・・
scanfとか使えって話になるんですかね?
763 :
デフォルトの名無しさん :2010/06/08(火) 23:53:29
えっ
>>761 無知は黙ってろ。
質問されたことを質問の通りに答えろ。
意訳など厳禁。
プログラマーの常識だろ。
>>762 問題ない。
#include <stdio.h>
int main(){
int *pt;
fgets((char *)pt, sizeof pt, stdin);
printf("%d\n", pt);
return 0;
}
これで、
Alt+1 Alt+0 Alt+0 Alt+0 Enter
と入力してみ。Alt は毎回離せよ。数字はテンキーでな。
ちゃんと整数として扱われる。
あ、convertの下のほうにi++;ってありますけど、試行錯誤してた時の消し忘れです そこは実行には影響無いはずです
>>765 Alt押しながらっていうのは、そういうことでしたか
理解できずに流していました、申し訳ないです。
ちょっとためしてみますね。
丁寧に説明していただき、ありがとうございました。
なんだか低レベルの質問と意図的に遊んでいるレスと
振り回されているレスが何本も並行していてわけわからんな。
>>574 strtok()使うよりstrtol()辺りを使った方がよさそうな気がする。
それはさて、tpはstrtok()で切り出したエリアを指すポインタなのは言うまでもないよな。
一方、"+"は文字列リテラルへのポインタだ。
つまり、それらを比較しても常に一致しない。
tpのポイントしている先に文字'+'があるかどうかを知りたいのなら、* tp == '+'としないといけない。
要は、演算子の処理が全く働いていないと言うことだな。
それに気付けないと言うことは、デバッグの仕方ももうちっと工夫しないとね。
>>765 >fgets((char *)pt, sizeof pt, stdin);
fgets((char *)&pt, sizeof pt, stdin);
だろ。
頭が頭痛で痛い。
>>769 すみません、言い忘れてたんですが *tp == '+' もやってみたんです
でもやっぱり同じ結果でした
ちょっとstrtol使ってできるか試してみます
ありがとうございました
>>772 あー、出力されない方が問題か。
main()のwhileの条件がおかしい。
終端条件は、type == TNUM && value == 0で脱出だろ?
あんたのコードではtype != TNUM && value != 0で継続(つまりtype == TNUM || value == 0で脱出)になっている。
論理式になれていないなら、無理に各項を反転しようとしないで全体を括って ! で反転したら?
774 :
デフォルトの名無しさん :2010/06/09(水) 01:13:20
コンピューターのプログラミング言語が沢山ありますが 数多くある言語すべて知ってないと行けないのでしょうか? プログラマーになるならこれとこれやっとけば大丈夫って言うのはどれとどれでしょうか
C++だけ覚えて業界に飛び込め。 後は必要になったら3日で覚えろ。
アセンブラだけは絶対やっとけ。 CASL II か、Z80 の辺りがお薦め。 個人的には 6502 がいい。
777 :
デフォルトの名無しさん :2010/06/09(水) 01:21:39
>>775 C++を一から覚えるには何日くらいで覚えられますか?
>>773 while(!(条件))にしてできました!
ポインタをまだあまり理解してないのでconvert内が原因だと思い込んでました
今度からは出力がおかしい時は条件式も疑うようにします
どうもありがとうございました
>>777 言語は覚えるものじゃない。使うものだ。
つーか、スレ違い。
>>778 「出力がおかしい」から「条件式を疑う」というわけじゃないぞ。
単に>769の段階で出力ループの問題に気付かなかっただけだ。
781 :
デフォルトの名無しさん :2010/06/09(水) 01:49:49
>>777 C++の仕様はデカイから、専業で真面目にやっても3年くらいはかかる。
C++ なんかやるくらいなら C♯やったほうがいいよ。
783 :
デフォルトの名無しさん :2010/06/09(水) 02:16:14
>>757 ??
>>755 return って関数プログラム終了の時に書く奴じゃないですか?
double値をリターンしてないってどういうことですか?
うぜえよアホ
何か問題がおきたときはコード全部あげて、エラーが出たならエラーメッセージも貼る
コーディングが一番気持ちいいのはpython
一時期rubyもそういわれてたけど最近聞かなくなったな。 その感覚が普通になっちゃったのかな
メソッドチェーンが正気の沙汰とは思えない
へぇ。。。素直に理解できない人もいるのだな。。
うぜえよアホ
791 :
デフォルトの名無しさん :2010/06/09(水) 12:58:16
やっぱ、言語自体の面白さを問うなら、C、C++が一番だね。 お、こりゃ便利だね。っと実感できる。 C#とかは、GUIやらWEBの部品を組み合わせるだけだもんね。 って、ことで俺のお勧め、C。
792 :
デフォルトの名無しさん :2010/06/09(水) 12:59:13
まあ、あくまで昔のコンソールアプリ用の言語だから、 コンソールアプリを作りながらとか空想しながらが一番いいよね。
昔のコンソールアプリ用ってどういうこと?
794 :
デフォルトの名無しさん :2010/06/09(水) 13:55:41
昔っからコンソールにしか使ったことがないという個人的感想だろ
まあ他の言語ろくにつかったことないなら何も言わずにそのままC使ってればいいじゃない
他の言語をまともに使うとCを選ぶ価値はないといっているかのように読めてしまって、俺もぼけたかなぁ。
禿げるほどぼけてるね
お前らなんでCの勉強始めたの?
本です
800 :
798 :2010/06/09(水) 16:02:58
訂正 ×なんで ○なぜ
当時BASICが遅かったから
というかまあ、Cを勉強して何を作るつもりなの
UNIXに慣れるため。特に何を作ろうとは考えず、 どうやって動いているかに興味があった。
若かったから何でもやってみたかったんだよ。
現在なら、プログラマの嗜みとしてじゃないかな
変な空気が漂ってるな・・・
そこにCがあるから
5/0みたいにわざと定義されてない計算結果を出力させたらinfって出たんですが これってどういう意味ですか?
810 :
デフォルトの名無しさん :2010/06/09(水) 21:41:09
W-Infinity
あ、ちょっと調べたら自己解決しました
812 :
デフォルトの名無しさん :2010/06/09(水) 22:21:17
test
813 :
デフォルトの名無しさん :2010/06/09(水) 22:22:58
質問です 今、素数を算出し表示するコードを書いているのですが 今考えている計算式だと、2,3,5,7の数値が表示できません 何かいい計算式はないでしょうか
814 :
デフォルトの名無しさん :2010/06/09(水) 22:30:08
エラストテネスのふるい
815 :
813 :2010/06/09(水) 22:35:24
これってつまり、求めたい数だけの配列を用意しなければならないということですよね? 単純に計算式でふるいにかけるより プログラムとしては重くなるような気がするのですが、どうなのでしょうか でも、素数を求めたいだけのプログラムなら何の問題もないでしょうね 回答ありがとうございました
CでGUIをやるのにおすすめの本とかってありますか?? ググったのですが、いろんな意見があるみたいで・・・。
Qt
C#に鞍替え
BCB
delphi
今の時代、Cじゃなかなか仕事貰えないですか?
822 :
デフォルトの名無しさん :2010/06/09(水) 22:57:28
Cの入門書とかではループカウンタに int 型を使いますよね。 でも、例えばループ回数が100回とかだったら char とかでもいけると思うんです。 そうすればメモリ使用量がわずかに減ると思うんですが 上級者の方たちは、そうやって節約したりするんでしょうか? それとも、そういうテクニックはあまり使わないんでしょうか?
はい
char型にしてもメモリ減らない上に処理遅いだけでいいことない
まあな
構造体と配列以外でそういうことはしなくていい
せつやくするところが違う。 char a[N]とint a[N]なら意味はある。 ループは、内部で32bit整数として計算している可能性もあり動作が遅いかもしれない。
カウンタはレジスタに割り当てられてる場合もあるしな メモリアクセス云々もあるし、どうしてもって時じゃなければintで
intが一番速いからね
CoreアーキテクチャのCPUで1ループ1μOPが与える影響考えたら、頭が痛くなってきた
>>822 じゃないが、ありがとう、勉強になった
831 :
デフォルトの名無しさん :2010/06/10(木) 00:36:09
1ループって何?
coreって命令を先に読むんだぜ。すごいよな!
プリフェッチ?
尻フェッチ
835 :
デフォルトの名無しさん :2010/06/10(木) 01:24:27
C言語で色々な数式のプログラムの仕方を書いた本ってありませんか? 何かお勧めなものが有りましたら教えてください。
定価から1割引、3割引、5割引、8割引を計算するプログラムを作りたいんですが コンパイルまではうまく行ったのですが、うまく動作しません。 何が行けないのでしょうか 教えてください。 #include <stdio.h> int main(void) { int teika,itiwari,sanwari,gowari,hatiwari; /* 入力部分 */ printf("定価を入力してください"); scanf(" %d ",&teika); /* 計算部分 */ itiwari =((int)(teika * 0.9)); sanwari =((int)(teika * 0.7)); gowari =((int)(teika * 0.5)); hatiwari=((int)(teika * 0.2)); /* 表示部分 */ printf("定価が%d円の時、1割引は%d円、3割引は%d円、5割引は%d円、8割引は%d円です。\n",&teika,&itiwari,&sanwari,&gowari,&hatiwari); return 0; }
宿題は宿題スレへ
printf("定価が%d円の時、1割引は%d円、3割引は%d円、5割引は%d円、8割引は%d円です。\n",teika,itiwari,sanwari,gowari,hatiwari);
>>835 もっと具体的に
色々なと言われても範囲が広すぎる
「数式のプログラム」ってのはどういうものを想定しているんだ
ここ > printf("定価が%d円の時、1割引は%d円、3割引は%d円、5割引は%d円、8割引は%d円です。\n",&teika,&itiwari,&sanwari,&gowari,&hatiwari);
scanf(" %d ",&teika); →scanf("%d",&teika);
>>841 こっちの方が見落としやすいね。コンパイルするまで気付かなかった
>>839 そりゃあmathematicaみたいなものだろ
皆様どうもありがとうございました。 ご指摘の通りprintf("定価が%d円の時、1割引は%d円、3割引は%d円、5割引は%d円、8割引は%d円です。\n",teika,itiwari,sanwari,gowari,hatiwari); としましたが動かなかったところ scanf("%d",&teika); に直したら正常に動作できました! スペースを入れてはいけないのですね。 ご協力いただきましてありがとうございました。(TT) ちなみに宿題ではなく自己啓発なんです。
>scanf(" %d ",&teika); これは別にいいんじゃね?
前はいいけど、後ろのは邪魔
もう一個なんか入力受けて取るかctrl+zとか入力しないと進まない
セミナーかよ 自己学習であってほしい
レベルが下がりすぎ
入門スレで何文句言ってんだ?
もういいからこの流れ
854 :
デフォルトの名無しさん :2010/06/10(木) 06:59:22
ライブラリの作成コマンドを教えてください。 リターンだけの関数を記述したa.cのオブジェクト「a.o」を「cc -c a.c」で作りましたが、 「ld -o output /lib/crt0.o a.o -lc」 を実行してもエラー(そんなシンボル知らない)になってしまいます。 どうすれば良いのでしょうか? ※ldはmanで調べたとき例として出てきた文です。
つ ar
>>854 恐らくPOSIX環境だと思われるのだが、そういう環境依存の質問は環境を書くように。
で、a.oから例えばliba.aを作りたいなら>855の指摘するようにarコマンドを使えば宜しい。
arコマンドは、単なるアーカイバなので使い方も一般的なアーカイバに似ている。
arコマンドは単にライブラリ(アーカイブ)を作るだけでなくそれをリストアップするのにも
使えるので、manコマンドで説明を読んでおくことをお勧めする。
シェアドライブラリを作りたいんじゃないの?
確かにシェアードオブジェクトならUNIXスレかどっかかな。いずれにしても、これ以上はスレ違いだな。
iPhoneってC言語対応?
はい
Jailbreakしたら、gccで自作ツールいけるみたいですね。
SDKがObjective-CだからCだけじゃなんともならんだろけど。
2つの自然数aとbの最大公約数gcd(a, b)を求め、それを出力するプログラムを作成せよ。 なお、m = a % b としたとき、gcd(a, b) は m≠0 の場合 gcd(b, m) に等しく、 m=0 の場合 b に等しい。 2つの自然数aとbを入力させ、a 人から b 人を選ぶ組み合わせ comb(a, b)を求め、それを出力するプログラムを作成せよ。 なお、comb(a, b) = comb( a-1, b) + comb( a-1, b-1) であり、 b==0 もしくは b==a のとき comb(a, b) = 1 である。 今週は2つありますが。。。よろしくお願いしますorz
宿題は宿題スレへ
>>865 そっちの人が少ないので、どうかお願いしますorz
ふざけるな
真面目です
1番目のはできたから、これだけは助けてくださいorz 2つの自然数aとbを入力させ、a 人から b 人を選ぶ組み合わせ comb(a, b)を求め、それを出力するプログラムを作成せよ。 なお、comb(a, b) = comb( a-1, b) + comb( a-1, b-1) であり、 b==0 もしくは b==a のとき comb(a, b) = 1 である。
>>869 これでいいだろ
if(a<0 || b<0 || b>a) return 0;
宿題は宿題スレへ。勢いソートで上にあるスレに書き込むな
>>869 問題文は再帰を使えと誘導してる感じだな
フェイクだろ。馬鹿らしい
Cのための易しいアルゴリズム本ってなんですか?
定本
>>876 ありがとう、よさそうな本ですな。
明日本屋いってくる
878 :
デフォルトの名無しさん :2010/06/10(木) 23:15:20
>comb(a, b) = comb( a-1, b) + comb( a-1, b-1) これ意味がわからん。 comb( a-1, b) + comb( a-1, b-1) = comb( 2a-2, 2b )ならわかるが
880 :
869 :2010/06/10(木) 23:28:49
5C2 なら (5の階乗-2の階乗)÷2の階乗で求められるはず。 階乗を求め方はぐぐればある
881 :
878 :2010/06/10(木) 23:29:57
>>869 宿題スレに書き込んだ後、マルチだと判ったんで、ふざけるなと言いたいけど削除できないんだよな。
せめて、他スレに書くときは、最初のスレから誘導しろよ。
883 :
デフォルトの名無しさん :2010/06/11(金) 01:12:38
午前様、マルチ見つけて鬼の首… もう寝ろバーカ
>>869 #include <stdio.h>
#include <stdlib.h>
unsigned int comb(unsigned int a, unsigned int b)
{
if(b==0 || b==a) return 1;
return comb(a-1, b)+comb(a-1, b-1);
}
int main(int argc, char **argv)
{
if(argc != 3) return -1;
unsigned int a = (unsigned int)atoi(argv[1]);
unsigned int b = (unsigned int)atoi(argv[2]);
printf("comb(%u,%u)=%u\n", a, b, comb(a,b));
return 0;
}
ふざけるな
?
!
888 :
デフォルトの名無しさん :2010/06/11(金) 12:44:38
次の関数abcの機能を説明してくれ! void abc(int a,int b) { int c; c=a; a=b; b=c; }
そうね、何もしない。
void(笑)
意地悪な経験者が初心者を陥れてはストレス発散するスレはここですか?
別に質問スレでもないし、いいんじゃね
というか自演だろ
a int型の変数 b int型の変数 c int型の変数
896 :
デフォルトの名無しさん :2010/06/11(金) 14:31:02
>>888 関数として呼び出すときは何の効果もない
一応関数内ではaとbの値を交換しているが、関数内のローカル変数なのでとくに意味がない
foo *bar; は、foo型の変数barを宣言、 &bar; は、変数barのアドレスを返す、 では、 *bar; これは一体何を返すのか教えてください。 C++やってて出て来たのですが、多分Cの問題だろうと思い、こちらに書かせて頂きました。
> foo *bar; は、foo型の変数barを宣言 間違い。 foo型へのポインタ型の変数barを宣言。
>>899 あ、確かに。すいません、凡ミスでした。
*bar; が知りたいのですが、こちらもお教え願えませんでしょうか?
ポインタ変数 bar が指し示す foo 型のデータの実体
>>901 ありがとうございます!
(*bar).foo();とメソッドを呼ぶ変わりにbar->foo();として呼べるのを思い出しました。
普段、->演算子しか使わないので、ピンと来ませんでした。
ありがとうございました。
ということは int *a; ってやると、ポインタを入れる場所とint型変数の実体と、 領域が2つセットで自動的に確保されて、 ポインタの方にaという名前が付く、という理解でいいのでしょうか?
なるほど、実体仮体モデルですね
ですね
>>903 実体は実体で別に準備しないといけない。
909 :
デフォルトの名無しさん :2010/06/11(金) 20:57:48
char str[5] = "hello,world"; str[5]とした時点でバイト分の領域が確保されるはずです。 問題はこの後で、"hello,world"という12バイト分の文字列をstr領域に無理やり代入してみました。 この時点で不正なメモリにアクセスすることになるはずなのですが、コンパイラはOKらしいです。 sizeof使ってサイズを調べてみたら12バイトになってました。もうわけわかりません
どのコンパイラ?
>>909 とりあえずコードを見せてください。
おっしゃるとおりなら、それは不正なやりかたてす。環境によっては落ちるか落ちないかは時の運ということもあります。
>>909 実装依存です
いわゆる鼻から悪魔です
char str[5]="hello"; // これは特別にok
Ubuntsって、C言語のプログラミングの出来る環境ありますか? vinelinux意外に、オススメのプログラミング環境があったら教えてくれないでしょうか?
914 :
909 :2010/06/11(金) 21:08:01
gcc version 3.4.4 #include <stdio.h> int main(void) { char str[] = "hello,world"; printf("%d",sizeof(str)); return 0; } $ gcc -o test01 test01.c ←コンパイル問題なし $ ./test01 12 ←どういうことやねん
gccは使える。vineよりはubuntuの方が良い
>>909 そのコンパイラが特殊だとしか言いようがない
>>char str[] = "hello,world"; 5じゃねえのかよ
>>914 どこに char str[5] があるんだ?
バカなの? 死ぬの?
919 :
909 :2010/06/11(金) 21:10:20
すみません。[]の中に5がありませんでした 結果はこうでした $ gcc -o test01 test01.c test01.c: In function `main': test01.c:5: warning: initializer-string for array of chars is too long $ ./test01 5
なんだ ただの勘違いだったか
初期化に使う値が多すぎる場合は 配列サイズの所で打ち切られるはずだ
922 :
903 :2010/06/11(金) 21:12:49
すると、実体を用意して数値を格納する変数として使えるようにするには int *a; int b; *a = &b; のようにすればいいんでしょうか?
923 :
903 :2010/06/11(金) 21:15:06
なんか違う気がしてきました a = &b ですか? ポインタ難しいです
ポインタに数値が格納されることはないから
926 :
924 :2010/06/11(金) 21:17:39
失礼、ちがった。 int *a int b a = &b ですね。
>>915 ありがとうございます。
人工知能(AI)に、興味があるのですがAIはC言語で組めるのでしょうか?
やっぱりRubyとかの方がいいのでしょうか?
なぜ言語差があると考えるのだね
929 :
909 :2010/06/11(金) 21:24:45
>>921 なるほど。
実際には不正メモリアクセスは起こらず初期化時に打ち切られるんですね
930 :
924 :2010/06/11(金) 21:25:04
AI ってなんだろうか? bonanza とかも AI なんですかね?
>>929 普通は意図した動作とは違う動作になるので(値が足りなくなるから)
まずバグになる
てか、warningもerrorと差はないと考えて
warningも0になるようプログラムするのが良い
>>927 どれでもいいんじゃね?関数型言語の方が適しているという話はあったが
ちなみにRubyのようなスクリプト言語よりはCの方が圧倒的に速いから、Cで良いんじゃね
新しい言語の方が多機能ではあるが
933 :
909 :2010/06/11(金) 21:37:47
>>931 勉強になりました。
実は他の人がそういうコード組んでて、それだ不正メモリアクセスするよと指摘してあげると
しねーよバカといわれたんです。その証拠にプログラムも問題なく動いていたからなぜ???と思った
934 :
903 :2010/06/11(金) 21:39:45
なんとなくわかってきたような気がします。 配列変数の場合はこんな感じでポインタを初期化すればいいんでしょうか? int *a[10]; int b[10]; int i; for( i = 0; i < 10; i++ ) { a[i] = &b[i]; }
はい、はい。
そうですか。 ありがとうございました。 AIをC言語で組む勉強にオススメの本などはないでしょうか? 前、探してみたところRubyとかだったので・・・
どんなAIなの?
940 :
デフォルトの名無しさん :2010/06/11(金) 22:29:36
>>938 まずは、既存の推論エンジンを使ってみて
推論エンジンとは何たるかを憶えることだな
それさえ解れば C でどう実装するかは作業でしかない
if (! strcmp(...)) というのをよく見るんだが、読みにくいのでやめて欲しい。 if (strcmp(...) == 0) でいいじゃん、と思ってしまう。 == で比較するのはコストがかかるのだろうか。 だったらコンパイラが最適化(否定形に置き換え)してくれるのではないだろうか。 どうなの?
慣れろ
最適化しなくても変わんね
>>941 私もstrcmp() == 0 と書くね。
まぁ、! strcmp() は慣用句だから。
ちなみに、まともなコンパイラなら同じコードになるように最適化する。
では何故。
読みにくくないから。 ==0より簡単に書けるから。
しかし違和感がある。 慣用句だから、と言えばそれまでだが。。
948 :
デフォルトの名無しさん :2010/06/12(土) 10:27:57
違和感というなら strcmp() = 0 はどうよ? 言語と喧嘩しても仕方ないって
それは違和感ない。 左辺と右辺が等しいとき、(左辺) - (右辺) は 0 に等しいからである。
= 0 は代入だろw
じゃぁ && とか || を制御構文代わりに使うのはどう思う?
読めるけど使わないからどうでもいい。
()の中が0かどうか、0じゃなければすぐ後ろが真で次が偽、慣れたらこちらのほうが簡単。 文も短くなるしね。
()の中が0かどうか、0じゃなければすぐ後ろが真で次が偽、慣れたらこちらのほうが簡単。 文も短くなるしね。
ありゃりゃ、大事なことじゃないけど2度言いました、すみません orz
同じことなので2度言いました^^;
958 :
デフォルトの名無しさん :2010/06/12(土) 12:42:30
(^_^;)
959 :
デフォルトの名無しさん :2010/06/12(土) 13:25:57
>>950 そう、C ではね
C では strcmp() == 0 とも !strcmp() とも書くというだけ
言語と喧嘩しても仕方ないって
if (0 == strcmp(...)) と書くやつだっているし。
...はどういう意味ですか?
省略してるだけでしょ
>>960 代入と比較を間違えないようにと左辺に定数とか
もってくる奴がいるけど、正直きもすぎるw
= で代入できてしまう言語仕様の方がきもい。
=が演算子で代入が式として扱われるのが原因だから=で代入できてしまうこと自体が問題なのではない きもいのなら代入式を廃して「左辺値=右辺値;」で代入文になるように文法の改定を提案したらどうだ
>>941 おれもブール値のばあいは
if (b) ・・・
if (!b) ・・・
と書くけど
strcmp()のリターン値はブールじゃないから==や!=で比較する。
!strcmp って書くやつは英語ができないやつだと思ってる。
英語圏のプログラマで!strcmp()って書くヤツは英語ができないのかw
969 :
デフォルトの名無しさん :2010/06/12(土) 16:15:35
!strcmp じゃ意味ちゃうべ
お前ら一番最近作ったソフトどんなの?
しょぼい掲示板 一度に140文字ずつしか書き込めないけどw
:(;゙゚'ω゚'):
小規模だけど、デーモンとそれ専用のクライアント
>>965 勢いはいいけど…
#define NOT !
ここにいる先生たちはmallocを自分で書けますか?
かけますよ。
malloc
書きたくありませーん
windowsとして、HeapAlloc呼び出すまで自力で書けって言うなら、俺には無理そうだな そんな車輪の再発明みたいなことは
windows なら VirtualAlloc 使おうよ
「車輪の再発明」って言葉の意味を間違って使ってるやつ意外と多いよな。
メモリをダンプしながら検証してたけど、うまくいかないので質問させてください。 文字列の一部を動的に確保したchar *hogeにコピーしようと思ってます。 char*piyo="ABCDEFG"; とやって、"BCDEF"をコピーする場合、 ・hoge = (char*) malloc(5)ですか(6)ですか? ・strncpy(hoge, piyo+1, 5)とやったあと、*(hoge+5+1)=0は必要ですか?
0で終端させたいのかさせたくないのかどっちかわからんと何とも言えない
↑は*(hoge+5)=0の間違いでした。たぶん。 その後printf("%s\n", hoge)としたいので\0で終端させたいです。
hoge = (char *)malloc(6); strncpy(hoge, piyo+1, 5); *(hoge + 5) = '\0';
即レスthxです!
988 :
デフォルトの名無しさん :2010/06/12(土) 18:59:52
せっかく n 系使っても、この使い方じゃセキュリティ対策にならないな
>>981 ありがとう
昔の記憶で書いたのであれでしたが、ページ単位で確保するのはvirtualAlloc系でしたね
>>982 mallocぐらいになるとこう表現してもいいと思いましたが、違ってましたか
>>983 >>986 sprintf()なら一発だぜ。
sprintf(hoge, "%.5s", piyo + 1);
mallocの最終呼び出しAPIはHeapAlloc
ふーん
995 :
デフォルトの名無しさん :2010/06/12(土) 22:04:51
HeapAlloc であろうと VirtualAlloc であろうと、仮にそれで「作った」として 何ができたつもりになれるんだ? くっだらねー
リーク追跡情報を付加する程度か? <自作malloc 環境によっちゃ既に仕込まれてたりするけど
大抵既にある物より下のものしか出来ないのさorz
>>992 thxです。これでsprintf覚えました。
切り出す文字列が固定幅かそれに準ずる時はかなり使えますね。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。