(つД`)C/C++の宿題は私にやらせてよ!Ver12

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
今、高らかに2ゲットォ!
3C++bow ◆xcuyI0AVpc :03/08/13 01:51
夏休みの宿題は俺様がまとめて片づけてやる。
立てたのか
5高2:03/08/13 04:29
古典がわからないのですが・・・。
>>5
とにかく覚えなさい。
あと、お父さんお母さんを大事にしなさい。
7デフォルトの名無しさん:03/08/13 05:27
(^Д^)ギャハ!↑みなさん、この人のレスどう思いますか♪
なんてありきたりなんでしょうね♪
誰もが皆、一瞬つけてみたくなる発想のレスです♪
しかし、賢明な人はその自らの短絡的思考を野放しにする事を嫌がり、
こういうレスは控えます♪
しかし、この人はしてしまったのです(^^;ワラ
「誰もが思い付くような事」を堂々と♪
この人にとってこのレスは何なのでしょうか♪
このレスをしている間にも時間は刻々と 過ぎ去っているのです♪
正にこの人のした事は「無意味」「無駄」でしかありません♪
ああ・・・何ていう事でしょう(^^;ワラ
図星で泣いちゃうかも(^^;ワラ
(^^;ワラ♪
使い古しのコピペネタを、一斉にトマトの対象にしたら楽しそうだよな
Д←これとか∀←これとかな。
∀ε∃δ:0<|x-x_0|<δ⇒|f(x)-f(x_0)|<ε
>>11
懐かしいなヲィ(藁 現役学生か?
13デフォルトの名無しさん:03/08/13 22:19
「正の整数を入力し(その値が入力された時は再入力する事)、
その値が奇数であれば、1からその値までの奇数の和を、
偶数であれば、2からその値までの偶数の和を求めるプログラムを作成せよ。」
という問題を教えてください!!
14デフォルトの名無しさん:03/08/13 22:20
>>13
はい!



わかりません!!!
15デフォルトの名無しさん:03/08/13 22:22
>>13
正の整数が入力されたら再入力させるのか?
1613:03/08/13 22:26
すみません、「その値」ではなく、「負の値」でした・・・。

実行結果には

正の整数:-5
正の整数を入力してください。
正の整数:0
正の整数を入力してください。
正の整数:21
1から21までの奇数の和は121です。

、となってます。
>>13
if文とfor文とwhileがわかってればできるだろ。
18デフォルトの名無しさん:03/08/13 22:32
>>13
テストしていないからだめかも。

#include <stdio.h>

int main()
{
int i,n,total=0;
do{
printf("正の整数:");
scanf("%d",&n);
}while(n<0);
for(i=n&1?1:2;i<=n;i+=2)
total+=i;
if(n&1)
printf("1から%dまでの奇数の和は%dです。\n",n,total);
else
printf("2から%dまでの偶数の和は%dです。\n",n,total);

return 0;
}
19デフォルトの名無しさん:03/08/13 22:33
winsockを使った簡単な通信プログラムを作っているのですが
クライアントとサーバの通信がうまく出来ません。

状況は
1.サーバはacceptまで完了している
2.クライアントはconnectまで完了している
3.クライアントはsend関数を実行して正常終了を示す値『送信したバイト数』を返している。
4.サーバはrecv関数を実行してもエラーを示す値『SOCK_ERROR』を返し続ける
です。どうか教えて下さい
listen socketをrecvしているオチではなかろうな。
とりあえず、WSAGetLastErrorでもっと詳細なエラーを取れ。
2118:03/08/13 22:36
}while(n<0);は}while(n<0&&printf("正の整数を入力してください。\n"));だな。
>>19
たぶんお前に足りないのはethereal
まずは騙されたと思ってインストールしてみろ
23デフォルトの名無しさん:03/08/13 23:06
>>20
とりあえずエラーコードは出て来たのですが、どのコードかわかりませんでした。
WSAEBADF,WSAENOTCONN,WSAENOTSOCK
とりあえずこの三つのコードではありませんでした。

「listen socketをrecvしている」とはどう云う事なんでしょうか?
24デフォルトの名無しさん:03/08/13 23:36
解決しました!
>>20様がおっしゃってた通り
accept(sockdisp,(LPSOCKADDR)&add,&add_len);
recv(sockdisp,mes,sizeof(mes),0);
とやってる事が原因でした
(^_^;)(^_^;)(^_^;)
26デフォルトの名無しさん:03/08/14 02:14
このような問題なのですが、

整数を入力して、正か0か負かを判断し、結果を表示する処理を
5回繰り返すプログラムを作成してください。

while文と、for文と、do〜while文のどれを使えばよいのか
よく分かりません。
どれでもよい様な気もしますが、違いもイマイチよくわかりません。

>5回繰り返す
なら、forを使うのが普通、かな。
おやすみ
2926:03/08/14 02:41
forを使うとすると、

#include <stdio.h>
int main(void)
{
int n,i;

n=5;
for(i=1;i<=5;i=i+1){

みたいな形になるのでしょうか?
さっぱりわかりません・・・
そのnに何の意味が
#include <stdio.h>
int main()
{
int i=5,n;
while(i--){
printf("さっさと入力しろ:");
scanf("%d",&n);
printf("%dはおそらく%sだな\n",n,n>0?"正":n<0?"負":"0");
}
return 0;
}
3226:03/08/14 02:51
5回目まで繰り返すから、n=5って思ったのですが、
i<=5で定義しているからいらないんですかね?
それとも、そもそも
int n,i; のところからいらないのでしょうか?

すみません、C言語を言うものを始めてから
日が浅いので、何がなんだかです。


>>30>>32
nって入力先だろ?

ちなみに一例>>31
3426:03/08/14 03:00
すみません、%s というのと、? というのが
まだ習ってなくて意味がよくわかりません。
どういう意味なのでしょうか?
>>34
じゃあ習っていそうな範囲で。

#include <stdio.h>

int main()
{
int i,n;

for(i=0;i<5;i++){
printf("数字を入力:");
scanf("%d",&n);
if(n>0)
printf("入力された数は正\n");
else if(n<0)
printf("入力された数は負\n");
else
printf("入力された数は0\n");
}

return 0;
}
3626:03/08/14 03:12
>>35
 あ、なんか分かりました!
 そういう様なの、今日(もう昨日か)少し習いました。
 夜遅くにご親切にありがとうございました!!
ポインターの勉強中なんですが
以下のソースがうまく動かなくて悩んでいます。
どなたか、添削して頂けないでしょうか?

#include <stdio.h>
int main(void)
{
 char *str,*cmp;
 nt cnt=0;
 printf("文字列入力 :");
 gets(str);
 printf("検索文字入力:");
 scanf("%c%*c",cmp);
 for(;*str!='\0';str++){
  if(*str==*cmp) cnt++;
 }
 printf("%cの出現回数 :%d回\n",*cmp,cnt);
 return 0;
}

症状としては、最初の文字列入力直後に終了してしまいます。
tekitouninyuuryo なら無問題なんですが
tekitouninyuuryok や tekitouninyuuryoku だとダメです。
文字数が多いとダメなんでしょうか・・・
3837:03/08/14 04:03
あっ、訂正です。
× nt=cnt;
○ int=cnt; です。
よろしくお願いします。m(_ _)m
そのstrはどこを指しているの?
strの先に領域を確保しておかないとだめ。

ポインタと文字列の扱いについて勉強しなおせ。
4037:03/08/14 06:16
>39
レスありがとうございます。
アソコが悪い、ココが間違ってるとかぢゃなく
根本的に間違ってたんですね。
文字数が少ない場合はコンパイル&実行出来てたんで
部分的に間違ってるのかと思ってました・・・

顔洗って出直してきます。
41デフォルトの名無しさん:03/08/14 07:37
C言語の宿題なのですが、
「整数を入力し、その値の桁数を表示するプログラムを作成せよ、
 ただし、log関数等は用いないで、繰り返し処理を用いよ」
という問題です。

 どなたか教えてくださいませ。
>>41
#include <stdio.h>
int main(void)
{
int i, n;
scanf("%d", &n);
for (i = 1; n /= 10; ++i);
printf("%d\n", i);
return 0;
}
43デフォルトの名無しさん:03/08/14 11:07
宿題なんですが、どうにもこうにも・・な状態です。
本当に困っております。どなたか組みあげてはくれませんでしょうか。
解答はここか、メールでお願いします。[email protected]

http://www.geocities.co.jp/PowderRoom-Rose/9814/final_project.htm
▲オリジナル問題(英語)
http://www.geocities.co.jp/PowderRoom-Rose/9814/hw.html
▲意訳問題(日本語)

どうぞよろしくです。
>>41
#include <stdio.h>
#include <ctype.h>

int main( void )
{
    char b[ 256 ], *s, *t;

    fgets( b, sizeof( b ), stdin );
    for( s = b ; *s != '\0' && ! isdigit( *s ) ; s ++ )
        ;
    for( t = s ; isdigit( *t ) ; t ++ )
        ;
    printf( "%d\n", t - s );
    return 0;
}
int number_of_digits(int value) {
if (value == 0) {
return 1;
} else {
int digits;
for (digits = 1; (value /= 10) != 0; ++digits)
;
return digits;
}
}
>>43
なんか、面白そうだな。。。

とりあえず、問題をよく読んでみるか。
ところで、この問題文以外に与えられた条件や資料とかはないのか?
47デフォルトの名無しさん:03/08/14 14:41
>>43
・・・しかし、いい加減な訳だな(w

せめて、オリジナルの問題の回答が欲しいのか、
意訳問題(?)の回答が欲しいのか、明確にしれ。
>>46
英語の問題がオリジナルなので、特に他には与えられた条件、資料はないです。

>>47
意訳の方がお手数かけずにできると思います。意訳の方でよろしくお願いします。
ねぇねぇ、Cって何年生から授業にでるの?
うちは未だワープロの早撃ちしか習ってないばい
下の問題なんですが

<処理内容>
ポインタを用い変数a・bの内容を合計し表示せよ。
但し、結果表示はprintf("a+b=%d\n",c); で行うものとし、
変数cへの代入は禁ずる(c=a+b c+=a c+=b等)。
 a・bの値は次の通りとする。 int a=30,b=40; 
<出力様式>
a+b=70

代入せずに合計を求めるってのが解かりません。
int a=30,b=40,c,*pa,*pb;
pa=&a,pb=&b,c=(*pa)+(*pb);
でも、代入してる事に変わりはないし・・・
代入せずに合計を求めるなんて事が出来るんでしょうか?
#include <stdio.h>

#define c *pa+*pb

int main(){
 int a=30,b=20;
 int *pa=&a,*pb=&b;
 printf("a+b=%d\n",c);
 return 0;
}
void add(int *x, int y)
{
    *x += y;
}
int main(void)
{
    int a = 30, b = 40;
    int c = 0;
    add(&c, a);
    add(&c, b);
    printf("a+b=%d\n", c);
    return 0;
}
53デフォルトの名無しさん:03/08/14 19:48
p = &c;
*p = a + b;
pのポイント先がcである限り*pはcそのものだろう
だからこれへの代入は題意を満たさない
55デフォルトの名無しさん:03/08/14 19:57
出題の意図は直接代入せずにポインタを使って代入しろってことじゃないの?
p=&c; *p=aでcと名前を付けられた領域にaの内容が入るが、別にcに代入するわけではない。
*(&c) = a + b;
>>56
>...,if it points to an object,
>the result is an lvalue designating the object.
つまり*の結果はポイント先のオブジェクト
>>58
cに代入というのはc=a;こういうのを言う。
間接的に代入するというならポインタを介してもいいけど。
>cに代入というのはc=a;こういうの(だけ)を言う
無理があるね。変数は配列や動的確保もある
61デフォルトの名無しさん:03/08/14 20:46
配列に代入してくれ。
int a[20];
a[15]=3;/* *(a+15)=3 */
63デフォルトの名無しさん:03/08/14 21:04
54とかは50の問題にどう答えるんだ?
6463:03/08/14 21:09
こうか

#include <stdio.h>

int main()
{
int a,b,c,d;
int *pa=&a,*pb=&b;

/* 省略 */

d=*pa+*pb;
#define c d;
printf("a+b=%d\n",c);

return 0;
}
65デフォルトの名無しさん:03/08/14 21:09
#define c (a+b)
6664:03/08/14 21:09
うっかりセミコロンつけちまった
#define c d
>>65
ポインタは?
>>64
>>51と大差ない

この問題の表現自体に不備があるのだからどうしようもないな。
間接代入がいいなら>>57を少しかえて*(&c)=*(&a)+*(&b);でいい事になるし。
もちろんよくある問題だからここにいる奴らは出題者の意図を完全に
分かっているだろうが、解く側がわざわざ行間を読む親切をするわけがない
6950:03/08/14 22:23
>51-68
皆さんのレスを読んでいて、私が一番最初に書いた

int a,b,c,*pa,*pb;
pa=&a,pb=&b,c=*pa+*pb;

で、正解なんじゃないかという気がしてきました。
>68氏の言うとおり、問題文が言葉足らずな印象は否めませんが・・・

レスして下さった皆さん、ありがとうございました。m(_ _)m
70デフォルトの名無しさん:03/08/15 00:06
こんばんは。
(1)整数の一次元配列を1,5,3,9,4で初期化し、配列の数値を空白で
区切って表示するプログラムを作成せよ。
(2)整数の一次元配列を1,5,3,9,4で初期化し、配列の数値を逆順に空白で
区切って表示するプログラムを作成せよ。
という問題です。

(1)の方を

#include <stdio.h>
int main(void)
{
int k[5]={1,5,3,9,4};
int n;

for(n=0.n<5;n++){
printf("%d ",k[12]);
}
printf("\n");
return(0);
}

という風に考えました。
でも何がなんだかさっぱり分からなくて、
何がいいのか分かりません。
どなたか教えてください!
>printf("%d ",k[12]);
k[12]の12はどう考えて出てきたんだ?
非常に興味深いから教えてくれ。解答はそれからだ
72デフォルトの名無しさん:03/08/15 00:13
>>71

  すみません、k[12]ではなく、k[5]です。
  あと字下げしてるつもりですが、書き込まれると、全然下がって
  ないです。 

>>72
k[12]よりは劣るがk[5]でも興味深い。なぜ5と書こうと思ったのだ?
74デフォルトの名無しさん:03/08/15 00:19
  初期化する数値?が5つあるからK[5]かと思ったのですが、
  全く見当はずれなのでしょうか?
  何があっているのか、そうでないのかも全然分かりません・・・

面白すぎるぞ。
76デフォルトの名無しさん:03/08/15 00:23
printf("%d ",k[5]);
じゃなくて、
printf("%d ",k[n]);
ですか?
何がおもしろいか分からないです・・・

>>74
配列の添え字は「0」から始まるよ。
>>74
なるほど全く分かっていない。ではまず配列からだな
配列というのは添え字でアクセスできる一連の変数のことだ。
そしてint k[5];というのは5個の変数の利用を宣言する。
そのそれぞれはk[0],k[1],k[2],k[3],k[4]である
空白で区切らなくていいの?
80デフォルトの名無しさん:03/08/15 00:33
[]の中の0,1,2,3が添え字なのですね。
%dのあとに空白を作ったつもりなのですが、これも違いますか?
>return(0);
returnは関数ではないから、()は無用
スマソ。\t使うかと思ってた。
とりあえずこれで(1)はできたわけだ
84デフォルトの名無しさん:03/08/15 00:53
k[5]の範囲がk[0],k[1],k[2],k[3],k[4]なのですね。
それは
#include <stdio.h>
int main(void)
{
int k[5]={1,5,3,9,4};
int n;

for(n=0.n<5;n++){
printf("%d ",k[n]);
}
printf("\n");
return(0);
}

の中のint k[5]={1,5,3,9,4};
でk[0]が1、k[1]が6に対応という考え方でいいのですか?



>returnは関数ではないから、()は無用
そうだったんですか。目からうろこが落ちました。

return0;
86デフォルトの名無しさん:03/08/15 00:55
k[1]が6ではなくて、5です。
>>84
6ってのはどっからひねり出してきたんだ?
>>84
リストを指定して宣言時に初期化するのは後で
k[0]=1;k[1]=5;k[2]=3;k[3]=9;k[4]=4;
とするのとほぼ同じ事
89デフォルトの名無しさん:03/08/15 00:57
>>87 5の打ち間違いでした。
モチツケ
初期化の意味を取り違えてますね。
問題の行間をよく読んでください。

k[1]=0;
k[5]=0;
k[3]=0;
k[9]=0;
k[4]=0;
>>85
return 0;
93デフォルトの名無しさん:03/08/15 01:08
>>91 すみません,初期化自体がもうよくわからないんです。
   なぜそのようになるのですか? 
>>93
あぁ、予想通りこの言葉を使うことになっちゃったな・・・。それは仕様です。
>>70
for(n=0.n<5;n++){
ではなくて,
for(n=0;n<5;n++){
だな.

> int k[5] = {1,5,3,9,4}; でk[0]が1、k[1]が6に対応という考え方でいいのですか?
6っていうのはどこから出てきた?

int k[] = {1,5,3,9,4};
というのは,
int k[5];
k[0]=1;
k[1]=5;
k[2]=3;
k[3]=9;
k[4]=4;
と同じこと.
96デフォルトの名無しさん:03/08/15 01:16
>>91こそ、初期化がなんたるかわかって無い
97デフォルトの名無しさん:03/08/15 01:16
仕様??そういう決まったやり方ということでしょうか?
>>91 は釣りでしょ.
99デフォルトの名無しさん:03/08/15 01:22
k[0]=1;k[1]=5;k[2]=3;k[3]=9;k[4]=4;
というのは文のどこかに入れるのですか?
>>95
代入と初期化は違う

ということを96は言いたいんだね。
>>99
それは,int k[] = {1,5,3,9,4}; の別な表現だから,入れる必要はありませ
ん.

>>100
しかし,0 を代入することが初期化,というのもおかしいと思うが.
for(n=0;n<5;n++)
printf("%d ",k[n]);
for(n=4;n>=0;n--)
printf("%d ",k[n]);
ってだけの単純な問題でなぜここまでのびる・・・
>>101
> しかし,0 を代入することが初期化,というのもおかしいと思うが.
無論
104デフォルトの名無しさん:03/08/15 01:27
では、(1)は、

#include <stdio.h>
int main(void)
{
int k[5]={1,5,3,9,4};
int n;

for(n=0;n<5;n++){
printf("%d ",k[n]);
}
printf("\n");
return(0);
}

でいいのでしょうか?
>>104
いいかどうかは,自分でコンパイルして確かめればよいのでは.
106デフォルトの名無しさん:03/08/15 01:29
107デフォルトの名無しさん:03/08/15 01:32
初期化とは
変数を宣言するときに変数内部の状態をある値にすることである

間違ってたらごめ〜んっね
108デフォルトの名無しさん:03/08/15 01:32
>>105 すみません、私のパソコンはコンパイルできる環境がないので,
    今自分では分からないのですよ。。。
109デフォルトの名無しさん:03/08/15 01:34
>>108
オンラインコンパイルサービスを使え。
>>108
とりあえず,それで動作しますよ.

return 0; にしろっていう忠告はスルーですか?

こんな感じで書くとよりプロっぽいけど(w

1 #include <stdio.h>
2
3 int main(void)
4 {
5 int k[]={1,5,3,9,4};
6 int n;
7
8 for (n=0; n<sizeof(k)/sizeof(k[0]); n++){
9 printf("%d ", k[n]);
10 }
11 printf("\n");
12
13 return 0;
14 }
111デフォルトの名無しさん:03/08/15 01:47
>>110 ご親切にありがとうございます。
    私は単位をとるために数日間だけC言語の授業を
    受けているもので、あんまり詳しい事はわかりません。。。

    8行目のsizeofというのはまだ習ってないのでよく分かりません。
    あと、教授がとりあえず最後の方に return(0);
とつけなさい!!と言っていたので、それにしてたわけで、
    皆さまのご忠告を無視したわけでは決してありません。
112デフォルトの名無しさん:03/08/15 01:49
   ∧ ∧ 
  (# ゚Д゚)
 (_UUノ 
>>110
構文エラー : ';' が、識別子 # の前に必要です。
114デフォルトの名無しさん:03/08/15 02:07
>>110
return 0; のメリットって何ですか?
 return( 0 ) の方が検索するとき便利なんですけど…
>>113
行番号はとれよ.

#include <stdio.h>

int main(void)
{
int k[]={1,5,3,9,4};
int n;

for (n=0; n<sizeof(k)/sizeof(k[0]); n++) {
printf("%d ", k[n]);
}
printf("\n");

return 0;
}

ちなみに,for の所を↓に変えれば (2) の答.

for (n=(sizeof(k)/sizeof(k[0]))-1; n>=0; n--) {
>>114
k[0]と書くのにk[(0)]と書くようなもの。ただの無駄
118デフォルトの名無しさん:03/08/15 02:20
if( 0 == Value ) と似てますね。どうも。
小文字だけの関数名なんか付けないから私には意味がありませんが。
恥をしのんでお尋ねします。
某参考書の演習にある、「符号無し整数xを右にnビット回転した値を返す関数」
の作り方が全く分かりません。
近所の本屋にあるC関連の参考書を見たのですが、載っていませんでした。
ご存知の方、どうかご教授願います。
120+++:03/08/15 04:12
>>119
unsigned int ror( unsigned int x, int rn ){
int bitwidth = sizeof( int ) * 8;
unsigned int tmp = x;

rn %= bitwidth;
tmp <<= bitwidth - rn;
x >>= rn;

return tmp | x;
}
こういうのでいいんじゃなかろか。
>>120
すばらしい!
処理系依存の部分に手を入れれば完璧。
>>43
しかし、この
probability_of_arrival lane 1 (car): 0.8
て奴は「1秒間のうちに lane 1 に car が出現する確率」
って解釈でいいのかな?

サンプルの条件で実行すると、かならず超々渋滞になってしまう・・・

The simulation should keep track of the number of vehicles
that passed through the intersection and the average time that vehicles wait.

お前、ただ「平均値を出せ」言いたいだけちゃうんかと(w
if(ror(1,-1)==(1<<1)) /*おめでとう*/; else /*残念でした*/;
124山崎 渉:03/08/15 15:17
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
125119:03/08/15 17:37
ご回答ありがとうございます。
正直、私には、ぱっと見ただけでは仕組みが理解できませんが、
あとでじっくり理解していこうと思います。

本当にありがとうございました。
126デフォルトの名無しさん:03/08/15 20:07
age
127デフォルトの名無しさん:03/08/16 00:21
アドバイスお願いします。
構造体の中に配列を宣言して、その配列に初期値を設定したい場合、
1つ1つ値を代入(a->b[0]=7;みたいな)するしか方法はないのでしょうか?
配列の数が少なければ、それでも困らないのですが、
要素数が100個ぐらいある場合に、スマートに書く方法はないでしょうか?
memcpy()
struct has_array{int a[50];}proto_has_array={{1,2,3,4,5,6,7}};

struct has_array s={{3,4,6,7}},t=proto_has_array;
struct has_array *p=(struct has_array*)malloc(sizeof(struct has_array));
*p=proto_has_array;

好きなように
130127:03/08/16 01:11
>>129
ありがとうございます。
1行目の書き方で、やりたかったことはできそうなのですが、
↓は意味がちょっとわかりません。
> struct has_array s={{3,4,6,7}},t=proto_has_array;

ここでsとtは何を意味しているのでしょうか?
struct has_array型の変数(の初期化)
132デフォルトの名無しさん:03/08/18 07:26
誰もカキコしていないぞ(゚Д゚)
133デフォルトの名無しさん:03/08/18 14:47
(゚д゚)
134あぼーん:あぼーん
あぼーん
入力系の関数(scanfとかgetcharとかgetcとかgets)や
出力系の関数(printfとかsprintfとかputcとかputs)等の
使い分けの指針ってのは、あるんでしょうか?
やっぱり、「人それぞれだから一概には答えられない」って事に
なっちゃうんでしょうか?
136デフォルトの名無しさん:03/08/18 22:53
>>134
こいつまじヤバイのでは?削除依頼ケテーイ?
137デフォルトの名無しさん:03/08/18 23:02
1:フェルマー法
アルゴリズム(フェルマー法): 予め決められた整数L と判定対象の整数p に対して以下を実行.
p = 素数の候補;
以下をL 回繰り返す{
1 < a < p なるa をランダムに生成;
if ( a p-1 mod p ≠ 1 ) p は素数でない;
};
p は多分素数;

2:ラビン法
アルゴリズム(ラビン法): 予め決められた整数L と判定対象の整数p に対して以下を実行.
p = 素数の候補;
p = 1 + 2kw を満たすk とw を計算(ただし, w は奇数);
以下をL 回繰り返す{
1 < a < p なるa をランダムに生成;
y = aw mod p;
j = 0;
while ( ( j < k ) and ( y ≠ 1 ) and ( y ≠ p-1 ) ) {
y = y 2 mod p ;
j = j+1;
if ( ( j = k ) or (( j > 0 ) and ( y = 1 )) ) p は素数でない;
};
p は多分素数;

138デフォルトの名無しさん:03/08/18 23:02
上の残り
3:ソロベイ・ストラッセン法
アルゴリズム(ソロベイ・ストラッセン法): 予め決められた整数L と判定対象の整数p に対して以
下を実行.
p = 素数の候補;
以下をL 回繰り返す{
1 < a < p なるa をランダムに生成;
if ( p mod a p) | (a 1)/2 (p- 1 ) p は素数でない;
p は多分素数

引数nを与えた時に以上の3つの方法それぞれで素数かを判定する関数を作れだってさ。
んなん無理じゃ!!こんな宿題俺らのようなアホにできるわきゃない。
どこぞの神、手を差し伸べてくれ。(注・試行回数は定数で変えられるようにしてチョ)
あと、過去ログにありそうだけどあったらごめんチョ
>>137-138
今、作っているんだけど、式の部分が曖昧だな。

1) a p-1 mod p は、 a^(p-1) mod p
2) p = 1 + 2kw は、 p = 1 + (2^k) w

などなど。
きちんとした式を調べてみるが、面倒なので、正しいものの再掲を望む。
>>134
scanf   エラーチェックなどに問題があり、あまり使わない。
      fgets(,,stdin)+sscanfを使う。
getchar  終了時にドス窓が勝手に閉じてしまうのを防ぐために使う事も。
getc    ファイルから1文字だけと言うのは無いので使ったことが無い。
      fgets、fread、fscanf(読み込むものが決まっている)を使う。
gets   受け取る配列からはみ出す場合があるのであまり使わない。
     fgets(,,stdin)を使う。
printf  多用する。
sprintf  数値を文字列にしたい時などに使用。
putc   getcと同じ理由で使ったことが無い。
     fputs、fwrite、fprintfを使う。
puts   puts("")として改行に使う。
142デフォルトの名無しさん:03/08/19 00:58
2×3行列の形で部屋a〜fがある。(1列目が左からabc、2列目が左からdef)
そこに1〜6の番号のついた部屋を割り当てて部屋間距離×物流量の値が最も小さく
なるときがいくつかを求めるプログラムを示せ、ただし部屋間距離は直行距離とする。
という問題なんですが、どうすればよいかがわかりません。いちお作ってみたのです
が、ネットで調べたダブルソート(?)というのを使ってみたんですけどこの問題
では使ってもダメみたいなので行き詰まってしまいました。とりあえず下にソースを
貼ってみるので教えて頂きたいです。ちなみにC言語でヒントは部屋1〜6を割り当て
る順列を考えろ、とのことです。
143デフォルトの名無しさん:03/08/19 00:59
#include <stdio.h>
int main()
{
int a,i,j;
int data[15],min,sum;
for (i=0; i<15; i++){
printf("data nyuryoku");
scanf("%d",&data[i]);
}
min=data[0]*1+data[1]*2+data[2]*1+data[3]*2+data[4]*3+data[5]*1+data[6]*2+data[7]*1
+data[8]*2+data[9]*3+data[10]*2+data[11]*1+data[12]*1+data[13]*2+data[14]*1
for (i=0; i<14; i++){
for (j=0; j<15; j++){
if(data[j]>data[j+1]){
a=data[j];
data[j]=data[j+1];
data[j+1]=a;
sum=data[0]*1+data[1]*2+data[2]*1+data[3]*2+data[4]*3+data[5]*1+data[6]*2+data[7]*1
+data[8]*2+data[9]*3+data[10]*2+data[11]*1+data[12]*1+data[13]*2+data[14]*1
if(min>sum){
min=sum;
}
}
}
}
printf("min=%d\n",min);
}
144デフォルトの名無しさん:03/08/19 01:00
data[j+1]=a;
sum=data[0]*1+data[1]*2+data[2]*1+data[3]*2+data[4]*3+data[5]*1+data[6]*2+data[7]*1
+data[8]*2+data[9]*3+data[10]*2+data[11]*1+data[12]*1+data[13]*2+data[14]*1
if(min>sum){
min=sum;
}
}
}
}
printf("min=%d\n",min);
}
145デフォルトの名無しさん:03/08/19 01:00
puts   puts("")として改行に使う。
>142
物流量の定義がないが。入力させるのか?
6!(720)通りをブルートフォースで潰せば終わる問題ではないのか?
147137:03/08/19 01:12
>>141
ここからじゃないけど、内容が同じだ!!て事は俺が見たサイトは
パクリ?
>>139
→参照してくだチャイ >>141
148デフォルトの名無しさん:03/08/19 01:14
>146
すみません、物流量は入力させます。
 1 2 3 4 5 6
1― 5 2 4 1 0
2  - 3 0 2 2
3   ― 0 0 0
4     - 5 2
5      ― 10
6        ―
です。見づらいかもしれませんが1-2間が5、5-6間が10
といった感じです。ブルートフォースとは…なんでしょうか?
久しぶりに面白そうな話題・・・
6!を走査しない方法を探すのがキモかしらん?
150139:03/08/19 01:22
>>137
1) 2) はできたが、3) のヤコビ数の計算部分で躓き中。
風呂入ってくるから、しばしまたれよ。今晩中には作成する予定だが・・・
151137:03/08/19 01:27
>>150
         待ってるよん                 神でござる!!

     / / ∧_∧               ∧_∧ \ \ ∧ ∧ ∬
    / / /( ´∀`)    ▽  ̄ ̄∪    (・∀・ )\ \ \ ゚Д)旦
   ( ̄| ̄) (   つつ  /┴    ┴\  ⊂⊂  ) ( ̄| ̄)  つ \
   (  |  )/⌒~) ))    ̄|| ̄ ̄ ̄|| ̄   (( (~⌒\(  |  )   )    ̄|
   ̄.  |   ̄ ̄)(_ノノ    ||      ||    しし ( ̄ ̄  |   ̄ ̄)     |
まあでも、上下は対称やし、左右も対称やから、
6!/4で180まで落ちるような。
153139:03/08/19 02:31
ヤコビ数は力技を使った。もっと速い計算手法があるのだが、忘れたのでそのまま。
---確率的素数判定
#include <stdio.h>
#include <stdlib.h>

/* ループ回数 L */
#define LOOP 10

/* 各手法による確率的素数判定 */
/* 返値 0: not prime, 1: prime */
int isPrimeFermat(int);
int isPrimeRabin(int);
int isPrimeSS(int);

int input() {
int val; char buf[100]={0};
printf("素数の候補pを入力 : ");
fgets(buf, 50, stdin);
sscanf(buf, "%d", &val);
return val;
}
int main() {
int p = 0, flag = 0; /* flag=1 なら素数 */
while(p <= 1) p = input();
srand(p);
if(p == 2)
flag = 1;
else
flag = isPrimeFermat(p) && isPrimeRabin(p) && isPrimeSS(p);
printf("p = %d is %s prime.\n", p, flag ? "" : "not");
}
154139:03/08/19 02:32
/* Fermat法に基づく素数判定 */
int isPrimeFermat(int p) {
int i, j;
for(i = 0; i < LOOP; i++) {
int a = rand() % (p -2) +2, b = 1;
for(j = 0; j < p-1; j++) b = (b * a) % p;
if((b % p) != 1) return 0;
}
return 1;
}
/* Rabin-Miller法に基づく素数判定 */
int isPrimeRabin(int p) {
int i, j, w, k;
if(p == 3) { w = 1; k = 1; }
else {
for(k = 1; (1 << k) < p -1; k++) {
if((p-1) % (1 << k) == 0) {
w = (p -1) /(1 << k); if(w % 2) break;
} } }
for(i = 0; i < LOOP; i++) {
int a = rand() % (p -2) +2, y = 1;
for(j = 0; j < w; j++) y = (y * a) % p;
j = 0;
while((j < k) && (y != 1) && (y != p-1)) {
y = (y * y) % p; j += 1;
}
if((j == k) || ((j > 0) && (y == 1))) return 0;
}
return 1;
}
155139:03/08/19 02:34
/* Solovey--Strassen法に基づく素数判定 */
int isPrimeSS(int p) {
int i, j;
for(i = 0; i < LOOP; i++) {
int a = rand() % (p -2) +2, y = 1, z = -1;
/* y = a^((p-1)/2) mod p の算出 */
for(j = 0; j < (p-1)/2; j++) y = (y * a) % p;
if(y > 1) y -= p;
/* z = (a/p) の算出(ヤコビ数の算出) */
for(j = 0; j <= p/2; j++)
if((j * j) % p == a) {z = 1; break;}
if(y != z) return 0;
}
return 1;
}
----- ここまで

インデント消えちゃったので、適当にほかんよろ。
156119:03/08/19 05:36
恥ずかしながら、再びお尋ねします。

「type型の二つの値を交換する関数形式マクロ
 swap(type, a, b) を定義せよ」

という問題なのですが、どうにも解けません。

typeで型を反映させる方法と、値を交換するとき仲介として用いる変数の
定義の仕方がわかりません。
はじめは簡単な問題だとたかをくくっていたのですが、どうにも解けません。

ご存知の方、よろしければご教授願います。
>>156
C++だったら...typeにoperator =が定義されているものとして
#define swap(type,a,b){type *t=new type;t=a;a=b;b=t;delete t;}
というのが最も簡単そうな感じ。
operator =が定義されていなければ
#define swap(type,a,b){void *t=malloc(sizeof(type));memcpy(t,&a,sizeof(type)\
memcpy(&a,&b,sizeof(type));memcpy(&b,t,sizeof(type));free(t);}
って感じでどうよ?(結果は無保証)
swapを式の中で使うんだったらコンマ演算子とか使って工夫しなければならない
けど、一時変数の取り方が確かに難しいね。
158139:03/08/19 07:30
ヤコビの計算は、倍以上速くなるものを見つけられた。

しかし、aの(p-1)乗 mod p を計算するのが遅いことに気づく。
これだけで O(p) になってる。あほや。

平方乗法の計算組み込むので、しばしまたれよ。
159137:03/08/19 07:56
>>158
待ってマース!!
#include <stdio.h>
void sort(int *pd);
int main(void)
{
char buf[5];
int i, j, k = 0,
dp[15]={1,1,1,1,1,1,1,2,2,2,2,2,2,3,3},/*Distance Pattern*/
pd[15],/*Physical Distribution*/
amount = 0;

for(i = 0; i < 5; i++)
for(j = i+1; j < 6; j++)
{
printf("%d - %d 間、物流量を入力\n", i + 1, j + 1);
do
{
printf(">");
fgets(buf,5,stdin);
}while(sscanf(buf,"%d",&pd[k]) != 1);
k++;
}

sort(pd);

for(i = 0; i < 15; i++)
amount += dp[i] * pd[i];

printf("最小「部屋間距離×物流量」は %d です。",amount);

return 0;
}
void sort(int *pd)
{
int i, j, temp;

for(i = 0; i < 15; i++)
for(j = 0; 14 - j - i; j++)
if(pd[j] < pd[j+1])
{
temp = pd[j];
pd[j] = pd[j+1];
pd[j+1] = temp;
}
}
ソートはバブルソートを考えてるようなので、一応それで書いたけど
気に入らなかったら、sort()関数を別のソート方法に書き換えるなり
ライブラリ関数の qsort()を呼ぶなり好きなように書き換えてくだせぇ。
あと、バブルソートなら要素を全て並び替えずとも、部屋間距離 1 に当たる部分の
ソートは手抜きしてもいいかな。一応、これではきちんとソートしてるけど。
書き忘れ・・・
>>160-161 は、>>142宛てです。
163139:03/08/19 08:49
ところで、>>137 さんの想定する入力範囲っていくつよ?

10万くらいまでなら、平方乗法を使おうが、ヤコビ高速化しようが、
計算時間は、力技の方が速いか同等かといった程度。
100万以上で、ようやく効果がわかるといった程度。
164139:03/08/19 08:57
-----確率的素数判定(Fermat) : 平方乗法版
int calcMul(int x, int y, int z) { /* 掛け算の筆算 */
int i, v = 0;
if(x < y) {i = x; x = y; y = i;}
if(y == 1) return x;
for(i = 31; i >= 0; i--) {
v = (v * 2) % z;
if((x >> i) % 2 == 1) v = (v + y) % z;
}
return v % z;
}
int calcSqMul(int x, int y, int z) { /* x^y mod z を平方乗法で求める */
int i, j, v = 1;
if(y < 100000) {
for(i = 0; i < y; i++) v = (v * x) % z;
return v;
}
for(i = 31; i >= 0; i--) {
v = calcMul(v, v, z);
if((y >> i) % 2 == 1) v = calcMul(v, x, z);
}
return v % z;
}
int isPrimeFermat(int p) { /* Fermat法に基づく素数判定 */
int i, j;
for(i = 0; i < LOOP; i++) {
int a = rand() % (p -2) +2, b = 1,c;
b = calcSqMul(a, p-1, p);
if((b % p) != 1) return 0;
}
return 1;
}
165139:03/08/19 08:59
/* Solovey--Strassen法に基づく素数判定 */
int isPrimeSS(int p) {
int i, j;
for(i = 0; i < LOOP; i++) {
int a = rand() % (p -2) +2, b, y = 1, z = 1, q = p;
/* y = a^((p-1)/2) mod p の算出 */
y = calcSqMul(a, (p-1)/2, p);
if(y > 1) y -= p;
/* z = (a/p) の算出(ヤコビ数の算出) */
while(a > 2) {
if(a % 2 == 0) {
a /= 2;
if(q % 8 != 1 && q % 8 != 7) z *= -1;
}
else {
if(a % 4 == 3 && q % 4 == 3) z *= -1;
b = a; a = q; q = b;
a %= q;
}
}
if(a == 0) z = 0;
else if(a == 2 && q % 8 != 1 && q % 8 != 7) z *= -1;
if(y != z) return 0;
}
return 1;
}
-----ここまで

これ以外の関数は、最初のものと同じで大丈夫(のはず)。
おでかけの時間となりましたので、何かあっても自分でがんばよろ。
166デフォルトの名無しさん:03/08/19 13:10
>>160-162
ありがとうございます!まだ勉強始めたばかりなので関数とか
よくわからないのですが作っていただいたの見て勉強します☆
あと、この課題もう一つあってそれは4×5行列で同様に考える
というものなんですがこれはパターンが多すぎて順列で考えて
は解けないそうです。何かいい方法はないでしょうか?
(必ず正しい解を得られる)アルゴリズムをあきらめる事だね
168デフォルトの名無しさん:03/08/19 20:40
Cで万年カレンダーを作れ


作れませんナキ
だれか教えてください・・・お願いします
文字列str1の中に、文字列str2と同じ文字列が含まれているか調べるにはどうすればいいでしょうか?
170137:03/08/19 20:57
>>165
今家に帰ってきたのでレス遅れてすまん。いろいろサンクスコ!!
何かあったらまた頼むわ
>>169
strstr()
172デフォルトの名無しさん:03/08/19 22:28
うるう年と元旦が何曜日かわかったらつくれるよ。
独自のこよみでよければ
>>168
改暦を考えなければ簡単。
175デフォルトの名無しさん:03/08/19 22:54
月のはじめの曜日と月の日数を受け取って(今月なら金と31)
一月分のカレンダーを表示する関数をつくる。

年と月から曜日と日数を計算すれば、
どんな月のカレンダーでも表示できる。

曜日を求める公式があったはずだけど忘れたので
ある時点の曜日から計算する。
日数は配列で持って、うるう年かどうか調べる。
zellerの公式
×zellerの公式
○zeldaの公式
ttp://apricot.ese.yamanashi.ac.jp/~morisawa/edu/1998/ade1/ex04-2.html
曜日を求める公式

y年m月d日とすると,

(y+y/4-y/100+y/400+2.6m+1.6+d)/7を計算する.

あまりが0なら日曜日,1なら月曜日,2なら火曜日(以下同様)である.

但し,1月と2月は,前の年の13月,14月として入力しなければならない.
おかしいぞ
こういう問題でした。お願いします!

*/万年カレンダーを表示する。/*
1.西暦の年を取り込む。(マイナスや0を入力した場合は再入力)
2.月を取り込む。(1から12以外の数字を入力した場合は再入力)
3.西暦1年1月1日を1とした時の前の月までの総日数を計算。
  1=365*年数+閏年の年数*1日+その他の1月1日から前の月までの総日数
  閏年の年数=(年−1)/4−(年−1)/100+(年−1)/400
* 西暦1年1月1日は月曜日。
* 閏年は4年に一回だが100年目は除く。(ただし、400年目は除かない。)
  つまり、(4で割った余りが0 かつ 100で割った余りが0でない 
または400で割った余りが0でない)で判定。
  400で割り切れる年は閏年である。400・800・1200・1600・2000など
4.月の先頭(1日)の曜日の確定。
  1/7の余りがスペースの数で、スペースの次から1が始まる。
* 月 火 水 木 金 土 日
  1 2 3 4 5 6 0
5.月の日数を決定。(28、29、30、31)。
6.コントロール+cで終了。
*/入出力仕様/*
西暦の年 1993
   月 11
−−−1993年11月−−−
SUN MON TUE WED THU FRI SAT
   1  2  3  4  5   6
 7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
ああーカレンダーがズレてしまった・・・
スミマセン;;
182137:03/08/20 01:29
>>165
どうやら7万程度までしか判定できていないようなのだが、原因は
思い当たる?
183156:03/08/20 02:48
>>157

ご回答いただき、ありがとうございます。
正直、式をみてもチンプンカンプンですが、
そちらの方は自分で調べようと思います。

本当に、ありがとうございました。
どなたか助けてください。この課題をお願いします!

問題1

ファイルを読み込み、先頭から128バイト削り、ファイル名に"-"を加えて
元のファイルと同じ場所に保存する。

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

int main(int argc,char **argv){
FILE *ifp,*ofp;
char outname[BUFSIZ],buf;

if(argc==1){
fprintf(stderr,"プログラムの使い方をうぬーんかぬーん\n");
return -1;
}
// 出力先ファイル名の設定
sprintf(outname,"_%s",argv[1]);

ifp=fopen(argv[1],"r");
ofp=fopen(outname,"w");
if(ifp==NULL){
fprintf(stderr,"%sが開けませんか?\n",argv[1]);
return -1;
}
if(ofp==NULL){
fprintf(stderr,"%sが開けませんか?\n",outname);
return -1;
}
fseek(ifp,128,SEEK_SET); // 128文字ずらした位置から始める
while ( (buf=fgetc(ifp)) != EOF){// ifpから1文字ずつ読み込んで、ofpに出力する
fputc(buf,ofp);
}
fclose(ifp);
fclose(ofp);
}
>>185
アンダーバーじゃなくてハイフンだろ
187デフォルトの名無しさん:03/08/20 15:07
だれかPow関数を、2^4だったら、(2*2)*(2*2)→(4*4)みたいななんとか法という
累乗をするバージョンで作ってくんろ。
188デフォルトの名無しさん:03/08/20 15:09
ビットシフトでできるかな。
189デフォルトの名無しさん:03/08/20 15:12
4は110になるわけだから
右シフトしてビットが立ったら掛ければいい。
シフトするごとに掛ける数を2倍していく。
190デフォルトの名無しさん:03/08/20 15:13
>>189
2だけっていう想定じゃ・・・・うーん、でも2だけでもいいかな。
とにかくおねがいしやす。
template <class Int>
Int Pow(Int x,Int r){
  Int t=1;
  do{
    if(r%2) t*=x;
    x*=x;
  }while(r/=2);
  return t;
}
192191:03/08/20 15:16
前に作った奴。作るって程でもないけど
193デフォルトの名無しさん:03/08/20 15:16
>>191
えっ、こんなコードでいけんの?マジ?
4は2進数で100だよ。
195デフォルトの名無しさん:03/08/20 15:17
>>191
あのー、2だけのビット演算バージョンを作ってなんて・・・・
てへ
Int Pow(Int x,Int r){
Int t=1;
for (; r > 0; r >>= 1, x *= x)
if (r&1) t *= x;
return t;
}
197デフォルトの名無しさん:03/08/20 15:24
>>196
まじありがとう、でも、そのA^nだったらAがいつも2って意味
だったんだよね。だから、Xの引数はいつも2って意味
ごめんね
Int Pow(Int r){
Int t=1;Int x = 2;
for (; r > 0; r >>= 1, x *= x)
if (r&1) t *= x;
return t;
}
Int Pow(Int r){
return 1 << (r-1);
}
-1いらなかった。
201デフォルトの名無しさん:03/08/20 15:33
>>198
何度もすまぬかった。ありがとぅ
202デフォルトの名無しさん:03/08/20 15:42
また、見るのじゃぞ。
203デフォルトの名無しさん:03/08/20 15:43
あの多倍長演算のルーチンを組んでて、加算、減算、乗算、除算はできたんです
が、その4つの要素を使って、剰余演算の関数を作りたいと考えています。
で、今のアイデアはA%BをするのにA/B=C→(INT)C→A−Cとやるしかない
かなと考えております。でもあまりにも非効率的な感じがするわけです。
こんな場合どうすればよいでしょうか?
204デフォルトの名無しさん:03/08/20 15:48
ぐぐればいろいろ見つかると思う。
割り算同様、上の桁から計算
いや下の桁からだな
207デフォルトの名無しさん:03/08/20 15:53
>>205
そ、それが・・・・・、割り算をそうやってないんです。(理由になってない)
A/B をするために1/Bをニュートン法で求めて、A*(1/B)てな
感じなんです。やっぱりそちらの法がナチュラルですかね?
また、他の4つの関数をつかって、スマートにやるとしたら、やっぱり
自分の考えている方法しかないんでしょうか?
もう、そこまでいじる根気がなくなってきてしまって
多倍長って浮動小数点のかい
209デフォルトの名無しさん:03/08/20 16:00
>>208
いやそうじゃないです。でも、除算の結果はどうしても浮動小数点に
なっちゃいますよね。
基数をr(=INT_MAX+1?)として、
a=an,...,a2,a1,a0
b=bm,...,b2,b1,b0
について普通にa/bの計算をするだけだろう
211デフォルトの名無しさん:03/08/20 16:15
>>210
an/anって事ですか?繰り上がりとかくリ下がりがよく
分からないんですが、
212tenpai:03/08/20 17:04
ダイアログに貼り付けたピクチャボックスより大きい画像を表示するために、
ピクチャボックスにスクロールバーを付けたいのですがどうしたらいいのでしょうか。
他のスレへ。
214139:03/08/20 21:49
>>182
こちらに犯せてもらた。多分これで大丈夫だと思うが・・・
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=138&fi=no
215デフォルトの名無しさん:03/08/20 22:19
>>214
もういいかげん怒っちゃったのかと思ってた・・・・・・
本当にありがとうね。モニターの先でおがんでおくよ。
216209:03/08/20 22:34
とりあえず剰余演算は当初の予定どおり、遅そうですが、
ごり押しで作ってみました。そこで、次にお聞きしたいことは
加算、減算、乗算、除算、剰余算の5つの多倍長のルーチン
はできました。で、この5つの要素を使って乱数の関数を作る
にはどうすればよろしいのでしょうか?また、乱数のアルゴリズム
自体よく分からないのでどなたか簡単に書いていただけると
助かります。
>>216
M系列乱数, Mersenne Twister
218209:03/08/20 23:32
>>217
ぐぐった方がよろしいか?
基本だからね。
220デフォルトの名無しさん:03/08/21 00:01
以下の用件を満たす九九の表を出力するプログラムを作成しなさい。
要件
 まず、for()文を使って2次元配列table{ }に九九の計算結果を代入する。
 次に、for()文を使って2次元配列table{ }に九九の計算結果を代入する。
#include <stdio.h>

void main(void)
{
inttable{9}{9},i,j;

//ここを埋める

}

実行結果はこうなる見たいなんです

1  2  3  4  5  6  7  8  9
2  4  6  8 10 12 14 16 18
3  6  9 12 15 18 21 24 27
4  8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
>>220
全角数字じゃないといけないの?
222デフォルトの名無しさん:03/08/21 00:05
inttable{9}{9},i,j;
見にくいしちょっとミスってしまったので訂正です。

int table{9}{9}、i、j;
>>221
半角です。
>>222
それじゃコンパイルできない。
それにその方がみにくい
すみません、再度修正しました

int table{9}{9},i,j;
>>220

for(i=1;i<=9;i++){
for(j=1;j<=9;j++){
printf("%3d",table[i][j]=i*j);
if(i==9)
putchar('\n');
}
}
>>185
なるほど、こう書けばよいのですね。
勉強になります。

ありがとうございました!!
228デフォルトの名無しさん:03/08/22 00:14
C言語は俺に聞けからこっちの方が良いと言われ、来ました。
下のサイトにはFFTのソースがあるのですが、私には
よくわかりません。このサイトの中のやつで乗算とか除算がやりたい
場合どうすればいいか教えてください。
(フォートランとCのやつがありますが、もちろんCのやつで)
宿題は、どこかで参考資料を探し、FFTで乗除を行え、という
ものでした。
私が見つけた資料はコレです。いっしょに心中だ!!
http://momonga.t.u-tokyo.ac.jp/~ooura/fftman/ftmndl.html
オレニマカセロ!
230デフォルトの名無しさん:03/08/22 00:20
231デフォルトの名無しさん:03/08/22 00:22
>>230
これを見てさらっとできるなら、ここに来ませんって、そんな頭良くない!!
(鬱)
>>231
FFT で除算するって何を?

周波数領域で除算してデコンボリューションするってこと?
それとも、230 の URL にあるような多倍長除算演算の実装?
後者の場合、そんなへぼ理系学生にさせるには
かなりレベル高すぎだと思うんだけど。
233デフォルトの名無しさん:03/08/22 00:31
>>232
間違えますた。除算はナシでOKです。要するに、でっかい数の乗算
を早くやれや!!っていう宿題です。
234デフォルトの名無しさん:03/08/22 00:33
>>233
あ、でも加減算が必要かな?、FFTで加減算ってできるのかな〜
>>233
まさか、その「でっかい数」自体から自作する課題?
どういう授業でどれくらいの期間かけてやれっていわれた宿題?
情報系ならともかく、へぼ理系にそんな課題させるってかなりおかしい気がする。
236デフォルトの名無しさん:03/08/22 00:39
>>235
そんな事私に言われたってしょうがないですよ。先生に言ってください。
あと、ヘボ理系って書きましたが、一応情報系所属です。
>>233
でっかいって……もっと具体的な情報は出せないのか?
課題なら全文を出せ。よくわからん情報を小出しにされるのはうざったい。
>>236
言語は C のみ? C++ はなし?

俺が課題出すなら、
せいぜい「多倍長演算クラスライブラリを作れ」にとどめて
FFT 使ってきた学生にはボーナスで点出すかな。
239デフォルトの名無しさん:03/08/22 00:51
>>238
Cのみでおねがいすます。ついでですが、多倍長演算のルーチン
は自分でどうにか組みました。でも、ボーナス欲しいわけですな。
(れるかわからんけど)

>>237
この後、授業で素数とか円周率とか扱うらしいので、そのための準備で
夏休みの宿題なんです。
宿題:
C言語で多倍長演算のルーチンを作成せよ。仕様は、char型文字列ポインタで
数値を渡し、返すのもchar型文字列ポインタ。
速度は適宜資料を探し、速い物ほどボーナス点がいただけると、
こんな感じです。
>>239
早いものほどって言うけど、桁数小さかったら単純な方が早いよ。
何桁くらいでチェックされるん?
241デフォルトの名無しさん:03/08/22 01:02
>>240
それは先生のみぞ知るってやつですね。まぁ何万桁とかそうい
ったレベルなんではないでしょうか?
そのせいか、メモリ管理とか変数のサイズは注意しろと言われま
した。(まぁ、ちゃんとやっとけやということでしょうが)
それはもう自力でやれ。
243デフォルトの名無しさん:03/08/22 17:27
すいません、すっごい初心者なんですが、お願いします。
説明下手かもしれませんが、お願いします。
変数が4つ(x、y、u、vとする)があって、関数f(x、y)があります。
f(x、y)は、du,dvで積分された関数です(u、vともに−5〜6くらいの範囲で)。
これを、x,y,f(x,y)の3次元のグラフにしたいのですが、どうすればよいのでしょうか?
for文でまわして積分してやろうと思ったのですが、f(x,y)にx,y,u,vの4つの変数があるためか、for
文がまわらないです。
説明が下手ですいませんが、よろしくお願いします。
>>243
> f(x,y)にx,y,u,vの4つの変数があるためか、
> for文がまわらないです

センスあり杉!
ワロタ!


# 俺は数学がだめなので、回答は他の人に期待してね。
>>243
とりあえず、今まで君が書いたコードをうぷしれ。

うpろだ
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
>>243
for(i=ist;i<ien;i+=u)
 for(j=jst;j<jen;j+=v)
  plot(f(i,j));
uやvを媒介変数の元ネタにするんじゃないの?
248デフォルトの名無しさん:03/08/22 21:57
ども、243です。
レスありがとうございます。
上の補足(?)です。
えーっと、だから、x、y、u、vの関数S(x,y)をu、vで積分した(たとえばー5〜5など)
ものをx,yを変数としたS(x,y)のグラフにしたいってことです。
つまり変数x,y,u,vの関数S(x,y)のu,vの積分をするのがどう書けばよいのかわからないです。
よろしくお願いします。
宿題を一言一句漏らさず書け。話はそれからだ。
250デフォルトの名無しさん:03/08/22 22:13
ラウンジの方にも書いたのですが、こちらにも書かせていただきます。
exp(-2r)*exp(2r*sqr((u^2)+v^2))*exp(2r*sqr((x-u)^2+(y-v)^2)
という式があって、
r=sqrt(x^2+y^2)
です。
この式をdu、dvでそれぞれ−5〜5まで0.5きざみで積分したものがS(x,y)
で、x、yをそれぞれー6〜6までの0.1きざみで3次元プロットするプロ
グラムです。
x,y,S(x,y)の3次元グラフにしたいんです。
なお、5とか6とかは適当な数値なので、数値にはこだわらないでください。
プログラムの内容を理解したいので。
どうかよろしくお願いします。

>>250
偏微分なら、手でu, v でそれぞれ偏微分した式をプログラムに埋め込み、
積分はシンプソン法ででもすればどうだ。
スマソ偏微分じゃないのね。du, dv でシンプソン法で積分し、(但し二重
積分になるなあ)、プロットすればいい。
シンプソン法は
http://www.mscom.or.jp/~tog/anna/
当たりにあります。

但し3次元処理だから簡単な隠線処理が必要だ。
問題を一字一句間違いなく写して書いてほすぃ
254デフォルトの名無しさん:03/08/23 04:03
上の式で間違えて書いていたところがあったのでまとめて訂正します。
もとの式は、
S(x,y)=|//exp(-2r*i)*exp(2r*i*sqr(u^2+v^2))*exp(2r*i*sqr((x-u)^2+(y-v)^2))dudv|
//・・・積分記号のつもりです。
i・・・虚数です。
u、vの積分は、-0.3/2から0.3/2を32きざみで積分です。
x、yのプロットも、u、vと同じ間隔と範囲です。
これの3次元のグラフを描くという問題です。
お手数をおかけしますが、よろしくお願いします。
(3) 文字列"hanakosan"がある。文字列の長さを求めるプログラムを
作成せよ。

という宿題なのですが
#include<stdio.h>
int main()
{
int a,i;
char lie[]={"hanakosan"};

for(i=0;;i++){
if(lie[i]=="\0"){
printf("文字列は%d文字です。",i-1);
break;
}

}
return(0);
}
で合っていると思うのですが、エラーが出て実行されません。
lie[i]=="\0"ここがおかしいと思うのですが、どうすればよいのでしょうか?
お願いします。
>>255
'\0'
ダブルクォーテーションは文字列定数だから、
最後に自動的に\0が付加されちゃうんだっけ。
>>257
それ以前の問題
>>256
ありがとうございました…恥ずかしいっす。
>>258
あとあれですね、printf("文字列は%d文字です。",i-1);
じゃなくてprintf("文字列は%d文字です。",i);
でした。
どうもありがとうございました。
>>257
そうだけど、"\0"を評価すると格納されている先頭アドレスが帰る。

if(lie[i]=="\0"[0]){

なら通るけど、マネしちゃダメ!!!
あと
1) 数列 ai+1=2*ai+1, a0=1 がある。
i=1〜20の総和を求めよ。また、平均値を少数点2桁まで求めよ。

という宿題なんですが
#include<stdio.h>

int main()
{
int i=0;
int a[]={1};
double s=0;

for(i=0;i<20;i++){
a[i+1]=2*a[i]+1;
printf("a[%d]=%d\n",i,a[i]);
s+=a[i];
}

printf("平均値は%.3fっす。",(s/20));
return(0);
}
これでエラーが出るのですが…下らないミスだと思うのです。
恥ずかしながらお願いします。
a[]={1}で確保される範囲とa[i+1]で使用する範囲を考えれ
>>261
ai と Si の一般項求めちゃった方が早い。
ai = 2^i - 1
Si = 2^(i+1) - 1 - i

C言語は可変長配列とかつかえないって。
a[] = {1}; とかやると、長さ1の配列しかできない。
#include <stdio.h>

long counter(int, int, long, long);

int main(){
  int i = 0;
  int iMax = 20;
  long a0 = 0;
  long lResult = 0;

  counter(i, iMax, a0, lResult);

  return 0;
}

long counter(int i, int iMax, long a0, long lResult){
  int a1;
  if (i < iMax){
    i++;
    a1 = 2 * a0 + 1;
    lResult += a1;
    printf("a[%2d] = %10d : Sum = %10d : Ave = %10.2f\n"
      , i, a1, lResult, (double)lResult / (double)i);
    lResult = counter(i, iMax, a1, lResult);
  }
  return lResult;
}
265264:03/08/23 12:32
この手の漸次式は再起で処理するのが模範解答だと思う。
あと、マジックナンバーは使っちゃダメ。

ちなみに、僕はうんこマニア。
>>262-263
ありがとうございます。
「一般項は求めずに出来るよ」といわれたのですが…。
つか、int a[21]={0};と宣言すれば成功したのですが…。

学校のソフトで実行したところa[15]からの値が狂ってしまいました…。
ベクターかそこらでコンパイラを落としてきます。
ありがとうございました。
267266:03/08/23 12:43
あと文字列をアルファベット順に並び替えろ、というのもあるのですが
switch文とfor文を使うような気がするのですが、どうでしょうか?
>>267
だんだん質問が手抜きになってるな。(笑
アルファベットをchar型配列にぶっこんで、
バブルソートなりクイックソートなりでソートすれ。
269266:03/08/23 13:05
>>268
やっぱりアルファベットをchar型配列にぶちこむんですね。
ソートは何とかやってみます。ありがとうございました。
>>266
一般項求めなくてもできるけど、計算速度は一般項使った方が早い。

#define N 20
int a[N+1], S[N+1];
int i=0, pow2 = 1;
for(int i=0; i<=N; ++i)
{
 a[i] = pow2 - 1;
 pow2 <<= 1;
 S[i] = pow2 - i - 1;
}

>>267
C でなら qsort、C++ でなら std::sort 使え。
あくまで自作しないと駄目なんなら、バブルソートとかで検索かけてみろ。
271デフォルトの名無しさん:03/08/23 15:50
ファイル削除をする関数をおしえれ!!
272デフォルトの名無しさん:03/08/23 15:55
>>271
remove
273デフォルトの名無しさん:03/08/23 15:59
>>272
それ使ったらハードディスクが消し飛ぶぞ!!注意しろ
夏だなぁ
275266:03/08/23 16:55
>>270
あくまでも自作ですね。
バブルソートは授業でも何回かやったっぽいんですが、
そん時は全部数字だったんで…文字列のソートにはどうやって応用すればよいのでしょうか?
>>275
複数の文字列を辞書式順序でソートってこと?

えっとね、バブルソートで
x[i] < x[i + 1]
とかなってる部分を
strcmp(x[i], x[i + 1]) < 0
に変えるだけだったり。
そういえば、俺、昔その手の課題で STL の中身を
変数名とか付け替えただけでそのまま提出したことあるぞ。
278266:03/08/23 19:10
>>276
いえ、文字列hanakosanをアルファベット順に並び替えて表示させるというものなのですが…
lie[]={"hanakosan"} の場合
比較する部分を if( lie[max]>lie[j]) max=j とかにすればイイのでは?
280デフォルトの名無しさん:03/08/23 19:48
>>279
すいません…maxの説明を少し下さい。
なんとなくわかるんですけど…
配列のソートがcharになるだけで出来ないのか(w
282デフォルトの名無しさん:03/08/23 19:54
unlink
>280
#define len 9

char lie[len]={"hanakosan"},work;
int max,i,j;
for(i=0;i<len-1;i++){
 max=i;
 for(j=max+1;j<len;j++){
 if(lie[max]>lie[j]) max=j;
 }
 work=lie[max];
 lie[max]=lie[i];
 lie[i]=work;
}
284266:03/08/23 20:33
>>283
えっと…(lie[max]>lie[j])こうやって比較していいんですか?
あと俺の使ってるソフトでは何故それでエラーが出るのでしょうか?
エラー内容も謎だし。
285283:03/08/23 21:27
俺の環境(bcc32 + Win2k)では問題なく動くのだが・・・
文字同士の大小を比較=文字コードの大小を比較
故に、lie[max]>lie[j] は無問題と理解してるんだけど
俺の認識は間違ってるんだろうか・・・
力になれなくてスマン。

ちなみに、文字コード表
ttp://www9.plala.or.jp/sgwr-t/c_sub/ascii.html
286266:03/08/23 21:29
>>285
そういう事ですか!
あ、わかりました。ありがとうございました。
charは実際には文字コードを格納するから、

char a = 'a';
a += 1;

とかやると、aの中身は'b'になる。
288266:03/08/23 23:00
>>287
そうだったんですか…知らなかったです。
つまりはcharには本当は数字が入っていたんですか…。
ありがとうございました。
>>287
それって保証されてたっけ?
環境依存だったようなきがする。
>>289
一応、C言語では ASCII コードでソース書けってことになってなかったっけ?
'0'から'9'までが連続していることは保証されていたはず。
それ以外は保証されていなかったかと。
>>291
後保証されているのは、 'a' < 'b' < ... < 'z' だったかな。
数字も保証はないけど、一般に使われている文字セットはそうなっているという話。
>>291
>>293も言っているけれど、保証なんかされていない。ただ連続していない文字セットは知らないとK&Rか何かに書かれているだけ。
お願いです.どうかお教えください.
皆さんよろしくお願いします.

以下の関数 foo1, foo2, foo3 が再帰呼び出しとして,
適切あるいは不適切であるかを述べよ.
その理由についても説明すること.

int foo1(int n){
n /= 2;
return n + foo1(n);
}

int foo2(int n){
if(n == 0)
return 0;
else{
n /= 2;
return n + foo2(n);
}
}

int foo3(int n){
if(n == 0)
return 0;
else
return n + foo3(n);
}
>>294
EBCDICなんかは?半分で寸断されている。
しかし 'a' < 'b' < ... < 'z' は成り立つけどな。
>>297
foo3だけ、i != 0 の場合無限再帰するヨカーン。
>>296
数字
>>295
1と3は無限再帰。

>>297
foo1 は無条件に無限再帰だろ。

foo1は収束する
>>300
いや、0に収束しても、再帰を抜ける条件式がないのに。
負を与えるとfoo2も処理系依存なんだな
>>302
つまり、この問題作成した奴は教官として不適切と。
2バイトコードの漢数字を扱うと、SJIS,EUC,unicode のすべてで、
連続どころか、'一' < '二' < ... < '九' すら成り立たない。
305デフォルトの名無しさん:03/08/24 17:55
>>296
数字だと言っているだろうが
どなたか
http://tutanoha.hp.infoseek.co.jp/kenshou/
ここのようなソフトを作ってください
もういい、うせろ>306
おいおいソフ板でだめだったから
ム板で製作依頼カヨ
>>306
どっかにEXCELのパスワードのかかったVBAをブルートフォース法で
開くプログラムが転がっていたぞ。検索してみな。
あとな、パスワード入れて動作制限を解除するタイプのシェアウェアは
*.XLSをバイナリエディタで開いてみろ。それらしい匂いがプンプンする
文字列がそのまま見える。
311デフォルトの名無しさん:03/08/25 21:56
>>309
ブルートフォース法ってなんナリか?
>>311
Brute Force法。パスワードのクラックの最終手段としてよく使われる。
"A"から初めてあらゆるパスワードを自動生成し、ダイアログに入力
させる。zipにパスワードのかかったアーカイブの解凍も基本的には
Brute Force法である。
>>312
スレ違いですまんがBrutusってローカルのファイルにも可能?
リモートでやったら普通切られる。
315デフォルトの名無しさん:03/08/26 14:38
じゃ、だれかWinRarを、ライセンス払わずに使う方法を
教えてくれ、もうすぐ切れる
>>315
WinRAR 以外のソフトウエアを使えばいいじゃん。
>>315
古いバージョン
Winrarって「はよ登録しろや」って文句いうだけで使えるでしょ
319デフォルトの名無しさん:03/08/27 03:03
>>142で質問した者ですが、>>160-161で作って頂いたソースを
実行してみたところ、このソースでは最適レイアウトではなく、
理想レイアウトが求まることに気がつきました。理想レイアウト
では必ずしも部屋の割り当てが上手くいくとは限らないのでダメ
らしいです…部屋の入れ替えに対応した物流量の入れ替え方が
わからないので教えていただきたいです。
320デフォルトの名無しさん:03/08/27 03:07
前略

Cで、#include <stdio.h> なしで、つまりprintfを使わずに、
hello
と表示するプログラムを作ってくださいませんか?

後略
322320:03/08/27 03:28
>>321
聾唖の方かしら?
レベル低すぎるからやってられん、って事?
int main(){ puts("hello"); return 0;}
ではいかんか? 理由を述べてもらわないことにはなんとも、、、
低水準IOを使いたいなら、環境くらいは書いてもらいたいしナ
324320:03/08/27 04:22
>>323
知りたかったのは、printf()が隠しているものです。
それが「低水準IO」なんでしょうか。

WinXPでBCC++ですが、
stdio.hにprintf()が低水準IOを使って文字を出力するというコードが
書いてあるんですか?
見てみましたが分からないのですが。
INT 21H
いきなり「聾唖の方」か、やれやれだよな。
質問するのに前略後略じゃねぇっての。
Linuxのシステムコール
ssize_t write(int fd, const void *buf, size_t count);
無言でリンクだけはられりゃムカつくだろ
前略後略くらいがなんだよ
別スレで丁寧におしえてもらったからいいよ低脳
329デフォルトの名無しさん:03/08/27 15:35
低脳age
>>328
しかもマルチポストだったのか...
>>330
マルチ・・・とは心外ですね。
私は誘導されたと思い、しかたなく誘導先で聞いたんです。
まあ、ちょっとイヤミな捨て台詞を残しはしましたが。
そのあとで見てみたらレスがついてたのでそれにレスしたまで。

いちいちうるせえ板だな。
おまんこ学園祭
333デフォルトの名無しさん:03/08/27 18:11
いちいちうるせえ板だなage
>>328
なあ、どうして>>321>>326、別スレの 50 が別人だと思ったのよ?
>>334
わかるわけネーダロ
このスレに限んないけど答える人たち態度でかすぎと思います。

もう一度言おう、

いちいちうるせえ板だな。
別人かもしれない
でも、ただのバカかもしれない

次回もオシエテクンです
>>336
ツインズワラタ
338デフォルトの名無しさん:03/08/28 06:19
配列宣言の時、int v1[100][6],v2[89[6],v3[45][6]…
上みたいなとき、v100「n][6]まであったとしても少なくできるやりかたってありますか?
何を少なくしたいんだ?
340デフォルトの名無しさん:03/08/28 12:23
最適化ってどうやってやるの?Borland C++ Compiler5.5とBCC Developerでも
できるの?
できるなら教えて
>>340
宿題なら、問題を一言一句書き写せ。
やるかやらないかはそれから決める。
342デフォルトの名無しさん:03/08/28 14:35
>>318
そうなの?!!!
>>340
お前の存在そのものが不適だから、
世の中の最適化のために首吊って氏ね。
いちいちうるせえ板だな、っていちいちうるせえ板だな(藁

問題
>配列宣言の時、int v1[100][6],v2[89[6],v3[45][6]…
>上みたいなとき、v100「n][6]まであったとしても少なくできるやりかたってありますか?

問題を日本語風に解釈
配列を、int v1[100][6],v2[89][6],...,v100[4][6];のように宣言するとき、
もっと簡単にやる方法はないでしょうか?

解答:
C/C++板に行け。じゃなくて、mallocを勉強してくれ。
v1〜v100の代わりに、v[1]〜v[100]を使うイメージで。
入力xに対し、xの2乗、xの3乗、xの4乗を得たい。1つの関数を作り、
main()から呼び出して実現せよ。複数の値を得る関数にはいくつか実現方法が
あるが、構造体を用いない方法で実現せよ。ヒント ポインタ 関数

宜しくお願いします。
>>345
#include <iostream>
using namespace std;

double* my_pow(double x) {
 static double p[5];
 p[4] = x * (p[3] = x * (p[2] = x * (p[1] = x * (p[0] = 1))));
 return p;
}
main() {
 double *xx, x = 1.5;
 xx = my_pow(x);
 cout << xx[4] << endl;
}
>>346
有難うございます。
>>346
C言語でのプログラムなんですがエラーがでます。。。
>>348
最初にCかC++なのかを書いておこう!
#include <iostream>
using namespace std;
cout << xx[4] << endl;
を消す。
表示は、printf()を使う。
>>349
失礼しました。
そして ご丁寧に有難うございます。
>>348
何度もすみません。
どのように 書き直せばいいのでしょうか?(汗)
無恥ですみません。。
352質問(。-_-。 )ノ:03/08/29 03:35
クラスの静的メソッド内で
クラスのメンバにアクセスしたかったら
呼び出し元が分からないとだめだと思うけど
どこから呼び出されたか?って分かるの?

どうすればいいんかね?
>>352
引数とかでthisポインタを渡す
「クラスのメンバにアクセスしたかったら」静的メソッドじゃない。
というか、クラスメンバをさわりたいならstaticにするなと
356助けてほしい:03/08/29 10:36
C言語の宿題です。
カナからローマ字に変換するプログラム。
助けてほしいです。
>>355 ハァ?
class M {
    static int instances;
    M() {
        instances++;
    }
};
あぁ、言葉足らずだったよ
揚げ足、もとい補足ありがと
359助けてほしい:03/08/29 10:55
クラスや構造体などを使わない変換プログラムほしいです。
1.switch文で力技
2.変換テーブルを作る

好きな方法で
361デフォルトの名無しさん:03/08/29 10:57
>>359
クラスや構造体などを使わない変換プログラムです。
#include <iostream>
using namespace std;
main()
{
 int i;
 cin >> i;
 i >>= 8; //変換
 cout << i << endl; 


}
cin、cout……
363助けてほしい:03/08/29 11:02
C++じゃなく、Cで書きます。
iostreamを自分で書けばCとしてコンパイルできますが。
Cでは<<演算子を再定義できない
366デフォルトの名無しさん:03/08/29 11:13
>>365
再定義しなくていいだろ
ビットシフトとして通るだろ
cinをビットシフトするの?
368助けてほしい:03/08/29 11:15
iostreamについては全然わからないから、別の方法がありますか。
typedef int using;
#define namespace
#define std cin
int cout,endl;
>>366 何言ってるの?
>>367
>>369 iostreamの中身
372助けてほしい:03/08/29 11:16
できれば、ファイルの書き込み、読み込みの方法で
#include <stdio.h>
main()
{
 int i;
 scanf("%d", &i);
 i = i ~ 0xffff; //変換
 printf("%d", i);
}
マ板へ逝けと言いたくなる奴が一人。
#include <stdio.h>
main()
{
 FILE *fp = fopen("test.txt", "r+");
 int i = fgetc(i, fp) ^ 0xff; //読込変換
 ungetc(i, fp);
 fclose(fp);
}
半角カタカナだけだとしても結構めんどくさいな

ヒ → hi
ヒャ → hya
×
int i = fgetc(i, fp) ^ 0xff; //読込変換

int i = fgetc(fp) ^ 0xff; //読込変換
378助けてほしい:03/08/29 11:31
いいから、私にとってそんなに簡単じゃない。
辞書ファイルを作っておいて、カナ入力したファイルから取り出して、
辞書ファイルと比較する。「ア」だったら「a」に変換して、出力ファイル
に書き込み、というプログラムを作りたいですから。
379助けてほしい:03/08/29 11:32
カナは全角でいいです。
とりあえず辞書ファイルくらい自分でツクレや
381助けてほしい:03/08/29 11:37
>>380
喧嘩を売っているんですか?
382助けてほしい:03/08/29 11:37
もう作りました。
辞書ファイルがどんなのか分からないと作れないからうぷしろよ。
384助けてほしい:03/08/29 11:41
そんなつもりはないです。ただ、最近ずっと悩んでて、
なかなかできなくて、落ち着かないだけです。
ごめんなさい。
385助けてほしい:03/08/29 11:42

a

i
のように作りました。
>>385
構造体使えば悩むことないじゃん。
std::map
Shift_JISなら2バイトづつ比較していけばいいしな。
"ゃゅょ"とかだけ別処理して
389助けてほしい:03/08/29 12:23
構造体で書けば、どう書けばいいですか。
kakasiでもみろ。
n = 一文字取得する
nが小さい文字じゃなかったら、
      "1文字テーブル"からpに対応する文字を探す
nが小さい文字だったら、
      "2文字テーブル"からstrcat( p, n )に対応する文字を探す
pにnを代入する。

--- 1文字テーブル ---
char* table1[] = { "アa", "イi", .... "ンn" };

--- 検索 ---
char* findByHITOMOJI( const char* a ) {
    for( i = 0; i < MAX; i++ )
        if( strncmp( table1[i], a, 2 ) == 0 ) {
            return table[1]+2;
        }
    }
    return 0;
}
"っ"は後の文字にかかるのか
まんどくせ
393デフォルトの名無しさん:03/08/29 13:36
入力待ちをどうやればいいか教えてください。
getcharとかでやると直前に数字とかを入力してEnter押したのが
効いて上手くできません。
直前にそういう入力がある場合と無い場合も同じ関数でできる
ようにしたいのですが。
>>393
標準的なCではムリだ。あきらめるヨロシ
>>392
× りゃ -> rya
○ りゃ -> rixya

× った -> tta
○ った -> xtuta
ならかんたんになるかも
>>393
scanf()を使わなければ大丈夫。
>>393
fflush(stdin);
getchar();
398393:03/08/29 16:53
397をコピペしたらどうやらできました。
ありがとうございました。
fflush(stdin);
より
scanf("%*s");
のほうがいいんでない?
401デフォルトの名無しさん:03/08/29 18:13

int v_cnt[100] = { @@@ };

int main()
{


402デフォルトの名無しさん:03/08/29 18:19
何?
>>397
出力ストリーム以外へのfflushは未定義です。
404初心者:03/08/29 18:31
関数のオーバーロード?をやろうとしていて、main関数からは呼び出せたのが
myfuncから引数の異なるmyfuncを呼び出そうとしたら、
「error C2660: 'myfunc' :
関数が不正な 1 個の実引数をともなって呼び出されました」
とでました
#include<cstdio>
void myfunc(){
char s[3]="a";
myfunc(s);      //この部分がエラー
}
void myfunc(char *mode){
}
void main(){
char s[3]="a";
myfunc(s);
myfunc();
}
何でそうなったか本で調べても自分には見つけられなかったので教えてください。
プロトタイプ宣言しろや
406初心者:03/08/29 18:38
>405
感心なことを忘れてました。ありがとうございます
407助けてほしい:03/08/29 20:06
どうもありがとうございます
408デフォルトの名無しさん:03/08/29 21:46
◇◇◇人気サイト◇◇◇
http://pocket.muvc.net/
◇◇◇◇◇◇◇◇◇◇◇
全選択したあと、キレイに字下げするショートカットって、
どうやtってやるんだっけ?
IDEは?
M-x indent-region でどうだ。
>>410
M-C-\ でも同じだよー
412デフォルトの名無しさん:03/08/30 15:21
そろそろ夏休みの宿題をやり始める時期な訳だが。
最近、このスレの住人には「他人の宿題を奪ってでもやっちゃいたい!」という意気込みが
足りていない気がする。
413デフォルトの名無しさん:03/08/30 15:39
C言語なんですが、例えば1・2・3・4の四つの数字を順列で並び替えた
全てのパターンを表示させるにはどうすればよいのでしょうか?
>>413
順列生成は定石的なアルゴリズムがいくつかあります。
どれもコード量はたいしたことないけど、説明するのはけっこう面倒。
というわけで「順列生成」か「permutation」でぐぐってください。

ちなみにC++のSTLにはnext_permutation()てのがあって楽です。
415デフォルトの名無しさん:03/08/30 17:30
久しぶりにプログラム考えてみたらゲーム脳で全然分かりません。教えて下さい。

for文、int形変数を用いて縦10*横10の合計100個の四角を描画させたいのですが、
四角は40、40の大きさで四角と四角の間は全て10です。

□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
□□□□□□□□□□
でプログラムは
for(){
    for(){
        Rectangle(ps.hdc,);
    }
    
}
みたいにつくりたいんです。お願いします。・゚・(ノД`)・゚・。
10進数を2進数にするプログラムを作ったのですが(初心者だからちゃんと2進数に変換できてるかは不明)
俺ポインタ苦手なのでポインタを使っていないのですが誰かポインタを使って
これと同じようなものを作ってください。
417416:03/08/30 17:41
#include<stdio.h>

int main(){

int a,b,c=0,d=0;
char s[127],j[127];

printf("10進数2進数に変換します\n");
printf("数字を入力してください[10進数]\n");
scanf("%d",&a);
while(1){
b=a%2;
a/=2;

if(b==0){
s[c]='0';
}
if(b!=0){
s[c]='1';
}
c++;
>>415
for(int i=0; i<10; i++)
 for(int j=0; j<10; j++)
  std::cout << "□" << std::endl;
>>415
for(int i=0; i<10; i++)
{
 for(int j=0; j<10; j++)
  std::cout << "□";
 std::cout << std::endl;
}
420416:03/08/30 17:46
if(a==0){
c--;
while(1){
j[d]=s[c];

if(c==0){
d++;
j[d]=0;
break;}
c--;
d++;
}
printf("%s\n",j);
rewind(stdin);
getchar();
break;
}
}
return 0;
}
421415:03/08/30 18:27
解いてもらったのはありがたいのですが、、、例えば
PAINTSTRUCTps;
static intx,y,iCnt,iCntX;
static HBRUSHhBrushGreen;

//ウインドウメッセージを判別する
switch(uMessage){
//ウィンドウ作成時
caseWM_CREATE:
hBrushGreen = CreateSolidBrush(RGB(0,255,0));
x=10;y=10;//変数の初期化
break;
//ウィンドウ描画時
caseWM_PAINT:
   BeginPaint(hWnd,&ps);
   SelectObject(ps.hdc,hBrushGreen);
for(iCnt=0;iCnt<10;iCnt++){
for(iCntX=0;iCntX<10;iCntX++){
Rectangle(ps.hdc,x+iCnt*40,y+iCntX*40,x+iCnt*40+40,y+iCntX*40+40);
}
x+=10;
}
EndPaint(hWnd,&ps);
break;
こうゆう、感じで解いてもらえないですかね。。。
これのfor文2個とRectangle文の中身変えれば出来ると思うんですけど・・・お願いシマスだ
>>421 ホイ
for(iCnt=0;iCnt<10;iCnt++){
  for(iCntX=0;iCntX<10;iCntX++){
    Rectangle(ps.hdc,x+iCnt*(40+10),y+iCntX*(40+10),x+iCnt*(40+10)+40,y+iCntX*(40+10)+40);
  }
}

423415:03/08/30 19:00
ちょっと考えたら>>422と少し違うけど解けました。
>>422氏ありがとうございます。
424415:03/08/30 19:53
今度はさっきのプログラムにif文を使って縦10横10の外側のみの合計36を描画させたいんですけど
□□□□□□□□□□
□            □
□            □
□            □
□            □
□            □
□            □
□            □
□            □
□□□□□□□□□□
for(iCnt=0;iCnt<10;iCnt++){
  for(iCntX=0;iCntX<10;iCntX++){
    Rectangle(ps.hdc,x+iCnt*(40+10),y+iCntX*(40+10),x+iCnt*(40+10)+40,y+iCntX*(40+10)+40);
  }
}
にif文一つで出来ると思うんですけど。。。ヨロシュゥ_| ̄|○
>>416
リバースするのは面倒なので末尾から埋めていく方針で作った。

int a, b;
char s[127];
char *p;

printf("10進数2進数に変換します\n");
printf("数字を入力してください[10進数]\n");
scanf("%d",&a);

p = &s[126]; /* s[]の末尾を指す */
*p = '\0'; /* 文字列終端の'\0' */
do {
b = a % 2;
a /= 2;
*--p = b + '0'; /* 末尾から順に埋めていく */
} while (a != 0);

printf("%s\n", p); /* p以降を出力 */
>>424
if(!((iCnt%9)*(iCntX%9)))
でどうよ?
427424:03/08/30 20:19
>>426
出来マシタ。 アリガう
428デフォルトの名無しさん:03/08/30 20:34
C++でUNICODEのテキストのDIFFを実装したいのですが
全然思いつきません。
どうすればよいのでしょうか
>>424
for(iCnt=0;iCnt<10;iCnt++){
  for(iCntX=0;iCntX<10;iCntX++){
    if(!iCnt || iCnt == 9 || !iCntX || iCntX == 9)
     Rectangle(ps.hdc,x+iCnt*(40+10),y+iCntX*(40+10),x+iCnt*(40+10)+40,y+iCntX*(40+10)+40);
  }
}
>>426にもうもっといい答えがあった…
431デフォルトの名無しさん:03/08/31 12:10
CまたはC++でUnicodeのテキストを読み込み、カタカナがあるかどうかをチェックする
プログラムを作成せよ、という問題です。どなたかヒントいただけませんか?
$ echo -n 'ァヴ' | iconv -f euc-jp -t utf16be | od -tx1
0000000 30 a1 30 f4
0000004
>>432
マァヴ(^_^;)
$ echo -n 'ヴァカ' | iconv -f euc-jp -t utf16be | od -tx1
0000000 30 f4 30 a1 30 ab
0000006
435デフォルトの名無しさん:03/08/31 14:01
1〜100までの約数を表示させるプログラムを

数値 | 約数
 1 | 約数なし
 2 | 約数なし
 3 | 約数なし
 4 | 2
 ↓ (略) ↓
99 | 3 9 11 33
100| 2 4 5 10 20 25 50

こんな風に作りたかったんですがつまってしまいました。
for文までの知識でどなたか教えてください。
ちなみに1とそれ自体の数値は約数でないという前提です
436431:03/08/31 14:03
う。。すみません。ちょっとそれはわからないみたいです。。。
int is_unicode_katakana(unicode_t c)
{
    return 0x30a1 <= c && c <= 0x30f4;
}
>>435
#include <stdio.h>

int main(void)
{
    int i;
    printf("数値 |約数\n");
    for(i = 1; i <= 100; i++)
    {
        int j, has_factor = 0;
        printf("%3d | ", i);
        for(j = 2; j < i; j++)
            if(i % j == 0)
            {
                printf("%-4d", j);
                has_factor = 1;
            }
        if(!has_factor)
            printf("約数なし");
        printf("\n");
    }
}
>437
Halfwidth Katakanaはどうする?
どうもしない。
441435:03/08/31 16:14
>>438
ありがとうございます(つД`)
442デフォルトの名無しさん:03/08/31 16:45
class People
{
protected:
int age_;
string name_;
public:
People(int age, const string &name) : age_(age), name_(name) {}
virtual void Print() { cout << "名前=" << name << "年齢=" << age << endl; }
};

このクラスを継承してageに自動的20を入れ、
引数としてnameのみを取るコンストラクタを持ったクラスTwenteenPeopleを作りなさい。
おながいします。C++です。
443 ◆FCIHX.z9Sc :03/08/31 20:07
>>442

class People
{
protected:
int age_;
string name_;
public:
People(int age, const string &name) : age_(age), name_(name) {}
virtual void Print() { cout << "名前=" << name << "年齢=" << age << endl; }
};


class TwenteenPeople: public People
{
public:
People_20age(const string &name)
:People(20, name){}

}
444 ◆FCIHX.z9Sc :03/08/31 20:08
スマソミスッタ

class TwenteenPeople: public People
{
public:
TwenteenPeople(const string &name)
:People(20, name){}

}

吊ってきます・・・
445431:03/09/01 01:34
ありがとうございます(つД`)
同じ方法でひらがな検出もできそうでつ
半角かなのレンジもしらべてみまつ
「オールレンジ攻撃!!!
>>442
20 == Twenty
447 ◆FCIHX.z9Sc :03/09/01 19:31
>>446
気づかなかった・・・
もう高校生なのに・・・
caseWM_PAINT:
BeginPaint(hWnd,&ps);
SelectObject(ps.hdc,hBrushGreen);
Rectangle(ps.hdc,0,0,50*8,50*8);
for(Cnt=0;Cnt<8;Cnt++){
MoveToEx(ps.hdc,0,0+Cnt*50,NULL);
LineTo(ps.hdc,50*8,Cnt*50);
MoveToEx(ps.hdc,Cnt*50,0,NULL);
LineTo(ps.hdc,Cnt*50,50*8);
}
EndPaint(hWnd,&ps);
break;
こうゆう8*8の四角形を描画してその四角の中で左クリックした時にその四角の中の中心に○を描画したいんですけど
どうやってやればいいんでしょう?
iPosX=LOWORD(lParam);
iPosY=HIWORD(lParam);
で座標を取得すと思うんですが、、、その後が(つД`)
>>448
2つのイベント処理にわけなさい。
・マウスクリック処理(WM_LBUTTONDOWN)
  マウス座標取得→適当な変数に格納→ウィンドウをInvalidateRect()する。
・ペイント処理(WM_PAINT)
  盤面を描く→さっき変数に格納した座標に○を描画。
>>449・・・・言われた通りにプログラム作りましたけど走らせるとやっぱり意図した通りに動かないんですよね
上のだとクリックした場所にただ○は出るんですけど、自分がやりたいのは
クリックした四角の中心に○(丸の中心が四角の中心)を描画させたいんですけど。・゚・(ノД`)・゚・。
取得した座標から四角の中心をもとめる。
>>450
マウスの座標を(x,y)、マス目のサイズをsizeとして
x = (x / size) * size;
y = (y / size) * size;
を計算。あとは適当にずらすのみ。
>>452
それって (x,y) = (x,y) では?

>>450
1. LButtonDownでポイントからマス目を割り出して保存して
2. 描画命令時にデータを描画しないと駄目と思われ。
>453
45/10*10=40
>>454
なーるほど。だけど、オセロか何かだと思うんだが、
マス目のデータを取り出さんと使えないだろうよ。
masu.x = (x / size);
masu.y = (y / size);
AsyncSocketを使ってメールを送信したいのですが・・・
全く分からないので、教えて!
>456
変わった宿題だな。
458450:03/09/02 18:28
まず>>449-455に感謝
if((X<50*8) && (Y<50*8)){
      X=X/50;
      Y=Y/50;
      Ellipse(hdc,X*50,Y*50,X*50+50,Y*50+50);

//XはマウスのX座標YはマウスのY座標を示してます。
↑で出来ました。こちらが前文です。↓
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=139
(ところどころインデントが可笑しくなってます、スミマセン)


しかし、実はここからが問題なんです(´Д⊂)
一:上のプログラムみたいに左で白 右で黒を起きます。
  int 2ch[8][8]={
  {0,0,0,0,0,0,0,0}, (略
ニ:8*8のマスを二次元配列で実現します。
三:配列のデータは以下のとおり
  0 何もおかれていない
  1 白がおかれている
  2 黒がおかれている
四:クリックして置かれたらデータが変化するようにする
  2ch[0][0]=1; //0,0に白を置いた
  2ch[0][0]=2; //0,0に黒を置いた
五:囲まれたら反転させる。「縦」、「横」、「斜め」の条件をそれぞれつくる。

この条件でプログラムを作りたいンですけどさっぱり・・・・・・・・・・・・・・・・・・・・・汗
Cかあ。こういうのはC++の方がずっと分かりやすく書けるのに。
460458:03/09/02 22:07
あれ・・・これC++じゃないの?(滝汗
>>460
Cの範囲でしか書いていないように見える。

caseの中の処理を関数にできるようならした方がいいと思う。
関数化は頑張れば出来るかもしれないけど、まずは上のプログラムを・・・
なんかこう・・・プログラミングの根本的なところがわかっていないような・・・。
マウスクリックした位置に直接楕円を描画しちゃっていいのか、ほんとうに?
2ch[x][y]という2次元配列から得られる情報に基づいて楕円を描きたいんじゃないのか?

2ch[x][y]という2次元配列に白や黒の石を意味するデータをセットして、
反転チェックをさせて、その結果を描画したいんじゃないのか?

それとWM_PAINT以外のブロックに描画関数を置いても
画面が正常にリフレッシュされないぞ、多分。

・・・多分だけど・・・。
>>425 >>416
"&s[126]",って、全然ポインタちっくじゃない

int i=なにか;
char buf[適当];
char *tmp;

tmp = buf + sizeof(buf)-1;
*tmp='\0';
while( (tmp - buf) && i ) {
     *(--tmp)=(i&1)?'1':'0';
     i=i>>1;
}
printf("%sB\n",tmp);
466458:03/09/03 23:02
>>463
たしかに二次元配列から得られる情報に基づいて円を描けって問題の条件かもしれませんね。。。(つД`)
一応、問題には>>458で書いたこと以外には何も書かれていないのですが・・・・

>2ch[x][y]という2次元配列に白や黒の石を意味するデータをセットして、
>反転チェックをさせて、その結果を描画したいんじゃないのか?
・・・・そうです。(多分・・・・・・(´Д⊂)

・・・たしかにWM_PAINT以外の場所に描画関数置いても正常にリフレッシュしませんね。。。(取り合えず描画できればいいのかと思って_| ̄|○

>>464
ありがとうございます。しかしビルドするとerror C2061: 構文エラー : 識別子 'board' が出るんですけど。。。その他27件のエラーも(ToT)
まじ、スマソ_| ̄|○
467デフォルトの名無しさん:03/09/03 23:04
enum COLOR { SPACE = 0, WHITE = 1, BLACK = 2 };

デフォルトとおなじなのになんでわざわざ指定する。
小心者だから
469小心者>>458:03/09/04 00:33
・・・・・・・・・・(つД`)(´Д⊂)ワカネェ
>>464のをそのままコピってそのまま実行でエラーでないのですか?
enum COLOR{・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
より上に何かつけないといけないとか・・・(もうボロボロでつ)

ついでに言ってませんでしたけど
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=141
こっちのプログラムは関係ないですよねぇ・・・・・・(アァもう恥ずかしいわ
( ´д)ヒソ(´д`)ヒソ(д` )
471464:03/09/04 00:48
>>469
エラーになった?C++じゃなくてCなのかな。
じゃ、こう書き換えてみれ。

enum COLOR{・・・・・・・・・・・・・・・・・・・・・・・};

typedef enum { SPACE=0, WHITE=1, BLACK=2 } COLOR;

>こっちのプログラムは関係ないですよねぇ・・・・・・
そっちのプログラムの問題じゃないから気にスンナ。
もうとりあえず、いったんコンソールプログラムで書いちゃいなさい。
473デフォルトの名無しさん:03/09/04 01:05
関数ポインタを使って関数を呼び出す方法は
わかるのですが、同じような感じでクラスを作成する
方法は無いのでしょうか?
またはよい方法があれば教えてください。

以下はイメージです。

class Base{};
class AAA{}:public Base;
class BBB{}:public Base;
class CCC{}:public Base;

main(){
typedef Base(TBASE); // クラスポインタを受けるような型宣言はある?
LPCSTR arr[] = { "AAA", "BBB", "CCC", "DDD", };
TBASE* pbase() = NULL; // あくまでイメージです。

for(int i=0; i<sizeof(arr)/sizeof(LPCSTR); i++){
pbase = new arr[i](); // 要は文字列からクラスを作成したい
}
}
474458:03/09/04 01:16
ε-(ーдー)ハァ・・・・・・・・・・・・・・・・・・・・・俺はCをやってるのかC++をやってるのかも分かってなかったんだ。(もうやる気0)
>>471
for(int i=0;i<8;i++) { だと何故かエラーったのでint i;とfor(i=0;i<8;i++) { にしてみたら出来ました。
本当にありがとうございます!!!!感謝*感謝


でも、typedef enum とか習って無いし、これだと普通に先生にばれるっぽい。(鬱鬱
明らかに上で自分が書いたのと差があり杉〜・・・・・。。。。,,,,,
475デフォルトの名無しさん:03/09/04 01:55
doubleのt[0]、t[1]、t[2]、t[3]、t[4]、t[5]があって
この中で0以上で一番小さいtは何番目のtなのかを調べたいのですが、
どうしたらいいでしょうかね?

0以上で一番小さいtの”値”を求めるのはできるんですが、”何番目”のtなのかが知りたいんですが・・・(´・ω・`)
tの値を選ぶ時に何番目なのかを記憶
>>475
mとnは整数。m=0、n=0。

nを0としてn<6が成立する限りnを位置ずつ増やしてループ
t[m]>t[n]が成立するとき、m=n。

ループ終了時、t[m]が最小値、mがその位置。
478デフォルトの名無しさん:03/09/04 03:10
0以上ってのはt[0]以上ってことでわなくて、正の値ってことです。
説明不足ですまそ。
>>473
BASE* create(LPCSTR className);
という関数なりメソッドなりを作って、インスタンス生成を
隠蔽してはだめなのか?
LPCSTRとか言うなああああ
>475
int i,min,cnt=0;
for(i=0;i<5;i++){
 if(!cnt){
  if(t[i]>=0) min=i;
  cnt++;
 }
 else if(t[i]>=0 && t[i]<t[min]) min=i;
}

cnt>0が真の時、minの値が解

こんなんぢゃ、ダメ?
482475,478:03/09/04 05:42
>>481
だめっぽいです
483475,478:03/09/04 05:43
>>481
やっぱ逝けるかも
484475,478:03/09/04 05:56
  if(t[i]>=0){
min=i;
  cnt++;
485475,478:03/09/04 05:58
if(t[i]>=0){
min=i;
  cnt++;
}
4行目のifって上みたいにcnt++までかかるんじゃないんですかね?
>>477を拡張して、

mとnは整数。m=0、n=0。

nを0としてn<6が成立する限りnを1ずつ増やしてループ
t[n]>=0でかつt[m]>t[n]が成立するとき、m=n。

ループ終了時、
t[m]<0であるならば、この配列には0以上の数値がない。(解なし)
t[m]>=0ならばt[m]が最小値、mがその位置。

これでどうなんだよ。
487486:03/09/04 10:44
あ、だめだ。t[m]<0だとうまくいかないわ。(笑
488486:03/09/04 10:49
mとnは整数。m=0、n=0。

nを0としてn<6が成立する限りnを1ずつ増やしてループ
t[m]<0が成立する時、
または、
t[n]>=0でかつt[m]>t[n]が成立する時、m=n。

ループ終了時、
t[m]<0であるならば、この配列には0以上の数値がない。(解なし)
t[m]>=0ならばt[m]が最小値、mがその位置。

こうだな。ためしにサンプル作ったらうまくいったし。
今度こそ大丈夫。(笑)
>>476 を簡単実装
double min=1e+16,minpos=-1;
for(int i=0;i<=5;i++){
if(t[i]<=0) continue;
if(min>t[i]){minpos=i;min=t[i];}
}

doubleの最大値いくらかわかんないんで適当な実装。
>>475

#include <stdio.h>

int main(void)
{
double t[5];
int min = 0;
int i;

for(i = 0; i < 5; i++)
scanf("%lf", &t[i]);

for(i = 0; i < 5; i++)
{
if((t[i] >= 0) && (t[i] < t[min]))
min = i;
}

printf("%d番目\n", min+1);

return(0);
}
>>475
#include <iostream>
#include <algorithm>

template<class T,int N>
bool Comp(const T& lh,const T& found)
{
    if(lh<N || found<N){
        return found<N ? true : false;
    }
    return lh<found ;
}

template<class T>
std::size_t ElemNumber(const T* posi,const T* head)
{
    return ((unsigned)posi - (unsigned)head) / sizeof(T);
}

int main()
{
    using namespace std;
    double t[5] = { 0.0001, -1.2, 0.00001, -3.0, 0.1 };
    double *p = std::min_element(&t[0],&t[5],Comp<double,0>);
    cout<<*p<<' '<<ElemNumber(p,&t[0])+1;
    return 0;
}
>>479

やっぱりそういうような記述方式はなさそうです。
インスタンス生成隠蔽というか if ,else ifとかで
文字列を比較してクラスを生成するのは
なんか美しくないなあと。
493479:03/09/05 01:44
>>492
美しくない部分は隠しましょう。
例え文字列からインスタンス生成をする文法なりがあったとしても、
ハッシュテーブルとかを使って文字列から該当するクラスを見つけ、
そのクラスのインスタンスを生成するという実装が隠れている。
>>492
if, else
なんかを使いたくないなら初期化の時点で
493がいうように文字列をキーにインスタンスを生成する
関数ポインタかなんかを取り出せるハッシュテーブルを
作っとけばいいのでは
495494:03/09/05 15:28
こんなかんじ
class Base{
public:
virtual void putString(){ std::cout<<"Base\n"; };
};
class A: public Base{
public:
virtual void putString(){ std::cout<<"A\n"; };
};
class B: public Base{
public:
virtual void putString(){ std::cout<<"B\n"; };
};
Base* BaseCreater(){ return new Base; };
Base* ACreater(){ return new A; };
Base* BCreater(){ return new B; };
typedef Base* (*Creater)();

main(){
std::map< std::string, Creater > createrMap;
createrMap["Base"] = BaseCreater;
createrMap["A"] = ACreater;
createrMap["B"] = BCreater;

Base* temp;
temp = createrMap["A"]();
temp->putString();
delete temp;
}
デザパタのState/Strategyだな。
違った。この場合、factory methodだな。
何処が悪いんでしょうか?

#include <iostream.h>

int main(viid)
{
while(){
cout << "天才だ" << endl;
}

return 0;}
>>498
宿題か?

荒しはでていけ!
>>498
> cout << "天才だ"
ここが間違ってるから。
>498
>>500-501
ここは釣堀ですか?
>>494-495

なるほどお━━━━━━━(,,゚Д゚)━━━━━━━!

ハッシュを使うと上手くいけるかもなあとは思っていたのですが
C++では使ったこと無かったのでちょっとピンと来ませんでした。
(使えるらしいというのは知っていたのですが)

rubyとかだと気軽にハッシュを使っているのに(苦

とても参考になりました。
産休!
504デフォルトの名無しさん:03/09/07 01:44
8bitの2進数を10進数に変換させて一度出力し、
その10進数をまた2進数に変換させ出力する。
というプログラムはどう作ればいいんでしょうか?
>>504
プログラム作成そのものの依頼じゃないのね。

1. 自分でまず紙に書いてやってみる
2. それを箇条書きにする
3. 繰り返しや計算を変数を使って記述する
4. 何度も検証して、問題が無ければテスト用のプログラムを書く
5. 実際にプログラムを記述し、4. のテストプログラムが完動すれば、1段階終了
506デフォルトの名無しさん:03/09/07 02:32
>505
10進数を2進数に変換させる事は出来たのですが
2進数から10進数に変換させる方法が思いつきません。
どのようにすればよいのでしょうか?
>>497
ナイスな解答をもらえて見逃してました。

factory methodという考え方がすでにあったのね。
mapをラップしてfactoryクラスを作成すればとりあえず
完成系になりそうですね。
勉強になりますた。

デザインパターンも一度は目を通さないとと思いつつ
そのまんまだなあ。
char binary = "0101010";

int x = 0;
for(int i=0; i<8; ++i)
{
if(binary[i] == '1')
x |= 1;
x <<= 1;
}
return x;
509デフォルトの名無しさん:03/09/07 11:03
学校の課題です。お願いします。

要素数10の配列を2つ用意し、1つには学籍番号を、もう1つには点数を
下記のデータにて初期化する。
学籍番号を入力し、学生番号配列を順次検索により検索する。
見つかった場合には、対応する点数を出力する。
学生番号
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
101 113 115 128 133 202 205 219 236 240
       得点
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
93 56 69 83 100 75 12 32 98 53
510デフォルトの名無しさん:03/09/07 11:04
課題2

>>509を2分探索により検索せよ
>>509
とりあえず、課題1
#include <stdio.h>
typedef struct __NODE{
int index;
int score;
__NODE *next;
}Node;
int main(void)
{
Node node[10] = {
{101, 93, &node[1]}, {113, 56, &node[2]}, {115, 69, &node[3]}, {128, 83, &node[4]},
{133, 100, &node[5]}, {202, 75, &node[6]}, {205, 12, &node[7]}, {219, 32, &node[8]},
{236, 98, &node[9]}, {240, 53, NULL}
};
Node* list = node;
int index;
printf("学籍番号を入力 : ");
scanf("%d", &index);
while(list != NULL){
if(index == list->index){
printf("%d 番目の学生の得点は %d 点です。\n", index, list->score);
break;
}
list = list->next;
}
return(0);
}
>>509-510
そんじゃ俺は課題2
int binary_search(int key, int array[], int size)
{
int i, min, max;
for (min = 0, max = size; min < max; ) {
i = (min + max) / 2;
if (array[i] == key)
return i;
else if (array[i] > key)
max = i;
else
min = i + 1;
}
return -1;
}

int main()
{
int students[10] = { 101, 113, 115, 128, 133, 202, 205, 219, 236, 240 };
int points[10] = { 93, 56, 69, 83, 100, 75, 12, 32, 98, 53 };
int num, i;
printf("学生番号を入力 : ");
scanf("%d", &num);
i = binary_search(num, students, 10);
if (i >= 0)
printf("学生番号%d : 点数%d\n", num, points[i]);
return 0;
}
513509:03/09/07 16:04
評価
>>511 55点
減点内容
・「要素数10の配列を2つ用意し」という条件に反している(-20)。
・先頭にアンダースコアを使った名前を宣言している(-15)。
・__NODE.next の値を手作業で記入している(-5)。
・出力内容がおかしい(-3)。
誤)"%d 番目の学生の得点は %d 点です。\n"
正)"学籍番号 %d の学生の得点は %d 点です。\n"
・定数 10 をマクロで宣言していない(-2)。

>>512 88点
減点内容
・関数 bsearch を使用していない(-10)。
・定数 10 をマクロで宣言していない(-2)。
514デフォルトの名無しさん:03/09/07 17:57
>>509
評価よりお礼を言ったほうが良いのでは?
宿題やってもらったんだし・・・
>>514
?
>>513
頼む。もう2度と来るな。恥しすぎて、目も当てられんよ。
標準関数bsearchの返り値もしらんとはね。
この馬鹿が。

もし知ってるなら、"わざわざ"標準関数bsearch使うことで生じる
コストを評価できないとみえる。逝って、詫びて来い。

>>514
どーせ別人か釣り、無視しとけ。
>>516
513ではないが、

>標準関数bsearchの返り値もしらんとはね。
>この馬鹿が。
>
>もし知ってるなら、"わざわざ"標準関数bsearch使うことで生じる
>コストを評価できないとみえる。逝って、詫びて来い。

説明キボン
漏れも説明キボンヌ
要するにbsearchは
指定する配列の内容は指定する比較関数に従った整列順序を持ってなければいけない。
だから、整列順序にするためのコストがかかる。
>>511がさりげなくC++なのも
見逃してはならんな。
[bsearch]

構文

#include <stdlib.h>
void *bsearch(const void *key, const void *base, size_t nelem, size_t width, int (_USERENTRY *fcmp)(const void *, const void *));

解説

配列内のバイナリサーチ(二分探索)を行います。
bsearch は,メモリ上の nelem 個の要素を持つテーブル(配列)内を検索し,検索キーと一致する最初の項目のアドレスを返します。配列は,あらかじめ昇順にソートされていなければなりません。一致する項目が見つからなかった場合は,0 を返します。
注意:なお,これはバイナリサーチなので,最初の一致項目がテーブルの最初の項目ではない場合もあります。
size_t 型は,stddef.h ヘッダーファイル内に定義されています。
nelem は,テーブル内の要素の個数を示す
width は,テーブル内の 1 項目のバイト数を指定する
比較関数 fcmp は,_USERENTRY 呼び出し規約を指定して使わなければなりません。
fcmp は,elem1 と elem2 の 2 つの引数で呼び出されます。2 つの引数は,それぞれ比較される項目を指します。この比較関数は,2 つの引数が指す項目(* elem1 と * elem2)を比較し,その結果に従って整数値を返します。
bsearch では,fcmp の戻り値は以下のようになります。
*elem1 < *elem2 であれば,0 より小さい値
*elem1 == *elem2 であれば,0
*elem1 > *elem2 であれば,0 より大きい値
戻り値
bsearch は,検索キーと一致したテーブル内の最初の項目のアドレスを返します。一致するエントリが見つからなければ,bsearch は 0 を返します。
msdnいわく、
「小さな配列を用いたリニア サーチの方が、多くのポインタを持つデータ構造を用いた
 バイナリ サーチ (2 分検索) よりも高速である場合があります。
 後者はページ フォールトやキャッシュのミスヒットを発生させることがあるからです。」
参照が遠くなる事を言っているらしい。
たしかに自前で書いたほうが速いだろうけど、目くじら立てる程の事とも思えん。
>>519はアフォですか?
binary_searchも整列されてなければ動かないだろ
524522:03/09/07 19:25
ソートが必要な事をコストと言ってたのか・・・
見当違いでスマソ
525517:03/09/07 19:27
>>519-522
サンキュー、えrい人たち。
考えてみれば当然だな。
>標準関数bsearchの返り値もしらんとはね。
って書いてあったから思い至らなかったよ。
526517:03/09/07 19:31
って、納得しちまったぢゃないか。
学生番号はソート済みだし。
課題には明記されてるし。
逝ってくるよ。
527余計なことですが:03/09/07 19:35
>>511-512
きれいに書けてると思うけど、宿題なんだから
もうちょっとわかりやすく(単純に)書いてあげたほうが
良かったかもとは思いますです。

あと、2分木探索をコーディングするというのが
この課題の目的だと思われるので、
標準関数を使うのはやっぱりダメかと。
何にせよ>>513は痛過ぎるということで。。。
528522:03/09/07 19:54
>>527
んだんだ。インラインで2分検索書くのが最速。

しかし、インラインだと減点されるかも。
関数に分けるなら、標準関数使った方がバグの元を
減らせるという考え方もあり。
どう見ても 511 はだめだめじゃん。
「配列を2つ用意し」という条件が満たせないから、0点だろ。
おまえら、甘すぎ。
530529:03/09/07 20:23
>513 じゃないが、
>513の>512に対する評価は別として、>511に対する評価の二つ目までには激しく同意する。

アンダスコアで始まる名前は使うな。

#include <stdio.h>

#define ST_MAX 10
int gakuseki[ST_MAX] = {101,113,115,128,133,202,205,219,236,240};
int tokuten [ST_MAX] = { 93, 56, 69, 83,100, 75, 12, 32, 98, 53};

void main(void)
{
  int i,input,output;

  scanf("%d",&input);
  output = -1;
  for(i = 0;i < ST_MAX;i++)
  {
    if(input == gakuseki[i])
    {
      output = i;
      break;
    }
  }

  if(output == -1)
    printf("みつかりません");
  else
    printf("学籍番号 %d の学生の得点は %d 点です。\n",output,tokuten[output]);
}
#include <stdio.h>

#define ST_MAX 10
#defin NOT_FOUND -1
int gakuseki[ST_MAX] = {101,113,115,128,133,202,205,219,236,240};
int tokuten [ST_MAX] = { 93, 56, 69, 83,100, 75, 12, 32, 98, 53};

void main(void)
{
  int i, input, output;

  scanf("%d",&input);
  output = NOT_FOUND;
  for(i = 0; i < ST_MAX; i++)
  {
    if(input == gakuseki[i])
    {
      output = i;
      break;
    }
  }

  if(output == NOT_FOUND)
    printf("みつかりません");
  else
    printf("学籍番号 %d の学生の得点は %d 点です。\n", output, tokuten[output]);
}
#include <stdio.h>
#define ST_MAX 10
int gakuseki[ST_MAX] = {101,113,115,128,133,202,205,219,236,240};
int tokuten [ST_MAX] = { 93, 56, 69, 83,100, 75, 12, 32, 98, 53};
int input;
//---------------------------------------------------------------------------
int bungi(int a,int b)
{
  int ans;
  int next;

  next = ((a + b) + ((a + b) % 2)) / 2;

  if(a == b)
  {
    if(gakuseki[a - 1] == input)
      ans = a;
    else
      ans = -1;
  }
  else if(gakuseki[next - 1] > input)
    ans = bungi(a,next - 1);
  else
    ans = bungi(next,b);

  return ans;
}
(続く)
void main(void)
{
  int output;

  scanf("%d",&input);
  output = bungi(1,ST_MAX);

  if(output == -1)
    printf("みつかりません");
  else
    printf("学籍番号 %d の学生の得点は %d 点です。\n",output,tokuten[output]);
}
連投やっちまった…。スマソ。
>>531が課題1で
>>533-534が課題2です。
スペースは全角で入れてるので置換してくだされ。
で、逝ってきます。
>>527
>あと、2分木探索をコーディングするというのが
>この課題の目的だと思われるので、

いわゆる「出題者の意図を汲み取る」って奴ですか?

scanfは良いが、bsearchはダメってのもなぁ。

ところで、>>513を「評価」する香具師は現れないのか?
精神年齢の低いスッドレですね
539デフォルトの名無しさん:03/09/07 22:55
うはは、酔っぱらいは精神年齢はさがるものさぁ〜。
あ、なんか日本語からしておかしいや(w
540デフォルトの名無しさん:03/09/07 22:58
二分探索と二分木探索は違うYO!
ソート済配列に対して,つまり理想的二分木という限定条件付なら、いこーるやね。
へべれけぇ〜
>>539
明日から仕事ですよ。もう寝ましょう。
543デフォルトの名無しさん:03/09/08 00:07
お願いします!
書式文字列を整える関数の作成
char *dateset(int year)
引数(入力)             int型
関数値(出力)整えた文字列のポインタ char型
/************************/
(出力例)
書式 ####
2020
/***********************/
って感じの問題です
#include<stdio.h>
char *date(int);
main()
{
int year = 1;
printf("%s\n",*date(year));
return 0;
}
char *date(int nen)
{
char moji[10] ;
moji[0] = 49;
moji[1] = 49;
moji[2] = 49;
moji[3] = 49;
moji[4] = 49;
return &moji[0];
}
で通すと文字化けします??
544デフォルトの名無しさん:03/09/08 00:09
ここに書き込みをする奴らで、プロのプログラマーって、
どれくらいいるんだろう?
545デフォルトの名無しさん:03/09/08 00:14
>>543
問題がよくわからんのだが、そのコードの問題点を挙げると、
* dateの戻り値を逆参照したもの、すなわちchar型の値を%sに対応させている
* 配列mojiは関数を抜ければ消えるのに、そのアドレスを返している。
546デフォルトの名無しさん:03/09/08 00:23
失礼
printf("%s\n",date(year)); ← printf("%s\n",*date(year));
でした。
まだ勉強中なので(* 配列mojiは関数を抜ければ消える )の意味が分かりません
お願いします
mojiの終端を指定してないのも駄目だろ
548デフォルトの名無しさん:03/09/08 00:24
>547
"\0"に対応する整数値を入れればいいのですか??
549デフォルトの名無しさん:03/09/08 00:25
つ〜か、問題自体が分からん。
もう少し分かりやすく書いてくれないと答えようがない。
550デフォルトの名無しさん:03/09/08 00:27
>>547
そうだ。それもあるな。
しっかし問題文がさっぱりわからん。
551デフォルトの名無しさん:03/09/08 00:31
関数を作る問題です
mainの中の引数(int型)を関数char *date(int); の中で文字列のポインタ
(char型)で出力して書式文字列を整える関数を作りなさいと言う問題です
分かりにくくてすみません
552デフォルトの名無しさん:03/09/08 00:34
>>551
「書式文字列を整える」というのを具体的に。
もしなんとも言われていないのなら、「そんなもんわかるかボケ!」でいいと思う。
553デフォルトの名無しさん:03/09/08 00:34
>>551
やっぱり分からん。
とりあえず、入出力例をいくつか書いてみ。
554デフォルトの名無しさん:03/09/08 00:36
すみません間違えました
誤: 文字列のポインタ(char型)で出力して書式文字列を整える関数
正: 文字列のポインタ(char型)を返す書式文字列を整える関数
555デフォルトの名無しさん:03/09/08 00:40
(入力例)
年号 20
月 3
日 7



(出力例)

書式 ####/##/##
2020/03/07

ですホントは引数が3個なんですが1個の方が分かりやすいかなと思い
ました
カレンダーの1つの仕様らしいです
556デフォルトの名無しさん:03/09/08 00:43
>>555
ああそういうこと・・・・

#include <stdio.h>
char *date(int year,int month,int day)
{
static char s[50];
sprintf(s,"%04d/%02d/%02d",year+2000,month,day);
return s;
}

557デフォルトの名無しさん:03/09/08 00:45
>>556
ありがとうございます
さっそくためしてみます
>ですホントは引数が3個なんですが1個の方が分かりやすいかなと思いました

そういう変更はしない方がいいよ。
重大な部分の欠損や誤解を生じる可能性があるから。
このスレで何より一番大事なのは、「問題文を一字一句、正確に書き写すこと」
559デフォルトの名無しさん:03/09/08 14:13
内積を求める式   
a・b = |a||b|cosθ (θはaとbの間の角度)
とするとき
の内積を求めるプログラムを作れ
なんですが?どなたか〜作ってください。



となる。また、

長さと角度をもとめればいいんでしょ。
561デフォルトの名無しさん:03/09/08 14:54
>>560
そうなんです、説明不足ならすみません
ベクトルがどういうデータになってるか解らないんだけど。
563デフォルトの名無しさん:03/09/08 17:34
>>562
ちゃんと調べてきます。
564デフォルトの名無しさん:03/09/09 01:31
2つの入力ファイルを8bit2進数で読み込んで一度、10進数に変換して、加算
し、2進数にして出力する。また読み込むデータは、10個ほど用いること。
という課題が出ました。

#include<stdio.h>
#include<stdlib.h>
int main()
{
char ina[7], inb[7], out[8];
int a=0, b=0;
int c, i, x, z;
int j=1, y=1;
FILE *fp1, *fp2, *fp3;
fp1 = fopen("aain.txt", "r");
fp2 = fopen("bbin.txt", "r");
fp3 = fopen("ccout.txt", "w");
/* 入力ファイルaain.txtの読み込み */
for(i=0; i<8; i++){
ina[i] = fgetc(fp1);
printf("%d\n", ina[i]);
}
printf("\n");
for(i=7; i>=0; --i){
if(ina[i] == 1){
a += j;
j <<= 1;
}
else{
j <<= 1;
}
}
printf("入力a(10進): %d\n\n", a);
565デフォルトの名無しさん:03/09/09 01:33
続き
/* 入力ファイルbbin.txtの読み込み */
for(x=0; x<8; x++){
inb[x] = fgetc(fp2);
printf("%d\n", inb[x]);
}
printf("\n");
for(x=7; x>=0; --x){
if(inb[x] == 1){
b += y;
y <<= 1;
}
else{
y <<= 1;
}
}
printf("入力b(10進): %d\n\n", b);

/* 出力ファイルccout.txtに書き込む */
c = a + b;
printf("a + bの出力c(10進): %d\n", c);
printf("a + bの出力c(2進): ");
566デフォルトの名無しさん:03/09/09 01:34
続き2

z = -1;
do{
z++;
if(c%2 == 1){
out[z] = 1;
}else{
out[z] = 0;
}
c /= 2;
}while(c > 0);
for(z=z; z>=0; z--){
printf("%d", out[z]);
fprintf(fp3, "%d", out[z]);
}
printf("\n");
fprintf(fp3, "\n");
fclose(fp1);
fclose(fp2);
fclose(fp3);
}

・ファイルからうまく読み込むことことが出来ない。
・10個のデータを全て読み込んでくれない。

よろしくお願いします。
567デフォルトの名無しさん:03/09/09 01:35
続き3

例)
aain.txtのデータ | bbin.txtのデータ | cout.txtのデータ
00000001 | 00000000 | 00000010
00000010 | 00000011 | 00000101
00000100 | 00000111 | 00001011
00001000 | 00001111 | 00010111
00010000 | 00011111 | 00101111
00100000 | 00111111 | 01011111
01000000 | 01111111 | 10111111
10000000 | 01111111 | 11111111
00001111 | 11110000 | 11111111
11110000 | 00000001 | 11110001
> ・ファイルからうまく読み込むことことが出来ない。

fgetcで0/1のasciiコードが返るのでatoiなどでint型に変換する必要があります。

> ・10個のデータを全て読み込んでくれない。

fopenからfcloseまでをループで囲めば良いのでは。
改行などの処理も追加する必要があります。
素直にfgetsに変えたほうが良いかもしれません。
>>569
fcloseがない。
571デフォルトの名無しさん:03/09/09 17:16
学校でのプログラムの授業は今まで用語の説明だけだったのに、いきなり以下のような問題が
出題されました。

次の定積分を台形則を使って計算するプログラムを作成せよ。分割数は100とする。

I=∫[x=0,1]4/(1+x^2) dx

ただし、プログラムには下の項目を含むようにすること。
1.変数はDoubleを使うこと。
2.積分する関数は、Functionプロシージャを使って計算すること。
3.分割数と積分区間はワークシートのセルから読み取る。(Cells( , ))
4.計算結果はMsgboxを使って表示する。
5.以下の型を用いる。
Function keisan (x as double) as double
End Function
Sub daiseki()
End Sub

全く分かりません…ご教授願います。
>>571
それ C ? それとも C++?
573571:03/09/09 17:40
Cです。
>>571
どうみても、設問がVB(w
>>571
int main(void){
double x=0;
for(x=0; 100>x; x++){
x/=100;
sum = 4/(1+x*x);
}
printf("sum=%d",sum);
return 0;
}
576575:03/09/09 18:03
多分大丈夫。(未実行)
int main(void){
double sum=0,x=0;
for(x=0; 100>x; x++){
x/=100;
sum += 4/(1+x*x);
}
printf("sum=%d",sum);
return 0;
}
577575:03/09/09 18:11
ループしていた。
#include <stdio.h>

int main(void){
double sum=0,x=0,p=0;
for(x=0; 100>x; x++){
printf("%f\n",4/(1+x*x));
sum += 4/(1+x*x);

}
printf("sum=%f",sum);
return 0;
}
578571:03/09/09 18:29
…VBでした。しったかしててすいませんでした。575さん、どうも。
579 ◆1haVRB54HY :03/09/09 20:23
http://pc.2ch.net/test/read.cgi/os/1062909154/53-
わかりません。
テポドンの男とは俺のことじゃないからね。なんでこんな宿題出されたんだろう。。。w
580デフォルトの名無しさん:03/09/09 20:44
1、はじめに文字を入力
2、次に文字列を入力
3、最後に2の文字列の中に1の文字がいくつ含まれるかを出力
(配列使用禁止、getcharを使って回答する)
というC++の問題で悩んでます
よろしくお願いします...。
配列使用禁止・・・
出題者の意図は理解出来るが、
出題者の思想は理解出来ん。
582デフォルトの名無しさん:03/09/09 23:06
>>580
なんで、この程度のことで悩むんだよ。
どこで悩んでるかくらい書けや。
つーか、お前のコード貼ってみれ。
>>580
#include <iostream>
using namespace std;
int main()
{
    char c;
    cout<<static_cast<char>(getchar())<<endl;
    int cnt=0;
    cout<<"文字列を入力して、Ctl+Zを押して!"<<endl;
    while((c=getchar()) != EOF){
        cnt += c=='1' ? 1 : 0;
    }
    cout<<cnt<<"個、1が含まれている";
    return 0;
}
584デフォルトの名無しさん:03/09/09 23:35
char c;
585デフォルトの名無しさん:03/09/09 23:37
>>583
implicit declaration of function `int getchar(...)'
586hiro:03/09/10 01:55
夜分遅く申し訳ありません。
学校の宿題でC++で地図を表示せよ。
という宿題が出たのですが全く手が出ません。
どうかそのプログラムを教えてください。地図はなんでもいいそうです。
今日はもう遅いので気がついたらお返事お願いします。
>>586

#include <iostream>

int main(){
std::cout <<
"洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋\n"
"洋洋洋洋洋島島島島島島島洋洋洋洋洋洋洋洋\n"
"洋洋洋島島島島島島島島島島島島洋洋洋洋洋\n"
"洋洋島島島島山山島島島島島島島島島島洋洋\n"
"洋島島島島山山山山山島島島島島島島島島洋\n"
"洋島島島島島山山宝山山島島島島島島島洋洋\n"
"洋洋島島島島島山山山島島島島島島島洋洋洋\n"
"洋洋島島島島島島山島島島島島島島洋洋洋洋\n"
"洋島島島島島島島島島島島島島島洋洋洋洋洋\n"
"洋島島島島島島島島島島島島島島島洋洋洋洋\n"
"洋洋洋島島島島島島島島島島島島島洋洋洋洋\n"
"洋洋洋洋島島島島島島島島島島島島洋洋洋洋\n"
"洋洋洋洋洋洋島島島島島島島島島島島洋洋洋\n"
"洋洋洋洋洋洋洋洋洋島島島島島島島島島洋洋\n"
"洋洋洋洋洋洋洋洋洋洋洋島島島洋洋洋洋洋洋\n"
"洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋洋\n"
<< std::flush ;
}
588デフォルトの名無しさん:03/09/10 07:32
数学板ではスレ違いだったようなのでこっちで聞くわ
スレ違いだとは思うんだけど、フェルマー法で素数を判定すると絶対疑素数は何度繰り返して
も通り抜けちゃうけど、ラビン法とかstllassenn法とかは絶対疑素数でもブロックする事ができ
るの?数値計算も詳しい人いたら教えてちょ
589デフォルトの名無しさん:03/09/10 07:33
スレ違いだとは思うんだけどっていうのナシで
>>588
どちらも確率的な判定法だから抜けるものもある。
多項式時間で確実に判定する方法はあるが、遅い。
591デフォルトの名無しさん:03/09/10 12:57
586の地図表示って面白いね。アスキーアートで表現できる人いないかな?
592デフォルトの名無しさん:03/09/10 15:33
>>562
ベクトルの内積 
A・B=|A|・|B|cosθ
これを成分表示すると
A・B=AxBx+AyBy+AzBz になる
配列の方が行列式として扱いやすいため、
配列を使用して表現すること。
a = (1,2,0) の場合
a[1]=1;
a[2]=2;
a[0]=0;
を利用して
内積のプログラムを作れ。
です。これで、わかります??。
593●のテストカキコ中:03/09/10 15:34
http://ula2ch.muvc.net/ (このカキコは削除しても良いです)
#define DIM 3
typedef vector double[DIM];
double inner_product(vector a, vector b) {
double ip = 0;
int i;
for (i = 0; i <DIM; ++i) {
ip = a[i] * b[i];
}
return ip;
}
>>591
物質スレで地図貰ってきた
                                    ┌─────┐
                                    │        │
                                    │ 北海道  │
                                    │        │
                                    ├────┬┘
                                    │青 森  └┐
                                    ├──┬──┤
                                    │秋田│岩手│
                        ┌──┐       ├──┼──┼┐
                        │石川│       │山形│宮城│└┐
      ┌──┬──┬──┬┐  ├──┼──┬──┼──┼──┤ └┐
       │山口│島根│鳥取│└┐│福井│富山│新潟│群馬│栃木│福島│
  ┌──┬──┼┐  ├──┼──┤  └┬──┼──┼──┼──┼──┼──┼──┤
  │佐賀│福岡│└┐│広島│岡山│兵庫│京都│滋賀│岐阜│長野│山梨│埼玉│茨城│
  ├──┼──┤  └┼──┼──┤  ┌┴─┬┴─┬┴─┬┴─┬┴──┼──┼──┤
  │長崎│熊本│大分│愛媛│香川├─┤大阪│奈良│愛知│静岡│神奈川│東京│千葉│
  └─┬┴──┼──┼┐  ├──┤  └┬─┴─┬┴─┬┴──┴───┴──┴──┘
     │鹿児島│宮崎│└─┤高知│徳島│和歌山│三重│
┌──┼───┴──┘   └──┴──┴───┴──┘
│沖縄│
└──┘
596デフォルトの名無しさん:03/09/10 16:08
今やっているのが配列程度のところまでしか進んでいないので、
その程度の能力でもわかる一番単純なやり方を教えてください。

宿題1
要素数10の配列を用意し、下記のデータにて初期化する。
そのない世を単純選択法にてソートしなさい。ただし、
ソートされていく状態を随時出力すること。
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
8 25 33 55 48 24 2 9 42 3

宿題2
要素数10の配列を用意し、下記のデータにて初期化する。
そのない世を単純選択法にてソートしなさい。ただし、
ソートされていく状態を随時出力すること。
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
6 17 19 5 61 42 39 0 18 82



597デフォルトの名無しさん:03/09/10 16:15
>>596
いまの授業で関数を使っていないので
関数は使わないでいただくとありがたいです
>>596
#include <stdio.h>

int main()
{
int nums[]={8, 25, 33, 55, 48, 24, 2, 9, 42, 3 };
int i, j, k, tmp, min;
for (i=0; i<10; ++i) {
min=i;
for (j=i; j<10; ++j) {
if (nums[min] > nums[j]) {
min=j;
}
}
tmp=nums[i];
nums[i]=nums[min];
nums[min]=tmp;

for (k=0; k<10; ++k) {
printf("%d ", nums[k]);
}
printf("\n");

}
}
単純選択法って書いてあるからやり方も何もないと思うが。
要するに習い立て臭さを演出してくれってことだと解釈したが
601デフォルトの名無しさん:03/09/10 17:26
1.要素が3つある整数型の配列 A[3] をプログラムの中で初期化( {3,5,7} )し、その配列と文字列 "TEST" を、ダイナミックアロケーションによって確保されたメモリへ格納する。何かキーを押されたら、プログラムを終了する。

2.次に示すような文字列の配列データを順にスタックへ格納し、取り出すプログラム。コマンドは、 "i" で格納、 "o" で出力、 "e" で終了とし、スタックを操作する際扱った文字列を画面に出力する。上下限を超えたらメッセージを出力し、エラー処理を行なう。
char *w[7];
w[0] = "Monday";
w[1] = "Tuesday";
w[2] = "Wednesday";
w[3] = "Thursday";
w[4] = "Friday";
w[5] = "Saturday";
w[6] = "Sunday";
>>601
マルチポストすんな
>>601
マルチしね。
文字を一つ入力しその入力した文字がアルファベットの大文字であれば「A」、小文字の場合「nida」、数字の場合「2get」と表示するプログラムを作成しる

分かりませんので教えてニダ
>>604
Cバージョン。C++のが良かった?
#include <stdio.h>
#include <ctype.h>
int main()
{
int c = getchar();
if (isupper(c))
printf("A\n");
else if (islower(c))
printf("nida\n");
else if (isdigit(c))
printf("2get\n");
return 0;
}
>>605
ええ
例えばaho_desuと入力すると
aahhoo__ddeessuuと出力するプログラムを作って下さい。
条件:配列char 2ch[30]を宣言して2重ループを使用する
>>607
無理
609607:03/09/11 19:11
>>608
出来る筈なんですけど
610607:03/09/11 19:15
変数名の2chってのが不味いのかも
じゃぁ変数名はBufferに変更
611デフォルトの名無しさん:03/09/11 19:16
以下の距離計算式を用いて、2地点間の距離を求めたいのですが、
実際と全く異なる数値が出てしまいます。本当は、距離と方位を
求めないといけないのですが、まず距離でつまづいています。
よろしくお願いします。

 (2) ヒュベニの距離計算式
D=sqrt((M*dP)*(M*dP)+(N*cos(P)*dR)*(N*cos(P)*dR))
D: 2点間の距離(m)
P: 2点の平均緯度
dP: 2点の緯度差
dR: 2点の経度差
M: 子午線曲率半径
N: 卯酉線曲率半径
M=6334834/sqrt((1-0.006674*sin(P)*sin(P))^3)
N=6377397/sqrt(1-0.006674*sin(P)*sin(P))
612デフォルトの名無しさん:03/09/11 19:23
>>607
#include <stdio.h>
int main()
{
char Buffer[30];
int c;

while(0) while(0);
while((c=getchar)!=EOF){
putchar(c);
putchar(c);
}

return 0;
}
613611:03/09/11 19:25
自分で作ってみたソースなのですが、
長すぎてここに貼れなかったので、以下のところに貼らせてもらいました。
ここに書き込むためにだいぶ空白行を削ってしまい、見難くなって
しまいました。お手数おかけします。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=7&fi=no
614607:03/09/11 19:33
>>612
よりもっと初心者っぽく書いてくれる人キボウ
ついでに612見ても全然意味わからんし、エラーでるし・・・
615デフォルトの名無しさん:03/09/11 20:04
あるtxtファイルの一部分を、別のtxtファイルの一部分にコピーする
のってどうすればいいのですか?
>>613
この手のプログラムは、
1) 机上で計算する
2) printfを埋め込むなり、デバッガを使って途中の計算結果を確認する
3) 1) 2)を比較して、どこの計算が間違えているか特定する
という感じにデバッグする。
机上計算は面倒なんで、ここらで逃げます。
>>616
なるほど。とても参考になります。机上計算をやって照合してみます。

> 2) printfを埋め込むなり、デバッガを使って途中の計算結果を確認する

printfで途中結果を確認することはやっていたのですが、
ここでのデバッガとは具体的にはどのように行なうものなのですか?
コンパイル時に出たエラーをつぶすのがデバッグ、くらいの認識しか
無いもので。よろしくお願いします。
>616
デバッガ(Debugger)ってのは、デバッグ(Debug)をする人(er)のこと。
まあこの場合は人じゃなくてそういうツール。
gdbだとか色々そういうツールはあるが、まあとりあえずは
デバッガの使い方からやるよりかはprintfのほうが早いかも。
619618:03/09/11 21:58
ごめんレス先間違えた。
>>617ね。616ごめん。
>>614
いたたたたたたた。
意味がわかるように努力して。
while((c=getchar())!=EOF){
621デフォルトの名無しさん:03/09/11 22:12
>>596
の宿題2の問題が、「単純選択法にてソートしなさい」
って間違えて書いてしまって、正確には
「単純交換法にてソートしなさいなので」
↓のような問題になるのでぜひお願いします

宿題2
要素数10の配列を用意し、下記のデータにて初期化する。
そのない世を単純選択法にてソートしなさい。ただし、
ソートされていく状態を随時出力すること。
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
 6 17 19 5 61 42 39 0 18 82

622デフォルトの名無しさん:03/09/11 22:21
問題多くてすいません('Д';)
なんせしめきりが明日なので・・。ぜひお力を。
ちなみに@は関数は使用しない方法でお願いします
それ以降が関数の問題なんで

@要素数10の配列を用意し、下記のデーターにて初期化する
 二分探索を利用し検索せよ。ただしデータのソートは
 単純交換法にて行うこと
 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
 23 7 1 4 3 22 99 39 11 77

A要素数10の配列を用意し、
 スタックにてデータ管理できるようにしなさい
 ただし、メニュー形式にし、各機能を関数化すること

B要素数10の配列を用意し、
 キューにてデータ管理できるようにしなさい
 ただし、メニュー形式にし、各機能を関数化すること

C,@の問題を関数化させなさい

623空き缶☆:03/09/11 22:26
あの、ソース丸投げとかって存在してるんですか?

例のマルチ?
>>611
#include <stdio.h>
#include <math.h>

#define PI 3.1415926535897932384626
#define B2R(D, M, S) (PI * ((D) + (M) / 60.0 + (S) / 3600.0) / 180.0)

int main()
{
 double P1, R1, P2, R2;
 double D, P, dP, dR, M, N;

 P1 = B2R(139, 44, 41);
 R1 = B2R(35, 39, 18);
 P2 = B2R(140, 5, 28);
 R2 = B2R(36, 6, 2);

 P = (P1 + P2) / 2;
 dP = P2 - P1;
 dR = R2 - R1;
 M = 6334834 / sqrt(pow(1 - 0.006674 * sin(P) * sin(P), 3.0));
 N = 6377397 / sqrt(1 - 0.006674 * sin(P) * sin(P));
 D = sqrt((M * dP) * (M * dP) + (N * cos(P) * dR) * (N * cos(P) * dR));

 printf("%f\n", D);
 return 0;
}
>>622(2)
#include <stdio.h>
typedef struct { int content[10]; int sp; } Stack;
typedef enum { PUSH, POP, QUIT } Command;

void push(Stack *stack, int value)
{ if(stack->sp < 10) stack->content[stack->sp++] = value; }

int pop(Stack *stack)
{ if(stack->sp > 0) return stack->content[--stack->sp]; else return 0; }

int main(int argc, char **argv) {
int value; Stack stack; Command cmd; stack.sp = 0;

do {
printf("select command(0:push, 1:pop, 2:quit)? ");
scanf("%d", &cmd);

switch(cmd) {
case PUSH:
printf("push value? "); scanf("%d", &value); push(&stack, value);
break;

case POP:
value = pop(&stack); printf("pop value = %d\n", value);
break;
}
} while(cmd != QUIT);

return 0;
}
627612:03/09/11 23:31
あ・・・getcharに括弧を付けるのを忘れた(^_^;) getchar()だな
宿題じゃないのですが、、、おしえてください。

あるテキストファイルがあります。それを2バイト文字と1バイト文字に分ける処理をしたいです。

例)
あいうEお5 という内容のTEST.TXT
これを読み込むと、
「2バイト文字は あいうお 、1バイト文字は E5 です」というメッセージを出す。

出来ますでしょうか・・・。
>>622(3)
#include <stdio.h>
typedef struct { int content[10]; int sp, ep; } Queue;
typedef enum { PUSH, POP, QUIT } Command;

void push(Queue *queue, int value)
{ queue->content[queue->ep] = value; queue->ep = (queue->ep + 1) % 10; }

int pop(Queue *queue)
{ return queue->content[queue->sp = (queue->sp + 1) % 10]; }

int main(int argc, char **argv) {
int value; Queue queue; Command cmd; queue.sp = -1; queue.ep = 0;

do {
printf("select command(0:push, 1:pop, 2:quit)? "); scanf("%d", &cmd);

switch(cmd) {
case PUSH:
printf("push value? "); scanf("%d", &value); push(&queue, value);
break;

case POP:
value = pop(&queue); printf("pop value = %d\n", value);
break;
}
} while(cmd != QUIT);

return 0;
}
>>628
#include <stdio.h>
#include <stdlib.h>

#define ismbblead(c) (((c) >= 0x81 && (c) <= 0x9f) || ((c) >= 0xe0 && (c) <= 0xfc))

int main(int argc, char **argv)
{
 FILE *fp;
 char *buf;
 int i, size;

 fp = fopen(argv[1], "rb");
 fseek(fp, 0L, SEEK_END);
 size = ftell(fp);
 fseek(fp, 0L, SEEK_SET);
 buf = malloc(size);
 fread(buf, 1, size, fp);
 fclose(fp);

 printf("2バイト文字は ");
 for (i = 0; i < size; i++)
  if (ismbblead(buf[i] & 255) && i < size - 1)
   printf("%.2s", &buf[i++]);
 printf(" 、1バイト文字は ");
 for (i = 0; i < size; i += 2)
  if (!ismbblead(buf[i] & 255) || i == size - 1)
   putchar(buf[i--]);
 printf(" です\n");
 free(buf);
 return 0;
}
>>614
#include <stdio.h>

int main() {
 char Buffer[30];
 int i, j;

 fgets(Buffer, sizeof Buffer, stdin);
 for (i = 0; Buffer[i] != '\0'; i++)
  for (j = 0; j < 2; j++)
   putchar(Buffer[i]);
 return 0;
}
回答者様ご苦労様です。
このスレはC初心者の私にとって学ぶ事柄が多いです。
633マキ:03/09/12 03:12
出力結果が
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
となるプログラムを
while文のみを使い配列に値を格納したいんですが
自分ではあっってるつもりなんですがどこがおかしいのか
分かりません。
配列に直接数値を入れずにしたいのです。
右斜めにあがっていって、上に振り切れればその列の一番下に行き
右に振りきれたらその行の左から上がっていく
数字にぶつかったら下の行くと行った感じの法則です
634マキ:03/09/12 03:13
#include <stdio.h>void main(void){
int a[5][5];int i;int j;int cnt;int g;i=0;j=2;cnt=0;g=1;
while((i!=4)&&(j!=2)) {
while((i>=0)&&(j<5)) {
cnt++; a[i][j]=cnt;
while(a[i][j]==(5*g)) {
cnt++; i++; a[i][j]=cnt; g++;
}
i--; j++;
}
while(i<0) {
i+=5;
}
while(j>=5) {
j=0;
}
}
cnt++; a[i][j]=cnt; i=0;
while(i<5) {
j=0;
while(j<5) {
printf("%d ",a[i][j]); j++;
}
printf("\n") i++;
}
}
635デフォルトの名無しさん:03/09/12 03:20
>>632
「ご苦労様」は目下の者に対して言う言葉・・・
636マキ:03/09/12 03:43
できました
637607:03/09/12 05:10
>>631
初心者っぽく書いてくれと言ったはずだが・・・
631見ても全然意味わからんし、「文字 '0x81' は認識できません。」とかいうエラーがいっぱい出るし・・・
>>637
初心者云々は知らんがいろいろ試してみろよ。
文字'0x81'は全角スペースのことだから半角スペースに直せば正常に動くぞ。
639626:03/09/12 07:11
>>630
buf[i] & 255はbuf[i]だけでよくない?
>初心者っぽく書いてくれと言ったはずだが・・・
オマエは何様やねん
>>630
ありがとうございます。なるほど、そうやって実現するんですね!勉強になりました!
642supermathmania ◆ViEu89Okng :03/09/12 14:34
Re:>638 コード体系によるが、全角スペースは0x810x40だ。
643607:03/09/12 15:21
>>640
お前には言ってねーよ。
出来ナインならレスするな。
まだ夏休みか
645デフォルトの名無しさん:03/09/12 15:28
int i, j;
for (i=0; 2ch[i]; i++)
for (j=0; j < 2; j++)
putchar(2ch[i]);
>>607
#include <stdio.h>
int ____(char _, int __){if (__ == 0)return 0;(putchar)(_);return (____)(_,--__);}
int _____(char *_){if (*_==NULL)return 0;(____)(*_,2);return (*_____)(++_);}
int main(){char _[((unsigned char) -1)];(fgets)(_,((unsigned char) -1),stdin); (*_____)(_);}

ほい。Cあんまり使ったこと無いからこれでいいだろ。
プロは絶対に書かないコード
いったい >>612 をそれ以上しろうとっぽくするには、どうすればいいのだろう。

1) putchar,getchar,EOF などの意味不明なものを使わない
2) #include ... はおまじないなので、いらない
3) return 0; は存在理由がわからないのでいらない
4) main() は void main() にしる
5) 変数に意味のある名前を使わない。aとかbとかにしる
5-ii) ローマ字表記の関数・変数を使う。hairetu[20]とかtasizan()とか。
C++で最大80文字までカウントするプログラム作れますか?
文字は1文字づつじゃなくて
ABC DEF
のようにスペースで区切ってABCで一文字、DEFで二文字と数えるやつです
スペースはカウントしないのです。


 
作れる、けど、一“文字”とは言わんだろー
そのへん どう表現していいかわかりませんでしたので
一文字っていっちゃいましたw
>>650
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(int argc, char **argv)
{
string str, word;
int num_word = 0;

cout << "input string: "; getline(cin, str);
istringstream iss(str.c_str());

while(iss >> word) num_word++;

cout << "#words: " << num_word;

return 0;
}
654607:03/09/12 22:14
>>637>>643は偽者です。スマソm(__)m
>>627>>631>>646氏 thx!!
>>631氏のみたいな感じのが望んでいた初心者ぽいのです。

>>647
自分が思う初心者っぽいのは>>631氏みたいな感じでさらに言えば適切じゃないんだろうけど
入力にはscanfで出力するのにはprintfでfor文は{}をつけて…etc...etc...みないな?
>>650
どこで見つけのか忘れたが、俺メモに入っていたやつから。

#include <string>
#include <fstream>
int main() {
int i = 0;
string c;
while(cin >> c) i++;
cout << "count: " << i << endl;
}
>>633
#include <stdio.h>

int main() {
 int a[5][5] = {0}, x = 1, y = 1, n = 0;

 while (n++ < 25) {
  while (++x >= 5) x -= 6;
  while (--y < 0) y += 6;
  while (a[y][x]) {
   while (--x < 0) x += 6;
   while ((y += 2) >= 5) y -= 7;
  }
  a[y][x] = n;
 }

 y = -1;
 while (x = -1, ++y < 5) {
  while (++x < 5) printf("%d ", a[y][x]);
  printf("\n");
 }
 return 0;
}
>>633
もう解決したみたいだけど、>>634のは終了条件が違ってる。
3行目の&&を||に変えるよろし。

それとついでに別解。

#include <stdio.h>

int main()
{
 int a[5][5], x = 2, y = 0, n = 0;

 while (n++ < 25) {
  a[x][y] = n;
  while (n%5 == 0 && n++ < 25) {
   y = (y + 1)%5;
   a[x][y] = n;
  }
  x = (x + 1)%5;
  y = (y + 4)%5;
 }

 y = -1;
 while (x = -1, ++y < 5) {
  while(++x < 5) printf("%2d ", a[x][y]);
  printf("\n");
 }
 return 0;
}

…もしかして剰余って使っちゃいかんのけ?
1.3333 2.56 3.14 12.25
8.9 0 1.23
5.3 4.1 5.7 6.9

のように空白と改行で区切られた小数が書いてある
ファイルからこれらを読み込んで
vector<vector<double> >
に格納するc++のプログラムを書いてくださいまし・・・
659(1/2):03/09/13 03:18
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

void ShowDouble(double val){
    std::cout << val << "/";
}
void ShowArray(std::vector<double>& double_array){
    std::cout << "---------------------" << std::endl;
    std::for_each(double_array.begin(), double_array.end(), show);
    std::cout << std::endl;
}
660(2/2):03/09/13 03:19
int main(){
    using namespace std;
    vector< vector<double> > ArrayOfArray;
    
    ifstream fin;
    string buffer;
    fin.open("data.txt");
    
    while(getline(fin, buffer)){
        vector<double> tmp;
        int pos = 0, next;
        
        while((next = buffer.find(" ",pos))!=string::npos){
            tmp.push_back(atof(buffer.substr(pos,next).c_str()));
            pos = next+1;
        }
        ArrayOfArray.push_back(tmp);
    }
    
    for_each(ArrayOfArray.begin(),ArrayOfArray.end(),ShowArray);
    return 0;
    
}
661659:03/09/13 03:22
すまん。

ShowArray関数で
誤 std::for_each(double_array.begin(), double_array.end(), show);
正 std::for_each(double_array.begin(), double_array.end(), ShowDouble);

でよろしく。
おお、ありがとうございます!
tmp.push_back(atof(buffer.substr(pos,next).c_str()));
ですか、なるほど、getlineで1行をstringに格納した後そうやって
変換するのですね。どうも有り難うございました
>>662
>>653のようにistringstreamを使った方がいいと思うよ。
>>663
確かに。>>659だと最後にスペースがないと
一番最後の数値が無視される罠。

    while(getline(fin, buffer)){
        vector<double> tmp;
        istringstream iss(buffer.c_str());

        string double_str;
        while(iss >> double_str) tmp.push_back(atof(double_str.c_str()));
        
        ArrayOfArray.push_back(tmp);
    }
string double_str;
while(iss >> double_str) tmp.push_back(atof(double_str.c_str()));

のかわりに

double val;
while(iss >> val) tmp.push_back(val);

じゃだめ?
>>665
むしろそちらの方がベターかと。
勉強不足を痛感っと。(メモメモ)
667野嶋 敬:03/09/13 21:42
遅くにすいません。レポート提出期限が火曜日なのに課題が出来なくて困ってます。。

@成績編集プログラムを作り、Excelで表示しなさい。
これは何となくですが出来ました。 多分fopen.fcloseを使うのだろうと思いました。
名前や国語・数学などの点数を適当な数値で入力して平均も出す事が出来ました。
A作った成績編集プログラムに学籍番号も入力出来るようにしなさい。
例:もし3番、2番、1番も順番で入力したら表示では1番、2番、3番と出来るように作れとのことらしいです。
これはfseekを使うと思って何とかできました。
B成績編集プログラムに追加・削除・修正出きるようにしなさい。
これがさっぱり分かりません。ここがどうにもなりません。

おしえてください。
>>667
ファイルを直接編集しようとして困ってるのかな。
データファイルの更新処理の基本的な流れは

(1) 既存のデータファイルをメモリに読み込む
(2) メモリ上のデータに対して追加・削除・修正を行う
(3) 新しいデータファイルを書き出す

だと思う。成績データの構造を配列なり構造体なりで定義した上で
この3つの処理を実装すればよい。
669668:03/09/13 23:03
補足だけど、読み込んだり書き出すのは更新する部分だけでなく、すべての
データね。
>>667
読み取ったデータをリンクドリストに入れていくのがいいと思います。

分かるなら、2分木とかもあり。
C++なら、STLコンテナのlist使うのもあり。
俺思うんだけど
学校の宿題って自分のわかる範囲で答えればいいんじゃないの
みえはって正しい答えを提出したってその時はいいかもしれんれど
結局、付けが自分に返ってくるだけじゃん。
俺が学生の頃なんて自分のわかる問題しか宿題を
解いていかなかったけどな。まーおかげでいい学校にいけんかったけど。
672デフォルトの名無しさん:03/09/13 23:37
数値を読み込んでます。
NaNがでてきたら、それを飛ばしたいのですが、
どうすればよいでしょうか?
if文で処理できますか?
>>672
宿題なら問題文を全てハリツケロ!
674デフォルトの名無しさん:03/09/13 23:55
>>673
問題文ってのがないのです。
100行の数字が並んでて、時々でてくるNaNが
いくつあるか知りたいのですが...
isnan()
_isnan()
があればいいのか?
マニュアルないのか?
>>672
文字列として入力してからチェック汁!
677野嶋 敬:03/09/14 00:14
667です。2番まではこんな感じだと思いました。
#include "stdafx.h"
#include "string.h"
//**** 構造体********************
struct data{
intBan; //番号
charName[10];//名前
intKoku;  //国語
intSuu;  //数学
intEi;  //英語
intGou;  //合計
floatHei;  //平均
};
typedefstruct dataDATA;
#defineMAX  10
intn,i;
//*** 初期化関数  ********************
void Clear( DATA *DP )
{strcpy(DP->Name,"0x00"); 
DP->Ban=0; DP->Koku=0; DP->Suu=0; DP->Ei=0; DP->Gou=0; DP->Hei=0;
}
//*** 入力関数   ********************
void In( DATA *DP )
{printf("何人分のデータを入力ですか?");
scanf("%d",&n);
printf("番号 名前、国語、数学、英語の順番で入力\n");
for(i=0;i<n;i++){
scanf("%d %s %d %d %d",&DP[i].Ban,DP[i].Name,&DP[i].Koku,&DP[i].Suu,&DP[i].Ei);
}
}
678野嶋 敬:03/09/14 00:15
区切り悪くてすいません。
//*** 計算関数   ********************
void Keisann( DATA *DP)
{
for(i=0;i<n;i++){
(DP[i].Gou) = (DP[i].Koku) + (DP[i].Suu) + (DP[i].Ei);
DP[i].Hei = (float)DP[i].Gou / 3;
}
}
//*** 表示関数  ********************
void Disp( DATA *DP)
{
FILE *fp;
fp=fopen("seru.csv","w");
fprintf(fp,"番号,名前,国語,数学,英語,合計,平均\n");
for(i=0;i<n;i++){
fseek(fp,DP[i].Ban*39L,SEEK_SET);
fprintf(fp,"%.1d,%-10s,%4.d,%4.d,%4.d,%4.d,%4.1f\n",DP[i].Ban,DP[i].Name,DP[i].Koku,DP[i].Suu,DP[i].Ei,DP[i].Gou,DP[i].Hei);
}
fclose(fp);
}
//*** main関数   ********************
int main(int argc, char* argv[])
{
DATAData[MAX]; //構造体宣言
Clear( Data ); //構造体初期化
In( Data ); //データ入力
Keisann( Data ); //計算
Disp( Data ); //表示
return 0;
}
679デフォルトの名無しさん:03/09/14 00:18
>>675
C言語で isnan()ってあるんですか?
680野嶋 敬:03/09/14 00:19
スペースの区切り悪すぎですいません。
ごめんなさい
>>679
C99で標準ライブラリに追加された。
http://seclan.dll.jp/c99d/c99d08.htm

C99準拠じゃなくても、isnan()が用意されている処理系は多い。

でも、文字列の"NaN"の判定には使えない。
682デフォルトの名無しさん:03/09/14 00:26
683デフォルトの名無しさん:03/09/14 00:39
NaNをファイルから読み込んだあとなら、isnan()は使えるのですか?
あと、x が NaN ならば整数非ゼロを返す。ってのは、
数を数えるのに利用できますか?
>>683
たぶん683が思っているような意味では使えない。

"NaN"という文字列を読み込んでもNaNにはならないから、
isnan()は使えない。
>>667
配列でいくなら、予めこんなので配列に全て読みこんでおく。

static const char FORMAT[] = "%.1d,%-10s,%4.d,%4.d,%4.d,%4.d,%4.1f\n";
static const int NUM_CONVERSION = 7;
int Read(DATA *DP){
    int result;
    fp=fopen("seru.csv","r+");
    result = EOF + 1;
    for(i=0; result != EOF ; ++i){
        result = fscanf(fp, FORMAT, DP[i].Ban,DP[i].Name,DP[i].Koku,DP[i].Suu,DP[i].Ei,DP[i].Gou,DP[i].Hei);
        if( num_converted != NUM_CONVERSION ) { /* エラー:ファイルのフォーマットがおかし
い */ }
        if( i >= MAX ) { /* エラー:配列が足りない */ }
    }
    return 1;
}
    
686デフォルトの名無しさん:03/09/14 13:41
以下のような問題があるのですが、歯が立ちません。
一行に文字列と数字があり、しかも間にスペースも無い
データをどうやって分解すれば良いものか・・・。

よろしくお願いします。

[作成するプログラム]
名前を入力して、一致する人がいれば、その人のデータを以下の形式で
表示させるようにしなさい。

名前:YAMADA 身長:175.5 体重:68.7

[検索するファイル]
次のように一行に一人ずつのデータが入ったファイル(kensin.txt)があります。

YAMADA 175.5 68.7
TAKAYANAGI168.3 57.6
SATO      183.7105.3




[データの構造]
名前(10文字)身長(5文字)体重(5文字)



>>686
kensin.txtの中身を正確に。
スペースは&nbsp;を使へ。
身長と体重の区切りが全角スペースってこたぁないだろ。
>687
scanf()で十分。

char name[11];
double height;
double weight;
scanf("%10s%5lf%5lf",name,&height,&weight);
>>688
初心者にいい加減なことを教えないように。
>>688
どういうこと?
scanfじゃなくてfscanfを使ってことか?

形の決まったファイルからの入力にこそ、scanfが有効なんだが。
691osage:03/09/14 22:40
( ´-`)。oO(誰か読書感想文書いてくれないかしら…)
>形の決まったファイルからの入力にこそ、scanfが有効なんだが。
解説希望。
よく「scanf() 使えねえ」といわれるのは、キーボード入力に使おうとするから。
scanfを使うとエラー処理、とくにエラーからの回復が難しい。

ファイルからの入力の場合、とくに文字数が固定されているような場合は
scanfのフォーマット文字列で桁数を指定することができるので便利だ。
>>688 のようにして入力することができる。

入力できた個数をチェックして、期待したものと違うときにはエラーとして
入力を終わらせる。
その後、プログラム自体を終了させるとか、別のファイル名を指定して
入力をやり直すとか言うのは別の問題だ。
694デフォルトの名無しさん:03/09/15 01:28
>>691
びっくりした。このスレと関係ないと思うが(w。
本は何が良いの?自分が持ってるのか、ネットで読める本があるなら。
695デフォルトの名無しさん:03/09/15 01:36
2分法を使った関数 f(x)=0 の解を求める関数、
int bisection_method(double (*f) (double), double* x, double x1, double x2, int max_iteration, double error)
を作成せよ。
引数第1は解を求める関数のポインタ、引数第2は解、引数第3第4は x の初期値、
引数第5は最大繰り返し回数、引数第6は収束判定値で、|f(x)| < error となった場合、解が得られたとする。
解が求められなかった場合は負、解が求まった場合は繰り返し回数を返す。
ここで言う2分法とは、f(x1)<0, f(x2)>0 の際に、x3=(x1+x2)/2 として、f(x3) を計算し、
f(x3) < 0 なら x1=x3, f(x3) > 0 なら x2=x3 として x1 と x2 の差を徐々に縮めていく方法。

何年か前の入社試験に出た問題。これくらいぱぱっと組めるなら、業界で長くやっていけるかも。
696デフォルトの名無しさん:03/09/15 01:59
>>695
1行目からわかりません。
これでいいの?

int bisection_method(double (*f) (double), double* x, double x1, double x2, int max_iteration, double error){
 for(int i=0; i<max_iteration; ++i){
  if(!(f(x1)<0 && f(x2)>0))
   return -1;
  double x3=(x1+x2)/2;
  double xx=f(x3);
  if(fabs(xx)<error){
   *x=xx;
   return i;
  }
  if(xx<0)
   x1=x3;
  else if(xx>0)
   x2=x3;
 }
 return -1;
}
>>697
Cだとエラーだな
>>695
なんか問題間違ってない?

演算の目的からして
>|f(x)| < error となった場合
|Δf(x)| < error のような気が。。。
700699:03/09/15 02:30
あ−、すまそ。
ゼロに収束するのね。
>>697
無駄なf(x)の演算があるから、100点はもえらえないだろうね。
>>701
無駄な演算どころか、正しい解を返さない場合があるから0点だな。
703698:03/09/15 03:21
for(int i=0;と書いているからC++として書いたのか。スマソ
>>693
えーと、どこを縦読みするのかな?
>>695
int bisection_method(double (*f) (double), double* x, double x1, double x2, int max_iteration, double error)
{
  int i;
  double x3;

  if(fabs(f(x1)) < error) { *x = x1; return 0; }
  if(fabs(f(x2)) < error) { *x = x2; return 0; }
  if(f(x1) > 0 && f(x2) > 0 || f(x1) < 0 && f(x2) < 0) { return -1; }

  for(i = 1; i <= max_iteration; i++)
  {
    x3 = (x1 + x2) / 2;
    if(fabs(f(x3)) < error) { *x = x3; return i; }
    if(f(x1) < 0 && f(x3) > 0 || f(x1) > 0 && f(x3) < 0) {
      x2 = x3;
    } else {
      x1 = x3;
    }
  }

  return -1;
}

再計算を避ける部分は省略。
>>695
閉区間、開区間、どちらの評価なのかまるでわからない。
ル‐プ内で離散のチェックは必要なの?
問題駄目駄目じゃん。

初期値 f(x1),f(x2)の評価も数学忘れちまったヤツには
できねぇよなぁ。

おっと、>695が適当に端折った可能性も否定できないな(藁

>>705
f(x1),f(x2)の大小関係を最初に補正すれば、もっと簡単に書ける。
初期値の評価は
  if(f(x1) > 0 && f(x2) > 0 || f(x1) < 0 && f(x2) < 0) { return -1; }
こっちを先にするべき。
707686:03/09/15 12:43
皆さん、ありがとうございました。
おかげで何とかできました。

>688
>scanf()で十分。

ファイルから読み込むので、fscanfで良いのですよね?
一応それで作って、うまく動きました。
どうもありがとうございます。大変助かりました。
708デフォルトの名無しさん:03/09/15 12:45
>>695
「C言語による最新アルゴリズム事典」約2400円 買って来い載っているから。
2分法
709デフォルトの名無しさん:03/09/15 12:53
Visual Studio .NETにおいて、数式中の数字と記号の間に、
自動的に半角空白文字を挿入することはでけますか?
あればその方法を教えてください。
例)
「a=b+d」

「a = b + d」
>>709
スレ違いだヴォケ!(・∀・)
すんませんでした。
712705:03/09/15 14:06
>>706

> 初期値の評価は
>   if(f(x1) > 0 && f(x2) > 0 || f(x1) < 0 && f(x2) < 0) { return -1; }
> こっちを先にするべき。

これは迷ったんだけど、確かにその方が仕様として明確だね。
お粗末でした。
>>705 & >>706
なぜ、 |f(x1)|<ε や |f(x2)|<εを解として認めてはいけないの?
714デフォルトの名無しさん:03/09/15 14:13
  是非教えて下さい。 list.datというファイルで、名前・所持金・出身地名が入っているファイルがあって、
名前(tamoriなら"t")をアルファベット(ABC順)順に並び替えるプログラムを作らなければなりません。
 あと、所持金で沢山持っている人を上から並べていくプログラムも教えて下さい。

ファイル名[list.dat]
tomoko 2000 hiroshima
tomohiro 1000 tokyo
akira 2400 kanagawa
↑ファイルで、ABC順にすると
akira 2400 kanagawa
tomohiro 1000 tokyo
tomoko 2000 hiroshima と言う風に並び替えたいのです。おねがいします
>>714
そんなものプログラム書くまでもないだろ?
sortコマンドですむんだから。

どうしても宿題でやらなきゃいけないというなら問題文を全部写せ。
先ずはそれからだな。
>>714
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
struct C {
  string name; int money; string location;
  C() {}
  C(string n, int m, string l) : name(n), money(m), location(l) {}
};
struct Comp1 {
  bool operator()(const C& op1, const C& op2) { return op1.name < op2.name; }
};
int main(int argc, char **argv) {
  vector<C> vc; Comp1 c1; C c; string buffer;

  ifstream ifs("list.dat");
  while(!ifs.eof()) {
    getline(ifs, buffer); istringstream iss(buffer);
    iss >> c.name >> c.money >> c.location;
    if(!iss.eof()) { vc.push_back(C(c)); }
  }

  sort(vc.begin(), vc.end(), c1);

  for(int i = 0; i < vc.size(); i++) {
    cout << vc[i].name << " " << vc[i].money << " " << vc[i].location << endl;
  }
  return 0;
}
>>714
>  あと、所持金で沢山持っている人を上から並べていくプログラムも教えて下さい。

>>716でのsort()の第3引数を以下のc2にする。

struct Comp2 {
  bool operator()(const C& op1, const C& op2) { return op1.money > op2.money; }
} c2;
>>713
ゼロを通る可能性が無いモノは解も無し。
この、問題の計算方法を使うにあたっての数学的前堤条件から、
ゼロに近いだけじゃ解として認められない。
本当は「f(x):x1→x2が連続である」とか、ややこしい話が
必要なんだけど、その辺はこの問題じゃ評価が無理っつ‐こと
で、条件を示さない >695 の駄目っぷりに乾杯。

自ら、ツッコミ入れておいてアレですが。
数学の問題じゃないし、きっと、あまり気にせずともOKさね。
問題がアバウトなら回答もアバウトで良し。

>697と見比べて、>705は多少その辺に考えが及んでいたので、
つい口が出ちゃったのさ。
ちと、言い方がまずいか。
ゼロを通るかもしれない、通らないかもしれない、では解として×。
必ず一回はゼロを通ると断言できれば、解として◎。
>719
fの計算の打切り誤差、桁落ちなどのせいで
数学的には0になるはずの値がわずかに0からずれてしまったのを
0とみなすことはしないの?
両端だけは特別扱いするの?
721sage:03/09/15 19:35
>>694
もし良ければこれにし鯛(つ´∀`)
http://www.zavn.net/index_h.html

スレ違いスマソ( ´,_ゝ`)
>>720
へ?
f(x1)<0<f(x2) や f(x2)<0<f(x1)
の判定を"先んじて"やらなきゃいけないってだけだぞ?

ん〜、>713だけみて、勘違いしたのか。
>>720
あ‐、すまん、論点ずれてたな。
確かにその点は、>695がちゃんと言及してないから、素直に
|f(x1)|<ε や |f(x2)|<ε
でも良いよ。

俺のは、確からしい解だけを吐くようにって方針の
上での話だから。そういう不確定なモノはいやん。
>>720
収束の判定は|x2-x1|で行う。必要な精度のxが求まればおしまい。
>>724
問題がそういう常識的なモノじゃないから困るんだなぁ、これが。
Δf(x)だけが判断材料の抜け作ちゃん。
おかしな設問にそこまでこだわらんでも
727デフォルトの名無しさん:03/09/15 22:04
この、問題に答えれ。
アルファベットと数字、空白が書かれた適当な長さの文字列について

1.この文字列内の英文字の文字数、数字の
    文字数を求めるプログラム
2.この文字列内で3文字以上英文字が連続するカタマリの数を求めるプログラム
    ("abcd123er45yui69eq"なら2個)
3.先頭から順番に大文字なら小文字に、小文字なら大文字に、数字は空白、
    空白は_に変換した新しい文字列を作成するプログラム
4.先頭から順番に3文字づつの文字列に分解し、その文字列を
    (もし最後が3文字に満たなければそのまま)順方向リストに登録するプログラム
5.先頭から順番に1文字づつ取り出して、5文字だけ入るパイプに入れていき、
    このパイプがあふれたら、先に入っていた文字を追い出すプログラム
6.上記5問のポインタver.。
>>727(1)(2)
#include <iostream>
#include <string>

using namespace std;
int main(int argc, char **argv) {
  string str;
  int num_chunk = 0, num_alpha = 0, num_num = 0, cont, i;

  getline(cin, str);
  for(i = 0, cont = 0; i < str.size(); i++) {
    if(isalpha(str[i])) {
      num_alpha++;
      cont++; if(cont == 3) { num_chunk++; }
    } else {
      if(isdigit(str[i])) { num_num++; }
      cont = 0;
    }
  }

  cout << "num_alpha:" << num_alpha << endl;
  cout << "num_num:" << num_num << endl;
  cout << "num_chunk:" << num_chunk << endl;

  return 0;
}
>>727(3)
#include <iostream>
#include <string>
#include <sstream>

using namespace std;
int main(int argc, char **argv) {
  int i; char c; string str; ostringstream oss;

  getline(cin, str);
  for(i = 0; i < str.size(); i++) {
    if(isupper(str[i])) { c = tolower(str[i]); }
    else if(islower(str[i])) { c = toupper(str[i]); }
    else if(isdigit(str[i])) { c = ' '; }
    else if(str[i] == ' ') { c = '_'; }
    else { c = str[i]; }
    oss << c;
  }
  cout << oss.str() << endl;

  return 0;
}
730デフォルトの名無しさん:03/09/15 22:57
>>728-729
もしかして、c++のプログラム?
言い忘れてたけどcのプログラム。
スマソ・・・
>>727(4)
#include <iostream>
#include <string>
#include <sstream>
#include <list>
#define min(a,b) ((a) < (b)? (a) : (b))
using namespace std;

int main(int argc, char **argv) {
  int i; string str; list<string> cl;

  getline(cin, str);
  for(i = 0; i < str.size(); i+= 3) {
    cl.push_back(string(str, i, min(3, str.size() - i)));
  }

  for(list<string>::iterator iter = cl.begin(); iter !=cl.end(); ++iter) {
    cout << *iter << endl;
  }

  return 0;
}
>>730
> 言い忘れてたけどcのプログラム。

c++です。お役にたてずすまぬ。
733デフォルトの名無しさん:03/09/15 23:25
>>732
いえいえ、こちらこそあつかましくスマン。
734727:03/09/16 00:04
誰か・・・答えて・・・
735727:03/09/16 00:05
c言語の方で。
736264:03/09/16 00:24
//3
#include<stdio.h>
#include<string.h>

int main(){
char str[128];
gets(str);


for(unsigned int i=0;i<strlen(str);i++){
if(str[i]>='0'&&str[i]<='9'){ //isdigit
str[i]=' ';
continue;
}
if(str[i]>='a'&&str[i]<='z'){
str[i]+='A'-'a'; //toupper
continue;
}
if(str[i]>='A'&&str[i]<='Z'){
str[i]+='a'-'A'; //tolower
continue;
}
if(str[i]==' '){
str[i]='_';
continue;
}
}

printf("%s\n",str);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main()
{
  char line[255];
  int i, n, rep;

  fgets(line, sizeof (line), stdin);
  n = rep = 0;
  for (i = 0; i < strlen(line); i++) {
    rep = isalpha(line[i]) ? rep+1 : 0;
    if (rep == 3)
      n++;
  }

  printf("%d個\n", n);
  return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct list {
char str[3];
struct list *next;
};

int main()
{
  struct list *p, *q, head = {"", NULL};
  char line[255];
  int i, j;

  gets(line);
  for (i = 0; i < strlen(line); i += 3) {
    if ( (p = (struct list *) malloc(sizeof (struct list))) == NULL)
      return -1;
    memset(p->str, 3, '\0');
    p->next = NULL;
    for (j = 0; j < 3 && line[i+j] != '\0'; j++)
      p->str[j] = line[i+j];
    for (q = &head; q->next != NULL; q = q->next)
      ;
    q->next = p;
  }

  for (p = head.next; p != NULL; p = p->next)
    printf("%.3s\n", p->str);
  return 0;
}
739727:03/09/16 02:15
コンパイル出来ないです・・・
>>727
>>727
//6番 "5文字だけ入る"なんてみると、いんちきしたくなる
#include <stdlib.h>
#include <stdio.h>
int main(){
struct {
char data[5];
char *current;
} pipe;
memset(&pipe,0,sizeof(pipe));
pipe.current = pipe.data + sizeof(pipe.data);
while(pipe.current - pipe.data ){
--pipe.current;
*pipe.current = getchar();
if(*pipe.current == EOF) return 1;
}
while(1){
*(int*)(pipe.data+1) = *(int*)pipe.data; //いんちき
*pipe.data = getchar();
if(*pipe.data == EOF ) return 1;
}
}

標準入力じゃなかったら、適当に書き変えれ!
741C初心者:03/09/16 03:57
下記の問題を答えてください。

1.1次元配列にn個の整数値を読み込み、ポンインタ変数を使用して、最大値
  の入っている配列のアドレスを求め、何番目の配列かとその値を表示しなさい。
  また、同様にポインタ変数を使用して最小値の値と何番目の配列か表示しなさい。

2.文字列”Congratulation!”で、真ん中から後ろの文字列を表示しなさい。また、
  1文字おきに表示してみなさい。

3.文字列”Apple”、”Orange”、”Melon”、”Pineapple”、”Peach”を
  ポインタ配列で初期化し、各文字列の先頭から4文字目の文字を表示しなさい。
  また、大文字を小文字に置き換えてみなさい。

4.身長と体重を入力して、体型指数BMIを求め、下記のような判断基準でメッセージを
  表示しなさい。ただし、実数型関数kansu_bmiを用い、BMI=体重(kg)/(身長(m)*身長(m))
  で求める。
    判断基準      メッセージ
   BMI<20       やせている
  20<=24     普通
  24<=26.4   太り気味
 26.4<=BMI    太りすぎ


5.配列のデータを昇順に並び替える関数を作りなさい。ただし、次の誕生日データ
  とし、月と日を2つの配列に入力してから、関数を呼び出して、並び替えなさい。
  なお、入力形式は月/日とし、/をデータの区切りとして、以下の5件の誕生日
  データを入力しなさい。
   誕生日データ:09/15,03/21,12/31,05/05,04/29

742C初心者:03/09/16 03:59
6.以下のようなデータを空白を区切りとしてキーボードから入力して、配列に
  読みこみ、英語名のアルファベット順に並び替えなさい。なお、味わい月に
  0を入力したとき、データの終了とする。ただし、文字列の大きさの比較には、
  strcmp(char s1,char s2)関数を用い、文字列の入れ替えには、strcpy(char s1,char s2)
  関数を使用しなさい。
  日本語     英語     味わい
   鯖     mackerl 10
新巻鮭 salmon 12
  岩魚  charr 7
  牡蛎 oyster 2
  帆立貝 scallop 1

7.数値nをキーボードから入力し、以下のような再帰関数を利用して、
  1からnまでの合計を求めなさい。
   int sum_recur(int n)
{
if(n==1) return 1;
else return sum_recur(n-1)+n;
}

8.1月から12月までの月の名前(文字列)と日数(整数)を構造体で定義して、
  1から12の月をキーボードから入力して、各メンバーを表示しなさい。
struct month
{
char mname[5]; /*月の名前*/
int day; /*月の日数*/
}month_tab[]={{"Jan",31},{"Feb",28},{"mar",31},
{"Apr",30},{"May",31},{"Jun",30},
{"Jul",31},{"Aug",31},{"Sep",30},
{"Oct",31},{"Nov",30},{"Dec",31}};

743C初心者:03/09/16 04:01
9.動物名、誕生時の体重(g)と現在の体重(g)のデータを構造体で定義し、
  増加率(%)を計算して、以下のように表示しなさい。
   種類    名前     誕生時の体重    現在の体重    増加率(%)
   猫    ミーちゃん    520       3250    xxx.xx
   犬    ぽち      1230       4180 xxx.xx
   鳥    ピー子      190        430 xxx.xx
   猿    もん太     1870       5740 xxx.xx

744C初心者:03/09/16 04:03
10.次の商品コード、商品名、単価、数量のデータを商品データとして、
   ファイル名syohin_f.datに書き出し、商品ファイルを作成しなさい。
     1010 大学ノート 150 5
1020 ルーズリーフ 200 15
2010 シャープペン 100 3
2020 ボールペン 200 8
2030 シャーボ 300 4
3010 蛍光ペン 150 3
4020 消しゴム 100 6

11.問題10で作成した商品ファイルに、次の商品コード、商品名、単価、数量
   のデータを追加しなさい。追加後、商品ファイルを読み取り、単価と数量から
   金額を求めて、下記の形式で表示しなさい。
   追加データ
   5010 定規 150 7
5030 のり 100 2
6020 はさみ 500 5

  表示形式
 商品コード    商品名     単価    数量   金額
  1010 大学ノート   150 5 xxxxxx
1020 ルーズリーフ  200 15 xxxxxx
: : : : :
6020 はさみ     500 5 xxxxxx
745CむずかC:03/09/16 09:08
数値入力==> 11
基数入力==> 2

結果 1011

となるようなプログラムで
基数入力のところで2進、8進、16進と入れても
結果がちゃんと表示されるような方法を教えてください
>>745
switch文で
switch(基数){
  case 2:
    .....
    break;
  case 8:
    .....
    break;
  case 16:
    .....
    break;
}
と分岐させれば(・∀・)イイ
>>746
switch( 基数 ) {
  case 2:
    i = strtol( 文字列, 0, 2 );
    break;
  case 8:
    i = strtol( 文字列, 0, 8 );
    break;
  case 16:
    i = strtol( 文字列, 0, 16 );
    break;
}
とな?

748CむずかC:03/09/16 10:35
ありがとうございました!
749747:03/09/16 12:58
i = strtol( 文字列, 0, 基数 );
って書くと、1行で書けるよ!

って >746 が気づいてくれるかと思ったのだが。
ネタじゃないのか…
同じ地点にいる4人が橋を渡ろうとしています。
時は夜で彼らは懐中電灯を一つ持っています。一
度に二人までしか橋を渡れません。橋を渡る時に
は必ず懐中電灯を持たねばなりません。
懐中電灯を他の人に渡す時は必ず手渡しでなければ
なりません。Aさんは橋を渡るのに1分、Bさんは
2分、Cさんは5分、Dさんは10分かかります。
ペアで歩く時は遅い方に歩調を合わせます。
17分以内で全員が橋を渡って橋の向う側に勢揃い
するにはどうすれば良いですか?

これ解くプログラムソース書いて
マ板へカエレ
753デフォルトの名無しさん:03/09/16 17:13
二重積分のプログラムを教えてください。
関数と積分範囲が任意に変えられるようなのをおねがいします。
>>751
17分以内って出来るの?
>>754
ABが行く 2分経過
Aが戻る 3分経過
CDが行く 13分経過
Bが戻る 15分経過
ABが行く 17分経過
Prologの教科書のサンプルソースとかにありがち。
>>749
問題は変換の向き逆じゃん(w
758デフォルトの名無しさん:03/09/16 20:55
今さら 695 の問題だが、ちょっと前にもどこかで見た気がするが。

    x1     x3     x2   f(x3)
0 -10.000000 0.000000 10.000000 -1.000000
1  0.000000 5.000000 10.000000 24.000000
2  0.000000 2.500000 5.000000 5.250000
3  0.000000 1.250000 2.500000 0.562500
4  0.000000 0.625000 1.250000 -0.609375
5  0.625000 0.937500 1.250000 -0.121094
6  0.937500 1.093750 1.250000 0.196289
7  0.937500 1.015625 1.093750 0.031494
8  0.937500 0.976563 1.015625 -0.046326
9  0.976563 0.996094 1.015625 -0.007797
10 0.996094 1.005859 1.015625 0.011753
11 0.996094 1.000977 1.005859 0.001954
12 0.996094 0.998535 1.000977 -0.002928
13 0.998535 0.999756 1.000977 -0.000488

loop 回数13回 x3 = 0.999756 : f(x3) = -0.000488

最終的にこういう形になれば、上出来なのだそうだ。
759>>751 (1/4):03/09/16 21:37
#include <iostream>
#include <bitset>
#include <list>
using namespace std;

struct State
{
  State(unsigned long fv, unsigned long tv, bool l, int t) {
    from = new bitset<4>(fv); to = new bitset<4>(tv); light = l; time = t;
  }
  State(const State& s) {
    from = new bitset<4>(*s.from); to = new bitset<4>(*s.to);
    light = s.light; time = s.time;
  }

  bitset<4> *from; // peoples in <from> a is from[3], ... d is from[0]
  bitset<4> *to; // peoples in <to>
  bool light; // true:light is <from> false:light is <to>
  int time;
};
760>>751 (2/4):03/09/16 21:38
bool satisfy(State *s)
{
  return s->from->to_ulong() == 0 && s->to->to_ulong() == 15 && !s->light && s->time <= 17;
}

int spend_time(bitset<4> *s)
{
  return (*s)[0]? 10 : (*s)[1]? 5 : (*s)[2]? 2 : (*s)[3]? 1 : 0;
}

list<bitset<4> *> *gen_candidates(bitset<4> *s)
{
  list<bitset<4> *> *l = new list<bitset<4> *>;
  bitset<4> *sp;

  for(unsigned long i = 0; i < 16; i++) {
    sp = new bitset<4>(i);
    if(sp->count() < 1 || sp->count() > 2 ||
      (sp->to_ulong() | s->to_ulong()) != s->to_ulong()) {
      delete sp; continue;
    }
    l->push_back(sp);
  }
  return l;
}
761>>751 (3/4):03/09/16 21:41
list<bitset<4> *> *take_next_step(State *s) {
  State *new_s; list<bitset<4> *> *trace; list<bitset<4> *> *candidates;
  if(s->time > 17) { return NULL; }
  if(s->light) {
    candidates = gen_candidates(s->from);
  } else {
    candidates = gen_candidates(s->to);
  }
  for(list<bitset<4> *>::iterator a_set = candidates->begin(); a_set != candidates->end(); a_set++) {
    new_s = new State(*s);
    if(s->light) {
      *(new_s->from) = *(s->from) & ~(**a_set);
      *(new_s->to) = *(s->to) | (**a_set);
    } else {
      *(new_s->from) = *(s->from) | (**a_set);
      *(new_s->to) = *(s->to) & ~(**a_set);
    }
    new_s->time = s->time + spend_time(*a_set);
    new_s->light = !s->light;
    if(satisfy(new_s)) {
      trace = new list<bitset<4> *>;
      trace->push_front(*a_set);
      return trace;
    }
    trace = take_next_step(new_s);
    if(trace) {
      trace->push_front(*a_set); return trace;
    }
    delete new_s;
  }
  return NULL;
}
762>>751 (4/4):03/09/16 21:41
int main(int argc, char **argv)
{
  State *init_s = new State(15, 0, true, 0);
  list<bitset<4> *> *trace;

  trace = take_next_step(init_s);
  if(trace) {
    cout << "the list of peoples to move." << endl << "abcd" << endl;
    for(list<bitset<4> *>::iterator a_set = trace->begin(); a_set != trace->end(); a_set++) {
      cout << **a_set << endl;
    }
  } else {
    cout << "no answer" << endl;
  }

  return 0;
}
763759:03/09/16 21:44
総当りのアルゴリズムでなんの工夫もないです。
コーディングもいい加減なので、反面教師として使ってください。
ちなみに実行結果は以下の通り。

the list of peoples to move.
abcd
1100
0100
0011
1000
1100
>>763
凄いですね
765デフォルトの名無しさん:03/09/16 22:46
すいやせん。他のところに投げてみたんですが、質問が多くて手間なのか、簡単すぎるのか、
反応がイマイチなので、こちらの住人のお力をお借りしたく参上しますた。
以下の構造体の関数について、全部とはいいません、1つでも教えてください。
なにしろ、どっから手をつけていいのかもわかんないので、参考にさせていただきます。

typedef struct Vector {

 double x, y;

} Vector

を使って、このベクトル構造体に対して次の関数を作成します。

1.ベクトルの長さを返す関数
2.ベクトルの符号を反転させる関数
3.2つのベクトルを加算する関数
4.2つのベクトルを減算する関数
5.ベクトルを n 倍する関数
6.ベクトルとベクトルのなす角度を返す関数 (atan2関数を使用する)
7.ベクトルの視点を中心として、 angle(rad) 回転させる関数
 回転公式 (x, y) を angle(rad) 回転 → (x', y')
 x' = cos(angle)*x + sin(angle)*y
 y' = -sin(angle)*x + cos(angle)*y

関数名や引数は自由。
腕に覚えある方はお願いします。m(__)m
766デフォルトの名無しさん:03/09/16 23:17
>>756
そのまえにお前は高1レベルの数学理解してんのか?
理解してるなら1くらいはわかるだろ。
767デフォルトの名無しさん:03/09/16 23:18
756 → 765
だった。スマソ
768753:03/09/16 23:29
>>753 ですがどなたかお願いします。
>765
double t(Vector tt)
{ return sqrt(tt.x*tt.x+tt.y*tt.y);}
Vector tt(Vector ttt)
{ Vector tttt = { -ttt.x, -ttt.y}; return tttt;}
Vector ttt(Vector tttt, Vector ttttt)
{ Vector tttttt={tttt.x+ttttt.x, tttt.y+ttttt.y}; return tttttt;}
Vector tttt(Vector ttttt, Vector tttttt)
{ Vector ttttttt={ttttt.x+tttttt.x, ttttt.y+tttttt.y}; return ttttttt;}
Vector ttttt(Vector tttttt,double ttttttt)
{ Vector tttttttt={ttttttt*tttttt.x, tttttt.y*ttttttt}; return tttttttt;}
>>765
間違ってはいないはず。

typedef struct Vector {double x, y;} Vector;
static Vector ctor(double x, double y) {Vector a; a.x = x; a.y = y; return a;}
double len(Vector a) {return hypot(a.x, a.y);}
Vector mul(Vector a, double n);
Vector neg(Vector a) {return mul(a, -1.0);}
Vector add(Vector a, Vector b) {return ctor(a.x + b.x, a.y + b.y);}
Vector sub(Vector a, Vector b) {return add(a, neg(b));}
Vector mul(Vector a, double n) {return ctor(a.x * n, a.y * n);}
double angle(Vector a, Vector b)
{return atan2(a.x * b.y - a.y * b.x, a.x * b.x + a.y * b.y);}
Vector rot(Vector a, double r)
{return ctor(a.x * cos(r) + a.y * sin(r), a.y * cos(r) - a.x * sin(r));}
>>753
#include <iostream>
using namespace std;

double func(double x, double y) { return x * x + y * y; }

int main(int argc, char **argv) {
  double x, y, x1, x2, y1, y2, dx, dy, s;

  cout << "input x1 x2 y1 y2:";
  cin >> x1 >> x2 >> y1 >> y2;

  dx = dy = 0.001; s = 0;
  for(y = y1; y <= y2 - dy; y += dy) {
    for(x = x1; x <= x2 - dx; x += dx) {
      s += func(x, y) * dx * dy;
    }
  }

  cout << "result:" << s << endl;

  return 0;
}
>>745
#include <iostream>
#include <list>
using namespace std;

int main(int argc, char **argv) {
  int n, radix;
  list<int> l;

  cout << "input decimal radix:"; cin >> n >> radix;

  for(; n > 0; n /= radix) { l.push_front(n % radix); }

  for(list<int>::iterator iter = l.begin(); iter != l.end(); iter++) {
    cout << *iter;
  }
  cout << endl;

  return 0;
}
773supermathmania ◆ViEu89Okng :03/09/17 12:56
(宿題ではないが)
複素Γ関数の逆数を計算するプログラムを書いてください。
3日経っても解答が無い場合は放置してください。
いや、もう放置しよう。
 
 
        ただいまの時刻
             9月20日 12時56分
                        です。
 
 
数学的知識がちょっとでも必要な宿題はスルーされやすいな
777デフォルトの名無しさん:03/09/17 19:29
C++で、cvs形式のdatファイルを読み込んで、
配列に格納するのって、どうやるんでしたっけ?
778765:03/09/17 20:23
765です。どうもありがとうございました! ちゃんとよびかければ、誰かきっと
答えてくれると思ってました。今ひとつひとつ動作を確認中です。ちゃんと動いてます。感謝です。
ベクトルっていうから難しく考えてましたが、こんなにシンプル書けるんですね。
大騒ぎしてすみません。
779パートタイマ急募!:03/09/17 20:23
LZ系の伸長プログラムのアルゴリズムをご存じの方で解析が
出来る方、ご連絡を! 短時間で高報酬!!!
780777:03/09/17 20:26
>>777
C++は難しすぎ 難易度:2
スレの173レスで解決済み。
自己解凍EXEの作り方を教えてください。
>>773
関数の逆数でなくて逆関数の事かい?
>>773
何を書いても「それは知ってますが…」と言われそうな気がする。
Abramowitz & Stegunを見たら?
>>773
はいはい、メビウスの変換ね。了解?
>>781
解凍ツールで出来上がり。
>>781
どんな宿題だよ。全文を載せよ。
自己解凍ツールの作り方。
解凍される対象EXEを作る。
配布用EXEにリソースとして物を埋め込む。
実行時にどこかにコピーして完了。
ひょっとしてリソースをファイルとして出力したら終わりか?
それって圧縮とか解凍とか言わない気がするよ

それともEXEファイルに寄生できるウィルスまがいのものを作れってか?
xpm だっけ? あのフォーマットと同じように、
圧縮したデータを配列の形にしてソースにくっつけてコンパイルする。

unsigned char data[] = {0x00, 0x0ff, ...,} /* 圧縮データ */
main(){
 /* data を展開して出力しる! */
}
790デフォルトの名無しさん:03/09/19 18:06
プログラム初めたばかりなのですが以下は何が間違ってるのでしょうか?
エラーが出てコンパイルできません、よろしくお願いします。

#include <iostream>
using namespace std;

int main(){
int ten , i;
cout<<"テストの点数は?\n";
cin>>ten;
cout<<"トップは○○〜"<<ten<<"点!\n";
if ( ten<=100 && ten>=70 ){
for(i=ten ; i>=0 ; i=i-10)
cout<<"良くやった!\n";}
else if ( ten<70 && ten=>0 ){
for (i=ten ; i<=70 ; i=i+10)
cout<<"勉強してねぇなぁ〜";}
else {
cout<<"ちゃんと入力しろ!このバカチンがっ!";}
return 0;
}
>>790
2ちゃんブラウザでみると・・・

>else if ( ten<70 && ten=>0 ){
ten>=0
792デフォルトの名無しさん:03/09/19 18:24
>>790
ちゃんと入力しろ!このバカチンがっ!
793790:03/09/19 18:33
>>791
どういうことでしょうか?
>>792
スマソ
>>790
漏れはCしかしらんがC++では
ten>=0をten=>0と書けるのか?
文字列処理
 WORDabc x …3つの文字列

 WORDabcx …1つの文字列

 間のスペースでカウント

仕様最大80文字(バイト)  英数字のみ
レコードを入力最大3件まで
レコードは空白(スペース)で単語が区切られる。
単語の数と文字数(空白を除く)をカウントする。
プログラムを作りなさい。


*Pに“C Landuage”を代入し、第一文字目から1文字飛びに表示するプログラム。

誰かコノプログラム作れますか〜?
C++で〜
796デフォルトの名無しさん:03/09/19 18:55
>>794
書ける
797790:03/09/19 19:21
>>794
ten=> を ten>= にしたらあっさり出来ました!ありがとうございます。
>>796
実際のところどうなんでしょう?
>>796
書けるけどコンパイルはできないとか言うなよ。
799 ◆FCIHX.z9Sc :03/09/19 20:28
>>795
言ってることがわけわからん
>>799
同意
801デフォルトの名無しさん:03/09/19 21:31
>>795
WORD abc x …3つの文字列
だろ?多分。
>>795
スペース1コしかないのになぜ文字列3つ?
*Pってポインタって意味?ていうか問題は二つ?
LanduageってLanguageのこと?
名前にトリップまでつけてあーた(ry
次スレ天麩羅餡

俺様はジャイアソ様だ。
俺のポリシーは、「俺のものは俺のもの。おまえのものは俺のもの」。
だから、おまえの宿題も俺のものだ。わかったな、のび犬!
804ピル来る:03/09/19 21:58
既存のフォルダをwhileループで連番で4個作りたんだけど
どうすればいいのですか?
>>803
よし、わかった!!
じゃあ、>>795の宿題よろしく!!
>>804
意味不明。
既存のフォルダは作れないだろ?

連番のついたディレクトリを作りたいならsprintf()を使えば簡単にできると思うが。
807ピル来る:03/09/19 22:19
ありがとうCopyFileつかってやるたんいんだがソースかいてくださいお願いします
>807
Win32APIスレのこれ、君か。

 [773] 名前: ホゲホゲ 投稿日:03/09/19 21:24
 既存のファイルをコピーするコードを教えてください

 [774] 名前: デフォルトの名無しさん 投稿日:03/09/19 21:27
 CopyFile

 [775] 名前: ホゲホゲ 投稿日:03/09/19 21:33
 ありがとう既存のファイルを無限ループでいっぱい作りたんだけど
 Win32?studio.h?どっちいんくるーどすればいいんです
>>807
Javaなら簡単だよ。
C/C++なんて死滅するから覚えても無駄。
810デフォルトの名無しさん:03/09/19 23:01
学校の課題なんです、よかったら教えてください。
(1)整数値とその出現頻度を格納することのできる
   連結リストのノードを表すクラスを設計せよ。
   すべてのメンバ変数をprivateに指定し、
   その代わりに必要と思われるインターフェイス(メンバ関数)
   を用意せよ。なお、クラス名をNodeとする。
811デフォルトの名無しさん:03/09/19 23:25
(2)以下のメンバ変数とメンバ関数を備えた
連結リストのクラスを定義せよ。下記のメンバ変数を
privateと指定し、その代わりに必要と思われるインターフェイスを
用意せよ。なお、クラス名をLinkedListとする。
・メンバ変数
 連結リストの先頭ノードへのポインタ変数、
 連結リストの最後尾のノードへのポインタ変数
・データの追加
 整数値valが与えられた時、valをデータ要素とするノードが
 すでに連結リストに存在するならばその出現頻度を
 インクリメントし、そうでなければvalをデータ要素とする
 ノードを新たに連結リストの先頭に追加する。
・データの削除
 整数値valが与えられた時、valをデータ要素とするノードが
 すでに連結リストに存在するならばそのノードを削除する。
 一方、そのようなノードが存在しないならば何もしない。
・データの検索
 整数値valが与えられた時、valをデータ要素とするノードが
 すでに連結リストに存在するならばその出現頻度を戻り値として
 返す。一方、そのようなノードが存在しないならば0を戻り値
 として返す。
・ランダム生成
 ノードの個数n、整数値の下限a、整数値の上限bが与えられた時、
 a以上b以下のn個の整数値をランダムに生成し、先に述べたデータの
 追加関数を使って連結リストを作成する。
・連結リストの内容表示
 先頭ノードへのポインタ変数の値、最後尾のノードへの
 ポインタ変数の値、連結リストの各ノードの内容(そのノードの
 アドレス、整数値、出現頻度、次のノードへのポインタ)を
 標準出力に表示する。表示形式は自由に考えてよい。
812デフォルトの名無しさん:03/09/19 23:27
(3)上記のクラス(のすべての機能)を適当にテストするような
main関数を作成してプログラムを完成させよ。

以上です。どうか皆様のお力をお貸しください。
宜しくお願いします。
>>807
C/C++使うまでもないじゃん。バッチファイルでもVBAでも、
やりようはいくらでもあると思うんだが。
814デフォルトの名無しさん:03/09/19 23:45
関数 long atol(char string[])
引数stringは符号付き整数を表す文字列とする。
この数字文字列が表す整数値をlong型に直し、
戻り値として返す。数字文字列の前には+又は−の文字
が入っていることもある。文字列の前の空白は無視する。

例)stringが " -56434abc" の時の戻り値 -56434

ライブラリ関数なしでお願いします(;´Д`)
>>810

class Node {
public:
Node(int num){num_ = num; count_=0;prev_ = NULL; next_=NULL;}
virtual ~Node();
public:
Node* prev(){return prev_;}
Node* next(){return next_;}
void insertprev(Node *ins){
if(ins!=this){
ins->prev = this->prev;
this->prev_ = ins;
ins->next_ = this;
}
}
void insnext(Node* node){
//insprevと同じように...
}
//カウントアップ(多分連結リスト内の検索をしないといかんと思うが)
void count(){
count_ ++;
}
private:
Node* next_;
Node* prev_;
int num_; //このクラスが表す数
int count_; //出現頻度
};

問題取り違えてるかもしれないし、打ちミスあるかもなー
816810:03/09/20 01:00
>>815
ありがとうございます。とても助かります。
ほぼ完璧

#include <iostream>

class Node{
 int val_;
 int count_;
 Node *next_;
public:
 Node(int v,Node *n=0):val_(v),count_(1),next_(n){}
 int value() const{ return val_; }
 int count() const{ return count_; }
 void inc(){ ++count_; }
 void set_next(Node *n){ next_=n; }
 Node *next() const{ return next_; }
 void print(){
  std::cout<<"this="<<this<<" value="<<val_<<" count="<<count_<<" next="<<next_<<std::endl;
 }
};


class LinkedList{
 Node dummy_;
 Node *first_;
 Node *last_;

 LinkedList(const LinkedList &);
 LinkedList &operator=(const LinkedList &);
public:
 LinkedList();
 ~LinkedList();

 void append(int n);
 void del(int n);
 int lookup(int n);
 void random_append(int n,int minv,int maxv);
 void print();
};
LinkedList::LinkedList():dummy_(0),first_(&dummy_),last_(&dummy_){}

LinkedList::~LinkedList(){
 for(Node *p=first_; p!=last_; ){
  Node *temp=p->next();
  delete p;
  p=temp;
 }
}

void LinkedList::append(int n){
 for(Node *p=first_; p!=last_; p=p->next()){
  if(p->value()==n){
   p->inc();
   return;
  }
 }
 first_=new Node(n,first_);
}

void LinkedList::del(int n){
 for(Node *p=first_,*prev=0; p!=last_; prev=p,p=p->next()){
  if(p->value()==n){
   if(prev)
    prev->set_next(p->next());
   else
    first_=p->next();
   delete p;
   return;
  }
 }
}
int LinkedList::lookup(int n){
 for(Node *p=first_; p!=last_; p=p->next()){
  if(p->value()==n)
   return p->count();
 }
 return 0;
}

void LinkedList::random_append(int n,int minv,int maxv){
 for(int i=0; i<n; ++i)
  append((rand() % (maxv-minv))+minv);
}

void LinkedList::print(){
 std::cout<<"first="<<first_<<" last="<<last_<<std::endl;
 for(Node *p=first_; p!=last_; p=p->next()){
  p->print();  
 }
 std::cout<<std::endl;
}
int main() 

 LinkedList ll;
 ll.print();

 std::cout<<"append test "<<std::endl;
 ll.append(10);
 ll.append(12);
 ll.append(10);
 ll.append(12);
 ll.print();

 std::cout<<"del test "<<std::endl;
 ll.del(12);
 ll.print();

 std::cout<<"lookup test "<<ll.lookup(10)<<std::endl<<std::endl;

 std::cout<<"random_append test "<<std::endl;
 ll.random_append(10,50,100);
 ll.print();
822810:03/09/20 02:14
>>817
マジでありがとうございます!感謝感謝
long atol(char string[])
{
  long value;
  int sign;

  while (*string == ' ')
    ++string;
  sign = (*string == '-') ? -1 : 1;
  if (*string == '+' || *string == '-')
    ++string;
  for (value = 0; *string >= '0' && *string <= '9'; ++string)
    value = value*10 + *string-'0';
  return sign * value;
}
>>823                           
>814はただいま下痢ぎみなのでしばらくお待ちを。(ぶりィ・・・・ビっちじょリィっじゅるじゅるぅ〜)
BMPファイルを読み込み、ピクセル毎のRGB値を格納します。
そのBMPファイルの色の出現頻度を調べて降順にソートするプログラムを教えてください。
同じ色があった場合、カウントしていけばいいと思うのですがわかりません・・・。
言語はCです。
どなたか宜しくお願いします。
64MB程度を確保するくらいの漢気があれば楽勝(w
>>825
一気にやろうとせず、それぞれのロジックを完成させよ。
cf)RGB値の格納、出現頻度調査、降順ソート、云々
828571:03/09/20 18:29
C語を勉強しようとしているんですが
お勧めの入門書ってありますか?
数が多くてどれがいいのか・・・。
>828
http://pc2.2ch.net/test/read.cgi/tech/1053091019/
個人的には、やさしいCと独習Cの2冊がイイと思いますです。
830825:03/09/20 23:53
RGB値を配列に格納しました。
ですが、出現頻度調査をどうやればいいのかわからないっす・・・。
助けてください(つд`)

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=147
例えば、RGB の R だけとかの頻度調査をしたい場合、
typedef unsigned char byte;
byte r[WIDTH]{HEIGHT]; // ←こいつを R の値を格納した配列とする

int histogram[256];
for(int i=0; i<256; ++i) histogram[i] = 0;

for(int i=0; i<WIDTH; ++i)
for(int j=0; j<HEIGHT; ++j)
++histogram[r[i][j]];
既存のファイルを4つコピーしたい場合連番で名前をつけたいんだけど
配列使ってやるとできないんだよ教えてください
#define FNAME_LEN (1024)

int i;
char filename[FNAME_LEN];
for(i=0;i<4;i++){
sprintf(filename,"Output_%4d.txt",i);
printf("%d番目のファイル名は%s\n",filename);
}

動作未確認 こんな感じだと予想。
過去レス嫁>自分

面倒だ、とりあえずsystem関数でやっちまえ!
DOS/shのコマンドがわかればとりあえずなんでもできるだろ!
わからなかったら調べてくれ。

http://www.microsoft.com/japan/developer/library/vccore/_crt_system.2c_._wsystem.htm
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/system.3.html
wchar_tをunsignedで比較したいのですが、

VC++ではwchar_tはunsigned shortで定義されているから問題無いのですが、
SunCCではintまたはlongで宣言されています。
しかもMB_LEN_MAXは5で定義されていて当てになりません。

うまくunsignedで比較する方法は無いのでしょうか?
なぜキャストしないの?
>>833
ありがとうやっぱポインタ使わなきゃいけないの?
838デフォルトの名無しさん:03/09/21 16:16
>>833
なんでもかんでも括弧をつけるなよ
>>838
ハァ???
>>833
しゅつりょくさきと既存のファイル名はでこでしていするの?
そのくらいのコード自分で書けよ、、"Output_%4d.txt"の部分をどうこう
すればいいだけ。
842デフォルトの名無しさん:03/09/21 16:34
>>839
#define FNAME_LEN (1024)←
>>833
フルパスでやればいいの?てかできないよ
1244044番目のファイル名は
1244044番目のファイル名は
1244044番目のファイル名は
1244044番目のファイル名は
となるんだが?
>>833
printfの引数がたりねーよ。
コピーしたいファイルもできない
846835:03/09/21 17:01
>>836
それは私へのレスでしょうか?
(違ったらごめんなさい)

wchar_tはtypdefで宣言されている為(unsigned wchar_t)とすると
コンパイルエラーになるようです。

また(unsigned short)とかするとwchar_tが別の型で定義されている環境に
移植した際に問題となるため、やりたくないと考えています。
フォルダーの場合もまた違うの?
>846
それで、移植性をも考えて、signedとunsignedの
差が重要になるような比較って何?
(unsigned wchar_t)ではなく(unsigned)で良いのでは
850デフォルトの名無しさん:03/09/21 18:28
あるファイルhoge.txtを読み込み、
内容が全く同じ行があればソレを消します。大文字小文字は問いません。
hoge.txt---------------
ABCDEFG
hogehogehoge
abcdefg
fugafugafuga
結果-------------------
ABCDEFG
hogehogehoge
fugafugafuga
>>850

#include <iostream>
#include <vector>
#include <fstream>
#include <algorithm>

using namespace std;

main()
{
 vector<string> vec;
 string str;
 ifstream ifs("hoge.txt");
 while(getline(ifs, str))
 {
  if(find(vec.begin(), vec.end(), str) == vec.end())
   vec.push_back(str);
 }
 ifs.close();
 ofstream ofs("hoge.txt");
 for(vector<string>::iterator it = vec.begin(); it != vec.end(); ++it)
 {
  ofs << *it << endl;
 }
 ofs.close();
}
>>842
で、何が問題なの?
>>851
戻り値がありません。
>>853
省略した場合は0が返る事が保証されています
>>853
C++では、main関数に限り、return 0;は省略できます。
もちろん、1を返したければ、return 1;と書かなきゃいけないけどね。
>>851 vectorに入れてfindで検索じゃ遅くないか?
つうことで>>850のmapバージョン

#include <fstream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;

int main()
{
 map<string, int> found;
 ifstream ifs("old.txt");
 ofstream ofs("new.txt");
 string line;
 while (getline(ifs, line)) {
  string key = line;
  transform(key.begin(), key.end(), key.begin(), tolower);
  if (++found[key] == 1) {
   ofs << line << endl;
  }
 }
 ofs.close();
 ifs.close();
}
>>851

>大文字小文字は問いません。

ができてない
> C++では、main関数に限り、return 0;は省略できます。
キモイ仕様だな。
void mainとすればreturn 0;相当になる
とすれば良かったのに。
>>858
あほか。同様にキモいわ。
>>843 動作未確認につきスマン。というか、んなこと言ったらmainさえないし(´д`)

>>838
#define A 10
#define B 24
int c = A*B; // = 240
int d = AB; // = 1024
となるのがキモイんで、こういう値を()で囲んでる。趣味の世界なんで気にするな。
>>856
mapに入れたら順番変わっちゃうよ
862861:03/09/21 23:00
ソース良く読んでなかったから勘違いしました
>>860
おいおい
>>860
ならないよ
865860:03/09/21 23:12
あら? 


えぇーっと、、、ごめん、ここに開発環境入れてないので動作未確認です。
なんか以前、そういう話を聞いたことがあったんだけどな?
聞きかじりスマン。とりあえず明日試してみるわ。
866デフォルトの名無しさん:03/09/21 23:21
>>860
定数はconst変数を使った方がよろしいかと^^;
>>866
そりはC++の場合。
Cの場合、定数を書くところに変数は書けません。
CはC++のおまけ
>>867
Cでも
static const int A = 10;
でいいじゃん。

いったい,どこに定数書くつもり??
>>869
それでは
int array[A];
とは宣言できません
CとC++は違います
>>870
むぐぅ。規格上はそうだったのか。
しかし,そんなPureなCコンパイラ,漏れの周りには存在しネェ…
>>871
つーかCygwin版gcc,これでも通ったけどな

#include <stdio.h>

int main(void)
{
 int i = 10;
 int array[i];

 printf("sizeof(array) = %d\n", sizeof(array));

 return 0;
}

gcc -Wall sample.c
./a.exe
sizeof(array) = 40
#include <stdio.h>

int main(void)
{
 int i;
 int array[i];

 printf("sizeof(array) = %d\n", sizeof(array));

 return 0;
}

gcc -Wall sample.c
./a.exe
Segmentation fault (core dumped)

これは危険だ…
>>872
C99の規格だとそれOKなんだよな・・・
でも関係ないか・・・
>>872
gccが特殊すぎ
876860:03/09/22 09:25
VC6.0で、ABと書いたら、"AB?んなもんない"と言われた。
まあ厳密にはCコンパイラじゃないが、そういうことでショボーン

もしかすると昔のコンパイラだとそういうこともある、っていうだけだったのかな...

っていうか微妙に宿題スレから「C言語なら俺様に聞け!」になっている罠。
昔の C コンパイラでは 「A/**/B」って書くと、1024 になってたけどね。
最近のだと 「A##B」って書く。

ま、「定数であろうと式であろうと」マクロの内容を括弧でくくるのは特に問題ないよ。
定数でも式でも無い場合はこの限りにあらず。

っていうか宿題はー?
878デフォルトの名無しさん:03/09/22 11:23
Cで実行中のプログラムのメモリ使用量を表示するプログラムを作りたいのですがどうすればいいですか?
タスクマネージャとかはなしで。
処理系依存じゃないの?
880デフォルトの名無しさん:03/09/22 11:41
881デフォルトの名無しさん:03/09/22 11:55

今月号のCマガの特集がいいぞ。C言語の初心者は嫁!
何でみんなenumを無視するの?
>>883
無視してないけど使い道がないだけです
組み込みでもないかぎり潤沢なメモリを使えるし
>>884

意味がよく…
> #define FNAME_LEN (1024)

enum {
FNAME_LEN = 1024
};
887884:03/09/22 19:36
ビットフィールドと勘違いしてた悪寒
888デフォルトの名無しさん:03/09/22 21:28
他のスレでここのことを知りました。C++で地図表示するプログラムを教えてください。
どんな地図をどこに表示するのよ?
あと環境は?
UNIX?Win?
GUI?CUI?
890デフォルトの名無しさん:03/09/22 21:37
こういう感じの地図を実行してできればいいです。
環境はWIN。
                                    ┌─────┐
                                    │        │
                                    │ 北海道  │
                                    │        │
                                    ├────┬┘
                                    │青 森  └┐
                                    ├──┬──┤
                                    │秋田│岩手│
                        ┌──┐       ├──┼──┼┐
                        │石川│       │山形│宮城│└┐
      ┌──┬──┬──┬┐  ├──┼──┬──┼──┼──┤ └┐
       │山口│島根│鳥取│└┐│福井│富山│新潟│群馬│栃木│福島│
  ┌──┬──┼┐  ├──┼──┤  └┬──┼──┼──┼──┼──┼──┼──┤
  │佐賀│福岡│└┐│広島│岡山│兵庫│京都│滋賀│岐阜│長野│山梨│埼玉│茨城│
  ├──┼──┤  └┼──┼──┤  ┌┴─┬┴─┬┴─┬┴─┬┴──┼──┼──┤
  │長崎│熊本│大分│愛媛│香川├─┤大阪│奈良│愛知│静岡│神奈川│東京│千葉│
  └─┬┴──┼──┼┐  ├──┤  └┬─┴─┬┴─┬┴──┴───┴──┴──┘
     │鹿児島│宮崎│└─┤高知│徳島│和歌山│三重│
┌──┼───┴──┘   └──┴──┴───┴──┘
│沖縄│
└──┘
380 名前:デフォルトの名無しさん[sage] 投稿日:03/09/22 21:37
どんなのでもいいなら
地図を"map.txt"に保存して


#include <stdio.h>

main(){
 FILE* fin;
 char sTemp[ 4096 ];
 fin = fopen( "map.txt", "r" );
 while( feof( fin ) ){
  fgets( sTemp, 4096, fin );
  printf( "%s", sTemp );
 }
}

コレで画面に表示される
制約条件として1行が4095文字(半角)以下である必要があるが
チト修正

#include <stdio.h>

main(){
 FILE* fin;
 char sTemp[ 4096 ];
 fin = fopen( "map.txt", "r" );
 while( feof( fin ) ){
  fgets( sTemp, 4095, fin );
  printf( "%s", sTemp );
 }
 fclose( fin );
}
#include <stdio.h>

int main(void){
 FILE* fin;
 char sTemp[ 4096 ];
 fin = fopen( "map.txt", "r" );
 if ( fin == NULL ) return 1;
 while( fgets( sTemp, 4095, fin ) ) {
  printf( "%s", sTemp );
 }
 fclose( fin );
 return 0;
}
894893:03/09/22 21:54
間違った

#include <stdio.h>

int main(void){
 FILE* fin;
 char sTemp[ 4096 ];
 fin = fopen( "map.txt", "r" );
 if ( fin == NULL ) return 1;
 while( fgets( sTemp, sizeof(sTemp), fin ) ) {
  printf( "%s", sTemp );
 }
 fclose( fin );
 return 0;
}
895846:03/09/23 00:04
>>848-849
凄く遅くなってしまい申し訳ございません。

日本語に対応していないプログラムを、
日本語に対応させるために、すべてのcharをwchar_tに変換しようと試みて
いるのですが、時々
if ( ( (unsigned char)c ) == 32 ) {
とか
if ( ( (unsigned char)c ) <= 9 ) {
と言った記述があります。

この場合どうしたらいいのかと考えているのです。
>>895
下はともかく
上は unsigned にする意味あるのか?
897846:03/09/23 00:26
まぁ、0から127と比べている分にはいいのですが・・・
変数どうしで比べてたりもしますし。

できれば全部同じように変換できたらいいと思っています。
>>890
ところで、その宿題の最大の問題は
「表示する地図を作製するために測量を行う」ところにあるんじゃナインかと。
それを表示するプログラムなんて簡単だろう。
>>898
>>890で既に地図が出来上がってるじゃん
>こういう感じの
と言っているが、そうか、これそのものでいいのか。
なんだ、だったらもうすること無いじゃん。
>>895
そのキャストはchar型のサイズで値を比較するためのゼロ拡張用だろう。
cの型をw_char型にした後も

元のcの値 == w_char型のcの最下位バイトの値

で、両者が同じ意味を持つなら、そのコードはそのままでよい。
そうでないなら、比較定数値を変えるか、型変換関数の呼び出しが必要
になる。

902846:03/09/23 01:08
言い忘れてしまいましたが>>895のcはcharで定義されています。
おそらく(unsigned char)にしてるのは128から255の値が
-1から-128として比較されるのを避けるためかと。

だから、負数の場合は
元のcの値 == w_char型のcの最下位バイトの値
は異なる値になるのではないかと心配です。
>>902
いや、>>901で言ってるのはそういう意味ではない。
cの型をwchar_t型に置き換えるのは、ただ型を置き換えるだけでなく、
文字の表現をたとえばunicodeなりに変えるつもりじゃないの?
その場合に、同じ文字cに対して、

cのもとの表現 == cの新しい表現の最下位バイト

という関係が成り立つなら、そのコードはそのままでよいということ。
>>902
if ( ( (unsigned int)c ) <= 9 ) {

longの可能性もあるなら

if ( ( (unsigned long)c ) <= 9 ) {

でいいかと
>>904
よくない。
しかし、日本語対応だけのためにUnicodeに変換するのかな?
907846:03/09/23 10:34
>>903
なるほど、そうでしたか。

あと、格納される文字の文字コードはまだ決定していませんが、
恐らくEUCになると思います。
文字列検索の問題・多バイト文字が途中で寸断される問題などを考慮
すると全ての文字を力ずくでwchar_tにする方が簡単かな、と思っています。

>>904
64ビットでコンパイルするとlongが64ビットになり、wchar_tがintになります。
32ビットでコンパイルするとlongが32ビットになり、wchar_tがlongになります。
でも、GCCなどその他のコンパイラ・環境でコンパイルした場合も含め、
それでも問題は発生しない物なのかが気になります。
>>907
> GCCなどその他のコンパイラ・環境でコンパイルした場合も含め、
> それでも問題は発生しない物なのかが気になります。

日本語対応しようとしているプログラムの元になったプログラムは
問題が発生しないものなの?
>>907
ちなみに>>904はどんな環境でも問題だから無視したほうがよい。
(unsigned char)cと(unsigned int)cの違いを分かってないと思われる。
>>909
(unsigned char)c <= 9

(unsigned int)c <= 9
の結果は常に一致するが?
ぬるぽ
>>907
こーゆーのは?

template <class T> struct add_unsigned{ typedef T type; };
template <> struct add_unsigned<char>{ typedef unsigned char type; };
template <> struct add_unsigned<short>{ typedef unsigned int type; };
template <> struct add_unsigned<int>{ typedef unsigned int type; };
template <> struct add_unsigned<long>{ typedef unsigned long type; };


if((add_unsigned<wchar_t>::type)c < 9)
× template <> struct add_unsigned<short>{ typedef unsigned int type; };
○ template <> struct add_unsigned<short>{ typedef unsigned short type; };
>>912
それが一番すっきり行きそうな気がしますね。
でも元が全てCなのでそれを乱すのも何かと思うのですが、
まぁ、この際気にしないこととします。

>>908
neditを日本語化しようと試みているのですが・・・
最近、だいぶ当初の決心が揺らぎつつあります。
neditを日本語化する宿題なのか…?
宿題じゃ無いけど、誰もやってなさそうなので・・・
917846:03/09/23 17:22
>>912
うまくいきそうな気がしましたが、
どうもSunCCでは比較時に上の
template <class T> struct add_unsigned{ typedef T type; };
を使って展開するみたいです。
逆にVC++では
template <> struct add_unsigned<int>{ typedef unsigned int type; };
を使って展開するようです。
このtemplateの展開は規格で決定されていないのでしょうか?

いずれにせよテンプレートを使う方向で考えてみたいと思います。
みなさま有り難う御座いました。
SunCCが特殊化に対応してないショボイコンパイラなだけだろ。
つーかスレ違い。ここは宿題スレ。
たとえばシフトJISの半角カナは0xA1-0xDFだが、
(unsigned char)c == 0xA1
という比較は、
(unsigned short)c == 0xA1
(unsigned int)c == 0xA1
とは結果が異なる。

キャストの型を変えて何をしたいのかよく分からん。
>>917
これならどんなC++のコンパイラでも動くと思う

inline unsigned char tounsigned(char val){ return (unsigned char)val; }
inline unsigned short tounsigned(short val){ return (unsigned short)val; }
inline unsigned int tounsigned(int val){ return (unsigned int)val; }
inline unsigned long tounsigned(long val){ return (unsigned long)val; }
inline unsigned char tounsigned(unsigned char val){ return val; }
inline unsigned short tounsigned(unsigned short val){ return val; }
inline unsigned int tounsigned(unsigned int val){ return val; }
inline unsigned long tounsigned(unsigned long val){ return val; }


if(tounsigned(c) < 9)
>>918
つーかテンプレートの機能をフルで実装できているコンパイラは皆無だろ
>>921
VC7.1は後exportに対応したらフル
後->あと
>>922
export が一番面倒なんだがな
問題
最大10件の名前と得点を入力させ、得点グラフ(*を使用)を表示するプログラムを作成してください。
最初に名前を入力させ、10件分の入力が行われるか、"finish"と入力されたら、名前が入力された件数分だけ得点を入力させてください。
なお、名前は最大10文字入力できるものとします。得点は0〜100の範囲内とし、範囲外の値が入力された場合は、エラーメッセージを出力して再入力させてください。
名前入力の最初に"finish"が入力された場合は、その旨のメッセージを出力して処理を終了させてください。
得点グラフって得点分布のヒストグラム?
それとも一人一人を*で得点表示するの?
>>926
1人1人、得点分*を表示します。
#include <vector>
#include <iosteram>
#include <algorithm>
using namespace std:
class Student
{
 int score;
 string name;
public:
 Student(int score, string name) : score(score), name(name) {}
 void print()
 {
  cout << name << ": ";
  for(int i=0;i<score;i++)
   cout << "*";
  cout << endl;
 }
}

main()
{
 vector<Student> vec;
 string name;
 int score;
 for(int i=0;i<10;i++)
 {
  cout << "名前?" << endl;
  cin >> name;
  if(name == "finish")
   break;
  cout << "得点?" << endl;
  for(;;)
  {
   cin >> score;
   if(cin.fail() || score < 0 || score > 100)
    cout << "得点がおかしいので再入力して下さい" << endl;
   else
    break;
  }
 }
 for_each(vec.begin(), v.end(), std::mem_fun_ref(&Student::print));
}
×for_each(vec.begin(), v.end(), std::mem_fun_ref(&Student::print));
○for_each(vec.begin(), vec.end(), std::mem_fun_ref(&Student::print));

あと、*が多すぎるなら
  for(int i=0;i<score;i++)
   cout << "*";
の部分を
  for(int i=0;i<score/5;i++)
   cout << "*";
にするとか
まだ間違ってた
    break;
  }
 }
 for_each(vec.begin(), v.end(), std::mem_fun_ref(&Student::print));

の部分は

    break;
   vec.push_back(Student(score, name));
  }
 }
 for_each(vec.begin(), v.end(), std::mem_fun_ref(&Student::print));
に直して。

じゃなくてこうだ。間違えすぎ。
    break;
  }
  vec.push_back(Student(score, name));
 }
 for_each(vec.begin(), v.end(), std::mem_fun_ref(&Student::print));
>>928
問題文をよく読め。
×
  cout << "名前?" << endl;
  cin >> name;
  if(name == "finish")
   break;



  for(;;)
  {
   cout << "名前?" << endl;
   cin >> name;
   if(name.size() > 10)
    cout << "名前が長すぎます。再入力して下さい。" << endl;
   else
    break;
  }
  if(name == "finish")
   break;
 
>>932
× for_each(vec.begin(), v.end(), std::mem_fun_ref(&Student::print));
○ for_each(vec.begin(), vec.end(), mem_fun_ref(&Student::print));
> 最初に名前を入力させ、10件分の入力が行われるか、"finish"と入力されたら、
> 名前が入力された件数分だけ得点を入力させてください。
>>936
ガーソ
setter,getter書くの面倒だから寝よ…
>>925

#include<stdio.h>
#include<string.h>
int main(void){int i,j,p[10];char n[10][11];for(i=0;i<10;i++){scanf("%s",n[i]);
if(!strcmp(n[i],"finish"))break;}if(!i)return puts("0件かよ!");puts("点数入れ"
"ろ");for(j=0;j<i;j++)for(;;){scanf("%d", p+j);if(-1<p[j]&&p[j]<101)break;puts(
"再入力汁");}for(j=0;j<i;j++){printf("\n%10s ",n[j]);while(p[j]--)putchar('*');
}return puts("");}
>>939
7行ルールはありませんよ
定数係数の線形二階常微分方程式の初期問題をルンゲクッタ法で数値計算せよ。

…死だ…
>>941
数学屋か物理屋のところいけばいいのに…
いや、ここのメンバーでも十分解ける問題だろう。
Fortranスレ逝けよ
俺課題でルンゲクッタやったことあるし
ただ覚えてないんで式書いてくれんと分からん
>>925
個人的には
char *asterisk[101];

char *ptr;
char *last;

for(ptr=asterisk, last=asterisk+100; ptr<last; ++ptr) *ptr='*';
asterisk[100]='\0';
.....略......
cout<<asterisk+100-score;
みたいに,予め文字列作っとく方が好き。
>>941
資料見つけてきた
ttp://www.ipc.akita-nct.ac.jp/~yamamoto/lecture/2003/5E/lecture_5E/diff_eq/node6.html

のは良いんだが,
"定数係数の線形二階常微分方程式の初期問題"ってのが俺には何のことだかさっぱり・・・
単位取ったはずなのに・・・

_| ̄}○
初期値問題の間違いじゃないか?
>>947
ダンケ!
>>941
#include <iostream>
using namespace std;

double f(double x, double y, double y1) { return 6 * x; }

int main(int argc, char **argv)
{
  double a, b, h;
  double k01, k02, k03, k04, k11, k12, k13, k14;
  double x, y0, y1, y0_init, y1_init;

  h = 0.01;
  cout << "input range [a...b]: "; cin >> a >> b;
  cout << "input initial value of y(a), y'(a): "; cin >> y0_init >> y1_init;
  cout << "x, y" << endl; cout << a << ", " << y0_init << endl;
  for(y0 = y0_init, y1 = y1_init, x = a; x < b; x = x + h) {
    k01 = h * y1;
    k11 = h * f(x, y0, y1);
    k02 = h * (y1 + k11 / 2);
    k12 = h * f(x + h / 2, y0 + k01 / 2, y1 + k11 / 2);
    k03 = h * (y1 + k12 / 2);
    k13 = h * f(x + h / 2, y0 + k02 / 2, y1 + k12 / 2);
    k04 = h * (y1 + k13);
    k14 = h * f(x + h, y0 + k03, y1 + k13);
    y0 = y0 + (k01 + 2 * k02 + 2 * k03 + k04) / 6;
    y1 = y1 + (k11 + 2 * k12 + 2 * k13 + k14) / 6;
    cout << x + h << ", " << y0 << endl;
  }
  return 0;
}
>>950
数値計算だと桁落ちとかオーバーフローが問題になるんだが
そのソースでは起こらないのか?
952950:03/09/24 22:36
たぶん数値計算をよく知ってる人からみれば論外なコードだと思います。
演算順序の考慮等ご指摘いただければ幸いです。
でもさ,この課題は制度とかそういう事じゃないでしょ?
精度だごめん
精度が良い順に成績が付きます
956デフォルトの名無しさん:03/09/24 23:13
にいさんたちにこれをお願いしたいと思います。クラスは初めてなのでお手本おたのみします。見づらいのは改行が多すぎると怒られるので・・・

任意の文字列を格納するクラスを作成せよ。クラス名はStringとし、クラスのヘッダーファイル(String.h)は以下のようにしなさい。
#ifndef String_H #define String_H
class String { public:
    // コンストラクタとデストラクタ
    String(); String(const char* str); String(const String& str); ~String();
    // 代入オペレータ
    String& operator=(const String& str);
    // 文字列の長さを返す
    int length() const;
    // 文字列の num 番目の文字を返す
    char operator[](int num) const; char& operator[](int num);
    // 文字列の先頭/後ろ/中間の文字列を返す
    String head(int num) const; String tail(int num) const; String mid(int first, int last) const;
    // 2つの文字列を結合する
    String& operator+=(const String& right_str); friend String operator+(const String& left_str, const String& right_str);
    // 大小比較
    friend int operator<(const String& left_str, const String& right_str); friend int operator>(const String& left_str, const String& right_str);
    friend int operator<=(const String& left_str, const String& right_str); friend int operator>=(const String& left_str, const String& right_str);
    friend int operator==(const String& left_str, const String& right_str); friend int operator!=(const String& left_str, const String& right_str);
    // ストリームからの入出力
    friend ostream& operator<<(ostream& out, const String& str); friend istream& operator>>(istream& in, String& str);
private: char* my_str;
} #endif // String_H
>>956
答えてあげたいけど、ねえさんなので答えられません。
>>956
改行無さすぎて読みにくいのからお断り
String::String() : mystr(NULL)
{
 my_str = new char[1];
}

String::String(const char* str) : mystr(NULL)
{
 my_str = new char[strlen(str)+1];
 strcpy(my_str, str);
}

~String()
{
 if(mystr != NULL)
  delete[] my_str;
}
修正
~String()
{
 if(my_str != NULL)
  delete[] my_str;
}
修正
String::~String()
{
 if(my_str != NULL)
  delete[] my_str;
}
String& String::operator=(const String& str)
{
 if(&str == this)
  return *this;
 if(length() < str.length())
 {
  delete[] my_str;
  str = new char[str.length()+1];
 }
 strcpy(my_str, str);
 return *this;
}
int String::length() const
{
 return strlen(my_str);
}

char String::operator[](int num) const
{
 return my_str[num];
}

char& String::operator[](int num)
{
 return my_str[num];
}
>>962
横やりすまんが
せっかくオペレータ定義してるんだから
String& String::operator=(const String& str)
の時は = 使ったら?
String String::head(int num) const
{
 String ret = *this;
 ret[num] = '\0';
 return ret;
}
つーか>>962滅茶苦茶だ。
967964:03/09/25 00:26
あ,違った
=定義してるんだからStringを引数に取るコンストラクタは〜ってのが言いたかった
で,見直したらそのコンストラクタないし
>>962
str = new char[str.length()+1];

my_str = new char[str.length()+1];
にすれば動くんじゃないの?
strcpy(my_str, str);

↑はうごかんな
>>956-969
#define String std::string
でいいだろ。
ヒソヒソ (-[^-]*-[^-]*)-([^-]*)-([^-]*)-(.*)
初心者な問題なのですが、任意のファイルを読み込んで、
内容は同じだが名前が違う別のファイルを作成する
Cプログラムを作りたいのですが、
テキストを学校に忘れてきてまったく解りません。
お力を貸してください。
system("cp 任意のファイル 別のファイル");
>>973

d(゚Д゚)☆スペシャルサンクス☆( ゚Д゚)b (^▽^)。

たったこれだけですか?Cはおくが深い。


任意のファイルをキーボードから入力して、
別のファイル名もキーボードから入力する事はどうすれば可能ですか?
>>972
入出力ファイルはテキスト形式であると勝手な判断で
適当につくったからあとは煮るなり焼くなり

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

int main(void)
{
    FILE *fp1,*fp2;
    char file1[32],file2[32],buf;
    scanf("%s",file1); /* 入力ファイル名入力 */
    scanf("%s",file2); /* 出力ファイル名入力 */

    if((fp1=fopen(file1,"r"))==NULL)
        exit(-1);
    if((fp2=fopen(file2,"w"))==NULL)
        exit(-1);

    while(fscanf(fp1,"%c",&buf)!=EOF)
        fprintf(fp2,"%c",buf);
    fclose(fp1);
    fclose(fp2);
    return 0;
}
976972:03/09/25 12:46
>>975
>>953

御礼が遅くなりました。
本当に助かります。
ありがとうございました。
>>975
fgetcを使えよアホ
>>972は、これで提出しちゃうんだろうな、きっと...
別解
int main( int argc, char* argv[] ) {
FILE* in = fopen( argv[1], "rb" );
FILE* out = fopen( argv[2], "wb" );
char buf[100];
int r;
if( in == 0 || out == 0 )
return 1;
while( ( r = fread( buf, 1, 100, in ) ) != 0 ) {
fwrite( buf, 1, r, out );
}
return 0;
}
コンパイルとかはして無い。
String& String::operator=(const String& str)
{
 if(&str == this)
  return *this;
 if(length() < str.length())
 {
  delete[] my_str;
  my_str = new char[str.length()+1];
 }
 strcpy(my_str, str.my_str);
 return *this;
}
String String::tail(int num) const
{
 return String(&my_str[length() - num]);
}
String String::mid(int first, int last) const
{
 String ret(&my_str[first]);
 ret[last - first] = '\0';
 return ret;
}
String& String::operator+=(const String& right_str)
{
 String tmp(*this);
 delete[] my_str;
 my_str = new char[tmp.length() + right_str.length() + 1]
 strcpy(my_str, tmp.my_str);
 strcat(my_str, right_str.my_str);
 return *this;
}
friend String String::operator+(const String& left_str, const String& right_str)
{
 String ret(left_str);
 ret += right_str;
 return ret;
}
friend int String::operator<(const String& left_str, const String& right_str)
{
 return strcmp(left_str.my_str(), right_str.my_str()) < 0;
}

friend int String::operator>(const String& left_str, const String& right_str)
{
 return strcmp(left_str.my_str(), right_str.my_str()) > 0;
}

friend int String::operator==(const String& left_str, const String& right_str)
{
 return !strcmp(left_str.my_str(), right_str.my_str());
}
>>977

fgetcをつかうとどう書けますか?
>>977
fgetcよりfread使った方がいいと思うぞ
987956:03/09/25 22:06
懇切丁寧な回答ありがとうございましたっ
ここで受けたご恩は、他の誰かにきっと伝えやす。Mr.ペイ・フォワード
>>986
普通fgetcだろ
989デフォルトの名無しさん:03/09/25 23:36
#include<stdio.h>
#include<stdlib.h>

main()
{
FILE *fp1,*fp2;
char file1[32],file2[32],buf;
fgets(file1,sizeof(file1),stdin); /* 入力ファイル名入力 */
fgets(file2,sizeof(file2),stdin); /* 出力ファイル名入力 */

if((fp1=fopen(file1,"r"))==NULL)
exit(-1);
if((fp2=fopen(file2,"w"))==NULL)
exit(-1);

while(fgets(buf,sizeof(buf),fp1)!=NULL)
fputs(buf,fp2);
fclose(fp1);
fclose(fp2);
}

fgetsの方が好きな漏れにとっては
こんな感じがイイ(・∀・)と思われ。
行に意味がないからfgetsなんて使わない
>>988
何でバッファを使わないんだ
992デフォルトの名無しさん:03/09/26 00:09
fgetsは漏れが一番最初に覚えた入力方法なの。
だからfgetsが好き。
だからfgetsを使うの。

だめ?ねぇだめ?いいじゃん、使わせてよぉ。
おねがい♪
だめ?だめなの?だめ?だめ?ホントにだめ?

つ・か・わ・せ・て・ぇ
993デフォルトの名無しさん:03/09/26 00:10
お ・ ね ・ が ・ い ・ ♪
そうだ read を使おう...
995デフォルトの名無しさん:03/09/26 00:12
おまんこじゅくじゅくになっちゃったから
入れてほしいの。
でもソレは長いモノだから
一行操作でやってほしいのね。
だからfgetsでズボっと

突 ・ き ・ 刺 ・ し ・ て ・ ェ ・ ♪
996デフォルトの名無しさん:03/09/26 00:14
なんか欲求不満で壊れちゃったみたい。
誰か!早く

挿れてください。おねがいしますから。
あ〜、おちんちんが欲しい。
ねぇ頂戴?おねがい。
997デフォルトの名無しさん:03/09/26 00:15
早くしてくれないともう逝っちゃいそう
ねぇ早く入れて。おながい!!!!!!
998デフォルトの名無しさん:03/09/26 00:16
はやくいれちゃって!!!!!!!!!!!
999デフォルトの名無しさん:03/09/26 00:17
もうがまんできないぃぃいIIIIIIIIいいいいい
!!!!!!!!!!!!!!!!!!!
もうだm、え
逝きそう
あっ、あっ、いっいっ
イ、イ
1000デフォルトの名無しさん:03/09/26 00:18
イクッ〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜ー〜
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。