1 :
デフォルトの名無しさん :
2006/01/22(日) 21:39:32 ではお願いします
exit;
じゃあHello, world置いとくね #include <stdio.h> main(argc, argv) int argc; char *argv[]; { printf("%s: Hello, world!¥n", argv[0]); return 0; }
4 :
デフォルトの名無しさん :2006/01/22(日) 21:42:09
上げてしまいました
6 :
教官A :2006/01/22(日) 21:43:41
徳島県在住の学生です
8 :
デフォルトの名無しさん :2006/01/22(日) 22:31:06 BE:310569784-
>>8 最初はCでいいんじゃない?教える人がいればいいけど、
Cがわかっているのが前提、というC++の本ばかりだし。
窓アプリが作れるようになるまで、続くといいけどなぁ。
12 :
デフォルトの名無しさん :2006/01/23(月) 19:18:25 BE:155284782-
13 :
デフォルトの名無しさん :2006/01/23(月) 19:34:28
1の発想の転換力に激しく嫉妬。
>>12 better CとしてC++を使うと楽チンだけど、最初は範囲が広くて
困るんじゃないかなぁ。Cの基本を前提としないC++の本があれば
いいんだけどね。
Cをざっと早足で通してやって、C++からじっくりやるのがいいのかもね。
Cは知っていて損はないし。
どうやら、
>>1 はHello worldで挫折したらしいなw
16 :
ζ゚ ◆f3DF7bkpu2 :2006/02/01(水) 20:30:08
暇だし俺が乗っ取ることにした。 おk、HelloWork理解した。次こい!
暇人に付き合う暇人。
まあ待て、落ち着け。 今トリビア見てるから。
19 :
ζ゚ ◆f3DF7bkpu2 :2006/02/01(水) 21:45:01
浦和競馬場アツイなw 競馬予想プログラムとか組みたいぜ。
C++はキライです #include <iostream> int main(){ std::cout << "HelloWork" << std::endl; return 0; } とか、ワケワカラナス std::とか<<とか、いきなりこの仕打ちが挫折の原因と思う
>>20 いや、それむしろ便利なところだから。
printf("hogehoge %d",i);って書くより、
cout << "hogehoge " << i << endl;
って書いた方が楽じゃね?
24 :
ζ゚ ◆f3DF7bkpu2 :2006/02/02(木) 00:30:30
慣れ? 見慣れれば大丈夫? それはともかく、hogeってよく見かけるけど、何? 『 Hello,World! 』って?直訳すると「世界こんにちは」? Hello,Welcome C(C++) language World! じゃね?
>>24 あんたおもろいね。hogeっていうのは、適当な言葉さ。
特定の言葉入れる必要ないから、適当にいれているだけ。
Welcome,いいねー。ついでにいうとWelcome toだな。
で、開発環境とかはなに使っている?
26 :
ζ゚ ◆f3DF7bkpu2 :2006/02/02(木) 08:19:50
今沖田
>>25 おもしろいやつとは何だ失礼なプンスカ
毛唐の言葉なんて覚える気まるでないッスよ。
Windows2000+VisualStudio.NET
.NETのいちばん最初のやつ。VBもC#も作れるぜ。
27 :
デフォルトの名無しさん :2006/02/02(木) 08:29:07
hogeのほかに何か名前が必要になったらpiyoだよ。
積年の謎がひとつ解けた。これでまた野望に一歩近づいた。 前フリとは関係なく、てめえらのこと占ってやるから覚悟しやがれ。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { char *status[5]={"大吉","中吉","吉","末吉","凶"}; srand(time(NULL)); printf("今日の運勢は【%s】っぽ\n",status[rand()%5]); return 0; }
29 :
ζ゚ ◆f3DF7bkpu2 :2006/02/02(木) 13:26:28
age忘れ。 どうせなら乱数の種つかわないで絶対【凶】になるようにするべきだったか
30 :
デフォルトの名無しさん :2006/02/02(木) 17:43:50
乱数にはメルセンヌツイスタ法を利用した方がより一様な疑似乱数を得られる。
をいをい、おみくじにずいぶん凝ったことするなw しかしζ゚ ◆f3DF7bkpu2は、別にC初心者じゃないようだな。 このスレ、どう再利用する?
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { char *status[5]={"凶","大吉","中吉","吉","末吉"}; srand(time(NULL)); printf("今日の運勢は【%s】だお¥n",status[rand()%1]); return 0; }
char *status[5]={"凶","大吉","中吉","吉","末吉"}; 人間は余計なことせずに、コンパイラに数えさせろ。
34 :
ζ゚ ◆f3DF7bkpu2 :2006/02/02(木) 18:28:25
永遠の初心者ですが何か。 ウインドウに文字が書けないひとです。 #include <stdio.h> #include <stdlib.h> int main() { char *status[7]={"女神","大吉","吉","末吉","ぴょん吉","凶","豚"}; printf("今日の運勢は【%s】かもね\n",status[rand()%7]); return 0; }
char *status[]={"凶","大吉","中吉","吉","末吉"}; こうゆうことじゃない?
constつけろバカ
こんなもんかな。 #include <stdio.h> #include <stdlib.h> int main() { static char const * const status[]={"女神","大吉","吉","末吉","ぴょん吉","凶","豚"}; printf("今日の運勢は【%s】かもね\n",status[rand()%(sizeof(status) / sizeof(*status)]); return 0; }
39 :
ζ゚ ◆f3DF7bkpu2 :2006/02/02(木) 18:48:24
配列はそれでいいとして、要素数は? 専ブラだとついsageてしまうぜ。
40 :
ζ゚ ◆f3DF7bkpu2 :2006/02/02(木) 18:51:54
staticとconstの違いがわからねえぜ。ちょっくらぐぐってくる。 const * constとか、もう何がなんだか。
>>40 それはあれだ、
「静的な領域の」「変更不能な」「キャラ型の」「変更不能な」「ポインタの」「配列である」status
と言う意味だよ。
char const * const → キャラがコンスト、ポインタもコンスト、 const char * const → コンストなキャラのポインタもコンスト、
「constつける意味ってあるの?」と疑問におもう俺は初心者ですか?
44 :
ζ゚ ◆f3DF7bkpu2 :2006/02/02(木) 19:06:00
ξ錯乱しておりますグザイ 「static」=性的な 「const」=不能 なんとなくおk
>>43 文字列リテラルは変更不能なので、const宣言しておくべきなのです。
例:
char * p = "abc";
p[0] = 'A';
constつければエラー処理してくれるのです。
も少し便利な例:
strcat("abc", "def");
と書くと、宣言が
char * strcat(char *, const char *);
なのでエラーにナルです。
ひらたく言うと、書き換えないものは、ミスを減らすためにも constつけておけ、ということです。
47 :
ζ゚ ◆f3DF7bkpu2 :2006/02/02(木) 21:26:00
ネタ切れの予感… いかん、このままでは「名無しさん」に戻ってしまう
よっし、それじゃあネタ投下だ。 VS,コマンドラインから使っている?そのままIDEでやってる?
49 :
ζ゚ ◆f3DF7bkpu2 :2006/02/02(木) 21:45:06
IDEだけど「空のプロジェクト」は厳守。 clでコンパイルできるようにはしてる。
なかなかやるね。コマンドラインからコンパイルすると 実際なにやってるかよくわかるしね。clでそのままコンパイルできるなら 小さいコードは、エディタとclでやると軽くていい感じ。 んじゃ、スタックとヒープってなんだかわかる?
51 :
ζ゚ ◆f3DF7bkpu2 :2006/02/02(木) 22:37:59
以前、マジモンでまったくわからないときに //TODO ここに目的のコードを書く で挫折したからな。勝手にコード作られるのはうざい。 で、 「スタック」 FILOとか後入れ先出しとか。言葉だけでCの実装はシラネ 「ヒープ」 聞いたことあるけど不明。言われたら多分「あ、それ知ってる」と思
52 :
ζ゚ ◆f3DF7bkpu2 :2006/02/02(木) 23:08:51
話を蒸し返すけど、今日やっとconstとstaticの違い理解した!と思 staticの「静的な」を実感するため、こんな感じで書いてみた。 #include <stdio.h> int count(void) { static int a=0; return(++a); } int main(void) { int i; for(i=0;i<5;i++)printf("%d ",count()); printf("\n"); return 0; }
いや、話蒸し返してないぞ。staticとか、mallocで作った領域(変数)は
ヒープってところに作られるんだ。んで、そういうのつけないで関数の
中で宣言したのは、スタックってところに作られるんだ。
だから、前の問題だしたのさ。
でも
>>52 はほっといても大丈夫っぽいな。燃料ないわw
なんかいいの思いついたらくるわ。んじゃ。
狂,凶,大凶の3つでおみくじを作りたまえ。 人間、良いことばかり気にしてちゃイカンよ。
きのうまでの俺ならstatic int a は間違いなくグローバルに置いてた。 関数呼び出しのたびに使い捨てとおもってたから。 ありがとう友よ GJ俺 あしたの俺はもっとでっかいぜパンツからはみ出すぐらいに!
>>52 なんだかんだ言って、結構センスいいポイント突いてるね。
そのcount()関数みたいなやり方はシングルスレッド限定だけどよくある手法だよ。
そこで問題、
>52のcount()と次のコードの違いはなんでしょう。
static int a=0;
int count(void)
{
return(++a);
}
>>53 static変数の領域はヒープではない。
59 :
53 :2006/02/03(金) 01:04:56
なんか変なこと書いたような気がして戻ってきた。
>>58 指摘ありがとう。そう、staticはヒープではないね。
ヒープはmallocで動的に確保される領域だから。関数が抜けても
値が保持されるのは同じような性質だけど。
じゃ、1から教えるぞ。 まず #
61 :
ζ゚ ◆f3DF7bkpu2 :2006/02/03(金) 01:07:03
>>60 おk理解したwww
粘着してるわけじゃなくて今戻ってきたとこ。
ブログ更新してた。
#include <stdlib.h> #include <stddef.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #ifndef B_SIZE #define B_SIZE (8192) #endif /* !B_SIZE */ #define HTTP_PORT 80 #define PROTO "tcp" void err_exit(char *mes1, char *mes2); int write1line(int fd, char *str); char linebuf[B_SIZE]; /* Buffer for Readline */ int linebuf_start, linebuf_end; void init_linebuf(void); int read1line(int fd, char *buf, int max); int readbuf(int fd, char *buf, int max);
main (int argc, char *argv[]) { char *hostname, *path; unsigned short port; struct sockaddr_in sin; struct hostent *hentp; struct protoent *pentp; int sock, len; char buf[B_SIZE]; switch (argc) { case 3: port = HTTP_PORT; path = argv[2]; break; case 4: port = atoi(argv[2]); path = argv[3]; break; default: fprintf(stderr, "usage: %s hostname [port] path\n", argv[0]); exit(EXIT_FAILURE); } hostname = argv[1];
/* Initialize Socket */ memset(&sin, 0, sizeof (sin)); sin.sin_family = AF_INET; if ((hentp = gethostbyname(hostname)) == NULL) { err_exit("gethostbyname", "can't get address"); } memcpy(&sin.sin_addr, hentp->h_addr, hentp->h_length); sin.sin_port = htons(port); if ((pentp = getprotobyname(PROTO)) == NULL) { err_exit("getprotobyname", "can't get protocol number"); } if ((sock = socket(PF_INET, SOCK_STREAM, pentp->p_proto)) < 0) { err_exit("socket", NULL); } /* Connect to a Server */ if (connect(sock, &sin, sizeof (sin)) < 0) { err_exit("connect", NULL); } /* Send Request */ if (snprintf(buf, B_SIZE, "GET %s HTTP/1.0", path) < 0) { err_exit("snprintf", NULL); } if (write1line(sock, buf) < 0) { err_exit("write1line", NULL); }
/* send host name */ if(snprintf(buf, B_SIZE, "Host: %s\r\n", hostname) < 0) { err_exit("write1line", NULL); } if (write1line(sock, buf) < 0) { err_exit("write1line", NULL); } if (write1line(sock, "") < 0) { err_exit("write1line", NULL); } /* Receive Response */ init_linebuf(); /* Receive Status Line */ if ((len = read1line(sock, buf, B_SIZE)) < 0) { err_exit("read1line", NULL); } fprintf(stderr, "Status-Line = %s", buf); /* Receive Headers */ while ((len = read1line(sock, buf, B_SIZE)) > 0) { if (!strcmp(buf, "\r\n")) break; fprintf(stderr, "Header-Field = %s", buf); } if (len < 0) { err_exit("read1line", NULL); } fprintf(stderr, "--------------------\n");
/* Receive Entity */ if (len < 0) { err_exit("read", NULL); } fprintf(stderr, "--------------------\n"); /* Disconnect */ if (close(sock) < 0) { err_exit("close", NULL); } } void err_exit (char *mes1, char *mes2) { if (mes2 == NULL) mes2 = strerror(errno); fprintf(stderr, "%s: %s\n", mes1, mes2); exit(EXIT_FAILURE); }
write1line (int fd, char *str) /* Write 1-line to Socket */ { int l; l = strlen(str); if (write(fd, str, l) < 0) return (-1); if (write(fd, "\r\n", 2) < 0) return (-1); /* CR-LF */ return (0); } void init_linebuf (void) /* Initialize Buffer */ { linebuf_start = 0; linebuf_end = 0; return; }
int read1line (int fd, char *buf, int max) /* Read 1-line from Socket */ { int i, j, st; if (max <= 0) return (0); j = 0; st = 0; for (;;) { if (linebuf_start >= linebuf_end) { /* Buffer is Empty */ if ((linebuf_end = read(fd, linebuf, B_SIZE)) < 0) return (-1); if (linebuf_end == 0) { /* End of File */ buf[j] = '\0'; return (j); } linebuf_start = 0; } for (i = linebuf_start; i < linebuf_end; i++) { if (j >= max - 1) { /* Buffer is Full */ linebuf_start = i; buf[j] = '\0'; return (j); }
buf[j++] = linebuf[i]; switch (linebuf[i]) { case '\r': /* CR */ st = 1;break; case '\n': /* LF */ if (st == 1) { /* End of Line */ linebuf_start = i + 1; buf[j] = '\0'; return (j); } default: st = 0;break; } } linebuf_start = i; } } int readbuf (int fd, char *buf, int max) /* Read from Buffer and Socket */ { int l; if (linebuf_start < linebuf_end) { l = linebuf_end - linebuf_start; if (l > max) l = max; memcpy(buf, linebuf + linebuf_start, l); linebuf_start += l; return (l); } return (read(fd, buf, max)); }
終わり。 わかんないとこあったら聞け。 ブラウザの基本・・・でもないか。
>>70 横からだが・・・
UNIX系だね。ネットワークアプリは手を出したことがないから
興味あったけど、メインはWINだから残念。でも参考にさせて
もらうよ。サンクス
72 :
ζ゚ ◆f3DF7bkpu2 :2006/02/03(金) 09:24:08
>>62-70 華麗にスルー
static char const * const status[]{...} の1行より興味を惹かないなあ。
あれだ。
「倉庫番」でいう、だだっ広い散らかった面よりちっちゃい面の方が好き。
今は
>>54 の要望に応えつつマニアックなアプローチを考えている。
#include "stdio.h" void main() { printf ("string"); } をプロンプトから実行しても文字が表示されないのは設定がいるんですか?winXPで。 borlandC++5.5.1
やっぱいいです、、、
設定はいらないけど。 printf("string\n"); に直してみれ。
>>73 ついでにint main()。
stdio.hは標準だから<stdio.h>とするのが普通。
77 :
ζ゚ :2006/02/04(土) 21:38:44
過疎スーレ!!
78 :
ζ゚ :2006/02/05(日) 17:30:00
(俺日記)o。.. ζ゚ 今日はウインウインでフラッシュ演算つくろうと頑張った。 表示までできました。問題点は多々あるが形だけは。 入力受け付ける方法がわからなかった。
79 :
ζ゚ :2006/02/05(日) 17:35:40
(俺日記)o。.. ζ゚ もうひとつ、コンソールで「石取りゲーム」作った。 「CPUが○個取りました」では味気ないので応答メッセージ出してたら なんの神様が降臨したのか、気が付いたら関西系おにゃのこになってました。 めっちゃかわええ。結婚してくださいw
さようなら
81 :
よいしょ :2006/02/06(月) 03:56:33
82 :
ζ゚ :2006/02/06(月) 09:50:03
転載おつです ちくしょう2位かよ! でも1位の壁は厚いからなあ。DQNレベルが違いすぎる
83 :
ζ゚ :2006/02/06(月) 10:25:48
84 :
デフォルトの名無しさん :2006/02/07(火) 13:18:59
配列ワカンネ。というよりfor文、putcharとかも怪しい。
85 :
◆U8V9D2Qx0c :2006/02/07(火) 13:20:07
test
86 :
84 :2006/02/07(火) 13:24:28
プロトタイプ宣言....? 知らんがな。
87 :
84 :2006/02/07(火) 13:25:47
while文くらいしかできない
88 :
デフォルトの名無しさん :2006/02/07(火) 13:33:36
ググって見たけど分からなかった。
こうですか?わかりません!(><)
90 :
ζ゚ :2006/02/07(火) 22:15:29
俺漏れも。for文ってかCムツカシス #include<stdio.h> int main(void){ int n,c,t; for(c=0;c<11;++c,printf("\n")) for(printf("%*s",(11-c)*2,""),n=0,t=1;n<=c;t*=c-++n+1,t/=n)printf("%3d ",t); return 0; }
↓されてほしいひとの書き込み↓
93 :
ζ゚ :2006/02/15(水) 15:15:42
94 :
デフォルトの名無しさん :2006/02/16(木) 21:55:19
#include <stdio.h> main(argc, argv) int argc; char *argv[]; { printf("%s: Hello, world!¥n", argv[0]); return 0; }
#include <stdio.h> void flush(int n,FILE* fp){ if (n) putc(n-1,fp); } void main(int ac,char *av[]){ FILE *fi,*fo; int c=EOF,r=0,n; if (ac==3){ fi=fopen(av[1],゙rb゙); fo=fopen(av[2],゙wb゙); if (fi && fo){ while ((n=getc(fi))!=EOF){ if (n==c){ if (!r) putc(c,fo); if (++r==256){ flush(r,fo); r=0,c=EOF; } } else{ flush(r,fo); r=0,c=n; putc(c,fo); } }/* end while */ flush(r,fo); } if (fi) fclose(fi); if (fo) fclose(fo); } }
static変数は関数外で宣言することで複数の関数が共有できます。 ただし、定義されたソースファイルの関数だけで、他のソースファイルの関数から参照することはできません。 なおstatic変数は静的にデータとして確保されますが、価を指定して宣言した場合のみデータ領域に配置され、初期値を指定しない場合はスタック領域の先頭に領域が確保されますよ。 コンパイラが領域確保のコードをリンクするので、そこらへんはあまり意識する必要もないかと。 constは値を指定した場合のみ、定数がデータ領域に確保されます。 ただし整数なら最適化の段階でmov ax,1234みたいにコード展開されることも有り得ます。 文字列ならデータ領域に配置されると考えていいでしょう。 ちなみにヒープは二分木のことで、スタック領域を二分木で管理してmalloc等が利用できるようにしていたため、動的に割当解放できるスタック上のデータ領域をヒープ領域と呼ぶようになったみたいです。
97 :
ζ゚ :2006/02/17(金) 12:18:16
環境依存ってなんでしょ? コンソールで素数を数えるプログラムを組んだとき、int型で20億ぐらいまでまわったんで うちの環境じゃint=32bitで10進9桁は保証されてると思ってたんだけど Windowsアプリ作ったら、どうも16bit臭い。32767以下しか出てないっぽい。 コンパイル時になにかやってるのかな?ζ゚ の脳が膿んでる? それと。 実行ファイル配布したときにも、実行環境によってintが16bitだったり32bitだったりする? ζ゚ の感覚では、型宣言はコンパイラに対してで、奴(コンパイラ)がint=32bitだと解釈して exeファイル作ったら、どこに持っていっても32bitの領域確保すると思ってる。
int 型はコンパイラ依存だ。この型は本来そのCPUで最適な ビット数になっている筈のものだ。但し Windows 関係は 歴史的な事情により過去の16ビットマシンだった時によく 使われた int が 16 ビットのコンパイラも現在のCPUで 動作させることが可能になっている。こういったコンパイラを 使った場合は int が最適なビット数にはなってないかも 知れない。
>>96 嘘だらけ。
>初期値を指定しない場合はスタック領域の先頭に領域が確保されますよ。
いいえ。
>コンパイラが領域確保のコードをリンクするので
いいえ。
>constは値を指定した場合のみ、定数がデータ領域に確保されます。
いいえ。
>ヒープは二分木のことで
いいえ。
>スタック領域を二分木で管理してmalloc等が利用できるようにしていたため
いいえ。
>動的に割当解放できるスタック上のデータ領域をヒープ領域と呼ぶようになったみたいです。
いいえ。
>>97 >32bitの領域確保すると
必ずしも領域が確保されるわけではないが、「コンパイラに対する指定」という点ではその通り。
>Windowsアプリ作ったら、どうも16bit臭い。
これは恐らく、「Windowsでアプリを作ったら」だと思うが。
例えばWindows上でも動作可能なLSI-Cは、intが16bitなのは>98も書いている通り。
101 :
ζ゚ :2006/02/17(金) 17:54:24
解決しました。 <Windows.h>関係なかった。 ヒント:RAND_MAX (´・ω・)
俺にもC言語教えれ。
教えろっつってんだろ
Copyright (C) ←
日本共産党委員長
ふざけんなてめーら。一向に教える気配ねーじゃねーか。 いい加減にしろ
>>107 たった今やっと読破してきた。次は何をやればいい?
次何やればいいか聞いてんだろ!!苦C徹夜して読んだんだから次オシエレ
110 :
デフォルトの名無しさん :2006/02/18(土) 09:25:25
いい加減にしないと俺も怒るぞ(^ω^;)
111 :
ζ゚ :2006/02/18(土) 09:47:30
じゃ、「数当て」ゲーム作ろうぜ。
112 :
ζ゚ :2006/02/18(土) 10:16:52
/*つ[数当てゲーム]*/ #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ int r,s; srand((unsigned)time(NULL)); r=rand()%9+1; while(1){ puts("数(1〜9):");scanf("%d",&s); if(r==s){puts("正解!");break;} else if(r>s)puts("小さい!"); else puts("大きい!"); } }
#include <stdio.h> void main (void) { int tokuten[5],gokei=0,i; printf("英語・国語・数学・理科・社会の順に得点を入力して下さい\n"); for(i=0;i<5;i++) scanf("%d",&tokuten[i]); for(i=0;i<5;i++) gokei+=tokuten[i]; printf("5科目の合計点は%d点です\n",gokei); } なんでscanfの前にfor文が来るかわからない。
114 :
ζ゚ :2006/02/18(土) 10:29:49
これを踏まえた上で「コードブレーカー」作れ
>>110 ルール:
1.4桁の数字を用意。ただし、4桁の数字の中に、同じ数字は含まない。
→「1111」「2233」とかは不可
2.ユーザーからの入力に対し、
2.1. 数字と桁が合っていれば1hit
2.2. 桁が合ってないけどその数字を使っていれば1blow
2.3. 4桁すべて合えば(4hit)正解
例:問題「6514」
「1234」 → 1Hit 1Blow (「4」が桁も同じ、「1」は数字を使っているが桁が違う)
「5678」 → 0Hit 2Blow (「5」「6」が桁違い)
115 :
ζ゚ :2006/02/18(土) 10:36:39
>>113 まじめだから。
っつか、scanfの前にforいるでしょフォ〜〜
116 :
96 :2006/02/18(土) 10:54:16
>>99 嘘ではないぞ。
もっともコンパイラに依存する点だから、俺の書いた通りにならない環境もあるがな。
実際に某社のコンパイラを数種類調べた上での書き込みだ。
なお、二分木はヒープである。ヒープソートの語源を調べてみ?
>>116 たとえそうだとしてもスタック領域のうち動的メモリに使われる部分をヒープ領域と呼ぶというのは間違いだ。
ヒープはあくまでもヒープ。スタックとは全く関係ない。
あと、初期化子のない静的変数が置かれるのはBSSではないか?Cとは全く関係ないことだけど。
118 :
デフォルトの名無しさん :2006/02/18(土) 11:30:26
>>114 おっしゃ〜〜〜!!ガンガル!!(^ω^)
処理系に依存しすぎた説明をしてしまうのは,「C言語」をよく理解していないからだと思う
今来た もの凄い勢いでスレ読んでるから仲間に入れろ ちなみに授業で一回C言語やってるからすぐ追いつくはず
void Unko(char *code, char *user_code) { int i, j, hit, blow; hit = blow = 0; // hit for(i = 0; i < KETA; i++){ if(code[i] == user_code[i]){ hit++; } } // blow for(i = 0; i < KETA; i++){ for(j = 0; j < KETA; j++){ if(i != j && code[i] == user_code[j]){ blow++; } } } printf("code:%s\nuser_code:%s\n", code, user_code); printf("%dHit %dBlow", hit, blow); }
int main() { int i, j, temp, flag; char code[KETA + 1], user_code[KETA + 1], buff[KETA + 1]; randomize(); // ランダムコードの作成 code[0] = random(10); for(i = 1; i < KETA; i++){ do{ flag = 0; temp = random(10); for(j = i - 1; j >= 0; j--){ if(code[j] == temp){ flag = 1; break; } } }while(flag); code[i] = temp; } code[i] = '\0'; for(i = 0; i < KETA; i++){ code[i] += '0'; } // ユーザコードの入力 printf("コードを入力しやがれ。\n>"); fgets(buff, KETA + 1, stdin); sscanf(buff, "%d", &temp); itoa(temp, user_code, 10); Unko(code, user_code); return 0; }
#include <stdio.h> #include <stdlib.h> #include <math.h> #define KETA 4
>>21 なんかスゲーな
2ちゃんねるがこんなに教育熱心だと思わなかった
125 :
初心者 :2006/02/18(土) 12:46:15
5つの数字を小さい順に並べ替えるにはどうしたらいいですか?
126 :
116 :2006/02/18(土) 12:50:08
>>117 >あと、初期化子のない静的変数が置かれるのはBSSではないか?
正解。
後で読み返してみたら、俺も誤解を招くような書き方してたわ。
すまんかった。
スレ読み終えた ほとんど何もやってねーじゃんwww
>>112 randの下一桁は質の悪い乱数になるので使わないほうがよい
>>122 4桁の数字を生成するときに総当りで重複をチェックするのは効率が悪いね
もっと計算量を減らせるはずだ
ヒントはrandを使う回数は何回まで減らせるか
131 :
ζ゚ :2006/02/18(土) 13:06:43
>>121-123 いいじゃん。
次は、なにしようか?
石取りゲーム(
>>79 )→3目並べ あたりまでしかネタ思いつかないス。
俺にもネタくれエロいひと
132 :
ζ゚ :2006/02/18(土) 13:27:16
>>129 上質を知るオトコになるにはどうすればよかばってん?
どぎゃんしたらよかっと?
>>132 rand()*9/RAND_MAX+1
134 :
ζ゚ :2006/02/18(土) 14:09:38
>>133 なるほろ。そいつぁいいや。
と思ったが、違いがわからない。
#include <stdio.h>
#define RMAX 32767
int main(void)
{
int m[10]={0},n[10]={0};
int a=0,b=0,i;
for(i=0;i<RMAX;i++){
a=i%9;m[a]++;
b=i*9/RMAX;n[b]++;
}
for(i=0;i<9;i++)printf("%d: m[%d],n[%d]\n",i,m[i],n[i]);
}
結局、順番に分けていく(%)か、0〜*、*〜*と大きく切るかだけじゃねの?
rand()のストレスとかは詳しくシラネけど。
このスレ、まだあったんだ
>>131 >石取りゲーム(
>>79 )→3目並べ あたりまでしかネタ思いつかないス。
こいつが片付いたら、簡単なネタ出すよ
コードブレイカーと聞いてなぜかソウルテイカーを思い出した
インラインアセンブラ教えろ
ちょ・・・できね・・・教えてください。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 4 void irnd(void); void judg(char *data, char *arry); char data[N+1],arry[N+1]; void irnd(void) { int i; srand((int unsigned)time(NULL)); for(i=0;i < N; i++) arry[i] = rand() % 9 + 1; } void judg(char *data,char *arry) { int i,n,agree,blow; for(i=0; i < N;i++){ for(n=0; n < N;n++){ if(arry[i] == data[i]) agree++; else if(arry[i] == data[n]) blow++; } } printf("問題の数字>%s\n入力の数字>%s\n",arry,data); printf("Hit数→%d\nBlow数→%d",agree,blow); }
int main(void) { int i; irnd(); printf("4桁の数字を入力\n"); for(i=0; i < N ;i++){ printf("%d桁目>",i+1); fgets(data,N+1,stdin); } judg(data,arry); return 0; }
>>134 例えば、rand()の最下位ビットが必ず交互にOn/Offを繰り返す実装があったとする。
rand()%2したら、必ず違う値が続くことが予測できてしまうから質が悪いと言うことになる。
>>129 いまどきのコンパイラなら問題ないだろ。
>>133 RAND_MAXがINT_MAXと同じ処理系なら、まずくね?
ライブラリではなく、コンパイラが乱数を生成しているのか。
いまだにrand()は上位ビットを見れッて言ってるヤツがいるのは、アレの影響だろうか。
146 :
ζ゚ :2006/02/18(土) 15:28:38
ミニマムな話のほうは、RAND_MAXの余り部分での誤差。
>>134 組んでみたのは、実際どうなるか分からなかったから。
予想では、rand()*9/RAND_MAX側の「9」の値が9-RAND_MAX%9低くなる、
つまり一方的に「9」だけが出にくくなると読んでたんだが。
あと
>>141 の話、乱数のストレスの件
例えば、コイントスで完全に50%の確率で裏表が決まるとした場合、
計算上は10回連続で表が出る確率は1/1024だけど
コンピューターは「10回のうち5回表、5回裏」に持っていきたいから
1/1024の確率どおりにならない、結果がどちらか一方に偏るとストレスが溜まるという仮定。
「表」「表」と来たときに、次が「表」になる確率は1/2じゃないんじゃない?って話のタネ。
実際どうなってるのかは知らない。
147 :
ζ゚ :2006/02/18(土) 15:36:13
>>146 >141の実装だと、連続して表が出る確率は0になるね。
余りの問題に関しては、例えばrand()%9とした場合も均一ではなくなる。
仮にRAND_MAXが10の実装があったとすると、0の出る確率は2/10、1乃至8の出る確率は1/10になる。
150 :
デフォルトの名無しさん :2006/02/18(土) 15:41:22
今C言語やってて #include<stdio.h> sd(const char vc[]) { int as=0; while(vc[as]) as++; return(as); } int main() { char ab[5]; printf("文字を入力してください:"); scanf("%s",ab); printf("あなたが入力した文字の数は%d個です",sd(ab)); return(0); } これを実行させた時普段はちゃんと動いてたのに 「mikomikonasu」と入力したらなぜかバグった感じになったんだけど 原因分かる人いますか?
>>148 RAND_MAXは最低でも0x7fffじゃなかった?
152 :
ζ゚ :2006/02/18(土) 15:52:06
153 :
ζ゚ :2006/02/18(土) 16:03:12
>>150 >int main()
>{
>char ab[5];
入力は4文字以内でおながいします。
では、犬の散歩に行ってきます( ゚∀゚)ノシ
>>151 ならばRAND_MAXが0x7fffだとしてrand() % 7ffeの場合を考えろ。
itoaって何だよ
>>155 非標準関数。
大まかに言うとint型の数値を文字列にしてそこへのポインタを返す。
そのメモリの扱いなどから使うことはお勧めできない。
>>156 そうでしたか・・・。標準ライブラリ調べても無いからなぜ?と思ってた・・・。
非標準関数なんて存在を知らなかった。
解説ありがとうございます。
乱数の偏りが気になるなら、その処理系で調べてみるか ソース見ればいいんじゃないかな。もしくは、独自で実装。 でもメルセンヌ・ツイスタなヒット&ブローって一体・・・って 気がするけど
>>158 ゲームにメルセンヌ・ツイスタを使うのは、厨房が一度は通る道。
麻疹みたいなものだ。
「うひょー、俺はこんなハイテク使っているze!!」ってやつ、な。
ま、生暖かい目で見守ってやれ。
160 :
ζ゚ :2006/02/18(土) 18:11:56
おれは乱数の偏りとか、ある程度以上はどうでもいいけど 厨くさくなれるなら実装してみるか、メルセデス便器
昔、タクティクスオーガのソースを見たら、クヌースの本に載ってた乱数アルゴリズムを使ってたな。
>>130 ><
int Set_Random_Code(char *code)
{
int i, j, temp;
char flag[10];
memset(flag, 0, sizeof(char) * 10);
code[0] = random(10);
flag[ code[0] ] = 1;
for(i = 1; i < KETA; i++){
temp = random(10);
// 使われていない数字を検索
while(flag[temp] == 1){
temp++;
if(temp > 9){
temp = 0;
}
}
code[i] = temp;
flag[temp] = 1;
}
// 文字列化
for(i = 0; i < KETA; i++) code[i] += '0';
code[i] = '\0';
return i + 1;
}
163 :
ζ゚ :2006/02/19(日) 00:25:34
>>162 その方法だと、連続した数字が出やすくならないかい?
例えば3文字「867」と決まったあとで4文字目、
「0」〜「5」まで確率1/10、「6」「7」「8」は繰り上げ当選で「9」になるので
「9」の出る確率がなんと4割!
最悪の場合、こんなことになるかも。改悪しちゃった?
追伸:「コードブレーカー(暗号破壊)」は、女神転生シリーズで使われてた名称で
一般には「Hit&Blow」ですにゃ><
まあいいかなと思ってたけど、まさか他のスレに飛び火するとは・・・
こんなのでいいか? 結構適当だけど。。。 int main(void) { char target[4]; int i, j; srand((unsigned) time(NULL)); for (i = 0; i < 4; i++) { target[i] = rand() % 10 + '0'; } for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (i == j) continue; if (target[i] == target[j]) { target[i] = rand() % 10 + '0'; i = 0; } } } printf("%s\n", target); return 0; }
/* これで桶? */ #include <stdio.h> char* i_to_s(char* buf, int n) { char si[26],*di=buf; int c=0; while (n>=10){ si[c++]=(n % 10)+'0'; n = n / 10; } si[c++] = n + '0'; while (c){ *di++ = si[--c]; } *di = '\0'; return buf; } void main() { char buf[24]; printf("%s\n",i_to_s(buf,32767)); }
>>163 本当の名前は、たしか「マスターマインド」だったとおもふ
167 :
165 :2006/02/19(日) 01:48:19
しもーた、マイナスの処理を忘れてたわ。 すんまそん。
168 :
ζ゚ :2006/02/19(日) 01:54:05
/* ζ゚ コードブレーカー unko借りますた */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define KETA 4 void Mondai(char * code) { char no[11]={"1234567890\0"}; int l=9,i,s; for(i=0;i<KETA;i++){ s=rand()%l; code[i]=no[s]; if(i)l--; no[s]=no[l]; no[l]='\0'; } no[i]='\0'; }
int Unko(char *code, char *user_code) { int i, j, hit, blow; hit = blow = 0; for(i = 0; i < KETA; i++) if(code[i] == user_code[i]) hit++; else for(j = 0; j < KETA; j++) if(code[i] == user_code[j]) blow++; printf("%dHit %dBlow\n", hit, blow); return hit; }
170 :
ζ゚ :2006/02/19(日) 01:57:23
void Kaitou(char * qcode) { char ucode[KETA+1]={'\0'}; int ans=0,s; while(1){ ++ans; printf("\nコードを入力しやがれ。\n>"); scanf("%d",&s); sprintf(ucode,"%d",s); if(Unko(qcode, ucode)==4)break; } printf("code:%s\nuser_code:%s\n", qcode, ucode); printf("%d回もかかってんじゃねえよプゲラ\n\n", ans); }
171 :
ζ゚ :2006/02/19(日) 01:58:22
int main(void) { char question[KETA+1]={'\0'}; srand((unsigned)time(NULL)); Mondai(question);/*問題作成*/ Kaitou(question);/*回答*/ return 0; }
172 :
ζ゚ :2006/02/19(日) 02:01:26
>>168-171 どないでっしゃろ?
判定部分、相当「仕様」に甘えているが。
「1111」とか入力しても1Hit3Blowにならないけど、いいのかな?
>>171 > char no[11]={"1234567890\0"};
不必要ななる文字が追加されている。人間が数を数えるのもナンセンス。
char no[] = "1234567890";
で充分。
> if(Unko(qcode, ucode)==4)break;
折角KETAマクロが在るのだから使おう。
> sprintf(ucode,"%d",s);
数値の制限してないから、5桁入力されるとucodeが溢れる。
174 :
ζ゚ :2006/02/19(日) 02:14:50
>>173 なるほろおっしゃるとおり。
>sprintf()のところは、溢れたらif(s>9999){...}とか覚悟してたけど
不思議と落ちなかったもんで。
175 :
ζ゚ :2006/02/19(日) 02:18:15
配列の要素数で、同じこと
>>33 でも言われてるな。
進歩ない俺_| ̄|○
176 :
ζ゚ :2006/02/19(日) 12:05:20
どようびどようび〜〜
ハ_ハ
ハ_ハ (^( ゚∀゚)^) にちようび〜〜
('(゚∀゚∩ ) /
ヽ 〈 (_ノ_ノ
ヽヽ_)
てんさよんあげていくよ〜〜〜
>>168-171 qcode[],ucode[]無理して関数で渡さなくても
グローバルで書いてもいいと思うんだがどうか。
渡す側と渡される側で変数名が同じ(
>>165 )なのはなんとなくイヤだし、
かといって関数ごとにcode[],qcode[],question[]と
同じものなのにいろいろ名前がつくのがカコイイとは思えない。
>なんとなくイヤ 同じ物に同じ名前がつくのを嫌がるとは……
>>176 基本的に、グローバルに置くのは最終手段と思ったほうがいい。
仮にそのプログラムをもっと発展させようと思ったとき、
そのグローバル変数が足枷になるかもしれない。
まぁ、「使い捨てだから構わない」という方針なら別だが。
#あるプログラムのマルチスレッド化を試みているのだが、グローバル変数に泣かされているのは仕事なので内緒。
>まぁ、「使い捨てだから構わない」という方針なら別だが。 言い換えるなら十分規模が小さいなら構わないということだな。 特にソースファイルがひとつで収まるようなコードでは グローバルだ何だと大騒ぎしても全く無意味。
せめてstaticにしてソース外でぶつからないようにね。
181 :
ζ゚ :2006/02/19(日) 13:57:02
>>177 ,o/ ∠先生!呼び出し側と受け側の変数名が同じでも
lミiニ! それは違うものだと思います!
182 :
1でs :2006/02/19(日) 14:13:53
配列のところまできました! そこでわからなくなってしまったので質問です。 やさっしいCという本を手本にさせてもらっているのですが
183 :
ζ゚ :2006/02/19(日) 14:17:25
相手をおもいやる心と、そう思う相手の心を受けとめる心かな。
#include <stdio.h> #define NUM 5 int main(void){ int test=[NUM]; int tmp; int i, j, s, t; printf(""%d人の点数を入力してください\n",NUM); for( i=0; i<NUM; i++){ scanf("%d",&test[i]); }
for(s=0; s<NUM-1; s++){ for(t=s+1; t<NUM; t++){ if(test[t]>test[s]){ tmp=test[t]; test[t]=test[s]; test[s]=tmp; } } } for(j=0; j<NUM; j++){ printf("%d番目の人数は%dです\n",j+1,test[j]); } return 0; } これがまったく訳わかりませんたすけてください!!
printf("s=%d, t=%d, test[]={ %s, %s, %s, %s, %s }\n", s, t, test[0], test[1], test[2], test[3],test[4]); という行を >for(t=s+1; t<NUM; t++){ の下の行に追加して出力をよく読んでみろ。
途中でスレ放り出して、わからない時だけ聞きに来る
>>1
>>186 わかんないです><
詳しく解説してください
そんな
>>1 ウザス。質問しといて1時間放置・・・ウザス。解説してください・・・ウザス。
一時間放置したのは考えていたからです・・・><許して>< ぜんぜんわかんあい
おまいら皆氏ね
193 :
177 :2006/02/19(日) 17:32:33
>>181 そこまで言われると、勝手にしてくれとしか言えんが。
main()でMondai()関数に渡しているのは「問題」。
Mondai()関数で生成しているのは「問題」。
Kaitou()関数に渡しているのも「問題」。
それらに同じ名前をつけて何か問題でもあるのか?
194 :
ζ゚ :2006/02/19(日) 21:42:59
>>193 たとえば「問題」が二つ以上欲しくなったとき
void Mondai(char * qcode){,,,,,}
:
int main(void){
Mondai(qcode);
Mondai(qcode2);
:
ここのmain側qcode[]、qcode2[]と関数側qcode[]では3者全部意味が違うよね?
ただ値渡しという関連だけで。
他の場所で使う変数が同じ名前だと混乱するので、なるべく避けたいというのがζ゚ の考え。
ま、例外としてループに使うint i,j とかはどこの関数でも値渡しせず関数内宣言するけど。
いい燃料になると思ったんだけど、ただの宗教問題になってしまってツマラナス
>>194 自己矛盾に陥ってる。
グローバルで充分と言いつつ(>176)、同じじゃなくなると言っている(>194)。
同じ名前がいやだと言うところからスタートしていると思ったのだが。
196 :
ζ゚ :2006/02/19(日) 22:05:21
そこで
>>176 に戻るわけだ。
>同じものなのにいろいろ名前がつくのがカコイイとは思えない。
>>176 のレスの時点で、ζ゚ は別の関数(別のスコープ)では
>>177 >同じ物 とは思ってないわけだ。
だから
Mondai(*code) ←KETA数の数字列を返す関数
Kaitou(*qcode) ←生成した問題列を渡す
メイン側の呼び出し ←生成された実際の値そのもの
という感じで、汎用的→局所的 に名前を変えてみた。って感じ。
まずはどんなに汚くても反則技を使っても「問題なく動けば勝ち」と思ってるζ゚ なんで、
>>130 の指摘を受けて、もっとプログラムが汚くなるなら薮蛇かなと。
それで新たな問題が出てくる(
>>163 指摘)ようならダメでしょい
197 :
ζ゚ :2006/02/19(日) 22:10:27
>>195 矛盾してるのは承知の上。
今回、問題生成が1回で済むのは仕様上明らかだし、
そんなものを「グローバル変数を嫌う」という理由だけで
関数内宣言→値渡し にこだわりすぎるのはどうかなと思っただけ。
別の関数内で同じ名前をつかうことに関しては
>>196
198 :
ζ゚ :2006/02/19(日) 22:15:02
>>195 自己矛盾?
仕様上、qcode[]がひとつでいいという前提ならグローバル宣言を使うし
Mondai()の呼び出しが2箇所以上になることが設計時点で予想できるなら値渡しにするし。
>>107 苦Cって何か良いな!初めて見た!
やべぇ続きが読みたくておちんちんがウズウズしてるけど
痔が悪化するから今日は寝るぞ!
>>198 >設計時点で予想できる
設計時点でその可能性が無くても後々困らないようにしておくほうが吉
/* はじめてのぷろぐらみんぐ☆ */ #include <stdio.h> int main() { fclose(stdin); fclose(stdout); return 0; }
stderr はそのままで良いと。
203 :
デフォルトの名無しさん :2006/02/24(金) 12:19:43
横槍すまんこ 今は仕事でVB.NETやってるんだけど将来は(独学で)VC++に乗り換えたいと思ってるんだけど、 何から学べば良いのか分からない。 やっぱりC→C++→VC++って勉強するのがベスト?
コンソールアプリでC++の文法を覚えつつVSの使い方も覚えてから Win32API&VC++固有のライブラリ(MFCとか)覚えていくのがいいんじゃないの。
207 :
203 :2006/03/01(水) 18:36:16
>>204 仕事でVB.net使えってことなので・・・
ホントはVC++使いたかったんだよ。
>>205 基本はHelloWorldってことですな。
とりあえず猫でも分かる〜でなんとなくの雰囲気つかみながら
詳説C++読んで勉強するよ。
208 :
デフォルトの名無しさん :2006/03/03(金) 04:56:37
んえ?VC++ってC++用の開発環境と違うの?
209 :
デフォルトの名無しさん :2006/03/03(金) 05:12:56
>>208 MSのVC++はC++の開発環境を含む
Windowsj上でのC/C++アプリの開発環境
VC++にはC++/CLIもあるな<。
CLIって言語なの?
>>211 C++/CLIって言語だと思ってほぼ間違いない。
つまり、C++でもなければC#でもない。
214 :
:2006/03/18(土) 21:57:06
(まる1ヶ月ほどPG組んでないでごじゃる) 0o。. ζ゚
include <stdio.h> int main (void) { printf("hell of world\n"); return 0; }
>>215 int main (void) はいかん。int main() だ。
>>216 規格で明示的に定められているmain関数のプロトタイプは
(1) int main(void)
(2) int main(int argc,char**argv)
(3) 上二つと等価な方法
(4) それ以外の処理系定義の方法
なのでint main()は処理系定義となって、可搬性に劣るからお勧めできない。
>>217 ところがどっこい、関数の定義で空の括弧は関数が引数を持たないことを表すと書いてあって、
関数の定義では空の括弧と(void)の違いが無いように読めるんだ。
つまりint main()でmain関数を定義した場合、それは(3)になると俺は思っている。
尤も俺はint main(void)を使っているけれど。
結局なにが言いたい?
引数省略した場合に自分の環境でどう振舞うかは extern foo(); foo(1); とでもやってコンパイルしてみればわかるだろう。
221 :
ζ゜ :2006/04/12(水) 22:50:02
あふぁ〜〜ん
222 :
ζ゜ :2006/04/16(日) 23:05:05
自己解決しましたw
223 :
デフォルトの名無しさん :2006/05/09(火) 21:04:57
もう、稼働していないのか?
224 :
今更 :2006/05/09(火) 22:03:48
ちょいスレ違い? WindowsのVisual C#とかVisual Basicってフリーのやつで勉強始めてもいいのでしょうか?
225 :
デフォルトの名無しさん :2006/05/09(火) 22:31:32
>>224 visual studio.net
絶対に買い。
226 :
デフォルトの名無しさん :2006/05/10(水) 11:25:19
>>224 何の勉強するかによるが、言語や環境の使い方やプログラムの組み方と言う話なら無料の奴で良い
Cの勉強をするんですが、結城浩のプログラミングレッスンで事足りるでしょうか? 一応使える言語はJavaです。 環境は、VC2005EEです。 OSはWindowsXPSP2です。
>>227 さあ? とりあえず読んでみたら?
本屋で立ち読みするか図書館行くかして。
Hello World出来たよ
while(fgets(str, 7, fp){ printf("%s", str); } っていうのが本に載ってたんですが条件の意味が分かりません。 やさしく教えていただけないでしょうか?
>>230 while (fgets(str, 7, fp) != NULL) {
printf("%s", str);
}
と等価。
>>231 ありがとうございます。
それなら意味が分かります。
でも、同じ本でも同じように省略してたり、「!=NULL」が表示してたりで分かりにくかったんです('A`)
ご親切に ども。
233 :
231 :2006/05/21(日) 16:42:17
>>232 慣れるまでは間違い防止の為にも書くこと推奨。
234 :
232 :2006/05/21(日) 17:54:48
>232 等価って説明は書いてなかった?初心者用参考書だと書いてそうなもんだけど > でも、同じ本でも同じように省略してたり、「!=NULL」が表示してたりで これはよくないな
236 :
232 :2006/05/22(月) 17:58:22
>>235 「!=NULL」の説明はありましたが省略されてる構文はそういうことに触れてなかったと思います。
近くに聞けるような人間もいないので質問させてもらった次第です。
他のスレッドは敷居が高いような気がしてここで質問させてもらいました。
ブール型で省略したらtrueだっていうのはなんとなく分かるんですけどね…orz
237 :
デフォルトの名無しさん :2006/05/23(火) 14:52:17
ポインタについて質問です。 int x = 100; int* p = 100; printd("%d\n", *p); でも、100が表示されるのはわかるんですが、 char* s = "hello"; printf("%s\n", *s); とすると、アドレス?が表示されます。 printf("%s\n", s); とすると、helloが表示されます。 なぜなんでしょうか?
>>237 %sには、文字列の先頭アドレスを指定しなければならないから
ポインタ理解できなくてやめたやつって、何人いるんだろうな?
241 :
デフォルトの名無しさん :2006/05/23(火) 16:12:46
int a[] = {0,1,2,3,4,5,6,7,8,9} int *p = a; int i; /* 1 */ for (i = 0; i < 10; i++) [ printf("%d\n", *p++); } /* 2 */ for (i = 0; i < 10; i++) { printf("%d\n", *p); p++; } 1と2って、同じ意味になるの?
いいえ
>>241 微妙に違うがそう書くなら結果は同じ、という感じ。
244 :
241 :2006/05/23(火) 16:33:23
>>242 >>243 レスありがとうございます。
違うというのは、どう違うのでしょうか?
教えていただけるとうれしいのですが。
もしくは参照URLか書籍があれば紹介をお願い致します。
>>244 1ではp++が実行される場所が不定。
printfのコール前に実行されるかもしれないし、
printfが終わった後に実行されるかもしれない。
246 :
デフォルトの名無しさん :2006/05/23(火) 16:58:36
>>245 レスありがとうございます。
不定ということは、使用しないで
明示的にp++をしたほうがいいということですか?
>>246 不定だからこそ、順序に依存するコードを書いてしまってはダメ、というだけの話。
今回の場合はどこで実行されても問題ない。
でもprintfのコール前に実行されるんなら、結果違うじゃん
>>248 p++の前にテンポラリに待避させるコードが生成される。
感じとしては、1は
int tmp = *p;
p++;
printf("%d", tmp);
なコードが生成される。
その分、1の方が多少遅くなるけれど、普通は最適化で除去され、printfの後に実行されるようになって
printf("%d", *p);
p++;
みたく、2と同じコードになる。
最適化の有無を切り替えて逆汗を見比べると分かりやすいかと。
知っている者はやる。 知らない者は教える。
253 :
241 :2006/05/24(水) 20:29:53
254 :
デフォルトの名無しさん :2006/05/26(金) 02:04:10
質問です FILE* fp; fp = fopen("hoge.txt", "rb"); と fp = fopen("hoge.txt", "r"); バイナリで読み込んだときとそうでないときは、何か違うんですか?
>>254 改行コードの扱いが変わる。
Windowsの場合、前者は普通にそのまま読み込むが、
後者は\r\nのペアを勝手に\nに変換するようになる。
>>254 UNIX系OSでは違いはありません。
その他のOSでは"r"の時に改行を意味するコードが '\n' に置き換えられます。
main() と int main(void) は同じなんですか?
int main(int argc, char *argv[]) と int main(int argc, char* argv[]) ってどーしてスペースの位置が違うの?
#include <stdio.h> と #include "stdio.h" は何が違うのでしょうか?
>>260 検索パスが違う。
前者はユーザが指定したかコンパイラが知っているパスからのみ検索する。
後者は先ずカレントディレクトリを検索した後、前者と同じパスを検索する。
>>257 前者は省略しすぎているだけで、ほぼ同じ意味になる。
>>256 Unix系でないOSでも、rbの指定のないOSはいくらでもある。
262 :
257 :2006/05/26(金) 23:16:23
263 :
258 :2006/05/26(金) 23:18:35
>>259 んじゃ
int main(int argc, char * argv[])
はだめ?
>>263 別に構わないが、プログラム全体でそのスタイルを統一するのを忘れずに
265 :
260 :2006/05/26(金) 23:22:08
>>261 Thank you
ちなみに、知っていれば教えていただきたいのですが
#include <stdio.h> と #include "stdio.h" のインクルードの違いって
名前があったりしますか
266 :
254 :2006/05/26(金) 23:27:51
268 :
258 :2006/05/26(金) 23:35:50
いや、大有りだから! うそ教えるなよ
270 :
258 :2006/05/29(月) 13:04:11
return 0;とreturn (0);とどちらの書き方が 正しいのですか?
>>270 正しさと言う観点で見れば、どちらも正しい。
まぁ後者の方が冗長なわけで、前者のスタイルのほうが圧倒的によく見かけるが。
>>270 昔は後者だけが正しかった。
今はどちらでもコンパイルは通るが、前者の書き方が良いとされている。
273 :
258 :2006/05/29(月) 16:03:59
>>271 >>272 冗長?ってなんじゃろう?
ご丁寧に回答ありがとうございます。
いろいろ書き方があると迷いますね('A`)
return 0;で統一することにします。
入門書を読んだあとは何を読めばいいの?
コードだけじゃ、不親切だろう。 本とか紹介してやったら?
277 :
デフォルトの名無しさん :2006/05/30(火) 06:29:43
本買ったけど、関数とか数学系の単語が出てきたからやめた。 でももう一度見てみようかな
/* sample.c */ #include <stdio.h> int main(void) { int flug, age; printf("フラグ[1 or 0] >>"); scanf("%d",flug); printf("女の子の年齢>>"); scanf("%d",&age); if(flug == 1 && age <= 16) printf("それなんてエロゲ?\n"); else if(flug == 1) printf("一生独身\n"); else printf("童貞乙\n"); return 0; }
flugって何?
フラグの意味の事だろうか? ググったら分かりますよ
スペルミスにつっこんだだけだと思われ
フラグ[1 or 0] >> には何と答えればいいんですか?
俺は入門書を読んだあと何を学んだらいいのかわからず、プログラマになるのをやめたよ。 俺は何を学べばよかったんだ?
for(; a > 1; b = !b) { 処理… } のように初期化を省略するとどーなるんですか?
( ゚д゚)ポカーン といことは 初期化はしなくてもいいわけですね。
??
>>287 初期化しなくてもいいと思えば、初期化しなくていいし
初期化しなきゃならないなら、初期化すればいいんじゃね?
>>289 ありがとうございます。
必ずしなきゃ逝けないものかと思ってましたので。
必ずしなきゃいけないんだったら for (;;) っていうのは コンパイル時にエラーにされると思う
コンパイルすると 「'scanf'が古い形式として宣言されました」 と警告がでます。 どーすれば直るでしょうか(´д`)
294 :
デフォルトの名無しさん :2006/06/03(土) 16:18:35
>>292 あら、こんな所にも入門者さんが
正直「〜が古い形式として宣言された」って文句は
無視しても問題ないっす。
それように新たな関数を装備してるのでそっちを使ってちょ
なんて出てきても、そんなMSだけで標準なCのAPIなんて
使ってたら、基本が身に付かなくなっちゃうよ。
>>293 >>294 レス有難うございます。
なんかscanf_sにしたら警告は出なくなったんですが
これって一般的じゃないんですね。
Visual C++をCコンパイラに使うのはマズイのかな…(´д`)
scanfにはセキュリティ上の問題が
>>296 さん
確かに問題は大あり。
せめてfgets()とsscanf()使うのが前提だけど
それでもバッファーオーバーランがある。
ただ、入門者が独自仕様の関数を覚えてしまうと
ANSI準拠の関数を覚えるには支障があると思う。
というか、ごっちゃごちゃになっちまうと思う。
ま、windows用のアプリ作るなら、また別で
それはそれで、win32API群を参照の事
scanf_sとかは次期規格に入るんじゃないの?
>>298 入るのかな
もし入るなら、また覚えること増える
ま、安全な関数を立案し規格かすることは良いことだと思う
けどぉ・・・・
また覚え直しか!?
C99からC100になるのかな
もう勘弁してくれ〜・・・
ただ、C言語をこれからはじめるなら、今の規格に準拠した物を使った方が
いいよGCCとかではサポートされてないわけだし
組み込みとか、だと、C99どころか、まともに動くコンパイラかどうかもわからないし
MSのコンパイラのみで適用されている関数だから
どっぷりVS2005に対して言語を勉強するなら止めはしないさ
>>298 このまま行けば承認されそうだね。
C99の奇天烈シンタクスのサポートよりはよっぽど労力が少ないだろうし。
# 日本の標準化委員会は反対表明をしてた気がするが…
cygwinの最新版の使い方が詳しく載っているHPありませんか?
おぼえることが増えるって言ってもたいしたことないだろ?
C言語を勉強してたのになぜか今、数式勉強してる。 なぜなんだ・・・
ビットについて聞きたいんですが、これは何に使うんですか? 使い道がまったくわからないんです。 教えてください。
double a; scanf("%lf", a); printf("%f", a); というのがあるとして どうしてscanfは%lfなのにprintfでは%fなんですか?
307 :
306 :2006/06/05(月) 12:23:09
scanf("%lf", &a); でしたm(_ _)m
>>306 そういう風に決まっているから。
もうちょっと詳しく言うと、可変長引数では、float型は自動的にdouble型に変換(格上げ)される。
つまり、printfにfloatを渡そうがdoubleを渡そうが、printfにはdouble型にしか見えないことになる。
(float型が渡されることはあり得ない)
floatとdoubleを区別する必要がないので、%fに統一されている。
floatはdoubleに格上げされるけれど、float*はdouble*には格上げされない(別の型として扱われる)ので、
ポインタを引数に取るscanfでは区別する必要がある。
そこで、%lfと%fで使い分けている。
簡単に言えばこんなところ。
>>306 つーか、どうせ細かいところがいろいろ違うからprintf()系とscanf()系の指定子に互換性がないと思った方がいい。
#同じとする入門書が多いのも事実だが。
310 :
306 :2006/06/05(月) 12:57:50
>>308 >>309 詳しく説明していただいてありがとうございます。
scanfは「ポインタを引数に取る」というところで
別物だとなんとなく分かりました。
も少し勉強してみます。
プログラムで"プラスマイナス"を表示するためには "±"でいいのでしょうか?
表示するの意味が分からないが Cでは±1のような2つの値を持つ定数を直接取り扱うことはできない
では D=pow(b,2)-4*a*c; x=-b±sqrt(D)/2*a; はどう修正すればいいのでしょうか?
>>313 その結果をどう利用するのかにも拠るが、表示するだけでいいならこれでいい。
printf("x=%g, %g\n", -b+sqrt(D)/2*a, -b-sqrt(D)/2*a);
要は、自分が何をしたいのか理解してから先に進めと。
二次方程式ax^2+bx+c=0でa,b,cの値を入力して、解が D<0,D=0,D>0のいずれに該当するのかを表示させ、その値も表示させるプログラムを作成したいんです。 #include <stdio.h> #include <math.h> int main(void) { double a, b, c, D, x; a*pow(x,2)+b*x+c=0: printf("二次方程式の解の場合分け");scanf("%d,%d,%d", &a,&b,&c); D=pow(b,2)-4*a*c; x=-b±sqrt(D)/2*a; if(D>0) printf("異なる2つの実数解を持つ\n"); else if(D=0) printf("重解を持つ\n"); else if(D<0) printf("異なる2つの虚数解を持つ\n"); return 0; } のように組んだのですが(まだ途中)プラスマイナスをどのようにすればいいのかがわかりません。 という質問をしたかったのです(u u)
>>315 x1とx2に分けりゃいいだけの話じゃないか
>>315 >314でいいじゃん。表示するだけなんだろ。
それから、2乗はpow()を使わないほうがいいぞ。単純に掛け算で済むんだからな。
レスありがとうございます。 ±が使えないことがわかっただけでも収穫ありです。 いろいろ試してみます
char buf[] = "1234"; if (isdigit(buf[0]) { printf("数字です。\n"); } これ、「数字です。」が表示されるんですが、なぜなんでしょうか? bufは文字の配列のつもりで扱っていたのですが、わけがわかりません。 教えてください。 よろしくお願い致します。
>>319 正しく数字文字と解釈しているじゃないか。
isdigit()はそういう関数だ。
>>319 buf[0]で、bufの最初の文字を意味する。
だからその場合、buf[0] == '1'となっている。
>>320 >>321 ありがとうございます。
このまま使用しても問題は無いんですね。
しかし、なんとも不思議な気分です。
とりあえず,リファレンスをよく読め あと,「数字」と「数値」の違いについて考えろ
int s2i(char* s){ int n=0; while(isdigit(*s)){ n=n*10+*s++-'0'; } return n; } void main(){ printf("123=%d\n",s2i("123")); }
私はC言語はまったく知らないのですが Perlを使ってのCGIなら組むことが出来ます。 C言語のソースってPerlによく似ていますよね? ifとか・・・。 面白そうなのでC言語を始めてみようと思うのですが 何から始めたらいいのでしょうか?
「ifとか・・・」と言ってる時点でよく分かってないことがよく分かる ifなんて大体の言語に共通するものだ JavaもCもPerlもPHPもrubyもpascalもその他諸々もそうだ Perlの延長という気分で始めるなら止めた方がいい ポインタやらなんやら分からんことあるだろうがまず何より変数の型で痛い目見るぞ まじでC言語勉強してやろうって言うのならとりあえず変数の型を勉強するべき
なぜC言語にはStrung型がないのでしょうか?
たぶん他の言語にもないから安心しろ
>>327 アセンブラの代替を目指したと言う歴史的経緯、低水準に近いと言うことの表れ。
ちなみにC++にはstd::stringと言うものがあるよ。
>>329 他の言語にはstrung型ってのがあるの?
「張り詰め型」とでも訳すのかなぁ…
331 :
327 :2006/06/25(日) 19:42:34
String型でした('A`)
332 :
327 :2006/06/25(日) 19:50:17
文字列の比較はどうすればいいのですか? char str[10]; scanf("%s", str); として入力された文字列が"abc" なら処理をするという風にしたいです。 str="abc"という条件ではうまくいきません。 VBとはまるで違いますね…orz
>>333 #include <stdio.h>
#include <string.h>
int main()
{
char str[10];
scanf("%9s", str);
if (strcmp(str, "abc") == 0) {
...;
}
return 0;
}
>>334 ありがとうございます。できました(・∀・)
変数と文字列は等式ではつなげないのですね。
ちなみにstrcmpは何と読むのですか?
ストリングコンペアに一票
336を略してstrcmpになったのは間違いないだろうが、 俺はストラコンプと読んでいる。
#include <stdio.h>を書かなくても printfとかscanfとかが使えて、コンパイルも出来るし、 exeもちゃんと動くんですが何故でしょう?
>>339 Cとはそういうもの。
ただし、適切なヘッダをincludeしないと、コンパイル時にエラーチェックがなされないので、
きちんと適切なヘッダをインクルードすべき。
たとえば次のコードは#include <stdio.h>が無いとコンパイルできてしまう。(おそらく実行時に落ちる)
int main(void)
{
printf(7, "%d\n");
}
341 :
339 :2006/06/29(木) 19:45:39
>>340 回答有難うございます。
そうなんですか!?
#include <stdio.h>を忘れてたのにコンパイルできてしまったので
不思議な気がしてました。
普通、実行できなければコンパイル時にエラーになると思いますよね。
sprintfとか使わずにdouble型の値を文字列にしたいんだけどどうしたらいいかな?
>>342 1. 自力でdoubleを文字列にする関数を書く。
2. Cを使わない。
整数部と小数部(整数に直す)に分けてそれぞれ10^nで割って各桁の数を求めて それを文字に直して上手くくっ付けるというプロセスを踏めばできるだろうけど 何でそんなことしたいんだ?
あ、スマン 別に整数部と小数部に分ける必要はないな 0.1, 0.01,...で割れば良いだけの話だった
IEEE754は符号、指数、仮数の3つに分かれてる件について
漏れも
>>342 と同じ事考えて、VC++ の CRT ソース追った事あるんだが
どこを見てもdouble⇒文字列変換の部分が見当たらなかった。
>>347 VC++での文字列変換はランタイム関数_cfltcvtに依存してるので、
crtのソースの中には該当箇所がないよ。
output.cを参照。
C++でboost::lexical_cast使えばいいじゃない、楽だよ〜。
char *ss; ……… int i; while (*ss) { ……… } これってwhileの条件の意味は 「*ssが'\0'でない間ループする」って本に書いてあるですけど なんでそうなるの分からないぽ。 馬鹿にでも分かるように説明してほしいぽ。
while (x) { } と書いたとき、xが真ならばループは継続する。 つまり、xと書いてもx != 0と書いても同じことだ。 >350の例ならば、while (*ss != 0)と同じと言うことだし、 積極的に文字であることを明示したwhile (*ss != '\0')とも同じだな。 まぁ、意味がはっきりするように最後の形で書くことをお勧めするが。
さらに補足すると0 == '\0'。
>>351 >>352 う〜ん、なんとなくわかったぽ。
ありがd
while (*ss != 0)という書き方なら分かります。
ただ…
「xが真ならば」って真ってどーゆーことなのか教えてほしいぽ。
0でなければ真?でおkなのでつか?
だんだんむかついてきたから答えるのやめた。 他人に聞いている態度って物を弁えろよな。
「論理演算」とか「ブール代数」とかでググれ
356 :
350 :2006/07/19(水) 19:56:10
わかったようなわからないような…('A`) もうちょっと勉強してきます。 レスありがとうございました。
return 0;は必ず要るのですか?
たまに要ります。
レス有難うございます。 なんでもかんでも「return 0;」をつけていたのですが 「Cの絵本」を読んでたらついてないじゃありませんか!! といわけで… どういう場合に要るのですか?
>>359 int、もしくはintから暗黙的に変換することが可能な型を戻り値の型に持つ関数の中で、
return 0;を書いた場所で関数の実行を終了させ、その関数の結果の戻り値を0にしたい場合に要る。
361 :
359 :2006/08/12(土) 22:34:11
難しい表現ですね(?_?) 例えば、戻り値のない関数では要らないと。 では、main関数はどうなのでしょうか。「return 0;」なくてもおkなんですか?
ようするに、特に理由がない限り必要。 ただし無くても一見正常に動くので、入門書などではmain関数などでreturnを省略することがある。
>>361 C89ではmain関数の戻り値が不定になるため書いたほうが良い。
C99ではC++と同じくmain関数の最後に暗黙的にreturn 0があるのと同じなので必要ない。
ただ、C89との互換性も考慮すると、
main関数の最後にreturn 0;を省略せずに書いていたほうが堅実な書き方ではある。
364 :
359 :2006/08/12(土) 22:39:44
>>362 そうでしたか。
ありがとうございました。
365 :
359 :2006/08/12(土) 22:41:56
>>363 レス有難うございます。
よく分かりました。
366 :
デフォルトの名無しさん :2006/08/12(土) 22:51:24
void main()って書くよりint main()でreturn文省略したほうがいいの?
>>363 別にc89でも省略して問題ないよ。
不定で問題あるときだけ書けばいい。
>>366 void main()は処理系定義の方法に該当して、ポータビリティがない。
なのでCとしては
int main(void)もしくはint main(int,char**)などと等価な定義にするほうが移植性が高い。
369 :
366 :2006/08/12(土) 23:07:55
ほぉほぉ・・・ありり
main関数自体が処理系に依存してると思うのだが。 窓アプリだとmainじゃなくてWinMainだし、入口は簡素化しといて、処理系に応じて書き直す位でいいんじゃない?
mainでも窓アプリ作れるよ
補足すると、main関数から始まるプログラムでもWindowsのコンソールを表示させないことだってできる。
というかエントリポイントなんてVCの設定次第でなんとでもなる
374 :
デフォルトの名無しさん :2006/08/30(水) 17:08:22
C言語を全く触ったことがありません。。 自分としてはC++かJAVAを習得しようと考えているんですが、 なかなか壁が高そうなので、その前に足がかりとして C言語を勉強してみようと思いました。 理由は、何となくPerlからだとすんなり入れそうな気がした、ってだけです。 何か思い違いとか方向性を間違っているようでしたら指摘お願いします。
375 :
374 :2006/08/30(水) 17:13:02
すみません。Perlだけは人並程度に扱えます。
PerlできるんならC要らないと思うけどな。 JavaでもC++でもやればいいんじゃない?
377 :
374 :2006/08/31(木) 18:41:10
>>376 ありがとうございます。
いきなりJavaとかC++とかに手を出して挫折を繰り返すよりも
Cをある程度勉強してからの方が結果的に理解が早い、
(巷の多くの書籍がC習得済みを前提に書かれてたりするので)
というようなケースが多いのなら先にCを勉強しようかなと迷っていたところです。
一筋縄ではいかないとは思いますが興味のある言語をやろうと思います。
ありがとうございました。
結果的にはCを理解してた方がC++の理解は早くなる。 一度は高級アセンブラであるCに触れておくべき。
でもその前にCを理解するための時間が必要 最初からC++でいいんじゃない?
別にCが簡単なわけでもない、C++じゃprintfの別のやつあるし 古典を勉強するもんだお クイックソートなんていらんじゃろ、クイックソートって年々進化してエロイことなってるし あんなの毎回関数書かれたらバグだらけだ
一応C++はCもサポートしているから、Cを学ぶ事に損は無いかと。
>>380 確かに、ソートする配列の要素数が少ない時はクイックソートは不便。
>>381 何故不便?
qsort()関数を使うのが面倒だとか、遅いとかいうなら判るのだが。
#そしてそれらはソートアルゴリズムの所為じゃない。
>>381 『不便』と云う言葉が悪かった。
『遅い』と言いたかったのだが。すまん。
「新訂 新C言語入門」(林晴比古著)P228の練習問題3の 「文字列を渡すと逆順にして返す関数reverse()」の部分を一行ずつ 解説してもらえませんか?理解できません(@_@) #include <stdio.h> #include <string.h>/* for strlen */ void reverse(char *ss); int main(void) { char str[] = "program12345"; reverse(str); printf("str=%s\n", str); return 0; } void reverse(char *ss) { int wk, pos1 = 0, pos2; pos2 = strlen(ss) -1; while (pos1 < pos2) { wk = *(ss+pos1); *(ss+pos1) = *(ss+pos2); *(ss+pos2) = wk; ++pos1; --pos2; } }
最初書いたら
>>384 の3倍近い量になってあー俺って説明下手なんだなぁと実感し鬱になった
pos2にはss(=&str[0])の指す文字列の長さ(=12)-1が代入されるから*(ss+pos2)=str[11]='5'
先にテンポラリとしてwkに*(ss+pos1)=*(ss+0)=str[0]の値を代入しておいてから
ss+pos1(=str[0])にss+pos2(=str[11])の値を入れて、str[11]にwkを代入すれば交換完了
後は++pos1,--pos2で外側から内側に向かいながら交換し続けて
pos1とpos2の値がぶつかるかすれ違ったところでループ終了、文字列は逆順に。
なんでwkがintなのかは、文字定数(''で括った1個の文字)はcharではなくintだからでないでしょーか
386 :
359 :2006/10/26(木) 21:01:27
>>385 レス有難うございます。
そうやって解説していただくと、なんとなく分かったような気がします。
ちょっと霧が晴れました。
そんでwkってどーゆー役割をしてるんでしょう?なんかこれがあるためにややこしくなってるような…
387 :
384 :2006/10/26(木) 21:03:11
すいません。 359→384です。
>>384 この方が判りやすくね?
void reverse(char *ss)
{
int pos1, pos2;
for (pos1 = 0, pos2 = strlen(ss) - 1; pos1 < pos2; ++pos1, --pos2) {
int wk = ss[pos1];
ss[pos1] = ss[pos2];
ss[pos2] = wk;
}
}
>>386 >そんでwkってどーゆー役割をしてるんでしょう?なんかこれがあるためにややこしくなってるような…
所謂スワップ(入れ換え)の定番ロジック。マクロにでもしておけば少しは読み易くなるかな。
390 :
384 :2006/10/26(木) 22:32:51
>>388 レスありがとうございます。
その方がすっきりしてますね。
ポインタ使ってるからややこしいのかな?(@_@)
391 :
384 :2006/10/26(木) 22:35:07
>>389 レスどうも。なんとなく分かってきました。
自分の事を棚に上げるような変数ですね。
393 :
388 :2006/10/27(金) 00:36:31
394 :
デフォルトの名無しさん :2007/01/02(火) 16:08:19
>>382 ここでアルゴリズムを語るのもどうかと思うわけだが、クイックソートは既に大部分がソートされてるときには最悪の計算量になるんよ。
だからといってシェルソートが良いとは言わないが。大規模なソートはいくつかのブロックに分けてシェルソートしたのをマージソートで紡いでいくのが実用的だと思うよ。
395 :
デフォルトの名無しさん :2007/01/02(火) 20:15:54
charってキャラって読むのかよ チャラって読んでたよ、2年くらいwwwww
charactorの略かな?
気絶するほど悩ましい
>>394 それが問題になる具体的な状況は?
アルゴリズムだけ語って現実を見てないんじゃない?
>>398 昔の話だが、とある後援会名簿のシステムを組んだ時の話で参考になるかは微妙だけど。
確か640KBのメモリとDOSで20万人分位の規模。
もちろんHDDに280MB位のファイルを拵えてディスクソートするしか整列の方法が思いつかなくて。実際には各レコードを指すインデックスファイルを作ってインデックスの並べかえをやるんだけど、比較の際にディスクを読みにいくわけでとんでもないことになる。
そこで4096レコード単位でクイックソートしたのをマージで併合するようにした。
ところが、クイックソートはほとんど並べかえが終わってる状況だと計算量が最悪になる。しかも途中経過を定量的に表示するのが困難で「フリーズしてませんか?」とか言われるし。逆にシェルソートは既に大部分が整列済みだとすごく早い。
でもまあ、こんな状況でもない限りはクイックソートがベターな選択だと思うよ。
そういうの、懐かしいな。 でかいファイルでメモリが少ないといろいろ工夫するしなあ。 そういや、メモリマップドファイルでクイックソートなんてしちゃいけません、とか書いてあって 早速でかいファイルをメモリマップドファイルでクイックソート試したりしたなあw
401 :
デフォルトの名無しさん :2007/01/03(水) 18:01:49
>>395 チャー?
じゃないの?
ちょっとだけよ
>>398 入力の際、既にある程度整列されているものを入力すること(名簿とか)あるでしょ?それをソートする時クィックソート使うと、メモリ馬鹿食いで下手すりゃO(n)分再帰呼び出し。
改良されてない形のまんまのクィックソートは、整列済みのソートを扱うのは苦手で、バラツキが多いサンプルに対してのソートには強い。
三つくらいのデータ選んで、中央値を軸に据える改良されたクィックソートとかなら、話は別だけど。
>>402 それって、
クイックソートが悪いんじゃなくて、
クイックソートの使い方が悪いだけだろ?
で、クイックソートが不便だという説明はどこ? 結局のところ、不適当な用途に使って遅いって文句を言っているだけのような希ガス。 しかも、>381は「要素数が少ない」ときに「不便」だと言ってるから>382が聞いているのに なにを頓珍漢なことを言う香具師ばかりなんだ?
405 :
402 :2007/01/03(水) 20:17:24
>>403 そだね。
ある程度整列された状況での問題になるケースの、具体的なケースを問われていたみたいだから、示しただけよ。
>>404 >>398 は、
>>394 へのレスでしょ?少数のデータ云々からは、既に話は外れてる。
少数のデータなら、定数係数の大きさ考えて、挿入ソートの方が有利。
まぁ、これも部分配列が小さくなったら、挿入ソートを使うようにすれば問題は無い。
不便ってよりは、万能ではないから、ケースによって他のソートに委ねたり、弱い部分の補強をしないとならないねってことだと思うよ。
それはクィックソートに限った話じゃないけど。
ついでに、自分は380でも381でもない。
380のクィックソート不要論に乗っただけ。
>>405 >ある程度整列された状況での問題になるケースの、具体的なケースを問われていたみたいだから、示しただけよ。
いや、そうじゃなくて・・・
「pivot をどう選ぶか」という問題は、
クイックソートとは切り離された問題だという話。
>メモリ馬鹿食いで下手すりゃO(n)分再帰呼び出し。
>改良されてない形のまんまのクィックソートは、整列済みのソートを扱うのは苦手
なのは、通常の場合、まず間違いなく pivot の選び方が拙いから。
407 :
402 :2007/01/03(水) 20:57:56
>>406 あぁ、そういうことか。
うん、端を軸にしちゃわなければ、問題は出にくいね。
確かに、使い方が悪い。
408 :
デフォルトの名無しさん :2007/01/04(木) 17:00:44
ある関数内の変数を ほかの関数でも使うにはどうすればいいんですか?
ローカル変数にしないで、グローバル変数にしてどの関数からでも使えるようにするか、 staticにして、変数のポインタを使いたい関数に渡す。
>>408 >409の手法はアナクロであり、マルチスレッドプログラミングと相容れない手法でもあるのでお勧めできない。
適切に引き数などによる受け渡しを行なうべき。
ちなみに
>>409 のご高説に従えば、
「グローバル変数は全て(アナクロなので)使用不可」となる。
「何が正しいか?」の判断は
>>408 が行うこと。
アナクロとかナウい言葉使うなよ。俺が話についていけないだろ。
アナクロじゃなくてアナログだろ!
>414
アナクロ = anachronism 意味は時代遅れとかそんな感じ。 アナログとは無関係。
ボケにマジレスされてもい困ってしまうのではないだろうか そういう時ははつっこむかスルーで
まぁ、ぶっちゃけて言えばグローバル変数はどうしても必要な場合以外は使わないようにすると再利用しやすいモジュールになる。 たとえばマウスのデバイスドライバをCで書くときにマウスポインタの位置を記録しておく変数とか。
スレ立てるのもあれだし再利用すっか・・
現在、高3で今年からニートになる者です 東方に感化されてC言語始めた口なんですけどCほとんど分からないです Win32APIが僅かに分かる程度なのです ブロック崩しは作れたんで応用すればSTGも作れるんだろうけど、やる気が出ませぬ 春休み入って親ともしゃべんねーし友達からもメールこねーし、電話こねーしで 流石にこのままだと樹海付近を散歩しにいきそうなのでここを日記代わりにします 最終目標:DirectX使ってシューティング作る
だけどDirectXの本持って無いんで取り敢えず Win32APIで弾幕STG作ります!! パッドで動けばそれでいい 明日から作りますね自機のドット絵は無意味にキャラ絵にしたいなぁ。と思いつつ今日はもう寝ます
2時間悩んでやっと背景が動くようになった・・・ この背景素材の使用許可申請中。無理だったら自分で作るからいいですよいいですよ 次は自機のドット絵を描いてみる
>>421 悪いことはいわねーからバイトぐらいはしとけ。
>>424 嫌です
ここ数日は遊んでしまったorz
久しぶりに運動して全身筋肉痛
経過:
ドット絵をとりあえず一枚描いた。
それを矢印キーでスムーズに動くようにしてるけどむずい
斜めもいけるようになったけど一つだけ問題が残った。。だるいんで後回し。次のステップへ
企画書?みたいなのを書こうと思った・・・・・
作業の順番決めないと効率悪いし心が折れる
>>421 順番的に最低でもC言語の基礎を身につける→Win32apiでWincowsプログラミング
でも、ブロック崩し作れたなら、別に順番なんて関係ないか。
>春休み入って親ともしゃべんねーし友達からもメールこねーし
>電話こねーしで
気にすんな。人間関係に悩んでないなら、自己を極めるのに最適な時だ。
孤独は人を強くする。
>>426 DOS窓でいろんな操作するより単純なゲームのプログラミングのほうが楽でした
孤独に耐えられるか心配ですけど頑張ってみます
>>427 自転車で片道30分かけて行けと申しますか(いつか行こう・・いつか
製作メモ: パッドで動かす ↓ 弾幕アルゴリズム QEDの真似事、画像使う ↓ 当たり判定 ↓ 当たり判定を丸にする 経過: 矢印キーでスムーズに動くようになった(無意味に複雑にしてたようだ・・ パッドでも動くようになった 次は弾幕アルゴリズムに触れてみる・・・ まずフランのQEDを真似する事に決定
>>428 プログラムばっか勉強してると、パソコンでソース書くばっかになって
運動不足になるから、片道30分の自転車は良い運動になるよ。
運動すれば、脳の活性化にもつながるし。
そうしないと、俺みたいなクソデブになっちゃうよ。
クソデブになるとよけいに、運動がおっくうになって悪循環。
もう、俺なんて最悪だよ。超クソデブだよ。
はぁ・・昔は今より体重40kgは少なくて、運動大好きだったのに・・・
>>430 そ、そんなに自虐しないでください
プログラミングできるって事はそれだけ精神的に強かったって事でしょうし
間食もやめようと思えば出来ますさ
自分は・・体質と生活的に太る事はまず無いんですけど運動不足はヤバイですね(週1などと言わず毎日動かないと。
先日運動した時の筋肉痛が未だ取れないです
>弾幕アルゴリズム 難し・・・・かった 一日使って中心から弾幕が広がるプログラムは出来た(満月よりも丸いんだぜ! 明日は 敵キャラのドット絵を描く 適当に動くようにする そっから弾幕発生 弾幕の画像描く 画像を斜めに表示する 円以外の弾幕を考える 当たり判定を丸にする 余った時間でドット絵たくさん描く
>>433 一つ分かったことは、猫でもの本を参考にしてることだ。
別にそれはそれで良いんだけど、メッセージごとの処理を
自分で関数作って、もっとソースの見通しを良くしたらどうでしょう。
c言語で記述してるつもりでもcppファイルって事は、C++として
処理されてるだろうから、クラス作ってさらに処理内容の見通し
を良くしてはどうでしょう。参照も使えますし。
ただ、スレがC言語だからクラスの作り方は知らないかもしれない
ま、別にクラスにすると便利なだけで手間はそうかわらないけど。
とりあえず、自前のヘッダ作って、プロトタイプ宣言は全部放り込んで
ソース用のファイルを増やして、メッセージ内の処理の見通しを
良くした方が良いと思います。
一つのファイル内で、全部の処理書いてると、うんざりしてくると思いますよ。
435 :
デフォルトの名無しさん :2007/02/09(金) 11:20:03
#include<stdio> main() { double[問1]=3.14; /*円周率*/ double[問2]=20.0 ; /*半径*/ double[問3]; result=[問4]; printf;[問5] 円の面積は[問6]ですと表示させること return0; 初級だから簡単問題です
436 :
デフォルトの名無しさん :2007/02/09(金) 11:22:40
#include<stdio> main() { double[問1]=3.14; /*円周率*/ double[問2]=20.0 ; /*半径*/ double[問3]; result=[問4]; printf;[問5] 円の面積は[問6]ですと表示させること return0; 初級だから簡単問題です
>>434 アドバイスありがとうございます
猫でもの本っていうことバレましたかw
コメントだけ削っても特徴は出ちゃうんですね
クラスとヘッダ、、やってみます
ヘッダは理解出来ました。 ヘッダファイルばっかりで中身があんまり無いソースとか、こういう事だったんすね。これは便利 ただ、複数のファイルに分割して書くとグローバル関数増えちゃうんですけどこれはしょうがないんですか? >クラス 少し使い方調べて粘ったけど何だか書き方が違うらしくてエラー出過ぎで諦めました・・ 一緒にstructっていうのも出てきて、こっちはとりあえず使えるようになりました
今お前はCを勉強しているのだろ。 ならとりあえずクラスは置いておけ、C++という(一応)別言語の概念だから。
>>439 どっちつかずな自分がいます(´Д`;)
というか今のところ両方の言語で使える技術しか身について無いので違いもよく分かりません
もう少しこの中間を行き来して使いやすいほうを覚えていくです
経過:
ドット絵の才能を僕にください・・・
自機3枚描きました動かすととても・・・うにょうにょします
いろいろとサンプル見てたらいろんなソースの書き方あるみたいだ そして日が暮れている 猫でも分かる本は簡単なんだっていう事が分かってきた こんだけいろんな書き方あるんじゃ何人かでソフトとか作ったりする時ヤバくね・・・・・・・ やっぱその中に一人くらい凄い人がいてソース繋げるんすかね
大丈夫、あんたみたいな日本語でもちゃんと通じるように、いろんな書き方でも(辻褄が合っているなら)ちゃんと動く。
>>442 なるほど
さて、ゲ製作は全然進んで無い・・・・
とりあえず当たり判定を四角から多角形にしようと試みて
八角形にしようと座標を取って
線で結んでそれを自機の上に乗っけてみたかったのに
式が間違ってたらしく、自機が左上の0,0にいるときは確かに正しく乗ってるんだけど動かすと八角形の点結んだ線が拡大縮小した・・・
struct board {int idoo, x, y, w, h;};//自機スピードxy,width,height
struct board jiki = {5, 100, 100, 200, 200};
MoveToEx(hdc_mem, jiki.x+(jiki.w-jiki.x)/2, jiki.y, NULL);
LineTo(hdc_mem, jiki.x+(jiki.w-jiki.x)/2, jiki.y+(jiki.h-jiki.y));
MoveToEx(hdc_mem, jiki.x, jiki.y+(jiki.h-jiki.y)/2, NULL);
LineTo(hdc_mem, jiki.x+(jiki.w-jiki.x), jiki.y+(jiki.h-jiki.y)/2);
MoveToEx(hdc_mem, jiki.x+((jiki.w-jiki.x)/8), jiki.y+((jiki.h-jiki.y)/8), NULL);
LineTo(hdc_mem, jiki.x+((jiki.w-jiki.x)/8)+(jiki.w-jiki.x)-((jiki.w-jiki.x)/4), jiki.y+((jiki.h-jiki.y)/8)+(jiki.h-jiki.y)-((jiki.h-jiki.y)/4));
MoveToEx(hdc_mem, jiki.x+((jiki.w-jiki.x)/8)+(jiki.w-jiki.x)-((jiki.w-jiki.x)/4), jiki.y+((jiki.h-jiki.y)/8), NULL);
LineTo(hdc_mem, jiki.x+((jiki.w-jiki.x)/8), jiki.y+((jiki.h-jiki.y)/8)+(jiki.h-jiki.y)-((jiki.h-jiki.y)/4));
初めてこんな読みにくいもの書いたよ
ああ・・・・ほんと酷い。2時間くらいかかった・・・・ 自分の頭を疑うよ・・・ でもこれで何とか当たり判定が四角じゃ無くなる・・・ これを式にするのもまた時間かかるから明日だ・・・・・・ MoveToEx(hdc_mem, jiki.x+jiki.w/2, jiki.y, NULL); LineTo(hdc_mem, jiki.x+jiki.w/2, jiki.y+jiki.h); //頂点から真下 MoveToEx(hdc_mem, jiki.x, jiki.y+jiki.h/2, NULL); LineTo(hdc_mem, jiki.x+jiki.w, jiki.y+jiki.h/2); //横真っ直ぐ MoveToEx(hdc_mem, jiki.x+jiki.w/8, jiki.y+jiki.h/8, NULL); LineTo(hdc_mem, jiki.x+7*jiki.w/8, jiki.y+7*jiki.h/8);//斜め1 MoveToEx(hdc_mem, jiki.x+7*jiki.w/8, jiki.y+jiki.h/8, NULL); LineTo(hdc_mem, jiki.x+jiki.w/8, jiki.y+7*jiki.h/8);//斜め2
先に調べてからやるべきだったwwww 当たり判定を丸にするには丸の中心からの距離を調べればいいのか・・・ 八角形にする意味ってあんまり無かった まぁいいや・・・いつかこの経験は役に経つだろう・・・疲れた。作業時間長いわりに全然進まないんだぜ もうほんとに寝るぽ
446 :
助けて・・・ :2007/02/15(木) 16:51:48
■プログラム課題:最小値を算出するプログラムを作る 3つの整数を入力し,その内の最小値を出力するプログラムを作成せよ. 但し,最小値を算出する関数,"min3"を自分で作成し用いなさい. また,最小値の出力はメイン文で行うこと. ------------------------------------------- "表示結果の例" 3つの整数を入力してください。 整数1:5 整数2:-4 整数3:0 最も小さい整数は-4 ------------------------------------------- 誰かお助けください!!
>>446 スレタイ見ろ
ここは「C言語を今日から始める」やつにしか教えないスレだ
ついでに言えばマルチするやつに明日の太陽を見る資格はない
#include <stdio.h> int min3(int a, int b, int c) { if(a <= b) if(a <= c) return a; else return c; else if(b <= c) return b; else return c; } int main(void) { int a, b, c; printf("3つの整数を入力してください。\n"); printf("整数1\n"); scanf("%d", &a); printf("整数2\n"); scanf("%d", &b); printf("整数3\n"); scanf("%d", &c); printf("最も小さい整数は%d\n", min3(a, b, c)); } 面倒だから scanf のエラーチェックをしていない。 そもそも scanf を使うなとかいう突っ込みはしないでね。
> 各自の課題であり,それぞれが自力でソースプログラムを作ること これ消してマルチかよ・・・ 宿題スレならこのメッセージがあったってノープロブレム
何かを押したらコマンドプロンプトが画面いっぱいになった 何を押しちゃったんだかわかりませんか?
Alt+Enter
本に載っていた自己参照的構造体のサンプルプログラムなんですが、 解説を繋ぎ合わせてみたんですが、コンパイルエラーになります。 どこがおかしいのか教えて下さい。できたら理由も。 コードが書いてあって解説、コードが書いてあって解説と 通してのコードが書かれてないので繋ぎ合わせたんです。 宜しくお願いします。 #include <stdio.h> struct Node { char name[20]; struct Node *next; }; int main(void) { struct Node list[] = { {"abe", NULL}, {"asou", NULL}, {"tanigaki", NULL}}; list[0].next = &list[1]; list[1].next = &list[2]; struct Node *p; p = list; while (p != NULL) { printf("名前は%s\n", p->name); p = p->next; } return 0; }
struct Node *p;の位置が悪い。 宣言は代入とかの前になければいけないから。
454 :
452 :2007/02/20(火) 21:23:56
>>453 レスありがとうございます。
無事コンパイル通りましたm(_ _)m
宣言は使う前にすればいいのかと思っていました。
違うんですね。
>>454 古いCコンパイラにはそういう制限がある。
ちゃんと新しいCコンパイラを使うか、C++としてコンパイルすればそんな下らない制限に引っ掛からないで済む。
456 :
452 :2007/02/22(木) 20:45:55
>>455 コンパイラはVisual C++2005でvsvars32.batをホルダにコピーして
使ってるんですがエラーになりました…。
拡張子をcppとかにしないとC++としてコンパイルされないよ。
458 :
452 :2007/02/22(木) 21:37:32
459 :
デフォルトの名無しさん :2007/03/29(木) 10:36:57
ヘッダーファイルの身の順番についておしえてくれ。 今のところ、 インクルード マクロの定義 構造体、enumなどの宣言 プロトタイプ宣言 extern 変数宣言 の順番にしているのだけれど、こんな感じでいいかな? 何かアドバイスがあればよろしく。
460 :
デフォルトの名無しさん :2007/03/29(木) 10:37:41
>459 身 → 中身 でした。訂正。
>>459 最後のextern変数宣言はない方がいいな。
特に書いてないが、インクルードガードは忘れずに。
まあどうしても必要なときには、プロトタイプより先におくべきだと思う。 プロトタイプに比べればずっと数が少ないだろうし。
463 :
459 :2007/03/29(木) 12:11:50
みなさん。アドバイスありがとさんです。 では皆さんどこでextern宣言されているんですか?
グローバル変数を全ソースで共通に使うなんて無いから ヘッダには入れないなあ
どうしてもグローバル変数を使いたければ、それ専用のインクルードファイルを作るなぁ。
C言語書くソフトってどこにあるか教えてください
>>466 俺も初心者だが
bcpadとかで検索してみ
>>467 インストールしたんですが使い方がさっぱりわかりません
どうしたらいいんですか?
そのまま検索すれば分かりやすいサイトがすぐみつかるよ
470 :
デフォルトの名無しさん :2007/04/07(土) 07:38:41
さて、俺も今日からC言語を勉強してみようと思う。 プログラムの勉強自体初めてなんでwkwkだ。
471 :
デフォルトの名無しさん :2007/04/08(日) 02:19:12
じゃ、まず問1)フリーズするプログラムを作れ!
オリジナルのプログラムをお持ちの方いらっしゃいませんか? この度クレジット決済でスムーズにダウンロード売買が できるサイトを立ち上げました。 つhttp//web-cart.jp/ ※会員登録&商品のうp全て無料です! クオリティの高い商品のうpをお待ちしてますw
俺も2〜3日勉強中の身です。本で*が キレイに並んでるのを見て ***** **** *** ** * ↑こんなの作りたいなと思ったんですが 全然できません。 教えて頂けませんか?
int main(void) { printf("*****\n****\n***\n**\n*"); return 0; }
475 :
デフォルトの名無しさん :2007/04/08(日) 03:16:34
>472ちげ〜よw フツーに半角で *****[Enterキー]****[Enterキー]***[Enterキー]**[Enterキー]* で、おk
477 :
デフォルトの名無しさん :2007/04/08(日) 03:31:56
ごめんなす(:D)| ̄|_
478 :
デフォルトの名無しさん :2007/04/08(日) 06:26:34
>>473 こんな感じで良いか?
#include <stdio.h>
int main(int argc, char *argv[])
{
int i,j;
for(i = 5; i >= 0; i--){
for(j = 0; j <= i; j++){
putchar('*');
}
putchar('\n');
}
return 0;
}
>>473 こんな感じで良いか?
putC(int n){ if(n){ putchar('*'); putC(n-1); } else putchar('\n'); }
putL(int n){ if(n){ putC(n); putL(n-1); } }
main(){ putL(5); }
#include <stdio.h> #define LEN (5) int main() { char star[LEN]; for (int ic = 0; ic < sizeof(star); ++ic) star[ic] = '*'; for (int ic = sizeof(star); ic > 0; --ic) printf("%.*s", ic, star); return 0; }
#include <stdio.h> int main() { char *p = "*****"; while(*p) puts(p++); }
数字を使ってないってのが素適ですね
483 :
デフォルトの名無しさん :2007/04/08(日) 10:47:53
では>475を採用しまつ
484 :
473 :2007/04/08(日) 18:49:59
皆さんありがとうございます。 また、多分わからんことだらけなので 色々勉強に来ます!
485 :
デフォルトの名無しさん :2007/04/16(月) 22:51:51
unionって、何に使うんですか? 使い道がわかりません。
>>485 unionを使うと例えば
float a = 1.3;
const char * p = (const char *) & a;
for (int ic = 0; ic < sizeof(a); ++ic) printf("%02x ", p[ic]);
とおなじことが
union {
float a;
char p[];
} u;
u.a = 1.3;
for (int ic = 0; ic < sizeof(u.p); ++ic) printf("%02x ", u.p[ic]);
と書けます。
487 :
名無し@沢村 :2007/04/16(月) 23:52:39
488 :
デフォルトの名無しさん :2007/04/17(火) 00:55:19
プログラムってどんなソフトに書き込めばいいんだ?
489 :
デフォルトの名無しさん :2007/04/17(火) 00:59:17
書くだけでいいのであれば、なんでもいいので好きなテキストエディタに書け。
490 :
名無し@沢村 :2007/04/17(火) 01:16:24
2ちゃんに書き込・・・ ごめん