1 :
デフォルトの名無しさん :
03/12/04 01:44 俺はC++房。
わからない宿題を始末する。
【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
問題文などの省きはやめ、エラーなどは適切に書きましょう
全文を書いてしまうか、分かりやすくまとめましょう。
・後になって問題につけたしをするのはやめましょう。
解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html 【歴代スレは
>>2 】
わけのわからんタイトルだな。100点満点中、85点というところか。
ファイルの入出力で。 ファイルの内容を、一行ずつ変数に格納しなさい。 ーーーーファイルの内容ーーーー 12345 678910 123719 ・・・ これが続く ーーーーーーーーーー お願いします。
6 :
デフォルトの名無しさん :03/12/04 01:50
そうです。
早速・・・おながいします。 <問題> n クラス(クラス番号: 1 ~ n )の全生徒(各クラスの生徒数は、クラスごとに異なる) に対してある試験を行った。各生徒の点数を入力した後、全体の平均点(小数点以下切り捨て)を計算して、 平均点、及び、平均点以上である生徒数が最も多いクラス番号を出力するプログラムを書く。 (同じ人数のクラスが存在した場合は、クラス番号が小さい方を出力) ただし、任意のクラス数、生徒数に対応できるようにプログラムを書き、 なお、2つのデータは1つ以上のスペースで区切って出力すること。 (入力例) コメントの部分は除く 5 // クラス数 20 // クラス 1 の生徒数 10 20 30 ・・・ // クラス 1 における各生徒の点数 30 // クラス 2 の生徒数 100 90 30 ・・・ // クラス 2 における各生徒の点数 ・・・・・
9 :
デフォルトの名無しさん :03/12/04 01:52
#include <stdio.h> #include <ctype.h> /* isprint() のため */ #define FileName "file.txt" /* 文字型ファイルのファイル名 */ main() { FILE *fp; int freq[256]; /* 文字の出現回数を記録する配列 */ int c; for(c=0; c<256; c++) freq[c] = 0; /* freq[] の要素を 0 で初期化 */ fp = fopen(FileName, "r"); /* ファイルのオープン */ /* 文字のコードに対応した要素の値を 1 だけ増やす */ while( (c=fgetc(fp)) != EOF ) freq[c]++; fclose(fp); /* ファイルのクローズ */ printf(" code char num\n"); /* 項目名の表示 */ for(c=0; c<256; c++) { /* コードごとにコード値、文字、個数を表示 */ printf("%6d", c); if( isprint(c) ) printf(" %c", c); else printf(" "); printf("%6d\n", freq[c]); } } 以上を これを数字の出現回数に変更お願いします。
前のやつはもう解決しました。答えてくれた方ありがとうございます。
11 :
デフォルトの名無しさん :03/12/04 01:55
>>5 #include <stdio.h>
int main()
{
char a[900][1025];
int i=0;
FILE *fp;
fp=fopen("file","r");
while(fgets(a[i++],1025,fp));
fclose(fp);
return 0;
}
12 :
デフォルトの名無しさん :03/12/04 02:01
>>5 見た限り、整数なので。
#include <stdio.h>
int main(void)
{
long n;
while (scanf("%ld", &n) == 1)
printf("d = %n\n", &n);
return 0;
}
>>11 とどちらが良いかはそのとき次第。
13 :
デフォルトの名無しさん :03/12/04 02:04
>>9 すまん、そろそろ眠いので。ポイントだけ。
int freq[10];
if (isdigit(c))
freq[c-'0']++;
>>11 #include <stdio.h>
int main(void)
{
char a[900][1025];
int i;
for(i=0; i<900; ++i)
if(fgets(a[i],sizeof(a[0]),stdin)==0)
break;
else
printf("%s",a[i]);
return 0;
}
...ところで何でa[900][]?
9です 0が?回、11が??回出てきたと出力されるようにお願いします。
16 :
デフォルトの名無しさん :03/12/04 02:13
入力 9 6 79 8 47 0 1 21 62 出力 数字 回数 0 1 1 1 2 0 . . . . 6 1 な感じです
18 :
デフォルトの名無しさん :03/12/04 02:22
>>17 入力と出力、ちゃんと対応とって書くこと!
楽したいなら正しい情報を見せてね。
ウソかかれちゃうと、答え出す人に負担がかかるんで、
遠回りなになる。
俺は寝るが、
>>13 にほぼ答えなヒントがある。がんばれ。
>>17 というかその例によると入力は数値しか来ないみたいなんだけどそれでいいの?
20 :
デフォルトの名無しさん :03/12/04 02:26
まず、複数科目に対応できるようにする。このため点数を格納する配列を2 次元配列にする。この2 次元配列は、main 関数で以下のように定義される。 int score_db[DATA_MAX][SUBJECT_MAX]; DATA_MAX はマクロで、扱える最大の生徒数を表し、SUBJECT_MAX は、扱える最大の科目数 を表す。これらの数は十分に余裕を持って取っておけばよい。この変更により、add 関数は6 引 数関数となる。 void add(char name_db[][], int score_db[][], char name[], int score[], int subject_num, int index); ただし、name_db は名前を格納する配列、score_db は点数を格納する配列、name は名前、score はname に対応する学生の各科目の得点の配列、subject_num は科目数、index はname とscore を 加すべき場所(添字)である。 指定した学生の科目の平均点を求めるpersonal_average 関数と、指定した科目の平均点を求め るsubject_average 関数を作成せよ。それぞれ3 引数関数で、学生や科目の指定には配列の添字を 使うものとする。さらに、名前の配列から指定された名前の検索を行って、対応する添字を返す search 関数を作成せよ。名前が見つからない場合には-1 を返すこと。 おしえて
>>20 いままで相手にされなかったのだから、これからも相手にされんて。
そろそろあきらめるべし。
#include <stdio.h> #include <ctype.h> /* isdigit() のため */ #define FileName "file.txt" /* 文字型ファイルのファイル名 */ main() { FILE *fp; int freq[10]; /* 数字の出現回数を記録する配列 */ int c; for(c=0; c<10; c++) freq[c] = 0; /* freq[] の要素を 0 で初期化 */ fp = fopen(FileName, "r"); /* ファイルのオープン */ /* 文字のコードに対応した要素の値を 1 だけ増やす */ while( (c=fgetc(fp)) != EOF ) if( isdigit(c) ) freq[c-'0']++; fclose(fp); /* ファイルのクローズ */ printf(" code char num\n"); /* 項目名の表示 */ for(c=0; c<10; c++) { /* コードごとにコード値、文字、個数を表示 */ printf("%6d", c); printf(" %c", c); printf("%6d\n", freq[c-'0']); } } こんなとこかな。俺もいい加減眠い
>>19 いいんです。
9にあるプログラムを実行すれば文字や数字をカウントすることができます。
ただ、入力に11を入れると1が2回カウントされることになります。
私は11が1回カウントされたと表示をしたいと考えています。
レス18、13を参考に組んでみたところ、
まだ11の場合は1が2回カウントされてしまいます。
24 :
デフォルトの名無しさん :03/12/04 02:36
u
>>23 それ元のプログラムの書き換え関係ないじゃない……
一文字ずつスキャンするんじゃなくて
fscanf(%d,&c)
ってやることになる
25様 できればプログラムをお手数でしょうがお願いします。
#include <stdio.h> #include <ctype.h> #define FileName "file.txt" main() { FILE *fp char freq[256]; int c; for(c=0;;c++){ sprintf(freq, "%d", c); if(fp = fopen(freq, "w")) fclose(fp);} printf(" digit num\n"); for(c=0; c<256; c++){ printf("%6d", c); printf("%6d\n", freq[c]); } }
スマン、寝ぼけていて間違えた。 #include <stdio.h> #define FileName "file.txt" #define MAXVAL 100 main() { FILE *fp; int c, freq[MAXVAL]; for(c=0; c<MAXVAL; c++) freq[c] = 0; fp = fopen(FileName, "r"); while( fscanf(fp, "%d", &c) != EOF ){ if(0 <= c && c < MAXVAL) freq[c]++; } fclose(fp); printf(" digit num\n"); for(c=0; c<MAXVAL; c++) printf("%6d%6d\n", c, freq[c]); }
>>20 double personal_average(int score_db[][], int subject_num, int index)
{
int i;
double sum = 0.0;
for(i = 0; i < subject_num; i++)
sum += score_db[index][i];
return sum / subject_num;
}
double subject_average(int score_db[][], int data_num, int index)
{
int i;
double sum = 0.0;
for(i = 0; i < data_num; i++)
sum += score_db[i][index];
return sum / data_num;
}
int search(char name_db[][], char name[], int data_num)
{
int i;
for(i = 0; i < data_num; i++){
if( strcmp(name_db[i], name) == 0 )
return i;
}
return -1;
}
>>9 ほい
#include <stdio.h>
int freq[256];
int main(void)
{
int n;
while(fscanf(stdin,"%d",&n)==1)
++tbl[n];
for(n=0; n<256; ++n)
printf(" %3d [%3d]",n,freq[n]);
return 0;
}
/* freq < file.txt */
>>31 × ++tbl[n];
↓
○ ++freq[n];
http://pc2.2ch.net/test/read.cgi/tech/1069837000/404 の1の問題ですが・・・
#include <stdio.h>
void copydata(char *x,char *y){
char *p = y;
while(*p++ = *x++);
return y;
}
int main(void)
{
char str1[100], str2[100];
printf("1つ目の文字列を入力してください。\n");
gets(str1);
printf("2つ目の文字列を入力してください。\n");
gets(str2);
copydata(&str1,&str2);
printf("1つ目の配列は %s です。\n",str1);
printf("2つ目の配列は %s です。\n",str2);
return 0;
}
一つ目の配列で2つとも出力されるのです。
どう修正すればいいのでしょうか?
あ・・・
>>33 は1じゃなくて2の問題だった・・・後で逝ってきまつ。
http://pc2.2ch.net/test/read.cgi/tech/1069837000/404 の1の問題ですが・・・
#include <stdio.h>
#include <string.h>
void swapdata(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y =tmp;
}
void reverse(char *s)
{
char *a = s;
char *b = s+strlen(s)-1;
while(a < b) swapdata(a++, b--);
return s;
}
int main(void)
{
char word[200];
printf("文字列を入力してください。\n");
gets(word);
reverse(&word);
printf("並べ替えると次のようになります。\n");
printf("%s",gets(word) );
}
この処理も実行すると結果がうまくいきません・・・
どこを修正すればいいのでしょう?
35 :
デフォルトの名無しさん :03/12/04 10:45
reverse(word); printf("並べ替えると次のようになります。\n"); printf("%s",word );
質問&依頼下手なひと多いね。
37 :
デフォルトの名無しさん :03/12/04 12:16
Class Queueの中のDequeueを少し変えて先頭の1個のみを取るのではなく Queue::Dequeue(3,success)なら先頭から3個削除出来るようにして、そのとき 3個以上の取り出せる物がなければfalseを返す。intでポインターのClassです。 よろしくお願いします!
38 :
デフォルトの名無しさん :03/12/04 12:17
>34 すごいコードだな・・・ ちゃんと本読んで勉強しろや。 学校の宿題なら定期試験あるだろ。 後で困るぞ。
宿題全文を書いて任せてしまえ>質問書くヤツ なおしてくれってのは、作るより労力がかかるのよ。
40 :
デフォルトの名無しさん :03/12/04 12:48
>39 文法上のエラーだったら直す方が楽だぞ。 ロジカルエラーは、たしかにあなたの言うとうりだが
#include <stdio.h> #include <string.h> #defineDATA_MAX5 #defineSUBJECT_MAX5 void add(char[][256], int[][256], char[], int[][256], int, int); double personal_average(int[][256], int, int); double subject_average(int[][256], int, int); int search(char[][256], int, int[])
int main(void) { int i, x, y, h, banti, score[256][256], addscore[256][256]; char name[256][256], addname[256], z; printf("名前と各科目の点数を入力して下さい。\n"); for (i = 0; i < DATA_MAX; i++){ printf("名前:"); scanf("%s", addname[i]); for (h = 0; h < SUBJECT_MAX; h++){ printf("科目[%d]:", h + 1); scanf("%d", &score[i][h]); add(name, score, addname, addscore, h, i);
} } printf("平均点を検索したい学生:"); scanf("%d", &x); printf("この学生の平均点は%fです。\n", personal_average(score, x, SUBJECT_MAX)); printf("平均点を検索したい科目:"); scanf("%d", &y); printf("この科目の平均点は%fです。\n", subject_average(score, DATA_MAX, y)); printf("添え字を検索したい名前:"); scanf("%s", &z); banti = search(z, DATA_MAX, score); if (banti == -1) puts("探索に失敗しました。\n"); else printf("%sは%d番目にあります。\n", z, banti + 1); return(0); }
void add(char name_db[][256], int score_db[256][256], char name[256], int score[][256], int subject_num, int index) { strcpy(name_db[index][subject_num], name); score_db[index][subject_num] = score[index][subject_num]; } double personal_average(int score_db[][256], int gakuseisuu, int kamokusuu) { double sum = 0.0; int i; for (i = 0; i < kamokusuu; i++){ sum = sum + score_db[gakuseisuu][i]; } sum = sum / kamokusuu; return(sum); }
double subject_average(int score_db[][256], int gakuseisuu, int kamokusuu) { double sum2 = 0.0; int i; for (i = 0; i < gakuseisuu; i++){ sum2 = sum2 + score_db[i][kamokusuu]; } sum2 = sum2 / gakuseisuu; return(sum2); } int search(char kansuukey[][256], int num, int a[256]) { int i = 0, h = 0; for (i = 0; i < num; i++){ if(strcmp(kansuukey, a[i]) == 0){ h = i; break; } else{ h = -1; } } return(h); }
成績処理の問題で、引数や関数はあっていると思うんですが、 []の使い方がよくわからなくて、「すでに実体をもっています」「間接参照のレベルが const char とcharで異なってますなどのエラーや警告が出るので、どなたか教えてもらえないでしょうか?
>>46 コンパイラのエラー出力をコピペして、見せて。
hello.c(12) : error C2055: 関数定義内で仮引数リスト以外が使われていました。 hello.c(13) : error C2085: 'main' : 仮引数リスト内にありません。 hello.c(13) : error C2143: 構文エラー : ';' が '{' の前に必要です。 hello.c(42) : warning C4047: 'function' : 間接参照のレベルが 'char (*)[256]' と 'char ' で異なっています。 hello.c(42) : warning C4024: 'search' : の型が 1 の仮引数および実引数と異なります。 hello.c(42) : warning C4047: 'function' : 間接参照のレベルが 'int *' と 'int [256][256]' で異なっています。 hello.c(42) : warning C4024: 'search' : の型が 3 の仮引数および実引数と異なります。 hello.c(53) : warning C4047: 'function' : 間接参照のレベルが 'char *' と 'char ' で異なっています。 hello.c(53) : warning C4024: 'strcpy' : の型が 1 の仮引数および実引数と異なります。 hello.c(86) : error C2084: 関数 'int __cdecl search(char (*)[256],int ,int *)' はすでに実体を持っています。 hello.c(90) : warning C4047: 'function' : 間接参照のレベルが 'const char *' と 'char (*)[256]' で異なっています。 hello.c(90) : warning C4024: 'strcmp' : の型が 1 の仮引数および実引数と異なります。 hello.c(90) : warning C4047: 'function' : 間接参照のレベルが 'const char *' と 'int ' で異なっています。 hello.c(90) : warning C4024: 'strcmp' : の型が 2 の仮引数および実引数と異なります。 cl.exe の実行エラー
int search(char[][256], int, int[]) ↓ int search(char[][256], int, int[]); 他はわからん。 記憶では、C FAQにもこの手のがあったな。
search って名前の関数を自分で作ったってことかなぁ すでに同じ名前を使ってるからできない、じゃないの?
んー。main()の前の宣言で、セミコロン忘れると、その宣言とmain()が変になっちゃうんよ・・・。
お世話になった皆さんありがとう。
実はこれには続きがあります。 データ x y z 0 20 0.50 0 19 0.333 0 19 -0.166 0 29 -0.333 1 9 0.5 1 8 0.333 1 8 0.166 2 9 0.333 続く というようにx y zが上のように対応しています。 xは0からきちんと並んでいます。(99まで) x が同じでyが同じ場合はその数同士を足し算させます。 さらにxを一定にしてyを並べ替えたいのです。 並べかえると x y z 0 19 0.167 0 20 0.50 0 29 -0.333 1 8 0.499 1 9 0.5 2 9 0.333 とし 配列a[100][100]、b[100][100]に数字を代入させたいと考えています。 データはfile.txtから読み取ります。 配列aはyを格納、bはzを格納します。 a[0][0]=19,a[0][1]=20,a[0][2]=29, ... 0の数が未知数(最大でも100)をするのでa[0][3]からa[0][99]は0とします。 bも同様です。 よろしくお願いします。
>>54 >>1 より。
> ・後になって問題につけたしをするのはやめましょう。
> 解いてもらっている方に失礼になってしまいます。
申し訳ないです。 以後気をつけますのでこの質問は受け入れてください。
申し訳ないと思ってるなら、質問を続けないと思うが?
そんなこと言わないでください。 57様
59 :
デフォルトの名無しさん :03/12/04 21:12
ファイル処理の課題で「このファイルに書き込まれたデータの最大値/最小値/平均値/標準偏差値を求めるプログラムを作成しなさい」というものなのですが、肝心の部分の記述がわかりません。 ちなみにデータは「a:sample2.txt」内に、小数点1位までの数字が10個入っている状態です。 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <process.h> #define MAX 100 void main(void){ FILE *fp; int i, n; double a[MAX], sum, sum2, max, min, mean, sdev; fp = fopen("a:sample2.txt", "r"); if(fp == NULL){ printf("Error!\n"); exit(1); } ◆◆ここの部分に書くべき事を教えて下さい◆◆ n = i; sum = max = min = a[0]; sum2 = a[0]*a[0]; for(i=1; i<n; i++){ sum += a[i]; sum2 += a[i]*a[i]; if(a[i]>max) max = a[i]; if(a[i]<min) min = a[i]; }
60 :
デフォルトの名無しさん :03/12/04 21:13
mean = sum/n; sdev = sqrt(sum2/n-mean*mean); printf("\n"); printf("Data input : %8d\n", n); printf("Maximum : %8.2f\nMinimum : %8.2f\n", max, min); printf("Mean : %8.2f\n", mean); printf("Standard dev. : %8.2f\n", sdev); } 改行が多すぎてエラーになったので分けました。59の続きです。 どうぞ宜しくお願い致します。
>>59 そこに書いたプログラムは自作?
それとも、穴埋めが宿題なの? どっちかしら?
◆◆ここの部分に書くべき事を教えて下さい◆◆ ↓ for (i = 0; fscanf(fp, "%lf", &a[i]) == 1; i++) ;
63 :
デフォルトの名無しさん :03/12/04 21:21
了解
>>63 じゃあ、入力部分だけですね。
>>62 に答え書いときました。
2行目のセミコロンを忘れずに。
65 :
デフォルトの名無しさん :03/12/04 21:25
64さんどうもありがとうございました。 とても助かりました!!
66 :
デフォルトの名無しさん :03/12/04 21:27
どんどん始末していきましょう。
68 :
デフォルトの名無しさん :03/12/04 21:41
46や56辺りは始末ついていますか?
お願いしますよ。 貶し合いのスレになるのは嫌なんで。 54をよろしく。
>>70 >>1 嫁
>・後になって問題につけたしをするのはやめましょう。
> 解いてもらっている方に失礼になってしまいます。
>>1 ぐらい読まない奴に質問する資格は無い
71さんも一緒に考えてください。 明日10時30分までに考えなくてはいけないんです。 ホント困ってます。
どこかにあった、よくある質問と答え。 期限はxxx時までです。 →あとxxx時間だね。
ツッコミどころ満載ですなぁ。
まあ、それは置いといて。
>>62 for (i = 0; i < MAX && fscanf(fp, "%lf", &a[i]) == 1; i++)
;
と書くほうが安全。
>>72 何度も言うようだが
>>1 ぐらい読まない奴に質問する資格は無い
76 :
デフォルトの名無しさん :03/12/04 22:19
自分のグローバルIPアドレスを取得するにはどうすればいいのでしょう。
2.32 0.34 0.45 1.23 1.54 2.34 0.34 ↑のデータを読み込み、区間、0以上1未満、1以上2未満、2以上3未満に含まれるデータの個数を 配列を用いてカウントするプログラムを作れ。ただし、個数のカウントに条件分岐を使用してはいけない。 いろいろ考えてみたんですが、分からなかったので、よろしければお教えいただけないでしょうか。 よろしくお願いします。
int cnt[3] = {0,0,0}; double f; scanf (fp, "%lf", &f); if (f >= 0 && f < 1) cnt[0]++; else if (f >= 1 && f < 2) cnt[1]++; else if (f >= 2 && f < 3) cnt[2]++; こんな感じじゃない?
79 :
デフォルトの名無しさん :03/12/04 22:40
整数部分に対応する配列の値を++
int dat[100]; float fno; int ino; fno= に入力する。 ino=(int)fno; dat[ino]++; 上記3行を繰り返す
>>77 #include <stdio.h>
int main(void)
{
enum {LIMIT = 3};
int i, count[LIMIT] = {0};
double val;
while (scanf("%lf", &val) == 1) {
if (val >= 0 || val < LIMIT) /* 範囲制限で分岐すんのはしかたあんめえ */
count[(int) val]++;
}
for (i = 0; i < LIMIT; i++)
printf("%d.0 - %d.0: %d\n", i, i+1, count[i]);
return 0;
}
当然だがdat[100]の初期化はしろよな、
や屋らしい問題で、分岐はダメなんですよ。 今、いろいろやっています。
>>76 環境依存しまくり。
情報不足で回答不能。
>>77 #include <stdio.h>
int main(void)
{
FILE *fp;
int count, array[] = {0,0,0};
float f;
if((fp = fopen("hoge.txt", "r")) == NULL)
{
printf("ファイルを開けませんでした。\n");
exit(-1);
}
while(fscanf(fp, "%f", &f) != EOF)
array[(int)f]++;
fclose(fp);
printf("0以上1未満 %d\n", array[0]);
printf("1以上2未満 %d\n", array[1]);
printf("2以上3未満 %d\n", array[2]);
return 0;
}
さて、解答も出揃ったし、品評たーいむ。 それぞれに解答に点数つけてみましょう!
ぐすん。これくらい短い文章でも「てにをは」を間違える漏れって・・・。
>>87 ・・・ 0点
>>80 さんのプログラムに少し追加して出来ました。
みなさんありがとうございました。
ちなみに、条件分岐とは、if,while,switchなどです。
これを使うなという事です。やらしすぎです。でもこの方が短くまとまりました。
>>80 > ちなみに、条件分岐とは、if,while,switchなどです。
> これを使うなという事です。
最初に言って欲しかったよ・・・しょぼーん。
すみません。
>>77 >ただし、個数のカウントに条件分岐を使用してはいけない。
と書いたんですけど、分かりにくかったですね。すみません…
まぁ、このような配列の使い方もあるのだと気づきいい勉強になりました。
・・・しかもそれに続く文字列の末尾の'\0'に関する注意はしっかり読み飛ばしてるな。 自分の勝手な判断で答えを取捨選択すると困ったことになるぞ。 おかしな結果になったならコンパイラのメッセージも読もうぜ。 たとえばchar*からint*への不正なポインタの変換が検出されてるはずだ。
平和なうちに寝るか。おやすみ♪
ほとんどの型を交換できるマクロ #define SWAP(type, a, b) /* ... */ を完成させよ。 よろしくお願いします。
#define SWAP(TYPE,a,b) do { TYPE tmp = a; a = b; b = tmp } while(0);
げ、セミコロン抜けてた #define SWAP(TYPE,a,b) do { TYPE tmp = a; a = b; b = tmp; } while(0);
最後のセミコロンは取った方が。
説明:バックトラックという手法を使って最適な経路(時間、金額)を探すことを 今回の目的とする。 AからHに行きたい。 1:金額が最適な(最も安い)ルートを求めよ。 2:時間が最適な(最短時間の)ルートを求めよ。 必要な時間と料金は以下の通りとする。 A―B:48分、4240円 A―C:135分、9650円 B―D:75分、25300円 D―G:65分、18300円 G―H:50分、800円 C―G:100分、35300円 C―D:90分、20700円 E―D:35分、1040円 E―H:329分、10240円 B―F:1050分、5400円 F―E:32分、620円 B―E:691分、18520円 どうぞ宜しくお願いします。
>>97-100 #define SWAP(type,a,b) do { type tmp_for_swap_ = a; a = b; b = tmp_for_swap_; } while(0)
かなぁ。
a, bがtmpって名前とかぶるといかんから。
>>101 基本データはこんなもんかなぁ。
enum {A = 0, B, C, D, E, F, G, H, MAX};
struct {
int from, to;
long jikan;
long kakaku;
} data[] = {
{A, B, 48, 4240},
/* ... */
};
long table[MAX][MAX] = {0}; /* どこからどこへいけるか、行くにはいくらかかるか */
int path[MAX] = {0}; /* どこを通ったか */
int npath = 0; /* いくつとおったか */
long min = LONG_MAX; /* いままでに発見した最小値 */
int minpath[MAX] = {0}; /* 発見した最小ルート */
int minnpath = 0;
こんな感じのテーブルになるでしゃう・・・。んでは。あとよろしくー。
>>98 do と while(0) って無いとイクナイわけ?
105 :
デフォルトの名無しさん :03/12/05 04:25
あ、cost と time 逆か・・・ まぁいいや。
「文字列a,b,cを引数として受け取り、aに文字列bが含まれている場合、 その箇所をcに置き換える関数を作成しなさい。」 お願いします。
>>105 さん
ありがとうございます!
本当に助かりました…
>>103 簡易版としては無くてもいい。その場合、ifなどの制御構造で複文化しない人は要注意。
>>104 今暇ないからパス。
>>107 さいきんどっかで見たなぁ。
void strReplace(char *a, char const *b, char const *c)
{
char *p = strstr(a, b);
if (p != NULL) {
sprintf(a, "%*s%s%s", p - a, a, c, p + strlen(b));
}
}
こんな感じかな。テストしてないんで参考までに。
110 :
お願いしますT _ T :03/12/05 10:14
問題1、配列内容を逆順に表示 コンピュータに関数rand()を使用して0~999の整数を10個作らせ、 画面に表示させた後、逆に表示させるプログラム 問題2、2次元配列 テストの結果を次のように表示させるプログラム 実行例 NO a b c 1 60 70 54 2 43 12 65 3 45 65 34 4 32 54 65
111 :
デフォルトの名無しさん :03/12/05 10:17
>>107 前スレで答えが出ているだろうが。死ねよお前。
112 :
お願いしますT _ T :03/12/05 10:42
#include <stdio.h> #include <stdlib.h> int main(void){ int y[10]; int i; int x; srand(time(0)); for(i = 0; i < 11; i++){ x = 0; x = rand() % 1000; y[i] = x; } for(i = 0; i < 11; i++) printf("%d",y[i]); return (0); } 最初の問題はここまで書けたのですが動きません;_;
113 :
デフォルトの名無しさん :03/12/05 10:47
srand(time(0)); これでよかったっけ? for(i = 0; i < 10; i++) y[i] = rand() % 1000; for(i = 0; i < 10; i++) printf("%d",y[i]);
114 :
デフォルトの名無しさん :03/12/05 10:51
>>110 問題1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void reverseprint(const int *,int);
int main()
{
int a[10],i;
srand(time(NULL));
for(i=0;i<10;i++)
printf("%d ",a[i]=rand()%1000);
printf("\n\n");
reverseprint(a,10);
return 0;
}
void reverseprint(const int *a,int size)
{
for(size--;size>=0;size--)
printf("%d ",a[size]);
putchar('\n');
}
うーん。俺なら、 for (size--; size >= 0; size--) ↓ while (--size >= 0) 俺の方がスタイル悪いかもしれん。
void reverseprint(const int *a,int size) { for(;size-->0;) printf("%d ",a[size]); putchar('\n'); }
void reverseprint(const int *a,int size) { for(a = a + size;size-->0;) printf("%d ",*--a); putchar('\n'); }
118 :
デフォルトの名無しさん :03/12/05 10:58
>>110 問題2(本当は構造体を使いたいんだが)
#include <stdio.h>
int main()
{
int a[4][3],i;
for(i=0;i<4;i++){
printf("%d人目の結果をスペースで区切って入力せよ。\n> ",i+1);
scanf("%d%d%d",a[i],a[i]+1,a[i]+2);
}
puts("\nNO a b c");
for(i=0;i<4;i++)
printf("%d %d %d %d\n",i+1,a[i][0],a[i][1],a[i][2]);
return 0;
}
119 :
デフォルトの名無しさん :03/12/05 11:00
120 :
お願いしますT _ T :03/12/05 11:01
みなさんありがとうございました!感謝感激です。 問題1のとこなんですが、数値の小さい順に並べる場合ってどういう 風になるんですかねぇ???
scanf("%d%d%d",a[i],a[i]+1,a[i]+2); これダメかも。 だめなら scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
122 :
デフォルトの名無しさん :03/12/05 11:02
ソートとか整列でぐぐれ。
>>120 >>1 より
> ・後になって問題につけたしをするのはやめましょう。
> 解いてもらっている方に失礼になってしまいます
124 :
お願いしますT _ T :03/12/05 11:07
>>121 そだね・・・前者も意味はまちがってないけど。
後者のほうが、すんなり読めるね。
>>123 最初は
>>1 のその文の意味が良くわからなかったけど、
なんか付け足してくるバカがあまりにも多いんでやっとわかったよ
127 :
デフォルトの名無しさん :03/12/05 13:34
問1:システムコールを使ってコマンドの引数に指定されたファイルの中身を 標準出力に出力するプログラムを書け。 # include<sys/fcntl.h> main(int argc, char *argv[]) { char buf[512]; int d,n; d = open(argv[1], O_RDONLY); while((n = read(d, buf, 512)) > 0){ write(1, buf, n); } close(d); } たとえば % exXXX abc 123 def と入力するとargcは4で、argv[0]がexXXX、argv[1]がabc、argv[2]が123、 argv[3]がdefとなる。
128 :
上の続きです :03/12/05 13:34
問2:ファイルと行番号と行数の3つの引数が与えられたとき、 指定された行番号から指定された行数だけ、行番号をつけながら 表示するプログラムを作りなさい。 問3:ファイルと行数が指定されたとき、そのファイルの最後の数行を 表示するプログラムを作りなさい。 問4:引数として指定されたファイルの行を最後から逆順に行番号をつけながら 出力するプログラムを作りなさい。 まず問1を解いて、それを元に2,3,4をやってみてください。 たくさんありますが、よろしくお願いします。
129 :
デフォルトの名無しさん :03/12/05 13:36
ボタンを押したら、画像を印刷するプログラムを書きなさい。 C++です。 宜しくお願いします。
>>127-128 >まず問1を解いて、それを元に2,3,4をやってみてください。
>たくさんありますが、よろしくお願いします。
面倒くさいからやれって事か?
>>129 に追記。
これと一緒に適当な文字も印刷しなければなりません。
すいません。
ボタンを作る ボタンを押すと windowsに画像を印刷するようにと言う様に作る ウィーンウィーン 完成
>>132 ( ・∀・)σポチっとなー
ウィーンウィーン・・・
印字できない_| ̄|○
>>133 プリンタについて勉強したら?
今日中にやるわけじゃないでしょ?
猫でもわかるWin32APIとか
いろいろあると思うからね
>>134 ありがとう。でもそこも見てやってみたんですよ。
でも印字できない…根本的に間違ってるのかな…
>>130 面倒くさいというより分からないのです。
教えていただけると助かります。
>>136 UNIX系です。
ご教授願います。
ライブラリっつか UNIXならふつうに呼び出せるプログラムに入ってる 機能そのまんまという
システムコール→system()をコールすると解釈すればよろしい?
ネタだよん。いや、なんとか手を抜きたいなーと。
いい資料だね、ありがとう
>>142
switch文の使い方について教えていただきたいことがあります。 a が 1と2の時は全く同じ計算をさせたいのですが、簡略化する方法はありますか? c言語 は今日で23日目。 switch ( a ) { case 1 : <式> break ; case 2 : <式 : 1と全く同じ> break ; case 3 : <式> break ; }
break; を置かなければ継続実行されることを利用して、 switch (a) { case 1: case 2: <式> break; case 3: ... 因みにスレ違い。
>>144 ネタ…だよな?
とりあえずネタ場合も考慮してみよう。
じゃあ、言うぞ。
C言語入門サイトの switch を見なさい
というのはあまりにも酷なので
switch ( a ) {
case 1 :
case 2 :
<式>
break ;
case 3 :
<式>
break ;
}
147 :
デフォルトの名無しさん :03/12/05 18:28
(1) List-1のデータ このデータをファイルから読み込み,2列目の数値を x としたとき x2-5x の値を計算し,以下のようなファイルを出力するプログラムを作成しなさい. 出力ファイル名 データの個数 データ番号 数値 x2-5x の値 データ番号 数値 x2-5x の値 データ番号 数値 x2-5x の値 in.dat 20 x x x 4 -0.5 15 1.2 3 -0.7 17 1.4 1 -1 6 -0.3 5 -0.4 11 0.5 9 0.1 10 0.2 19 1.9 12 0.6 14 1.1 8 0 16 1.3 13 1 18 1.8 7 -0.2 20 2 2 -0.8 (2) x2-5x の値の合計値と平均値を求め,その結果を goukei.dat と言う名前のファイルに出力するプログラムを作成しなさい. (3) (応用)List-1のデータを取り扱うことが出来る構造体を作成し,(2)で作成したプログラムを書き直しなさい
>>145 >>146 早い回答ありがとうございます。まじめに悩んでました。丁寧にどうもありがとうございました。
149 :
デフォルトの名無しさん :03/12/05 18:29
教えてください。お願いします。
x2-5xとは x^2-5*xのことか? in.datのフォーマットがあまりに曖昧。 ヘッダの20 x x xの意味が不明。 数字2つが並んだものがさらに3つ並んでいるように見える。 ここで2列目と言われてもわからん
つーかそもそも 「List-1のデータ」と「このデータ」とファイル「in.datの中身」は 同一のものを指していると考えていいのか? 他人がわかるように問題を書いてくれ
cl.exeの実行エラーって何ですか? あと、関数の引数に指定している要素が定義されていない識別子ってエラーも 出ているんですが、どなたか何でエラーが出るのか教えていただけないしょうか?
まず、ソース見せろ。そうでないと何も胃炎>153
>>147 たとえばin.datの
> 4 -0.5
のような”整数 実数”の二組が、
出力ファイルで言う
>データ番号 数値
に対応しており
この 数値 というのがさらに問題文にある
2列目の数値 x
に当たる、ということか?
データ番号が連続してないののと
何でこの組が3列ごとに一行にまとまっているのかが説明できんが。
つーか各データの対応が不明瞭すぎだ。
>>153 適当な質問には同等の適当さで答えてもかまうまいな?
君の環境はVC++と仮定する。
するとclってのはVC++に付いているコンパイラの名前だ。
つまりソースをコンパイル中にエラーが起こったってこと。
後者の質問だがたぶん関数の引数の型名を間違って書いたんだろう。
他に考えられるのはエラーの出る行付近で
カンマや空白を忘れたか括弧の対応がなっていなかったなどで
構文の解釈がうまくいっていないということだ。
エスパーさん?
>>156 適当といいつつ、ものすごく丁寧だね。
今スキルの高いひとが居るみたいなんで、宿題マル投げする人、居ない? 漏れは勉強させてもらう。
159 :
デフォルトの名無しさん :03/12/05 19:50
ファイルを読み込みその値を正規化するプログラムをお願いします 。 input.txtファイルの左側の値をX、右側の値をYとした場合 正規化するときの計算式は、 (Xn-平均)/標準偏差 (Yn-平均)/標準偏差 である。標準偏差の計算式は 標準偏差 = sqrt(合計/ カウント数 - 平均 * 平均) である input.txtの中身 7.00972720.60628 8.48795124.05307 12.2619618.18615 11.1961222.19699 7.79884416.60499 6.22354416.27586 13.0643719.55662 7.66390614.88811 6.24999514.76217 10.0862417.89239 である。 そしてその計算したXとYの正規化した結果をテキストに出力するプログラムです お願いします。
160 :
デフォルトの名無しさん :03/12/05 19:52
レジーナガール,2003/10/25,4回京都5,晴(良) 上のような文字列が配列に格納されています。 それから、「レジーナガール」「2003」「10」「25」「4」「京都」「5」 と順次、文字列を切り出して出力したいのですが、どうすればよいですか?
見えにくいと思うので・・
>>で区切りました。
input.txtの中身
7.009727
>>20 .60628
8.487951
>>24 .05307
12.26196
>>18 .18615
11.19612
>>22 .19699
7.798844
>>16 .60499
6.223544
>>16 .27586
13.06437
>>19 .55662
7.663906
>>14 .88811
6.249995
>>14 .76217
10.08624
>>17 .89239
>>で、Tabで区切ってあります
お願いします
余計に見にくいわ。 7.009727 20.60628 8.487951 24.05307 12.26196 18.18615 11.19612 22.19699 7.798844 16.60499 6.223544 16.27586 13.06437 19.55662 7.663906 14.88811 6.249995 14.76217 10.08624 17.89239 (TAB区切り)
>>159 テーブル使いたくねーんで・・・2パス式で行くかなぁ。ちょほぉいとまちなぁ。
>>160 strtok() と思ったが、「回」でちと躓くか・・・。ごめん、だれかお願い。
>>160 ヒント:CSVを取り出すのと、各フィールドを解析するのとを別々に考える。
>>160 sscanf(arr, "%[^,],%d/%d/%d,%d回%[^0123456789]%d", a, &b, &c, &d, &e, f, &g);
ぐすん、とけまちぇんでした。
ごめん。文字列だった。 sscanf(arr, "%[^,],%[^/]/%[^/]/%[^,],%[0123456789]回%[^0123456789]%[^,]", a, b, c, d, e, f, g);
ごめん。文字列だった。 sscanf(arr, "%[^,],%[^/]/%[^/]/%[^,],%[0123456789]回%[^0123456789]%[^,]", a, b, c, d, e, f, g);
二充当工打つ出し脳
>>159 多分、こんな感じ。 コンパイルすらしてないんで、あとはよろしく♪
#include <stdio.h>
#include <math.h>
int main(void)
{
double x, y, meanx, meany, sumx, sumy, sdx, sdy;
int count;
FILE *fp;
fp = fopen("input.txt", "r");
count = 0;
sumx = sumy = 0.0;
while (fscanf(fp, "%lf%lf", &x, &y) == 2) {
count++;
sumx += x;
sumy += y;
}
meanx = sumx / count;
meany = sumy / count;
sdx = sqrt(sumx/count - meanx*meanx);
sdy = sqrt(sumy/count - meany*meany);
rewind(fp);
while (fscanf(fp, "%lf%lf", &x, &y) == 2)
printf("%f\t%f\n", (x-meanx)/sdx, (y-meany)/sdy);
return 0;
}
>>159 結果が正しいかどうかは計算してない。
誰かグラフ化でもして確かめてくれ。
#include <stdio.h>
#include <math.h>
#define DATA_MAX 128
#define POW2(x) ((x)*(x))
void normalize(double data[], unsigned size, double mean) {
unsigned i;
double stddev = 0.0;
for(i=0; i<size; ++i) {
data[i] -= mean;
stddev += POW2(data[i]);
}
stddev = sqrt(stddev);
for(i=0;i<size;++i)
data[i] = data[i] / stddev;
}
int main(void) { const char fileName[] = "input.txt"; unsigned i; unsigned num_data; double x[DATA_MAX]; double y[DATA_MAX]; double mean_x = 0; double mean_y = 0; FILE* fp = fopen(fileName,"r"); if( !fp ) { fprintf(stderr,"cannot read file!\n"); return -1; } for( num_data=0; num_data<DATA_MAX && fscanf(fp,"%lf %lf", x + num_data, y + num_data) != EOF; ++num_data ) { mean_x += x[num_data]; mean_y += y[num_data]; } fclose(fp); mean_x /= num_data; mean_y /= num_data;
printf("#original#\n"); for(i=0;i<num_data;++i) printf("%f\t%f\n", x[i], y[i] ); normalize(x,num_data,mean_x); normalize(y,num_data,mean_y); printf("#normalized#\n"); for(i=0;i<num_data;++i) printf("%f\t%f\n", x[i], y[i] ); return 0; }
void normalize(double data[], unsigned size, double mean) { unsigned i; double stddev = 0.0; for(i=0; i<size; ++i) { data[i] -= mean; stddev += POW2(data[i]); } stddev /= size; stddev = sqrt(stddev); for(i=0;i<size;++i) data[i] = data[i] / stddev; } 総数で割り忘れてた
/* 関数replace */ void *replace(char *s1, char *s2, char *s3) { int len1,len2,len3; char *p; len1 = strlen(s1); len2 = strlen(s2); len3 = strlen(s3); if(len2 != len3) { printf("<エラー>\n"); printf("検索する文字列と置換する文字列が一致していません。\n"); exit(0); } for(p = s1; p <= s1 + len1 - len2; p++){ if( strncmp(p, s2, len2) == 0){ /* ↓足りない部分(s1の中にある、s2の部分をs3に置き換える処理) */ /* ↑ここまで */ return (p); } } return(NOMATCH); } どうすればいいでしょうか?
なんかreplaceの質問が多い memcpy(p, s3, len3);
178 :
デフォルトの名無しさん :03/12/05 22:15
応用問題 1000*1000のマップの上にランダムで100個所の点を作り、 その各点を巡回する最短の経路を求めよ。 という問題が有りますが、ここで教えてもらえること可能でしょうか?
179 :
デフォルトの名無しさん :03/12/05 22:22
>>171 計算結果もあっています。ありがとうございました。
>>178 最適化ってヤツだな?
どっかの大学へ行ったら同じような事してる研究室があった
>>178 手法の指定はないの?
たぶんGAだとおもうけど。
182 :
デフォルトの名無しさん :03/12/05 22:34
>>181 なんでもいいです。
できるものならやってみてください。
>182 そういう言い方すると できる人はやらないし できない人が釣れる からやめなー。相手を試してる言い方はイクナイ('A`)
184 :
デフォルトの名無しさん :03/12/05 22:38
>>183 試しているんですが。
178を読んで分かりそうなものですがね。
>>127-8 をできる人はいませんか?
どなたかマジでお願いします。
結構切羽詰ってるんで。
そういや誰も
>>127 に答えてないな。
たぶんUNIXのシステムコールの経験ある奴が少ないか
ある奴もcatやtail使えばいいのに自分で書く事に抵抗を覚えているか
のどっちかってとこなんだろうな実際。
189 :
デフォルトの名無しさん :03/12/05 22:49
>>187 問題1は既に出来ているように見えるんだけどな。
>>189 そうなんですか?
なんかちゃんと動いてくれなかったから完成していないのかと…。
すいません確認不足だったかも。
>>190 これぐらいで動きそうだな。
/* コメントC1 */
stations[8].next = &(stations[10]);
/* コメントC2 */
stations[5].next = &(stations[9]);
stations[9].next = &(stations[6]);
/* コメントC3.1 */
scanf( "%d", &n );
/* コメントC3.2 */
stations[prev].next = stations[n].next;
おおお、さっそくありがとうございます。 素早い返信でびっくりです。 本当にありがとうございました。 いつか数年後質問に答える側にまわってみたいものです・・
んじゃ、ヒント。 問1(cat相当)は既にできてるとして、 次に行番号をカウントしてつける処理(cat -n相当)を作る。 問2はそれの応用で、↑を行番号で制限するだけ。 問3は数行分のバッファを用意し、順繰りに放り込みながらファイルの終端まで読み込む。 その後バッファの内容を表示すればいい(tail相当)。 問4はアプローチが二通りあって、ファイルが大きくなくてメモリを潤沢に使えるなら ファイルを一行ずつ全部バッファに取り込んで、逆順にするだけ。 そうでないなら、1pass目に行の先頭のファイル先頭からのオフセットを行数分記憶して、 2pass目でオフセットを逆順に辿りながら一行読んでは表示すればいい(tail -r相当)。
>>194 "%s %s" とするまでもなく、"%s%s" で充分。
それと、"%[^/]/%[^/]/%[^/]/%[^/]"を使う場合、入力が
123/456//789
のようになっていると3番目の読み込みで失敗するから要注意。
>>196 >"%s %s" とするまでもなく、"%s%s" で充分。
あっ、そうなんですか。ありがとうございます^^;
>それと、"%[^/]/%[^/]/%[^/]/%[^/]"を使う場合、入力が
>123/456//789
>のようになっていると3番目の読み込みで失敗するから要注意。
ちょっとやってみますね
今は
sscanf ("ai2u3e4o5", "%[^123]%s %s", buf1, buf2);
とやって buf1=ai buf2=2u3e4o5 となって、困ってました。
では、早速
>>196 使い方が少しわかりました。
ありがとうございます。
>>193 =190
身近な悪い例を見るのもいい訓練になるね。
struct station {
int no; /* 駅番号 */
char name[16]; /* 駅名 */
struct station* next; /* 次の駅 */
} stations[17] = {
{ 0, "Start", NULL },
{ 1, "東京", NULL },
{ 2, "新横浜 ", NULL },
{ 3, "小田原 ", NULL },
{ 4, "熱海 ", NULL },
{ 5, "三島 ", NULL },
{ 6, "新富士 ", NULL },
{ 7, "静岡 ", NULL },
{ 8, "掛川 ", NULL },
{ 9, "浜松 ", NULL },
{ 10, "豊橋 ", NULL },
{ 11, "三河安城 ", NULL },
{ 12, "名古屋 ", NULL },
{ 13, "岐阜羽島 ", NULL },
{ 14, "米原 ", NULL },
{ 15, "京都 ", NULL },
{ 16, "新大阪 ", NULL },
};
・データを予め用意しているのだから、stations[17]のように人間が数えてはいけない。
#仮に京都新大阪間に新駅ができた場合、stations[18]と書き換えるのを得てして忘れがちだから。
また、駅番号のように順番に振ればいいだけの場合も、自動採番するべきかもしれない。
#仮に京都新大阪間に新駅ができた場合、新大阪は17番にする場合のことを言っている。
200ゲット♪
>>199 むしろ漏れは駅名が16バイトって方が気になるが。
まぁ、新幹線の駅名が漢字かな混じりで8文字になることも無いかな。
201 :
デフォルトの名無しさん :03/12/05 23:50
書き換えることもないし、char *nameでいいと思う。
struct station { int no; char const * name; struct station * pNext; } const stations[] = { // 以下略
203 :
デフォルトの名無しさん :03/12/06 00:46
おながいします。m(_ _)m 問 10個のでーたを読み込み、Y番目に読み込んだデータを表示させるプログラムを 作ってください。 ①データ構造を決めてください。 ②処理アルゴリズムのフローを書いてください。 ③プログラムを作ってください。
204 :
デフォルトの名無しさん :03/12/06 00:48
1,配列 2,無理 3,ちょっと待て
205 :
デフォルトの名無しさん :03/12/06 00:49
とりあえずデータをint型として 1.array int data[10] 2. ・10個読み込む ・yを入力 ・data[y]を出力 ループは省略 3. int main() { int data[sadg めんどくなたt
#include <stdio.h> #define MAX 10 int main() { int i; int data[MAX]; int temp; for(i = 0 ; i < MAX ; i++) { scanf("%d", &data[i]); } while(1) { scanf("%d", &temp); if(temp == -1) break; printf("data[%d]=%d\n", temp, data[temp]); } return 0; }
207 :
デフォルトの名無しさん :03/12/06 00:59
204~6さん返信どうもありがとうございました。 がんがります
>>207 資料にあるような不定積分をプログラムでやるのは宿題レベルでは到底無理
正規分布であることがわかっていて、その関数とパラメタが与えられているなら
パラメタから平均と分散を求めることはできるが、プログラムとしてはほとんど
書くことはない。
というわけで、たぶんサンプルがあったときに平均と分散を求めろという
問題だと思うが、
(つづく)
だれか、
>>8 をお願いします・・。・゚・(ノД`)・゚・。
(つづき) data[i] にサンプルが入ってるとしてループで sum += data[i]; squareSum += (data[i]*data[i]); とやって、データ数が n なら、 mean = sum/n; variance = squareSum/n - (mean*mean); standardDeviation = sqrt( variance ) variance の計算の定義式からの変形は教科書とかによく乗ってるので確認汁 標本の、ではなくて母集団の平均と標準偏差を推定する場合、 標準偏差のほうの最適な推定値は originalVariance = variance * n / (n-1); となる。はず。たぶん。ここのところしっかり勉強しよう。あたしゃもう忘れた。
名前が「テスト」になったのは気にするな。
問3,4 については、 ファイルサイズの求め方とシークのやり方が分からないので もっと偉い人に頼んでくれ。 まあ最初から全て読んでいく方法もあるが…。
おおお、こんな時間にありがとうございます。 マジ助かります! 問3,4ができる方いらっしゃいませんかねえ…
unixシステムコール stat(), fstat() ファイルサイズ等のファイル情報を得る。 lseek() シーク brk(), sbrk() メモリ確保 ってことで。 ワシは、「システムコールを使え」という縛りだけなら execve()プログラムの実行 あたりでお茶を濁す可能性が大。
#include <stdio.h> #include <string.h> #defineDATA_MAX2 #defineSUBJECT_MAX2 void add(char[][256], int[][256], char[], int[], int, int); double personal_average(int[][256], char[256], char[][256]); double subject_average(int[][256], int, int); int search(char[256], int, char[][256]); int main(void) { int i, y, h, banti, addscore[256], score[256][256]; char name[256][256], addname[256], z[256], x[256]; printf("名前と各科目の点数を入力して下さい。\n"); for (i = 0; i < DATA_MAX; i++){ printf("名前:"); scanf("%s", &addname[i]); for (h = 0; h < SUBJECT_MAX; h++){ printf("科目[%d]:", h + 1); scanf("%d", &addscore[h]); add(name, score, addname, addscore, h, i); } }
printf("平均点を検索したい学生:"); scanf("%s", &x); printf("この学生の平均点は%lfです。\n", personal_average(score, x, name)); printf("平均点を検索したい科目:"); scanf("%d", &y); printf("この科目の平均点は%lfです。\n", subject_average(score, DATA_MAX, y)); printf("添え字を検索したい名前:"); scanf("%s", z); banti = search(z, DATA_MAX, name); if (banti == -1) puts("探索に失敗しました。\n"); else printf("%sは%d番目にあります。\n", z, banti + 1); return(0); }
void add(char name_db[][256], int score_db[][256], char name[], int score[], int subject_num, int index) { strcpy(name_db[index], name); score_db[index][subject_num] = score[subject_num]; } double personal_average(int score_db[][256], char keyname[256], char nametable[][256]) { double sum = 0.0; int i = 0, h; for (i = 0; i < DATA_MAX; i++){ if(strcmp(keyname, nametable[i]) == 0){ h = i; } for (i = 0; i < SUBJECT_MAX; i++){ sum = sum + score_db[h][i]; } sum = sum / SUBJECT_MAX; return(sum); }
222 :
デフォルトの名無しさん :03/12/06 11:22
ビタミンC!!!! YEAH!!!!!!!!!!!
double subject_average(int score_db[][256], int gakuseisuu, int kamokumei) { int i, h; double sum2 = 0.0; for (i = 0; i < DATA_MAX; i++){ h = score_db[i][kamokumei]; sum2 = sum2 + h; } sum2 = sum2 / DATA_MAX; return(sum2); } int search(char kansuukey[256], int num, char a[][256]) { int i = 0, h = 0; for (i = 0; i < num; i++){ if(strcmp(kansuukey, a[i]) == 0){ h = i; break; } else{ h = -1; } } return(h); }
c:\program files\microsoft visual studio\myprojects\hello\hello.c(73) : error C2143: 構文エラー : ';' が 'type' の前に必要です。 c:\program files\microsoft visual studio\myprojects\hello\hello.c(76) : error C2143: 構文エラー : ';' が 'type' の前に必要です。 c:\program files\microsoft visual studio\myprojects\hello\hello.c(80) : error C2065: 'kamokumei' : 定義されていない識別子です。 c:\program files\microsoft visual studio\myprojects\hello\hello.c(81) : error C2065: 'sum2' : 定義されていない識別子です。 cl.exe の実行エラー hello.exe - エラー 4、警告 0 というようなエラーがでてきます…。 関数の定義などは間違ってないと思ったんですが、どうも分からないです。 教えて頂けませんか?お願いします。
subject_average()の頭辺りなんだけど、 ご多分に漏れずその前の関数で括弧が合っていない悪寒。 #まともなエディタなら勝手に検出してくれるだろうに……
Cプログラム作る時のテクニックとして 空の関数を作るというのがあると思うんだが・・・。 いきなり、どん! とコンパイルするのはいかがか。 いや、もちろん、全体の構想(=設計)をしたあと、組むときの話ですよ?
>>227 100-200行程度だったらエディタで書きあげてからコンパイルしてますが何か。
>>226 本当にありがとうございました。
まだsubject_averageがしっかり出力出来てないですが、
>>226 さんを初めとする
僕の問題に目を通して頂いた人々に大変感謝します!
ありがとうございました!!
230 :
デフォルトの名無しさん :03/12/06 17:22
(1) A-B間の距離が 5 、 B-C間の距離が 3 A-C間の距離が 10 のときの A,B,Cの各点の位置(座標)を求めよ。 (2) A,B,C という3点があり、その距離が 3, 4, 5のとき A,B,Cの各点の位置を求めよ。 (3) 問題1,2の点の数や距離を 外部からの入力で変えられるように 変更せよ よろしく頼んます。
1.距離=原点からの距離? 2.制約条件がないので、解が無数に存在するのだが...
>>231 解のうちの一つを示せばいいみたいです。
あと距離は、点と点の直線距離です。
位置はAを原点にとったときの座標です。
A,B,Cを中心とした円を書いて、交点なんかを潰していけばいいのかなぁ
>>231 余弦定理を使ってみる。
a^2 = b^2 + c^2 - 2bc * cos(A)
だから
cos(A) = (b^2 + c^2 - a^2) / 2bc
んでもってcos(A)がわかって長さもわかってるから後は掛け算で座標を求める。
1.2.はあんまりプログラムと関係なさそうだね。
3.は距離を外部から入力自体は簡単だけど、点の数ってなんだ?点の数はABCDの4つですってのが
できるってことかな?そうなるとめんどくさそう。
(1)って解なし?
5 + 3 < 10
きっと空間が曲がっているんだよ。
プログラム組んで、動かしてみてなんか変な値が出るなーと思ったらそれかよ。 とりあえず計算する部分だけアップしてみますので。 struct POINT { double x; double y; }; double AB = 5.0; /* A-B間の距離 */ double BC = 3.0; /* B-C間の距離 */ double CA = 10.0; /* C-A間の距離 */ double cosA; /* cos(A)の値 */ double sinA; /* sin(A)の値 */ struct POINT A, B, C; /* A,B,Cの座標 */ cosA = (AB * AB + CA * CA - BC * BC) / (2 * AB * CA); sinA = 1 - cosA * cosA; /* A点は原点 */ A.x = 0.0; A.y = 0.0; /* B点はとりあえず真横に取るよ */ B.x = BC * cos(0); B.y = BC * sin(0); /* C点を計算で出す */ C.x = CA * cosA; C.y = CA * sinA;
・Σr=180×(n-2)
・e=distance(最後の点,最初の点)
・評価値=1/e
で、GA、じゃだめかな……
だって、2点a,bの座標を固定して、それぞれからある点cの座標を決定するとなると、
>>232 でもあるようにaを中心とした円とbを中心とした円の交点を求めることになって、
結局解は2つになることもあるので…… マズーです。
あぁー 面倒な話になるのだが。 まず、各回転角をr1,r2,...rnとする。 r1=r2=...=rn=180*(n-2)で初期化する。 そうすると各点の座標が求められる(一つ前の座標がわかれば解ける。) ここで始点の座標はあらかじめ(0,0)にでもしておくと解りやすい。 そうすると最終点の座標(ex,ey)が求められる。この(ex,ey)を始点からのベクトルと見て、 このベクトルの傾きに近い辺を探索する。そしたらその辺の両端のrを調整してやる(これはex,eyの座標に関わる)。 角度を調整するとその辺の両端の点以降の座標も変わるので再計算してやる。 もし、ex=ey≒0ならば計算を終了する。 こんな感じで解けそうなんだが…… (1)(2)と難易度違いすぎ。
n = 3 ならCはABの左側(sinAが正)とすればいいだろう。 n >= 4の場合は、 三角形ABCを決定する そこにDを追加する形で三角形CBD付け足す。 以下繰り返し。 という方法ならできる。 この場合、AB,BC,CD,DAじゃなくてCAの長さも当然必要だが。 ちなみに以下繰り返しの部分。 三角形の集まりで多角形を作る方法は 扇形と互い入れ子にするパターンの2通りある。 (OPENGLの多角形描画の方法を調べれば出てくる)
このスレの人親切な人多いなぁ
c++で、 "3つのint型の数を入力し、 小さい順にコンマで区切って並べて出力するプログラムを作りなさい。" という問題が分からんのです。 "2つの数"ならアフォな自分でも解けそうなのですが・・・
scanf("%d %d %d",&x,&y,&z); if (x <= y && y <= z) printf("%d,%d,%d\n",x,y,z); else if (x <= z && z <= y) printf("%d,%d,%d\n",x,z,y); else if (y <= x && x <= z) printf("%d,%d,%d\n",y,x,z); else if (y <= z && z <= x) printf("%d,%d,%d\n",y,z,x); else if (z <= x && x <= y) printf("%d,%d,%d\n",z,x,y); else printf("%d,%d,%d\n",z,y,x);
>>243 の"2つの数"の自然な拡張だな(w
だがC++という指定に沿ってないぞ。
#include <iostream>
#include <algorithm>
using namespace std;
int main(void)
{
int a[3];
for(int i=0;i<3;++i)
cin >> a[i];
sort(a,a+3);
{
int i;
for(i=0;i<2;++i)
cout << a[i] << ',';
cout << a[i] << '\n';
}
}
>>235-237 スマソ 問題写し間違えていました。
みなさんサンクスコ。問題(3)は別にやらなくていいそうです。
点の数が最大5つくらいまで増えるのを考えたらしいですが、めんどくさそうなのでと
>>244-245 サンクス子でした。
やっぱ同じ結果のプログラムでも、
書き方は何種類も考えられるんですね。
248 :
satomi :03/12/07 00:40
はじめまして、C++でプログラム作成するのですが問題が解けません。 問題は、 入力された2つの整数の差の絶対値を出力するプログラムを作成しなさい。整数には、 負数を入力される場合も考慮する。 次のプロトタイプ宣言を持ち、変数n1とn2の差の絶対値を戻す関数を使用すること。 int Absolute(int n1,int n2) 入力は、キーボードから(getcharを使うこと)。 エラー仕様で、9桁以上の文字列が入力された場合、先頭から8桁のみを有効とし、9桁以降を無視する。 また。数値以外の文字が入力された場合、Enterキーのみ、または、'-'のみが入力された場合は、エラーメッセージを 表示して終了する。 この問題を解けるかたがいましたら、解答をお願いします。
>>248 関数はこんな感じか?
int Absolute(int n1,int n2) {
int value;
return (value=n1>n2?n1-n2:n2-n1)>0?value:-value;
}
>>248 関数はこんな感じか?
int Absolute(int n1,int n2) {
int value;
return (value=n1>n2?n1-n2:n2-n1)>0?value:-value;
}
C++でgetchar()なのか(^^;;
10進数8桁ってintで納まるんか?(収まることを前提にせよということか・・・)
すまん、出題があまりに・・・なので解く気が起きん。
悪いプログラマを作ろうとする意思が伝わってるくるんだ。
早めに出題者と縁を切れ。
>>248
252 :
satomi :03/12/07 01:07
参考資料ですと、 #include <stdio.h> int Absolute(int n1,int n2) { if(n1 > n2) { return n1 - n2; } else { return n2 - n1; } } void main() { int n1, n2; puts("2つの数字入力してください。 "); printf("入力1:%"); scanf("%d", &n1); printf("入力2:"); scanf("%d", &n2); printf("絶対値:%0.1d\n", Absolute(n1,n2)); } です。 scanfの場合でもいいので、解ける方がいましたらよろしくお願いします。
>>251 あくまで初歩的な問題なんだろきっと。getcharの使い方を覚えるためとか。
オレはそれよりも
>2つの整数の差の絶対値
がおかしいと思うんだが。
普通、この手の問題は2つの整数の絶対値の差を求めないか?
その方が数学的にも理にかなってるだろ?
問題のやり方だと、符号を考慮して計算させるのに、結果は符合を無視することになる。
>>252 Absoluteは
>>250 であってると思う。
んで、オレが言えるのは、まずmainはintを返せ。
>>219 からのソースを書いた者です。
あれからエラーを無くし、いざ実行すると、指定した生徒の平均点数と科目の平均点数
のところで、1回目に入力した数値(生徒なら1人目、科目なら1科目目)は
ちゃんと出力されるのに、2人目や2つ目に入力した科目の平均点を出力しようとすると
問題がはっせいしたため~を終了させていただきます。
となって、実行が中止されるんです。。
1人目や1つ目の科目が出力されるのに何故でしょうか?
>>253 >普通、この手の問題は2つの整数の絶対値の差を求めないか?
普通そうかもしれないけど、
どっちも意味があるような気がする。
差を求めるといったら、2数の数直線上の距離を求めるわけだから、
>>252 >>250 のAbsolute()でいい。
ただねぇ・・・。オーバーフローしちゃうんだよねぇ・・・INT_MAXとINT_MINとの差とかだと。
突っ込み入れとくと、
>>250 のvalueはオーバーフローしない限り、負になることはないんで、冗長。
んで、Absolute()が問題ではなく、
getchar()を使って、数の入力をせよというのが問題のメインですな。これ。
つまり・・・
int getint(int *value); // 整数の入力。成功時の戻り値は0、*valueに入力された整数を入れる。エラー時の戻り値-1、*valueは不定。
とか、数値の関数つくるのが主だわ。
>>255 ネタだよね?
>257 訂正 誤)数値の関数 ↓ 正)数値入力の関数
>251にツッコミを入れてみたり あんたばか?
>>248 宿題を作った人が2値の差を求めるのにAbsolute(しかも引数2つ)なんて
関数名にするにするのはちょっと悲しいね。
直裁だなぁ。
>>259 未解決の問題を解いてもらえない人がぶーたれてるんだろーなぁ。
殺伐中にすみませんが、
>>101 って解決したですか?
>>212-213 返事遅くなってすみません。どうもありがとうございました。たすかりました。
>>263 殺伐殺伐ぅ~(意訳:火に油を注がんでくれ)
>>262 国語辞典で調べてしまった。
(1)直ちに裁決すること。
(2)自ら裁決すること。
>>263 のレスにつられてこんな時間までかかって
>>101 のを作ってしまいますた。
ちなみに答えは
最小価格経路
経路:A-B-F-E-H
価格:20500円,時間:1459分
最小時間経路
経路:A-B-D-G-H
価格:48640円,時間:238分
となりますた。
>>262 直截(ちょくせつ/ちょくさい) まわりくどくないこと。ずばりということ。
誤変換もツッコミ対象なのね、ここは。
>>268 おつかれさま。
>>269 そだね。複数答えがあるほうが、回答する人同士も勉強になって
いいと思う。
>>257 ネタではないです。。
本当に分からないんです。
ちゃんと生徒・科目をループさせて平均を求めようとしたのに…。
何故なんでしょうか?
int search(char kansuukey[256], int num, char a[][256]) { int i = 0, h = 0; for (i = 0; i < num; i++){ if(strcmp(kansuukey, a[i]) == 0){ h = i; break; } else{ h = -1; } } return(h); }
この関数はkansuukeyに指定した文字列とa[]の配列のi番目が一致すれば hをiにかえてif文を終了してhを出力、違うならiを+1してnum回ループさせても 見つからなかったら-1を出力するというプログラムになっていますか?
>>273 お前、そんな考えでプログラミングしてると禿げるぞ。
・h は必要ない。
・break;を伴うifにelseは要らない。
改めてソース晒してみ?
長いので、
>>1 に書き込みます。
成績処理プログラムって題のスレです。
fgetsの使い方が分かりません。 問題は、数字と文字列を交互に入力として受け取って、endが入力されたら 文字列の入力にはfgetsを使う。 当然繰り返しを行う。 例 4 hello 6 end
>>276 宿題に「fgets()を使え」という条件は入ってる?
>>276 end が入力されたら、繰り返しの入力を終了ですよね。
char buffer[128];
int mode = 0;
while(fgets(buffer, sizeof(buffer), stdin) != NULL){
if (strcmp(buffer, "end") break;
fprintf(stdout, "%s", buffer);
}
void *replace(char *s1, char *s2, char *s3) { int len1,len2,len3; char *p; len1 = strlen(s1); len2 = strlen(s2); len3 = strlen(s3); if(len2 != len3) { /* s2とs3の文字列の数が等しくなければエラー */ printf("<エラー>\n"); printf("検索する文字列と置換する文字列が一致していません。\n"); exit(0); } for(p = s1; p <= s1 + len1 - len2; p++){ if( strncmp(p, s2, len2) == 0){ /* memcpyでs3からlen3の数だけp(=s1)にコピーする -> 置換処理 */ memcpy(p, s3, len3); return(p); /* 一致する場合に返す */ } } return(NOMATCH); /* 一致しない場合に返す */ } これで、 s1= abcdefabcdef と入力して s2 = abc、s3 = xyz って入力しても s1がxyzdefabcdef としかならない・・・xyzdefxyzdefが正く出力されないのですが、 for文のあたりをどう修正すればいいでしょう?
>>275 scanf()は使うな。
addnameはcharの一次元配列。だからaddname[0]はただのchar。
以上。
>>279 その関数は、一致する最初のブロックを置換したらreturnしている。
なので、そのreturnを外せばいい。
だが、なんと言ってもそのループは気持ちが悪い。
>>279 一致したら一回でおしまい(return(p))になっているから。
ところで len1 < len2 の時にクラッシュするけど、いいの?
for文のあたりをどう修正すればいいでしょう? ↓ そのfor文を含む関数を全面的に修正すればいいです。
>>279 追い討ちになっちゃうけど
そのままの考え方で進めていくと、abccccccccc という文字列の
abc を Zab に置き換えようとしてはまりそうな悪寒。
>>284 良いサンプルですね。
Zabcccccccc が期待する結果なのだろうけれど。
多分問題文は16代目の566だと思うんだけれど。
この手の場合、置換対象はもっとも左側のもののみとし、
戻り値はaそのものか、置換した場所を返すのがシンプルだと思う。
マッチするものをすべて置換すんなら、戻り値は置換した個数だろう。
http://pc2.2ch.net/test/read.cgi/tech/1069837000/566 >566 :デフォルトの名無しさん :03/11/30 21:56
>「文字列a,b,cを引数として受け取り、aに文字列bが含まれている場合、
>bの文字列の部分をcに置き換える関数を作成せよ。
>ただし、bとcの長さは常に同じであると想定すること。」
>おねげぇしますだ。
>>280 出来ました。朝からずっと考えていた時間は何だったんだー。
ホントにありがとうございます、
>>280 さん!!
入力が正しいかどうか・・・テーブルを表示させるくらいのチェックは入れましょうや。
よく見抜いたね
>>280
>>288 コンパイルして動かしてみたらprintf()で落ちたから引き数を眺めた。
そしてその引き数をエディタで検索した。
以上。w
ま、コンパイルする前に気づかなかった時点で個人的には癪なのだが。
>>279 >
>>283 >285風味な答え for文がトリッキーなんで、好みじゃなかったらwhile()で置き換えてみて。
#include <string.h>
char *replace(char *a, char *b, char *c)
{
char *p;
if (a == NULL || b == NULL || c == NULL)
return NULL;
if (strlen(b) != strlen(c))
return NULL;
if ((p = strstr(a, b)) != NULL)
memmove(p, c, strlen(c));
return p;
}
int replace_multi(char *a, char *b, char *c)
{
int count;
for (count = 0; (a = replace(a, b, c)) != NULL; a += strlen(b), count++)
;
return count;
}
#include <stdio.h>
int main(void)
{
char a[100], b[100], c[100];
while (scanf("%99s%99s%99s", a, b, c) == 3)
printf("%d '%s'\n", replace_multi(a, b, c), a);
return 0;
}
「student」という構造体を定義する。この構造体は「name」 というchar型20個分の配列と、int型の「kokugo」と、 int型の「eigo」いう三つのメンバーを持っている。 main関数の引数にファイル名を指定し、このファイルにキーボードから入力した studentを追加書き出しする(3 名以上)。最後に確認のためにファイル内すべての データを表示する。ただし、ファイルがない場合は新規に作成する。 #include<stdio.h> struct student{ char name[20]; int kokugo; int eigo; }; main() { 以下がわかりません・・・・・・ よろしくおねがいします
>>291 すでに間違ってるぞ。 < main()
>main関数の引数にファイル名を指定し
>>291 さて、登録済みの人のデータを修正するというのを後から追加されるとイヤンなわけだが、大丈夫?
#include<stdio.h> #include<stdlib.h> void fibo(); void main() { fibo(); return; } void fibo() { int a=2,b; double f[200]; char str[200]; f[0]=1,f[1]=1;//0の場所に1,1の場所に1が入っている printf("フィボナッチ数\n\n"); printf("いくつ、フィボナッチ数を出しますか?(78まで)\n"); gets(str); b=atoi(str); printf("\n"); for(a=2;a<b;a++) f[a]=f[a-1]+f[a-2];//a=a-1+a-2をループ for(a=0;a<b;a++) printf("%.0f\n",f[a]);//ループでaの入っているものを表示 } なんで78までしか正常に作動しないのだろう? なんでなの先生がそれを説明しなさいってうるさいんだよだからお願いします。 教えてください
double なんて使うから
お願いします。 入力の英文数を数えるプログラムなんですが、 if(buf[i] == '.' || buf[i] == '?' || buf[i] == '!') ++eng; printf("英文数は%dです。\n", eng); こういう風に、「.」「?」「!」が出てくるたびにengを1増やす方法だと、 He says "I am a cat. Yet I have no name." と入力した場合、本当は英文数は1なんですが、2と表示されてしまいます。 「"」を考慮して、英文数を数えるにはどうすればいいんでしょうか?
桁が大きすぎてコンピュータがちゃんと扱えなくなるから。
299 :
デフォルトの名無しさん :03/12/07 16:58
"を読み取るごとにモードを変える
>>296 我輩は猫である。名前はまだない。と日本語で解釈すれば、2文なので、OKとする。
>>296 仕様による。たとえば
He says. " ". "
という文の英文数はいくつと考えるつもりなの?
そんな英文あるのか?
He says "He says "I am a cat. Yet I have no name."."
304 :
デフォルトの名無しさん :03/12/07 17:12
>291 テストしてないけど int main (int argv ,char *argc[]) { FILE *fp; struct student person; if (argv != 2 ){ printf("errro \n%s filename\n",argc[0]); exit(1); } fp=fopen(argc[1],"w+"); fseek(fp,0L,SEEK_END); while(1){ printf("データを追加しますか? y or n :"); scanf("%c",&c); if(c=='y'){ printf("名前:");scanf("%s",&person.name); printf("国語;")scanf("%d",&person.kokugo); printf("英語:");scanf("%d",&person.eigo); fprintf(fp,"%s\n",person.name);fprintf(fp,"%d\n",person.kokugo);fprintf(fp,"%d\n",person.eigo); } else if(c == 'n'){ break; } else{printf("入力はyかnです\n");} } fseek(fp,0L,SEEK_SET); while( (c=fgetc(fp)) != 0 ){ printf("%c",c); } fclose(fp) ; return 0; }
305 :
デフォルトの名無しさん :03/12/07 17:15
>>304 w+で開いたらファイルの中身は消されるから直後のfseekは意味がないと思われ。
英文カウントの話。 あほらしいと思っても、細かい条件を考えなきゃいけないんよ。 だからプログラマはバカにされるんだが。 こういう条件なら組みやすそうだ。 ・"と"で囲まれているものは引用とする。引用の入れ子はないものとする。 ・引用の末尾にピリオド等があったら、親の文の終わりとする。 自然言語を扱うときは、ある程度縛りをいれてやらんと、どーしよーもなくなる。
引用の始めと終わりが同じなら、そもそも入れ子なんて無理では。 /*と*/のように異なれば入れ子にすることもできるだろうけど。
他アプリのコンボボックス内アイテムのリストと 選択されている項目を拾いたいのですが どのようなAPIを使用したら良いでしょうか。 よろしくおねがいします。
310 :
デフォルトの名無しさん :03/12/07 17:26
>296 オートマトン作ってみろ。
>>310 PDAじゃないと駄目ぽ。チューリングマシンまでは必要ないけど。
>>308 自然言語なら在り得る表現。
"文章を引用するときは、"文章を"で引用する"のように"で括らないといけません。"
>>304 問題を誤解しているぞ。
>main関数の引数にファイル名を指定
をコマンドラインと解釈しろとは書いてない。
>>304 先生、寿限無君の名前を正しく入れたらプログラムがおかしくなりました。
>>308 >>313 の言うとおり。冗長だと思っても「入れ子はしない」と書いたのよ。情報を伝えるって難しいね。
>>315 落語聞かないいんだけれど。お題なんだっけ<じゅげむ
(a|b)*abbという正規表現を認識する DFAの状態遷移表は次のようになる。 |AC |B |D |E a |B |B |B | B b |AC |D |E |AC 開始状態は AC、終了状態は Eである。 この状態遷移表を用いて、引数として渡された文字列が、正規表現 (a|b)*abbにマッチするならば 1をそうでなければ 0を返す関数 int ababb(char*)を定義せよ。 #include <stdio.h> int table[2][4] = {{1,0},{1,2},{1,3},{1,0}}; /* 遷移表を配列として表現 */ int ababb(char* str) { ? } int main(int argc, char** argv) { int i; for (i=1; i<argc; i++) { char* str = argv[i]; if (ababb(str)) { printf("%sは正規表現 (a|b)*abbにマッチします。\n", str); } else { printf("%sは正規表現 (a|b)*abbにマッチしません。\n", str); } } return 0; } ?の部分を埋めてください。
寿限無君対策版・・・未完なんで、キーボードから入力し配列に追加ってのと、ファイルのオープン関係はそっちでやってくれ。 #include <stdio.h> struct student { char name[20]; int kokugo; int eigo; }; void write_student(FILE *fp, struct student *st, int n) { int i; for (i = 0; i < n; i++) fprintf(fp, "%s %d %d\n", st[i].name, st[i].kokugo, st[i].eigo); } int read_student(FILE *fp, struct student *st, int n) { char fmt[20]; int i; sprintf(fmt, "%%%ds%%d%%d", (int) sizeof(st[0].name)-1); for (i = 0; i < n; i++) if (fscanf(fp, fmt, &st[i].name, &st[i].kokugo, &st[i].eigo) != 3) break; return i; } int main(void) { struct student st[100]; int n; n = read_student(stdin, st, 100); write_student(stdout, st, n); return 0; }
319 :
デフォルトの名無しさん :03/12/07 18:48
C言語の問題です。 異なるn個のものからr個とって1列に並べる順列の数(nPr)と 異なるn個のものからr個とる組み合わせの数(nCr)を求めたい。 n!は関数factorialを用いて行いたい。 どうぞよろしくおねがいします。
>>320 宿題ではどういう問題になってますか? 問題全文を書いて。
書かないと、ネタだと思われちゃうよ。
>>320 つーかもしかして
何が問題なのかわかってない?
""が入れ子になった場合、
A"B"C"D"が、
.A
. B D
. C
という構造なのか、
.A C
. B D
という構造なのか
容易に判別が付かないって言ってるの。
括弧と括弧閉じが同じ記号だから。
だから""の入れ子はないものとする、って仮定が欲しいわけよ。
(この場合は".!?"のような終端記号が目印にできるけどさ)
参考までに言うとたとえばプログラム言語の文法じゃ
こんな入れ子は禁止、回避策として
" ' " " ' "
のように二種類の括弧を交互に使って入れ子を作らせる。
機械的にレス返すんじゃなくて
最低限、続くレスを読んで問題認識を共有してほしいな。
何と言ってもこれは君の問題なんだから
>>319 簡単すぎて反応がないのかもよ。
待ち時間がもったいないなら、factorial()あたりは自力で組んで見ませう。
>>321-322 問題文は既に書いてあります。一応問題全文を書きました。
英文を入力してその総文数を数えるプログラムです。
レポートにもそう書いてあるので、これ以上書きようがないのですが・・・。
>>324 int count(char buf[])
{
int i = 0, eng = 0;
while(buf[i] != '\0') {
if(buf[i] == '\"')
while(buf[++i] != '\"')
;
if(buf[i] == '.' || buf[i] == '?' || buf[i] == '!')
++eng;
i ++;
}
return eng;
}
>>324 >>296 言葉を伝えるのも受け取るのも難しいものですね。
漏れ読解力がないのか、問題全文がどの範囲なのか分からんです。
「英文を入力してその総文数を数えるプログラムを作れ」が問題全文でしょうか。
レポートという語が何を指しているかわかりません。
演習をして、その後提出するレポートに項目があるのでしょうか。
と、エスパーさんをやった上での意見。
これは、解答というより、方向性の話なんだけれど、
あなたの提示したプログラム片
> if(buf[i] == '.' || buf[i] == '?' || buf[i] == '!')
> ++eng;
> printf("英文数は%dです。\n", eng);
から学習度を推定してみると、
単純な英文のみを考慮すればよさそうです。
ですから、気になるのであれば、
解答中に「ダブルクォートで囲まれた文や引用などに対しては未対応」と
注釈を添えるだけでよいと思います。
>>325 ごめん。やりたいことが分かるコード(=いいコード)だから突っ込ませてもらう。
英語では
He said "foo."←みたいに末尾に引用がくると、引用の中にピリオドを置く。
引用を全部読み飛ばしてしまうと、上に書いた文がカウントされない。
>>319 とりあえず
int factorial(int n)
{
int retval = 1;
if (n <= 1)
return retval;
do {
retval *= n;
} while (--n > 1);
return retval;
}
/* あとはまかせた */
階乗を使ってPやCを作るのは 計算が無駄な上に桁あふれの心配があって嫌なのだが int factorial(int n) { int ret = 1; while( n > 1 ) ret *= n--; } int permutation(int n, int m) { return factorial(n)/factorial(n-m); } int combination(int n, int m) { return factorial(n)/factorial(m)/factorial(n-m); }
あ、-1付くんだっけ。 まあ「数学」の部分は自分でやってください。
int factorial(int n) { int ret = 1; while( n > 1 ) ret *= n--; return ret;/******/ }
よい子は真似しちゃダメだぞ。 int faketoreal(int n) { if (n > 1) { return n * faketoreal(n - 1); } return 1; }
えちぃく誤読した漏れ。 偽者注意。
>>332 おいおい、再帰で階乗かよ。
#しかもFakeToReal・・・
さて、そろそろ明日のために、寝るかね。 その前に1問くらいは、お相手できるかな。
>317 伝わってないな。 で、それを使ってどのようなルールにして英文カウントするのかと(ry
暇だから多桁計算使って n=19 r=5まで出来たが。 n=20でこけた。 n=19 r=5 P=1395360、C=11628 遊べたから良し。
338 :
デフォルトの名無しさん :03/12/07 23:50
宿題が分からないのでどなたか解いてもらえませんか? よろしくお願いします。 a,bおよびcと命名した記憶場所に実数値を入力し、 それらを係数とする2次方程式 ax^2+bx+c=0 の解の判別式 bの2乗-4ac を計算、 判別式の符号を調べて実数解が 存在するか判定(存在する:1/存在しない:0) a,b,cおよび判定結果を画面とファイルの両方へ出力。 1.上記の仕事を行うプログラムを組みたてよ。 ただし、判定結果は整数値で表現すること。 2.組み立てたプログラムを実行せよ。 なお、入力する数値の組は次のいずれかを使用すること。 〈1〉a=0.5, b=2.1, c=1.2 〈2〉a=3, b=6, c=3 〈3〉a=1, b=1.5, c=2 困っています。助けてください。よろしくお願いします。
テイラーの定理 領域Dでz=f(x,y)はC^n級、2点(a,b),(a+h,b+k)を結ぶ線分がDに含まれているとき、 次の式を満たすθが存在する。 f(a+h,b+k)=f(a,b)+df(a,b)+(1/2!)d^2f(a,b)+・・・・・・+{1/(n-1)!}d^(n-1)f(a,b)+(1/n!)d^nf(a+θh,b+θk) (0<θ<1) d=h(δ/δx)+k(δ/δy) をプログラムにするとどんな感じになりますか?
>>338 ↓は、書かないほうが良い。
> 困っています。助けてください。
>>339 定理は定理であって、プログラムするもんじゃない。
>>338 #include <stdio.h>
int main(void)
{
double a, b, c;
int f;
scanf("%lf%lf%lf", &a, &b, &c);
if (b*b-4*a*c >= 0)
f = 1;
else
f = 0;
printf("%d\n", f);
return 0;
}
悪い子でも真似しちゃダメだぞ。(w int combination(int n, int r) { if(0 == r || n == r) return 1; return combination(n - 1, r) + combination(n - 1, r - 1); } int permutation(int n, int r) { if(0 == r) return 1; if(n < r) return 0; return permutation(n - 1, r) + n * permutation(n - 1, r - 1); }
訂正 下から2行目 return permutation(n - 1, r) + r * permutation(n - 1, r - 1);
void *replace(char *s1, char *s2, char *s3)
{
int len1,len2,len3;
char *p;
len1 = strlen(s1);
len2 = strlen(s2);
len3 = strlen(s3);
if(len2 != len3)
{
/* s2とs3の文字列の数が等しくなければエラー */
printf("<エラー>\n");
printf("検索する文字列と置換する文字列が一致していません。\n");
exit(0);
}else if(len1 < len2 || len1 < len3){
/* s1がs2やs3より少ない場合はエラー */
printf("<エラー>\n");
printf("調べる文字列のほうが検索する文字列より少ないです。\n");
exit(0);
}
for(p = s1; p <= s1 + len1 - len2; p++){
if( strncmp(p, s2, len2) == 0){
/* memcpyでs3からlen3の数だけp(=s1)にコピーする -> 置換処理 */
memcpy(p, s3, len3);
return (p);
}
/* 一致する場合に返す */
}
return(NOMATCH); /* 一致しない場合に返す */
}
>>282 で指摘された部分を修正しましたけど、
for文について色々試したのですけど、結局
>>279 と同じ結果になるのです。
>>344 だからforループ中でreturnするのを止めろと言っとろーが
>344 宿題の問題全文を教えてくれ。 穴埋めなの?
347 :
デフォルトの名無しさん :03/12/08 12:57
ファイルを読み込んである値の数字がある場合、その数字を削除するプログラムをお願いします。 (例)40以上の値を削除する場合 input.txt 10 50 20 15 30 ouput.txt 10 20 15 30 と出力させるプログラムをお願いします
>>347 問題文がよくわからんが、こんな感じ。
ファイルの指定はリダイレクトを使ってくれ。
#include <stdio.h>
int main(void)
{
int a;
while (sscanf("%d", &a) == 1)
if (a < 40)
printf("%d\n", a);
return 0;
}
#include <fstream> #include <vector> #include <algorithm> #include <functional> #include <iterator> int main() { ifstream in("input.txt"); vector<int> v((istream_iterator<int>(in)),istream_iterator<int>()); v.erase(remove_if(v.begin(),v.end(),bind2nd(greater<int>(),40)),v.end()); ofstream os("output.txt"); copy(v.begin(),v.end(),ostream_iterator<int>(os,"\n")); return 0; }
いるよねーこういうの。
352 :
デフォルトの名無しさん :03/12/08 14:04
n個の数字を大きい順にソーティングするプログラムをCで組んでもらえませんでしょうか? ネ申の光臨をお待ちしております。
サンクスコ
355 :
デフォルトの名無しさん :03/12/08 14:17
>>355 4 -0.5
の行を
4 -0.5 2.75
として出力しろということだな。
1. 一行読み飛ばす
2. 一行読み取ってそれを数値に変換してnに代入(scanfか何かで)
3. 一行読み取ってそれを二つの数字(datano, x)に変換する(同じく)
4. 二つ目の数字を計算する(y)
5. (datano, x, y)を出力(printfか何かで)
6. 3.からの処理をn回分繰り返す
終了。
関係ないけど提出しますた
359 :
デフォルトの名無しさん :03/12/08 14:28
できればソースを書いてもらえませんか?初心者なので分からないです。
361 :
デフォルトの名無しさん :03/12/08 14:31
教えてください。お願いします。
int i, n, datano; float x, y; scanf("\n"); scanf("%d\n", &n); for(i = 0; i < n; i++) { scanf("%d %f \n", &datano, &x); y = x * x - 5 * x; printf("%d %f %f\n", datano, x, y); } でよかったっけか?
363 :
デフォルトの名無しさん :03/12/08 14:48
教えてくれてありがとう。これは1番ですか。(2)(3)もお願いします。
そもそもこの程度で構造体使う時点でこの問題マイナスだね
句読点、単語の使い方からしてマジっぽいぞ。
出題者本人キタ━━━━(゚∀゚)━━━━ッ!!
このスレは大金先生に監視されています。
大金先生! 質問 データの個数を先頭で指定するのはいかがなものかと? 先頭の個数とデータ行数に食い違いがあったらどうすんの?
>>355 , 365
ワロタ。いい先生じゃないかー
質問!>大金先生 出力ファイル名はどのようにして決定すればいいですか?
373 :
デフォルトの名無しさん :03/12/08 15:42
∧_∧ ( ・∀・) ドキドキ ( ∪ ∪ と__)__)
質問!!! 入力ファイル中のデータ番号にはどういう意味がありますか? なぜデータ番号の順に並んでいないのですか?
ファイルの頭にデータサイズを記録するのはあたりまえだと思う。 エラーを検出したときどーすんの?って話だろうから、ちょっと演説。 エラー時の設計方法として、 A)メッセージを出力して即終了 B)メッセージを出力して処理を継続(できるものなら) C)ユーザーに問い合わせて、正しいデータを入力させるか、処理を中止させる。 という方法が考えられる。 非対話型のプログラムならA)でよいし、対話型のプログラムならC)を採用するのが良い。 B)を採用するなら、 データ数が多いとき→余分なデータは無視する。 データ数が少ないとき→入力できた実際のデータ数をデータ数とする。 わたしゃ、大金センセではないが。
ソートの課題があるじゃないかな>データ番号
>>375 データ数が多いとき→実際のデータを採用
データ数が少ないとき→足りないデータは捏造
だろ?
現実主義
>>377 捏造とゆーのは響きがわるいが、
たしかに、区切りのよいようにダミーデータ置くのもいいよね。
>>375 、377-378
それらは全て設計時のポリシーだろ。
一人で作るなら何でも良いが、一般論として語る事が今一
学生が変に覚えて、会社に入って言いそうな事だな。
こういう学生は困る!
「なんだかワカランがお前の言い草が気に入らない」以上のレスじゃないな。
>>379 よ
275,377,378 が設計以外の何をやっているというのだ?
...問題のあげ足取りかな(w
>>379 ん? 「一般論として語ることがイマイチ」で文が終わってるんかな。
あたりまえだが、批判するなら、よりよいご意見を入れてね。
ぶーたれるのは誰でも出来る。
・・・と、ここまで書いて思ったんだが、
「出来ない社会人を装った釣り」なのか?
>>380 >>381 同意
ワッツユアポリシー
目的も無しに結果だけの設計なのか? ま、375は目的は入っているが、その結果が「良し・する」ではね。 もしそれが設計なら、浅いとしかいえない。 375と違う結論の227でも良いわけだ。多にもある。 時間がないので、私はこれで終わる。
227>>377 訂正します
どーでもいいけど 設計の"深い"目的ってなんだ? 結果を出す以外に設計に何かあるのか? 芸術か? おぉなんと美しく奥深いインターフェース!(w
>>384 ・・・釣りだろうけれど、マジレスしとくわ。
終わってくれ。というか、終わっとる、あなたが。
>>227 は設計しとるんじゃなくって、設計するときの指標を書いたくらいだと思うが。
そういうのも、読み取れない?
一連の書き込みは他人の文章を理解できない人間が、
書いたやつが悪いとぶーたれとるよーに見える。
実際に悪い文章ってのはあるので、気持ちはわかるが。
(例
>>379 >>384 )
ちなみに、良い文章というのは、話が筋道だっていて、わかりやすいです。
ですから、突っ込みをいれやすいのです。
あなたの文章は論旨がわかりづらく、雰囲気で読ませています。
突っ込まれるのを恐れている文章です。
いや。なんか書いてて周囲の人がかわいそうになってきた。
大金先生 ! スレが荒れてます。なんとかしてください!!
良く分からないが、スレが荒れているという結果を問題にするのは浅いとしか言えないので、 このスレの目的をアレして終われ。
議論厨うぜぇ 誰か宿題を投げてくれ
1) 文字列のハッシュ値を返す関数 unsigned int hash(char *str); を作成せよ。 2) 作成したハッシュ関数の性能を低下させるようなデータ集合を作成せよ。 2)でいう「性能を低下」とはハッシュ値がばらけないことを言っているのだと思います。 よろしくお願いします。
>>391 1)関数
unsigned int hash(char *str)
{
int h = 0;
while (*s)
h += *s++;
return h;
}
2)データ集合
char *data[] = { "az", "by", "cx", ... , "xb", "za"};
スマン2)を答えるために1)をマヌケにした。
*s はどこから?
直してやれよ。ってか、unsigned int を返すのにint h = 0;はいかがか?
どっからだと思う?
>>393-395 しょぼーん。
訂正するね。
int h = 0;
を次の2行に置き換えてください。
unsigned int h = 0;
unsigned char *s = (unsigned char *) str;
自信喪失なので、別解答きぼんぬ。
できれば、マヌケじゃないハッシュのやつ。
次スレは大金先生で決まりだな(藁
398 :
デフォルトの名無しさん :03/12/08 20:36
【適宜】C/C++の宿題は大金先生に任せなさい18代目【対応】 ってあまりに可哀想だ・・・。誰だよ晒した奴。
何故という質問なので理由だけ。 簡単そうなので↓を例に説明。 bool left_ok(int x, int y) { for(;x>=0 ; x--) if(board[x][y]==QUEEN) return false; else return true; } コンパイラは次のように解釈するから。 bool left_ok(int x, int y) { for(;x>=0 ; x--) { if(board[x][y]==QUEEN) { return false; } else { return true; } } }
401 :
デフォルトの名無しさん :03/12/08 20:51
for( ; x>=0 && y>=0 ; x--, y--) if(board[x][y]==QUEEN) return false; return true;
>>400-401 ありがとうございました、elseが余計でしたか・・・
私情ですがこの前はelse付け忘れでした
>>402 慣れるまでは{}はつけたがいいよん。
ここの回答で{}無い場合が多いのは慣れてるか、スペースの無駄だから。
スタイルの本は、多くの場合、{}をつけるよう薦めてる。
>>399 > 誰だよ晒した奴。
ナンダ、ネタダッタノカ。タノシカッタノニ。
>>355 >>365
404 :
デフォルトの名無しさん :03/12/08 21:38
>>341 さんへ
>>338 です。今帰ってきました。提出しないと単位を落としそう
だったので助かりました。ありがとうございました。
自力で解けるようにこれからは頑張ります。
405 :
デフォルトの名無しさん :03/12/08 22:28
Cでひとつ質問。 整数を3つ入力して、一番早く小さい順に並べるやり方はどうなるの? バブルソートが効果的?
>>405 3つくらい案がある。バブルソートは単純なソートでは遅いので使わないこと。
ライブラリ関数のqsort()。
単純なソートを自作するなら挿入ソート(インサートソート)が効率いい。
配列を習ってないなら、if()だけでうりゃーと解くのもある。
407 :
デフォルトの名無しさん :03/12/08 22:34
半角文字のみからなるテキストファイルを入力として、単語の出現頻度を調べ るプログラムを作成せよ。 [報告事項]頻度の高い上位50個程度の単語と出現個数の表 テキストファイルは大文字小文字のアルファベットと空白と改行のみで構成されています。 (事前の作業により"."や"?"などの記号は空白に置き換えられてます。) ちなみにテキストファイルの中身はトムソーヤの冒険です。 という問題、どなたかお願いします。
408 :
デフォルトの名無しさん :03/12/08 22:36
a>b?b>c?c:b:a>c?c:a
409 :
デフォルトの名無しさん :03/12/08 22:40
>>406 ありがとうございます。
バブルソートはおそいんかぁ
>>406 おいこら、たった3つの数を並べ替えるのに、qsort()持ち出してどうする。
#まぁ、速度は兎も角手っ取り早いが。
>>405 力ずくのソート。3つならこの方が速い
#include <iostream>
#include <tchar.h>
int main(int argc, _TCHAR* argv[])
{
int dat[3];
int no1,no2,no3;
scanf("%d",&dat[0]);
scanf("%d",&dat[1]);
scanf("%d",&dat[2]);
if(dat[0]>dat[1]) {
if(dat[0]>dat[2]) {
if(dat[1]>dat[2]) {
no1=2; no2=1; no3=0;
} else {
no1=1; no2=2; no3=0;
}
} else {
no1=1; no2=0; no3=2;
}
} else {
if(dat[0]>dat[2]) { no1=2; no2=0; no3=1; } else { if(dat[1]>dat[2]) { no1=0; no2=2; no3=1; } else { no1=0; no2=1; no3=2; } } } printf(" no=%d no=%d no=%d \n", dat[no1] , dat[no2] , dat[no3] ); scanf("%d",&dat[2]); // 画面止めのため入力 return 0; }
> 一番早く んー。動作速度ではく、早く組み上げるというのならsort()だ。俺は。たとえ3つでも。
412だが、何でも良いと思う^^;
417 :
デフォルトの名無しさん :03/12/08 23:19
みなさんありがとうございました。 いい参考になりました
暇があったらぼちぼち答えるので、未解決なの書いといて♪
422 :
デフォルトの名無しさん :03/12/09 00:52
質問があるんですが、教えてください。 問一 用意した配列に、小さいほうから順に素数を生成して代入し、 それの配列を画面に表示するプログラム 問二 配列を渡すとそこに素数を順に代入してくれる関数プログラム 問三 ポインタを使用して素数かどうかを判定する関数プログラム よろしくおねがいします。
おいおい、もまえら(w if(tbl[0]>tbl[1]){ val=tbl[1]; tbl[1]=tbl[0]; tbl[0]=val; } if(tbl[0]>tbl[2]){ val=tbl[2]; tbl[2]=tbl[0]; tbl[0]=val; } if(tbl[1]>tbl[2]){ val=tbl[2]; tbl[2]=tbl[1]; tbl[1]=val; }
424 :
デフォルトの名無しさん :03/12/09 01:08
>>422 問1と問2の違いを述べよ
2,3,5はデフォで良いとして
それ以降をどうするかだが、大きめの配列を作業領域として使えるなら篩を使え。
ダメならループして割り算での判定ルーチンを組むしか。
それで問3が篩によるものかループして割り算での判定ルーチンになる。
426 :
デフォルトの名無しさん :03/12/09 01:13
>>422 #include <stdio.h>
#define SIZE 1000
int is_prime(int x, int *p)
{
for (; *p * *p < x; p++)
if (x % *p == 0)
return 0;
return 1;
}
void prime_set(int p[], int n)
{
int i;
p[0] = 2;
for (i = 1; i < n; i++) {
p[i] = p[i-1];
do p[i]++;
while (!is_prime(p[i], p));
}
}
int main(void)
{
int prime[SIZE], i;
prime_set(prime, SIZE);
for (i = 0; i < SIZE; i++)
printf("%d ", prime[i]);
return 0;
}
すいません。そういう課題が出たので問一と問二の区別も良く分かりません。 内容的に同じのようでしたらそれを教えていただけますか?
428 :
デフォルトの名無しさん :03/12/09 01:20
>>424 #include <stdio.h>
#include <stdlib.h>
int main()
{
int n, ary[100], minpos, min, pos, tmp;
for(n = 0; n < 100; n++) ary[n] = rand()%1000;
for(pos = 0; pos < 100; pos++){
minpos = pos; min = ary[pos];
for(n = pos; n < 100; n++){
if(ary[n] < min){
minpos = n; min = ary[n];
}
}
tmp = ary[pos];
ary[pos] = min;
ary[minpos] = tmp;
}
for(n = 0; n < 100; n++) printf("ary[%d] = %d\n", n, ary[n]);
}
>>424 間違えた。
#include <stdio.h>
#include <stdlib.h>
void sort(int ary[], int size)
{
int pos, min_pos = 0, min = ary[0];
for (pos = 0; pos < size; pos++)
if (ary[pos] < min) {
min_pos = pos;
min = ary[pos];
}
ary[min_pos] = ary[0];
ary[0] = min;
sort(ary+1, size-1;
}
int main()
{
int n, ary[100], minpos, min, pos, tmp;
for(n = 0; n < 100; n++) ary[n] = rand()%1000;
sort(ary, 100);
for(n = 0; n < 100; n++) printf("ary[%d] = %d\n", n, ary[n]);
}
430 :
デフォルトの名無しさん :03/12/09 01:34
質問なんですが、表示を1ステップづつ止めるために char c; c=getchar();などを使いEnterキーを入力待ちにする プログラムをつくりたいのですが、どのように書けばよいのでしょうか。 主のプログラムは書けたんですけど、これはやり方がいまいち わかりません。わかる方がいれば教えてもらえませんか。お願いします。
432 :
デフォルトの名無しさん :03/12/09 01:40
>>425 3,判定関数をつくれ
2,↑を使った素数生成関数をつくれ
1,素数を↑を使って生成し、表示するmain関数をつくれということじゃない?
>>429 ありがとうございます。
でもコンパイルは通るんだけど表示がならないで強制終了・・・。
なんでだろ?
>>432 俺は問3が「ポインタを使用して素数かどうかを判定する」ってーのが気になる。
2とかの素数テーブルを使うと見たんだが。。。
>>430 止めたい行に
{char c; c=getchar();}
で良いだろうに? 何が分からん?
>>407 面白そうなので…ちょっと参加
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
typedef pair<string, int> elem;
string& lower(string& s) { for(int i = 0; i < s.length(); i++) s[i] = ('A' <= s[i] && s[i] <= 'Z') ? s[i] + ('a' - 'A') : s[i]; return s; }
int great(const elem& v1, const elem& v2) { return v1.second > v2.second; }
vector<elem> input() {
string w; map<string, int> m;
while(cin >> w) ++m[lower(w)];
vector<elem> v;
for(map<string, int>::iterator mp = m.begin(); mp != m.end(); mp++) v.push_back(*mp);
return v;
}
int main() {
vector<elem> v = input();
sort(v.begin(), v.end(), great);
int n = 0, last = -1;
for (vector<elem>::iterator vp = v.begin(); vp != v.end(); vp++)
if (n++ < 50 || last == vp->second) cout << vp->first << ":" << (last = vp->second) << endl;
else break;
return 0;
}
windowsのDOS窓の中でカーソル位置を指定できる命令 教えてください、 VC++です。ESCシーケンスはだめだった。
我がコードは我流! 我流は無型!! 無型ゆえに誰にも読めぬ!! ・・・とゆーのはカンベンね。
>>438 その命令を探す宿題か?
そうでないならC関連スレを丹念に探せ。
既出だ。
うーん。寝起きなんで。
>>422 の問1を。
「素数とは1とそれ以外で割れない数」という理屈でといときます。
なお、問2と3は
>>426 さんが片付けてます。
#include <stdio.h>
#define N 20
int main(void)
{
int hairetu[N]; /* 用意した配列 */
int i, j, count;
for (i = 2, count = 0; count < N; i++) {
for (j = 2; j <= i; j++)
if ((i % j) == 0)
break;
if (j == i)
hairetu[count++] = i;
}
for (i = 0; i < N; i++)
printf("%d\n", hairetu[i]);
return 0;
}
443 :
デフォルトの名無しさん :03/12/09 11:22
正のint nを受け取り、降順で最初の完全平方根Nを返す再帰関数squaresを考えてください。
完全平方根ってなんだっけ?
M*M=N となり、なおかつM,Nが整数であるようなN、 例えば、N={1,4,9,16,25,...}でいいの?
#include <stdio.h> int squares(int n){ int i; if(n<=0) return -1; // 失敗 i = (int) (sqrt((double)n)); if(i*i == n) return n; return squares(n-1); // return squares(i*i); // っていうかこっちの方がいい、っていうか本来は再帰する必要なし } int main(){ int n,m; printf("Input N->"); scanf("%d",&n); m = squares(n); if(m==-1){ printf("N以下の完全平方数は存在しません\n"); }else{ printf("N以下の最初の完全平方数は%dです\n",m); } return 0; }
447 :
デフォルトの名無しさん :03/12/09 12:55
448 :
デフォルトの名無しさん :03/12/09 15:12
一応、確認。コメント部の穴埋めでよろしい?>448
450 :
デフォルトの名無しさん :03/12/09 15:22
入力された通常の記法の算術式の、逆ポーランド記法を出力するプログラムを作成せよ。 よろしくお願いします。
>>450 こっちも確認
・必要な演算子は、 + - * / だけでいい?
・括弧の処理は必要?
・数は整数のみでいい?
> はい、それでOKです。 なんか偉そう。
>>453 別にそういう意味で言ったわけじゃないけど、そういう意味に聞こえちゃったらスマソ・・・。
>>449 はい、穴埋めでよろしくお願いします。
#include <stdio.h> int main(void) { FILE *fp1, *fp2; int i, h, datatxt[10000], tmp; fp1 = fopen("data.txt", "r"); fp2 = fopen("data2.txt", "w"); for (i = 0; i < 500; i++){ for (h = 0; h < 20; h++){ fscanf(fp1, "%d", &datatxt[i * 20 + h]);} } for (i = 0; i < 10000; i++){ for (h = 0; h < 10000; h++){ if (datatxt[i] < datatxt[h]){ tmp = datatxt[i]; datatxt[i] = datatxt[h]; datatxt[h] = tmp; } } } for (i = 0; i < 500; i++){ for(h = 0; h < 20; h++){ fprintf(fp2, "%d ", datatxt[20 * i + h]); } fprintf(fp2, "\n"); } return(0); }
data.txtにある数字をソートしてdata2.txtに出力するプログラムなんですが、 数値が表示されないです。 なぜでしょうか?
ファイルに書き込んだからかな。 data2.txtには出力されてるんじゃない?
わかりました。 426さん、441さん、ありがとうございました。
最初に文字列をキーボードから入力する, 次に1文字をキーボードから入力して, 最初に入力した文字列の中に, 次に入力した1文字がいくつ含まれるかをカウントするプログラム をc++で作成しなければいけないのですが、いまいち分かりません。 文字配列を使うのだろうとは思うのですが、そこから進めないんです。 ご教授願えませんか?
>>459 文字列の入力はどう教わりました?
聞いてると、Cの範囲で解く気がしますが。
[ANSI C++]
std::string s;
cin >> s;
[旧C++]
string s;
cin >> s;
[ANSI C]
char s[100];
scanf("%s", s);
>>460 文字列の入力に関しては
char strins[101]; //宣言
cin >> s; // 入力部
と教わりました。
>>460 一番上のcin >> s;はstd::cin >> s;だと思いまする。
さきほどの問題で、ファイルが別の所に保存していたので、解決しました。 しかし、data.txtにある10000個の数値を読み取って、ソートして出力するのが 目的なんですが、すべての数値が-858993460になってしまいました。 fscanfなどしっかりと出来ていると思うんですが、何がいけないんでしょうか? 教えて下さい。
>>461 462
入力部分に関してはうまくいきました。ありがとうございます。
最初に入力した文字列の中に,
次に入力した1文字がいくつ含まれるかをカウントする
という部分でまた躓いてしまったのですが教えていただけませんか?
if分で最初に入力した文字列と二番目に入力した文字が
一致するなら i のカウントを増やす。という風にしてループさせてみたのですが
うまくいかないんです。
考え方自体がまちがってるんでしょうか?
>>459 の答え。
あまりC++らしくないので、識者のC++らしいプログラムを希望。
#include <iostream.h>
#include <string.h> // for strlen()
int main()
{
char s[101];
cin >> s;
char c;
cin >> c;
int len = strlen(s);
int count = 0;
for (int i = 0; i < len; i++)
if (s[i] == c)
count++;
cout << count << "\n";
return 0;
}
皆さんありがとうございました。 なんとか理解できました。感謝します。
>>464 よくわかりませんが、
「しっかりできていると思う」ところが
ホントウに正しく動いているかチェックしましょう。
たとえば、入力したあと、ソートしないで、出力してみましょう。
#include <iostream> #include <algorithm> template <typename T> T get(std::istream &is) { T t; is >> t; return t; } int main() { char s[101] = {0}; std::cin >> s; std::cout << std::count(s, s + 101, get<char>(std::cin)); } ...微妙。
data.txtにある10000個の数値全部が-858993460というオチでは?
ありがとうございます
>>469 微妙・・というのが笑えました。
やっぱり、char s[101]の縛りはつらいですよね。
多分、
>>464 はfopen()で失敗してるんだろうね。
カレントディレクトリの概念が必要。
>>464 ちゃんとdata.txtに一万個の数値を入れているか?
それとも一万個の数値を入れなくても動く仕様なのか?
>>449 クイックソートなんかぐぐったらゴマンと出てくるから、
ちょっと調べればいいのに。
>>450 演算子順位法とスタックを使うのが正統。知らないとやっかい。
どちらも習った?
ノォー! んじゃ,とりあえず,
>>448 oid quick_sort(int a[], int start, int end)
{
int i,j;
if( !(start < end) ) return;
{
int x, tmp;
int base;
int swap;
i=start;
j=end;
base=a[start];
while(1){
for(; i<end && a[i]<=base; ++i);
for(; start<j && base<=a[j]; --j);
if( !(i<j) ) break;
{ tmp=a[i]; a[i]=a[j]; a[j]=tmp; }
}
{ tmp=a[j]; a[j]=a[start]; a[start]=tmp; }
}
quick_sort(a, start, j-1);
quick_sort(a, j+1, end);
}
>>477 再帰下降型(再帰的下向き構文解析だっけ?)かなぁ。アフォな俺は。
>>478 センセ。穴埋めになってないっす(^^;; でも、分かりやすい。
オチつけとこ。
>>448 は結構タイプミスがあるんで、穴埋めだけではできない。
こんばんは。 「WHILE、IF、を使って 入力した数字が素数かそうでないかを表示させなさい。」 という課題が出ました。 #include <stdio.h> void main() { int i,n,s; printf("入力した数が素数かどうかを判定します\n"); printf("最初の2以上の自然数を入力してください\n"); scanf("%d",&n); (i=2); while(i<=n-1){ s=n%i; i=i+1; if(s==0) printf("合成"); else printf("素数");} } と、作ってみましたができません。 どなたか教えてください。お願いします。 BREAKとか使っちゃいけないみたいで
while (i * i <= n && n % i != 0) { ++i; } if (n % i == 0) { printf("合成"); } else { printf("素数"); }
482 :
デフォルトの名無しさん :03/12/09 19:40
>>451 ・必要な演算子は、 + - * / だけでいい? ^(pow)もお願いします。
・括弧の処理は必要? はい、必要です。
・数は整数のみでいい? はい、宜しくお願いします
>>477 どちらも習っていません。御教授宜しくお願いします。
>>480 フラグを使おう
f=0;
if(2で割り切れたら) f=1;
else{
i=3;
while(i*i<n){
if(iで割り切れたら) f=1;
else
i+=2;
}
if(f==0) printf("素数");
else printf("合成");
宿題です。 【文字列(10文字まで)を入力して、逆順に表示するプログラムを作成せよ。】です 一応やってみたんですがいまいちよくわかりません。 #include <stdio.h> main(void){ char list[11]; int i; scanf("%s",list); for(i=10; i>=0; i--){ printf("%c",list[i]);} }
失敗。while()の後ろの { が一つ余計だった。 (もしくは、 } が一つ足りない)
>481 すばやいレスありがとうございます。 質問なんですが1行目の i * i <= n は何のためにあるのでしょうか?ためしに削除して実行してみたら、 すべて合成と表示されるようになりました。なんでかわかりません。 お手数が教えてくださるようお願いします。
>483 レスありがとうございます。 学校の課題で、フラグはまだ習ってないためここでは使えないのです。 でも自分のスキルが上がるように役立たせていただきますね。
>484 入力される文字列の長さはstrlenで取得してくれ for(i=strlen(list)-1; i>=0; i--){ printf("%c",list[i]);} } なんで、-1かは宿題で。
ありがとうございます。さっそくやってみます。
490 :
デフォルトの名無しさん :03/12/09 20:05
問題 Perlのインタープリタを作成せよ。 よろしくお願いします。
それは宿題かと、小一時間(ry
初等プログラミングというのは、 「考える力」は養われるかも知らんが、 悪い癖をつけそうだな。 /* nが素数かどうかの判定(n>=2と仮定) */ /* 2以上の数で割リ切れる数を探す */ i = 2; while ((n % i) != 0) { /* 自分自身は割り切れるから必ず止まる */ i++; } if (i == n) { /* 2以上では自分自身でしか割れない */ /* nは素数 */ } else { /* nは素数じゃない */ }
>486 n が素数かどうかを調べるには√n までの数で割ってみれば十分。 それ以上大きな数で割るのは無駄。 i * i <= n の条件をはずすと、 i が n に達したときに n % i == 0 が成立して「合成」と表示されてしまう。
>492 ありがとうございます。 たしかにパズル的要素が強いですよね。 ググって「エラトステネスの篩い」とかあったんですけど 課題の条件には合いませんし。 ここまで丁寧に解説していただけると理解できますし、 課題としても十分だと思います。ほんとありがとうございます。
>493 ありがとうございます。 i * i <= n を i<=n-1 にしたらできなかったんですが 考えてみれば i=2 としてるんだから i<=n-2 にしなきゃいけないですよね。 i * i <= n で十分というのもよくわかりました。 ほんとにありがとうございます。ここにいる方はいい方ばかりですね!
496 :
お願いします :03/12/09 20:54
整数型の変数xとyを掛算した結果(x×y)を求めるプログラムを作成せよ。 ただし、演算子*を使用しないで、加算と再帰関数を用いる。 お願いします。。
>>496 動かしてないが。多分こんな感じ。
int kakezan(int x, int y)
{
if (y < 0)
return -x + kakezan(x, y+1);
else if (y == 0)
return 0;
else
return x + kakezan(x, y-1);
}
498 :
お願いします :03/12/09 21:03
>497 まことにありがとうございます。自分ほんと馬鹿なので助かります。
int multi(int x,int y){ if(y==0) return 0; return x + multi(x,y-1); } // 動作確認済み。要するに、 5 * 4 = 5+(5*3) = 5+5+(5*2) = 5+5+5+(5*1) = 5+5+5+5+(5*0)
500 :
お願いします :03/12/09 21:07
続けてですいません。 2から数え始めて最初の250個の素数を求めよ。素数を求める部分は関数化すること。
あ、そかそか。符号のこと無視してたわ。 嘘パッチを当てると、 int multi(int x,int y){ if(y<0){ if(x<0){ x=-x;y=-y;} else{ x=-x;y=-y;} } if(y==0) return 0; return x + multi(x,y-1); }
>>499 yが負のときは?
>>500 このスレのどっかにあった。検索すべし。
多分テーブルサイズを変えるだけで使える。
503 :
お願いします :03/12/09 21:13
>502 すいません、テーブルサイズって何ですか??
504 :
デフォルトの名無しさん :03/12/09 21:17
int multi(int x, int y) { if (x < 0 && y < 0) return multi(-x, -y); if (y < 0) return multi(y, x); if (y = 0) return 0; return x + multi(x, y-1); }
#include <stdio.h> #define KOSUU (250) int isPrime(int inp,int *list , int num){ int i; for(i=0;(i<num) && (i*i < inp) ;i++){ if(inp % list[i] == 0) return 0; } return 1; } int main(){ int sosuu_list[KOSUU]; int i; int cnt = 1; sosuu_list[0] = 2; for(i=3;;i+=2){ if(isPrime(i,sosuu_list,cnt)){ sosuu_list[cnt]=i; cnt++; } if(cnt==KOSUU){ break; } } for(i=0;i<KOSUU;i++){ printf("%6d%c",sosuu_list[i],((i+1)%10)?' ':'\n' ); } }
>>504 Good Job!!
y < 0 (かつ x>0)なら確かにyとxを入れ替えればOKですね。
判別部分を別の関数にしたほうがいいかも...
そうすると、例えばx==0 -> return 0とかもやりやすいし。
507 :
デフォルトの名無しさん :03/12/09 22:06
int multi(int x, int y) { if (y > 0) return x + multi(x, y-1); if (x == 0 || y == 0) return 0; return multi(-x, -y); }
good job? いつも0になるぞ
509 :
デフォルトの名無しさん :03/12/09 22:22
エラトステネスのふるいを使い、2から数え始めて最初の250個の素数を求めよ。 素数を求める部分は関数化すること。 どなたか教えてください。お願いします
今日は素数が多いね。
今日は素数が多いねと貴方が逝ったから エラトステネス記念日
入力された整数が偶数か奇数かを繰り返し判定するプログラムをお願いします。 偶数か奇数かは、剰余演算で判定して、1以下の数は判定対象外 1以下が入力されるまでは、繰り返し入力を受け付けて、判定を行なう 1以下が入力されたら、繰り返しを即中断する。です。 お願いします
#include <stdio.h> int main(void){ int num; while(1){ printf("数値を入力して下さい:"); scanf("%d", &num); if(num <= 1) break; else if(num % 2) printf("奇数です\n"); else printf("偶数です\n"); } }
エラトステネスのふるいは、2~nまでの素数を求めることができるのであって、 何個欲しい、というような要望にこたえるのは面倒なはず…… だよね?
>>513 すいませんwhile(1)ってどうゆう意味ですか?無知ですいません・・。
516 :
デフォルトの名無しさん :03/12/09 23:03
>515 無限ループ
エラトステネスのふるいは、以前やった。
unsigned long(32ビット)で扱える素数を全部出力したよ。
テキストファイルに出力したら1Gバイトぐらいだったかなぁ。
もうやりたくない(泣)
>>514 そだねぇ。
テーブルサイズ決めといて、実行。
数が足りんかったら、テーブルサイズを長くして再実行・・・とか。
動的にメモリを伸長させる・・・とか。
素数分布を使う・・・とか。
>>516 ここはwhile(1<num)ではダメなんでしょうか・・?
素数定理使えば、多分求められるんだろうが面倒なので...
521 :
デフォルトの名無しさん :03/12/09 23:33
質問ですけど int a; if(a<50) printf("%d",a); このプログラムは、50以下の値を出力するプログラムですが、 もし50以上の値があった場合、50以上の値が何個出でくるかカウントするプログラムを 教えてください。
522 :
デフォルトの名無しさん :03/12/09 23:35
うっかりプログラミングの授業を取ったら…やられました。 どうにもエラーエラーで分からないので、どなたか助けて下さい。 かなり初歩的ですみません。 #include <stdio.h> main() { int i=1,j; while(j <= 9){ while(j <= 9){ printf("%d*%d=%d\n",j,i,j*i); i = i++; } i = 1; j = j++; } } ↑のwhile文をdo while文に書き換えろという…。 どぞ、宜しく御願いします。
よこからチャチャだが。 それはダメ
>>519 ふるいのプログラムではないような・・・>520
>>505 グローバル変数使ったり、
ループ回数を減らしてなかったり、
メモリの使い方も贅沢だったり。
メイン関数なかったり、
コンパイラ通してなかったり。
その辺はだれか直して。
#define N 10000
int table[N] = {0}; /* 素数なら0,素数でなければ1 */
#define is_prime(n) (!table[n])
int hurui(void)
{
int count = 0;
int i, j;
table[0] = table[1] = 1;
for (i = 2; < N; i++) {
if (table[i] == 0) {
count++;
for (j = 2*i; j < N; j += i)
table[i] = 1;
}
}
return count; /* おまけ、発見した素数の数を返す */
}
>>521 未初期化のスタック探索の旅♪
int a;
if(a>50)
printf("%d", a>50);
>>522 やりたいことを書いてくれ。
ツーかそもそも。
int i=1,j; //<-jを初期化してない
while(j <= 9){ // 一つ下のwhileと同じ条件。i <= 9 とやりたいのか?
while(j <= 9){ // 初期化されていないjの判定
...
i = i++; //未定義コードの見本。
>>521 > このプログラムは、50以下の値を出力するプログラムですが、
丁寧な返答、プログラム全体と宿題全文を書きましょう。
丁寧じゃない返答は、うそこけ。
>>524 いいノリだね☆
>>522 たぶんこういうことをやりたいんだろうか?
#include <stdio.h>
int main(void)
{
int i;
int j;
for(i=0;i<=9;++i)
for(j=i;j<=9;++j)
printf("%d*%d=%d\n",j,i,j*i);
return 0;
}
>>527 ただ単に九九の式と答えの表示の繰り返しをしたいのではないだろうか?
結構有名でっせ
訓練の賜物なんだろうけど、すごいね。
>>500 > 2から数え始めて最初の250個の素数を求めよ。素数を求める部分は関数化すること。
に対する解答なので、
>>505 は無問題かと。
>>528 交換法則が成立するにも関わらず
内側のループで 0 から計算し直すのは無駄の極み。
より合理的と思われる解を提示した。
535 :
どなたか・・・ :03/12/09 23:56
任意の正の整数を2進数に変換する関数を作成する。その関数をmain関数から呼び出し、 任意の正の整数(10進数)を入力し、2進数に変換せよ。 整数Nを2で割ってゆき、あまり(0or1)を記録する。つまり、整数Nを2で割った商 を戻り値とし、2で割った余りN%2に対応する0または1をターミナルに出力する関数 を作成する。ただし再帰を利用しないとターミナルに出力する2進数の上位と下位ビット が反転するため注意すること。 どなたかわかりますか・・・??
>>534 合理的かもしれんが、九九を順にすべて表示する(恐らく)という目的に適ってない。
失礼しましたm(__)m
>>533 ここは、解答する人が居てこその場なのに、思慮のないこと言ってごめん。
わかります、以上。
539 :
どなたか・・・ :03/12/10 00:03
教えてください・・・
540 :
デフォルトの名無しさん :03/12/10 00:05
void hoge(int x) { if (x >= 2) hoge(x / 2); putchar("01"[x%2]); }
int convert2(int x) { return x % 2 + 10 * convert( x/2 ); } こんな感じか。 再帰使わなくても下から桁を取り出す方法はいくらでもあるが。
すまん、終了条件がなかった。 実行しないでくれよ
#include <stdio.h> #define M (10000) #define N (250) int make_prime_list(int *primes,int n){ int i,j; int buf[M]={0}; int cnt = 0; for(i=2;i<M;i++){ if(buf[i]==1) continue; // 素数でないなら省く for(j=i+i;j<M;j+=i){ buf[j]=1; // 非素数 } primes[cnt++]=i; if(cnt==n) break; } return cnt; } int main(){ int primes[N]={0}; int i; int cnt = make_prime_list(primes,N); for(i=0;i<cnt;i++){ printf("%d ",primes[i]); } printf("[%d]",cnt); return 0; }
さぁて。今日は、そろそろ打ち止め?
>>535 うーん、問題文に忠実になると、こういうことかなぁ。なんか違うような。
#include <iostream>
using namespace std;
unsigned int show_bin(unsigned int i)
{
int j = i / 2;
int m = i % 2;
if (i != 0){
show_bin(j);
cout << m;
}
return j;
}
int main()
{
unsigned int i;
cin >> i;
cout << i << " "; show_bin(i); cout << endl;
}
一応完全版な。 #include <stdio.h> int convert2(int x) { if ( x < 2 ) return x; else return x % 2 + 10 * convert2( x/2 ); } int main(void) { int x = 65; // 適当に printf( "%d", convert2(x) ); return 0; }
おおっと * 10して整数として表示してるのか。すまそ。
>>546 問題がマズーなのは重々承知しているが、
それはちゃんと「再帰にしないと表示順が逆になってしまう」ようにできているか?
400番台以降で解決してなさそうなの。
未解決と思われるもの
>>450 >>482 中間記法→逆ポーランド
問題文がよくわからず出せないもの
>>521 50以上の数のカウント
>>522 while→do-while
問題文がよくわからず、答えが割れてるもの
>>535 10進数→2進数
>>546 見て判断できないのなら適当な入力で実行してみてくれよ……
ちなみにエラーチェックするならたとえばこんな感じな。
サブルーチンの中でよけいな処理はすべきでない。
int x = 65;
int y = convert2(x);
if( y < 0 )
y = convert2(-x);
return 0;
あと
C++だったら
unsigned long d = 65;
std::bitset<CHAR_BIT*sizeof(char)> b( d );
std::cout << d << "= " << b << std::endl;
でできないっけ?
>>551 いい方法ならたくさんあるけど、これを満たしてない罠
>整数Nを2で割ってゆき、あまり(0or1)を記録する。つまり、整数Nを2で割った商
>を戻り値とし、2で割った余りN%2に対応する0または1をターミナルに出力する関数
>を作成する。
んああ関数内で出力しろって明言されてるのか。 はなっから無視してたよ。 よけいなことするなゴルァ以前に目に入れてなかったw 再帰じゃなくてループにしたら反転しかねないのは確かなんだけど
こうけ? int i,j=1; do{ i = 1; do{ printf("%d*%d=%d\n",j,i,j*i); i++; }while(i <= 9); j++; }while(j <= 9);
K&R本p105を見てちょ。>2進数出力を考えてるヒト
printd()ってのがあるんで。
printd()は10進だが、2進でやるなら
>>540 になる。
>>555 この期に及んで条件を0から無視できる奴を尊敬する。
わーい。尊敬されたー。
まあ、K&R本読んでみ。再帰で、関数内で出力してるから。
>>557
スマン読む前に書いた
>>559 (でも書くなら最初から再帰で書いてくれ/やれよという気もするが)
何バグったこと書いてるんだ。 きちんと自身呼んでるんじゃん。 同じ関数自分で書いて走らせてみたのに・・・
こうけ? int bit(int n) { /* *整数Nを2で割ってゆき、あまり(0or1)を記録する。つまり、整数Nを2で割った商 *を戻り値とし、2で割った余りN%2に対応する0または1をターミナルに出力する関数 */ if(n>0){ bit(n/2); printf("%d",n%2); } return n/2; } 戻り値の意味が無いんだが...
だから・・・答えは
>>540 だってばよ・・・。
putchar("01"[x % 2]);
ってのは、奇妙に見えるかもしれんが、合法だからね。
一度寝たほーがいいぞ
>>560 > (でも書くなら最初から再帰で書いてくれ/やれよという気もするが)
>>540 は最初からそうなってる。
(あ、俺540じゃないからね)
それを同時に解決した奴はいまだにもいないヨカン。 >戻り値
>>564 >>540 を変更して、
int hoge(int x)
{
if (x >= 2) hoge(x / 2);
putchar("01"[x%2]);
return x / 2;
}
しかし、この戻り値を取得してもなぁ・・・
んー、さすがに打ち止めであるな。おつかれさま> 2進数のヒト
int bit(int n) { int t; while(n){ t=n%2; n=bit(n/2); printf("%d",t); } return n/2; } うーん無理矢理...
569 :
デフォルトの名無しさん :03/12/10 02:38
int hoge(int x) { char c = "01"[x%2]; x /= 2; if (x) hoge(x); putchar(c); return x; }
571 :
デフォルトの名無しさん :03/12/10 03:09
1000未満の正の整数をランダムに100個生成し、それらを配列aに代入する。 aryの中身をバブルソートにより小さい順に並べ替えて表示しなさい。 #include <stdio.h> #include <stdlib.h> #define N 1000 void bouble_sort(int [], int); int main() { int i, a[N]; for(i = 0; i < N; i++) a[i] = rand()%10000; boble_sort(a, 0, N); for(i = 0; i < N; i++) printf("%d\n", a[i]); } void boble_sort() { 関数の再帰呼び出しでやりたいいんですけど、調べてみても解らない・・・。 誰か続きお願いします・・・。
ここんところ、おおいねぇ。 再帰を使わない方法とかで、まずは自力で完成させてみましょうや。
泡 挿入 ...早いのね ×ソープ ○ソート
n×n係数行列Aがあって、nの右辺ベクトルBがすべて0の時の 解法を教えてください。お願いします。 ガウスジョルダンとかで解くと解がすべて0になっちゃうので、 0以外の解を求めたいのです。
>>450 とりあえず,括弧未対応版。
#include <stdio.h>
#include <string.h>
FILE *fp;
int depth;
char outbuf[1024];
struct calc_cond{
int op_stack;
int c;
};
/*
* [ (\0) 1 ]<-calc_cond
* [ + 2 ]
* [ * ( [ (\0) 1 ] [ + 3 ]) ]
*/
void init_cond(struct calc_cond *cond){
cond->op_stack = '\0';
cond->c = '\0';
}
皆さん、どうも有難うございました。
ポインタを使う問題なのですが、どうしてもわかりません。 ご協力をお願いいたします。 (1)5つの配列データa[5]={3、12、7、32、15}を大きい順に並べて 出力するプログラムをポインタを用いて作成せよ。 (2)文字列S[5]=”あBCDE” P[5]=”FGHIJ”を連続して 一つの文章にするプログラムをポインターを用いて作成せよ。
問題の訂正です。 (2)の問題の文字列S[5]="ABCDE"です。 打ち間違えました。 お願いします。
#include <stdio.h> int main(){ int a[5]={3,12,7,32,15}; int i,j; for(i=0;i<5;i++){ for(j=i;j<5;j++){ if(*(a+i)>*(a+j)) { int tmp=*(a+i);*(a+i)=*(a+j);*(a+j)=tmp; } } printf("%d ",*(a+i)); } return 0; }
あ、条件文逆だ。 if(*(a+i)>*(a+j)) { を if(*(a+i)<*(a+j)) { にして。
(2)のs[5]はs[6]の誤りのはず。 sには{'A','B','C','D','E','\0'}が入っている。 \0は文字列の終端と覚えればOKかな? #include <stdio.h> int main(){ char s[6]="ABCDE"; char p[6]="FGHIJ"; char q[11]; char *pq = q; int i,cnt=0; for(i=0;i<strlen(s);i++){ *pq=*(s+i); pq++; } for(i=0;i<strlen(p);i++){ *pq=*(p+i); pq++; } *pq='\0'; printf("%s",q); }
もしかして、ここまで無駄にポインタで実装しないとダメですか? 意味がわかりにくくなるのに…… #include <stdio.h> int main(){ char s[6]="ABCDE"; char p[6]="FGHIJ"; char q[11]; char *pq,*ps,*pp; pq=q; for(ps=s;*ps;ps++,pq++){ *pq=*ps; } for(pp=p;*pp;pp++,pq++){ *pq=*pp; } *pq='\0'; printf("[%s]\n",q); }
c言語プログラムで、アセンブラのシミュレートソフトを作ることは出来ますか? レジスタは配列で作れそうですが、それ以外がどういう風にすればいいのかわかりません。 説明もうまく出来なくてホントすいません。ヒントだけでもいただければと思い書き込んでみました。 よろしければ知恵を貸していただけませんか?
>>586 何のアセンブラ?
MIPS? 8086?
まさか Pen4 とかじゃないよな?
それは宿(ry まずアセンブラを理解していないとダメと思うのですが。 あとは現在実行している命令の番地を記録するレジスタがあればできるかと。
>586 宿題じゃないよな。 “アセンブラのシミュレートソフト”って意味不明だぞ。 もちろんCでアセンブラを書くことはできるけど、そういうことじゃないよな。 たぶん、なんらかの仮想機械を設定してエミュレートしたいってことだと思うけど、 まず、CPUとメモリとI/Oを決めないとね。
CASLIIとか・・・
591 :
デフォルトの名無しさん :03/12/10 11:59
unsignd int x = UINT_MAX; x++; と桁あふれさせた時、0 になるというのは保証されていますか?
>>584 日本語の説明の下手な先生がその場で作った問題なんで(^^; >>585 一応ポインタとしての演習ですから(^^; 582から585までの方迅速な回答ありがとうございました。 これで今週の課題は何とかなりました。 それでは、授業があるのでこれで失礼いたします。
あーーー宿題スレに書き込んでしまった。 他行ってきます。
>>591 保証されてない
例外が飛んでくるかもしれないし
地球の終わりがくるかもしれない
ひぃ、マジですか。
地球の終わりは嫌なので 0 を期待するのはやめます。
>>594 さん、スレ違いなのに答えてくれて有難うございました。
でも、それを保障してる CPU(もしかしたらコンパイラも?)でしか使わないんであれば 0 を期待していいと思うぞ。
>594 整数演算のオーバーフローは undefined じゃなくて unspecified だぞ。
>>596 ども、参考になります。
環境依存で保証されている場合は勿論期待しますです。
高速フーリエ変換(FFT)のCのプログラムで ググったんですけど、たいがいサンプルにはcomplex.hなるものが ついていて、メークファイルを作れない私にはわからないため 一つのファイルにまとめてプログラムお願いできないでしょうか ちなみに入力信号はsin波でよろしくお願いします。
コピペしたら?
>>600 メイクファイルを作ることと、ヘッダファイルがついていることに何か関係があるの?
603 :
デフォルトの名無しさん :03/12/10 17:24
#include <stdio.h> #include <string.h> int main(void) { int i,j,h,ten[256][256],data,subject; double ave = 0.0; char name[256][2],target1[0],target2[] = "input"; FILE *fp1; FILE *fp2; fp1 = fopen("input.txt","r"); fp2 = fopen("output.txt","w"); printf("学生数:"); scanf("%d",data); printf("科目数:"); scanf("%d",subject); printf("ファイル名:"); scanf("%s",target1); h = strcmp(target1,target2); if(h == 0) { } else { printf("見つかりませんでした。"); return(-1); }
604 :
デフォルトの名無しさん :03/12/10 17:24
for(i=0;i<data;i++) { for(j=0;j<2;j++) { fscanf(fp1,"%s",name[i][j]); } for(j=0;j<subject;j++) { fscanf(fp1,"%d",&ten[i][j]); } } for(i=0;i<subject;i++) { for(j=0;j<data;j++) { ave = ave + ten[j][i]; } ave = ave / data; fprintf(fp2,"%f",ave); ave = 0.0; } fprintf(fp2,"\n"); for(i=0;i<data;i++) { for(j=0;j<2;j++) { fprintf(fp2,"%s",name[i][j]); } for(j=0;j<subject;j++) { ave = ave + ten[i][j]; } ave = ave / subject; fprintf(fp2,"%f\n",ave); ave = 0.0; } fclose(fp1); fclose(fp2); return(0); }
605 :
デフォルトの名無しさん :03/12/10 17:25
for(i=0;i<data;i++) { for(j=0;j<2;j++) { fscanf(fp1,"%s",name[i][j]); } for(j=0;j<subject;j++) { fscanf(fp1,"%d",&ten[i][j]); } } for(i=0;i<subject;i++) { for(j=0;j<data;j++) { ave = ave + ten[j][i]; } ave = ave / data; fprintf(fp2,"%f",ave); ave = 0.0; } fprintf(fp2,"\n"); for(i=0;i<data;i++) { for(j=0;j<2;j++) { fprintf(fp2,"%s",name[i][j]); } for(j=0;j<subject;j++) { ave = ave + ten[i][j]; } ave = ave / subject; fprintf(fp2,"%f\n",ave); ave = 0.0; } fclose(fp1); fclose(fp2); return(0); }
606 :
デフォルトの名無しさん :03/12/10 17:28
scanf("%s",target1); h = strcmp(target1,target2); if(h == 0) { } else { printf("見つかりませんでした。"); return(-1); } for(i=0;i<data;i++) { for(j=0;j<2;j++) { fscanf(fp1,"%s",name[i][j]); } for(j=0;j<subject;j++) { fscanf(fp1,"%d",&ten[i][j]); } }
2次元文字配列について質問させてください。 char s[5][10] ; //宣言 と、したときに cin >> s ; // 入力 とすることはできないのでしょうか?
>607 できません。 どういう入力に対して、sがどうなることを期待していますか?
>>607 tmp という文字を入力した場合
s{ { t , m , p \0 , \0 , ,,,,,,,}
{ \0 , \0 , ,,,,,,,,, (略)
と言うような感じになることを期待しているんです、
1次元の場合は行が一列しかなかったために
行が強制的に選択されている状態だったけれど
2次元の場合は行の指定が無いのでエラーとなってしまう。
ということでしょうか?
こんな方法でやりたいことを実現できるんじゃないかしらん。 char s[5][10] = {0}; cin >> s[0]; 複数行なら for (i = 0; i < 5; i++) cin >>s[i];
>>611 おお、ありがとうございます。
理解できました。
5行10列の2次元文字配列を宣言する. アルファベットだけからなる文字列をキーボードから入力して, 入力順に各行に格納する. 2次元文字配列の中の小文字をすべて大文字に変換して, 表示するプログラムを作成せよ. という問題なのですが、c++でどのように処理してやればいいのでしょうか?
>>614 確かにそれを使えばすぐに出来そうなのですが、
それを使うのは禁じられているみたいなんです。
if(c>='a' && c<='z') c -= 'a' - 'A';
>>613 ctype.h を覗いて、toupper マクロの中身をコピペ。
これ最強。
まさかこんなことまで禁じられてはいまい。
>>616 基本の部分は飲み込めました。
小文字→大文字までは出来るようになりました。
>>617 おお・・・、そんな方法も。。。
#include <iostream.h> #include <string.h> void main (void){ char words[5][10] ; //宣言 int i , j , flag;// ループカウンタ 、 フラグ //入力部分 i=0; while ( i < 5){ cin >> words[i]; i++; } //文字列の識別 i=0;j=0; flag=0; while ( words[i][j] != 0){ while (j<5){ i=0; while ( i < 5){ // 文字が小文字だった時、大文字に変える if (words[i][j] >= 0x61 && words[i][j] <= 0x7A){ words[i][j] = words[i][j] - 0x20; }
//文字が大文字だった時、そのまま。 else if ( words[i][j] >= 0x41 && words[i][j] <= 0x5A ) {} //文字がアルファベット以外だった時、フラグを立てる。 else { flag = 1; break; } i++; } j++; } } //文字列にアルファベット以外のあったとき(フラグがある時) if (flag){ cout << "駄目" ; } //文字列がアルファベットだけだったとき else { i=0; while (i < 5){ cout << words[i]; i++; } } } こんな感じでやってみたのですがうまくいかないみたいです。 お暇なら手直しお願いできませんか?
>>613 char s[5][10];
int i, j;
for (i = 0; i < 5; i++)
cin >> s[i];
for (i = 0; i < 5; i++)
for (j = 0; j < 10; j++)
if (s[i][j] >= 'a' && s[i][j] <= 'z')
s[i][j] -= 'a' - 'A';
for (i = 0; i < 5; i++)
cout << s[i];
がんばれ。
622 :
デフォルトの名無しさん :03/12/10 20:55
>>617 toupperは多分関数として実装されていると思うよ。
大文字かどうか検査したうえに大文字にするには、引数を複数回評価せざるをえないから。
ちなみにVC++6.0のctype.hにある_toupperマクロは大文字かどうか検査しない。
s/大文字かどうか/小文字かどうか/
ふるーつぱーらー
>>622 toupper() はマクロで実装しなければならない事が
規格で決まっていなかったっけ?
いいえ
なんとか完成しました! この馬鹿にお付き合い頂き本当にありがとうございました!!! 興奮により感嘆符が少々増えておりますがお気になさらず。
628 :
デフォルトの名無しさん :03/12/10 22:30
#define Wmin -0.30 #define Wmax 0.30 //マクロ #define rnd() ((double)rand()/(double)0x7fff*(Wmax-Wmin)*Wmin) なんかエラー出る なぜに?
#define Wmin (-0.30)
>>631 >>629 ではないけど、それはプリプロセスする際に欲張りなアルゴリズムで解釈されるから
a--b は a-- と b に見えるかもね
633 :
デフォルトの名無しさん :03/12/10 22:40
D:\\VC++\\a.dat と D:\aVC++\a.dat ってどう違いますか?同じでしょうか?
>>631 629でもOKだぞ。
- の前後にスペースを入れてみろ。
>>633 見た目違う罠。
printf() で表示してみたら?
だから演算子の前後は空欄空けるのか… 見やすいからだと思ってた…
>>637 マクロ中でマクロな識別子を使うときは必ずカッコでくくる習慣を。
639 :
デフォルトの名無しさん :03/12/10 22:45
>>636 テキストファイルを読み込みたいんですけど上だと読めるんですが下だと読めません。
\\と\の違いってありますか?それとも後者はないんでしょうかねぇ?
>>639 まず printf() で表示してみたら?
>>638 教授のプログラムなんでそのせりふ言っておきますw
642 :
デフォルトの名無しさん :03/12/10 22:50
>>640 'V' : エスケープ シーケンスとして正しく認識されませんでした。
と出ました。やはいないんですね
>>642 ないんだろうね。2つめは。
\ の意味を知りたいわけではなさそうだね。
'D' ':' '\a' 'V' 'C' '+' '+' '\a' '.' 'd' 'a' 't"
d:/VC++/a.dat にしとけ。
>>637 いや、開けるのは見やすさを考慮してのものだよ。
その証拠に何でもかんでも開けたりはしない。単項演算子や->などは開けないでしょ。
www.mce.niit.ac.jpは放置で
大金先生に聞いて下さい。
出たあああああああああ
650 :
デフォルトの名無しさん :03/12/11 00:01
“授業で説明した”が3回も繰り返されています。 怒ってる? >大金先生
締め切り: 2004年1月23日(金)18:00まで ちょっとは考えろ!!!!!!!!
>>646 よ
>>650 くらいやらんと、ネタにならんぞ。
>>651 あ、ホンマや。他の回では“授業で説明した”なんて書いてないね。
授業中、ここのことをどう触れたか、レポートきぼんぬ。
>>652 そんときまでに何度質問に来ることやら。<1月23日
ワロタ
>>650 の問題文の中に
コピー&ペースト?
コピーは×
コピー
コピーコピー!!
自分で入力しましょう!!^^
遅かったーーーーあほかー
え?何? 誰かいきさつをおしえてくらはい。< 先生
おお、情報感謝
>>654 >>656 味わい深い人ですね>センセ
怒ってるていうより、楽しんでるように思います。
マジな意見としては、コピペは基本だと思う。
無駄な労力させるから、PC嫌い、プログラミング嫌いになるんじゃねーかなぁ。
(いや、ワシは紙のソースリストをポチポチ打ち込んでた世代だが)
>>658 >>355-368 あたり。
きっちりトラップを張ってる先生素敵です。
コピーコピー!!が良いね
電子透かしw
大金先生! もうそろそろ getch() を学生に教えるのは止めてください. 正直恥ずかしいです.
>>665 いやー、curses にあるからねぇ。
667 :
デフォルトの名無しさん :03/12/11 01:53
英文が書かれたテキストファイルを読み込んで、 大文字に変えたい単語を入力して、その単語だけを大文字に変えた全文を出力する、 という問題をどなたかお願いします。
test
670 :
デフォルトの名無しさん :03/12/11 02:27
数列の和1^2+2^2+3^2...+n^2を計算 nの値と和の値を画面とファイルへ出力 nには10を入れる(実行時) 和の公式n/6(n+1)(2n+1)の値を出力 すごい初歩的な質問ですいません。どなたか解いてもらえますか?
>>670 単位大丈夫ですか?
int main(void)
{
int i, n, sum, form;
n = 10;
for (i = sum = 0; i < n; i++)
sum += i;
form = (1 + n) * n / 2;
printf("sum: %d form: %d", sum, form);
return 0;
}
>>670 > 数列の和1^2+2^2+3^2...+n^2を計算
int sum = 0;
for(int i=1; i<=n; ++i) sum += i * i;
> nの値と和の値を画面とファイルへ出力
cout << sum;
もしくは、
printf("%d", sum);
> 和の公式n/6(n+1)(2n+1)の値を出力
cout << n * (n + 1) * (n + 2) / 6;
> nの値と和の値を画面とファイルへ出力
画面への出力は cout もしくは printf。
ファイルへの出力は、プログラムは修正せずに
リダイレクト使ってファイルに出力するか、
filestream もしくは fprintf を使う。
>>668 すまん。ぼちぼち作ったんだが60行以上あるんで、恥ずかしくて公開できない。
上手な人、40行以内でたのんます。
674 :
デフォルトの名無しさん :03/12/11 03:27
>>650 転置行列ってこれでよかった?
#include <stdio.h>
void mprint(int a[][100], int n, int m)
{
int i,j;
for(i=0; i<n; i++)//コピー
{
printf("\t");//コピー
for(j=0; j<m ; j++)//;コピー
printf(" %d ", a[i][j]);
printf("|\n");
}
}
int main()
{
int a[][100]={{3,7,6},{5,9,1},{2,8,4}};
int n=3, m=3;
int i,j;
mprint(a, n, m);
printf("\n");
for(i = n; i-- > 0;)
for(j = i; j-- > 0;)
a[i][j] ^= a[j][i] ^= a[i][j] ^= a[j][i];
mprint(a ,n, m);
getchar();
return 0;
}
>>668 ごめん、行をたたんで載せた。 - は処理してないよ。単語の扱いびみょー
#include <stdio.h>
#include <ctype.h>
#include <string.h>
char *whiteskip(char *p) { while(*p && !isalnum(*p)){ p++; } return p; }
char *wordskip(char *p) { while(*p && isalnum(*p)){ p++; } return p; }
char *strnupper(char *p, int len) {
while(0 < len-- && *p)
{ *p = toupper(*p); p++; }
return p;
}
int main(int argc, char *argv[]) {
char buf[1024], *p, *eow;
int len;
if (argc == 2){
len = strlen(argv[1]);
while(fgets(buf, sizeof(buf), stdin) != NULL){
for (p = whiteskip(buf); *p; p = whiteskip(p)){
eow = wordskip(p);
if (strncasecmp(p, argv[1], len) == 0 && eow == p + len)
strnupper(p, len);
p = eow;
}
printf("%s", buf);
}
}
return 0;
}
676 :
デフォルトの名無しさん :03/12/11 03:48
void hoge(char s[]) { char tmp[1000], *t = tmp; int in_word = 0; while ((c == getchar()) != EOF) if (isalpha(c)) { in_word = 1; *t++ = tmp; } else if (in_word) { in_word = 0; *t = '\0'; if (strcmp(s, tmp) == 0) for (t = tmp; *t; t++) putchar(toupper(*t)); else printf("%s", tmp); putchar(c); t = tmp; } else putchar(c); }
>>668 とりあえず、1回に収まりそうにないので、主要部。 しかし・・・みんな短くつくるの上手いなぁ。
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
void strong(FILE *, FILE *, char *);
char *getword(char *, size_t, FILE *);
int compare(char *, char *);
char *upper(char *);
int main(int argc, char *argv[])
{
if (argc != 2)
exit(2);
strong(stdin, stdout, argv[1]);
return 0;
}
void strong(FILE *fin, FILE *fout, char *keyword)
{
char word[100];
while (getword(word, sizeof(word), fin)) {
if (compare(word, keyword) == 0)
upper(word);
fputs(word, fout);
}
}
char *getword(char *word, size_t size, FILE *fp) { size_t len = 0; int c; while ((c = fgetc(fp)) != EOF && isalpha(c)) if (len < size-1) word[len++] = c; if (len == 0 && c == EOF) return NULL; if (len == 0 && !isalpha(c)) { sprintf(word, "%c", c); return word; } ungetc(c, fp); word[len] = '\0'; return word; } int compare(char *a, char *b) { int f; while ((f = toupper(*a) - toupper(*b)) == 0 && *a) a++, b++; return f; } char *upper(char *s) { char *p; for (p = s; *p ; p++) *p = toupper(*p); return s; }
>>677 逆に,長くなりそうなものは嫁の貰い手が少ない罠。
680 :
デフォルトの名無しさん :03/12/11 09:00
>>674-
>>678 みたいにプログラム書ける人になりたいんですけど
よかったら職業教えてください
681 :
デフォルトの名無しさん :03/12/11 09:21
C++の課題なのですが、問題は一つは再帰(Recursive)を使って ABCで2通りの組みあわせをすべて出力しろという問題です。 例えば、 ユーザーが ABC 2 と入力するとコンピューターが ”AB” ”AC” ”BA” ”BC” ”CA” ”CB" というような風に作れという問題です。 もう一つは再帰を使わずStackを使って同じものを書けというものです。 ご教授お願いできないでしょうか?? よろしくお願いいたします。
>>677 >>668 int main(int argc, char **argv){
char *cmp_base; char *upper_base;
char *pendings; int base_len; char *ctmp;
FILE *fp = stdin; int index; int c;
if( !(argc > 1) ) return EXIT_FAILURE;
base_len = strlen(argv[1]);
cmp_base = (char *)malloc(base_len*2); pendings = (char *)malloc(base_len+1);
for(ctmp=argv[1],index=0; *ctmp; ++ctmp,++index){
upper_base[index]=toupper(*ctmp);
cmp_base[2*index]=toupper(*ctmp);cmp_base[2*index+1]=tolower(*ctmp);
}
upper_base[index]='\0';
for(c=fgetc(fp);1;){
for(; !isalnum(c); c=fgetc(fp)){
if( c == EOF ) return EXIT_SUCCESS;
putchar(c);
}
for(index=0; 1; ++index,c=fgetc(fp)){
if(index==base_len){
if(!isalnum(c)) fputs(upper_base,stdout);
else goto cmp_fail;
break;
}
if(c!=cmp_base[2*index] && c!=cmp_base[2*index+1]) goto cmp_fail;
pendings[index]=c; continue;
cmp_fail:
pendings[index]='\0'; fputs(pendings,stdout);break;
}
for(; isalnum(c); c=fgetc(fp)) putchar(c);
}
}
ポーカーの宿題が出ました。 ネ申様助けて下さい
ファンタってあれ毒入ってるんじゃね? 飲むと八割方腹痛が起きるんだが
>>684 何の宿題だ?
ファンタには毒は入っていないが、果汁も入っていないぞ。
八割方ぽんぽん痛くなるのにそれでもファンタを飲むのか、君は!?
ファンタを解毒するには炭酸を抜くしかない!
これだけは言える。
>>684 は既に五本以上のファンタを飲んでいると。
データベースを作る宿題がでました。 お願いします、誰かたすけてださい・・・・。 もう混乱しててどうにもなりません。 データベースは継承を使うこと、そして連結リストを使うことが 条件になっています。まず、データを入れるたびにそれを 連結リストに格納していくのですががうまく動いてくれません。 そして、次はデータの中からユーザーの打ち込んだ検索語句に 該当するデータを見つけ、そしてそれをデリートするというところも できません。 コードは下のほうに貼ります。かなり長くなると思いますが・・。 神様おねがいします。。。
#include "Music.h" #include "Base.h" #include "Movie.h" #include "Database.h" #include <fstream> void Run :: run() { Add linklist; linklist.read(); do { cout << "--------------------------------------" << endl; cout << " Welcom to Audio Database" << endl; cout << "--------------------------------------" << endl; cout << " " << endl; cout << "a. Enter a new music." << endl; cout << "d. Enter a new movie" << endl; cout << "e. Search by title." << endl; cout << "f. Print all records" << endl; cout << "g. Exit Database" << endl; cout <<"" <<endl; cout << "Your entry: "; cin >> choice1;
if ( choice1 == 'a') { Music* piece = new Music(); cout << "1Beginning of Add_Item. d is: " << piece->getTitle() << endl; piece->getItem_Music(); cout << "2Beginning of Add_Item. d is: " << piece->getTitle() << endl; linklist.Add_Item(piece); cout << "3Beginning of Add_Item. d is: " << piece->getTitle() << endl; cout << "Do you wanna continue?(y/n): "; string ignore; getline(cin, ignore); cin >> choice3; if (choice3 == 'n') { cout << "Saving data..." << endl; linklist.write(); cout << "" << endl; cout << "Done..." << endl; } } /*
if (choice == 'e') cout << "Enter the key word" << endl; cin << key; cout << "Do you wanna delete this item?: " << // タイトルでサーチして該当したものをすべて表示。そしてデータを消す。 */ /*if (choice1 == 'f') { //連結リストに入っているものをすべて表示。 } */ } while ( choice3 == 'y' || choice2 == 'n'); }
中一で習う単語すらきちんと打てないんでしゅか
ListNode::ListNode(Base* d) { data = d; next = NULL; } void Add::Add_Item(Base* d)//連結リストです。 { current = head; head = NULL; tail = NULL; newnode = new ListNode(d); if (head == NULL) { head = newnode; tail = head; } else { tail->next = newnode; tail = newnode; } }
>>695 ありがとうございます そこ探していたのですがみつからなくて・・・
void Add::Add_Item(Base* d) { current = head; current = head; head = NULL; // 呼び出されるごとに、先頭も tail = NULL; // 末尾もNULLが代入されているので、 newnode = new ListNode(d); if (head == NULL) // 常にこの条件が真となり { head = newnode; // 先頭に新規ノードを追加するだけになる。 tail = head; } else // else節が実行されることはない { tail->next = newnode; tail = newnode; } }
確かに、Else節が実行されないですね。。。。 NULLを置く場所が悪いのでしょうか?? といことは・・・・どこにNULLを置けばここの IF-ELSE節がうまく動くようになるんですか? ほんと、アホですみません。。。。。
動きました! でも、まだまだ問題が・・・・。 void Music::getItem_Music()の中の下の部分なのですが getlineを使うことができません。いくつか周辺にデバックコードを 置いてみたのですがcinなら反応することがわかりました。 どうしてでしょうか? cout << "Enter the title: "; //getline(cin, title); cin >> title; //cin.ignore();
705 :
デフォルトの名無しさん :03/12/11 16:06
C言語でお願いしたいのですが。 テキストファイルに10行の文字列があります。 darf nvfuia vnfui ・ ・ ・ このテキストファイルを読み込み、実行するタイピングソフトを作らなければなりません。 流れとしては、 1、テキストファイル名を入れる 2、テキストファイルの1行目が表示される 3、タイピングをする(ミスをすると表示されない) 4、1行目が終わると、2行目が表示され、またタイピングをする・・・・ 4、10問おわったら、かかった時間とミスした回数が出力される こんな感じなんですが、どうぞ宜しくお願いします。
あと、もう少しなのですがここが難しいです。 どうかお助け頼みます!!!! テキストファイルに保存することはできたのですが以前のデータを読み出して 連結リストに以前のデータを入れるところができません。そうしないと一回プログラム を動かすことにテキストが上書きされてしまいます。どうすればよいでしょうか? int Add :: read() { ifstream infile("data.txt"); while(!infile.eof()) { Add_Item(x); } } もう一つは、連結リストの中のデータの中からユーザーの入力した 検索語句に該当するデータをすべて探し出しデータを消去する ところもできません。 お願いします、あと少しです、助けてください。
>>707 ありがとうございます!!!
ありがとうございます!!!
ありがとうございます!!!
void Base::print(ostream& out) に対応させて, void Base::input(istream& in) でも作ったら? しかし,どうみてもデータベースを実装しようとしてるように思えないのだが?
>>709 要点だけ。
int main(void)
{
printf("-------------------------*-------------------------\n");
/* printf()をたくさん書いて、グラフを書く */
return 0;
}
>>711 すみません…sin関数を使えっていう指定があるんです…。
sin関数の使い方が参考書にのっていなくて使い方がわからなくて…。
お願いします…。
>>712 ごめん、宿題全文と、条件、書いて。
それと、自作関数って使っていいの?
>>715 #include <math.h>
#include <stdlib.h>
struct graph {
double min_y; double max_y;
double min_x; double max_x;
int y_width; int x_height;
};
void plot(const struct graph *g, double(*f)(double));
int main(int argc, char **argv){
struct graph my_g;
if( !(argc>2) ) return EXIT_FAILURE;
my_g.min_y = -1; my_g.max_y = 1;
my_g.min_x = 0; my_g.max_x = 2*M_PI;
my_g.x_height = atoi(argv[1]); my_g.y_width = atoi(argv[2]);
plot(&my_graph, sin);
}
void plot(const struct graph *g, double(*f)(double)){
int x; double x_degree;
int y; double y_degree;
x_degree = (g->max_x - g->min_x) / g->x_height;
y_degree = (g->max_y - g->min_y) / g->y_width;
for(x=0; x < g->x_height; ++x){
y = (f(x*x_degree + g->min_x) - g->min_y) / y_degree;
for(; y>0; --y) putchar(' ');
putchar('*');
putchar('\n');
}
}
引数にグラフの 高さ と 幅 を指定せい。
718 :
デフォルトの名無しさん :03/12/11 19:35
ひとつご教授ください。 以下は配列を初期化し、関数narabekaeで並べ替え main関数で表示するプログラムの一部です。 バブルソートによりソートを行いましたが、これをmain関数に戻して表示するのは return等をどのように付け加えればよいのでしょうか? よろしくお願いします。 int main() { int a[11] = {5, 2, 3, 5, 3, 2, 4, 8, 9, 9, 7} ; int i, j, t, s, c ; } void narabekae (int i, int j, int t, int s, int a[]) { for( i = 0 ; i < 10 ; i++) { for(j = 10 ; j > i ; j--) { if( a[j] < a[j-1] ) { t = a[j] ; a[j] = a[j-1] ; a[j-1] = t ; } } } }
あーすみません、
>>707 の'\0'はナニですか?
・・・本読みましょう・・・>719 文字列末尾にはうんぬんってのが書いてあるはずです。 ここで説明を受けるよりも、本を読んで理解したほうがいいよ。それは。
>>720 ですよね。
もう、ソース見ても何がなんだか全然わからなくて・・・・
723 :
デフォルトの名無しさん :03/12/11 19:58
質問させてください。 学校の宿題で住所録を作れって問題が出たんですけど、 データファイルのロードの仕方が分かりません。 データファイルはこんな感じです。 SATOU TARO 佐藤 太郎 東京都港区北青山 sato@abc.ne.jp @ SUZUKI JIRO 鈴木 次郎 東京都目黒区自由が丘 suzuki@def.co.jp @
724 :
デフォルトの名無しさん :03/12/11 19:59
>1
725 :
デフォルトの名無しさん :03/12/11 20:00
>>721 >>716 はもちろんsin()使ってます・・・が、ちょっと理解しにくいかもね。
汎用的な書き方してるのがすばらしいコードです。
でも、構造体やら、関数へのポインタやらあって、
初心者には、読めないかもしれない。
って、フォローになってないか。
>>722 コメントを全く書かなかった俺も悪いな。
少しだけ補足すると、getline(buf, size, fp)は
fpから一行をbufに読み込むが、sizeを超えた分はbufに記録せずに
読み捨てる。で、ファイル末尾に到達したときはEOF(ファイル終端記号)
を返す。
0x100は十六進で100、つまり256のこと。
読解がんばってくれ。
>>727 できれば・・・その・・・コメントを書いて頂けたら・・・助かり過ぎます
私、ビックリするくらい初心者なんですよ・・・
お・ね・が・い・だ・か・ら。 初心者を売りにしないでちょ。
>>730 はい、すみませんでした
ありがとうございました
>>715 この程度なら理解できるかな。グラフの幅が固定なのが好かんが、可変にすると長くなる。
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(void)
{
double pi = 3.1415926;
char line[] = "-------------------------+-------------------------";
int width = 25;
int n = 40;
int i, x;
for (i = 0; i <= n; i++) {
x = (int) floor(sin(2*pi*i/n) * width + 0.5);
line[x + width] = '*';
puts(line);
strcpy(line, "25個の空白と1個の|と25個の空白");
}
return 0;
}
どなたかお時間がある方、お願いします、助けてください。。 どうしても、>>714に書いたところが完成しません。 お願いします、、神様ーーーーーーー。
>>732 いえ、明日提出なんですよ。
で、何回か読んだんですけど、これは初心者が作れる代物ではないなと思いました。
だからこれを提出しても明らかに違う人間が作ったものだとばれてしまいます。
お手数をかけて申し訳ありませんでしたが、今回は不完全なままで提出しようと思います。
本当にありがとうございました。
すみません。ダイレクトXが少しだけ入ったプログラムなんですけど ちょっと見てもらえませんか? 入ってるといっても、四角形を表示させるだけなんで、大したこと無いんですけど 問題は、mallocを使用した構造体の生成です。 スレではちょっと長いのでかけないので メッセでファイルを送ります。 どなたか、よければ相手してください。 jiro_nekosan@hotmail.com
> 大したこと無いんですけど 他人がやる分には何でも大したこと無いわな。
>>736 for( i=0; !feof(fp); i++ )
iの操作はここだけというのがよくない
レコードが移るごとに i を戻さないと、
最初のレコード以外
switch文ですべてdefault:に行ってしまう
>>733 わざわざありがとうございます!
まだ、多少理解できない部分がありますがそこは調べながら頑張ります!
本当にありがとうございました!
>>740 ありがとうございました。
直してみます。
おまんこに勃起したペニスを突っ込む
744 :
デフォルトの名無しさん :03/12/11 21:52
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=162 ↑のソースファイルに、
(1) 引数で指定したk番目の後ろにノードnを追加する関数insertを追加。
(2) (1)で追加されたソースコードの構造体nodeの構成を以下のように改良し、
改良された構造体nodeにあわせて、ノード追加や表示などの各関数の処理の修正をする。
struct node{
char name[30];
int age;
struct node *next;
(3) (2)で修正されたプログラムを、以下のような、名前と年齢がスペースで区切られて記述された
データファイルを読み込んでリストを作成するように改良する。
Takeshi 40
Mansei 38
Gikomonar 30
(4) 指定された年齢と一致するデータを全て表示する関数findallを再帰的呼び出しを用いて作成して追加
(5) n番目とm番目のノードを交換する関数exchangeを追加。
(6) n番目の後ろにあるノードを削除する関数removenodeを追加。
(4~6は2や3で改良されたプログラムに追加していく。)
てんこもりですが・・・お願いいたします。
746 :
デフォルトの名無しさん :03/12/11 22:09
747 :
◆GmgU93SCyE :03/12/11 22:12
1MB程度のテキストファイルの n 行目~ m 行目までを切り出す処理を 書いているのですが、どのようにすれば一番効率が良いのでしょうか? 現在考えているのは、 1. fopen, ftell を使ってサイズを取得 2. そのサイズをnew 3. fread で一気にメモリに読み込む 4. for で改行を数え 5. はじめと終わりの位置を変数に入れて、std::string に insert というものです。このような実装はまずいでしょうか?
頼んでよろしいでしょうか? 2つの正の整数a,bを読み込んでaとbの最大公約数(GCD)と 最小公倍数(LCM)を求めるプログラムなんですが、 ユーグリッドの互除法を使い、 void Euclid(int a,int b,int *gcd, int *lcm) と言う関数を作成して用いろといわれてます。 C言語でお願いいたします。
1時間もあれば、ぼちぼち。2時間もらえれば確実。
>>744 >>749 俺は、ちょっと・・・時間がないのでパス。
とか書いとくと、だれか1時間以内でクリアしようとするだらう^^;;
C++での課題のことで相談です。 「標準入力からテキストファイルを読み込み・・」 とあるのですが、これはcin.get( )等を使ってキーボードから入力した 内容のことを言うのでしょうか? 一応、 char c; while(cin.get(c)) でchar配列か何かにコピーしていこうと思ったのですが、 Ctrl+Zでの終了がうまくいきません。 環境を選ばない良い方法があれば、どなたかお願いいたします。
読み込み・・・のあとはなんて書いてあるのかによるだろ。
>>753 「行を辞書順に並べ直して下さい」です。
>>752 処理系がなにか分からないけど
abc....z
C-z
C-z
とC-zを2回入れないと終了できない奴があったはず
bccかvcかgccかstlport どれかでそんな動作をしたはず
Emacsじゃない?
>>755 VC++6.0とC++Builder5.0でそれぞれ試してみたけど、
C-zでループどころかプログラムが終了しちまったよ
コンパイラの方は、VCの6.0を使っています。 2回入れて終了したのですが、その後の処理が実行されません・・
>>752 「標準入力からテキストファイルを読み込み・・」
cin.get(c)を、キーボードからの入力から、ファイルの入力へ切り替える方法がある。
リダイレクトっていって、
実行するときに、
実行ファイル.exe <入力ファイル
ってふうに、する。
詳しいことは、
「リダイレクト」「コマンドプロンプト」などでぐぐれ。
って、そういうことではないのか・・・。な?
>>758 ありがとうございます。参考にさせていただきます。
>>760 ありがとうございます。
課題の解釈に問題があるかもしれないので、ぐぐってみます。
標準入力からファイル入力にしたいならリダイレクトしかないが、 今聞かれてるのは標準入力からEOFを打ち込む方法では? 元のファイルがあるのなら、 hage.exe < hoge.txt (リダイレクト) cat hoge.txt | hage.exe (パイプ) とかでいいけど。
>>756 > Emacsじゃない?
俺悩んだんで、マジレス。
Meadow2+VC6って環境では標準出力がバッファリングされちゃうんで、fflush(stdout);とか入れる。
あと、shellで標準入力の終了は「C-q C-z RET」とする。
> 標準入力からEOFを打ち込む方法 なるほど。 答え:環境依存(爆)
>>752 さては cygwin だから Ctrl+D だろ。
ここは今から>>752の少ない情報を手がかりに 色々と推理するスレになりますた。
EOFの方は皆様のおかげで解決しました。 ありがとうございました。残りは自力で頑張ってきます!
768 :
デフォルトの名無しさん :03/12/12 00:02
配列を5,2,3,5,3,2,4,8,9,9,7で初期化し、 関数sortで小さい順に並べ替え、main関数に戻って表示したいのですが、 ソースプログラムはどのように記述すればよいのでしょうか?
どなたか、
>>681 の宿題解いてくれませんか。
難しすぎるというかなんというかわけわかりません
よろしくお願いします。
>>748 void Euclid(int a,int b,int *gcd, int *lcm)
{
int x, y, z;
if (a < 1 || b < 1 || gcd == NULL || lcm == NULL)
return;
for (x = a, y = b; (z = x % y) != 0; x = y, y = z)
;
*gcd = y;
*lcm = a / y * b;
}
>>768 #include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
main()
{
int t[] = {5,2,3,5,3,2,4,8,9,9,7};
std::vector<int> v(t, t + sizeof(t)/sizeof(t[0]));
std::sort(v.begin(), v.end());
std::copy(v.begin(), v.end(),
std::ostream_iterator<std::vector<int>::value_type>(std::cout));
}
>>769 よく意味がわからないんだが、たとえば
abcde 3
とやったら全部の組み合わせだせってことか?
問題の意図はそうだと思うが、文章からだとABC、2というのは固定のようにとれる。
作ってから違いますじゃ起こるぞ。
どっち?
773 :
デフォルトの名無しさん :03/12/12 00:16
2通りの組み合わせなのに6通りの組み合わせをつくっているのはなぜかしら?
ABC 2 というのは固定じゃありません。 ユーザーによって変えられるようしてほしいです。 よろしくお願いいたします。
>>773 2通りの組み合わせじゃないですね。。 2つの文字を抜き出してすべての組み合わせ ということです。言葉での表現が難しいですねw
777 :
デフォルトの名無しさん :03/12/12 00:20
>>775 AAB 2と入力したとき、一文字目のAと二文字目のAを組み合わせたAAと、その逆のAAはどちらも表示していいのか?
>>776 はい、2は固定じゃないです。 >>777 はい、どちらも表示してかまいません。
かまいません←しても、しなくてもよいように聞こえる(^^;; 組むときは「表示する/しない」と明記してくれたほーが。
すみませんw 表示する!でお願いします^^
ファイルを読み込みアルファベットの小文字を大文字にして出力せよ という問題なんですが、 main() { char s[256],fi[50]; int i,j; FILE *fp; printf("Input file name:"); scanf("%s",fi); if(NULL==(fp=fopen(fi,"r"))){ fprintf(stderr,"Error:file open[%s].\n",fi); exit(1); } for(i=0;i<999;i++){ if(NULL==fgets(s,256,fp)){ break; } for(j=0;j<10;j++){ if(s[j]=='\0'){ break; } if(isalpha(s[j])){ s[j]=toupper(s[j]); } } printf("%s",s); } fclose(fp); } と作ってみたのですが、jを10以上にするとエラーが出ます。どうすればいいでしょうか?
>for(i=0;i<999;i++){ >if(NULL==fgets(s,256,fp)){ >break; >} 同じ配列に ファイルから読み込めなくなるまで行ぶち込んで 何がやりたいんだ?
783 :
デフォルトの名無しさん :03/12/12 00:52
>781 行数限定ですか? やるなら for(;;) または while(1) とかじゃない?
while( fgets(s,256,fp) != NULL ) ;
>>783 特に指定はありません。
すいません上のには/* */を書いてませんでした。
/* */を消すとできたのですがなぜでしょうか?
ちなみに/* */があって
jを10以上にするとDebug Assertion Failed!と出て
はじめの1行だけが大文字になります。
786 :
デフォルトの名無しさん :03/12/12 01:12
>781 エラー処理は自分でやれ #include <stdio.h> char big (char c) { return c-('a'-'A'); } int main (int argc,char *argv[]) { char c; FILE *fp; fp=fopen(argv[1],"r"); while( (c=getc(fp)) != EOF){ if('a' <= c && c <= 'z'){ c=big(c); } printf("%c",c); } }
はじめてみた。質問する人が、「急いでいるのですか?」と尋ねるの。 答える人は急いでないと思うぞ。
789 :
デフォルトの名無しさん :03/12/12 02:02
>>788 そうですね。すみません、逝ってきます。
>>681 >>769 すまん。C言語で解いて、cin,coutだけC++にした。
#include <iostream.h>
#include <string.h>
void kumiawase(char *s, int len, int n, char *t, int m)
{
if (n < 1) {
t[m] = '\0';
cout << t << endl;
return;
}
for (int i = 0; i < len; i++) {
t[m] = s[i];
s[i] = s[len-1];
kumiawase(s, len-1, n-1, t, m+1);
s[i] = t[m];
}
}
int main(void)
{
char s[100], t[100];
size_t n;
cin >> s;
cin >> n;
kumiawase(s, strlen(s), n, t, 0);
return 0;
}
>>681 一点修正。すまん。
int main( void )
{
>>char s[] = "\0";
↓
>>char s[ 256 ] = "\0";
>>792 うーむすごい。
スタック版はちょっと思いつかん。朝起きて時間があったらやってみるわ。
本みりゃ載ってるんだろーが。パズルは自分でやるのが喜び。
・・・仕事ではないからな。
失礼↑名前欄792は間違いね。
796 :
デフォルトの名無しさん :03/12/12 02:40
自画自賛キターーーーーーーーーーーーーーーーーー!!!!!!!!!
ぐすん。 今日は泣き寝入りしよ・・・・
すまん、ひとつのプログラム内で再帰版と非再帰版の両方を行っていたのか。
802 :
デフォルトの名無しさん :03/12/12 02:58
ファイルポインタ使ってファイルを「バイナリ形式で」読み込んでから そのファイル内(例:nullpo.wav)に 指定文字列(バイナリ) 53 3D がいくつあるかどうか検索する方法を教えてください。 とりあえず FILE *fp = fopen("nullpo.wav","rb"); で読み込み方法だけは指定されているのですが、 ここから何をどうすればいいかさっぱりです。 よろしくおねがいしますです。
803 :
デフォルトの名無しさん :03/12/12 03:00
>>802 一番簡単な方法はファイルの中身を一気にバッファに読み込んでから、memchrとmemcmpを使って調べる(strstrのバイナリ版とも言うべきものを作る)。
>>803 メモリ確保などの難しいことは解らないので、
一回配列に入れて検索してみようとしたんですよ。
char a[256] = fp; としてfpがEOFになるまで繰り返す方法で。
それでaに対してstrstr関数を使ってみたところ、
指定文字列が途中で切れる状況ができてしまいまして・・・。
a[254] = 5
a[255] = 3
みたいな感じで。
(要は指定文字列がaの末尾に入ってしまった場合、検索されない。)
根本的に間違ってるでせうか・・・?(´・ω・`)
>>802 以下のループでどうよ。
ファイルから1文字読み込む。
その文字が 53 だったらもう1文字読み込む。
読み込んだ文字が 3D だったら->ハケーン!
違っていたら ungetc( 3D, fp );
806 :
デフォルトの名無しさん :03/12/12 03:15
>>804 > char a[256] = fp;
これは大間違い。
fpから読み出すには(この場合は)freadを使う。
807 :
デフォルトの名無しさん :03/12/12 03:18
>>806 「fpから読み出す」という表現も間違っているわけだが。
fpを通して(使って)ファイルを読むが正しい。
と自分に突っ込んでみる。
(´;ω;`)ウゥゥ・・・
ソース組むのに時間かかるので
すぐには結果が出せませぬ・・スマソ。
とりあえずfreadを使って
>>805 さんの方法を試してみまつ。
809 :
デフォルトの名無しさん :03/12/12 03:25
>>808 >>805 の場合は一文字だけ読むからfgetcだYO
まあfreadでもできないわけじゃないけど。
810 :
デフォルトの名無しさん :03/12/12 03:35
>>802 と似たような質問になるけど
txtファイル読み込んで検索かける方法って逐次以外何かあるっけ?
やっぱソートかえ?
811 :
デフォルトの名無しさん :03/12/12 03:39
すまん。馬鹿な質問してた。
(´;ω;`)ウゥゥ・・・ できない・・・今日は寝ます・・・。
判定しきれない場合があるけど。 #include <stdio.h> int main(void) { FILE *fp = fopen("nullpo.wav","rb"); unsigned char hoge[] = { 0x53, 0x3D }; int size = sizeof hoge, i = 0, count = 0, c; while ((c = fgetc(fp)) != EOF) { if (c == hoge[i]) i++; else i = 0; if (i == size) count++; } printf("%d\n", count); return 0; }
wavってのが意外と曲者だな。 サイズがでかいから配列だと扱いにくい。
やっぱりできん・・・
>>802 どうしても出来ない場合はこれで凌ぐ
int Count( FILE *fp )
{
int cnt[ 256 ][ 256 ] = { 0 };
int c, d;
for( c = fgetc( fp ) ; ( d = fgetc( fp ) ) != EOF ; c = d )
cnt[ c ][ d ] ++;
return cnt[ 0x53 ][ 0x3D ];
}
>>681 >>792 STLでPON。
やっぱ,C++でスタックといえば,STLじゃねーの?
でも,スタックはstackでなく,vectorを使いたかったなぁ…
#include <iostream>
#include <queue>
#include <stack>
int main(){
const char array[]={"ABC"};
std::queue<char> base;
for(const char *ptr=array;*ptr;++ptr){base.push(*ptr);}
std::stack<char> comb;
for(int i_1=base.size();i_1;--i_1){
char c_1 = base.front();
comb.push(c_1);
base.pop();
for(int i_2=base.size();i_2;--i_2){
char c_2 = base.front();
comb.push(c_2);
base.pop();
for(std::stack<char> tmp(comb);!tmp.empty();tmp.pop()){std::cout<<tmp.top();}
std::cout<<' ';
comb.pop();
base.push(c_2);
}
comb.pop();
base.push(c_1);
}
std::cout<<endl;
}
818 :
デフォルトの名無しさん :03/12/12 08:34
> vectorを使いたかったなぁ… 使えばいいじゃない。
宿題でメニューを使ったプログラムを書いてみよ。 という宿題が出たんですが、どういうことなんでしょうか? 休んでしまって分からないんです。。
>>817 馬鹿。
それが本当に回答になっているか、再度問題文を読み返せ。
>>820 なんで? 任意のcombinationに対応する必要でもあるのか?
>>822 >778 名前: デフォルトの名無しさん [sage] 投稿日: 03/12/12 00:21
>>>776
>はい、2は固定じゃないです。
void add(char name_db1[][256], char name_db2[][256], int score_db[][256], char name1[], char name2[], int score[], int subject_num, int index) { strcpy(name_db1[index], name1); strcpy(name_db2[index], name2); score_db[index][subject_num] = score[subject_num]; } このプログラムで、 : error C2143: 構文エラー : ';' が 'type' の前に必要です。 : error C2065: 'name_db2' : 定義されていない識別子です。 : error C2065: 'index' : 定義されていない識別子です。 : error C2109: 配列または、ポインタでない変数に添字が使われました。 : warning C4047: 'function' : 間接参照のレベルが 'char *' と 'int ' で異なっています。 : warning C4024: 'strcpy' : の型が 1 の仮引数および実引数と異なります。 : warning C4047: 'function' : 間接参照のレベルが 'const char *' と 'char [256][256]' で異なっています。 : warning C4024: 'strcpy' : の型が 2 の仮引数および実引数と異なります。 error C2065: 'score_db' : 定義されていない識別子です。 : error C2109: 配列または、ポインタでない変数に添字が使われました。 : error C2065: 'subject_num' : 定義されていない識別子です。 : error C2109: 配列または、ポインタでない変数に添字が使われました。 : warning C4047: '=' : 間接参照のレベルが 'int ' と 'int *' で異なっています。 : error C2106: '=' : 左のオペランドが、左辺値になっていません。 と表示されるんですが、何がいけないんでしょうか?
>>681 >>820 とりあえず,書いた。
任意のCombinationに対応した版。
MAX_DEPTHとarrayを書き換えヨロ。
#include <iostream>
#include <queue>
#include <stack>
int main(){
int MAX_DEPTH = 3;
const char array[]={"ABCDE"};
std::queue<char> base;
for(const char *ptr=array;*ptr;++ptr){base.push(*ptr);}
std::stack<char> comb;
std::vector<int> count(MAX_DEPTH,0);
int depth=0;
while(1){
for(;depth<MAX_DEPTH;++depth){
comb.push(base.front()); base.pop();
}
for(std::stack<char> tmp(comb);!tmp.empty();tmp.pop()){std::cout<<tmp.top();}
base.push(comb.top()); comb.pop(); --depth;
std::cout<<' ';
while( ++count[depth] == (strlen(array) - depth) ){
if(depth==0) goto end;
count[depth]=0;
base.push(comb.top()); comb.pop(); --depth;
}
}
end:
std::cout<<endl; return 0;
}
>770 ありがとうございました。
>>823 ノォー。漏れは
>・後になって問題につけたしをするのはやめましょう。
> 解いてもらっている方に失礼になってしまいます。
を主張スル!!
そうだね、しかしお前が回答した“後になって”ではないから、 お前がマヌケである事に変わりはない。
シクシク…(T_T)
830 :
デフォルトの名無しさん :03/12/12 10:03
画面に「こんにちは」と表示して改行する関数 void hello(void){} を作成しなさい。 がわかりません。お願いします。
つまらん
832 :
初めての仕事人 :03/12/12 10:31
#include <iostream.h> void hello() { cout<<"こんにちわ"<<endl; } void main() { hello(); }
void main なあたりが釣り氏
834 :
デフォルトの名無しさん :03/12/12 10:35
エラーでまくりで動きません。
835 :
初めての仕事人 :03/12/12 10:37
だめでつか? もう少し勉強して出直してきます・・・ 私のは動いたんですが特殊なんでしょうか・・・ しょぼーん
836 :
デフォルトの名無しさん :03/12/12 10:40
だめですねぇ。なんででしょう・・・
837 :
初めての仕事人(訂正?) :03/12/12 10:40
#include <iostream.h> void hello(void) { cout<<"こんにちわ"<<endl; } main() { hello(); return (0); } //やってみました。作ってるのも初心者なので勘弁して
838 :
デフォルトの名無しさん :03/12/12 10:43
ごめんなさい。うーん無理ですねぇ。
君らのマヌケなやり取りにはウンザリだ、 エラーの内容くらい書け、 使ってるコンパイラも書け、 拡張子が.cとか言うなよ。
840 :
初めての仕事人(訂正?) :03/12/12 10:47
//今までC++だったんですがCに直してみました。これでだめだったら //(´Д⊂ モウダメポ #include <stdio.h> void hello(void) { printf("こんにちわ\n"); } main() { hello(); return (0); }
841 :
デフォルトの名無しさん :03/12/12 10:50
おkですー!ありがとうございました!
擦れたいが殺人事件に見えた
void combination(std::queue<char> base, int depth) これはだめっしょ
あ、あの…。 824なんですけど、まだ解決出来ないです。。 何がいけないんでしょうか?
>>844 何が駄目??
>>845 >>824 >: error C2143: 構文エラー : ';' が 'type' の前に必要です。
そのコードの前で";"付け忘れてるんじゃねーの?
次からは初心者向けVisualC++スレへ。
847 :
デフォルトの名無しさん :03/12/12 12:09
>>824 ソースが全部公開されていないのでなんとも言えないが、とりあえず
void add(char
を
;void add(char
にして、コンパイルできるか試してくれんか?
848 :
デフォルトの名無しさん :03/12/12 12:25
1×1の正方形があります。それに内接する形で0.5×0.5の円が あります。乱数の生成は0以上1未満とし、円の中にのみ入るX,Y座標 を求めたい場合どのようなプログラムにする必要がありますか? 円上は含めて構いません。
ピタゴラスの定理
>>791 さん
すみません、遅くなりました。
ほんとうにありがとうございます。助かりました^^
↑681です。
>>848 マルチじゃねぇか。
気が付かずに C言語なら俺に聞け の方で答えちまったよ。
↑文章くらい最後まで読めよな。気の毒だが。
今、スレ全部読んだのですが、817さんもご協力ありがとうございました。 皆さんのおかげで助かりましたーーーー!!! 私も皆さんのようになれるようにもうちょっと修行してきます。 ほんとうにありがとうございました。。
855 :
デフォルトの名無しさん :03/12/12 14:27
「C言語なら俺に聞け」から移動してきました。 よろしくお願いします。 192 :デフォルトの名無しさん :03/12/12 14:20 ファイルよりm次の正方行列を二次元配列に格納しました。 もとの正方行列をn次の正方行列(m>n)で区切り、 そのn次の行列の成分を全て足したものを成分とする(m/n)次の正方行列を作りたいです。 どうかよろしくお願いします。
A[M][M]→B[N][N] int h, i, j, k; for (h = 0; h < n; h++) { for (i = 0; i < n; i++) { b[h][i] = 0; for (j = 0; m*h/n < m*(h+1)/n; j++) { for (k = 0; m*i/n < m*(i+1)/n; k++) { b[h][i] += a[j][k]; } } } }
>>852 マルチですいませんでした...
でも答えていただきありがとうございました!
がんばtってみます!
ぬるぽ
ぬllぽ
862 :
デフォルトの名無しさん :03/12/12 21:51
文字を1つずつ読み込み,ファイルに含まれるアルファベットの 出現頻度を調べるプログラムを作成せよ.で、 下のプログラムを作ったんですけど、頻度の高い順に出力したいのですが どうすればよいでしょうか? どなたか、お願いします。 #include<stdio.h> int main() { char ch; int i,count[26]; for(i=0;i<26;i++) count[i]=0; while(ch!=EOF) { ch=getchar(); if(`a`<=ch && ch<=`z`) count[ch-`a`]++; } for(i=0;i<26;i++) printf("%d=%c\n" ,count[i],i+`a`) return 0; }
>>714 複数ファイルは,zipかlzhかtar辺りでまとめた添付ファイルも付けてくれ。
さすがに復元する手間をかける気にはならん。
864 :
デフォルトの名無しさん :03/12/12 22:07
宿題の課題は、C言語で電卓のプログラムを作ることです。 解いて欲しい式は、 (5-7)^(64/((3+1)*2)) です。 お願いします。
#include <stdio.h> #include <math.h> int main(void) { printf("%f", pow((5-7), (64/((3+1)*2)))); return 0; }
866 :
デフォルトの名無しさん :03/12/12 22:29
ポーランドを使ってやるとどうなるんでしょう?
>>866 (5-7)^(64/((3+1)*2))
(5-7)^(64/((3+1)*2)) ポーランド記法だと、 ^ - 5 7 / 64 * + 3 1 2 = ^ -2 / 64 * + 3 1 2 = ^ -2 / 64 * 4 2 = ^ -2 / 64 8 = ^ -2 8 でいいのか?
>>862 #include<stdio.h>
int main(){
int ch = 0;
int i,j,temp,count[26][2];
for(i=0;i<26;i++){
count[i][0]=0;
count[i][1]='a'+i;
}
while(ch!=EOF){
ch=getchar();
if('a'<=ch && ch<='z')
count[ch-'a'][0]++;
}
for(i=25;i>0;i--){
for(j=0;j<i-1;j++){
if(count[j][0] < count[j+1][0]){
temp = count[j][0];
count[j][0] = count[j+1][0];
count[j+1][0] = temp;
temp = count[j][1];
count[j][1] = count[j+1][1];
count[j+1][1] = temp;
}
}
}
for(i=0;i<26;i++)
printf("%d=%c\n" ,count[i][0],count[i][1]);
return 0;
}
>>862 さんの問題の発展形のような感じですが、
「英文中の単語の出現数を調べるプログラムを作成せよ」です。
単語ごとの出現数をカウントすることが出来ずまったくめどが立ちません。
>>872 単語の出現回数の多い順に出力ってのは、なしですか?
ごめんなさい >for(i=25;i>0;i--){ for(i=26;i>0;i--){ でした
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { double x, y; int ch; srand(time(NULL)); do { x = (double)rand() / RAND_MAX; y = (double)rand() / RAND_MAX; printf("x=%f, y=%f: ", x, y); if (sqrt((x-0.5)*(x-0.5) + (y-0.5)*(y-0.5)) <= 0.5) { printf("Inside.\n"); } else { printf("Outside.\n"); } printf("Continue (Y/N)? "); ch = getchar(); while (getchar() != '\n'); } while ((ch == 'Y') || (ch == 'y')); return 0; }
>>875 は
>>848 向けです。スマソ。
乱数は0.0以上1.0未満だが、0.5を引くことで円の中心を原点(0,0)にずらし、
ランダムな点(x,y)が、円の中心から0.5以下であるかどうかを調べている。
ニホンゴデ セツメイ ムズカシイヨ…
877 :
デフォルトの名無しさん :03/12/13 05:08
①リダイレクションを実装したシェルプログラムを作りなさい。 まず、標準出力をファイルへ出力を意味する'>'を実装しなさい。 解析したargvを調べて出力リダイアレクションがあるかどうか調べ、 ある場合にはファイルをopenしdup2を使ってファイルデスクリプタの 番号を2番に変更しなさい。 ②簡単なパイプを実現するシェルプログラムを作りなさい。 コマンドを|でつなげると前のコマンドの標準出力を 後のコマンドの標準出力とします。コマンドは2つだけとする。
878 :
877の続き :03/12/13 05:13
#include <stdio.h> void parse(char *line, char *argv[]) { int argc; argc = 0; while (*line){ argv[argc++] = line; while (*line && *line > ' ') line++; while (*line && *line <= ' ') *line++ = '\0'; } argv[argc] = NULL; } void execute(char *argv[]) { int pid, status; pid = fork(); if(pid < 0){ printf("fork error\n"); exit(1); } if(pid == 0){ execve(argv[0],argv, NULL); printf("%s error\n", argv[0]); exit(1); } while(wait(&status) != pid); }
879 :
さらに続き :03/12/13 05:15
main() { char line[512]; char *argv[16]; for (;;){ printf("@ "); fgets(line, 512, stdin); parse(line, argv); execute(argv); } } 2問とも上の878とここに書いてあるプログラムを改造して解いてみて下さい。 おながいします。
>>864 後付けポーランドなんて用語出すってことは…
以前の宿題で逆ポーランドうんぬんのモノがでてて,その発展系での電卓じゃねぇのか?
そうなら,以前の分の問題,回答も含めて,全文アップローダーに晒せ。
>>876 ユークリッド幾何学の本読め。
この一言で十分だろ?
>>877 2番は普通,標準エラーだが。
それでいいのか?
>>876 >
>>875 は
>>848 向けです。スマソ。
> 乱数は0.0以上1.0未満だが、0.5を引くことで円の中心を原点(0,0)にずらし、
> ランダムな点(x,y)が、円の中心から0.5以下であるかどうかを調べている。
> ニホンゴデ セツメイ ムズカシイヨ…
乱数をもちいて円周率を求めたいんじゃないんか?
半径は0.5でないといけないの?1でいいじゃん。
>>871 ありがとうございました。
さっそく、やってみます。
すみません、レスの確認が甘かったようです
>>882 いや、まぁそうなんだろうけど、いちおう宿題スレだし…
>>884 問題読み返してみたんだけど、
> 1×1の正方形があります。それに内接する形で0.5×0.5の円があります。
ってのがハァ?と思った。で、内接している円は、半径0.5の円だと勝手に
解釈したんだけど、どうなんだろ。
円周率を求めたいんなら
>>884 は正しいです。
つーかマルチだったのね……ウワァァン!
言うか己は!
890 :
デフォルトの名無しさん :03/12/13 13:19
つぎのようなプログラムを作成しなさい。 1.構造体 struct gstudentを宣言する。 2.struct gstudent 型の変数(オブジェクト)saoriを定義する。 3.struct gstudent 型の変数(オブジェクト)kaoriを定義し、 そのメンバーを"kaori", 161, 50.0, 70000で初期化する。 4.struct gstudent へのポインタ変数pを定義し、saoriを指すように初期化 する。 5.saoriにkaoriを代入する。 6.saoriのnameメンバーを"Saori"に変更する。 7. saoriのnameメンバーを表示する。 8.saoriのheightメンバーを表示する。 9.pの指すオブジェクトのnameメンバーを表示する。 10.pがkaoriを指すようにする。 11.pの指すオブジェクトのnameメンバーを表示する。 途中までは出来たのですが、先がわかならいので 教えてください、お願いします! #include<stdio.h> #include<string.h> struct gstudent { char name[20]; int height; float weight; long schols; };
/* 2.struct gstudent 型の変数(オブジェクト)saoriを定義する。 3.struct gstudent 型の変数(オブジェクト)kaoriを定義し、 そのメンバーを"kaori", 161, 50.0, 70000で初期化する。 */ struct gstudent saori, kaori={"kaori", 161, 50.0, 70000}; /* 4.struct gstudent へのポインタ変数pを定義し、saoriを指すように初期化 する。 */ struct gstudent *p=&saori; /* 5.saoriにkaoriを代入する。 6.saoriのnameメンバーを"Saori"に変更する。 */ saori=kaori; strcpy(saori.name,"Saori"); /* 7. saoriのnameメンバーを表示する。 8.saoriのheightメンバーを表示する。 9.pの指すオブジェクトのnameメンバーを表示する。 */ printf("saori.name[%s]\n",saori.name); printf("saori.height[%d]\n",saori.height); printf("p->name[%s]\n",p->name); /* 10.pがkaoriを指すようにする。 11.pの指すオブジェクトのnameメンバーを表示する。 */ p=&kaori; printf("p->name[%s]\n",p->name);
892 :
デフォルトの名無しさん :03/12/13 13:44
>>891 ありがとうございます。
助かりました。
>>889 searchをこんな風に改造すれば,(*q)=hogehoge で2分探索木に直接代入できる。
後はわかるだろ?
struct node *insert(int x, struct node *p){
struct node **q;
q = &p;
while(*q != NULL){
if((*q)->element == x) return *q;
if((*q)->element < x) q = &((*q)->right);
else q = &((*q)->left);
}
.........以下,頑張れ。
>>895 どこで質問するのが適切だと思われますか?
よかったら教えてください。
>どこで質問するのが適切だと思われますか? 学校。 誰にというなら、 教官や同じ宿題を出された友達。 ネット上で聞きたいなら、検索を駆使しましょう。 >よかったら教えてください。 なんでも聞いてると、人間関係悪くなるよ。 ネット上、例えばこのスレですら、相手されなくなる人いるし。 ところで、次の質問は、「どう検索すればよいですか?」かな?
あ、さっそく main の2行目間違えてた。
間違いばっかだけど反応無いから放っとくか…。
答え作っても反応ないんじゃね…。
>>898 返事遅れてすみません。ありがとうございます。
確かにエラーがでてしまいますが、マジ感謝です!!
>>902 こういうところでしか優越感を得られない人種なんだから敬ってやらないとw
あ,リダイレクトじゃねーや,パイプ,パイプ(^^;;
906 :
デフォルトの名無しさん :03/12/13 23:04
907 :
デフォルトの名無しさん :03/12/13 23:05
>>906 cout<<((double)(clock()-starttime)/CLOCKS_PER_SEC)<<endl;
>>904 うう、そうですね…私も色々いじってみたのですが、
ちょっと難易度高くて…。
とりあえず問題を考えてくれた皆様、ありがとうございましたー。
いろいろ参考になりました!
>>907 レスどうもです、でも出来ませんでした・・・
clock_t endtime = clock(); cout << endtime << endl; とかで出力されるんだったらば、 計算結果を一度変数に入れた後、 出力という手もあり。
911 :
デフォルトの名無しさん :03/12/13 23:20
>>909 じゃあ
void search( void )
{
int x, y;
if( restcount == 1 && get(3,3) == EXIST ) {
printboard();
exit(0); // ←ここでプログラムを終了してしまっているんだろう。
}
>>911 あっ、そんなところにexitがあったんですか・・・・気づきませんでした
ちょっと試してみます
出来ました!みなさんありがとうございました
>>894 返事遅くなりました。どうもありがとうございました。
なんか、ぱっとした問題ないかねぇ。
>>877 ホレ。
const char *piper="|";
void parse(char *line, char *argv[]){
int argc; argc = 0;
while (*line){
argv[argc++] = line;
while (*line && *line > ' ') {
if( 0 == strncmp(piper,line,strlen(piper)) ){
int i; for(i=0;i<strlen(piper);++i) line[i]='\0';
line+=strlen(piper); argv[argc++]=piper;break;
}
line++;
}
while (*line && *line <= ' ') *line++ = '\0';
}
argv[argc] = NULL;
}
void execute(char *argv[], int in_fd){
int pid, status; char **pipe_argv; int fds[2];
for(pipe_argv=argv; *pipe_argv; ++pipe_argv)
if(*pipe_argv==piper){*pipe_argv=NULL;pipe_argv++;pipe(fds);break;}
pid = fork();
if(pid < 0){printf("fork error\n");exit(1);}
if(pid == 0){
if(in_fd!=0) dup2(in_fd,0);if(*pipe_argv) dup2(fds[1],1);
execve(argv[0],argv, NULL); perror(argv[0]); exit(1);
}
while(wait(&status) != pid);
if(*pipe_argv){close(fds[1]);execute(pipe_argv,fds[0]);close(fds[0]);}
}
>877は曜日ごとに宿題が出てるのか?
誰か>>714を解いてくれないかな・・・・。 どなたかお願いします。どうしてもうまくいきません。 助けてください~。
>>918 保存している形式が悪いので、データを読み込むのは難しいと思う。
920 :
デフォルトの名無しさん :03/12/14 13:32
このソースをコンパイルしてもちゃんと出力してくれません。 誰か助けてください。お願いします。 #include<stdio.h> typedef struct { char name[50]; }NAME; NAME pName = {"名前"}; typedef struct { char hobby[50]; }HOBBY; HOBBY pHobby = {"趣味"}; typedef struct { char *info; }INFO; void InfoOut(INFO *pInfoOut); void main(){ INFO pInfo; InfoOut(&pInfo); } void InfoOut(INFO *pInfoOut) { NAME *pName; HOBBY *pHobby; pName = (NAME *)pInfoOut->info; pHobby = (HOBBY *)pInfoOut->info; printf("%s\n", pName->name); printf("%s\n", pHobby->hobby); }
>>920 宿題か?
どういう出力を期待しているんだ?
摩訶不思議コード
前略 int main(){ printf("%s\n", pName.name); printf("%s\n", pHobby.hobby); return 0; } 出力するなら、これでいいじゃん。 ・・・変数名の付け方が変だけど。 ハンガリアンっぽいけど、NAME pName;とかつけてるし。
>>919 保存している形式が悪いですか・・・。
どういう風にかえればいいすか?
//
>>920 //つかさ、C++ならクラスで書こうよ
#include <stdio.h>
class chinge{
public:
char *ch_name;
char *ch_hoby;
chinge();
chinge(char* pname, char* phoby);
~chinge();
};
chinge::chinge(){ ch_name = NULL; ch_hoby = NULL;}
chinge::~chinge(){}
chinge::chinge(char *pname,char *phoby){
ch_name = pname;
ch_hoby = phoby;
}
int main(int argc, char* argv[]){
chinge *chin = new chinge("戦艦","大和");
printf("%s, %s\n", chin->ch_name, chin->ch_hoby);
return 0;
}
928 :
デフォルトの名無しさん :03/12/14 14:39
誰がCと言った?
誰が童貞だと言った?
誰がヒキーだと言った?
2つの正の整数を入力し、 「関数名(int a,int b,int *gcd,int *lcm)」という関数をつくり、 最大公約数と最小公倍数をもとめるプログラムを作ってください。
>>920 漏れはC+----言語かと思いマスタ。
>>932 スレ違いだが教えてくれ。
「超」「初心者」「以下」と名乗ることで何を期待しているんだ?
つーかそもそも、どんな意味に受け取られることを期待しているんだ?
937 :
デフォルトの名無しさん :03/12/14 19:03
1からn^2までの整数をn×nの西方に並べ、 どの行、どの列、どの対角線のn個の数も一定の値になるようにした魔方陣のプログラムを作成せよ。 ただし入力するnは奇数とする。 n=3の場合の魔方陣 8|1|6 3|5|7 4|9|2 よろしくお願いします。
とりあえず、年末までの宿題は片付いたって感じだね。 今度は冬休み明け前後とかがピークかな?
>>935 初心者な俺は Google 検索や
>>1 を読むなどの努力は行わないが
そんな初心者な俺に教えるのは当然だ(゚Д゚)ゴルァ
>>940 大体そういう暇つぶしプログラマさんは
その手のアルゴリズムは知り尽くしている・・・
理屈はわかるのですが、配列が苦手で…。 助けてください。
>>941 暇つぶしプログラマさん予備軍なら、興味をもつのではなかろーか。
「配列が苦手で」と言われたら、 ここのスレの人 配列を使わないプログラムを書く。 俺 書籍を渡し、「これに載ってる」
>>944 配列の宿題なので配列使ってプログラム作ってください。
「配列が苦手」なのは俺が馬鹿なだけですから。
>>945 「配列使ってプログラム作ってください」と言われたら、
ここのスレの人
超トリッキーな配列を使ったプログラムを書く。
>>946 最近はそんなにトリッキーではないような…
>>945 とりあえず初心者でもわかりやすい配列のプログラムにしてください。
とりあえず配列が苦手な初心者でも出来る、 新スレの作成頼みますわ>937
>俺が馬鹿なだけですから。 こーゆーヤツいるなぁ。 自分の立場は下ですという言い方のようでいて、 意味は「お前が俺に合わせろ」ですな。
新スレ(冬休みの宿題edition)を立ててくるか
結局俺の質問に答えてくれないのでしょうか?
>>954 ありがとうございます。
頑張ってください。お願いします。
958 :
デフォルトの名無しさん :03/12/14 22:12
時刻のデータを扱うための Time クラスを作成せよ。次の関数を使ってプログラムを完成させよ。 アクセス制御も行うこと。 // 時刻を表示する void print( const Time &a ) { cout << a.getHour() << ":" << a.getMinute() << ":" << a.getSecond() << "\n" ; } // 時刻 a から時刻 b までの経過時間を秒数で返す int keikaByousuu( const Time& a , const Time& b ) { return b.getTotalSeconds() - a.getTotalSeconds() ; } int main() { Time t1( 9 , 20 , 15 ) , t2 ; // 9時20分15秒 print( t1 ) ; t2.setHour( 12 ) ; t2.setMinute( 9 ) ; t2.setSecond( 59 ) ; print( t2 ) ; cout << "経過秒数:" << keikaByousuu( t1 , t2 ) << "\n" ; return 0 ; } まったく解りません・・・お願いします
>>958 んー、とりあえず、クラスに必要な要素を考えるわけだ。
class Time {
private:
int hour,minute,second; // 時刻を保持
public:
Time(int h,int m,int s); // コンストラクタ
// set
void setHour(int h);
void setMinute(int m);
void setSecound(int s);
// get
int getHour();
int getMinute();
int getSecound();
int getTotalSeconds(); //
}
>>960 どうもすみません。ありがとうございます。
ギッブス現象について簡潔に説明せよとの宿題が出ました。 ググッっても出てこないし。先生よろしくです!
963 :
デフォルトの名無しさん :03/12/14 22:46
964 :
デフォルトの名無しさん :03/12/14 22:46
それはC/C++の宿題なのかと
サンクスです! おかげで助かったよ。
967 :
デフォルトの名無しさん :03/12/15 00:41
C++でテキストファイルから数字を1文字ずつ読み込みたいのですが、 どうしたらよいですか? Cで書けばfscanf(infile, "%1d", i);と同じ事をしたいのですが。
968 :
デフォルトの名無しさん :03/12/15 00:47
969 :
デフォルトの名無しさん :03/12/15 00:49
970 :
デフォルトの名無しさん :03/12/15 00:56
>>968 ありがとうございます。
そのサイトによると、
>>整数に対して、抽出子は常に整数の全桁数を抽出
するらしいので、素直には出来ないみたいです。
もう少し色々探してみます。
fstream.get() で文字として読み込むというのは?
972 :
デフォルトの名無しさん :03/12/15 01:14
俺は、こんなんかと思った。
inputstream >> setw(1) >> i;
>>971 なるほど。
>>971 文字として読み込んで数字に直すしかありませんかねぇ。
ともあれありがとうございました。
>>972 setwは出力にしか作用しなかったと思うのですが。
間違ってたらすまそ。
その先どうあつかいたいのかにもよるから答えかねるなあ。 場合によっては一度 int で読み込んでから分割したっていいわけだし。 新しい多倍長桁整数の読み込みをやっているのなら 自分でデリミタ決めて単語単位でストリームからstringに読み込むのなら getline関数が使える。 一度char配列にファイルの中身全部読み込んでから 生のchar扱ってアナライズする必要があるなら vector<char> hoge( istreambuf_iterator<char>( fin ), istreambuf_iterator<char>( ), ); とかね。
ちなみにな。 本当に1文字読み込んでやるだけでいいのなら char型変数に読み込んでisdegit関数を呼んで判定すればいいだけだぞ。 scanf使わない場合のCと実質同じ低級な方法。 #もっとも整数以外についてどう処理するか。 たとえばどれを入力エラーとしどれをデリミタとするかなどで細かく分かれてしまう。 だからその先どうしたいかを聞いている。 典型的な処理ならたいてい標準ライブラリの高級な機能が使えるからな。
>>975 最近その事実知って反応したくてしかたないのか?
不満なら適当に括弧で囲ってね。
使ってるコンパイラによって避け方の程度も違うんだから。
vector<char> hoge(
(istreambuf_iterator<char>( fin ),)
istreambuf_iterator<char>( ),
); //GCC3用
とかいくつも羅列してしょうがない。
わかる奴はわかるんだからそれはこの方法を
質問者が採用してからでいいだろう。
突っ込まれる前に自分で訂正しとくか。
・・・つーか970過ぎで無駄なレスを増やすのは好まないんだが
カンマが括弧内に入ってしまってる。
正しくは
vector<char> hoge(
(istreambuf_iterator<char>( fin )),
istreambuf_iterator<char>( ),
);
ね。
無駄レスにならんよう一番信頼性の高い方法でも挙げとくか。
istreambuf_iterator<char> begin( fin );
istreambuf_iterator<char> end( );
vector<char> hoge( begin, end);
これ以上は
>>973 がまた現れたらだな
istreambuf_iterator<char> end; だな。もう駄目だ。俺が無駄レス付けまくり……逝ってくるっつーか寝るわ
ポインタの意味が全体的に分かりません…
もっと殺伐としないと,質問厨が付け上がるな。
985 :
デフォルトの名無しさん :03/12/15 16:53
二次元行列out[][]をタブ区切りでファイルに出力したいのですが、うまくいきません。 基礎的な質問ですみませんがよろしくお願いします。 for (i = 0; i < n; i++) { for (j = 0; j < m ; j++) { out[i][j] = pit[i][j]/sum[i][j]; fprintf(fpo,"%d",out[i][j]); fprintf(fpo,"%c",'\t'); } }
どう、上手くいかないのですか?
・コンパイルが出来ない →コンパイラが出すエラーを書く ・動作はするが、思い通りではない →期待する出力と実際の出力を書く
for (i = 0; i < n; i++) { for (j = 0; j < m ; j++) { out[i][j] = pit[i][j]/sum[i][j]; fprintf(fpo,"%d",out[i][j]); fprintf(fpo,"%c",'\t'); } fprintf(fpo, "\n"); }
989 :
デフォルトの名無しさん :03/12/15 17:44
ファイルに数字を書き込んで、その値をすべて画面に出力するプログラムをお願いします。 (例) 02 03 23 24 34 の値がすべてつながって出てくるようにしたいのです 今の状態だと、 printf("%d%d%d%d%d",02,03,23,24,34); とすると出力されますが、 作成しなくては、いけないのは printf("%d",a); として一つのまとまりとして出力したいのです。 お願いします。
990 :
デフォルトの名無しさん :03/12/15 17:52
ファイルを書き込んでその値を画面に出力するプログラムを教えてください。 処理の流れとしては、 aをファイルに繰り返し書き込みをして 4回繰り返したときaaaaを表示します よろしくお願いします。
ある数字aとしてやるならば、 char buf[1024]; int a[5]={2,3,23,24,34}; int i; sprintf(buf,"%02d",a[0]); // %の後に数字を書くと桁数指定、更に0をつけると空いた桁を0で埋める。 for(i=1;i<5;i++){ sprintf(buf,"%s%02d",buf,a[i]); } printf("%010d\n",atoi(buf)); printf("%s\n",buf); なお、0を先頭に書くと八進数なので、 ・010=10(8)=8(10) ・011=11(8)=9(10) となってイクナイ。
>>990 #include <stdio.h>
int main(void)
{
FILE *fp;
int i;
fp = fopen("hoge.txt", "w");
for(i = 0; i < 4; i++)
{
fputc('a', fp);
}
freopen("hoge.txt", "r", fp);
while( (i = getc(fp)) != EOF )
{
putchar( i);
}
fclose(fp);
return 0;
}
よくわからないけどこんなかんじ?
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=163 ↑のソースに、
1) 引数で指定したk番目の後ろにノードnを追加する関数insertを追加。
void insert(struct node *p, struct node *n, int k)
(2) (1)で追加されたソースコードの構造体nodeの構成を以下のように改良し、
改良された構造体nodeにあわせて、ノード追加や表示などの各関数の処理の修正をする。
struct node{
char name[30];
int age;
struct node *next;
(3) (2)で修正されたプログラムを、以下のような、名前と年齢がスペースで区切られて記述された
データファイルを読み込んでリストを作成するように改良する。
Takeshi 40
Mansei 38
Gikomonar 30
(4) 指定された年齢と一致するデータを全て表示する関数findallを再帰的呼び出しを用いて作成して追加
void findall(struct node *p, int age)
(5) n番目とm番目のノードを交換する関数exchangeを追加。
void exchange(struct node *p, int n, int m)
(6) n番目の後ろにあるノードを削除する関数removenodeを追加。
void removenode(struct node *p,int n)
(4~6は2や3で改良されたプログラムに追加していく。)
(´・ω・`) 1000
1000
(´-ω-`) 1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。