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

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

C/C++の宿題やらせてください。おながいします

1 :デフォルトの名無しさん:03/04/29 14:27
私はC++房。
今まで1年*ヶ月、ほとんど毎日休まず一生懸命C++を勉強してきた。
ついでに今はJavaと基本情報もやっている。
わからない宿題若しくは処理があったら私にやらせてくださいm(_ _)m
4代目(前スレ): http://pc2.2ch.net/test/read.cgi/tech/1045074808/l50
3代目: http://pc2.2ch.net/test/read.cgi/tech/1041992392/l50
2代目: http://pc3.2ch.net/test/read.cgi/tech/1039772622/l50
宿題手伝いますYO!!: http://pc3.2ch.net/test/read.cgi/tech/1038024989/l50





2 :デフォルトの名無しさん:03/04/29 14:34
2

3 :デフォルトの名無しさん:03/04/29 14:34


前スレの話だが汎用の値交換に興味のある向きは
BSD や GNU の libc/stdlib/qsort.c を見るといいやも

4 :C初心者:03/04/29 14:44
SGLつかってscanfで読み込んだ2つの数値n,mで
n行m列の表を作ろうと思ったのですがうまくいきません。
超初心者的な質問で申し訳ないですが、どなたかご教授下さい。

#include "sfcgl.h"
void display()
{
BGColor(0, 0, 0);
int i,j;
double n,m,x,y;
for(i = 0; i < n; i++){
x = 10.0 + 10*i;
DrawLine(x, 0.0, 0.0, x, n*100 , 0.0);
}
for(j = 0; j < m; j++){
y = 10.0 + 10*j;
DrawLine(0.0, y, 0.0, m*100, y, 0.0);
}
SGSwapFrames();
}
int main(int argc, char** argv) {
int n,m;
scanf("%d%d",&n,&m);
SGInit(argc, argv);
SGOpenWindow(50, 50, 500, 500);
SG2DMode();
SGSetDisplay(display);
SGCallBack();
return 0;
}

mainで読み込んだn,mをvoid displayに関連させる方法が分りません。

5 :デフォルトの名無しさん:03/04/29 14:51
>>4
void display(double n,m) /* ←引数にする */
{
BGColor(0, 0, 0);
int i,j;
double x,y; /*←ローカル変数のm,nは削除*/
for(i = 0; i < n; i++){
x = 10.0 + 10*i;
DrawLine(x, 0.0, 0.0, x, n*100 , 0.0);
}


6 :デフォルトの名無しさん:03/04/29 14:53
>>3
glibcはdo{}while(0)マクロを使っていたと思う。

7 :C初心者:03/04/29 16:25
レスどもです。
でもそれをやると
parse error before m と
m undeclared, n undeclared
とエラーが出ます。引数にするのは正しいと思うのですが、
なぜかできない・・・。
スマソ

8 :bloom:03/04/29 16:26
http://homepage.mac.com/ayaya16/

9 :デフォルトの名無しさん:03/04/29 16:40
>>7
void display(double n,double m)

10 :デフォルトの名無しさん:03/04/29 16:49
http://pc2.2ch.net/test/read.cgi/tech/1045074808/948
質問の問いのを作ってるのですが、カーソルにあたった時の処理ってどうでしたっけ?
・ボールの角度が垂直×真ん中にあたった=垂直のボールが飛ぶ
・ボールの角度が垂直×端にあたった=端にあたるほど角度の無いボールが飛ぶ
・ボールの角度が垂直でない×真ん中にあたった=その角度を反転させたボールが飛ぶ
・ボールの角度が垂直でない×端にあたった=?
?の部分を教えてください。元のボールの角度に関係なくあたった位置により角度を作るか、
元のボールの位置とあたった位置を平均して角度を作るのどちらかっぽいのですが。

11 :C初心者:03/04/29 17:10
神キター!!!
しかしできず。萎え・・・。
passing arg 1 of SGSetDisplay from imcompatible pointer type
と出ます。

何度も何度もスマソですがこのエラーの対処方わかります?。

12 :デフォルトの名無しさん:03/04/29 17:12
>>11
お前はそのエラーメッセージが読めんのか?

13 :デフォルトの名無しさん:03/04/29 17:17
SGSetDisplay()に渡す関数ポインタのシグネチャが違うんじゃないの

14 :デフォルトの名無しさん:03/04/29 17:18
>>11
ヒント。
自分自身の書いた関数名を渡そうとしていないか?
そのSGなんたらには何を渡すべきか判っているのか?

15 :C初心者:03/04/29 17:25
SGSetDisplay(display);
問題は上の()の中に入れる関数だと思うのですが、
(display(n,m))と入力しても voidエラーが出て実行できません。
英語が駄目駄目なんでエラー文の意味もまともに解釈できず困ってます。
神の方どうかご教授下さい。

16 :デフォルトの名無しさん:03/04/29 17:28
>>15
とりあえず関数ポインタについて勉強してからにした方がいいよ



17 :デフォルトの名無しさん:03/04/29 17:31
>>15
博識者を神とおだてるより自分で調べろよ。
英語がわからないならオンライン辞書でも使えばいいしさ。
エラーをヘルプで検索するってのもできるだろ?

18 :C初心者:03/04/29 17:31
わかりました。関数ポインタについては参考書を購入して
勉強いたしたいと思います。ですがとりあえずこのプログラムが
上手くいく方法をご教授願えないでしょうか?よろしくお願いします。

19 :デフォルトの名無しさん:03/04/29 17:36
>>18
英語も勉強しろ。
sageも覚えろ。

さて、「とりあえず」のコードをやろう。

#include "sfcgl.h"
int n,m;
void display()
{
BGColor(0, 0, 0);
int i,j;
double x,y;
〜〜〜〜〜〜〜〜〜〜〜〜
〜〜〜〜〜〜〜〜〜〜〜〜
}
int main(int argc, char** argv) {
scanf("%d%d",&n,&m);
SGInit(argc, argv);
SGOpenWindow(50, 50, 500, 500);
SG2DMode();
SGSetDisplay(display);
SGCallBack();
return 0;
}

このライブラリは描画関数に引数を渡せんのか・・・。不便だな。

20 :デフォルトの名無しさん:03/04/29 17:39
>>19
> sageも覚えろ。

これは余計

21 :デフォルトの名無しさん:03/04/29 17:41
なんか結局質問した時に戻ってるような

22 :デフォルトの名無しさん:03/04/29 17:44
ようは答えだけが知りたいんだろ。

ヒントなんかくれなくていいから答えだせ、と

23 :C初心者:03/04/29 17:48
>>19
ありがとうございます。おかげさまで実行できますた。



24 :デフォルトの名無しさん:03/04/29 17:52
scanfに突っ込むのは無粋ですね


25 :デフォルトの名無しさん:03/04/29 22:05
既存質問スレでの常時age進行は、
質問スレ乱立防止策には成り得ませんか?ダメ?

26 :デフォルトの名無しさん:03/04/29 22:20
>C初心者さん
なんでnとmへの入力をmain関数で受けるの?

27 :デフォルトの名無しさん:03/04/29 22:57
以下の2つの宣言は、どう異なるか述べなさい。
char *p = 'A';
char *p = "A";
次に上記のようにポインタ変数に初期値を与えるのでなく、
代入によって与えるような次のプログラムを書いた。
このプログラムに誤りがあるとすれば指摘しなさい。
#include<stdio.h>
int main(void)
{
char *p;
*p = 'A';
printf("*p = %c",*p);
return 0;
}
よろしくお願いします。

28 :デフォルトの名無しさん:03/04/29 23:00
とりあえず。1が宿題をやらないのがむかつく

29 :デフォルトの名無しさん:03/04/29 23:03
>>27
怪しい問題だな。写し間違いか?

30 :デフォルトの名無しさん:03/04/29 23:07
>char *p = 'A';
>char *p = "A";

上、ろくな事にならんぞ。

31 :デフォルトの名無しさん:03/04/29 23:30

>char *p;
>*p = 'A';
>printf("*p = %c",*p);

pは有効な変数を指してないのでまともに動かね

32 :デフォルトの名無しさん:03/04/29 23:37
#include<stdio.h>

main(){
int i;
float f;
f=1234.0098;
i=f;
printf("%f %d",f,i);}

1234.0098 1234 と表示されるはずが
1234.009766 1234 と表示されます。
どうしてですか?教えてください。
ちなみに環境はwinXP,bcc5.5です

33 :デフォルトの名無しさん:03/04/29 23:43
>>31
重箱の隅だが「pは有効な変数を指してない」はいかがなものか

34 :デフォルトの名無しさん:03/04/29 23:46
>>27
> char *p = 'A';
> char *p = "A";

Cではcharはintと等価だから、上のは代入の時点で普通Warning吐かれるよ。
まあ、そういうことを言いたいんじゃないと思うけど。

とりあえず'A'は値を代入、"A"はアドレスを代入することになるから。
char *p = 'A'は多分、コンパイル通ってもAccess Viorationで落ちるね。
このプログラム、なんか少し前のVCLの某文字列クラスのバグを皮肉ってるようでなんかムカつく。

>>32
C、というかprintfはfloat型を出力できません。
すべてdouble型に暗黙の型変換されます。

35 :デフォルトの名無しさん:03/04/29 23:49
int型って-127〜128だったっけ?

2進数    →10進数

00000000  → 0
10000000  → -128  でいいの?
10000001  → -1
01111111  → 128  ?

助けて

36 :デフォルトの名無しさん:03/04/29 23:53
>>35
× int型って-127〜128だったっけ?

○ 00000000  → 0
○ 10000000  → -128
× 10000001  → -1
× 01111111  → 128

× 助けて


37 :35:03/04/29 23:56
char型って-128〜127だっけ?

00000000  →  0
10000000  →  -128
11111111  →  -1
01111110  →  127

助けて

38 :デフォルトの名無しさん:03/04/29 23:58
>>37
× char型って-128〜127だっけ?

○ 00000000  →  0
○ 10000000  →  -128
○ 11111111  →  -1
× 01111110  →  127

× 助けて

39 :35:03/04/30 00:12
char型って-128〜127だろ!

00000000  →  0
10000000  →  -128
11111111  →  -1
01111111  →  127
10000001  →  -127
10000010  →  -126

分かった!

40 :デフォルトの名無しさん:03/04/30 00:22
>>34
そうなんですか?でも、誤差はでませんよね??

41 :デフォルトの名無しさん:03/04/30 00:28
>>39
× char型って-128〜127だろ!

○ 00000000  →  0
○ 10000000  →  -128
○ 11111111  →  -1
○ 01111111  →  127
○ 10000001  →  -127
○ 10000010  →  -126

× 分かった!

42 :デフォルトの名無しさん:03/04/30 00:28
実数を使う以上誤差はでるよ。

43 :35:03/04/30 00:39
char型って-127〜127ですか?

中略


分かりません。

44 :デフォルトの名無しさん:03/04/30 00:47
>>43
型の取り得る値の範囲は処理系依存。(CHAR_MIN〜CHAR_MAX)
char型が符号付か符合無しかも処理系依存。


45 :デフォルトの名無しさん:03/04/30 00:51
>>42
丸め誤差とかのことでしょ?
0.0098に対して0.009766は誤差がありすきでしょう。

46 :デフォルトの名無しさん:03/04/30 00:59
#include <float.h>
printf("%f",FLT_EPSILON);

47 :デフォルトの名無しさん:03/04/30 01:44
>>43
signed charなら確実にその範囲は表せる。

48 :47:03/04/30 01:46
0〜127なら確実だね。


49 :35:03/04/30 02:23
サッパリ分かりません。
char型は1バイトでしょう?8ビット。
256個の整数を表せるのでは?
-128〜127は256個
-127〜127では255個です。
unsigned charでは0〜255なので256個

リナックスとウィンドウズは想像以上に違うの?
つうかリナックスの何処に<stdio.h>ってあるのですか?
#include <stdio.h>
って書いて意味あるの?

50 :デフォルトの名無しさん:03/04/30 02:42
>>49
補数って知ってますか?

51 :デフォルトの名無しさん:03/04/30 02:53
>>49
最低8ビットだけど、8ビットとは限らない。
limits.hの中のCHAR_BITがビット数

で、8ビットかつ1の補数表現なら最低は-127
1の補数表現だと全ビット0と全ビット1がどちらも値として0になる。

> つうかリナックスの何処に<stdio.h>ってあるのですか?
多分/usr/include
stddef.hとかは別の場所にあるかも。

52 :35:03/04/30 03:08
出直してきます
ありがとうございました。

53 :デフォルトの名無しさん:03/04/30 05:38
>>45
IEEE754ならfloatの32bitの内訳は符号sが1bit, 指数eが8bit, 仮数mが23bitなので
有効数字は2進で24桁、約7桁だから期待通りの結果だと思うが?

54 : :03/04/30 11:16
つーか
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00046.html
読めば全て解決。

昔、漏れも C の先生に
sizeof int 以外は処理系に依らず決まってる
と嘘つかれますた。


55 :デフォルトの名無しさん:03/04/30 11:57
薦めるならこっち
ttp://www-ccs.ucsd.edu/c/types.html#Basic%20Integer%20Types
ttp://www-ccs.ucsd.edu/c/limits.html
ttp://www-ccs.ucsd.edu/c/

56 :デフォルトの名無しさん:03/04/30 12:59
int one(int i, int vc)
{


for (i = 0; i < 2; i++) {
int temp = vc[i];
vc[i] = vc[4 -i];
vc[4 -i] = temp;
}
return(vc[i]);
}

どこをどう治したらいいかわからん
あと
c:7: warning: declaration of `i' shadows a parameter
これはなに?

57 :デフォルトの名無しさん:03/04/30 13:01
>>56
なぜint vcを配列として扱う?

58 :デフォルトの名無しさん:03/04/30 13:05
>>56
その程度の英語くらい何とかしろよ。
そのソースには書いてないようだが、
パラメータでiを宣言しているのに関数内でも宣言してないか?

59 :デフォルトの名無しさん:03/04/30 13:05
>>56
ただのループカウンタを引数にすんなよ。

60 :デフォルトの名無しさん:03/04/30 13:06
>>56
何をしたいプログラムなの?

61 :デフォルトの名無しさん:03/04/30 13:07
>>56
% echo 'void f(int i){
int i;};' | gcc -c -xc -
: In function `f':
:2: warning: declaration of `i' shadows a parameter

62 :デフォルトの名無しさん:03/04/30 13:08
int one(int n, int *vc)
{
int i;
for (i = 0; i < 2; i++) {
int temp = vc[i];
vc[i] = vc[4 -i];
vc[4 -i] = temp;
}
return(vc[n]);
}

63 :デフォルトの名無しさん:03/04/30 13:10
>>62
中途半端なスワップ関数だなぁ・・・。

64 :デフォルトの名無しさん:03/04/30 13:24
スワップッつーか、リバースだろ。

65 :56「:03/04/30 13:29
returnは使えないんじゃないの
使わないやり方教えてください

66 :デフォルトの名無しさん:03/04/30 13:31
>>56
おいおい、それ以前にやることがあるだろ。
・自分がどんな関数を書きたかったのか
・書かれたことは理解できたか
・ついでにお礼も
ここは質問スレじゃないんだからネタ提供せずに質問だけするなよ。
#あ、ネタにはなってるのか。

67 :デフォルトの名無しさん:03/04/30 13:32
リバースならこうかな。iは要素数として
void one(int i, int *vc)
{
for (; --i > 0; vc++) {
int temp = *vc;
*vc = vc[i];
vc[i] = temp;
}
}

68 :デフォルトの名無しさん:03/04/30 13:32
なんで使えないの?
vc[n]はintだから型もあっているし。

69 :デフォルトの名無しさん:03/04/30 13:46
名前が one だからリバースじゃないね

70 :56「:03/04/30 14:09
配列の並び順を 逆にする関数を作りたいんです
#include <stdio.h>
#define NUMBER 5
void one(int i, int *vc)
{ for (; --i > 0; vc++) {
int temp = *vc;
*vc = vc[i];
vc[i] = temp;
} }
int main(void)
{
int i;
int vc[5];


puts("5個の整数を入力してください。");
for ( i = 0;i < 5; i++){
printf("%2d番目:", i + 1); scanf("%d", &vc[i]);
}
puts("逆に並べると");

for (i = 0;i < 5; i ++)
printf("vc[%d]=%d\n", one(i, *vc ));
return(0);
}
: In function `main':
:26: warning: passing arg 2 of `one' makes pointer from integer without a cast
:26: invalid use of void expression
さっぱりでつ お願いします


71 :デフォルトの名無しさん:03/04/30 14:11
>>70
> printf("vc[%d]=%d\n", one(i, *vc ));

なぜ*vcと間接参照する。参照しないでポインタを渡すの。

72 :71:03/04/30 14:12
それにoneの戻り値はvoidなんだからprintfの引数には使えないでしょう。

73 :56「:03/04/30 14:16
もう少しわかりやすくお願いします

74 :デフォルトの名無しさん:03/04/30 14:19
>>73
#include <stdio.h>
#define NUMBER 5
void one(int i, int *vc)
{ for (; --i > 0; vc++) {
int temp = *vc;
*vc = vc[i];
vc[i] = temp;
} }
int main(void)
{
int i;
int vc[5];


puts("5個の整数を入力してください。");
for ( i = 0;i < 5; i++){
printf("%2d番目:", i + 1); scanf("%d", &vc[i]);
}
puts("逆に並べると");
one(i, vc );
for (i = 0;i < 5; i ++)
printf("vc[%d]=%d\n", i,vc[i]);
return(0);
}

75 :デフォルトの名無しさん:03/04/30 15:15
>>66
漏れは礼はいらんと思う。理解できたかどうかだけが意味がある。

76 :66:03/04/30 17:58
>>75
「理解できました、ありがとう。」ってのを期待してた。
でもどうやらそれ以前のようだね・・・

77 :デフォルトの名無しさん:03/04/30 18:30
>>76
紛らわしかったかもしれんが75≠56

78 :66:03/04/30 18:42
>>77
わかってるよん。

79 :デフォルトの名無しさん:03/04/30 18:50
>>67
もう一つ引かないといけないんじゃない?
void one(int i, int *vc)
{
for (; --i > 0; vc++, i--) {
int temp = *vc;
*vc = vc[i];
vc[i] = temp;
}
}

80 :デフォルトの名無しさん:03/04/30 21:38
void reverse(int i, int *vc) {
for (; --i > 0;)
*vc++ ^= vc[i--] ^= *vc ^= vc[i];
}

81 :__:03/04/30 21:42
  ∧_∧   
 ( ・∀・)/< こんなのみつけたっち♪ 
http://www.yamazaki.90.kg/moe/hankaku07html
http://yamazaki.90.kg/mona/index.html
http://www.yamazaki.90.kg/moe/hankaku08.html
http://yamazaki.90.kg/moe/hankaku10.html
http://www.yamazaki.90.kg/moe/hankaku07.html
http://yamazaki.90.kg/moe/hankaku03.html
http://www.yamazaki.90.kg/moe/hankaku05.html
http://yamazaki.90.kg/moe/hankaku01.html
http://www.yamazaki.90.kg/moe/hankaku06.html
http://yamazaki.90.kg/moe/hankaku04.html
http://www.yamazaki.90.kg/moe/hankaku09.html

82 :デフォルトの名無しさん:03/04/30 22:42
>>1 やってみて。

1.1926以上2002以下の数(西暦)をキーボードから入力すると、「昭和45年です」とか
 「平成6年です」とか和暦に直すプログラム。1926年の場合は「昭和元年です」
 1989年の場合は「平成元年です」と表示するように。
 で、1925以下や2002以上が入力されると「入力は1926-2001の間にして下さい」と表示。

2.Aさん、Bさんが階段じゃんけんゲームをシュミレーションするプログラム。
 ルールは・・・
 ○プレイヤー2人は、最初階段の0段目にいてじゃんけんする。
 ○じゃんけんの勝者はグーで勝てば1段、チョキで勝てば2段、パーで勝てば5段
  階段を登ることが出来る。あいこは0段。
 ○10回のじゃんけんの結果、より高い段に居た方が勝ち。

3.「2のn乗 −2」がnで割り切れるなら素数であるという定理を使って、2〜20までの
 素数を全て求めよ。

83 :デフォルトの名無しさん:03/04/30 22:45
>>67 >>79 >>80
おまえら、無駄が多い。

84 :デフォルトの名無しさん:03/04/30 22:46
>>83
お前は無駄レスだけ。

85 :デフォルトの名無しさん:03/04/30 22:46
オレニマカセロ!

86 :not 1:03/04/30 22:50
>>82
1ではないが、やっていいかNa??

87 : :03/04/30 22:57
>>82
> 3.「2のn乗 −2」がnで割り切れるなら素数であるという定理を使って、2〜20までの
この定理、なんか変じゃないか???



88 :デフォルトの名無しさん:03/04/30 23:00
2^2-2=4
2^3-2=6
2^4-2=14 ×
2^5-2=30
...

89 :デフォルトの名無しさん:03/04/30 23:02
そもそも何が素数か書かれていない。

90 :デフォルトの名無しさん:03/04/30 23:06
>>87
n=341の時はその定理は成り立たない。nが20以下には全部適用できるね。

91 :87 :03/04/30 23:09
>>90
なるほど「問題文の日本語が変」なだけだw

3.「2のn乗 −2」がnで割り切れるなら "nが" 素数であるという定理を使って、2〜20までの
 素数を全て求めよ。

ってことね。

92 :デフォルトの名無しさん:03/04/30 23:12
ちょっとやってみるか。

93 :デフォルトの名無しさん:03/04/30 23:16
今日の宿題です。

配列を上位桁から表示するようにして欲しいです。
関数は


int card_conv(unsigned x, int n, char d[])
{

int i;

char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int digits = 0;
if (x == 0)
d[digits++] = dchar[0];
else
while (x) {
d[digits++] = dchar[x % n];
x /= n;
}


for (i = 0; i < n / 2; i++)
swap(int, d[i], d[n - i - 1]);


return (digits);

}


94 :デフォルトの名無しさん:03/04/30 23:17
メインは


int main(void)
{
int i;
unsigned no;/* 変換する整数 */
int cd;/* 基数 */
int dno;/* 変換後の桁数 */
char cno[100];/* 変換後の各桁を格納する文字の配列 */
int retry;/* もう一度? */

do {
printf("正の整数値を入力してください:");
scanf("%u", &no);
do {
printf("何進数に変換しますか(2-36):");
scanf("%d", &cd);
} while (cd < 2 || cd > 36);
dno = card_conv(no, cd, cno);/* noをcd進数に変換 */
printf("%d進数では", cd);
for (i = dno - 1; i >= 0; i--)/* 上位桁から順に表示 */
printf("%c", cno[i]);
printf("です。\n");
printf("もう一度しますか(1…はい/0…いいえ):");
scanf("%d", &retry);
} while (retry == 1);

return (0);
}


95 :デフォルトの名無しさん:03/04/30 23:45
for (i = 0; i < n / 2; i++)
swap(int, d[i], d[n - i - 1]);

for (i = 0; i < digits / 2; i++)
swap(int, d[i], d[digits - i - 1]);

96 :デフォルトの名無しさん:03/04/30 23:47
16行目でエラーが出てしまいます。aには名前を入力したいのですが
この書式指定では駄目なのでしょうか?

#include <stdio.h>
#include <string.h>
struct tell{
char name[20];
char tele[20];
};
main(){
char *a,*b;
struct tell c[255];
int i,j=0;
while(1) {
printf("全角5字以内で、氏名を入力せよ。 終了:e\n");
scanf("%s",&a);
if (a == "e") break;
strcpy(c[j].name, a);
printf("半角20字以内、ハイフン編集して、電話番号を入力せよ。 終了:e\n");
scanf("%s",&b);
if (b == "e") break;
strcpy(c[j].tele, b);
j++;
}
printf("氏名  電話番号\n");
for (i=0;i>j;i++) {
printf("c[i].name  c[i].tele\n");
}
}


97 :96:03/04/30 23:48
すいません13行目になります

98 :デフォルトの名無しさん:03/04/30 23:49
char *a

char a[1000]

99 :デフォルトの名無しさん:03/04/30 23:50
scanf("%s",&a);

scanf("%s",a);

100 :デフォルトの名無しさん:03/04/30 23:51
>>96
exploitコードの見本ですか?

101 :デフォルトの名無しさん:03/04/30 23:54
>>94
> char cno[100];/* 変換後の各桁を格納する文字の配列 */

変換対象が unsigned no なら 100 もとることはなかろう。

102 :デフォルトの名無しさん:03/05/01 00:08
n元連立一次方程式を解くプログラム作って下さい。


103 :デフォルトの名無しさん:03/05/01 00:10
数式処理のソフト手に入れろ。

104 :デフォルトの名無しさん:03/05/01 00:30
>>102
ftp://ftp.matsusaka-u.ac.jp/pub/algorithms/src/gauss.c
ftp://ftp.matsusaka-u.ac.jp/pub/algorithms/src/matutil.c

105 :102:03/05/01 00:37
卑怯な奴等ですね。
有難く頂いておきますが。

106 :デフォルトの名無しさん:03/05/01 00:44
>>105
『アルゴリズム事典』は持っとけ。良くできた本だから。
ttp://www.gihyo.co.jp/books/syoseki.php/4-87408-414-1
ttp://www.matsusaka-u.ac.jp/~okumura/algo/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4874084141

107 :その1:03/05/01 00:48
>82
86ではないが、2をやってみますた

#include <stdio.h>
#include <time.h>

int nyuryoku(){
int t;

while(1){
printf("1:グー 2:チョキ 3:パー\n");
scanf("%d",&t);
if(t<=0||t>=4){
printf("1 2 3のどれかを入力して下さい!\n");
} else {
break;
}
}

return t;
}


108 :その2:03/05/01 00:48
int janken(int a,int b){
if(a==b){return 0;}
if(a==1&&b==2)return 1;
if(a==1&&b==3)return -5;
if(a==2&&b==1)return -1;
if(a==2&&b==3)return 2;
if(a==3&&b==1)return 5;
if(a==3&&b==2)return -2;
}

void main(){
int pla=0,plb=0;//A,Bのいる位置
int i;
int ta,tb;//じゃんけんの手
int jan;
char *s;
time_t a;


109 :その3:03/05/01 00:49

for(i=1;i<=10;i++){
ta=nyuryoku();
tb=time(NULL);
tb=tb%3+1;
jan=janken(ta,tb);
if(jan>=0){
pla=pla+jan;
printf("Aの勝ち\n");
printf("Aは階段を%d段上がりました\n",jan);
} else {
plb=plb-jan;
printf("Bの勝ち\n");
printf("Bは階段を%d段上がりました\n",-jan);
}
}

if(pla<plb)s="Bの勝ちです";
if(pla==plb)s="あいこです";
if(pla>plb)s="Aの勝ちです";

printf("Aは%d段に、Bは%d段にいるので%s",pla,plb,s);
}

110 :107:03/05/01 00:51
なんか、ダサいプログラムだなあ・・・
もっと上手い方法きぼんぬ

111 :デフォルトの名無しさん:03/05/01 00:57
うーん、長いね。もっと簡潔に出来そうじゃない?

112 :102:03/05/01 01:01
( ゚Д゚)ゴルァ!!
コンパイルしたけど下の奴はコンパイルできねえし
gauss.cは出来たけど実行したら
nしか入れられないじゃないか!

2 2 3  x    10
3 2 3  y  =  9
9 2 3  z     8

とかやりたいの!

113 :107:03/05/01 01:04
もっと簡素にですか・・・
いいプログラムきぼんぬ

っていうか、janken関数が自分で書いててなんか気持ち悪い

114 :デフォルトの名無しさん:03/05/01 01:12
int janken(int a,int b){
 static int const *const sSteps[] = {0, 1, -5, -1, 0, 2, 5, -2, 0};
 return sSteps[(a - 1) * 3 + (b - 1)];
}

115 :107:03/05/01 01:12
>112
Aを行列として
Ax=y
を解きたいんでしょ?
線形代数の教科書に載ってる、余因子を使って逆行列を求める方法を使えば?

1.A,yの値を入力する
2.detAを求め正則かどうかを判別する
3.余因子を計算し、それを用いてAの逆行列A^(-1)を求める
4.x=A^(-1)yを計算し、表示する

116 :107:03/05/01 01:16
>114
おぉ、成る程
いい方法教えてくれて有難うございます

117 :デフォルトの名無しさん:03/05/01 01:28
>82
#define NGAMES 10
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int
main(int argc, char **argv)
{
  unsigned long seed;
  int a = 0, b = 0, x, y, i;
  int p[3][3][2]={{{0,0},{1,0},{0,1}},{{0,1},{0,0},{1,0}},{{1,0},{0,1},{0,0}}};
  char *name[3] = {"goo", "choki", "paa"};

  seed = argc > 1 ? atoi(argv[1]) : time(NULL); 
  srandom(seed); printf("# seed = %ld\n", seed); 
  for (i=0; i<NGAMES; i++){
    x = random()%3; y = random()%3; a += p[x][y][0]; b += p[x][y][1];
    printf("turn %2d: A:%5s(%2d), B:%5s(%2d)\n", i+1, name[x], a, name[y], b);
  }
  if (a < b) puts("B won"); else if (a > b) puts("A won"); else puts("draw");
  return 0;
}


118 :102:03/05/01 01:30
>>112で俺が書いた連立方程式って

2x+2y+3z=10
3x+2y+3z=9
9x+2y+3z=8

って事だよね?

xの解が3個あるような...(°Д°)数学分かんね

119 :デフォルトの名無しさん:03/05/01 01:37
>118
行列式は知ってる?
この場合行列式(detAと書く)が0になるから
解は無限に存在するんだよ

120 :デフォルトの名無しさん:03/05/01 01:41
ゴメン、うそ書いたかも・・・
この場合、条件を満たすx,y,zは存在しないみたいね

121 :102:03/05/01 01:43
(°Д°)撃沈しました。寝ます。

122 :デフォルトの名無しさん:03/05/01 02:40
enum AHYA
{
 Mona, Giko, Shii
};

ってenumがあったとき、
関数(Mona) // 0を返す
関数(Giko) // 1
関数(Shii)  // 2

って関数がC++にあったような木がするのですが、
俺様の気のせいですか?

123 :デフォルトの名無しさん:03/05/01 02:45
>>122

別に関数なんて使わないでも値指定しなきゃ
デフォで012,、って入ってる気がするが俺の気のせいですか?

124 :デフォルトの名無しさん:03/05/01 02:58
#define G 1
#define C 2
#define P 5
int win(int a, int b) {
return a == G && b == C || a == C && b == P || a == P && b == G;
}
if (win(a, b)) c += a;
else if (win(b, a)) d += b;
こんな感じでどう?

125 :デフォルトの名無しさん:03/05/01 04:01
>>113
デフォ。1個目は省略すると0、2個目からは++していく。

126 :デフォルトの名無しさん:03/05/01 04:51
>>82の2を見て「どうして“キーボードから入力”なんて書いてないのにscanf使ってんだ? おまえら文盲か?」と思う。
 ↓
「乱数つかえよ?アホ共」と思い、boost::mt19937にstd::timeで実装してみる。
 ↓
あいこの判定がないのに気づく。
 ↓
完成しレスするかと読み返していると、ふと「場合によっては10回ループ中で、あいこの無限ループ?」という事実に気づく。
 ↓
女々しくZThreadで逃げてみる。
 ↓
数レスでは収まらない馬鹿長いコードになっている。
 ↓
他人のために数時間を無駄にしていることに気づき、なにもかも忘れようとゲームを始める。
 ↓↑
なにか納得いかない。(繰り返し)

127 :デフォルトの名無しさん:03/05/01 05:29
>>126
>>117

128 :デフォルトの名無しさん:03/05/01 05:46
>>119
蛇足だが、補足
行列式が0だからといって解が無限にあるという考えは間違い。
一般の非斉次の場合、解が無い場合がほとんど。
つまり連立方程式は
1)解が一組だけある。
2)解そのものが無い
3)無限組ある
の3つの場合が起こりえるが、このうち行列式=0で起こるのは2)3)
のいずれか。

129 :デフォルトの名無しさん:03/05/01 05:49
高校での行列の扱いが20年前と比べてスゲエ減ってるのに衝撃を受けたが、
それでも>>128の内容は数Cの教科書に載ってますな。

130 :デフォルトの名無しさん:03/05/01 06:52
>>129
最近の中学校と高校の数学の教科書見ましたけど、こんなんで日本は大丈夫なのか?
って思っちゃいました。

これで思考力をつけるとか言ってるんだから正気じゃないね。

基礎力のないところに思考力もへったくれもないだろっての!

131 :102:03/05/01 07:04
(°Д°)私は理系の大学生ですが何か?

132 :デフォルトの名無しさん:03/05/01 09:00
>>129
行列式(det)なんて、大学入るまで習ってねーぞー。
確か・・・。

133 :デフォルトの名無しさん:03/05/01 09:53
電光掲示板みたいに文字を横に移動させるプログラムをlocateを使って
作りたいんですけど作れません。どなたか教えてくださいm(_ _)m

134 :デフォルトの名無しさん:03/05/01 09:58
オレニマカセロ!

135 :デフォルトの名無しさん:03/05/01 09:59
>>134
マカセタ!

136 :デフォルトの名無しさん:03/05/01 10:28
>>134
ガンバッテ!

137 :デフォルトの名無しさん:03/05/01 11:29
どのレベルで聞きたいのかわかりません。
とりあえず、これだけ聞くと、memcpyで出来そうな気がするけど。

138 :デフォルトの名無しさん:03/05/01 13:14
>>132
こないだ知合いの高3に数C教えたけど、逆行列は載ってたよ。
「行列式」という言葉や「det A」はなぜか書いてなかったけど、
同じものをΔと書いて>>128と同じことが説明してあった。
ついでにいうと、その数Cの教科書には掃き出し法による
連立一次方程式の数値解法のBASICのコードも載ってた。
つうか、今の数Cの教科書の行列のところは、和、積、ケーリーハミルトン、
逆行列、連立一次方程式、掃き出し法しかのってないんだけど。
線形空間の言葉が全然出てこなくておじさんクラクラしたよ。

139 :デフォルトの名無しさん:03/05/01 16:06
void erase(char *s) {
for (; *s; s++) putchar(' ');
}
for (;; x++) {
locate(x, y);
puts(s);
if (end) break;
locate(x, y);
erase(s);
}

140 :デフォルトの名無しさん:03/05/01 16:19
>>139
むぅ。

141 :デフォルトの名無しさん:03/05/01 22:30
>>139
ありがd

142 :デフォルトの名無しさん:03/05/02 09:48
#include <stdio.h>
#define NUMBER 5
void one(int i, int vc[])
{
while(i < 2) {
int temp = vc[i];
vc[i] = vc[4 -i];
vc[4 -i] = temp;
i++;
} }
int main(void)
{
int i;
int vc[5];
i = 0;
puts("5個の整数を入力してください。");
while (i < 5 ){
printf("%2d番目:", i + 1); scanf("%d", &vc[i]);
i++;
}
puts("逆に並べると");
one(i, vc );
while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}
puts("となります。");
return(0);
}



143 :デフォルトの名無しさん:03/05/02 09:51
5個の整数を入力してください.
1番目: 5
2番目: 80
3番目: 110
4番目: 2200
5番目: 33000
逆にならべると
33000
2200
110
80
5
となります.


こんな風にしたいんですがおながいします

144 :デフォルトの名無しさん:03/05/02 09:57
iの値を再初期化してへんやん

145 :デフォルトの名無しさん:03/05/02 09:58
void one(int i, int vc[])
{
i = 0;
while(i < 2) {
int temp = vc[i];
vc[i] = vc[4 -i];
vc[4 -i] = temp;
i++;
} }

146 :デフォルトの名無しさん:03/05/02 09:59
#include <stdio.h>
#define NUMBER 5
void reverse(int i, int *vc) {
for (; --i > 0;)
*vc++ ^= vc[i--] ^= *vc ^= vc[i];
}
int main(void)
{
int i, vc[NUMBER];
printf("%d個の整数を入力してください。\n", NUMBER);
for ( i = 0;i < NUMBER; i++){
printf("%2d番目:", i + 1); scanf("%d", &vc[i]);
}
puts("逆に並べると");
reverse(NUMBER, vc);
for (i = 0;i < NUMBER; i++)
printf("vc[%d]=%d\n", i,vc[i]);
return 0;
}

147 :デフォルトの名無しさん:03/05/02 10:03
今のでやったんですが
5個の整数を入力してください。
1番目:1
2番目:2
3番目:3
4番目:4
5番目:5
逆に並べると
となります。 ←ここのところが抜けちゃう運ですよ





148 :デフォルトの名無しさん:03/05/02 10:04
while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}

for (i=0; i<5; i++) printf("%d\n", vc[i]); 

149 :デフォルトの名無しさん:03/05/02 10:05
>>146
> *vc++ ^= vc[i--] ^= *vc ^= vc[i];

また、「 未 定 義 」か...。

150 :デフォルトの名無しさん:03/05/02 10:07
>>146
whileぶんで作らなければならないんですよ


151 :デフォルトの名無しさん:03/05/02 10:07
i=0;
while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}

152 :デフォルトの名無しさん:03/05/02 10:14
>>151
そりゃあ、その行には出力するための処理がないからね。

153 :デフォルトの名無しさん:03/05/02 10:17
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え


154 :デフォルトの名無しさん:03/05/02 10:33
>>149
for (; --i > 0; vc++, i--) *vc ^= vc[i] ^= *vc ^= vc[i];
これでいい?

155 :デフォルトの名無しさん:03/05/02 12:06
>>151
ちょっともちつけ
何言ってるのかわからなくなってきてるぞ

156 :151:03/05/02 12:38
151は150にレスしただけで助けてほしいわけではないです。
コピペしたときに入っただけで。

157 :デフォルトの名無しさん:03/05/02 12:43
i=0;
while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}


ここの部分をどうすればよいのでしょうか
教えてください

158 :あんたまだ解決してなかったんかい:03/05/02 12:47
while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}

i=0;
while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}


159 :デフォルトの名無しさん:03/05/02 12:55
もう一箇所ある予感!

160 :デフォルトの名無しさん:03/05/02 12:56
printf("%d" , i);

161 :デフォルトの名無しさん:03/05/02 13:15
#include <stdio.h>
#define NUMBER 5
void one(int i, int vc[])
{
while(i < 2) {
int temp = vc[i];
vc[i] = vc[4 -i];
vc[4 -i] = temp;
i++;
} }
int main(void)
{
int i;
int vc[5];
i = 0;
puts("5個の整数を入力してください。");
while (i < 5 ){
printf("%2d番目:", i + 1); scanf("%d", &vc[i]);
i++;
}
puts("逆に並べると");
one(i, vc );
i = 0;
while (i < 5)
printf("%d", i);
printf("%d\n", vc[i]);
i++;
puts("となります。");
return(0);
}
こんどは、5番目まで入力したら、その後ずっと止まらなくなってしまいました

162 :デフォルトの名無しさん:03/05/02 13:18
>>161

最後のwhileの中括弧が抜けてるよ
これだとprintf("%d",i);が無限にw

163 :デフォルトの名無しさん:03/05/02 13:30
t99j017@opbb076[ 19 ] kadai4-2
5個の整数を入力してください。
1番目:1
2番目:2
3番目:3
4番目:4
5番目:5
逆に並べると
01
12
23
34
45


手取り足取りで申し訳ないが今度はこんな風になってしまった。
この課題が終わったら少しまじめに取り組もうと思うのでこれだけはお願いします。

164 :デフォルトの名無しさん:03/05/02 13:40
すんませんできました。
本当にありがとうございました
またくるかもしれませんがよろしくね

165 :デフォルトの名無しさん:03/05/02 13:42
アカウント名t99j017か

166 :デフォルトの名無しさん:03/05/02 13:43
>逆に並べると
全然逆じゃないんだがいいのか?

167 :デフォルトの名無しさん:03/05/02 14:21
99年度入学のj科17番さん?

168 :デフォルトの名無しさん:03/05/02 14:37
>>167
大阪工大?

169 :デフォルトの名無しさん:03/05/02 18:27
>>167
留年 or 院 ってことかな ?

170 :デフォルトの名無しさん:03/05/02 18:52
藻前らみっともない

171 :デフォルトの名無しさん:03/05/02 20:13
俺も身元探りレスしようとしたけど、皆でそんな事したら、
来れなくなっちゃうよ・・・

172 :172:03/05/02 21:23
生年月日を和暦で"S57/6/5"という書式で標準入力したとき、
西暦に変換し"1982年06月05日"という書式で標準出力する
プログラムを作成しなさい。ただし、生年月日は明治元年
以降に対応すること。

どのような条件式をつくればいいのでしょうか?
if elseで可能ですよね?

173 :デフォルトの名無しさん:03/05/02 21:26
?format$("S57/6/5","yyyy年mm月dd日")
1982年06月05日

174 :デフォルトの名無しさん:03/05/02 21:28
#include <stdio.h>
int main()
{
char c;
int year;
int month;
int day;

scanf("%c%d/%d/%d",&c,&year,&month,&day);
/* 元号を西暦に変換する処理は後回し */
printf("%d年%02月%02日\n",year,month,day);

return 0;
}


175 :デフォルトの名無しさん:03/05/02 21:30
で、その変換処理だが・・・まあswitchを使うだろう。
何年から何年が明治で何年から大正とか知らないんだよな・・・

176 :172:03/05/02 21:39
>>175
1868年から明治、1912年から大正、
1926年から昭和、1989年から平成です

177 :デフォルトの名無しさん:03/05/02 21:39
>>174
不正な入力で落ちまくり(w

178 :デフォルトの名無しさん:03/05/02 21:40
平成1年1月1日は存在しないけどな。

179 :デフォルトの名無しさん:03/05/02 21:40
>>177
気にするな(w
宿題じゃなきゃこんなコードかかん

180 :デフォルトの名無しさん:03/05/02 21:41
>>178
そもそも平成1年が存在しない(よね?)

181 :デフォルトの名無しさん:03/05/02 21:46
>>180
Excelでオートフィルかけたらこんなんなったが?
昭和64年1月6日
昭和64年1月7日
平成1年1月8日
平成1年1月9日

182 :デフォルトの名無しさん:03/05/02 21:46
>>181
それはエクセルがおかしい。
平成元年ならあるが平成1年はない

183 :デフォルトの名無しさん:03/05/02 21:49
今は元年が1年の別名だってことを知らない奴がいるのか。

184 :デフォルトの名無しさん:03/05/02 21:50
別名ねぇ・・・平成1年なんて言ったら恥書くと思うけど。
その時に別名だからいいんだと言い張るのかい?

185 :デフォルトの名無しさん:03/05/02 21:54
本題に戻そう

>>176
あり得ない日付を入力したらエラー処理をしろとか言われた?

186 :172:03/05/02 22:04
>>185
月別に日にちの制限を設ける必要はないと思います。ただ13月、
32日はさすがにエラー処理しないといけないでしょう

187 :デフォルトの名無しさん:03/05/02 22:07
>>184
恥書くわけ無いでしょ。
普通に使われてるよ。
むしろあんたが恥。

188 :デフォルトの名無しさん:03/05/02 22:08
オレの脳内ではできた。とりあえずスカラー波で送っとく。
白い服は着てないよね?

189 :デフォルトの名無しさん:03/05/02 22:08
ttp://www.google.co.jp/search?q=%22%95%BD%90%AC1%94N%22+site%3Ago.jp
ttp://www.google.co.jp/search?q=%22%95%BD%90%AC%8C%B3%94N%22+site%3Ago.jp

190 :デフォルトの名無しさん:03/05/02 22:11
>>189
うん。普通に使われてるね。

191 :デフォルトの名無しさん:03/05/02 22:13
この件数の差で普通か・・・
件数で計れるものではないかもしれないけど

192 :デフォルトの名無しさん:03/05/02 22:17
NENGOU,NENSUU
平成,1
平成,2
平成,3
#というわけで、数字しかはいらないんだから、無茶を言うな。

193 :デフォルトの名無しさん:03/05/02 22:17
普通じゃん。
1年という言い方が間違っているならそうとう減るはずだからね。
特にgo.jpなら。でもこの差はgo.jp以外でも一緒だし。



いいかい。1年という言い方は正しいんだよ。

194 :デフォルトの名無しさん:03/05/02 22:18
>>192
変数の中身は1でも、表示を元年にすることはできますね。

195 :172:03/05/02 22:19
僕の課題は1年でOKですよ

196 :デフォルトの名無しさん:03/05/02 22:22
明治='M'
大正='T'
昭和='S'
平成='H'
でいいの?

197 :デフォルトの名無しさん:03/05/02 22:23
Masa='M'
Tyuu='T'
Settu='S'
Highschool='H'


198 :デフォルトの名無しさん:03/05/02 22:25
if(year==1)printf("元年");
else printf("%d年",year);
これをつけるかつけないかだけだろ?

199 :194:03/05/02 22:28
あー、そういえば元年と表示することはないな。
表示は西暦だから。


200 :デフォルトの名無しさん:03/05/02 22:36
>>1999
西暦元年

201 :デフォルトの名無しさん:03/05/02 22:56
>>191
普通かどうかは別にしても、>>180=>>182=>>184 が主張するほどではないことは明白だわな。
>>184 は、何をもって恥を掻くと言ってんだろう ?
普通に考えたら、そこまで言っといて「恥を書く」と書くほうがよほど恥ずかしいと思うが。

202 :デフォルトの名無しさん:03/05/02 22:57
>>199
でも、入力は「元年」にも対応しなくちゃね。

203 :デフォルトの名無しさん:03/05/02 23:05
市役所に出した書類で「平成元年」と書いたら「1年」に修正されますた

204 :デフォルトの名無しさん:03/05/02 23:19
お役所ですから(-_-;) y-。oO○


205 :デフォルトの名無しさん:03/05/03 01:58
C言語の基礎を覚えた程度の私に、何か問題をいただけませんか?
C++ではありません。

【開発環境】
Visual Studio.NET(Not 2003)
OSはXP Home
エディタはK2Editerを使用してます。
どなたか、問題を出していただけませんか?

206 :デフォルトの名無しさん:03/05/03 02:12
>>205
1から任意数までの素数を全部表示するプログラムとか?

207 :205:03/05/03 02:16
>>206
それは既にやったんですよ。任意の数字を変数に入れ、
それをfor文、if文でちょいっと…。
わがままで申し訳ありませんが、もう少しレベルの高いものって
ありませんか?
よろしくお願いします。

208 :デフォルトの名無しさん:03/05/03 02:21
>>207
MSDN ライブラリを調べて API 使ってみたら?
プログラミングの幅が広くなって面白いよ。
試しに、あるディレクトリにある全てのファイルを表示させてみるとか。

209 :デフォルトの名無しさん:03/05/03 02:28
>>205
int expand(double x, int base, char str, char *len)
0 ≦ x < 1 を base 進法で表した小数部を最大 len 文字で str に書き込む。
書き込んだ文字数を返す。

210 :デフォルトの名無しさん:03/05/03 02:28
>>209
誤 int expand(double x, int base, char str, char *len)
正 int expand(double x, int base, char *str, char len)


211 :デフォルトの名無しさん:03/05/03 02:29
>>210
もちつけ俺
誤 int expand(double x, int base, char str, char *len)
正 int expand(double x, int base, char *str, int len)


212 :デフォルトの名無しさん:03/05/03 03:32
>>205
多倍長演算の実装やって、円周率を下1000桁ぐらいまで求めるとか

213 :デフォルトの名無しさん:03/05/03 04:27
>>205
アルゴリズムイントロダクションを買ってきて、
最初から順に実装していく。

214 :デフォルトの名無しさん:03/05/03 07:43
>>200
明治以降に西暦元年はないわな。
それに西暦では1年なんでは・・・

215 :デフォルトの名無しさん:03/05/03 08:04
#include <stdio.h>
char *me;
static void die(char *msg){fprintf(stderr, "%s: %s", me, msg); exit(1);}
int main(int argc, char **argv)
{
  char c;
  char s[BUFSIZ];
  int y,m,d;
  me = argv[0];
  if (fgets(s, BUFSIZ, stdin) == NULL) die("couldn't read input\n");
  if (sscanf(s, "%c%d/%d/%d",&c,&y,&m,&d) != 4) die("invalid format\n");
  switch(c) {
    case 'H': y += 1988; break;
    case 'S': y += 1925; break;
    case 'T': y += 1911; break;
    case 'M': y += 1867; break;    
    default: die("unknown first letter\n");
  }
  printf("%d年%02d月%02d日\n", y,m,d);
  return 0;
}


216 :デフォルトの名無しさん:03/05/03 08:25
>>215
exitを使うときはstdlib.hをインクルードせよ。

217 :デフォルトの名無しさん:03/05/03 08:35
visualC++.netインストールしようとしたら
「ファイルが見つかりません」ってでるんですが
どうしたらインストールできますか?」

218 :デフォルトの名無しさん:03/05/03 08:36
>>217
インストールしろという宿題なのか?
マイクロソフトに聞けよ。

219 :205:03/05/03 08:37
みなさんアドバイスありがとうございます。
>>208
初心者本を読破した程度でAPIが理解できるものなのでしょうか?
まぁせっかくVisual Studio.NETがあるので、見てみたいと思います。

>>209
ああ・・・全然理解できん・・・

>>212
面白そうですね。
多倍長演算は名前だけ聞いたことがあるのですが、実際に使ったことはありませんし、
すごく面白そうです。

>>213
そろそろアルゴリズム云々を勉強しようとしてたので、やってみたいですね。
実際に力もつきそううですし。

みなさん、こんな初心者に丁寧にアドバイス本当にありがとうございました。

220 :デフォルトの名無しさん:03/05/03 08:44
>>219
http://www.linux.or.jp/JM/
http://www.bohyoh.com/CandCPP/C/Library/index.html

ここでCの標準関数を調べて、自分で書いてみるってのはどう?
とりあえずはシステム依存の知識がいらないstr系関数から。

221 :デフォルトの名無しさん:03/05/03 08:52
平成元年はほぼ1年あったからそれでいいとして、
昭和元年は確か半月もなかったと思うのだが
1926年=昭和元年でいいのか?
うちの甥っ子が昭和64年1月2日生まれだから気になるのかもしれんが。

222 :デフォルトの名無しさん:03/05/03 08:55
昭和64年なんて数日
その時に作られた貴重な硬貨があるYO

223 :デフォルトの名無しさん:03/05/03 15:18
漏れ、昭和65年の硬貨もってたよ

224 :sage:03/05/03 16:17
int main(void){
 const int TARGETVALUE=100;
 const int HALFTARGETVALUE=TARGETVALUE/2+1;
 const int UNPRIMENUM=3;
 int i;
 int j;
 bool blnPrimeFlg[TARGETVALUE];
 for(i=0;i<TARGETVALUE;i++){
  blnPrimeFlg[i]=false;
 }
 for(i=UNPRIMENUM;i<TARGETVALUE;i+=2){
  blnPrimeFlg[i]=true;
 }
 blnPrimeFlg[2]=true;
 for(i=UNPRIMENUM;i<HALFTARGETVALUE;i+=2){
  j=i*(i-1);
  while(blnPrimeFlg[i]){
   j+=i;
   if(j<TARGETVALUE){
    blnPrimeFlg[j]=false;
   }
   else{
    break;
   }
  }
 }
 for(i=0;i<TARGETVALUE;i++){
  if(blnPrimeFlg[i]){
   cout<<i<<"\n";
  }
 }
}

225 :sage:03/05/03 16:17
すみません224です。送信ミスしました(つдT)
あらためて。
1>>様、その他の先生の皆様。Cをはじめて半年の未熟者です。ご意見をいただ
きたいのですが、おながいします。
目的の値までの素数を表示させるプログラムについて課題がでておりまして、
以下のようなコード書いたのですが、問題なく素数は表示される状態です。
ただし、可能であればもう少しスマートに進めたいのですが、なにか改善可能
な場所、方法はありませんでしょうか。よろしくおながいします。



226 :デフォルトの名無しさん:03/05/03 16:54
for(i=UNPRIMENUM;i*i<TARGETVALUE;i+=2){
if (blnPrimeFlg[i])
for(j=i*i; j < TARGETVALUE; j+=i)
blnPrimeFlg[j]=false;
}


227 :デフォルトの名無しさん:03/05/03 17:02
int prime;//任意の数
int tmp;
(省略)
for(tmp=2; tmp<prime/2; tmp++)
{
   if(tmp == prime) printf("素数\n");
   if else((prime%tmp) == 0) printf("素数ではありません\n")
}

かなり略したけどこんなのじゃだめ?
列挙したいならこれ全体をforで囲むとか

228 :デフォルトの名無しさん:03/05/03 17:09
エラトステネスのふるい

229 :デフォルトの名無しさん:03/05/03 17:12
226様>>
感動しました!
実際、コードみると納得なんですが、そこまで思いつくのが難しいんですよね。。
どうもありがとうございました。すごくためになりました。また何か在りましたら、
よろしくお願いします。

227様>>
即レスありがとうございます。
今回はmodしようせずに(授業中にmodでおこなうような様誘導があったため。)
あえて進めてみようと思っておりました。ただ、mod使用の際にはかなり、行数を短く
提出できるタイプみたいなので、ありがたく頂戴させていただきます。
どうもありがとうございました。


230 :デフォルトの名無しさん:03/05/03 17:24
225です。
228様>>
"エラトステネスのふるい”こういったアルゴリズムが存在してたんですね。
勉強不足でした。。。。
ありがとうございました。

231 :デフォルトの名無しさん:03/05/03 17:44
int main(void){
const int TARGETVALUE=100;
const int UNPRIMENUM=3;
int i;
int j;
bool blnPrimeFlg[TARGETVALUE];
for(i=UNPRIMENUM;i<TARGETVALUE;i+=2){
blnPrimeFlg[i]=true;
}
cout<<2<<"\n";
for(i=UNPRIMENUM;i*i<TARGETVALUE;i+=2){
if (blnPrimeFlg[i]){
for(j=i*i; j < TARGETVALUE; j+=2*i)
blnPrimeFlg[j]=false;
cout<<i<<"\n";
}
}
for(;i<TARGETVALUE;i+=2){
if (blnPrimeFlg[i])
cout<<i<<"\n";
}
}

232 :デフォルトの名無しさん:03/05/03 17:45
>>230
>>106

233 :デフォルトの名無しさん:03/05/03 17:50
宣伝かよ・・・

234 :230:03/05/03 20:51
たびたび申し訳ございません。230です。
231様>>
ありがとうございます。最終的にそのような形で固まりました。
232様>>
さっそくチェキしてみます。ただ、先に答えがあると、考える前にみそうな感じがして怖いです。丸写しになりそうで・・・精神力弱いんです(つдT)

前回、226様よりお教えいただいた方法で実行すると、100に含まれる素数を判断するために、条件分岐がfor(i=UNPRIMENUM;i*i<TARGETVALUE;i+=2)のなかで8回、for(j=i*i; j < TARGETVALUE; j+=i)のなかで54回となるのですが、さらにこれを少なくする事は可能でしょうか。
私てきにはこれで限界と思えるため、この状態で提出を考えておりますが、可能であればコードでなくても、結構です。可能とだけお教え願えないでしょうか。
大変お手数おかけしますが、どうぞよろしくお願いします。



235 :デフォルトの名無しさん:03/05/03 21:12
素数 "列挙" アルゴリズムを極めるスレ
http://pc2.2ch.net/test/read.cgi/tech/1018657457/

236 :デフォルトの名無しさん:03/05/04 00:55
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>

void filter(int limit, char *filename);
int isprime(int *discoverd_prime, int chknum, int dis_num);

/* mainがやるのは、引数チェックのみ。 */
void main(int argc, char *argv[]){
int limit;//この数までの素数を調べる。
char filename[10];//ファイル名

/* 上限数とファイル名の設定。 */
if(argc == 1){//引数無し
limit = 1000;
strcpy(filename,"nanashi.txt");
}else if(argc > 2 && (isdigit(*argv[1])) ){//第1引数が数字で、ファイル名の指定あり
limit = atoi(argv[1]);
strcpy(filename,argv[2]);
}else if(argc >= 2 && (!isdigit(*argv[1])) ){//第1引数が数字でない
limit = 1000;
strcpy(filename,argv[1]);
}else if(argc >= 2 && (isdigit(*argv[1])) ){//第1引数が数字で、ファイル名の指定無し
limit = atoi(argv[1]);
strcpy(filename,"nanashi.txt");
}
if (limit >= 131071){limit = 131071;}//一応の上限
filter(limit,filename);
}


237 :デフォルトの名無しさん:03/05/04 00:56
void filter(int limit, char *filename){
FILE *fp;
int num;
int p,i;//ループ処理などに使う汎用変数。
int m;//現在までに発見した素数の個数
int a = limit/2+1; // 素数の最大個数。
int prime[65536]; //素数を格納する配列。とりあえずこんだけ確保しとく。
if((fp = fopen(filename,"w")) == NULL){ //ファイルを作る。
fprintf(stderr,"ファイルが作れませんでした。");
}
printf("%d までの素数を計算し、ファイル名 %s で保存します。\n",limit,filename);

/* 作業開始 */

for(p=0; p < a ; p++){//prime配列の初期化
prime[p]=1;
}
p = 0;
prime[p] = 2;p++; m=1;//偶数はチェックしないので、あらかじめ2を検出したことにしておく。


238 :デフォルトの名無しさん:03/05/04 00:56
/* 篩の本体 */

for(num = 3; num <= limit ;num += 2){//偶数はチェックするだけ時間の無駄だ。
if((isprime(prime,num,m))== 0 ){
prime[p] = num; m++; printf("%d ",prime[p]);p++;
}
}
for(p = 0; p< m ;p++){
fprintf(fp," %d",prime[p]);
}
printf("\n以上の素数を保存しました。\n作業が終了しました。\n");
fclose(fp);
}

/* 与えられた数が素数か調べる。 */
int isprime(int *discoverd_prime, int chknum, int dis_num){
int p;
for(p=0; p<dis_num; p++){

if(chknum % *discoverd_prime != 0){
discoverd_prime++;
continue;
}else{
return 1;
}
}
return 0;
}

239 :239:03/05/04 15:00
int data[4]={1,-2,3,-4};という配列があるとき、いかの値はいくつになるか答えなさい
i=2のとき、data[i++] data[++i]
変数aからjがint型としたとき、下記の式において演算の順序はどうなるか答えなさい。また、a=0b=1c=2…j=9を初期値とするときこの式の実行結果はどうなるか答えなさい。
a = b = c == d && e | |f < g % h / i + j ;
よろしくお願いします。


240 :デフォルトの名無しさん:03/05/04 15:03
>>239
なぜ実行して確かめない?

241 :デフォルトの名無しさん:03/05/04 15:04
>>239
死んだ方が良いな。

242 :デフォルトの名無しさん:03/05/04 15:05
>>239
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=C%E8%A8%80%E8%AA%9E+%E6%BC%94%E7%AE%97%E5%AD%90+%E5%84%AA%E5%85%88%E9%A0%86%E4%BD%8D

243 :デフォルトの名無しさん:03/05/04 15:06
演算子の優先順位なんてこと細かく覚えていられるか。
心配なら括弧を付ける。

244 :デフォルトの名無しさん:03/05/04 15:21
>>243
それに関しては激しく同意だが、悲しいけどこれって宿題なのよね。

245 :デフォルトの名無しさん:03/05/04 17:44
a = b = (((c == d) && e) | |(f < ((g % h / i) + j))) ;
こうじゃないかな。

246 :デフォルトの名無しさん:03/05/04 18:04
文法違反なんだけどね

247 :デフォルトの名無しさん:03/05/04 18:23
>>246
えっ、どこが ?

248 :デフォルトの名無しさん:03/05/04 18:28
思いっきり初心者の質問だけど

a = b = c
って何?

249 :デフォルトの名無しさん:03/05/04 18:33
b=c;
a=b;

250 :デフォルトの名無しさん:03/05/04 18:35
>>247
| |

251 :デフォルトの名無しさん:03/05/04 18:36
>>248
a, b, c が全て等しい時に真になる新しい比較演算子。

252 :デフォルトの名無しさん:03/05/04 18:39
>>250
ああ、なるほど。了解した。
しかし、よく気付いたな、コンパイルしてみたのか ?

253 :デフォルトの名無しさん:03/05/04 18:41
>>252
等幅のフォントならひと目で分かるんだが

254 :デフォルトの名無しさん:03/05/04 18:45
>249
thx

255 :デフォルトの名無しさん:03/05/04 18:57
>>239
data[i++] = 3
data[++i] = -4 (ただし上式を行った後なら変な値を返す)

まず (左結合)
 g % h / i (6 % 7 / 8 = 0) ・・・(1)
次に
 (1) + i (0 + 9 = 9) ・・・(2)
でもって
 f < (2) (5 < 9 = 1) ・・・(3)
さらに
 d && e (3 && 4 = 1) ・・・(4)
これから
 (4) || (3) (1 || 1) ・・・(5) *この時orの左側が真なので右は評価されない
最後に (右結合)
a = b = (5) (b = 1, a = b)

ってか演算子の優先順位ぐらいは知ってるだろ


 

256 :デフォルトの名無しさん:03/05/04 19:02
嘘付いた

c == d が抜けてら

さらに
 c == d (2 == 3 = 0) ・・・(4)
となると
 (4) && e (0 && 4 = 0) ・・・(5) *この時andの左側が偽なので右は評価されない
これから
 (5) || (3) (0 || 1 = 1) ・・・(6)
最後に (右結合)
a = b = (5) (b = 1, a = b)

257 :デフォルトの名無しさん:03/05/04 20:30
>>239
http://www-ccs.ucsd.edu/c/express.html#Preincrement
http://www-ccs.ucsd.edu/c/express.html#Postincrement
http://www-ccs.ucsd.edu/c/express.html#precedence
http://www-ccs.ucsd.edu/c/express.html#Logical%20AND
http://www-ccs.ucsd.edu/c/express.html#Logical%20OR

258 :デフォルトの名無しさん:03/05/04 20:46
後置インクリメントはPostincrementというのか

259 :デフォルトの名無しさん:03/05/05 13:34
9.2 12.3
8.3 9.0
8.8 10.3
・・・

上のような1行にスペース区切りで、複数行にデータが入っている
ファイルから、データを分割してそれぞれの
総和をもとめたいんですが
どうすればいいですか?

PerlでいうところのSplit関数ってないんですが?

260 :デフォルトの名無しさん:03/05/05 13:45
あるよ。strtok
正規表現みたいな頭のいいことは出来ないが。

261 :デフォルトの名無しさん:03/05/05 13:49
fstream s("hoge.txt");
vector<double> values;

while(s){
double sum=0;
for(int i=0; i<2; i++){
ddouble val=0;
s>>val; sum+=val;
}
values.push_back(sum);
}

でけた!! 駄目だこりゃ!

262 :デフォルトの名無しさん:03/05/05 13:52
include<stdio.h>
main()
{
FILE* file;
int ret;
double f=0,s=0;
if( (file=fopen("data.txt","r")) == NULL )
return 0;
do{
s+=f;
ret = fscanf(file,"%ld",&f);
}while(ret != EOF);
printf("%ld",s);
fclose(f);
return 0;
}
改行とか入れてなけりゃこれでできるとおもうが

263 :デフォルトの名無しさん:03/05/05 14:01
各行ごとに総和だすのか?

264 :デフォルトの名無しさん:03/05/05 14:07
STRTOK
バグ
これらの関数は絶対に使用しないこと。もし使用する場合は、以下のことに注意すること。

これらの関数はその最初の引数を変更する。
これらの関数は const な文字列では使えない。

終端文字はすべて \0 になってしまう。

strtok() 関数はパーズに静的バッファを用いるので、スレッドセーフでない。もしこれが問題になる場合は strtok_r() を用いること。

265 :デフォルトの名無しさん:03/05/05 14:15
例えば1クラス20人の生徒の身長と体重の
それぞれの総和を求めたいのです。


266 :デフォルトの名無しさん:03/05/05 14:39
#include <iostream>
#include <fstream>
#include <vector>
#include <numeric>
using namespace std;
int main()
{
  vector<double> m, kg;
  ifstream s("hoge.txt");
  while(s)
  {
    double val;
    s >> val;
    m.push_back(val);
    s >> val;
    kg.push_back(val);
  }
  m.pop_back();
  kg.pop_back();
  cout << "身長の和は" << accumulate(m.begin(), m.end(), 0.0) << endl;
  cout << "体重の和は" << accumulate(kg.begin(), kg.end(), 0.0) << endl;
  return 0;
}

267 :デフォルトの名無しさん:03/05/05 14:44
#include <stdio.h>
main()
{
 FILE *fp;
 double height, weight, h_sum = 0, w_sum = 0;
 char buf[256];
 
 if ((fp = fopen("filename.txt", "r")) == NULL) {
  printf("ERROR\n"); exit(1);
 }

 while (fgets(buf) != NULL) {
  sscanf("%lf%lf", &height, &weight);
  h_sum += height;
  w_sum += weight;
 }
}


268 :267訂正:03/05/05 14:48
#include <stdio.h>
main()
{
 FILE *fp;
 double height, weight, h_sum = 0, w_sum = 0;
 char buf[256];
 
 if ((fp = fopen("filename.txt", "r")) == NULL) {
  printf("ERROR\n"); exit(1);
 }

 while (fgets(buf, 255, fp) != NULL) {
  sscanf(buf, "%lf%lf", &height, &weight);
  h_sum += height;
  w_sum += weight;
 }
}

269 :デフォルトの名無しさん:03/05/05 15:48


270 :デフォルトの名無しさん:03/05/05 16:59
>>259
C の勉強/宿題なの ?
実務で使う & Perl がわかるなら、Perl でやったほうがいいんじゃないのか ?

271 :デフォルトの名無しさん:03/05/05 17:00
>>259
C++なら準標準ライブラリboostのregex.hppの中にsplitと同じ事が出来る
メソッドがあります。

272 :デフォルトの名無しさん:03/05/05 17:44
regexはDLLをビルドしなきゃいけないからちょっとめんどくさいですよね

273 :デフォルトの名無しさん:03/05/05 20:48
リスト構造なんですけど,最初に入れたリストを表示したいのですが
一番最後に入れたリストが表示されてしまいます(FIFOというやつでしょうか)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct list {
char *name;
char *tele;
struct list *nextlist;
};

>>274

274 :デフォルトの名無しさん:03/05/05 20:49
>>273

main()
{
struct list *a, *b;
char *n,*t;
int fig = 0;
b = NULL;

while(1) {
printf("名前キボンヌ。終了:e\n");
scanf("%s", n);
if(n[0] == 'e') break;
a = (struct list *)malloc(sizeof(struct list));
a->name = (char *)malloc(strlen(n)+1);
strcpy(a->name,n);
printf("電話キボンヌ。終了:e\n");
scanf("%s", t);
if(t[0] == 'e') {
fig = 1;
break;
}


275 :デフォルトの名無しさん:03/05/05 20:50
これだけでどうしろと(怒)

276 :デフォルトの名無しさん:03/05/05 20:50
>>274

a->tele = (char *)malloc(strlen(t)+1);
strcpy(a->tele,t);
a->nextlist = b;
b = a;
}
printf("名前 電話番号\n");
a = b;
while (1) {
if (a == NULL)
break;
printf("%s %s\n", a->name,a->tele);
a = a->nextlist;
}
}


277 :デフォルトの名無しさん:03/05/05 20:55
>>275
スマソ。ソースちょっと長くなった。

構造体は名前のポインタと電話番号のポインタの2つです。
scanfつかってデータを入力する。eで終了します。

278 :デフォルトの名無しさん:03/05/05 21:04
>>273
リストの最初を保持する変数がない。

a はmallocで確保した要素を保持している。
b はリストの最後を保持している。

表示はaを表示しているから、一番最後に確保した要素に
なるのは当たり前。

279 :278:03/05/05 21:10
解釈間違えた。
> a->nextlist = b;
> b = a;
これはLIFOのやり方だ。


280 :デフォルトの名無しさん:03/05/05 21:17
双方向じゃないのがつらいが・・・やってみるか

281 :デフォルトの名無しさん:03/05/05 21:20
>>273
278のいうことももっともだが
それ以前にどうしてsにmallocしないんだ。
確実にメモリー参照エラーっぽ。

282 :デフォルトの名無しさん:03/05/05 21:22
失礼。
char *n;
scanf("%s",n);
これまずいでしょ。

283 :デフォルトの名無しさん:03/05/05 21:30
ちゃんとコンパイルして実行してみた?
最後に入れた要素を表示する前に落ちると思うんだけど。

284 :デフォルトの名無しさん:03/05/05 21:38
>>283
それ以前に、最初の scanf() で落ちたよ。
(Win2KPro, VC++6, Debug Build)

まあ、>>282 が書いてる通り当たり前なわけだが。

285 :デフォルトの名無しさん:03/05/05 21:50
画像ってcで表示できますか?

286 :デフォルトの名無しさん:03/05/05 22:02
>>285
できる。

287 :デフォルトの名無しさん:03/05/05 22:13
ちょっと自分でなんとなくいい宿題を思いついたので。
初心者向けでスマソ。
1〜任意の数字までの階乗を表示するプログラム。

・・・15!ぐらいになるとCでは扱えない数字になっちゃうかも

288 :280:03/05/05 22:22
>>273
長いので2回に分ける。
どういうわけか構造体を次のようにあらかじめ
サイズきめとかないとエラー出るのでそこはかんべん。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<conio.h>

typedef struct{
char name[256];
char tel[256];
void* nextpoint;
}LIST;

void movenext(LIST** pplist)
{
LIST* sub;
sub = (LIST*)((*pplist)->nextpoint);
free(*pplist);
*pplist = sub;
}

main()
{
char n;
char name[256],tel[256];
LIST *lpbottom=0,*lptop=0,*sub=0;
lpbottom = lptop = (LIST*)malloc(sizeof(LIST));



289 :280:03/05/05 22:24
つつきでちゅ。やっぱり長いんで分けます。
while(1)
{
printf("------------------\n");
printf("どれよ?\n");
printf("1:入力\n");
printf("2:出力\n");
printf("other:終わり\n");
printf("------------------\n");
n = getch();
if(n == '1')
{
printf("名前キボン\n");
scanf("%s",lptop->name);
printf("電話番号キボン\n");
scanf("%s",lptop->tel);
lptop->nextpoint=malloc(sizeof(LIST));
lptop=(LIST*)lptop->nextpoint;
}


290 :280:03/05/05 22:25
これで最後。切れて長くて流してスマソ
else if(n=='2')
{
if(lpbottom==lptop)
break;
printf("名前 %s\n",lpbottom->name);
printf("電話番号 %s\n",lpbottom->tel);
movenext(&lpbottom);
}
else
break;
}
while(lpbottom != lptop)
movenext(&lpbottom);
free(lpbottom);
return 0;
}

291 :デフォルトの名無しさん:03/05/05 22:26
int main()
{
int n;
int64 ret = 1;
cin >> n;
for(int i=2; i<=n; i++)
  ret *= n;
cout << ret << endl;
return 0;
}

292 :デフォルトの名無しさん:03/05/05 22:28
int64 ってなに?
sizeof(long) = 4のときの
long long のこと?

293 :デフォルトの名無しさん:03/05/05 22:30
int64は64bitの整数型だけど、
sizeof(long) = 4のときの
long longのサイズって一意に決まってるの?

294 :デフォルトの名無しさん:03/05/05 22:31
>>288
> typedef struct{
> char name[256];
> char tel[256];
> void* nextpoint;
> }LIST;

name, tel を固定長で持つ是非は別にして、void* nextpoint ってなんだ ?
こんなこと書く奴を俺は信用しない。

295 :292:03/05/05 22:34
はぅあ
.NETだと long longでエラー出して
確認できねぇ・・・
誰か回答キボン

296 :288:03/05/05 22:37
LIST* nextpoint
とおいていいのかわからなかったんで
void* で妥協。

297 :273:03/05/05 22:37
>>280
ありがとうございます。
双方向リストもこれの応用と考えればいいんでしょうね。
今度は自力で頑張ってみまつ。

298 :288:03/05/05 22:40
void* がつかえない
Cコンパイラってないよね?
念のため
>>294

299 :デフォルトの名無しさん:03/05/05 22:44
>>272
スタティックリンクも出来ますよ。LIBをビルドする事になるけど。

300 :デフォルトの名無しさん:03/05/05 22:48
winsockまたはUNIX socketを使ってCまたはC++で
http://chart.yahoo.co.jp/t?c=2003&a=4&b=1&f=2003&d=4&e=30&g=d&s=6701.t&y=0&z=6701.t
を取得し終値の平均値を出しなさい。
難しすぎるか…

301 :デフォルトの名無しさん:03/05/05 22:52
>>291
わっちの使っているコンパイラにint64なかったんで
結果が正確ではないが次のようにしますた。
main()
{
int n;
double i,t=1;
scanf("%d",&n);
for(i=2;(int)i<n;i++)
t*=i;
printf("%ld",t);
return 0;
}


302 :デフォルトの名無しさん:03/05/05 22:55
>>300
かききれないような・・・

303 :301:03/05/05 22:56
失礼−
次のとこ訂正
×printf("%ld",t);
○printf("%lf",t);

304 :デフォルトの名無しさん:03/05/05 22:58
"winsockまたはUNIX socket"
これじゃ書ききれないな。wininetとboost使えれば書ききれるけど。

305 :デフォルトの名無しさん:03/05/05 23:02
#include<stdio.h>

int f();

main()
{printf("%d\n",f(3.14));}

int f(int a)
{return a*3.14*2;}

306 :305:03/05/05 23:03
かき忘れた
この結果がなぜ6になるのか教えてください

307 :デフォルトの名無しさん:03/05/05 23:04
>>305
18か19

308 :デフォルトの名無しさん:03/05/05 23:04
すれちがいになったし違うし

309 :デフォルトの名無しさん:03/05/05 23:07
18になったけど

310 :デフォルトの名無しさん:03/05/05 23:07
>>306
×int f();
○int f(int)
つーかエラーでコンパイルできないだろ多分

311 :デフォルトの名無しさん:03/05/05 23:11
>>305
int f()
int f(int a)
は引数が違うので別物と見られます。
使うときに引数によってどっちが使われるか決まります。
で、f(3.14)なので引数がある
int f(int a)が使われ。
3.14がintにキャストされ a=3状態に。
で、a*3.14*2で18.28に。
値返すときにやっぱりintにキャストされるので
18になるってこった。
切り上げの場合は19か。コンパイラによるだろうが。

312 :デフォルトの名無しさん:03/05/05 23:14
>>310
コンパイラによっちゃ
仮想関数ってことでOK。
だめなほうが少ないかしら?

313 :デフォルトの名無しさん:03/05/05 23:16
C++ならね。

Cなら、doubleの引き数を渡し、intの引き数を受け取ると言う事態が発生する。

314 :デフォルトの名無しさん:03/05/05 23:18
>>313
Cでも自動的にキャストしてくれないのでつか?
コンパイラによるのかな。

315 :デフォルトの名無しさん:03/05/05 23:24
>>311
> int f()
> int f(int a)
> は引数が違うので別物と見られます。

これはあってるけど...

> int f(int a)が使われ。

アホか。そういう状況 (=C++) なら、int f(int a) はまだ宣言されてないから、単にそんな関数は無いと怒られるだけのことだよ。

>>312
仮想関数 ? C++ の初歩からやり直すべし。

>>313
これが、正解。

>>314
キャストしようが無いだろ。
f(3.14) をコンパイルしている時点では、f(int) なのか f(double) なのかわからんのだから。

316 :デフォルトの名無しさん:03/05/05 23:26

次の式が成り立つとき、a+bがもっとも小さいときの
aとbを求めなさい。
a*b=2450448
こんな問題どうでしょ。宿題ってわけじゃないんですが。

317 :デフォルトの名無しさん:03/05/05 23:36
>>316
それ、C/C++の問題なのか?

318 :315:03/05/05 23:36
>>315
はて、VCなら通ったんだが・・・
VCが特殊なのかねぇ。
ところでポケコンのCコンパイラでやってみたところ
これだめでした
int f();
int f(int a)
{
return a*3.14*2;
}
fが再定義されてるとのことでだめでした。
たんにへっぽこコンパイラなのかもしれないけど。

319 :デフォルトの名無しさん:03/05/05 23:36
>>316
a+bが尤も小さくなるようにaとbを選べばいいんだな?
a=-1,b=-2450448でどうだ。

320 :デフォルトの名無しさん:03/05/05 23:37
>>315
VCはCコンパイラでもあるからな。

321 :316:03/05/05 23:38
>>319
ウマヒ!
でも自然数限定ってことで。

322 :デフォルトの名無しさん:03/05/05 23:39
>>319
いやいや、例えばa=-1e-100,b=-2450448e100の方が小さくなるぞ。
ということで、解が得られないじゃぁないか。>>316

323 :デフォルトの名無しさん:03/05/05 23:40
|a+b|って書けば良かったのにね

324 :318:03/05/05 23:40
スマン名前間違えた。
311です。

325 :デフォルトの名無しさん:03/05/05 23:41
>>323
|a| + |b|だろ

326 :デフォルトの名無しさん:03/05/05 23:42
>>325
(゚Д゚)ハァ?

327 :316:03/05/05 23:43
いいたいことは325だったんだが
323も間違えでもないような・・・

328 :デフォルトの名無しさん:03/05/05 23:45
a+b=整数 だから
aの符号=bの符号
よって
|a|+|b| = |a+b|
ってことでよい?

329 :328:03/05/05 23:46
しつれい。a+b=正の整数

330 :デフォルトの名無しさん:03/05/05 23:47
>>327
> いいたいことは325だったんだが
> 323も間違えでもないような・・・

はぁ ?

>>321
> でも自然数限定ってことで。
>>325
|a| + |b|だろ

全然違うじゃねーか。

331 :327:03/05/05 23:59
>>330
両方符号が同じなら正でも負でもよくなっちまいますな
スマソ
計算手法はあまりかわらんと思ったもんで
別にいいかなと。


332 :316:03/05/06 00:08
最終的にはこうしました。
ともかく整数aとbが次の関係を持つとき、|a+b|がもっとも小さくなる時の
aとbの絶対値を求めよ。
a×b=2450448
ややこしくてすみません。言うまでもないがCかC++で書いてけれ。
ところでさっきつっこまれたんですがここは
文法に関する問題のみでつか?

333 :デフォルトの名無しさん:03/05/06 00:09
妥当にプログラムくんでやってみたが
a=1547 b=1584で合計3131が最小らしい。
かなり適当に作ったからウソかも?w

334 :デフォルトの名無しさん:03/05/06 00:13
#include <stdio.h>
int main(void){
int a, b, x;
for (x = 2; x < 10000000; x++)
for (a = 1, b = x - a; a <= b; a++, b--)
if (a * b == 2450448) {
printf("%d %d\n", a, b);
return 0;
}
return 0;
}

335 :デフォルトの名無しさん:03/05/06 00:16
>>334
コンパイルしたら>>333と同じ結果が出た

336 :デフォルトの名無しさん:03/05/06 00:19
俺は頭悪いからこうやったけど

#include <stdio.h>
#define NUM 2450448
int main(void)
{
int a,b,ma,mb,min=NUM;
for(a=1;a<NUM/2;a++) {
if(NUM%a==0) {
b=NUM/a;
if(min>a+b) {
ma=a;
mb=b;
min=a+b;
}
}
}
printf("%d %d",ma,mb);
return 0;
}

337 :デフォルトの名無しさん:03/05/06 01:02
#include <stdio.h>
#include <math.h>
int main()
{
int const num = 2450448;
int a = floor( sqrt( (double)num ) );
for( ; a > 0 ; --a )
{
int const b = num / a;
if( a * b == num )
{
printf( "a = %d , b = %d\n" , a , b );
return 0;
}
}
return 1;
}


338 :デフォルトの名無しさん:03/05/06 01:07
なめてかかってたら
商の整数チェックわすれて違う答えが出た
…フカク

339 :デフォルトの名無しさん:03/05/06 02:04
#include <stdio.h>
#include <math.h>
#define NUM 2450448
int main(void){
int a = sqrt(NUM), b;
while (a * (b = NUM / a) != NUM) a--;
printf("%d %d %d", a, b, a + b);
}

340 :デフォルトの名無しさん:03/05/06 11:10
#include <stdio.h>
#include <math.h>
#define N 2450448
int main(void){int a=sqrt(N);while(a>1&&(N%a)!=0)--a;printf("%d %d",a,N/a);return 0;}

341 :デフォルトの名無しさん:03/05/06 11:51
while(N%a)--a;

342 :デフォルトの名無しさん:03/05/06 23:49
#include <stdio.h>
#include <math.h>
#define N 2450448
int main(void){int a=sqrt(N);while(N%a)--a;printf("%d %d",a,N/a);return 0;}

343 :デフォルトの名無しさん:03/05/07 00:43
このスレの>316はいいことしたな。
いい流れ。
こんな感じで誰か問題だしてくれぃ


344 :343:03/05/07 00:51
・・・と思ったけど、やっぱり他力本願はいけないので自分で探しました。
ピタゴラス数をどんどん出していくやつとか。
あとは、完全数を列挙していくものとか。

ピタゴラス数・・・各辺の長さが整数で表される直角三角形。3:4:5とか。
完全数・・・約数のうち、その数自身以外の物の和がその数になるもの。
例えば、6。これの約数は1,2,3,6。ここから自身の数、6以外の和を出す。
1+2+3 つまり6(自身の数)

こんなん面白そうなんで出してみました。
俺もちょっと考えてみまふ


345 :343:03/05/07 01:10
階乗列挙プログラムとか。

346 :デフォルトの名無しさん:03/05/07 01:22
なんか問題が欲しいって言うのならこれはどう。

n 路盤に次の条件を満たすように石をおくとき、
おくことのできる碁石の最大数を求めよ。
条件: どの4つの碁石も路に平行な辺を持つ長方形にならない。

なお、路とは碁盤に引かれた線のことで、
縦横に n 本の路がある碁盤を n 路盤と言う。
石は路と路の交点におく。条件を無視すれば n*n 個の石がおける。

347 :デフォルトの名無しさん:03/05/07 01:37
>>346
長方形以外ならいいのね

348 :デフォルトの名無しさん:03/05/07 01:40
>>347
yes
なお長方形とは4つの角が等しい四辺形なので正方形も長方形とみなす

349 :デフォルトの名無しさん:03/05/07 11:05
>>344
// 単純にどんどん出すけど全てを列挙しているわけではない
#define LIMIT (10000)
int main(void)
{
 for (int ic = 1; ic < LIMIT; ic++) {
  int num = 2 * ic * (ic + 1);
  printf("%d, %d, %d\n", 2 * ic + 1, num, num + 1);
 }
 return 0;
}


350 :デフォルトの名無しさん:03/05/07 15:10
#include <stdio.h>
int main(void)
{
int i;
i=0;
do{
printf("%d\n",i);
i++;
}while(この中身がわかりません);
return 0;
}
1から400まで+1づつ表示したいです
よろしくおながいします

351 :デフォルトの名無しさん:03/05/07 15:28
1回目のループで0が出力されるがいいのか?

352 :デフォルトの名無しさん:03/05/07 15:48
>>351
はい、よろしくおながいします

353 :デフォルトの名無しさん:03/05/07 15:49
はあ・・・

354 :デフォルトの名無しさん:03/05/07 15:51
次のプログラムの実行結果を調べよ

for(i=1;i<=10;i++){
for(j=1;j<=10;j++){
System.out.print("\n");
}
プログラムの出力を次のように修正せよ

● 出力の横幅を40に変更
● 出力の縦幅を20に変更


この問題の解答おながいします

355 :354:03/05/07 15:55
上の文ですが
for(i=1;i<=10;i++){
for(j=1;j<=10;j++){
System.out.print("*");
}
System.out.print("\n");
}
でした

356 :デフォルトの名無しさん:03/05/07 15:58
ネタが増えてきたな

357 :デフォルトの名無しさん:03/05/07 15:59
それはCの宿題なのかと小一時間(ry

358 :デフォルトの名無しさん:03/05/07 16:38
>>354
宿題以前の問題だよ。それくらいは自力で理解できないと、
ネタとマジの区別もつかなくなるぞ。

>>350
普通はforループを使うケースだな。
なんでdo-whileループなんだ?

>>345
多桁演算クラスを用意してくれたらすぐにでも書くぞ。w
#確か700!くらいで2000桁近く入ったような記憶がある。

359 :デフォルトの名無しさん:03/05/07 17:03
>>350
#include <stdio.h>
int main(void)
{
int i;
i=0;
do{
printf("%d\n",i);
i++;
}while(i < 400);
return 0;
}

360 :デフォルトの名無しさん:03/05/07 17:04
for(i=1;i<=20;i++){
for(j=1;j<=40;j++){
System.out.print("*");
}
System.out.print("\n");
}

361 :デフォルトの名無しさん:03/05/07 17:14
>>359
それだと0〜399だべ

362 :デフォルトの名無しさん:03/05/07 18:53
標準入力から文字列を最低でも5個以上
読み込んだものを戻り値とする関数を
reallocを使って作成せよ。

お願いします

363 :デフォルトの名無しさん:03/05/07 19:01
オレニマカセロ!

364 :デフォルトの名無しさん:03/05/07 19:03
>>362
 関数の終了条件が不十分。


365 :デフォルトの名無しさん:03/05/07 19:04
vector<string> readstringfromcin()
{
void *dummy = malloc(50);
vector<string> strs;

for(int i=0;i<5;i++)
{
std::string t;
cin >> t;
strs.push_back(t);
dummy = realloc(dummy, t.size());
}
free(dummy);
return strs;
}



366 :デフォルトの名無しさん:03/05/07 19:07
ダミーかよ

367 :デフォルトの名無しさん:03/05/07 19:08
>363
オマエニマカセタ!

368 :デフォルトの名無しさん:03/05/07 19:09
>>366
realloc使えというから使ってやったんだ。感謝しろ。

369 :デフォルトの名無しさん:03/05/07 19:09
#include <stdio.h>
void main(void)
{
int a,b,c,d,e,f,g;
printf("===============================================");
printf("いまから四則演算をする数値2つ入れなさい");
printf("===============================================");
printf("1つ目");
scanf("%d",&a);
printf("二つ目");
  scanf("%d",&b);
c=a + b;
d=a - b;
e=a * b;
f=a / b;
g=a % b;
printf("演算結果");
  printf("%d + %d=%d\n",a,b,c);
printf("%d - %d=%d\n",a,b,d);
printf("%d * %d=%d\n",a,b,e);
printf("%d / %d=%d\n",a,b,f);
printf("%d % %d=%d\n",a,b,g);
printf("\n");
printf("\n");
printf(" 以上\n");

なぜエラー11も?

370 :デフォルトの名無しさん:03/05/07 19:10
>>369
エラーの内容読めよ

371 :デフォルトの名無しさん:03/05/07 19:10
標準入力から文字列を最低でも5個以上
てのはどういう意味?文字列の区切りは改行?

返り値の型は char **でいいの?

372 :デフォルトの名無しさん:03/05/07 19:12
>369
まるちすんなっちゅーの

373 :デフォルトの名無しさん:03/05/07 19:16
改行くらいいれようぜ

374 :362:03/05/07 19:19
>>371
書いてなかったけど改行だと思う
問題があいまいな気が

375 :デフォルトの名無しさん:03/05/07 19:20
じゃあ5行なかったらどうするんだろう。

376 :デフォルトの名無しさん:03/05/07 19:21
つーか質問する時はCかC++か書けよ。
書かないから>>365みたいな教師をおちょくるような答えが出てくるんだよ。

377 :デフォルトの名無しさん:03/05/07 19:28
>>369
そんなに変数いらない

378 :362:03/05/07 19:28
>>376
すみません、Cでお願いします

379 :デフォルトの名無しさん:03/05/07 19:35
>>365
realloc()の使い方が×です

380 :うんこ:03/05/07 19:47
>369
「error C2018: 文字 '0x81' は認識できません。」
文字列リテラルとか文字定数とか以外で全角文字使うと、
こういうのが出てくる。全角文字を消せ。使うな。

これが出ると、続けて似たようなのがもう一つ出る。
「error C2018: 文字 '0x40' は認識できません。」
と。ちなみに、そのソースだと全角スペースが入ってる。
インデントはタブで付けるんだ

381 :デフォルトの名無しさん:03/05/07 19:54
>>380
やさしいヤツだなオマエ。
ヘルプも活用できないクソ野郎はほっとけばいーのに

382 :369:03/05/07 20:00
やさしい方々ありがとう。クラスで俺よりできない奴たくさん。
あっ、目くそ鼻くそですか。すいません

383 :デフォルトの名無しさん:03/05/07 20:05
専門学校?

384 :369:03/05/07 20:11
2chで質問する俺は出来る男だぜ

385 :369:03/05/07 20:15
384の言うとおりです(^^

386 :デフォルトの名無しさん :03/05/07 20:16
1から100までの乱数を1000個ふり、その中にどの数字が
何個あるのか数えなさいとの問題がでました。
入力ファイルは1000個の数字であり、出力ファイルは
2列で数字とその個数をかいたものとします。
よろしくおねがいします。

387 :369:03/05/07 20:18
工業高校

388 :デフォルトの名無しさん:03/05/07 20:19
入力の1000個の数字は何に使うんだ?
乱数の種か?

389 :デフォルトの名無しさん:03/05/07 20:24
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int result[100],i;
FILE *fp;
srand((unsigned int)time(NULL));
for(i=0;i<100;i++) result[i]=0;
for(i=0;i<1000;i++) result[rand()%100]++;
fp=fopen("out.txt","w+");
for(i=0;i<100;i++) if(result[i]!=0) fprintf(fp,"%d %d\n",i+1,result[i]);
fclose(fp);
return 0;
}
適当に書いたからコンパイル通るかわからん(藁

390 :デフォルトの名無しさん:03/05/07 20:26
>>386
int main()
{
std::ifstream if(in.txt);
 std::map<int, int> intmap;
 for(int i=0;i<1000;i++)
 {
  int val;
  if >> val;
  intmap[i]++;
  
 }
 
 std::ofstream of(out.txt);
 for(std::map<int, int>::iterator it=intmap.begin(); it!=intmap.end(); ++it)
 {
of << (*it).first << " " << (*it).second << std::endl;
 }
 return 0;
}

391 :デフォルトの名無しさん:03/05/07 20:28
高校生にもなって英語も読めなきゃ口の聞き方も知らないと。

反論する前に自分のミスのフォローをするべきだろ?

392 :390:03/05/07 20:28
×intmap[i]++;
○intmap[val]++;

393 :デフォルトの名無しさん:03/05/07 20:30
>>386
宿題丸投げですか…まあ、そーゆースレだが…
それくらいはやったほうが…

394 :デフォルトの名無しさん:03/05/07 20:31
>>390
×
std::ifstream if(in.txt);
std::ofstream of(out.txt);

std::ifstream if("in.txt");
std::ofstream of("out.txt");

395 :デフォルトの名無しさん:03/05/07 20:50
課題:
任意の省略型学籍番号(例:M02121)を文字型で入力し、
イニシャルから学科を判定し、学科名、入学年度(西暦下2桁分)及び学籍番号を次のように印刷せよ

学科名:Management
入学年度:’02年度
学籍番号:02175121

この問題で学科はChemistry,Electricity,Architecture,Design,Managementの五つあります。
学籍番号は省略型で読み込んだ02と121の間に17は各学科共通で
17の後に学科別にChemistryは1、Electricityは2となりManagementは5となり
この数字が入ります。
条件として省略学籍番号は文字型で読み込み、最後に正式学籍番号を単一の文字列として完成させる。

一応ここまではできたのですが、学籍番号を出すところがイマイチわかりません
ご教授お願い致します。Cです。
#include <stdio.h>
#define N 5
int main()
{
char a[80];
static char *name[]={"Chemistry","Electricity","Architecture","Design","Manegement"};
int i;
printf("省略学籍番号:");
scanf("%s",a);
for(i=0;i<N;i++){
if(name[i][0]==a[0])
printf("学科名:%s\n",name[i]);

}

396 :395:03/05/07 20:53
上の課題はポインタ配列の課題です。
ポインタの使い方がまだ良く分からないので
ご教授お願い致します

397 :デフォルトの名無しさん:03/05/07 20:54
省略学籍番号の意味がわからん。
02175121の省略形は
175なの?

398 :397:03/05/07 20:57
ああ分かった。

399 :デフォルトの名無しさん:03/05/07 21:00
>>396
×if(name[i][0]==a[0])
○if(!strcmp(name[i], a))
以上。

400 :デフォルトの名無しさん:03/05/07 21:01
printf("入学年度:’%c%c年度",a[1],a[2]);
printf("学籍番号:%c%c17%d%c%c%c",a[1],a[2],i,a[3],a[4],a[5]);
じゃだめ?

401 :395:03/05/07 21:02
省略学籍番号は各学科のイニシャルの頭文字と175を抜いた数字です。
学籍番号の内容的に
最初の02は入学年、17は各学科共通、次の数字が学科判別の数字で
Chemistryなら1、Managementなら5となります。ラストの3桁は生徒番号です。
M02121が省略学籍番号で、これを入力すると
学科名:Management
入学年度:’02年度
学籍番号:02175121
と結果がでます。
説明が下手で申し訳ないです

402 :デフォルトの名無しさん:03/05/07 21:04
>>399
いや、どっちでも動くし。

403 :395:03/05/07 21:04
<<400
入学年度に関してはそれでいいといってましたが
学籍番号でそれはダメだ。といってました。
他の方法ないでしょうか?

404 :デフォルトの名無しさん:03/05/07 21:05
>>399
違うでしょ

405 :デフォルトの名無しさん:03/05/07 21:14
> 条件として省略学籍番号は文字型で読み込み、最後に正式学籍番号を単一の文字列として完成させる。
がわからん。
1文字ずつ読む条件ならscanf("%s",a)はおかしいし。

406 :デフォルトの名無しさん:03/05/07 21:15
>>395
>>400は無難だと思うけど何で駄目なんだ?

407 :デフォルトの名無しさん:03/05/07 21:17
あ、判った。
char str[9];
sprintf(str, "%c%c17%d%c%c%c",a[1],a[2],i,a[3],a[4],a[5]);
printf("学籍番号:%s",str);
ってことか?

408 :デフォルトの名無しさん:03/05/07 21:18
それでいいのかよ

409 :395:03/05/07 21:19
>>405
ただ文字型で出せってことだと思うんですが、
>>406
それだと簡単にできるからとの理由でダメなんです。

410 :デフォルトの名無しさん:03/05/07 21:20
>>400の方法なら

if (a[0] == name[i][0]) {
printf("学科名:%s\n", name[i]);
i++;
continue;
}

にしないとな

411 :デフォルトの名無しさん:03/05/07 21:20
ようするに[a-z]*printf使用禁止ってことかな

412 :デフォルトの名無しさん:03/05/07 21:20
#define N 5
for(i=0;i<N;i++){
よりも、
#define numberof(x) (sizeof(x)/sizeof(*(x)))
for (i = 0; i < numberof(names); i++) {
とするべきだが、それを言い出すとscanf()も使うべきではない。


413 :デフォルトの名無しさん:03/05/07 21:21
>>410
飛ばしちゃうのかよ!!!

414 :デフォルトの名無しさん:03/05/07 21:22
>>411
それでどうやって数値を文字に返るの?
itoaは機種依存だよ。

415 :デフォルトの名無しさん:03/05/07 21:22
複雑な文字列を生成するのにsprintf()以上にまともな手段はない。
一文字ずつコピーしたりstrcpy()やstrcat()を駆使するコードを書いたら馬鹿だ。

416 :デフォルトの名無しさん:03/05/07 21:25

char number[80], bak;

a++;
bak = a[2];
strcpy(number, a);
strcat(number, "17");
a += 2;
a[0] = bak;
strcat(number, a);
printf("学籍番号:%s",number);

417 :410:03/05/07 21:26
あぁ
s/continue/break/
だな


418 :416:03/05/07 21:26
馬鹿だぜ

419 :395:03/05/07 21:38
>>416
これでいけますか?

420 :デフォルトの名無しさん:03/05/07 21:39
じゃあこれでどうよ。
memmove(a+5,a+3,3);
memmove(a,a+1,2);
a[2]='1';a[3]='7';a[4]='0'+i+1;
printf("学籍番号:%s",a);

421 :デフォルトの名無しさん:03/05/07 21:41
あ、a[8]=0も要るな

422 :395:03/05/07 21:53
'memmove' : 定義されていない識別子です。
というエラーがでてきました。
どうすればいいんでしょうか?

423 :デフォルトの名無しさん:03/05/07 21:59
すまんかった。忘れてくれ。

424 :395:03/05/07 22:24
ポインタ使ってできそうなんですがどう思いますか?

425 :デフォルトの名無しさん:03/05/07 22:25
>>424
>>416でポインタの移動してますが…

426 :デフォルトの名無しさん:03/05/07 22:35
char r[9],t[9];
int num,r_num;
num = atoi(a+1);
r_num = num/1000*1000000+num%1000+170000+i*1000;
memset(r,0x30,8);
r[8]='\0';
itoa(r_num, t, 10);
if(r_num < 10000000) {
memcpy(r+1,t,7);
} else {
memcpy(r,t,8);
}
printf("学籍番号:%s",r);

memory.hとstdlib.hをinclude

427 :デフォルトの名無しさん:03/05/07 22:38
>>426
itoaは機種依存ですよ。

428 :395:03/05/07 22:40
このようにやってみました。エラーが下の2つ出てきました、どう修正すればいいでしょうか?

'++' には左辺値が必要です。
'+=' : 左のオペランドが、左辺値になっていません。

プログラム
#include <stdio.h>
#include <string.h>
#define N 5
int main()
{
char a[80],number[80], bak;
static char *name[]={"Chemistry","Electricity","Architecture","Design","Manegement"};
int i;
printf("省略学籍番号:");
scanf("%s",a);
for(i=0;i<N;i++){
if(name[i][0]==a[0])
printf("学 科 名:%s\n",name[i]);
}
printf("入学年度:'%c%c年度\n",a[1],a[2]);
a++;
bak = a[2];
strcpy(number, a);
strcat(number, "17");
a+=2;
a[0] = bak;
strcat(number, a);
printf("学籍番号:%s",number);

return 0;
}

429 :デフォルトの名無しさん:03/05/07 22:45
>>428
a++の前の行でで
char *b = a;
とやってbで処理する。

430 :デフォルトの名無しさん:03/05/07 22:46
a++とかa+=2の意味は?

431 :デフォルトの名無しさん:03/05/07 22:46
>>428
配列とポインタは別物です

432 :395:03/05/07 22:56
自分の作ってたプログラムに>>416にあるプログラムを組み込んだんです。
今ポインタとか配列とか理解しきれてないのでなかなかうまいことできないんです。
>>426にあるプログラムを組み込んで実行したところ学科別の番号が識別されてませんでした。
難しいですね・・。


433 :デフォルトの名無しさん:03/05/07 22:59
for(i=0;i<N&&name[i][0]!=a[0];i++) ;
printf("学 科 名:%s\n",name[i]);
printf("入学年度:'%c%c年度\n",a[1],a[2]);
printf("学籍番号:%c%c17%1d%s\n",a[1], a[2], i, a+3);

434 :395:03/05/07 23:03
>>433
printf("学籍番号:%s",number);
のように文字列で出さないといけないと言われました。
%1dの時点でやり直して来いと言われると思います。


435 :デフォルトの名無しさん:03/05/07 23:05
>>432
そのまま組み込みたいなら、char a[80];
ってのを
char *a;

a = (char*)malloc(80);
にして、最後にfree(a);をするようにすると通るかと。

436 :デフォルトの名無しさん:03/05/07 23:05
sprintf(number, "%c%c17%1d%s",a[1], a[2], i, a+3);

437 :デフォルトの名無しさん:03/05/07 23:08
>>435

char temp_buf[80];
char *a=temp_buf;

こっちの方がよいと思う。

438 :デフォルトの名無しさん:03/05/07 23:08
sprintf(number, "%c%c17%1d%s",*(a+1), *(a+2), i, a+3);

439 :デフォルトの名無しさん:03/05/07 23:11
char *s=a, *t=number;
*t++ = *s++;
*t++ = *s++;
*t++ = '1';
*t++ = '7';
*t++ = '0'+i;
while (*t++ = *s++) ;

440 :デフォルトの名無しさん:03/05/07 23:13
これで動いたけど

#include <stdio.h>
#include <string.h>

#define N 5
int main()
{
char a[80];
static char *name[]={"Chemistry","Electricity","Architecture","Design","Manegement"};
int i;
printf("省略学籍番号:");
scanf("%s",a);
for(i=0;i<N;i++){
if(name[i][0]==a[0]){
printf("学科名:%s\n",name[i]);
printf("入学年度:'%c%c年度\n",a[1],a[2]);
memmove(a+5,a+3,3);
memmove(a,a+1,2);
a[2]='1';a[3]='7';a[4]='0'+i+1;a[8]=0;
printf("学籍番号:%s",a);
}
}
}

441 :395:03/05/07 23:40
皆さんどうもありがとうございました!
無事完成させることができました!
Cの知識があまりないので
memmove(a+5,a+3,3); と
memmove(a,a+1,2);
はプログラム上どういうことを行っているのか教えていただきたいのです。
memmove(a,a+1,2);はどういうこと?と聞かれると答えられないので
ぜひご教授お願い致します。

442 :デフォルトの名無しさん:03/05/07 23:43
manとかしないの?

443 :デフォルトの名無しさん:03/05/07 23:47
a+3から3バイトをa+5に移動
a+1から2バイトをaに移動



444 :395:03/05/07 23:51
>>443
なるほど!分かりました!ありがとうございました!
皆さん本当にありがとうございました

445 :デフォルトの名無しさん:03/05/08 00:04
問題文にちと謎があるかもしれんが・・・。

1.1を読んだら「グー」、2を読んだら「チョキ」、3を読んだら「パー」と表示せよ。
 (多分岐処理、switch文、case文、break文、default文 がキーワード)

2.10人分の英語と数学の点数を2次元配列に入れ、それぞれの平均を求めよ。
 各点数は2次元配列に初期値として格納する。

3.入力した数字が配列中にあるかどうか調べ、見つかれば○、見つからなければ×を
 表示せよ。検索は0を入力するまで続ける。配列中の数値は初期値として設定。
 キーワードはbreak

446 :デフォルトの名無しさん:03/05/08 00:08
>>445
1,

#include <string>
#include <iostream>

void main()
{
int i;
std::string out;
std::cin >> i;
switch(i)
{
case 1:
out = "グー";
break;
case 2:
out = "チョキ";
break;
case 3:
out = "パー";
break;
std::cout << out << endl;
}
}

447 :デフォルトの名無しさん:03/05/08 00:08
最後の三行は

std::cout << out << endl;
}
}

じゃなくて
}
std::cout << out << endl;
}

448 :デフォルトの名無しさん:03/05/08 00:09
2.10人分の点数をファイルから読むか自分でつくるのか分からないので回答不能

449 :デフォルトの名無しさん:03/05/08 00:15
3.

#include <iostream>
#include <algorithm>

void main()
{
 int values[] = { 7, 41, 552, 61, 889, 1024, 26 };
 int in;
 for(;;)
 {
  std::cin >> in;

  std::cout << std::find(values, values + 7, in) == (values + 7) ? "×" : "○" << endl;
  if(!in)
   break;
 }
}

450 :デフォルトの名無しさん:03/05/08 00:16
endlはエラーが出るならstd::endlに置き換えて。

451 :445:03/05/08 00:17
>>448
スマソ、自分で入力するっぽい。

452 :デフォルトの名無しさん:03/05/08 00:22
>>451
コマンドラインから入力するの?それともソースの中に書いちゃっていいの?

453 :445:03/05/08 00:23
コマンドラインからみたい

454 :デフォルトの名無しさん:03/05/08 00:31
よく見たら,各点数は2次元配列に初期値として格納する。とか書いてあるけど
本当にコマンドラインからなの?
まあいいや、

2
#include <iostream>
#include <numeric>

using namespace std;
void main()
{
 int in[2][10];
 for(int i=0;i<10;i++)
 {
  cout << i << "人目の英語の点数入れてね" << endl;
  cin >> in[0][i];
  cout << i << "人目の数学の点数入れてね" << endl;
  cin >> in[1][i];
 }
 cout << "英語の平均点は" << accumulate(in[0], in[0] + 10, 0.0) / 10 << "点" << endl;
 cout << "数学の平均点は" << accumulate(in[1], in[1] + 10, 0.0) / 10 << "点" << endl;
}

あと言い忘れてたのを2つ。
これらのソースはC++
全角スペースはタブに置き換えろ

455 :デフォルトの名無しさん:03/05/08 00:35
もしコンパイラに`main' must return `int'とか怒られたら
void main()を
int main()に置き換えて
最後にreturn 0;で0返してあげてね。

456 :デフォルトの名無しさん:03/05/08 00:36
×cout << i << "人目の○○の点数入れてね" << endl;
○cout << i+1 << "人目の○○の点数入れてね" << endl;


457 :445:03/05/08 00:37
なるほど
親切かつ迅速にありがとう

458 :デフォルトの名無しさん:03/05/08 00:42
3.
#include <iostream>
#include <algorithm>
int main()
{
 int values[] = { 7, 41, 552, 61, 889, 1024, 26 };
 int* const values_begin = &values[0];
 int* const values_end = &values[ sizeof( values ) / sizeof( values[0] ) ];
 std::sort( values_begin , values_end );
 for( int in ; ( std::cin >> in ) && ( in != 0 ) ; )
  std::cout << ( std::binary_search( values_begin , values_end , in ) ? "○" : "×" ) << std::endl;
 return 0;
}


459 :デフォルトの名無しさん:03/05/08 01:19
いきなりすみません。
課題なのですがVC++を使って、
サーバーからファイルをDLするプログラムを教えてください。
アドレスを入力してそのファイルをDLする感じのプログラム
なのですが、よくわかりません;;よろしくお願いします。


460 :デフォルトの名無しさん:03/05/08 01:25
何使えって言われたの?
wininet? winsock?

461 :デフォルトの名無しさん:03/05/08 01:29
wchar_tを使った場合半角と全角が混在してても問題無いの?
wchar_t *wc = "ち0こ";
wc[1] = 'ん';
wc[2] = 'げ';

ちんげになるの?'

462 :デフォルトの名無しさん:03/05/08 01:29
誤爆した…

463 :デフォルトの名無しさん:03/05/08 01:37
>>459
プロトコルは?
おまいはどこまで作った?

464 :デフォルトの名無しさん:03/05/08 01:49
#include <windows.h>
#include <wininet.h>
#include <string>
#include <iostream>
#pragma comment(lib, "wininet.lib")
int main()
{
 std::string url;
 std::cout << "『えっとね、URLを入力してほしいの』" << std::endl;
 std::cin >> url;
 HINTERNET hSession = InternetOpen( "Mio", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0 );
 if(hSession){
  HINTERNET hService = InternetOpenUrl( hSession, url.c_str(), NULL, 0, 0, 0 );
  if(hService)
  {
   for(;;)
   {
    char buf[1025];
    DWORD readbyte = 1024;
    InternetReadFile( hService, buf, 1024, &readbyte );
    if( readbyte == 0 ) break;
    buf[readbyte] = 0;
    std::cout << buf << std::endl;
   }
  }
  InternetCloseHandle(hService);
 }
 InternetCloseHandle(hSession);
 return 0;
}

465 :デフォルトの名無しさん:03/05/08 02:37
点(a,b)が三角形(x1,y1)(x2,y2)(x3,y3)の内部にあるか判定するルーチンキボン

466 :デフォルトの名無しさん:03/05/08 03:14
c1 = (y1-y2)*(a-x2)-(x1-x2)*(b-y2)
c2 = (y2-y3)*(a-x3)-(x2-x3)*(b-y3)
c3 = (y3-y1)*(a-x1)-(x3-x1)*(b-y1)
((c1<0)&&(c2<0)&&(c3<0)) || ((c1>0)&&(c2>0)&&(c3>0))

467 :459:03/05/08 05:29
レスありがとうございます。
>>460
特に指定はありませんでした。

>>463
プロトコルはhttpかと思います。
僕はDLしてくれる命令がわからなくてgetstoreってのが
そうじゃないかとか探してる最中でした。;;

>>464
ありがとうございます。
えっと、実行してみました。そして
DL先のアドレスはどこになるのでしょうか?

468 :459:03/05/08 05:37
連続でカキコすみません。

>>464
すみません、表示されました。^^;
わけがわからないこといってすみません。
ありがとうございました!
もう少しまじめにCの勉強をして見ます。
ホントにありがとうございました。

469 :デフォルトの名無しさん:03/05/08 11:11
int main(void)
{

char str[] = "abcde";
char *ptr = str;

以上のような変数宣言をしたときの
・ポインタ変数のアドレス
・ポインタ変数に格納されている値
・ポインタ変数が参照する配列変数の先頭アドレス
・ポインタ変数の参照先データ

をそれぞれポインタ変数を用いてポインタの位置を文字数分まで
1つずつ進めながら16進数で確認するプログラムを作成せという問題がでました。

これからまじめに講義聞きますので、教えてください。先生・・・許してね。






470 :bloom:03/05/08 11:13
http://homepage.mac.com/ayaya16/

471 :デフォルトの名無しさん:03/05/08 11:31
何を16進数で確認するんだ?

472 :デフォルトの名無しさん:03/05/08 11:32
>>471
書いてあるやろ

473 :デフォルトの名無しさん:03/05/08 11:37
あげ足を取るならむしろ、
> 確認するプログラム
こっちを。
さて、どういう処理をすれば「確認」した事になるかというと

474 :デフォルトの名無しさん:03/05/08 11:48
ポインタ変数に格納されてる値ってなんぞや?

475 :デフォルトの名無しさん:03/05/08 11:52
>>469
 あんたもアホだが問題もアホだ。
 ポインタ変数をptrだと考えると
#include<stdio.h>
int main(void)
{
char str[] = "abcde";
char *ptr = str;
int i;

printf( "ptrのアドレス=%p(インクリメント無意味)\n", &ptr );
printf( "ptr参照する配列変数の先頭アドレス=%p(インクリメント無意味)\n", ptr );
for( i = 0; i < 5; i++ )
{
printf( "ptrに格納されている値=%p\n", ptr );
printf( "ptrの参照先データ=%x\n", (int)*ptr );
ptr++;
}
return( 0 );
}


476 :デフォルトの名無しさん:03/05/08 11:57
>>475
だよな…
配列の先頭アドレスがインクリメントするごとに変わるのかと思って自分を疑った

477 :デフォルトの名無しさん:03/05/08 11:58
>>475
変わらないのを確かめろ、って意味なんじゃない?

478 :デフォルトの名無しさん:03/05/08 13:47
宿題じゃないけど、助けてください。

5.438,6.546
3.846,5.478
5.154,5.433
6.516,3.937
....
....

こういう座標のデータが入っているファイルが100個くらいあるんですが、
7x7の空間を0.1ずつに区切って、その区切った升目に、点がいくつあるか
を求めたいんです。

70x70の2次元配列を作って、何とかすればいいのかな、とは思うんですが
プログラム作ったことがないので、まったくどうしていいのかわかりません。

どなたか、助けてください、おねがいします。

479 :デフォルトの名無しさん:03/05/08 13:55
g < x < g + 0.1
とかでカウントしてけばいいんでないか

480 :デフォルトの名無しさん:03/05/08 13:57
>をそれぞれポインタ変数を用いてポインタの位置を文字数分まで

これだとやっぱり、「ポインタ変数のアドレス」と
「ポインタ変数が参照する配列変数の先頭アドレス」も
インクリメントしながら確認せにゃいかんのじゃない?

もっとも前者は「変わらん」でいいとして、
後者をどうやれというのか俺には理解できんけど。

やっぱり問題作成者がポインタを理解してないか、日本語を理解してないかのどっちかだな。

481 :デフォルトの名無しさん:03/05/08 13:59
後者
&str[0]

482 :デフォルトの名無しさん:03/05/08 14:00
>>478
丸投げしたいならファイルの内容を晒すこと
自分でやりたいならわからない部分をはっきりさせること

483 :デフォルトの名無しさん:03/05/08 14:01
>>478
プログラムを組みたい!というのが目的でなければ
エクセル等表計算ソフトを使ったほうが速い

484 :デフォルトの名無しさん:03/05/08 14:07
>>480
例示されてるコードにはポインタ変数は一つしかないし
「ポインタの位置を文字数分まで1つずつ進めながら」だから、
配列変数の先頭アドレスをどうこうしなかy、と読むのはおかしい

485 :478:03/05/08 14:11
>479

そうなんですけど、それを「どうやってCで書くか?」
が、わからないんですわ。
ほんとに初心者ですみませんが、よろしくお願いします。


486 :デフォルトの名無しさん:03/05/08 14:18
>>485
#include <string>
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int main()
{
 int point[70][70] = {0};
 ifstream ifs("in.txt");
 while(ifs)
 {
  double x, y;
  ifs >> x;
  ifs.get();
  ifs >> y;
  point[int(floor(x*10))][int(floor(y*10))]++;
 }
 for(int i=0;i<70;i++)
 {
  for(int j=0;j<70;j++)
  {
   if(point[i][j])
    cout << 0.1*i << "-" << 0.1*(i+1) << "," << 0.1*j << "-"
     << 0.1*(j+1) << "=" << point[i][j] << endl;
  }
 }
}

487 :デフォルトの名無しさん:03/05/08 14:19
>>486
おまえ嫌なヤツだな

488 :デフォルトの名無しさん:03/05/08 14:44
宿題じゃないんですけど、友人からVBのカウントダウンのプログラムで相談されました。
それはできたんですけど、これをCでやるとどうなりますか?
・秒数を入力。Enterでカウントダウン開始
・0になったらビープ音が鳴り、TimeOverと表示


489 :478:03/05/08 14:46
>486
>487

ありがとうございます。
gccではコンパイルできませんでしたが、g++でコンパイルできました。
実際は360*900に分けないといけなかったので、
これで何とかなりそうです。
ほんとに助かりました、ありがとうございました。

>483
ファイルサイズが結構でかいのと、処理するファイルがたくさんだったので、
excellではちょっと大変そうだなあ。と思いまして。
awkを少し使えるので、試しに作ってみたんですけど、うまくいかなかったのと、
遅かったので、こちらに泣きついてしまいました。
レスをくれた皆様、ありがとうございました。



490 :デフォルトの名無しさん:03/05/08 14:48
>>488
それは実際のカウントダウンなのか?
それとも秒数関係なく数字だけを表示してビープ音を鳴らすのかね

491 :デフォルトの名無しさん:03/05/08 14:57
>>488
#include <windows.h>
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
 int sec;
 cin >> sec;
 DWORD endtime = GetTickCount() + sec*1000;
 int tick;
 while((tick = endtime - GetTickCount()) > 0)
 {
  if(tick / 1000 < sec)
  {
   cout << sec << endl;
   sec--;
  }
  else
   Sleep(1);
 }
 Beep(4000, 1000);
 cout << "TimeOver" << endl;
 
}

492 :デフォルトの名無しさん:03/05/08 15:01
この2つの行逆だわ。

Beep(4000, 1000);
cout << "TimeOver" << endl;

493 :デフォルトの名無しさん:03/05/08 15:03
GetTickCount()はclock使ってもいいんだけど、
どうせBeepはAnsi C++にないからGetTickCount使っちゃいました

494 :478:03/05/08 15:20
たびたびすみません。

486さんのプログラムを使ってみたところ、
最後の行を一回多くカウントしているようなんですが、これはどういうことなのでしょうか?

せっかくなので、勉強のために、どうしてそうなるのかを教えていただけたら幸いです。
よろしくお願いします。

495 :デフォルトの名無しさん:03/05/08 15:24
>>494
5
4
3
2
1
1
TimeOut
となるって事ですか?

496 :デフォルトの名無しさん:03/05/08 15:29
>>494
意味がよく分からないのだけどこうしろって事?
#include <windows.h>
#include <string>
#include <iostream>
#include <time.h>
#include <math.h>
using namespace std;
int main()
{
 int sec;
 cin >> sec;
 DWORD endtime = GetTickCount() + sec--*1000;
 int tick;
 while((tick = endtime - GetTickCount()) > 0)
 {
  if(tick < sec * 1000)
   cout << sec-- << endl;
  else
   Sleep(1);
 }
 cout << "TimeOver" << endl;
 Beep(4000, 1000);
}

497 :デフォルトの名無しさん:03/05/08 15:42
>>493
'\a' 使えよ

498 :デフォルトの名無しさん:03/05/08 15:49
>>497
すっかり忘れてました。

499 :478:03/05/08 15:49
>495,496

ええと、「カウントダウン」のプログラムではなくって、
その前の「座標」のプログラム。のほうです。

>>486さんのプログラムを使うと、
in.txtにある座標のデータの、最後の行を2回カウントしてしまうんですよ。

たとえば、in.txtの中身が
3.846,5.478
5.154,5.433
6.516,3.937
だとすると、

3.8-3.9,5.4-5.5=1
5.1-5.2,5.4-5.5=1
6.5-6.6,3.9-4=2

という結果が出力されてしまうんです。
よろしくお願いします。


500 :デフォルトの名無しさん:03/05/08 16:17
>>499
#include <string>
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int main()
{
 int point[70][70] = {0};
 ifstream ifs("in.txt");
 while(ifs)
 {
  
  double x, y;
  ifs >> x;
  ifs.get();
  ifs >> y;
  if(ifs.fail())
continue;
  point[int(floor(x*10))][int(floor(y*10))]++;
 }
 
 for(int i=0;i<70;i++)
 {
  for(int j=0;j<70;j++)
  {
   if(point[i][j])
    cout << 0.1*i << "-" << 0.1*(i+1) << "," << 0.1*j << "-"
     << 0.1*(j+1) << "=" << point[i][j] << endl;
  }
 }
}

501 :478、499:03/05/08 16:27
>500

ありがとうございます。うまくいきました。
ソース見てもちんぷんかんぷんですが、
どんなことをしているのか、勉強してみます。


502 :デフォルトの名無しさん:03/05/08 17:20
S=x/1!+xの2乗/2!+xの3乗/3!+・・・・・・xのn乗/n!
を解くプログラムがわかりません。教えてください

503 :デフォルトの名無しさん:03/05/08 17:22
俺、別スレで答えたんだが・・・。

504 :343:03/05/08 17:29
簡易ですがピタゴラス数を出すプログラムを書いてみました。
#include <stdio.h>
int main()
{
   int a,b,c;
   for(a=2; a<10000; a++)
   {
      for(b=2; b<10000; b++)
      {
         for(c=1; c<10000; c++)
         {
            if(a*a==(b*b)+(c*c))
            {
            printf("%d:%d:%d\n",a,b,c);
            }
         }
       }
   }
return 0;
}
まだ色々改善しなくちゃだめだけどもっともっと簡単にできたりできませんか?

505 :デフォルトの名無しさん:03/05/08 17:30
>>504
別の変数を使ってやる方法があったとおもうよ。
u+vとu*vから求めるとかいうの。

506 :343:03/05/08 17:37
>>505
え・・・?どういうことでしょうか?
スマソですが、教えていただけませんか?

507 :デフォルトの名無しさん:03/05/08 17:42
>>505
aを長辺に固定してるからb<a,c<a
またc<=bとしても一般性は失われない。

ってのでループの条件を修正

508 :デフォルトの名無しさん:03/05/08 17:46
>>503
いろんなパターンのプラグラムが知りたいんですけど....

509 :デフォルトの名無しさん:03/05/08 17:51
ただのマクロリン展開じゃん

510 :デフォルトの名無しさん:03/05/08 17:53
(u^2-v^2, 2u*v, u^2+v^2)

511 :デフォルトの名無しさん:03/05/08 18:20
色んなパターンのプラグラムが知りたいなら検索くらいしろ

512 :デフォルトの名無しさん:03/05/08 18:46
日本ロジテム(みずほの融資先)の子会社せいも素(みずほの融資先)
で過労による自殺者が出た。
http://www.samos.co.jp
http://society.2ch.net/test/read.cgi/traf/1046749189/l50
http://tmp.2ch.net/test/read.cgi/company/1046775680/l50 
              ,.-、
           /.n l  /⌒ヽ
             | l l | ,' /7 ,'
        , '' ` ー ' '-' /
       /  、_,       `ヽ  
         l   , .-. 、`´    l
         ヽ  ヽ ̄フ     / また死んだ〜〜〜!
        丶、 ̄____,/
         /  ,. - 、  )
      (( ( n ([N],ハ_う
         ゝ)ノ  ̄   ヽ     
            /   _   l ))  
            〈__ノ´   `(_ノ

513 :名無し@沢村:03/05/08 20:20
おれは就職してから1ヶ月目に絶対に会社をやめないという誓約書を書かされたよ。
会社をやめたら膨大な違約金を取られてしまうんだよ。
また自宅にあるPCも会社に没収されてしまったよ。尾行をつけられたり、電話も盗聴されているんだよ!
会社はおれが他の会社に移ったり自宅でこっそりプログラムをつくったりすることをとても怖れているよ。
困ったもんだね…

514 :デフォルトの名無しさん:03/05/08 20:29
catでテキストの中身を出力し、パイプライン処理で
標準出力及びファイルに出力するプログラムをシステムコールを
使って作成したいのですが・・・例えば
cat foo.txt | ./a.out
というコマンドを入力とすると、foo.txtの中身が標準出力に出力され、
さらにファイルhoge.txtに格納されるという感じです。
コンパイルはできたのですが、実行するとどうしても
”/0=/dzy#”という変な文字しか出力されません。
どこがおかしいのでしょうか?よろしくお願いします。

#define SIZE 100

int main(void){
int n;
int fd;
char buf[SIZE];

creat("hoge.txt",0644);
fd = open("hoge.txt",1);

while(n = read(0, buf, sizeof buf) > 0){
write(1, buf, n);
write(fd, buf, n);
}
close(fd);
return 0;
}

515 :デフォルトの名無しさん:03/05/08 20:47
>>514
n初期化しなさいよ。

516 :デフォルトの名無しさん:03/05/08 20:47
> creat("hoge.txt",0644);
> fd = open("hoge.txt",1);
ここがおかしい

517 :デフォルトの名無しさん:03/05/08 20:52
> int n;
size_t n;

518 :デフォルトの名無しさん:03/05/08 21:22
というか
while(n = read(0,bufm sizeof(buf) > 0) なんてやったら
nには1か0かしか入らない気がするが?

519 :デフォルトの名無しさん:03/05/08 21:23
それ以前になぜ低レベルIO?

520 :514:03/05/08 21:37
御回答ありがとうございます。
>>516の部分、fd = creat("test2.txt",0644);に直してみました。
他で指摘いただいた部分も直しましたがやはり全く同じ結果になります。
本当にわからないです・・・

521 :デフォルトの名無しさん:03/05/08 21:42
whileの中もちゃんとなおしたかい?

522 :デフォルトの名無しさん:03/05/08 21:43
バグだらけだな

523 :デフォルトの名無しさん:03/05/08 21:44
環境を書きなさい。
シェルがパイプエラー出してないかい?

524 :デフォルトの名無しさん:03/05/08 21:46
>>520

>while(n = read(0, buf, sizeof buf) > 0){

while((n = read(0, buf, sizeof buf)) > 0){
にしたか?


525 :デフォルトの名無しさん:03/05/08 21:47
whileの中の人も大変だな。

526 :デフォルトの名無しさん:03/05/08 21:53
>>525
いや、コンパイラの中の人の方が。

527 :デフォルトの名無しさん:03/05/08 21:53
まあな

528 :デフォルトの名無しさん:03/05/08 21:58
素直に tee を使ったほうが百万倍も楽チンなのに。

529 :514:03/05/08 21:59
>>521-524
できました、どうもありがとうございます。

>>523
すみません、UNIXの場合どう環境を説明すれば良いか
分かりませんがとりあえずパイプエラーは出てなかったです。

530 :369:03/05/08 22:11
>>391
スマソ。気をつけます。

531 :デフォルトの名無しさん:03/05/09 05:58
ファイルの属性を表示させてUNIXの ls -l コマンドと同様の機能を
実現したいのですが、関数などの使い方がよく分からず
ls_l()の中身をどのようにすればよいか苦戦しております。
どうか指南いただけないでしょうか。以下は滅茶苦茶ですが途中まで書いたやつです。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>

int main(int argc, char *argv[]){

if( argc != 2 ){
fprintf(stderr,"Usage: %s filename \n",argv[0]);
exit(0);
}

ls_l(argv[1]);

}

532 :デフォルトの名無しさん:03/05/09 05:58
ls_l(char *path){

struct stat buf;
if(lstat(const path, &buf) == -1)
{
perror(path);
exit(1);
}

printf("%d",readlink(path));
printf("%s",getpwuid((int)path));
/*printf("%s",getgrgip(buf.st_gid));*/
/*printf("%d",buf.st_size);*/
printf("%s",ctime(&buf.st_ctime));
printf("%s\n",path);
}

533 :デフォルトの名無しさん:03/05/09 06:49
>>531
manを引きながらBSDとかGNUのソースを見ればいいのでは?

534 :デフォルトの名無しさん:03/05/09 07:52
っつーか、車輪を再開発する理由が判らん。
system("ls -l dir");
するとか、
popen("ls -l dir", "r");
すれば事足りるんでないの?

どうしてもってことならUnixならソースがあるんだから>>533の言うとおり。

535 :531:03/05/09 09:01
すみません、探してみます。

536 :デフォルトの名無しさん:03/05/09 18:32
VC6でやってる初心者です。
テンプレートとフレンド関数の問題なんですが、

friend void C2< T1 >::F3( C1< T1 > &);

が入るときの各クラスを求めよというものです。

Cx : クラス Tx : 型パラメータ Fx : 関数 で
xはクラスごとに異なります


#include <iostream.h>

template <typename T3>
class C3{
public:
void F3(C3< T3 > &a){;}
};

template <typename T2>
class C2 : public C3< T2 >{
};

template <typename T1>
class C1{
friend void C2< T1 >::F3(C1< T1 > &);
};

だと F3(C1< T1 > &) が F3(C3< T1 > &) じゃないとダメだし…
ホントわけ分からなくなりました。よろしくお願いします。

537 :デフォルトの名無しさん:03/05/09 18:38
どなたか助けてください。問題はコレです。。。
入力した文字列から指定した文字を検索するプログラムを作れ。
ただしポインタ変数を用いよ!

要は、こんな感じで実行結果が出ればいいようですが・・・。
文字列を入力してください:abcabc
検索文字を入力してください:b

文字列"abcabcに"b"は
2番目 5番目
にあります.

文字列を入力してください:abcde
検索文字を入力してください:z

そんな文字は入っていません

時間がなくて困ってます。お願いしますtt

538 :デフォルトの名無しさん:03/05/09 18:41
>>531
man stat

539 :デフォルトの名無しさん:03/05/09 19:10
>>537
#include <stdio.h>

int main()
{
char s[100];
char ch;
printf("文字列を入力してください:");
gets(s);
printf("検索文字を入力してください:");
ch = getchar();


540 :539:03/05/09 19:11
もう7時すぎてるよ。
途中だけど帰る。

541 :デフォルトの名無しさん:03/05/09 19:16
#include <stdio.h>

char *mystrchr(char *p, int ch)
{
while (*p) {
if (*p == ch) {
return p;
}
++p;
}
return NULL;
}



542 :デフォルトの名無しさん:03/05/09 19:16
int main()
{
char buf[256];
char ch;
char *p;
int offset;

printf("文字列を入力してください:");
scanf("%256s", buf);
printf("検索文字を入力してください:");
scanf(" %c", &ch);
if ((p = mystrchr(buf, ch)) != NULL) {
printf("文字列\"%s\"に\"%c\"は\n", buf, ch);
while (p != NULL) {
offset = p - buf + 1;
printf("%d番目 ", offset);
p = mystrchr(p + 1, ch);
}
printf("\nにあります.\n");
}
else {
printf("そんな文字は入っていません\n");
}
return 0;
}



543 :デフォルトの名無しさん:03/05/09 19:21
キーボードの右を押すとカーソルが右に移動するにはどうしたらいいの?
教えてください。。

544 :デフォルトの名無しさん:03/05/09 19:23
>>543
C FAQ読み直して来い


545 :デフォルトの名無しさん:03/05/09 19:26
C FAQってなんでしょうか?

546 :デフォルトの名無しさん:03/05/09 19:28
google に聞け


547 :デフォルトの名無しさん:03/05/09 19:29
char=1byteとは限らない(へりくつ)なので、わざわざ別にチェック用の変数を用意しました。

#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE (1024)
#define TRUE (0)
#define FALSE (!TRUE)

int main(){
char buffer[BUFSIZE]; // for fgets&sscanf

char strSearchData[BUFSIZE];
char chrQuery;
char *pSearch;

int iCheck[BUFSIZE];
int iCount;
int i;

// init
for(i=0;i<BUFSIZE;i++){
iCheck[i]=FALSE;
}
iCount=0;

548 :デフォルトの名無しさん:03/05/09 19:30

// input
printf("文字列を入力してください:");
fgets(buffer,BUFSIZE,stdin);
sscanf(buffer,"%s",strSearchData);

printf("検索文字を入力してください:");
fgets(buffer,BUFSIZE,stdin);
sscanf(buffer,"%c",&chrQuery);

// search
i=0;
for(pSearch=(char *)strSearchData;*pSearch!='\0';pSearch++,i++){
if(*pSearch == chrQuery){
iCheck[i]=TRUE;
iCount++;
}
}


549 :デフォルトの名無しさん:03/05/09 19:30

// result
if(iCount==0){
printf("そんな文字は入っていません\n");
}else{
printf("文字列\"%s\"に'%c'は\n",strSearchData,chrQuery);
for(i=0;i<BUFSIZE;i++){
if(iCheck[i]==TRUE){
printf("%d番目",i+1);
}
}
printf("\n");
printf("にあります");
}
}

>>542の方が綺麗だけどさ・・・

550 :デフォルトの名無しさん:03/05/09 19:32
っていうか、この回答だとポインタを(無理に?)使う意味がわからないね…… スマソ

551 :デフォルトの名無しさん:03/05/09 19:50
#include <stdio.h>
int main() {
char s[100];
char ch, *t;
printf("文字列を入力してください:");
gets(s);
printf("検索文字を入力してください:");
ch = getchar();
for (t = s; *t && *t != ch; t++) ;
if (!*t) {printf("そんな文字は入っていません\n"); return 0;}
printf("文字列\"%s\"に\"%c\"は\n", s, ch);
for (; *t; *t++)
if (*t == ch) printf("%d番目 ", t-s+1);
printf("\nにあります.\n");
return 0;
}

552 :デフォルトの名無しさん:03/05/09 19:52
惜しい。
tを巻き戻せ。

553 :デフォルトの名無しさん:03/05/09 19:53
charは1バイトです。むしろ、sizeof(char)を1バイトと呼ぶのです。

554 :デフォルトの名無しさん:03/05/09 19:56
>>553
1バイト=8ビットとは限らない、って言いたかったんだろう
きっと

555 :デフォルトの名無しさん:03/05/09 19:57
ちがうなあ。wchat_tを言いたかったのか。

556 :デフォルトの名無しさん:03/05/09 19:59
>>552
tを巻き戻すってどこ?

557 :デフォルトの名無しさん:03/05/09 20:12
>>547
配列に入れる代わりにフラグを使ってみました

#include <stdio.h>
#include <string.h>

int main()
{
 char InputString[512], SearchString[512], *Position;
 int Matched;

 fprintf(stderr, "文字列を入力してください:"); gets(InputString);
 fprintf(stderr, "検索文字を入力してください:"); gets(SearchString);
 Matched = 0;
 for(Position = InputString; (Position = strstr(Position, SearchString)) != NULL; Position++){
  if(!Matched){
   printf("文字列\"%s\"に\"%s\"は", InputString, SearchString);
   Matched = 1;
  }
  printf(" %d", Position - InputString + 1);
 }
 if(Matched){
  printf(" 番目にあります\n");
 } else {
  printf("そんな文字は入っていません\n");
 }
 return 0;
}


558 :デフォルトの名無しさん:03/05/09 21:33
よろしくおながいします。(言語はCで)

3次元空間上の4点
A (10,135,14), B (73,-16,-22), C (27,-21,96), D (-50,-32,-43),
で構成される3角錐、及びその3角錐内の点 P を考える。
今、点 P が始点 O (0,0,0)にあり、1秒毎に
ベクトル V(1,2,3) 分だけ移動し続けるとする。
但し、もし P が3角錐の面と交差した時には、
P はその面に対して垂直に反射するように移動方向を
変えるものとした場合、1年(365日)後の点 P の
座標を求めよ。

559 :デフォルトの名無しさん:03/05/09 21:53
なかなか面白いけど、これは数学的にエレガントに解くの?
それともシミュレーションでゴリゴリやっていいの?

560 :デフォルトの名無しさん:03/05/09 22:45
>>537
#include <string>
#include <iostream>
using namespace std;
int main()
{
 string str, fstr;
 char c, *pc = &c;
 size_t pos;
 cout << "文字列を入力して下さい" << endl;
 cin >> str;
 cout << "検索文字を入力して下さい" << endl;
 cin >> *pc;
 fstr = *pc;
 if((pos = str.find(fstr)) != string::npos)
 {
  cout << "文字列\"" << str << "\"に\"" << *pc << "\"は" << endl;
  do
  {
   cout << pos + 1 << "番目 ";
  } while((pos = str.find(fstr, pos+1)) != string::npos);
  cout << "\nにあります" << endl;
 }
 else
  cout << "そんな文字は入っていません" << endl;
}


561 :560:03/05/09 22:46
1個以上の整数コマンド行から入力したとき、それらの和を標準出力するプログラムを作成しなさい。
ヒント関数atoiを用いると容易。

お願いします

562 :r:03/05/09 22:52
>>561
これを参考にして。

#include <cstdlib>
#include <iostream>
int main( int argc, char* argv[] ) {
  int sum = 0;
    while( int i = 1; i < argc; i++ ) {
      sum += std::atoi( argv[i] );
    }
    std::cout << sum;
  }
}


563 :デフォルトの名無しさん:03/05/09 22:55
>>561
#include <cstdlib>
#include <iostream>
int main(int argc, char** argv)
{
 int value=0;
 for(int i=1; i<argc; i++)
  value += std::atoi(argv[i]);
 std::cout << value << std::endl;
 
 return 0;
}

564 :デフォルトの名無しさん:03/05/09 22:55
先を越されたぜ

565 :草鍋春樹:03/05/09 23:22
>>564
どんまい

566 :デフォルトの名無しさん:03/05/10 08:53
>>559
解ける方法で解いてください。

567 :561:03/05/10 10:08
>>562>>563
ありがとうございました

568 :デフォルトの名無しさん:03/05/10 14:08
C言語でよろしくおねがいします。

まず50個のデータ(数字)を入力し、昇順に並べ替える。
そのなかに好きな数字を入れて、その数字がどこにあるのかを探し、
その進行状況を表示するプログラムを作成せよ。
(例えば、すべてのデータが50個であり、二分探索で25番目を検索している時は、25と表示。)

569 :デフォルトの名無しさん:03/05/10 14:14
>>568
めんどいからバカソートで良いじゃん。

570 :デフォルトの名無しさん:03/05/10 14:18
>>569
ソートはqsortでいいだろ。
サーチはbsearch使うわけにはゆかないけど。

571 :デフォルトの名無しさん:03/05/10 15:01
>>570
じゃあ線形探索だ。for一個で楽ちん。

572 :デフォルトの名無しさん:03/05/10 15:25
>>568
Hash 表作って一発サーチすれば、進行状況の表示がサボれるかもしれない。

573 :デフォルトの名無しさん:03/05/10 15:47
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
inline int icmp(const int *x, const int *y){return *x - *y;}
int ibsearch(const int key, const int *base0, size_t nmemb) {
int i, base = 0; size_t lim;
for (lim = nmemb; lim != 0; lim /= 2) {
i = base + lim/2; printf("[%d]", i);
if (key == base0[i]) return i; if (key > base0[i]) { base = i+1; lim--; } }
return -1; }
int main(int argc, char **argv) {
int n, i, *base; char buf[BUFSIZ];
n = argc-1;
if (0 == n){ fprintf(stderr, "usage: %s numbers...\n", argv[0]); return 1; }
base = (int*)malloc(sizeof(int)*n);
for (i = 0; i < n; ++i) base[i] = atoi(argv[i+1]);
qsort(base, n, sizeof(int), (int(*)(const void*, const void*))icmp);
while (fprintf(stderr, "input target: "), fgets(buf,BUFSIZ,stdin))
puts(ibsearch(atoi(buf), base, n) < 0 ? " not found" : " found");
return 0; }

574 :デフォルトの名無しさん:03/05/10 16:22
Cだと言われているのに、inline を使い、
あまつさえ、それを qsort の引数にしている >>573 に小一時間(ry

575 :デフォルトの名無しさん:03/05/10 16:56
>>572
ハッシュがかち合ったとき、どのみち表示しないとダメでしょ

576 :デフォルトの名無しさん:03/05/10 17:28
>>575
オーバーフロー領域の検索なんて所詮数回でしょ ?
(そうでないときは、ハッシュの設計ミスだし。)

表示なんかしても一瞬だからいらんと思うけど。

577 :デフォルトの名無しさん:03/05/10 18:00
>>576はネタなのか真性なのか理解に苦しむ

578 :558:03/05/10 18:06
>>570
比較関数内に状況を表示させる機能をつければ bsearch を使っても良いと思われ。
(但し、それがC言語の規約上、動作が「保証」されているかどうかは怪しいが・・・)

そんな事より、誰か >>558 の解答、よろしくおながいします。

579 :デフォルトの名無しさん:03/05/10 18:08
Cだと考える気にならん

580 :デフォルトの名無しさん:03/05/10 18:27
>>576は畑を耕すのに戦車を使おうと考えるようなやつかも


581 :デフォルトの名無しさん:03/05/10 18:27
>>579
じゃあ、何だったらいいでしか?

582 :デフォルトの名無しさん:03/05/10 19:06
C++!

583 :デフォルトの名無しさん:03/05/10 19:13
c--

584 :デフォルトの名無しさん:03/05/10 19:16
D

585 :デフォルトの名無しさん:03/05/10 19:19
while program

586 :デフォルトの名無しさん:03/05/10 19:20
>>558
三角錐の面と交差するか調べる関数と
垂直に反射する関数を書けばいいのだよ。
俺は数学が分からないから書けないが。

緯度と経度で表したり、外積を使えば簡単に書けるかもしれん。

587 :デフォルトの名無しさん:03/05/10 19:40
^Mの文字列を削除するにはどのようにしたらよいのでしょうか?

588 :デフォルトの名無しさん:03/05/10 19:49
Cなんですが、
順次探索のsearch関数、insert関数、delete関数を配列ではなくリストで
プログラムを書かないといけないのですが、
どのようなプログラムになるか教えてくださいm(_ _)m


589 :558:03/05/10 19:52
>>582
とリあえず C++ でもいいです。

>>586
要するにレイトレするのと同じなのは分かっていますが、
もっと単純&エレガントな方法があればなお良いのです。
Cを使って2chの1レス内にコピペできるくらいのが希望です。

590 :デフォルトの名無しさん:03/05/10 20:03
結構簡単だと思うよ。引っ掛け問題みたいだけど。
> P はその面に対して垂直に反射するように
              ^^^^^^^^

591 :デフォルトの名無しさん:03/05/10 20:04

あるデータファイルをヒストグラムが書けるデータファイルに
したいのですが。データの数は決まってないです。
よろしくお願いします。


592 :デフォルトの名無しさん:03/05/10 20:04
>>578
比較関数に渡される要素ってどっちが探索中の要素で、どっちが比較対照要素になるかって決まってるのか ?
俺も一瞬考えたけど、そこら辺がわからんかった。

>>577, >>580
畑って言ってるけど、進行状況を表示するぐらいの規模だぜ。
まあ、>>568 はなんかの宿題だろうから、>>572 は当然ネタだけど、実際のプログラムなら Hash は検討すべきだと思うよ。

>>587
もうちょっとなんか書けよ。

593 :デフォルトの名無しさん:03/05/10 20:31
>>588
とりあえず、これで必要最小限の実装になっていると思うが、どうよ。

typedef struct List_ {struct List_ *n;void *e;} List;
typedef int ListCmp(void *a,void *b);

List *Search(List *h,void *e,ListCmp p)
{while(h!=NULL&&p(h->e,e))h=h->n;return h;}
List *Insert(List *h,void *e)
{List *l=(List *)malloc(sizeof(List));l->n=h;l->e=e;return l;}
List *Delete(List *h,List *d)
{if(h==d)return h->n;while(h)if(h->n==d){h->n=d->n;break;}return h;}


594 :デフォルトの名無しさん:03/05/10 20:33
>>574
C99ならinlineがサポートされているよ

595 :558:03/05/10 20:35
>>590

垂直方向に方向を変えるのではありません。
あくまでも「反射」です。
よろしくお願いします。

596 :デフォルトの名無しさん:03/05/10 20:41
>>594
なら、qsort に inline 関数を渡したとき、
その関数はインライン展開されるのか?

597 :デフォルトの名無しさん:03/05/10 20:50
>>592
>比較関数に渡される要素ってどっちが探索中の要素で、どっちが比較対照要素になるかって決まってるのか ?
進行状況を表示するだけならば、それらの情報は全く要らないと思うが。

598 :デフォルトの名無しさん:03/05/10 20:51
おながいしまる。

これを実行すると 合計は[2550] と表示される。
4行目の宣言を消してforヘッダの中でnumを宣言するようにすると
合計は[2] になってしまう。理由を述べよ。

#include <stdio.h>
int main()
{
int sum;
int num; /* 4行目 */
for (/*int*/ num = 2, sum = 0; num <= 100; num += 2)
sum += num;
printf("合計は[%d]\n", sum);
return 0;
}


599 :デフォルトの名無しさん:03/05/10 20:56
>>598
うちでは、0 になりましたが。

600 :デフォルトの名無しさん:03/05/10 20:58
0が定義されるかどうかの違い

601 :デフォルトの名無しさん:03/05/10 20:58
>>598
正確にいうと出力される数字は不定

for (int num = 2, sum = 0; num <= 100; num += 2)

こうした場合sumは2回目の宣言となる
1個目のsumは隠されるためアクセスできない

1個目のsumは値が代入されないので値は不定


602 :デフォルトの名無しさん:03/05/10 20:59
>>596
qsortの中にってこと?されるはずがない。
ちなみに私は>>573じゃないよ。

603 :デフォルトの名無しさん:03/05/10 21:05
>>598
糞みたいな宿題だな。

604 :593:03/05/10 21:06
うわ、よく考えたら Delete の引数の双方ともに NULL が
渡されたら(まぁ、普通起こらないとは思うが)、ぬるぽが出ちゃうよ!
やっぱり本能に任せたままのコーディングはいかんな。

悪い、>>588 よ、そこら辺はてきとーに直しておいてくれ。

605 :デフォルトの名無しさん:03/05/10 21:08
順次検索ってシーケンシャルサーチ? つまりは線形探索?

606 :デフォルトの名無しさん:03/05/10 21:10
糞みたいな宿題に答えていただきありがとうございます。。。m(_ _)m
3行目のint sumとforヘッダのsumは別物なんでつね。
たまたま偶然2だったと、フみたいなもんでつか。
ちなみ3行目を int sum = 55; にしたら
合計は[55] になりますた。

607 :動画直リン:03/05/10 21:13
http://homepage.mac.com/hitomi18/

608 :デフォルトの名無しさん:03/05/10 21:13
>>604
ガッ

609 :デフォルトの名無しさん:03/05/10 21:18
ファイル(ファイル名はfile.txt)の中に数字があれば「数字がありました。」と表示し、
なければ「数字がありませんでした。」と表示するプログラムをつくれ。

C言語です。よろしくお願いします。

610 :デフォルトの名無しさん:03/05/10 21:22
inlineはコンパイラに対するヒントでしかないから
関数のポインタ渡しと化する場合は当然展開されない版が
リンクされる。

611 :デフォルトの名無しさん:03/05/10 21:29
>>609
isdigit

612 :デフォルトの名無しさん:03/05/10 21:30
>>593
Delete() で、ルートがさす要素以外の要素を指定したら無限ループ。
Insert() で、malloc() する割には、Delete() で free() しないと言う変なインターフェース。

>>604 以前に、よくこんなものネットに晒せたもんだな。

613 :デフォルトの名無しさん:03/05/10 21:30
strchr

614 :デフォルトの名無しさん:03/05/10 21:32
>>612
そこまで言わなくてもいいじゃん。
だからいつも一言多いと言われるんだよ。

615 :デフォルトの名無しさん:03/05/10 21:44
>612は「インターフェイス」の使い方を勉強しる。

そんな文章よくネットに晒せたもんだな。

616 :593:03/05/10 21:47
>>612
>Delete() で、ルートがさす要素以外の要素を指定したら無限ループ。
お、ほんとだ、ありがと。で修正。
{if(h==d)return h->n;while(h)if(h->n==d){h->n=d->n;break;h=h->n;}return h;}

>Insert() で、malloc() する割には、Delete() で free() しないと言う変なインターフェース。
ここは趣味の問題。

617 :593:03/05/10 21:49
>>616
うわ、修正にもなっていないよ(w
{if(h==d)return h->n;while(h){if(h->n==d){h->n=d->n;break;}h=h->n;}return h;}


618 :デフォルトの名無しさん:03/05/10 21:57
どこでfreeするの?

619 :デフォルトの名無しさん:03/05/10 21:57
>>615
ぷぷっ、釣りですか ?

620 :デフォルトの名無しさん:03/05/10 21:59
>>618
利用者がやるんだと思う。
ルートポインタの更新も利用者任せみたいだから、正直ちょっとどうかと思う。

621 :デフォルトの名無しさん:03/05/10 22:07
http://www.zdnet.co.jp/help/tips/linux/l0034.html
にある処理をC言語でするとどうやればいいのでしょうか?

622 :デフォルトの名無しさん:03/05/10 22:09
>>621
system("perl -i.bak -npe 's/\r\n/\n/' hogehoge.txt");

623 :593:03/05/10 22:09
>>618
プログラムが終了するまで free しないんでつ。

624 :デフォルトの名無しさん:03/05/10 22:14
InsertDeleteを繰り返すとどんどん使用メモリが増えていくって事ですか?

625 :デフォルトの名無しさん:03/05/10 22:15
>>621
read(s,buf,sizeof(buf));
のbufを変換する場合は?

626 :デフォルトの名無しさん:03/05/10 22:21
>>601 そうなんですか?
for(1;2;3) {4} なら 1→(2→4→3→2→4→3)・・・
と言うのは分かるのですが。初期値代入は複数書くのは処理系依存なのですか?
パット見102*25==2550と思ったのでよく宿題の意味がわからなかったのですが。

627 :デフォルトの名無しさん:03/05/10 22:30
>>622
×: system("perl -i.bak -npe 's/\r\n/\n/' hogehoge.txt");
○: system("perl -i.bak -npe 's/\\r\\n/\\n/' hogehoge.txt");


628 :デフォルトの名無しさん:03/05/10 22:46
>>609 てきとうですが。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
FILE*fp;char s[1024];int i,l,ok;
if((fp=fopen("file.txt","rb+"))==NULL){puts("ファイルオープン失敗");exit(1);}
fread(s,sizeof(s),1,fp);fclose(fp);
for(i=0,l=strlen(s),ok=0;i<l;i++){if(isdigit((int)s[i])){ok=1;break;}}
if(ok)puts("数字あり");else puts("数字なし");
return 0;
}

629 :629:03/05/10 22:48
日曜日を0として、n日目の曜日名を返す関数char *DayName(int n)を作成しなさい。ただし、0≦n≦6とし、関数DayName(n)内では以下のポインタ配列宣言を行うこと。
Static char *name[7] = {“Sunday”,”Monday,”Tuesday”,”Wednesday”,”Thursday”,”Friday”,”Saturday”};n

お願いします

630 :デフォルトの名無しさん:03/05/10 22:50
>390
の考え方がわかりません。どなたかおしえてください

631 :593:03/05/10 22:50
>>624
なら、 free すれば使用メモリが減るという保証でもあるんでしか?
また、(実は)下の件にも関わってくるでし。

>>620
>ルートポインタの更新も利用者任せみたいだから、正直ちょっとどうかと思う。
実際に何度かリストをいじったことがあればすぐに気づくと思うが、
リストという香具師は、必ず先頭から辿りたい時ばかりとは限らない
(言語処理系の変数のスコープの実装などが良い例)。
ならば、「リストを管理する構造体」などという殻で全体を囲わずに
実際に扱う対象はリストの先頭のポインタのみで、
後の細かな管理は使用する側にまかせるのが吉、という事もある。
まあ、これも趣味の問題だが・・・

632 :デフォルトの名無しさん:03/05/10 22:50
>>628
普通EOFまで一文字ずつ読み込んで処理しないか?

633 :デフォルトの名無しさん:03/05/10 22:51
>>629
#define Static static

char *DayName(int n)
{
Static char *name[7] = {“Sunday”,”Monday,”Tuesday”,”Wednesday”,”Thursday”,”Friday”,”Saturday”};
if(n<0||n>6) return NULL;
return name[n];
}


634 :デフォルトの名無しさん:03/05/10 22:53
>>626
こう書き換えるとわかるかな?

int sum;
for (int sum = 0, num = 2; num <= 100; num += 2)


int sumが2回宣言されてるよね

635 :デフォルトの名無しさん:03/05/10 22:55
電源を切るとfreeされます。

636 :633:03/05/10 22:57
コピペしたから気づかなかったが、”と全角じゃだめじゃん。

637 :デフォルトの名無しさん:03/05/10 22:57
>>629 そのままだと思うのですが。
#include <stdio.h>
char*DayName(int n)
{
static char*name[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
return name[n%7];
}
int main(void)
{
printf("%s\n",DayName(14));
return 0;
}

638 :626:03/05/10 23:01
>>634 初期化を複数行うことではなくて途中宣言の事の方ですか。分かりました。ありがとうございました。

639 :デフォルトの名無しさん:03/05/10 23:03
>>633 StaticのSが大文字であるのが意地悪問題ではないと思うけど。

640 :628:03/05/10 23:06
>>632 ファイル操作は殆ど使ったことが無かったので本当にてきとうでした。

641 :デフォルトの名無しさん:03/05/10 23:41
>>631
> なら、 free すれば使用メモリが減るという保証でもあるんでしか?

毎回こう言うこと言う奴がでてくるな...。
まあ下の件も含めて、趣味の範疇なんだろうからどうでもいいけど、正直こう言う奴とは組みたくないな。

642 :593:03/05/11 00:19
>>641
>まあ下の件も含めて、趣味の範疇なんだろうからどうでもいいけど、正直こう言う奴とは組みたくないな。
世の中には奇妙な事や変な事を考えている奴は意外と多いもの。
あなたには、たまには普段と違う世界・パラダイムを覗いてみる事を
お勧めするでつ。

643 :デフォルトの名無しさん:03/05/11 04:15
InsertDeleteを繰り返すとどんどん使用メモリが増えていくって事ですか?
と聞いてるんだよ。
質問を質問で返すなよ。

644 :643:03/05/11 04:36
とっとと答えねーかーーっ!!
この糞度もがぁーーーーっ!!!!!

645 :デフォルトの名無しさん:03/05/11 04:37
こんな時間に・・・しかもsageで・・・・・


646 :デフォルトの名無しさん:03/05/11 04:54
まあ644はsageてない時点で偽者なわけだが。

647 :デフォルトの名無しさん:03/05/11 05:33
class CTest* p_tst;
というクラスがあって、これを削除したい場合は
delete p_sts;
ですむのだけど、これをたとえば、自殺したい場合はどうすれば
いいのですか?

たとえば、CTestのメンバ関数内で、自殺したい場合です。
delete this; では、まずいですよね?


648 :デフォルトの名無しさん:03/05/11 05:36
>>647
自殺なんてできない。

649 :デフォルトの名無しさん:03/05/11 06:00
>>648
えと、ではいつもどうしてます?
ちなみに自分は、KillRequest() というメンバ関数を設置して、
自殺したい場合はこのメンバ関数を呼び出してます。
この関数内では、boolフラグをたてて、
あとで、別の場所でこのboolフラグを監視し、もしたっていれば
そこで delete かけることで実装してます。

が、これは非常にコーディングに注意力が必要で、
油断してると、すぐにdelete漏れしてしまうのです。

どうしたものだか・・・

650 :デフォルトの名無しさん:03/05/11 06:05
>>649
それは生成元で管理しきれないから
GCっぽいことしてるってこと?
そのフラグ監視してるのが自前GC?

651 :デフォルトの名無しさん:03/05/11 06:10
>>650

んー、そうなのかなー、自前GCというのだろうか?
自分の中ではグルーピングと呼んでいて、
一応、それ専用の監視クラスが存在してはいるんだけど・・・

>>それは生成元で管理しきれないから
そのとおりですー
小規模なら、注意力喚起して、生成元で管理しきれるのだけど
最新のPCでビルドに3分以上かかるような規模になると
もう、生成元では管理できなくて・・・


652 :デフォルトの名無しさん:03/05/11 06:29
本当に管理できないなら、その自前GCで良いのではないかと。
ただ、自信が無かったりするなら↓とかチェックしてみれ。
http://www.hpl.hp.com/personal/Hans_Boehm/gc/
(boolフラグ立て忘れたらどうしよう・・・とか)

653 :デフォルトの名無しさん:03/05/11 07:41
よくあるスマートポインタじゃいかんのかな?

654 :593:03/05/11 07:41
おはよございます。

>>643-644
夜遅くまでご苦労さん(w
いちお解答しますけど、当然ふえていきます。
ただし、これが問題となるような状況が発生した時に
それを解決するための方法は、>643タン は真っ先に free を
思いつくのかも知れませんが、私ならまず、

1.(OS側の管理情報を減らす為)List 構造体用のメモリ管理を
アプリケーション内で行う
2.GCを実装する

という(比較的効果が高いと思われる)対策を取ったあと、
最後のおまけとして free をくっつけまつ。

今回の件では、ここまでやる必要性は無いと判断したのですが・・・

655 :デフォルトの名無しさん:03/05/11 10:27
>>654
> 1.(OS側の管理情報を減らす為)List 構造体用のメモリ管理を
> アプリケーション内で行う

よくこう言う奴がいるけど、大体 malloc()/free() ライブラリよりヘボイもの書いて自己満足してる奴が多い。
大体は、まともに free() するプログラムが書けない奴だと思う。

> 2.GCを実装する

だったら初めから、C/C++ なんか使わん方がいいと思うけどね。

別に、>>593 がそうだと言ってるわけじゃないけどさ。

656 :デフォルトの名無しさん:03/05/11 10:54
そんなにfreeが嫌いならBoehm GC使えよアフォども。

657 :デフォルトの名無しさん:03/05/11 11:02
>>654
> 今回の件では、ここまでやる必要性は無いと判断したのですが・・・
じゃぁ真っ先に思いつく最後のおまけのfreeくらいつけとくもんだ。

658 :デフォルトの名無しさん:03/05/11 11:04
このスレのレベルが循環参照を起こしまくるようなコードを書くほど
高いとは思えん。shared_ptrで十分。

659 :デフォルトの名無しさん:03/05/11 11:06
ちゅーか、たんに書き忘れただけだろうと思う
604のケアレスミスを見てると

660 :デフォルトの名無しさん:03/05/11 11:15
>>647
仮にdelete thisで自殺ができたとすると、
p_sts(p_tst?)が参照切れを起こす。
自殺時にp_stsを書き換えるようにすると、外部との結合度が高くなりよろしくない。
自殺したこを示すフラグを用意する手もあるが、わざわざ自殺しなくても、
そのフラグをチェックしたときにdeleteすればよい。

外部から参照されていない場合は、そもそもメンバ関数が呼ばれないはず…

661 :あふぉ:03/05/11 11:21
xのn乗を計算するプログラムを教えて下さい。
2進数表示を利用する奴です。

662 :593:03/05/11 11:33
>>657
あのー、しっかりと>>631
>また、(実は)下の件にも関わってくるでし。
とコメントつけといたんですけど・・・

Delete した構造体が "必ず" free するべき対象となるとは
限らないことは結構あるものです。

>>659
あなた、ケアレスミスの "亡霊" に取り付かれていませんか?
なにか辛い事でもあったんでしか?

663 :デフォルトの名無しさん:03/05/11 11:36
// 2進数表示を利用するって何だろ
double power(double x, double n)
{
FILE *fp;
char buf[100];
sprintf(buf, "awk 'BEGIN{print %g^%g}'", x, n);
fp = popen(buf, "r");
fgets(buf, sizeof(buf), fp);
pclose(fp);
return atod(buf);
}


664 :593:03/05/11 11:39
>>659
そんな点より、free の前の malloc でメモリが確保できなかったときの
対応がぬけていると責める人が現れなくなった、というのは
時代の流れを感じるでつ。

隔世の感がありまつな・・・

665 :デフォルトの名無しさん:03/05/11 11:42
宿題でエラー処理しろと言われてないのにやる奴は馬鹿

666 :デフォルトの名無しさん:03/05/11 11:43
>>664
ここは宿題スレ。

667 :デフォルトの名無しさん:03/05/11 11:53
> 後の細かな管理は使用する側にまかせるのが吉
こういうスタンスに立つなら、mallocするのがおかしいような気がする。

668 :デフォルトの名無しさん:03/05/11 12:15
すげー饒舌になったな(w
今はfree()の話をしてるんで、malloc()の件は後で

669 :デフォルトの名無しさん:03/05/11 12:18
ケアレスミスの "亡霊"って何?

670 :デフォルトの名無しさん:03/05/11 12:33
Cなんですが、

#include<stdio.h>
#include<stdlib.h>

#include"list_appli_header.h"
#include"liststructure.h"

int init(void)
{
head=NULL;
return 1;
}

671 :デフォルトの名無しさん:03/05/11 12:34
●上のプログラムの続き
nodetype* search(keyType a_key) {
........
}

int insert(dataType *dp) {
........
}

int delete(keyType a_key) {
........
}

void printAllData(void) {
nodeType *p=head;
  while(p!=NULL){
  printkey(p);
  printf(",");
  p=p->next;
  }
 printf("\n");
}

このプログラムの........の部分の順次探索の
search関数、insert関数、 delete関数をリストで書かないといけないのですが、
どのようなプログラムになるのか教えて下さい。


672 :デフォルトの名無しさん:03/05/11 13:03
#include"list_appli_header.h"
#include"liststructure.h"
の中身は自分で想像しろってことかな?

673 :デフォルトの名無しさん:03/05/11 13:05
list_appli_header.hとliststructure.hの中身もさらせよ。

674 :デフォルトの名無しさん:03/05/11 13:07
>>670
>>588 と同じ課題?

675 :デフォルトの名無しさん:03/05/11 13:14
593に聞け

676 :デフォルトの名無しさん:03/05/11 15:01
すいませんでした。
list_appli_header.hとliststructure.hの中身は、

●list_appli_header.h
typedef int keyType ;

typedef struct {
keyType key ;
} dataType ;

typedef struct node {
dataType data ;
struct node *next ;
} nodeType ;

int less(keyType, keyType) ;
int equal(keyType, keyType) ;
keyType key(dataType *p) ;
keyType key2(nodeType *p) ;

void printKey(nodeType *p);


677 :デフォルトの名無しさん:03/05/11 15:02
●liststructure.h
static nodeType *head ;

int init(void) ;
int insert(dataType *p) ;
nodeType* search(keyType) ;
int delete(keyType) ;
void printAllData(void) ;

です。
宜しくお願いします。


678 :デフォルトの名無しさん:03/05/11 15:11
>>662
> Delete した構造体が "必ず" free するべき対象となるとは
> 限らないことは結構あるものです。

はぁ ?
だったら、なぜ Insert する構造体は必ず malloc() するんだ ?
free してない構造体は何に使うんだ ?

設計ミスの言い訳は見苦しいぞ。

(InsertWithoutMalloc() を作るとか言い出しそうだな...。(藁 )

679 :デフォルトの名無しさん:03/05/11 15:40
次のプログラムをwhileを使い、かつ、ファイル名を標準入力、
データ数がいくつでも可能というように書き換えて

#include<iostream.h>
#include<fstream.h>
#include<map.h>

int main()
{
std::ifstream fin("in.txt");
std::map <int,int> intmap;
for(int i=0;i<5000;i++)
{
int val;
fin >> val;
intmap[val]++;
}
std::ofstream fout("out.txt");
for(std::map<int, int>::iterator it=intmap.begin();it!=intmap.end(); ++it)
{
fout << (*it).first << " " << (*it).second << std::endl;
}
return 0;
}


680 :デフォルトの名無しさん:03/05/11 15:41
ファイル名を標準入力、

681 :デフォルトの名無しさん:03/05/11 15:50
> #include<iostream.h>
> #include<fstream.h>
> #include<map.h>


    ぐはっ



682 :初心者の名無しさん:03/05/11 15:52
> Delete した構造体が "必ず" free するべき対象となるとは
> 限らないことは結構あるものです。

全然思いつかないんだけど例えばどういうとき?

683 :デフォルトの名無しさん:03/05/11 15:53
>>679>>390に凄く頭悪そうなincludeを付け足したものですか?

684 :デフォルトの名無しさん:03/05/11 16:04
つまり>>386==>>679ですか?

685 :デフォルトの名無しさん:03/05/11 16:31
>>670
nodeType* search(keyType a_key) {
  nodeType* p = head;
  while (p != NULL) {
    if (p->data.key == a_key) break;
    p = p->next;
  }
  return p;
}

int insert(dataType *dp) {
  nodeType* node;
  if ((node = (nodeType*)malloc(sizeof(nodeType))) == NULL) return 0;
  node->data = *dp;
  node->next = NULL;
  if (head == NULL) {
    head = node;
  } else {
    nodeType* p = head;
    while (p->next != NULL) p = p->next;
    p->next = node;
  }
  return 1;
}

686 :デフォルトの名無しさん:03/05/11 16:32
>>679
#include <iostream>
#include <fstream>
#include <map>
#include <string>
int main()
{
 std::string filename;
 std::map <int,int> intmap;
 while(1)
 {
  std::cin >> filename;
  if(std::cin.fail())
   break;
  std::ifstream fin(filename.c_str());
  std::map<int, int> intmap;
  for(;;)
  {
   int val;
   fin >> val;
   if(fin.fail())
    break;
   intmap[val]++;
  }
 }
 std::ofstream fout("out.txt");
 for(std::map<int, int>::iterator it=intmap.begin(); it!=intmap.end(); ++it)
 {
  fout << (*it).first << " " << (*it).second << std::endl;
 }
 return 0;
}

687 :685:03/05/11 16:32
int delete(keyType a_key) {
  nodeType* node;
  if (head->data.key == a_key) {
    node = head;
    head = node->next;
    free(node);
    return 1;
  } else {
    nodeType* p = head;
    while (p->next != NULL) {
      if (p->next->data.key == a_key) {
        node = p->next;
        p->next = node->next;
        free(node);
        return 1;
      }
      p = p->next;
    }
  }
  return 0;
}

688 :686:03/05/11 16:35
>>679へ >>686は1行間違ってるのでこっちで
#include <iostream>
#include <fstream>
#include <map>
#include <string>
int main()
{
 std::string filename;
 std::map <int,int> intmap;
 while(1)
 {
  std::cin >> filename;
  if(std::cin.fail())
   break;
  std::ifstream fin(filename.c_str());
  for(;;)
  {
   int val;
   fin >> val;
   if(fin.fail())
    break;
   intmap[val]++;
  }
 }
 std::ofstream fout("out.txt");
 for(std::map<int, int>::iterator it=intmap.begin(); it!=intmap.end(); ++it)
 {
  fout << (*it).first << " " << (*it).second << std::endl;
 }
 return 0;
}


689 :デフォルトの名無しさん:03/05/11 16:55
無限ループ+breakキモイ

 std::map<int,int> intmap;
 std::string filename;
 while(std::cin >> filename)
 {
  std::ifstream fin(filename.c_str());
  int val;
  while(fin >> val)
  {
   intmap[val]++;
  }
 }


690 :デフォルトの名無しさん:03/05/11 16:56
>>686
ありがとうございます。

クラスとか使わないでできないですかね?


691 :デフォルトの名無しさん:03/05/11 16:57
>>690
出来るけどやる気無いから他の人にやってもらって

692 :デフォルトの名無しさん:03/05/11 16:58
>>690
> クラスとか使わないでできないですかね?
意味わからん。

693 :デフォルトの名無しさん:03/05/11 16:58
>>692
頭悪いな

694 :デフォルトの名無しさん:03/05/11 17:04
>>693
意味わかったの?おしえて。
「クラスとか」ってやつを具体的にしてもらえれば分かるような気はするんだ。

695 :デフォルトの名無しさん:03/05/11 17:08
>>694
ifstreamはbasic_ifstreamのtypedefでbasic_ifstreamはクラスだよ。分かる?
ofstreamはbasic_ofstreamのtypedefでbasic_ofstreamはクラスだよ。分かる?

696 :デフォルトの名無しさん:03/05/11 17:09
さすが宿題スレだな。精神年齢が低い香具師ばかり。

697 :デフォルトの名無しさん:03/05/11 17:15
>>695
それはわかります。
streamクラスを使わないとして、FILE*は使っていいってことですかね?

stringもmapもクラスです。
stringのほうはchar*でいけそうだけど、
mapのほうは構造体を使わないとムリなんじゃないですか?

あ、もしかして、
int intmap[INT_MAX];ですか?

698 :デフォルトの名無しさん:03/05/11 17:17
さすが宿題スレだな。精神年齢が低い香具師ばかり。

699 :デフォルトの名無しさん:03/05/11 17:20
>>697
int* mapindex;
int* mapvalue;

700 :デフォルトの名無しさん:03/05/11 17:21
ええ、>>698を筆頭にね。


701 :デフォルトの名無しさん:03/05/11 17:24
mapのほうは構造体を使わないとムリなんじゃないですか?
mapのほうは構造体を使わないとムリなんじゃないですか?
mapのほうは構造体を使わないとムリなんじゃないですか?

int intmap[INT_MAX];int intmap[INT_MAX];int intmap[INT_MAX];

702 :697:03/05/11 17:26
                 ┌─┐
                 |も.|
                 |う |
                 │来│
                 │ね│
                 │え .|
                 │よ .|
      バカ    ゴルァ  │ !!.│
                 └─┤    プンプン
    ヽ(`Д´)ノ ヽ(`Д´)ノ  (`Д´)ノ    ( `Д)
    | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄  . ̄◎ ̄   ̄◎ ̄   ◎−>┘◎

703 :デフォルトの名無しさん:03/05/11 17:26
やはり >>1 が宿題やらないのがムカツク

704 :デフォルトの名無しさん:03/05/11 18:37
>679用に
下のプログラムを書いたんだけどエラーでちゃったどう書き直せばいいの?
main( int argc, char *argv[])
{
int dat[1];
int i, ii;
int time;
int G=[200000];
if(argc!=2)
{
printf("<execute file> <input filename>\n");
exit(1);
}
if( argc < 2)
{
cerr << "You must specify a filename" << endl;
exit(1);
}
ifstream fin(argv[1]);
while(1)
{
fin >> dat[0];
if(!fin.eof())
break;
for(time=0; time < 100000;time++)
{
if(dat[0]==time)
G[time]++;
}
cout << dat[0] << setw(4) << G[time] << endl;
}
}

705 :デフォルトの名無しさん:03/05/11 18:44
>>704
ifstreamは使っちゃ駄目なんじゃないの?

706 :デフォルトの名無しさん:03/05/11 18:44
ifstream fin(argv[1]);

707 :デフォルトの名無しさん:03/05/11 18:45
関係ないがdat[1]って何?

708 :デフォルトの名無しさん:03/05/11 18:46
int G=[200000];

709 :デフォルトの名無しさん:03/05/11 19:00
ワラタ

710 :デフォルトの名無しさん:03/05/11 19:19
>>707
dat[1]と書けばdat=3;などとやってしまったときにエラーにしてくれる。

711 :697:03/05/11 19:19
みなさんにヒントをいただいたおかげで、できました。
#include <cstdio>
#include <cstdlib>
#include <limits>
#include <algorithm>
int main()
{
 using namespace std;
 size_t mapsize = 0;
 int* mapindex = 0;
 int* mapvalue = 0;
 size_t filenamecapacity = 1;
 char* filename = static_cast< char* >( malloc( filenamecapacity ) );
 if( filename == 0 ) abort();

712 :697:03/05/11 19:19
 for(;;)
 {
  size_t filenamesize = 0;
  for(;;)
  {
   int c = getchar();
   if( c == EOF )
    goto END_OF_INPUT;
   else if( c == ' ' || c == '\n' || c == '\t' )
    c = '\0';
   if( filenamecapacity <= filenamesize )
   {
    size_t n = filenamecapacity * 2;
    filename = static_cast< char* >( realloc( filename , n ) );
    if( filename == 0 ) abort();
    filenamecapacity = n;
   }
   filename[ filenamesize++ ] = c;
   if( c == '\0' ) break;
  }

713 :697:03/05/11 19:20
  FILE* const in = fopen( filename , "r" );
  if( in != 0 )
  {
   size_t const bufsize = std::numeric_limits< int >::digits10 + 1;
   char buf[ bufsize ];
   for(;;)
   {
    size_t read = 0;
    for(;;)
    {
     int c = fgetc( in );
     if( c == EOF )
      goto END_OF_FILE;
     else if( c == ' ' || c == '\n' || c == '\t' )
      c = '\0';
     if( read < bufsize )
     {
      buf[ read ] = ( read < bufsize - 1 ) ? c : '\0';
      ++read;
     }
     if( c == '\0' ) break;
    }
    if( read == 0 || bufsize < read ) goto END_OF_FILE;

714 :697:03/05/11 19:21
    char* endptr;
    long val = strtol( buf , &endptr , 0 );
    if( *endptr != '\0'
     || val < std::numeric_limits< int >::min()
     || std::numeric_limits< int >::max() < val )
     goto END_OF_FILE;
    size_t pos = distance( mapindex , lower_bound( mapindex , mapindex + mapsize , val ) );
    if( pos == mapsize || mapindex[pos] != val )
    {
     size_t n = mapsize + 1;
     mapindex = static_cast< int* >( realloc( mapindex , sizeof( int ) * n ) );
     mapvalue = static_cast< int* >( realloc( mapvalue , sizeof( int ) * n ) );
     if( mapindex == 0 || mapvalue == 0 ) abort();
     copy_backward( mapindex + pos , mapindex + mapsize , mapindex + n );
     mapindex[ pos ] = val;
     copy_backward( mapvalue + pos , mapvalue + mapsize , mapvalue + n );
     mapvalue[ pos ] = 0;
     mapsize = n;
    }
    ++mapvalue[ pos ];
   }
  END_OF_FILE:
   fclose( in );
  }

715 :697:03/05/11 19:22
 }
END_OF_INPUT:
 free( filename );
 FILE* const out = fopen( "out.txt" , "w" );
 if( out != 0 )
 {
  for( size_t i = 0 ; i < mapsize ; ++i )
   fprintf( out , "%d %d\n" , mapindex[ i ] , mapvalue[ i ] );
  fclose( out );
 }
 free( mapindex );
 free( mapvalue );
}

はぁ。C++標準ライブラリは偉大だなぁ。

716 :デフォルトの名無しさん:03/05/11 19:23
p=realloc(p,n);

こういう書き方をしちゃいけないと何度言ったら(ry
宿題だから許されるんだろうけど

717 :デフォルトの名無しさん:03/05/11 19:24
>704を書き直せ!!!!

718 :デフォルトの名無しさん:03/05/11 20:04
FILE* const out = fopen( "out.txt" , "w" );
FILE使ってるけどいいの?
システムコール使えよ。

719 :デフォルトの名無しさん:03/05/11 20:08
>>718
はぁ?死ね。

720 :デフォルトの名無しさん:03/05/11 20:11
>>719
>>697

721 :697:03/05/11 20:12
やっぱりFILEもダメだったのかよ。先に言ってくれよな。

722 :デフォルトの名無しさん:03/05/11 20:22
numeric_limitsとかクラスだろ。

723 :697:03/05/11 20:49
あぁ・・・

724 :デフォルトの名無しさん:03/05/11 21:02
>>685
どうもありがとうございました。

725 :デフォルトの名無しさん:03/05/11 22:32
#include <stdio.h>
#define N 128
void defvec(double [N]);
int N;
double A[N];
void defvec(double A[N]){
void main(){
double k,d;
double A[N];
double B[N];
int i;
defvec(A);
defvec(B);
k=0;
for(i=0;i<N;i++)
k=k+(A[i]-B[i])*(A[i]-B[i])
d=sqrt(k);
double distance(double A(N),double B(N));
return (d);
}
これではしらないのですが、どこがおかしいのでしょうか?
おながいします。

726 :デフォルトの名無しさん:03/05/11 22:35
>>725
はぁ ?

> #define N 128
> int N;

そもそもコンパイルできるとも思えないんだが。

727 :725:03/05/11 22:42
>>726
そうですね・・・すいません。

>double k,d;
ってのは合ってるんですかね?


728 :__:03/05/11 22:43
  (●´ー`●)/ <先生!こんなのがありました!
http://www.yoshiwara.susukino.com/moe/hankaku08.html
http://yoshiwara.susukino.com/zenkaku/
http://yoshiwara.susukino.com/moe/hankaku10.html
http://www.yoshiwara.susukino.com/moe/hankaku03.html
http://yoshiwara.susukino.com/moe/hankaku09.html
http://www.yoshiwara.susukino.com/moe/hankaku06.html
http://yoshiwara.susukino.com/moe/hankaku05.html
http://www.yoshiwara.susukino.com/moe/hankaku01.html
http://yoshiwara.susukino.com/moe/hankaku02.html
http://www.yoshiwara.susukino.com/moe/hankaku08.html
http://yoshiwara.susukino.com/moe/hankaku04.html

729 :デフォルトの名無しさん:03/05/11 22:45
>>725

パッと見あやしいのは
726が言ってた場所と
double distance(double A(N),double B(N)); ←ここ



730 :デフォルトの名無しさん:03/05/11 22:45
>>727
なんでint N;がエラーになるかわかっている?

731 :725:03/05/11 22:48
>>730
分からないです・・・教えてください。

732 :デフォルトの名無しさん:03/05/11 22:48
void defvec(double A[N]){

何も問題ないけど、普通はdouble A[]と書くかdouble *Aと書く。

733 :デフォルトの名無しさん:03/05/11 22:49
>>725
何する(したい)プログラム?

734 :デフォルトの名無しさん:03/05/11 22:51
>>731
#define N 128ってやっているでしょ。こうすると以降のNは(undefされるまで)全て128に置き換えられるの。
つまりint 128;となるわけ。変数名(識別子)の先頭は英字かアンダーバーしか使えないから。

735 :725:03/05/11 22:55
>>733
1:実数要素N個からなるベクトルAを定義する関数defvecを作る。
2:次にdefvec関数を2回呼び出しA,Bを定義するmain関数を作る。
3:そのmain関数のなかでベクトルA,B間の距離を計算する。
4:次にこの距離の計算部を関数にする。
 という問題なんですが。

736 :731:03/05/11 22:57
>>734
なるほど!ありがとうございます。

737 :デフォルトの名無しさん:03/05/11 23:01
ベクトルわからないんですけど。vector?配列?とか思ってしまうんですけど。
泣きそうなんですけど。  ・・・ごめんなさい。

738 :デフォルトの名無しさん:03/05/11 23:05
これはmallocで確保しろとか言われた?
構造体でするとか・・・。

739 :デフォルトの名無しさん:03/05/11 23:11
>>738
特には言われなかった気がします。

740 :デフォルトの名無しさん:03/05/11 23:12
http://www.yahoo2003.com/betu/linkvp2/linkvp.html

741 :デフォルトの名無しさん:03/05/11 23:12
>実数要素N個からなるベクトル
ってところでわけわかめ

単に2点間の距離を求めるということとは違うんだよね?


742 :bloom:03/05/11 23:13
http://homepage.mac.com/ayaya16/

743 :デフォルトの名無しさん:03/05/11 23:14
違うかもしれないけど
要はN次元での2点間の距離を求める問題とは違うのん?

744 :デフォルトの名無しさん:03/05/11 23:15
>725のプログラムめちゃくちゃすぎ!

745 :デフォルトの名無しさん:03/05/11 23:17
defvecが何をすればいいのか解らないんだよね。
領域を確保するだけでいいのか、
確保して値もstdinとかから読み込むのか、
main内で配列として持っておいて値を入れるだけなのか。

746 :デフォルトの名無しさん:03/05/11 23:25
とりあえず。
defvec関数は何を入れたらいいのか分らんから、とりあえず0で埋めた。

#define N 128

void defvec(double A[]){
int i;
for(i=0; i<N; i++)
A[i]=0;
}
double distance(double A[],double B[]){
int i;
double k=0;
for(i=0;i<N;i++)
k+=(A[i]-B[i])*(A[i]-B[i]);
return sqrt(k);
}
int main(){
double A[N];
double B[N];
defvec(A);
defvec(B);

printf("%f\n",distance(A,B));
return 0;
}

747 :デフォルトの名無しさん:03/05/11 23:33
すいません。わたし自身がどうしていいのか理解できてません・・・
>735しか言われなかったもので。

748 :デフォルトの名無しさん:03/05/11 23:35
言い換えれば、その仕様さえ満たしていればどう作ろうが出題者は文句を言えないわけか。

749 :デフォルトの名無しさん:03/05/11 23:35
N次元ベクトルの各要素を配列に入れなさいってことではないかと思ふ

750 :デフォルトの名無しさん:03/05/11 23:36
あぁその値がどこから来るのかが不明なわけか…

751 :あふぉ:03/05/12 00:27
xのn乗を求めるプログラムを教えて下さい。
2進数表示を利用する奴です


752 :デフォルトの名無しさん:03/05/12 00:43
オレニマカセロ!

753 :7:03/05/12 00:52
文字列sを逆順にして出力する関数void reverse(char s[])を作成しなさい。
ヒント:関数strenを用いてあらかじめ文字列sの長さを測ると容易。
お願いします


754 :デフォルトの名無しさん:03/05/12 00:55
#include <algorithm>
#include <stdlib.h>
#include <iostream>
void reverse(char s[])
{
 std::reverse(&s[0], &s[strlen(s)+1]);
std::cout << s << std::endl;
}

755 :デフォルトの名無しさん:03/05/12 00:56
オレニマカセロ!

>>751
int power(int x, int n) {
int r = 1;
for (; n; n>>=1, x*=x)
if (n&1) r *= x;
return r;
}

756 :デフォルトの名無しさん:03/05/12 01:05
void reverse(char s[]) {
char *t = s + strlen(s) - 1;
for (; s < t; s++, t--) {
char tmp = *s;
*s = *t;
*t = tmp;
}
}

757 :あふぉ:03/05/12 01:13
ありがとん!!

758 :動画直リン:03/05/12 01:13
http://homepage.mac.com/hitomi18/

759 :デフォルトの名無しさん:03/05/12 01:18
>>755
符号付きのものを右シフトして、0になることを期待するなよ。

760 :デフォルトの名無しさん:03/05/12 01:24
ごめん。
if (n < 0) return 0;
とかいれて、はじいといて。

761 :デフォルトの名無しさん:03/05/12 04:13
みんなー、ちんぷんかんぷんなオラに力を貸してくれ

Cなんですけど

int 型の配列 a[MAX] (MAX は 10〜100000 の間で適当に動かしてみる) に,昇順で整数を代入しておく.
配列 a[MAX] に代入される整数は,1,3,9,12 などのように飛び飛びでもよく,また,8,10,10,10,14 などのように同じ値が連続してもよいとする.
以下の仕様に従って,a[l]〜a[r] (l ≦ r) の中に値 k が存在するならばその位置を返す再帰関数 int binary_search(int a[], int k, int l, int r) を作成し,プログラムと実行結果を示せ.

 関数 int binary_search(int a[], int k, int l, int r) は,a[l]〜a[r] (l ≦ r) の中に値 k が存在するならばその位置を返す.

 a[l]〜a[r] (l ≦ r) の中に値 k が存在しない時は,関数 int binary_search(int a[], int k, int l, int r) は -1 を返す.

 関数 int binary_search(int a[], int k, int l, int r) は,以下のような再帰関数とせよ:

  a[l] == k ならば,l を返す.

  a[l] < k ≦ a[(l + r) / 2] ならば,binary_search(a, k, l, (l + r) / 2) を再帰的に呼び出しその値を返す

  a[(l + r) / 2] < k ≦ a[r] ならば,binary_search(a, k, ((l + r) / 2) + 1, r) を再帰的に呼び出しその値を返す.

  それ以外の場合,-1 を返す.

比較的小さな MAX に対しては,計算の過程において関数 int binary_search(a, k, i, j) (0 ≦ i < MAX, 0 ≦ j < MAX) がどのように呼び出され,どのような値を返したのかを,printf などを用いて画面に出力すること.
また,MAX を 10〜100000 の間で適当に動かして

 関数 binary_search(a, k, i, j) (0 ≦ i < MAX, 0 ≦ j < MAX) が呼び出された回数

 関数 binary_search(a, k, i, j) の中で k と配列の要素が大小比較された回数

がどのように変化するかについて考察すること (大ざっぱなオーダーだけではなく,係数・定数の値まで見積ること).

って宿題があるんですが、さっぱりわからないのでお願いします。

762 :デフォルトの名無しさん:03/05/12 04:29
ホントにさっぱり判らないならここで聞くだけ無駄だ。あきらめろ。

763 :デフォルトの名無しさん:03/05/12 05:07
(゚∀゚)シープラプラ!!

764 :デフォルトの名無しさん:03/05/12 05:30
>>761
>大ざっぱなオーダーだけではなく,係数・定数の値まで見積ること

無茶言うなよ・・・

765 :デフォルトの名無しさん:03/05/12 06:40
川合堂ライセンス(´_ゝ`)


766 :デフォルトの名無しさん:03/05/12 10:05
学校で情報処理やっているから、良スレ発見。

767 :488:03/05/12 11:01
非常に亀レスすいません。突然ネットワークに接続できなくなったので...

>>491
ありがとうございます。その通りです。
ただ、C++じゃなくてCのソースが欲しいです。
最初に書かなかった私が悪いんですが、勉強のため、よろしくお願いします。


768 :デフォルトの名無しさん:03/05/12 12:31
>>767
cinとcoutをそれぞれstdinからの入力とstdoutへの出力に置き換えるだけじゃん。
自力で何とかしなさいよ。

769 :488:03/05/12 12:34
>>768
すいません。Cしか使ったことないんで...
調べたんですけど、良くわからなくて...
もうちょっと調べてみます。

770 :デフォルト名無しさん:03/05/12 13:07
Sample:
最初の #: 1(scanf)
次の #:   3(scanf)
三番目の #:  4(scanf)

最初の2つの#を入力してください:  1 3 (scanf)

最初の#は1、次は3、 三番目は 4ですね? (printf)

というプログラム。(ノードを使って)


771 :デフォルトの名無しさん:03/05/12 13:12
ノードって何?

772 :動画直リン:03/05/12 13:13
http://homepage.mac.com/hitomi18/

773 :デフォルトの名無しさん:03/05/12 13:13
>>761
とりあえずbinary_searchは書けるだろ。

774 :デフォルトの名無しさん:03/05/12 13:32
>>767
ちゃんと書いてるから気にするな。
このスレは「C」って言われてもC++で書く、字の読めない馬鹿がいるだけだ。


775 :デフォルトの名無しさん:03/05/12 15:02
>>771
リスト構造のことじゃねーの?

776 :デフォルトの名無しさん:03/05/12 15:05
>>770を読んでも意味がわからないんですけど。

777 :デフォルトの名無しさん:03/05/12 16:10
>>770
ニホンゴワカリマスカ?

778 :デフォルトの名無しさん:03/05/12 16:12
ワーカリーマセーン

779 :デフォルトの名無しさん:03/05/12 18:00
>>488 処理系に依存する。

780 :デフォルトの名無しさん:03/05/12 18:20
>>779
どこが?ビープ音? それは処理系というか他の環境によるのでは。

781 :デフォルトの名無しさん:03/05/12 19:46
>>779>>780
timeとclockの事では?winでは暦時間、プロセス時間だけど、unix?何かでは
違うらしいです。

782 :デフォルトの名無しさん:03/05/12 19:52
>>781
clockはANSI Cにあるだろ。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/clock.3.html

783 :デフォルトの名無しさん:03/05/12 19:54
2分木探索のdelete関数のプログラムを
ポインタのポインタを使って書かなければいけないのですが、
どのようなプログラムになるか教えて下さい。
お願いします。



784 :デフォルトの名無しさん:03/05/12 19:56
>>782
僕のパソコン(winMe)だとミリ秒を返してくれるのですが、返してくれない機種も
あると言われたことがありました。

785 :デフォルトの名無しさん:03/05/12 19:57
>>784
CLOCKS_PER_SECで割ればいいだけ。
まあ実時間であるとは限らないからだめと言う人もいるかもしれないけど。

786 :デフォルトの名無しさん:03/05/12 19:57
>>784
CLOCKS_PER_SECで割るんだけど。馬鹿?

787 :デフォルトの名無しさん:03/05/12 20:09
相乗平均を求めるプログラムってどうすればいいのですか?
二つの時はルート取ればいいのですが
三つ以上になるとどうすればいいのかわかりません。

788 :デフォルトの名無しさん:03/05/12 20:26
>>787
#include <math.h>
double
geometric_mean(double *a, int n)
{
int i;
double x = 0.0;

for(i=0; i<n; i++) x += log(a[i]);
return exp(x/n);
}


789 :デフォルトの名無しさん:03/05/12 20:28
>>785>>786
1000/1秒を返す機種ならCLOCKS_PER_SECが1000になり
100/1秒を返す機種なら100になり、割ることで結果的に秒単位の
プロセス時間を得れるって事?

790 :デフォルトの名無しさん:03/05/12 20:40
>>789
標準C ttp://www-ccs.ucsd.edu/c/

791 :デフォルトの名無しさん:03/05/12 20:41
>>788
ありがとうございます。そっかlogから考えれば良いのか。

792 :568:03/05/12 20:45
>568です。遅くなりましてすみません。
レスくださった方、有り難うございます

>568とほとんど同じなのですが…、
まず50個のデータ(数字)を入力し、昇順に並べ替える。
そのなかに好きな数字を入れる。そして、その数字がどこにあるのかを最初(1番目)から探し、
探している進行状況を表示するプログラムを作成せよ。
(例えば、好きな数字25を入力した場合、まず1番目を検索し、25でなければ「1 NG」と表示。
2番目を検索し、25でなければ「2 NG」と表示…… と続いて、x番目にあれば「x OK」と表示。」

C言語です。プログラムよろしくお願いしますm(__)m

793 :デフォルトの名無しさん:03/05/12 20:46
>>792
それは二分探索を使わなければならないの?

794 :デフォルトの名無しさん:03/05/12 20:48
>>792
>>573を改造すればいいだろ?

795 :568:03/05/12 21:18
>>793
二分探索は使用しても、しなくてもどちらでも良いですm(__)m

>>794
すみません。さっぱりわからないんです。


796 :デフォルトの名無しさん:03/05/12 21:29
>>795

#include <stdio.h>
#include <stdlib.h>

static int icmp(const void *,const void *);

int main()
{
int ia[50],i,search;

for(i=0;i<50;i++){
printf("%2d個目のデータ : ",i+1); fflush(stdout);
scanf("%d",ia+i);
}
qsort(ia,50,sizeof(int),icmp);
printf("\n\n探索する数字 : "); fflush(stdout);
scanf("%d",&search);
for(i=0;i<50;i++){
if(ia[i]==search){
printf("%2d OK\n",i+1);
return 0;
}
printf("%2d NG\n",i+1);
}

return 0;
}


797 :つづき:03/05/12 21:29

static int icmp(const void *x,const void *y)
{
const int *xp=(const int *)x;
const int *yp=(const int *)y;

return *xp==*yp?0:*xp<*yp?-1:1;
}


798 :798:03/05/12 21:38
文字列sを逆順にして出力する関数void reverse(char s[])を作成しなさい。
ヒント:関数strenを用いてあらかじめ文字列sの長さを測ると容易。

お願いします


799 :デフォルトの名無しさん:03/05/12 21:42
>>798

#include <stdio.h>
#include <string.h>

void reverse(char s[])
{
int i;
for(i=strlen(s)-1;i>=0;i--)
putchar(s[i]);
}


800 :デフォルトの名無しさん:03/05/12 21:45
>>799
strenを使うんだろ。
strlenではないかと思われ

int stren(char *s)
{ return strlen(s); }
を使うべし

801 :デフォルトの名無しさん:03/05/12 21:46
>>800
#define stren(x) strlen(x)でいいだろ。


802 :デフォルトの名無しさん:03/05/12 21:47
マクロ関数とはかいてねーからさ

803 :デフォルトの名無しさん:03/05/12 21:49
>>802
うるせー馬鹿!

ところで、戻り値の型はsize_tにしたほうがいいと思う。

804 :デフォルトの名無しさん:03/05/12 21:53
size_t (*stren)(const char *)=strlen;

stren(s);


805 :デフォルトの名無しさん:03/05/12 21:54
>796
有り難うございました!

806 :デフォルトの名無しさん:03/05/12 22:13
マクロ関数って聞いたことないな。
>>801で言ってるのは引数つきマクロなんだが、これのことか?

807 :デフォルトの名無しさん:03/05/12 22:16
俺は関数風マクロと呼んでいるが何か?

808 :デフォルトの名無しさん:03/05/12 22:18
引き数つきマクロの関数的用法と呼んでいるが何か?

809 :デフォルトの名無しさん:03/05/12 22:28
マクロって読んでますが何か?

810 :正直、「>>761=>>795=いい加減うぜぇ」と思ってた:03/05/12 22:44
>>761
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100000
int compare(const void*, const void*);
int binary_search(int*, int, int, int);
int main(void) {
static int a[MAX]; int i, n;
srand( (unsigned int)time(NULL) );
for (i=0 ;i < MAX; i++) { a[i] = rand(); }
qsort((void*)a, (size_t)MAX, sizeof(int), compare);
printf("Input:"); scanf("%d", &n);
if ( binary_search(a, n, 0, MAX-1) == -1) printf("not found\n");
}
int compare(const void* left, const void* right) {
return (*(int*)left == *(int*)right)? 0 : (*(int*)left < *(int*)right)? -1 : 1;
}
int binary_search(int* a, int k, int l, int r) {
static int ct=1;
if (a[l] == k) { printf("%d OK\n", ct); return l; }
if ( (a[l] < k)&&(k <= a[(l+r)/2]) ) { printf("%d NG\n", ct++); return binary_search(a, k, l, (l+r)/2); }
if ( (a[(l+r)/2] < k)&&(k <= a[r]) ) { printf("%d NG\n", ct++); return binary_search(a, k, (l+r)/2+1, r); }
return -1;
}

811 :デフォルトの名無しさん:03/05/13 05:34
>>810
お前の冗長なコードもなー
int compare(const void* left, const void* right) {
return (int*)left-(int*)right;
}


812 :デフォルトの名無しさん:03/05/13 07:00
>>811
よく確認しないで書いてしまうおまえもなー
int compare(const void* left, const void* right) {
return *(int*)left-*(int*)right;
}


813 :デフォルトの名無しさん:03/05/13 11:24
Cの宿題で、与えられた年が閏年か判定するプログラムを作れってのが出たんだが
関数uru_year()は整数型の引数をもらい、閏年なら1、違ったら0を返すらしいんだが
if文でやるぐらいしかワカンネ。
こんな簡単なのもわからん漏れに誰か教えてくれ。

814 :デフォルトの名無しさん:03/05/13 11:29
uru_yearの中でifを使えばイーンジャネーノ?

815 :813:03/05/13 11:40
>>814
整数型の引数をもらうところがわからん。

816 :デフォルトの名無しさん:03/05/13 12:38
bool leap_year(unsigned int year){
 if(yeaar>西暦何年だが忘れた)
  return (year % 4!=0)?false:((year%100!=0)?false:*));
 else{
  printf("当時は閏年という概念は無かった\n");
  exit(-1);
 }
}
*は普通はtrue,しかし厳密には更に(year%うんたらかんたら!=0)?false:...
が続く。(ほぼ無限)

817 :デフォルトの名無しさん:03/05/13 12:38
キーワード「閏年 判定」
上から5件目

だからなぁ、ぐぐれよ・・・

818 :デフォルトの名無しさん:03/05/13 12:39
(ぼそっ)おいおい、西暦指定間違えただけでプログラム停止かよ……
ずいぶんユーザーに厳しいな

819 :デフォルトの名無しさん:03/05/13 12:40
int uru_year(int year);
/* yearは現行西暦を仮定 */
int uru_year(int year)
{
 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
  return 1;
 }
 return 0;
}

820 :デフォルトの名無しさん:03/05/13 12:41
>>818
それ以前に間違ってるんだからどうでもいいじゃん。

821 :デフォルトの名無しさん:03/05/13 12:44
>>820
ま、確かに。

822 :デフォルトの名無しさん:03/05/13 12:51
>>821
そりゃ2chなんだから、falseとtrueが入れ替わることは
大いにあり得るな。ビットにして1ビットしか違わないんだし...

823 :デフォルトの名無しさん:03/05/13 13:03
いやいや、bool型なんてものはANSIのC言語には存在しないでしょ?
yeearなんて未定義の変数を使ってみたり、、、

普通は>>819さんのプログラムで正解と思われ。
エラー処理も必要(?)なんだが。

824 :わか:03/05/13 13:04
不況に負けていませんか?インターネットでお金を稼いで
人生をバラ色にして、年商1000万円ほど稼ぎませんか?
ただし、多少の営業努力が必要です。ノルマ無し、料金回収無し
クーポン屋 「2003年」
営業が得意な方は、年商1000万円稼げます。
私と仲良くビジネスをしませんか?
http://www.c-gmf.com/index1.htm
http://www.c-gmf.com/index2.htm
http://www.c-gmf.com/index3.htm
http://www.c-gmf.com/mail.htm
クーポン屋でございます。貴方のHPにバナーを貼るだけで
稼げます。本当にお金が欲しい方は、相談にのります。キャッシュバック制度!

825 :デフォルトの名無しさん:03/05/13 13:05
>>823
おまえもエラーだな
○yeaar
×yeear

826 :デフォルトの名無しさん:03/05/13 13:08
もう、いやーーーーーー

827 :デフォルトの名無しさん:03/05/13 13:29
>>819 勝俣のところ、括弧もう一個いらなかったけ?

828 :デフォルトの名無しさん:03/05/13 13:33
>>823
あなたの頭はどんな石で出来てますか?もしかしてコンパイラさんでっか?

829 :デフォルトの名無しさん:03/05/13 13:34
>>828
プ

830 :デフォルトの名無しさん:03/05/13 14:00
C言語でお願いします。

長さが32の0と1の列
se7e6…e1e0d1d2d3…d23
を入力してこのビット列の表す実数値

(-1)^s*(1+M)*2^E if -127<E<128
(-1)^s*M*2^(E+1) if E=-127
Inf(無限大) if E=128,M=0
NaN(非数) if E=128,M≠0
ここで、M=琶=1~23 di*2^-i , E=琶=0~7 ei*2^i−127

を出力するCプログラムを作成せよ。


831 :デフォルトの名無しさん:03/05/13 14:25
>>830
問題が理解できない

832 :デフォルトの名無しさん:03/05/13 14:36
馬鹿

833 :デフォルトの名無しさん:03/05/13 14:37
>>830
float
str2float(char *str)
{
  union strflo {unsigned int u; float f;} x; x.u = 0;
  while (*str != '\0'){x.u <<= 1; x.u |= *str++ == '1' ? 1 : 0;}
  return x.f;
}

#include <stdio.h>
int
main(int argc, char **argv)
{
  if (argc < 2 || strlen(argv[1]) != 32) return 1;
  printf("%.8e\n", str2float(argv[1]));
  return 0;
}

834 :デフォルトの名無しさん:03/05/13 14:42
>>833
ついでに、文字列のチェックも入れといて

835 :デフォルトの名無しさん:03/05/13 14:46
>長さが32の0と1の列
>se7e6…e1e0d1d2d3…d23

0と1の列とか言ってるけど、例はそうなってないし、ようわからんね。



836 :デフォルトの名無しさん:03/05/13 15:08
ああ、わかった。
つまり、たとえば以下のbit列を、
0 1  0  1011010101001001
~ ~  ~  ~
S e7 e6 e5...
とするって事か。

837 :デフォルトの名無しさん:03/05/13 15:34
>>833
intとfloatは同じ大きさなの?

838 :デフォルトの名無しさん:03/05/13 16:16
>>837
C言語では定義されていないInfやらNaNが指定されている時点で可搬ではない。

839 :デフォルトの名無しさん:03/05/13 18:39
>>838
ん?

840 :デフォルトの名無しさん:03/05/13 19:21
void main(void)
{
char x='A';
int a=5,b=32;
printf("@",x);
printf("%d+%d=(A)x\n",B)
printf("%dC%d=%d\n",D);
printf("変数%cの初期値は%dです\n",x+E,a);
}
実行結果
変数xの初期値はAです
5+32=(0025)x
32%5=2
変数aの初期値は5です
Eの答えがわかりません

841 :デフォルトの名無しさん:03/05/13 19:25
>>840

(-x)+'a'

842 :デフォルトの名無しさん:03/05/13 19:29
>>840
bなんだろうけど、>>841 にすべきだね。

843 :840:03/05/13 19:38
なるほど。ありがとうごさいます

844 :デフォルトの名無しさん:03/05/13 20:13
VCでapiのpeekmessage()を使って押された、
キーコードを2文字以上を、
同時に取れる事で出来るんですか?
また方法を教えていただけますでしょうか?

845 :デフォルトの名無しさん:03/05/13 20:15
ある乱数を発生させてそれぞれに条件式をつけるにはどうすればいいですか?

乱数で1から100までの数字を発生させて
1〜40ならA
41〜50ならB
50〜99ならC
100ならD
といったような具合に場合分けしたいときって どうすればいいんですかね?
1<X<40
こういった条件式をプログラム上で行いたいんだけど
良いほうが思いつかないもので

初心者的な質問ですんません
C言語限定ってわけではないけどアルゴリズムが知りたいので書きました
良かったら 教えてください




846 :デフォルトの名無しさん:03/05/13 20:18
>>845
あちこち同じカキコすんなや。

847 :デフォルトの名無しさん:03/05/13 20:26
>>845
int r=ransuu;
if(r<=40){A();}elseif(r<=50){B();}elseif(r<=99){C();}elseif(r==100){D();}

848 :デフォルトの名無しさん:03/05/13 20:27
お願いします。

「英文字を入力すると読み込んだ文字を 50 個横に並べて表示する」プログラムを作れ。

入力される文字は A 〜 Z で、1文字であると仮定して良い。たとえば、G を
入力すると、

GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

と表示されるようにする。

なお、入力された文字の検査(A 〜 Z以外の文字が入力されなかったかどうか、
1文字であるかどうかの検査)は行わなくて良い。

また、入力された文字が変数 moji に格納されている時、この文字を表示するには、

printf("入力された文字は %c です。\n", moji);

と書くことができることをヒントにしても良い。ただし、解答として、

printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c...

のように %c を 50 個並べることは禁止する。




849 :デフォルトの名無しさん:03/05/13 20:30
>>848
void print50char(int c){int i;for(i=0;i<50;i++)printf("%c");printf("\n");}

850 :デフォルトの名無しさん:03/05/13 20:32
>>845

x=(rand()/100)+1;
if (x >= 1 && x <= 40) {
} else if (x >= 41 && x <= 50) {
} else if (x >= 51 && x <= 99) {
} else if (x == 100) {
} else {
}

851 :デフォルトの名無しさん:03/05/13 20:36
>>848

char buf[51];
memset(buf,getchar(),50);
buf[50]='\0';
puts(buf);


852 :デフォルトの名無しさん:03/05/13 20:40
>>849,851
848はバカだから、scanfのところも書いておいてあげなきゃ
char moji; int i; scanf("%c",&moji); for (i=0;i<50;i++) printf("%c", moji);

853 :デフォルトの名無しさん:03/05/13 20:44
>>848

#include <stdio.h>

int main(void)
{
  int i;
  char c;

  c=getchar();
  for (i=0; i<50; i++)
    printf("%c", c);
  printf("\n");

  return 0;
}

854 :デフォルトの名無しさん :03/05/13 22:14
実行すると文章の行ごとに左右反対になるプログラムを
ファイル構造体を使って作成しなさい
asupugqaudga9という文だと9aduaqgupusaとなるようにしなさい
文章がはいってるのはahya.txtとします
(´・ω・`)?



855 :デフォルトの名無しさん:03/05/13 22:23
ab
cd

ba   dc
dc か ba か
どっち?

856 :デフォルトの名無しさん:03/05/13 22:26
>854
コンパイラを教えて

857 :デフォルトの名無しさん:03/05/13 22:28
>>856
icl

858 :デフォルトの名無しさん:03/05/13 22:39
お願いします

3ケタの数字でそれぞれのケタを3乗したものの和が
元の3ケタの数字と同じになるものを全て探すプログラムを作成しなさい。

859 :854:03/05/13 22:50
asupugqaudga9という文だと9agduaqgupusadesaですた・・・

860 :854:03/05/13 22:56
追記
./a.out ahya.txt result.txt と実行すると
ahya.txtの中のそれぞれの文章の行について左右反対にした
resulet.txtというファイルを作成するプログラムでつ
(´・ω・`)わかりにくかったね・・・


861 :初心者の名無しさん:03/05/13 23:03
>>858
if (pow(100の位 , 3) + pow(10の位 , 3) + pow(1の位, 3) == 元の数)
{
同じでした
}

862 :デフォルトの名無しさん:03/05/13 23:05
#include <stdio.h>
main(){
int dat,a[3];
scanf("%d",&dat);
a[0]=dat%10;dat/=10;
a[1]=dat%10;dat/=10;
a[2]=dat%10;/*datだけも良いかな*/
if((a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==dat)
printf("%d",dat);
return 0;
}


863 :デフォルトの名無しさん:03/05/13 23:07
>>858
#include <stdio.h>
int main()
{
  int i, j, k;
  int cube[10];
  int value100, value10, value;
  int sum100, sum10, sum;
  
  for (i = 0; i < 10; i++) cube[i] = i * i * i;
  for (i = 1; i < 10; i++) {
    value100 = i * 100;
    sum100 = cube[i];
    for (j = 0; j < 10; j++) {
      value10 = value100 + j * 10;
      sum10 = sum100 + cube[j];
      for (k = 0; k < 10; k++) {
        value = value10 + k;
        sum = sum10 + cube[k];
        if (value == sum) {
          printf("%d = %d + %d + %d\n", value, cube[i], cube[j], cube[k]);
        }
      }
    }
  }
  return 0;
}

864 :デフォルトの名無しさん:03/05/13 23:08
#include <stdio.h>
main(){
int data,dat,a[3];
for(data=100; data<1000; data++){
dat=data;
a[0]=dat%10;dat/=10;
a[1]=dat%10;dat/=10;
a[2]=dat%10;/*datだけも良いかな*/
if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==data)
printf("%d ",data);
}
return 0;
}


865 :デフォルトの名無しさん:03/05/13 23:22
4つでしょ?

866 :デフォルトの名無しさん:03/05/13 23:26
void reverseoutput(char *s, FILE *outfp)
{
    int i;
    for (i = strlen(s) - 1; i >= 0; i--)
        putc(s[i], outfp);
}

int main(int argc, char **argv)
{
    FILE *infp = stdin, *outfp = stdout;
    char buf[256];

    switch (argc) {
    default:
    case 3:
        if ((outfp = fopen(argv[2], "w")) == NULL) {
            fprintf(stderr, "connot open file: %s", argv[2]); exit(1);
        }
    case 2:
        if ((infp = fopen(argv[1], "r")) == NULL) {
            fprintf(stderr, "connot open file: %s", argv[1]); exit(1);
        }
    case 1:
        break;
    }

    while (fgets(buf, sizeof(buf), infp))
        reverseoutput(buf, outfp);

    return 0;
}

867 :デフォルトの名無しさん:03/05/13 23:41
What is >>866?

868 :デフォルトの名無しさん:03/05/13 23:57
改行の取り扱いに難あり。

869 :デフォルトの名無しさん:03/05/14 00:09
文字列を扱うための2つの変数string1とstring2をつぎのように初期化する。
この初期化の仕方は何が違うのか詳細に述べよ。
メモリ上で文字列を格納する領域の取り方に注意。
それぞれの変数に適した使い方についても考えてみること。
char string1[]="Good morning";
char *string2="Good night";

↑ってのが課題ででました。
ちんぷんかんぷんです。教えてください。

870 :デフォルトの名無しさん:03/05/14 00:16
Cの仕様書見れ。

871 :デフォルトの名無しさん:03/05/14 00:53
紀元後の任意の年、任意の月のカレンダーを表示する
プログラム組んでちょんまげ。


872 :デフォルトの名無しさん:03/05/14 00:54
>>869
ttp://www.catnet.ne.jp/kouno/c_faq/c6.html#0

873 :デフォルトの名無しさん:03/05/14 01:10
>>871
国は?
グレゴリオ暦の採用時期がそれによって大きく異なるのだが。

874 :デフォルトの名無しさん:03/05/14 01:15
>>871
http://www.linux.or.jp/JM/html/util-linux/man1/cal.1.html
を呼び出せ!

875 :871:03/05/14 01:45
日本です!

876 :デフォルトの名無しさん:03/05/14 01:48
ってことは、紀元ってのは西暦紀元じゃなくて紀元節の方か?
誰がそんなもん作るってのよ。

877 :デフォルトの名無しさん:03/05/14 01:50
>>876
まぁ、660を引くんだか足すんだかすればいいわけだし。
ちなみに、皇紀という呼称のほうが好きだ。

878 :デフォルトの名無しさん:03/05/14 01:51
>>875
4000年分ぐらいのテーブルつくれ。先生もきっと許してくれる。

879 :デフォルトの名無しさん:03/05/14 02:01
実行した日より一週間分の天気予報を表示するプログラムを作成せよ。
なお、あくまでも予想なのではずれてもよいものとする。

さっぱりわかりません(T_T)

880 :デフォルトの名無しさん:03/05/14 02:08
>>879
地球シミュレータをクラックすれば、何とかなるんじゃないか。
まずは socket の使い方から学べ。

881 :デフォルトの名無しさん:03/05/14 02:12
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
char w[] = {"晴","曇","雨"};
int i;
for(i=1;i<=7;i++)
printf("%d日後の天気は%sかも\n",i,w[rand()/(RAND_MAX/N+1)]);
return 0;
}

882 :デフォルトの名無しさん:03/05/14 02:24
>>879
1.天気予報のページを探して、そのページをブラウザで表示するシェルなどを作る。
2.上記のページをパースして、その情報を任意の方法で表示する。
3.”晴れ”,”曇り”,”雨”などの天候文字列を乱数で選んで表示する。

1:学生ならば不正解。社会人なら大正解。
2:ヒマと興味があるならおすすめ
3:普通だね

883 :デフォルトの名無しさん:03/05/14 03:06
>>871 間違っている所があるかも。
#include <stdio.h>
#include <stdlib.h>
int CheckUruuDosi(int year)
{if((year%4==0&&year%100!=0)||year%400==0)return 1;return 0;}
int main(void)
{
int a,i[2],y,m,d,w=0,u;char s[256];
const int day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
for(a=0;a<=1;a++)
{puts(a==0?"year?":"month?");gets(s);i[a]=atoi(s);
if(i[a]<=0||(a==1&&i[a]>=13))a--;}
for(y=1;y<=i[0];y++)for(m=1,u=CheckUruuDosi(y);m<=(y==i[0]?i[1]-1:12);m++)
w=(w+day[m-1]+(u&&m==2?1:0))%7;
u=CheckUruuDosi(i[0])&&i[1]==2?1:0;
puts("\nSun Mon Tue Wed Tur Fri Sat");
for(d=0;d<=w;d++)printf("%4s","");
for(d=1;d<=day[m-1]+u;d++)
printf("%3d%s",d,(d+w+1)%7==0?"\n":" ");
printf("\n\n改行を押してください 終了します");getchar();return 0;
}

884 :デフォルトの名無しさん:03/05/14 03:21
お願いします

inoue note 120
inoue envelope 80
inoue pencil 20
yamada note 120
yamada envelope 80
kawaguchi envelope 80
kawaguchi pencil 20
yamamoto note 100

という内容の、db.txtというファイルを用いて
品目、単価への射影を

note 120
envelope 80
pencil 20
note 100

のように出力させたいんです

射影とは関係表から属性を切り出し
もし重複があればそれを取り除いたものだそうです。

885 :858:03/05/14 03:26
#include <stdio.h>
main(){
int data,dat,a[3];
for(data=100; data<1000; data++){
dat=data;
a[0]=dat%10;dat/=10;
a[1]=dat%10;dat/=10;
a[2]=dat%10;/*datだけも良いかな*/
if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==data)
printf("%d ",data);
}
return 0;
}

で求める事ができました  協力頂いた皆様ありがとうございます

さらにここで見つけた解の個数も表示するにはどうすれば良いのですか。
結果は定数「4」でなく変数を用いて表すとするとどうなりますか、教えて下さい。お願いします。

886 :__:03/05/14 03:33
  ∧_∧  
 ( ・∀・)/< こんなの有ったっち♪
http://www.yoshiwara.susukino.com/moe/hankaku03.html
http://yoshiwara.susukino.com/moe/hankaku10.html
http://www.yoshiwara.susukino.com/moe/hankaku08.html
http://yoshiwara.susukino.com/moe/hankaku09.html
http://www.yoshiwara.susukino.com/moe/hankaku06.html
http://yoshiwara.susukino.com/moe/hankaku05.html
http://www.yoshiwara.susukino.com/moe/hankaku01.html
http://yoshiwara.susukino.com/moe/hankaku02.html
http://www.yoshiwara.susukino.com/moe/hankaku08.html
http://yoshiwara.susukino.com/moe/hankaku04.html

887 :デフォルトの名無しさん:03/05/14 03:44
if文の内でカウントすればええやろ

888 :858:03/05/14 03:47
>>887
もうすこし詳しく教えて下さいませんか?
カウントすれって言われてもピンと来ない程度なので。。。

889 :871:03/05/14 03:53
>>883
完璧でした!!まじありがとうございました。

890 :デフォルトの名無しさん:03/05/14 03:57
まいったなあ、カウントすれがわからないってか。
if文の内に入った回数を数えましょう、ならわかるか?

891 :デフォルトの名無しさん:03/05/14 03:59
>>890
ホントにわかんないです。。。
何使って書くのかさえわかんないです。。。

892 :デフォルトの名無しさん:03/05/14 04:03
>>891
1ずつ数えるなら変数の値に1足してゆく。


893 :デフォルトの名無しさん:03/05/14 04:08
(解の数)++って書けばよいのだと思うのですが、
解の数の表現方法がわかりません。。。

解というかif文に入った回数ですか?

あぁホント情けないです。。。

894 :デフォルトの名無しさん:03/05/14 04:16
解の数は0から899を表現できる型ならなんでもいいでしょ。
普通はint型を選ぶよね。
int 解の数;で宣言して、if文の内で(解の数)++てやって
最後に表示すればいいでしょ。

895 :デフォルトの名無しさん:03/05/14 04:20
if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==data)
printf("%d\n",data);
printf("%d個です",i++);}

ってやってみたらメチャクチャたくさん表示されるのはどうしてでしょうか?

896 :デフォルトの名無しさん:03/05/14 04:24
1. iは初期化してますか?
2. {}で囲まれていないif文の範囲はわかりますか?

897 :デフォルトの名無しさん:03/05/14 04:28
>>858
#include <stdio.h>
int SZ(int num){return num*num*num;}
int main(void)
{
int num[3]={0};int a;
for(;num[2]<=9;)
{
if(num[2]*100+num[1]*10+num[0]==SZ(num[2])+SZ(num[1])+SZ(num[0]))
printf("%d%d%d ",num[2],num[1],num[0]);num[0]++;
for(a=0;a<=1;a++)if(num[a]==10){num[a]=0;num[a+1]++;}
}
puts("\n改行を押してください 終了します");return 0;
}

898 :デフォルトの名無しさん:03/05/14 04:40
なるほど、わかりました。ありがとうございますです
if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==data)
{printf("%d\n",data);
printf("%d個目\n",i++);}
初期化の後、こうして記述すると個数が表示できました。

この場合の実行結果は
(数字)1個目
(数字)2個目
・・・・・・・・・・・
となりました。

ここで結果として「何個あったか」のみを表示するためにはどこをいじれば良いのですか?

899 :897:03/05/14 04:40
>>897
最後にgetchar()を付け忘れてました。
後、num[0]++が変な位置にありますが、前のifとは関係ありません。

900 :デフォルトの名無しさん:03/05/14 04:58
>>898
i++はif文の内に残して、for文の外でprintfすれば良い

901 :デフォルトの名無しさん:03/05/14 05:08
i++だけ残してっていうやり方が。。。 

うわぁ、、もう朝の準備せんと。。。 あとひといきお願いします!

902 :デフォルトの名無しさん:03/05/14 05:12
if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==data)
{printf("%d\n",data);
i++;}
}
printf("%d個\n",i);

903 :動画直リン:03/05/14 05:13
http://homepage.mac.com/hitomi18/

904 :デフォルトの名無しさん:03/05/14 05:26
>>902
できました! 長々とありがとうございました!

905 :デフォルトの名無しさん:03/05/14 07:14
インデントが気持ち悪いよぉ。

だから最初からifやwhileはブロックにしろと・・・

906 :デフォルトの名無しさん:03/05/14 07:29
indent style
ttp://wombat.doc.ic.ac.uk/foldoc/foldoc.cgi?indent+style

907 :こんぴゅーた-:03/05/14 10:11
ポインタ変数を使って作成しろって課題が出たんですが、
実行すると
文字列を入力してください:tokyo
反転文字列は"oykot"です.
ってなるようにプログラムを作成しなければならないのですが、
最近printfとかcharの使い方を最近になって理解したばっかなのに、
こんな課題出されてこまっております。
だれか救って下さい。ぼくはパソコンむいてないかも(*-*)

908 :デフォルトの名無しさん:03/05/14 10:41
/* >>907 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(int argc, char **argv)
{
  char buf[BUFSIZ];
  int n;

  fputs("文字列を入力してください:", stderr);
  fgets(buf, BUFSIZ, stdin);
  fputs("反転文字列は\"", stderr);
  for(n=strlen(buf)-1; n>0;) putc(buf[--n], stderr);
  fputs("\"です.\n", stderr);
  return 0;
}

909 :こんぴゅーたー:03/05/14 16:48
ありがとうごザいます。
やってみます

910 :デフォルトの名無しさん:03/05/14 16:51
>>908
末尾につくであろう改行文字を考慮しているんだろうけど、なんか・・ちょっと・・・

911 :デフォルトの名無しさん:03/05/14 17:23
おまえら、Windowsでは改行は\r\nだぞ。

912 :デフォルトの名無しさん:03/05/14 17:24
入出力関数がうまくやってくれる。

913 :デフォルトの名無しさん:03/05/14 17:38
俺もたいした技術じゃないけど、配列に順に入れて
ケツから出せばいいだけでは?

914 :デフォルトの名無しさん:03/05/14 17:48
>>913
>>908にはそう書いてあるようには見えないのか?

915 :デフォルトの名無しさん:03/05/14 18:38
私は907ではないんですが
こういうソースを書いたら上手くいきませんでした
どこがおかしいのでしょうか?

#include <stdio.h>
#include <string.h>

int main(){
char *str,*str1;
int len,i;

puts("文字列を入力して下さい");
gets(str);
len=strlen(str);
for(i=0;i<=len-1;i++){
*(str1+i)=*(str+len-1-i);
}
printf("反転文字列は %sです",str1);
return 0;
}

916 :デフォルトの名無しさん:03/05/14 18:41
>>915
コンパイラの警告は無視しないように。
str,str1が初期化されていないのに使われていると言われなかったか?

917 :デフォルトの名無しさん:03/05/14 18:48
char str[1000],str1[1000];

918 :デフォルトの名無しさん:03/05/14 21:11
while (1) {
if (a[i] == key)
break;
i++;
}

において、whileではなく、forを使うとどうなりますか?

919 :デフォルトの名無しさん:03/05/14 21:16
for(; a[i] != key; i++);


920 :デフォルトの名無しさん:03/05/14 21:22
for(;;) {
  if (a[i] == key)
    break;
  i++;
}

921 :デフォルトの名無しさん:03/05/14 22:08
ファイル処理の問題で、30行ほどの英文が書かれたunix.txtを1行ずつ逆に表示したresult.txtを作るプログラムをお願いします。(例:I am が ma I と表示される)

下のソースを改造するようなのですが・・・。

#include <stdio.h>

void main (void)
{
unsigned char moji[10];
FILE *fp;

if ((fp = fopen ("unix.txt", "r")) == NULL)
{
printf(" FILE OPEN ERROR\n");
}
else
{
if(fgets (moji , 2, fp) !=NULL)
{
printf ("FILE ROAD OK\n");
printf ("READ DATA -> %s\n", moji);
}

else
{
printf ("FILE READ ERROR\n");
}

fclose (fp);
}
}

922 :デフォルトの名無しさん:03/05/14 22:14
919さん、920さんありがとうございました。
こんな短いプログラムも書くことが出来ないなんてダメですよね。

ですが、もう1問だけ質問させてください。

要素数がnである配列aからkeyと一致する要素数の添え字を配列idxの先頭から
順に格納し、一致したよう素数を返す以下の関数を作成するという問題です。
272625という配列で2を指定すると3が導かれると言うものです。

int searchidx(int a[], int n, int key, int idx[]);

main関数は次の書き込みにします。


923 :デフォルトの名無しさん:03/05/14 22:14
int main(void)
{
int i, ky, idx;
int x[7];
int nx = sizeof(x) / sizeof(x[0]);

printf("%d個の整数を入力してください。\n", nx);
for (i = 0; i < nx; i++) {
printf("x[%d]:", i);
scanf("%d", &x[i]);
}
printf("探す値:");
scanf("%d", &ky);

idx = search(x, nx, ky);/* 配列xから値がkyである要素を線形探索 */

if (idx == -1)
puts("探索に失敗しました。");
else
printf("%dは%d個あります。\n", ky, idx + 1);

return (0);
}

924 :デフォルトの名無しさん:03/05/14 22:15
>>921
#include <stdio.h>
#include <algorithm>

void main (void)
{
unsigned char buf[32768];
FILE *fp;

if ((fp = fopen ("unix.txt", "r")) == NULL)
{
printf(" FILE OPEN ERROR\n");
}
else
{
while(fgets(buf , 32767, fp) !=NULL)
{
std::reverse(buf, buf + strlen(buf));
std::cout << buf << std::endl;
}

fclose (fp);
}
}

925 :924:03/05/14 22:16
#include <string.h>
#include <iostream>

入れ忘れた

926 :デフォルトの名無しさん:03/05/14 22:18
このスレだけでreverse問題は何問でてきたのか・・・・・

927 :デフォルトの名無しさん:03/05/14 22:19
>>922です。
補足すると線形探索でするそうです。

928 :デフォルトの名無しさん:03/05/14 22:20
>>921
適当にだけどこんな感じ?

void main()
{
char str[256];
int i;
FILE *fp;

if ((fp = fopen("unix.txt", "r") == NULL) {
printf("error\n");
exit(1);
}

while(fgets(str, 255, fp)) {
for (i = strlen(str - 1); i >= 0; i--) {
putchar(str[i]);
}
putchar('\n');
}

fclose(fp);
}


929 :デフォルトの名無しさん:03/05/14 22:21
>>921
良く読んでなかった。result.txt作るのね。

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <fstream>

void main (void)
{
unsigned char buf[32768];
FILE *fp;

if ((fp = fopen ("unix.txt", "r")) == NULL)
{
printf(" FILE OPEN ERROR\n");
}
else
{
std::ofstream ofs("result.txt");

while(fgets(buf , 32767, fp) !=NULL)
{
std::reverse(buf, buf + strlen(buf));
ofs << buf << std::endl;
}

fclose (fp);
}
}

930 :デフォルトの名無しさん:03/05/14 22:25
>>921
課題1
./a.out unix.txt result.txt と実行すると
unix.txtの各行について左右反対にしたresulet.txtというファイルを
作るようなプログラムを作成しなさい

もとの課題はこれ?

931 :デフォルトの名無しさん:03/05/14 22:26
>>928
訂正
fopenでresult.txtをwで開いて
fputcで書き込みかな

932 :デフォルトの名無しさん:03/05/14 22:28
>>922
int searchidx(int a[], int n, int key, int idx[])
{
  int i, j;

  j = 0;
  for (i = 0; i < n; i++) {
    if (a[i] == key) {
      idx[j] = i;
      j++;
    }
  }
  return j;
}

933 :デフォルトの名無しさん:03/05/14 22:32
>>931
ありがとうございます。ちょっとやってみます。

>>930
それですw

934 :デフォルトの名無しさん:03/05/14 22:34
>>905
#define p3(xx) (xx*xx*xx)
if(p3(a[0])+p3(a[1])+p3(a[2])==data)
{printf("%d\n",data);
i++;}
}
printf("%d個\n",i);


935 :デフォルトの名無しさん:03/05/14 22:39
>>933
>>860 見ろ。
おまいらの学校はどうなってるんだ?

936 :デフォルトの名無しさん:03/05/14 22:42
>>935
すいません、よく見てませんでした。以後気をつけます。

言い忘れてましたが>>929氏もありがとうございました。

937 :922:03/05/14 22:58
932さん、書き込みありがとうございます。

早速、関数を置き換えてみました。
ですが、呼び出し時のパラメータが足りないと出てしまいます。
たしかに3つしかSearchidx関数に渡していないのですが
解決方法が分かりません。
どうしたらいいのですか?

938 :922:03/05/14 22:58
int main(void)
{
int i, ky, idx;
int x[7];
int nx = sizeof(x) / sizeof(x[0]);

printf("%d個の整数を入力してください。\n", nx);
for (i = 0; i < nx; i++) {
printf("x[%d]:", i);
scanf("%d", &x[i]);
}
printf("探す値:");
scanf("%d", &ky);

idx = searchidx(x, nx, ky);/* 配列xから値がkyである要素を線形探索 */

if (idx == -1)
puts("探索に失敗しました。");
else
printf("%dは%d個あります。\n", ky, idx + 1);

return (0);
}

939 :デフォルトの名無しさん:03/05/14 23:01
3つしか受け取らない関数として書きなおすか
十分な領域を確保して関数に渡す。

940 :デフォルトの名無しさん:03/05/14 23:03
int searchidx(int a[], int n, int key, int idx[])
関数の定義では、引数を4つとることになっている。
idx = searchidx(x, nx, ky);
関数呼び出し時に引数が3つしか指定されていない。1つ足らない。

941 :デフォルトの名無しさん:03/05/14 23:04
939さんへ

もし、書き直すとすれば、main関数だけです。
何処を書き換えるのですか?

942 :デフォルトの名無しさん:03/05/14 23:05
>>922
これでどう?
int searchidx(int a[], int n, int key)
{
  int i, j;

  j = 0;
  for (i = 0; i < n; i++) {
    if (a[i] == key) {
      j++;
    }
  }
  return j;
}


943 :デフォルトの名無しさん:03/05/14 23:05
int hoge[7];
idx = searchidx(x, nx, ky, hoge);

944 :デフォルトの名無しさん:03/05/14 23:06
>>941
idx = searchidx(x, nx, ky);/* 配列xから値がkyである要素を線形探索 */



int *idxbuf = new int[x];
idx = searchidx(x, nx, ky, idxbuf);/* 配列xから値がkyである要素を線形探索 */
delete[] idxbuf;

945 :デフォルトの名無しさん:03/05/14 23:07
int searchidx(int a[], int n, int key)
{
return n?(searchidx(a+1,n-1,key)+(*a==key?1:0)):0;

946 :デフォルトの名無しさん:03/05/14 23:08
問題文で引数は4つと決められてるんでしょ?
じゃあ、呼び出し元がおかしいでしょ。

947 :デフォルトの名無しさん:03/05/14 23:09
>>944
int *idxbuf = new int[x];



int *idxbuf = new int[nx];

948 :941:03/05/14 23:18
皆さんのお力でどうにか解くことが出来ました。
短い時間にたくさんのご指導をありがとうございました。

全ての解答を試してスキルアップしてみます。

949 :デフォルトの名無しさん:03/05/14 23:44
>916
今、理解しました
ありがとうございます

950 :デフォルトの名無しさん:03/05/15 01:10
宿題でなくてもいいでしょうか。

951 :デフォルトの名無しさん:03/05/15 01:11
駄目です

952 :950:03/05/15 01:21
(。>0<。) びええん

953 :デフォルトの名無しさん:03/05/15 01:29
次スレを立てるプログラムはどう書きますか?

954 :デフォルトの名無しさん:03/05/15 01:35
Thread2ch thread("http://pc2.2ch.net/test/read.cgi/tech/1051594046/");
Board2ch board("http://pc2.2ch.net/tech/")
if(thread.GetResCount > 950)
{
 board.CreateNewThread(thread.GetTitle() + " Part2", thread.GetRes(1).GetBody());
}

955 :デフォルトの名無しさん:03/05/15 16:23
>>954
山崎渉

956 :デフォルトの名無しさん:03/05/15 16:28
Thread2ch thread("http://pc2.2ch.net/test/read.cgi/tech/1051594046/");
Board2ch board("http://pc2.2ch.net/tech/")

for(;;)
{
 thread.Update();
 if(thread.GetResCount() > 950)
 {
  board.CreateNewThread(thread.GetTitle() + " Part2", thread.GetRes(1).GetBody());
  break;
 }
 Sleep(300 * 1000);
}

957 :デフォルトの名無しさん:03/05/15 16:34
for(;;)
{

Board2ch board("http://pc2.2ch.net/tech/")
board.Update();
Thread2ch &thread = board.FindThread("C/C++の宿題", Thread2ch::latest);

for(;;)
{
 thread.Update();
 if(thread.GetResCount() > 950)
 {
  board.CreateNewThread(thread.GetNextPartTitle(), thread.GetRes(1).GetBody() +
   "前スレ:" + thread.GetURL);
  break;
 }
 Sleep(300 * 1000);
}

}

958 :958:03/05/15 20:18
1から5の総和を求めるプログラムを作成したが、下記のプログラムではうまく動かない場合が生じる。誤りを指摘し1行だけ直して正しいプログラムにしなさい。

int add(int);

int main(void)
{
add(1);
add(2);
add(3);
add(4);
printf(“%d\n”,add(5));
return 0;
}
int add(int n)
{
int sum;
sum += n;
return (sum);
}

お願いします。


959 :デフォルトの名無しさん:03/05/15 20:22
int sum; -> static int sum = 0;

こんな糞コード仕事で書くなよな。

960 :デフォルトの名無しさん:03/05/15 20:24
int add(int);

int main(void)
{
add(1);
add(2);
add(3);
add(4);
printf("18\n");
return 0;
}
int add(int n)
{
int sum;
sum += n;
return (sum);
}


961 :958:03/05/15 21:04
>>959>>960
ありがとうございました

962 :デフォルトの名無しさん:03/05/15 21:09
文字列sを逆順にして出力する関数void reverse(char s[])を作成しなさい。
関数strlenを用いてあらかじめ文字列sの長さを求めると容易。
お願いします。

963 :デフォルトの名無しさん:03/05/15 21:09
>>958
>>959のが普通だと思うけど、””が間違いだし、戻り値が役に立っていない。
笑ってしまう>>960のが正解っぽい。意地悪問題か?ただ、総和は15だと思う。

964 :デフォルトの名無しさん:03/05/15 21:15
ごめん。もうだめ。丸投げ。
for文かwhile文による繰り返しの問題です。

ボールを水平面に落とすと、元の高さの0.75倍の高さまで跳ね返る。
10回水平面にバウンドした後、最高地点に到達した瞬間までのボールの動いた
総距離を計算せよ。
初期高さは80mで、各回の高さも出力表示せよ

多分基本問題なんだろうけど、おながいします。

965 :964:03/05/15 21:16
あ、↑ふつうのCです。よろしくお願いします。

966 :デフォルトの名無しさん:03/05/15 21:18
ただの等比数列じゃねーか

967 :デフォルトの名無しさん:03/05/15 21:20
int x,y,t;
for(x=1; x<=10; x++)
{
   t = 80*0.75;
   printf("%d回目のバウンド時のボールの高さは%dです。\r\t",x,t);
}

コンパイルしてないし、漏れも初心者なのであってるかワカラン。
誰か上級者教えてくたされ


968 :デフォルトの名無しさん:03/05/15 21:26
#include <iostream>

main()
{
 double total = 0;
 double height = 80;
 for(int i=0; i<10; i++)
 {
  total += height;
  height *= 0.75;
  std::cout << i+1 << "回目" << height << "m" << std::endl;
  total += height;
 }
 std::cout << "合計" << total << "m" << std::endl;

}

969 :デフォルトの名無しさん:03/05/15 21:28
逆順が今の流行なのか?

970 :デフォルトの名無しさん:03/05/15 21:36
>>967-968
はやっ!ありがとうございます。たすかりました。



971 :デフォルトの名無しさん:03/05/15 21:37
>>969
同一学校と思われ

972 :デフォルトの名無しさん:03/05/15 21:46
普通のC

#include <stdio.h>

float bound( float height )
{
return height * 0.75;
}

int main( void )
{
float height = 80;
float total = 0;
int counter;

for( counter=0; counter<=10; counter++ ) {
if( 0 != counter ){
height = bound( height );
total += height;
}
total += height;

printf( "%2d回目 %f m\n", counter, height );
}

printf( "ボールの動いた総距離: %fm\n", total );

return 0;
}

973 :デフォルトの名無しさん:03/05/15 21:51
なぜdoubleではなくfloat?
なぜ片道しか加算しない?

974 :デフォルトの名無しさん:03/05/15 21:52
doubleはfloatよりメモリ消費が烈しいからだろ。

975 :デフォルトの名無しさん:03/05/15 21:54
>>972
出来ないならそんな無理しないで素直に>>968のcoutだけprintfに書換えとけよ。

976 :デフォルトの名無しさん:03/05/15 22:56
関数電卓のソースがあるところ知りませんか?

977 :デフォルトの名無しさん:03/05/15 23:28
#include<stdio.h>
#include<math.h>
int func(double param1,double param2,double *souka,double *soujou)
{
*souka = (param1+param2)/2;
*soujou = sqrt(param1*param2);
return 0;
}
int main(void)
{
double a,b,c,d;
scanf("%f %f",&a,&b);
func(a,b,&c,&d);
printf("相加平均%f 相乗平均%f",c,d);
return 0;
}

どこが間違っているのかが分からないんです!教えてください!

978 :デフォルトの名無しさん:03/05/15 23:46
>>977
doubleなら
%f→%lf

979 :デフォルトの名無しさん:03/05/15 23:46
C FAQを読みましょう。
scanfはdoubleに対しては%lfを使います。

980 :977:03/05/15 23:50
>>978>>979
助かりました!ありがとうございます!

981 :デフォルトの名無しさん:03/05/15 23:56
思い込みによるバグ注入だな。
電脳土方にはよくある事

982 :デフォルトの名無しさん:03/05/16 00:01
>>974
馬鹿?
たったの4バイトで「烈しい」と言うのか?
あぁ、変数が2つあるから8バイトか。
しかも、スタックは節約できても実コードは却って増える罠。

983 :デフォルトの名無しさん:03/05/16 00:06
普通のC
#include <stdio.h>
#include <math.h>
#define START 80
#define RATE 0.75
#define TIMES 10

double gettotalmove(double start,double brate,int ntimes)
{
double d = pow(brate,(double)ntimes);
return start * (1 + brate) * (1 - d) / (1 - brate);
}

int main(void)
{
int i;
for (i = 1;i <= TIMES;i++){
printf("%d times, bound = %f,total = %f\n",
i,START * pow(RATE,i),gettotalmove(START,RATE,i));
}
return 0;
}


984 :デフォルトの名無しさん:03/05/16 00:34
せめて
get_total_move
にしてホシイ

985 :デフォルトの名無しさん:03/05/16 00:39
>>984
漏れは字数が伸びてアンダースコア嫌い
GetTotalMoveにしてホシイ

986 :デフォルトの名無しさん:03/05/16 01:21
>>984
javaっ娘なのでgetTotalMoveにしてホシイ

987 :デフォルトの名無しさん:03/05/16 01:46
川合堂ライセンス(´_ゝ`)

988 :デフォルトの名無しさん:03/05/16 02:02
>>985
字数を気にしてる時点でまだまだだな
俺もjava風味でgetTotalMoveとかがいいかな?
getが修飾してるってわかりやすいし

989 :デフォルトの名無しさん:03/05/16 03:22
>>988
大文字小文字を混ぜるとき、先頭だけ小文字ではじめるのって、なんか利点があるんですか?

990 :デフォルトの名無しさん:03/05/16 05:03
>>989
文字の量をそのままに単語の区切りを指定できる。

991 :デフォルトの名無しさん:03/05/16 07:26
>>990
先頭だったら大文字小文字関係ないじゃん。


992 :デフォルトの名無しさん:03/05/16 07:29
カットオフを組み込んだクイックソートをプログラムとして実現せよ。ここで、要素数がM以下の部分ファイルに挿入整列法を使うものとする。そして、1000の要素のランダムなファイルに対して、最も速く走るようにMの値を定めよ。

問題の意味から教えて下さい。

993 :デフォルトの名無しさん:03/05/16 07:42
>>992
quicksort cutoff >google

994 :デフォルトの名無しさん:03/05/16 07:53
先頭小文字にするヤシは
JAVA厨ということでよろしいか?

995 :デフォルトの名無しさん:03/05/16 08:04
元に戻すちゃんねる

996 :デフォルトの名無しさん:03/05/16 08:20
1000

997 :990:03/05/16 08:29
>>991
ごめんなさい。読み間違えてました。
>>989
先頭を小文字にするのは僕の場合、ローカル変数とグローバル変数を分ける
ため。特に仮引数に小文字ロングネーム変数を使う。僕が使っているVC6は、
関数を呼び出した時その名前が出るのでと言うのもある。グローバル変数を
使ってはいけないと言う説もありますが。
ローカル:yCountNum グローバル:YCountNum 関数:YCountNum() マクロ:Y_COUNT_NUM

998 :デフォルトの名無しさん:03/05/16 08:34
        まもなくここは 乂1000取り合戦場乂 となります。

      \∧_ヘ     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!!       ,,、,、,,,
    /三√ ゚Д゚) /   \____________  ,,、,、,,,
     /三/| ゚U゚|\      ,,、,、,,,                       ,,、,、,,,
 ,,、,、,,, U (:::::::::::)  ,,、,、,,,         \オーーーーーーーッ!!/
      //三/|三|\     ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ∪  ∪       (    )    (     )   (    )    )
 ,,、,、,,,       ,,、,、,,,  ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ,,、,、,,,       (    )    (    )    (    )    (    )


999 :デフォルトの名無しさん:03/05/16 08:36
(´∀`)ノ ハロハロ〜!

1000 :デフォルトの名無しさん:03/05/16 08:36
:::::::::::::::::::::::::::::::::::::/       \::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::/         :::::::::::::::::::::::::::::::::
:::::::::::::::::...... ....::::::|            |::::::::::::.. ...: ::::::::
:. .::::::::........ . .:::::::::::::::::::         | ........... ..:::::
:::: :::::::::... . .... .. . ヽ          / . . . ... ..::::: . .. .
            \      /
               −ー
       ∧_∧                    ./^^^^\
      ( ´∀`)               .   /      ;、 \
      (つ日 )              ⌒⌒/', ' ',;'', ;'',; '',;' ',' \
      | | |           ⌒⌒⌒/ ,          、  \⌒⌒
 TTTTTTTTTTTTTT.            /          、     \
  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|      ⌒⌒⌒⌒⌒⌒⌒⌒⌒ヽ
              .|               '⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒
              .|                _      _
              .|    ',',',',', _  ,',',',',',' l^lニl ,',',',', l^lニl ',',',',',',',',',',',',',',',','
              .|     ',',' l^lニl ,',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','
1000ゲットは気持ち(・∀・)イイ!!

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

260 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)