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

このエントリーをはてなブックマークに追加
579 ◆1haVRB54HY
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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。