1 :
デフォルトの名無しさん :
03/05/27 00:43
2 :
デフォルトの名無しさん :03/05/27 00:46
2gett
4 :
デフォルトの名無しさん :03/05/27 00:59
>>1 おつです。
教えてください。
次レスのプログラムを参考にして
ファイルの最後から逆に単語を読み込んで
順次標準出力に出力させるプログラムを作成してください。
単語中の文字列の並びも反対になり、
一度ファイルの最初から読み込んで配列に格納したのち,
後ろから出力させるのは不可。
例:ファイルが次のようだとすると
sora kamo ai u_eda
次のような出力をするプログラムを書く。
ade_u ia omak aros
よろしくおねがいします。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<malloc.h> #define ON 1 #define OFF 2 #define MAXWORD 10 #define MAXWORDLEN 32 #define MAX 300 #define MemoryErr(where) fprintf(stderr,"Memory full in " #where "\n", where) int NowMaxSize;
ReadOneWord( FILE *Infile, char *word ) { char c; char StoreFlg; int i; i = 0; StoreFlg = OFF; while(( c = getc(Infile)) != EOF ) { if( c != ' ' ) { StoreFlg = ON; word[i++] = c; if( i >= MAXWORDLEN ) return 0; } else if( StoreFlg ) { word[i++] = '\0'; return 1; } } return EOF; }
int ReadWord( FILE *Infile, FILE *Outfile ) { int i, j, ran[MAX]; char **word; char oneword[MAXWORDLEN]; int wordlen, wordnum = 0; NowMaxSize = MAXWORD;
if( ( wordlen = ReadOneWord( Infile, oneword ) ) != EOF ) { if( !wordlen ) { fprintf( stderr, "Delimiters are not found...\n" ); } else { printf( " %s (%d) \n", oneword, wordlen-1 ); if( wordnum >= NowMaxSize ) { NowMaxSize += MAXWORD; if( ( word = ( char ** ) realloc( word, NowMaxSize * sizeof( char * ) ) ) = NULL ) { MemoryErr(3); exit(-1); } } if( ( word[wordnum] = ( char * ) calloc( wordlen, sizeof( char ) ) ) = NULL ) { MemoryErr(5); exit(-1); } strcpy( word[wordnum++], oneword ); } }
printf( " End of file \n" ); for( j = 0; j < MAX; j++ ) { ran[j] = 0; } for( j = 0; j <= wordnum; j++ ) { i = rand() % wordnum; if( ran[i] != ON ) { fprintf( Outfile, "\t word[%d] %s\n", i, word[i] ); ran[i] = ON; } } }
main( int argc, char *argv[] ) { FILE *Infile, *Outfile; if( ( Infile = fopen( argv[1], "r" ) ) == NULL ) { fprintf( stderr, "Can not open %s\n", argv[1] ); exit(0); } else if( ( Outfile = fopen( argv[2], "w" ) ) == NULL ) { fprintf( stderr, "Can not open %s\n", argv[2] ); exit(0); } ReadWord( Infile, Outfile ); fclose ( Infile ); fclose ( Outfile ); return (0); }
13 :
デフォルトの名無しさん :03/05/27 01:22
6代目の947で例えば3をいれると「1,2」と出力されますが、 3を入れると 「1,1,1」 「1,2」 「2,1」 「0,3」 と 出すにはどうすればいいのですか?
>>4 とりあえず、オレならこうする。
/* 全角空白が入ってるから、そのままコピペするなよ! */
#include <stdio.h>
int main( int argc, char **argv )
{
/* ***** 内部変数定義 ***** */
FILE *iFp;
int iCh;
int i;
if( argc==2 ) /* コマンドライン引数簡易チェック */
{
/* ***** 指定ファイルを開く ***** */
iFp = fopen( argv[1], "r" );
for( i=1; !fseek(iFp,-i,SEEK_END); i++ ) /* ファイルの終端から先頭までループ */
{
/* ***** 1文字読み出し表示 ***** */
iCh = fgetc( iFp );
putchar( iCh );
}
}
return 0;
}
すみませんが、前スレ948-949のプログラムを スタックからキューに直したプログラムもお願いします。
>>14 おお!早い!!
ありがとうございます。
ちなみにそのプログラムを参考にするプログラムのどのへんに
入れればいいんですか?
参考にするプログラムは単語ごとの順番をランダムに出力するのは
わかるのですが微妙に理解できていないので‥‥
17 :
何が悪いですか? :03/05/27 01:35
#include<stdio.h> void Hanoi(int n, char a, char b, char c); void moveDisk(int n, char a, char b); int main(){ int Nnm; char a,b,c; scanf("%d",&Num); Hanoi(Num,a,b,c); } void Hanoi(int n, char a, char b, char c) { if (n > 0) { hanoiTower(n-1, a, c, b); moveDisk(n, a, c); hanoiTower(n-1, b, a , c); } } void moveDisk(int n, char a, char b) { printf("No.%dのディスクを棒%cから棒%cに移動せよ。\n", n, a, b); }
>>16 正直、個人的には参考にしたくない。
しかし、学生の宿題だとそうもいかないのだろうな…。
ご愁傷様…。
>>17 頭。
取り敢えず関数名が間違っているのと変数名が間違っている。
つーか、エラーメッセージくらい読めるだろ?
>>18 そうっすか。。
ありがとうございました。
>>14 を参考にじっくり考えて見ます。
>>20 って言うか、
>>14 が全ソースだからな。
参考ソースのどこにも入れる必要性はないからな。
>>14 訂正
/* 全角空白が入ってるから、そのままコピペするなよ! */
#include <stdio.h>
int main( int argc, char **argv )
{
/* ***** 内部変数定義 ***** */
FILE *iFp;
int iCh;
int i;
if( argc==2 ) /* コマンドライン引数簡易チェック */
{
/* ***** 指定ファイルを開く ***** */
iFp = fopen( argv[1], "r" );
for( i=1; !fseek(iFp,-i,SEEK_END); i++ ) /* ファイルの終端から先頭までループ */
{
/* ***** 1文字読み出し表示 ***** */
iCh = fgetc( iFp );
putchar( iCh );
}
/* ***** ファイルを閉じる ***** */
fclose( iFp );
}
return 0;
}
24 :
何が悪いですか? :03/05/27 01:57
>>19 すみません。単なる打ち間違えです。それは愛嬌ということで。
これだと
…棒 から棒 へ…
の部分が空白で表示されちゃうんです。
>>9 俺ならこうするが・・・
#include <stdio.h>
void f(FILE *i){int c;if(EOF!=(c=getc(i))){f(i);putchar(c);}}
int main(void){f(stdin);return 0;}
>>17 >printf("No.%dのディスクを棒%cから棒%cに移動せよ。\n", n, a, b);
printf("No.%dのディスクを棒%dから棒%dに移動せよ。\n", n, a, b);
だろ?
>>25 せめてインデント付けて書けよ。(w
変な横着すんな。
>>17 Hanoi(Num, 'a', 'b', 'c');
>>26 利口そうでなんとやら。
main()をよく読め。
30 :
何が悪いですか? :03/05/27 02:06
>>15 void inserttail(struct node *p, ET x) {
struct node *tail = gettail(p);
insertafter(tail, x);
}
insertafterの代わりに使ってくれ。
そういやぁvoidも使ってねーな。
32 :
デフォルトの名無しさん :03/05/27 02:12
どなたかお願いします。 大学2年の基礎C言語の授業です。 @ 行列の掛け算を行います、行列aとbは4行4列とします。行列aの要素の値は、 各自決めたください。行列bは単位行列とします。 計算はマトリクスの積を使うと便利。 A 単制度実数型の配列を4行3列で宣言します。各要素の値は、行と列の和とします。例えば、 二行三列の場所は2+3=5とします。まず、配列を表示し、その後、配列に係数3を掛けます。 3倍された結果をはじめと同じように表示します。表示するときは、 小数点以下二桁まで表示します。 お願いします。 ぺこり。
33 :
何が悪いですか? :03/05/27 02:14
35 :
デフォルトの名無しさん :03/05/27 05:36
>>13 突っ込み所満載だが・・・
#include <stdio.h>
#include <string.h>
static char buf[1024];
static void foo( int rest, char* pos )
{
char tmp[16];
int i, len;
if( rest == 0 ){
*pos = NULL;
printf( "%s\n", buf );
return;
}
for( i = 1; i <= rest; i++ ){
sprintf( tmp, "%d,", i );
len = strlen( tmp );
strcpy( pos, tmp );
foo( rest - i, pos + len );
}
}
int main( void )
{
int max;
scanf( "%d", &max );
foo( max, buf );
return( 0 );
}
>>34 ああん、そのまま提出したらつっこまれるよう
トラップを色々仕掛けておいたのに、
ばらしちゃうんだもんなあw
しょぼいトラップはまだ残ってるけどw
>>32 > 計算はマトリクスの積を使うと便利。
この一文が謎で手を着けかねているのだが、
「行列の掛け算=マトリクスの積」
ではないの?
bが単位行列ならば、そしてaとbの積が普通の意味だったら 計算なんてしなくてもいいんじゃねぇか?
積って、内積なの?外積なの?
テンソル積でつ
単位行列を掛けるってことは、行列の掛け算の式が書けるかを問われてるのかな。 でなけりゃ行列 a を、そのまま表示すれば済んでしまうし。 確認がしやすいように単位行列か。 #include <stdio.h> int main() { int i,j; int a[4][4],b[4][4]; /*ここで行列 a を好きなように作ってくれ*/ /*単位行列 b の作成*/ for(i=0;i<4;i++) for(j=0;j<4;j++) { if(i-j) b[i][j]=0; else b[i][j]=1; } for(i=0;i<4;i++) { for(j=0;j<4;j++) { printf("%d ",a[i][0]*b[0][j] + a[i][1]*b[1][j] + a[i][2]*b[2][j] + a[i][3]*b[3][j]); } printf("\n"); } return 0; }
>>37 様
マトリクス計算とは、要は普通の行列計算のことです。
二つの整数値を読み込んで、共に正であれば、「共に正です。」と、 一つだけが正であれば、「一つが正です。」と、そうでなければ、 「共に正ではありません。」と表示するプログラムを作成せよ わからないので教えて下さい
>>43 if( a>=0 && b>=0 )
{
puts( "共に正です。" );
}
else
{
if( a>=0 || b>=0 )
{
puts( "一つが正です。" );
}
else
{
puts( "共に正ではありません。" );
}
}
>44様 どうかその上の部分も…!お願いします
>>45 int a,b;
scanf( "%d%d", &a, &b );
>46本当にありがとうございます!! あとは頑張ってみます!
48 :
デフォルトの名無しさん :03/05/27 16:16
50 :
デフォルトの名無しさん :03/05/27 16:45
二つの整数値を読み込んで、共に0であれば、「共に0です。」と、 一つだけが0であれば、「一つが0です。」と、そうでなければ、 「共に0ではありません。」と表示するプログラムを作成せよ わからないので教えて下さい
ヤレヤレ ┐(´ー`)┌ マイッタネ
>>50 こういうのでいいのかな
#include <stdio.h>
int main(void) {
int n, o;
printf("Input First Number:");
scanf("%d", &n);
printf("Input Second Number:");
scanf("%d", &o);
if (n==0 && o==0) printf("共に0です。\n");
else if (n==0 || o==0)printf("一つが0です。\n");
else printf("共に0ではありません。\n");
return 0;
}
このフィボナッチをdouble形に直してください。 お願いします。 なんか直したら普通よりも多くの計算が出来るらしいのですが。 #include<stdio.h> int fibonacci(int) ; int main() { int result, number; printf("整数を入力してください:"); scanf("%d", &number); result = fibonacci (number); printf("Fibonacci (%d) = %d\n", number, result); return 0; } int fibonacci (int n) { if (n == 0 || n == 1) { return n; } else { return fibonacci(n - 1) + fibonacci (n - 2); } }
↑ それと53の問題を再帰関数を使わないようにして 反復に書き直してみてください。 よろしくお願いします。
#include<stdio.h> double fibonacci(int) ; int main() { double result; int number; printf("整数を入力してください:"); scanf("%d", &number); result = fibonacci (number); printf("Fibonacci (%d) = %g\n", number, result); return 0; } double fibonacci (int n) { if (n == 0 || n == 1) { return n; } else { return fibonacci(n - 1) + fibonacci (n - 2); } } 非再帰版はどっかに転がってたと思う。このスレか前のスレにはなかった?
>>55 質問なんですがdouble型とint型の
フィボナッチの違いは何ですか?
このハノイの塔がうまく動かないです。 よろしくお願いします。 #include <stdio.h> void hanoi(int n, int x, int y, int z) { if (n<1) { return; } hanoi(n-1, x, z, y); printf("Move disc#%d from %d to %d.\n",n,x,z); hanoi(n-1, y, x, z); return; } int main() { int n; printf("Enter the number of discs: "); scanf("%d",&n); hanoi(n, 1, 2, 3); return 0; }
62 :
デフォルトの名無しさん :03/05/27 18:47
売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):1 今日の売上を入力してください. りんご:200、みかん:300、イチゴ:500、ナシ:800、イチヂク:250 <<本日までの売上>> りんご:200、みかん:300、イチゴ:500、ナシ:800、イチヂク:250 売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):1 今日の売上を入力してください. りんご:100、みかん:400、イチゴ:300、ナシ:100、イチヂク:0 <<本日までの売上>> りんご:300、みかん:700、イチゴ:800、ナシ:1600、イチヂク:250 売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):99 終了します.
という感じでお店の売り上げを計算するプログラムの課題がでました。 こんな感じでやってみましたが、どうもおかしいようで・・・ void main(void) { int account[5],i,input; initialize(account); printf("初期化を完了しました.\n"); while(1) { printf("売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):"); scanf("%d",&input); if(input==99) { printf("終了します\n"); break; } printf("本日の売上を入力してください.\n"); dairy_input(account); printf("<<本日までの売上>>\n"); dairy_output(account); }
initialize, dairy_input, dairy_outputを定義してプログラムを完成させよ って注意事項みたいなことが書かれてますが、どこがおかしいんでしょう? ご指摘お願いします。
dairy
その後、2問目として 支店ができ,合計で3店舗となった.3店分の売上を管理できるように プログラムを拡張したものも課題ででました。 こちらの条件は (1)3つのユーザ定義関数の定義は書き換えず,そのまま使用する. (2)データは下図のように各支店の売上を管理する配列を用意し,それぞれへのポインタを格納する配列を使って管理する. とかかれてます。1問目ができなくて困ってるのに・・・私ダメかも。。。
課題2と同じプログラムを以下のような別のアプローチで実装せよ. (1)データはポインタの配列ではなく,2次元の配列(accounts(店舗番号,商品番号)で管理する. (2)3つのユーザ定義関数を書き換え,店舗番号を引数として指定できるようにする.(例:dairy_input[店舗番号][商品番号])) これ3問目なのかな・・・どうしよ。。。すいません助けていただきたいです。。。
>>65 Dairy・・・っとー、ちょっと手直してみます。
69 :
デフォルトの名無しさん :03/05/27 18:58
クラス間の双方向関連ってC++ではどのように 実装したらいいんでしょうか...
両方で持つ
名答
>>62 とりあえず、「おかしい」とはどうおかしいのか書け
>>70 それはわかるんだけど...
簡単なサンプルソースつけてもらえないでしょうか?
void initialize(int account[]) { int i; for (i = 0; i < 5; i++) { account[i] = 0; } } void dairy_input(int account[]) { int i, p; printf("りんご:"); scanf("%d", &p); account[0] += p; printf("みかん:"); scanf("%d", &p); account[1] += p; printf("イチゴ:"); scanf("%d", &p); account[2] += p; printf("ナシ:"); scanf("%d", &p); account[3] += p; printf("イチヂク:"); scanf("%d", &p); account[4] += p; } void dairy_output(int account[]) { printf("りんご:%d, みかん:%d, イチゴ:%d, ナシ:%d, イチヂク:%d\n\n", account[0], account[1], account[2], account[3], account[4]); }
うわ〜、int p;か〜
何がおかしいのかわかった。
ナシの売上が 800+100=1600 になってることだな。
合ってるか?
>>62
>>69 何がわからないのか良くわからないです。
面倒な部分ははしょってるけど、↓みたいなのでいいですか?
誤解してたらごめん。
//a.hの内容
#if まだ定義してなかったr
#include "b.h"
class b;
class a {
//................
b* pBOject;
}
#endif
//b.hの内容
#if まだ定義してなかたら、
#include "a.h"
class a;
class b {
//..................
a* pAObject;
}
#endif
どなたかAもおねがいします。
#include <stdio.h> int main(void) { float a[4][3]; int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 3; j++) { a[i][j] = i + j + 2; printf("%5.2f ", a[i][j]); } printf("\n"); } printf("\n"); for (i = 0; i < 4; i++) { for (j = 0; j < 3; j++) { a[i][j] *= 3; printf("%5.2f ", a[i][j]); } printf("\n"); } return 0; }
80 :
デフォルトの名無しさん :03/05/27 21:00
パスカルの三角形を表示させるプログラムを教えてください。 ピラミッドにしなくてもOKです。
82 :
デフォルトの名無しさん :03/05/27 21:24
あれはピラミッドだけでパスカルとは関係ないと 思ったんですが・・
83 :
デフォルトの名無しさん :03/05/27 21:38
どなたかおねがいします! 当方大学二年生、今週あたりからプロミングの授業が始まったのですが、教官が まったく教えることをしないで次の課題をだしてくれました。 100〜999の間の数で「奇数」かつ「各桁の数の和が20」であるものをすべて書き出す プログラムを組め。 というものなんです。 どうかおねがいします
>>83 #include <iostream>
main()
{
for(int i=101; i<=999; i+=2)
{
if(i/100+(i%100)/10+(i%10) == 20)
std::cout << i << std::endl;
}
return 0;
}
85 :
デフォルトの名無しさん :03/05/27 21:45
あるアドレスにファイルネームが格納されてるんですけど、そのアドレスを char *fnameと定義されたfnameに格納する。そうするとfnameがその ファイルネーム(文字列)のアドレスをさしますよね。 それで実際に例えばファイルネームがc:\abcd.txtだったとして画面にはabcd と表示したいんだけどどうすればいいでしょうか?
int ic; for (ic = 100; ic <= 999; ic++) { if (ic % 2 == 1 && ic / 100 + ic / 10 % 10 + ic % 10 == 20) { printf("%d\n", ic); } }
>>85 printf("%.4s\n", strchr(fname, '\\'));
>>83 #include <stdio.h>
int main()
{
puts( "299 389 497 479 587 569 695 677 659 785 767 749 893 875 857 839 983 965 947 929" );
return 0;
}
じゃねぇ、 printf("%.4s\n", strchr(fname, '\\') + 1); だ。
90 :
デフォルトの名無しさん :03/05/27 23:09
>>89 strchrが文字列の先頭から任意の文字アドレスを検索するってのはわかりました。
'\\'部分と+1ってのがわかりません。よかったら解説お願いします。
書き忘れましたがstrchr関数を使わない方法はどうなりますか?
適当に入力された三つの数がある。 その三つの数字には、共通の約数があるかどうかを調べよ。 どうかよろしくお願いします。
>>92 int gcd(int x, int y)
{
int z;
if (y)
while ((z = x % y)) {
x = y;
y = z;
}
return abs(y);
}
int a, b, c;
if (gcd(gcd(a, b), c) > 1)
2分木探索のdelete関数はどのようなプログラムになるか教えて下さい。 4つの場合(削除したいデータが葉に置かれているとき、削除したいデータが置かれているノードが一人子を持つとき、 削除したいデータの置かれているノードが子を二人持つとき←2パターンある)にわけて削除するということはわかっているのですが。 後ポインタのポインタも使うみたいです。 宜しくお願いします。
とりあえず、初心者に言いたいのだが、 いきなりコードを書くことを考えずに、 まず、どんな処理をすればよいか日本語で考えてみれ! 箇条書きでも何でもいいから、日本語でやるべき事を書けば、 後はその一つ一つをどうやって実現するか?を考えていけばいい。
一応考えたのですが、その方法としては、 3つの数字を一つずつyakusuu();関数にいれ、 forを使って初めの約数を戻り値とするようにしたのですが、 それだと6、9、12では 共通の約数3があるのに私の考えた方法では2、3、2となってしまい一致せずだめ、となってしまわけです。 日本語が激しくわかりにくくてすいません。
>>97 まず、自分がその「共通する約数」が在るかないかを判定する時、
頭の中でどの様に判定しているか考えてみ。
とりあえず、値は例として「6、9、12」でも使ってな。
scanf("%d %d %d", &a[0], &a[1], &a[2]); for (i = 2; i <= a[0]; i++) { if ((a[0] % i == 0) && (a[1] % i == 0) && (a[2] % i == 0)) { printf("common divisor found.\n"); return 0; } } printf("common divisor not found.\n"); return 0; 一応貼るけど ループ抜ける判定が不十分です そこは自分でやって
>>90 > printf("%.4s\n", strchr(fname, '\\') + 1);
strchr(fname, '\\')はc:\abcd.txtの\(を差すポインタ)を返す。
それに+1することはその次の文字、即ちaを差す。
よって、printf()にはa(の場所)が渡されるわけだ。
>>80 「パスカルの三角形 C言語」でぐぐれば一発
>>85 >>91 fname からフォルダ名と拡張子を取って表示する
#include <stdio.h>
int main()
{
const char* fname = "a:\\X.Y.Z\\abcd.txt.bak";
char *begin, *end;
for (begin = end = (char *)fname; *end; ++end)
if (*end == '\\')
begin = end + 1;
for (end = begin; *end && *end != '.'; ++end);
printf("%.*s\n", end - begin, begin);
return 0;
}
strchr と strrchr を使って書けば、↑の2個のfor文がこう↓なる
if ((begin = strrchr(fname, '\\')) == NULL)
begin = (char *)fname;
else
begin++;
if ((end = strchr(begin, '.')) == NULL)
end = (char *)fname + strlen(fname);
あ、マジだ
出力ファイル名をコマンドラインの第一引数で受け取り、 何らかのデータを出力ファイルに格納するという宿題がでました。 出力ファイル名は12文字以内のフリーフォーマットとします。 考えてるんですが、どう考えていいかさえもわからず悩んでます。 どうかソースをよろしくお願いします。
106 :
デフォルトの名無しさん :03/05/28 02:12
無限級数ってどのような関数を使えばよいのでしょうか?
#include <stdio.h> int main(int argc, char *argv[]) { FILE *out; out = fopen(argv[1], "w"); fprintf(out, "Hello world!\n"); fclose(out); return 0; } エラーチェックなし
>>105 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
FILE* fp;
if (argc != 2) {
printf("usage: %s filename\n", argv[0]);
exit(1);
}
if (strlen(argv[1]) > 12) {
printf("%s: %s is too long\n", argv[0], argv[1]);
exit(1);
}
if ((fp = fopen(argv[1], "w")) == NULL) {
perror(argv[1]);
exit(1);
}
fprintf(fp, "output filename: %s\n", argv[1]);
fclose(fp);
return 0;
}
108さん、109さん ありがとうございます。 これでコンパイルかけてみます。
>>106 適当な関数空間に写像して陽に計算してしまうか
各項の上界が指数的に減少するなどの知識を使って適当な収束判定
三角関数をテイラー展開したものなんですが どうやって足し算していくのか分かりません
テイラー展開によりcosxの値を計算するプログラム 要はこの問題が分からないんです。絶対値が10^(-15)で計算するのですが どうやればよいのでしょうか?
これで合ってる?
>>106 #include <stdio.h>
#include <float.h>
#include <math.h>
double cos_Maclaurin(unsigned k, double x)
{
unsigned n = 2 * k;
double r = 1;
for (; n > 0; --n)
r *= x / n;
if (k % 2)
r *= -1;
return r;
}
double sum_infinite(double (*func)(unsigned, double), double x)
{
unsigned n;
double r = 0, rr = 1;
for (n = 0; r != rr; ++n) {
rr = r;
r += func(n, x);
}
return r;
}
int main()
{
double x = -0.23;
printf("cos(%21.14e) = %21.14e (%21.14e)\n",
x, sum_infinite(cos_Maclaurin, x), cos(x));
return 0;
}
とりあえず初心者でない人に言いたいのだが、このスレは C言語を1年ばかり勉強してきたがいまいち実力に不安がある人が 初心者向けの問題をいかに早く解けるを確認することによってカタ ルシスを得る為にあるわけで、初心者に何かアドバイスするスレと いうわけでもないので、その点誤解無いように。
117 :
デフォルトの名無しさん :03/05/28 06:26
文字列の行と整数の行が混在しているファイルから 整数だけを読み取って表示するにはどうすればいいのですか?
isnumber
宿題がわかりません。教えてください。 問題1、複利の利率xと単利の利率yで元金vをn年預けた場合、複利の元利合計w1が 単利の元利合計w2の2倍を超えるのは、何年後か。変数の型は、これまで通りとせよ。 ただし、y>xとする。
自分でやってみたものは、 /*利率*/ #include <stdio.h> #include <math.h> void main(void) { int x1,x2; double y1,y2; int z,i; double w1,w2; printf("元金、利率の順に2組、一行ずつ入力してください。\n"); scanf("%ld,%lf",&x1,&y1); scanf("%ld,%lf",&x2,&y2); z=w1/w2; for(z=1;z>=2;z++); w1=x1*pow((1.0+y2/100.),z*1.0); w2=x2*pow((1.0+y2/100.),z*1.0); {printf("%d年目に超えました",z); } という感じになりましたけど、うまく出来ないです。 複利と単利の式がうまくかけてないです。 for文を使わないといけないようです。
問題2、クラスの試験の平均点を求めるプログラムを作成せよ。 クラスを識別する学生コード 1101 1年1組の出席簿1番の学生 2315 2年3組の出席簿15番の学生 2年生の3クラスを対象とする。 試験科目は、英語 データの投入は、学生コード、英語の順。
>>121 #include <stdio.h>
#include <ctype.h>
#define NCLASS 100
typedef struct {
unsigned grade, class, number, score;
} DATUM;
int parse(char* s, DATUM* d)
{
while (isspace(*s)) s++;
if (!isdigit(*s)) goto error;
d->grade = *s++ - '0';
if (!isdigit(*s)) goto error;
d->class = *s++ - '0';
if (!isdigit(*s)) goto error;
d->number = *s++ - '0';
if (!isdigit(*s)) goto error;
d->number = d->number * 10 + *s++ - '0';
while (isspace(*s)) s++;
if (!isdigit(*s)) goto error;
d->score = 0;
while (isdigit(*s))
d->score = d->score * 10 + *s++ - '0';
if (!isspace(*s)) goto error;
return 0;
error:
return -1;
}
int main() { DATUM d; double sum[NCLASS] = {}; unsigned num[NCLASS] = {}, lineno = 0; int i; char buf[BUFSIZ]; while (fgets(buf, sizeof buf, stdin) != NULL) { lineno++; if (!parse(buf, &d)) { if (d.grade && d.class && d.number) { sum[d.grade * 10 + d.class] += d.score; num[d.grade * 10 + d.class]++; } else printf("line %d: invalid datum\n", lineno); } else printf("line %d: invalid format\n", lineno); } for (i = 0; i < NCLASS; i++) if (num[i]) printf("%d年%d組 %2d人 平均 %.2f点\n", i / 10, i % 10, num[i], sum[i] / num[i]); return 0; }
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
>>119 金額計算という事で、俺は元利合計を int 型にしたけど気に入らなかったら double 型に戻して。
#include <stdio.h>
int main()
{
int principal,i,w1,w2;
double simple,compound;
printf("元金を入力。\n>");
scanf("%d",&principal);
printf("単利を入力。\n>");
scanf("%lf",&simple);
printf("複利を入力。\n>");
scanf("%lf",&compound);
w1=w2=principal;
for(i=1;w2<w1*2;i++)
{
w1+=(int)(principal*simple);
w2+=(int)(w2*compound);
if(!(int)(w2*compound))
{
printf("超えることはありません。\n");
return 0;
}
}
printf("%d 年後に2倍を超えました。\n",i);
return 0;
}
あと、実数型でやるなら元金の入力はなくてもいいかな。 #include <stdio.h> int main() { int i; double simple,compound,w1=1.0,w2=1.0; printf("単利を入力。\n>"); scanf("%lf",&simple); printf("複利を入力。\n>"); scanf("%lf",&compound); for(i=0;w2<w1*2;i++) { w1+=1*simple; w2+=w2*compound; } printf("%d 年後に2倍を超えました。\n",i); return 0; }
isnumberだって(≧∇≦)ぶぁっはっはっ!!
宿題が意味不明。説明してくれない教授に凹んでます。ヨロシク。 「五行五列の行列AとBを加えた行列Cを求めるプログラムを作成せよ。 又、Aは先に定義し、Bはキーボード入力、Cは標準出力とする。」 ループがどうとかこうとか…ポインタを使う場合と使わない場合を作るとか言う話でした
>>129 ポインタ云々はよーわからん
#include <stdio.h>
#define NROW 5
#define NCOLUMN 5
void print_matrix(float m[NROW][NCOLUMN]) {
int i, j;
for (i = 0; i < NROW; i++) {
for (j = 0; j < NCOLUMN; j++) {
printf("%7.2f", m[i][j]);
if (j < NCOLUMN - 1)
putchar(' ');
}
putchar('\n');
}
}
int main() {
float m_A[NROW][NCOLUMN] = {
{ 1, 0, 0, 0, 0, }, { 0, 1, 0, 0, 0, }, { 0, 0, 1, 0, 0, },
{ 0, 0, 0, 1, 0, }, { 0, 0, 0, 0, 1, }, };
float m_B[NROW][NCOLUMN], m_C[NROW][NCOLUMN];
int i, j;
for (i = 0; i < NROW; i++)
for (j = 0; j < NCOLUMN; j++) {
printf("B[%d][%d] = ", i, j);
scanf("%f", &m_B[i][j]);
m_C[i][j] = m_A[i][j] + m_B[i][j];
}
print_matrix(m_C);
return 0;
}
こんな実行例のプログラムをつくってもらえないでしょうか? (実行例) 初期化を完了しました. 売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):1 今日の売上を入力してください. りんご:200みかん:300イチゴ:500ナシ:800イチヂク:250 <<本日までの売上>> りんご:200みかん:300イチゴ:500ナシ:800イチヂク:250 売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):1 今日の売上を入力してください. りんご:100みかん:400イチゴ:300ナシ:100イチヂク:0 <<本日までの売上>> りんご:300みかん:700イチゴ:800ナシ:1600イチヂク:250 売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):99 終了します.
int main() { puts("初期化を完了しました. " "売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):1 \n" "今日の売上を入力してください. \n" "りんご:200みかん:300イチゴ:500ナシ:800イチヂク:250 \n" "<<本日までの売上>> \n" "りんご:200みかん:300イチゴ:500ナシ:800イチヂク:250 \n" "売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):1 \n" "今日の売上を入力してください. \n" "りんご:100みかん:400イチゴ:300ナシ:100イチヂク:0 \n" "<<本日までの売上>> \n" "りんご:300みかん:700イチゴ:800ナシ:1600イチヂク:250 \n" "売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):99 \n" "終了します. "); return 0; }
なぜこの2つは出力結果が違うのか教えて下さい。 プログラムA #include<stdio.h> int prog1(int a, int b){ a=a+10 b=b+20; return a*b; } int main(){ int a=10,b=20,c; c=prog1(a,b); printf("a=%d b=%d c=%d\n",a,b,c); return 0; } a=10 b=20 c=800 プログラムB #include<stdio.h> int prog1(int *a, int *b){ *a=*a+10; *b=*b+20; return *a**b; } int main(){ int a=10,b=20,c; c=prog1(&a,&b); printf("a=%d b=%d c=%d\n",a,b,c); return 0; } a=20 b=40 c=800 すみませんが、どうかよろしくお願いします!!!
>>131 ありがとうございます
すべてint型で、という文章が注釈にありました。
このままのプログラムで問題ないですかね?
>>135 ネタでないなら、多分説明しても理解できないと思う。
>>135 プログラムAの関数prog1のa,bは、mainのa,bとは別の変数。
関数呼び出し時に、mainのa,bの値がコピーされている。
別の変数なので、prog1のa,bに変更をくわえても、mainのa,bは変化しない。
プログラムBの関数prog1のa,bはポインタ。
関数呼び出し時に、mainのa,bのアドレスがコピーされる。
*演算子を付けた、*a,*bはmainの変数a,bそのものなので、
それに変更をくわえるということは、mainのa,bに変更をくわえることを意味する。
こんな感じでどう?
はい、そうです。どうかお願い致します。
>>136 問題あり。
全てのfloatをintに、printf,scanfのフォーマットを%dに変更せよ。
>>132 ネタじゃ無かったらマジレスしてやりたいんだがなぁ。
実行例だけじゃなくて、ちゃんと設問を書き写せ。
つか
> りんご:200みかん:300イチゴ:500ナシ:800イチヂク:250
ここ、ちょっと難しいんだよね。
( マルチバイト文字で文字列解析が必要なので )
#include <stdio.h> #define NROW 5 #define NCOLUMN 5 void print_matrix(int m[NROW][NCOLUMN]) { int i, j; for (i = 0; i < NROW; i++) { for (j = 0; j < NCOLUMN; j++) { printf("%d", m[i][j]); if (j < NCOLUMN - 1) putchar(' '); } putchar('\n'); } } int main() { int m_A[NROW][NCOLUMN] = { { 1, 0, 0, 0, 0, }, { 0, 1, 0, 0, 0, }, { 0, 0, 1, 0, 0, }, { 0, 0, 0, 1, 0, }, { 0, 0, 0, 0, 1, }, }; int m_B[NROW][NCOLUMN], m_C[NROW][NCOLUMN]; int i, j; for (i = 0; i < NROW; i++) for (j = 0; j < NCOLUMN; j++) { printf("B[%d][%d] = ", i, j); scanf("%d", &m_B[i][j]); m_C[i][j] = m_A[i][j] + m_B[i][j]; } print_matrix(m_C); return 0; } これでOKですか?
>>132 #include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char str[5][9]={"りんご","みかん","イチゴ","ナシ","イチジク"};
int uriage[5]={0};
char s[BUFSIZ];
int num,i;
for(;;)
{
printf("売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):");
gets(s);num=atoi(s);
if(num==1)
{
puts("今日の売上を入力してください.");
for(i=0;i<5;i++){printf("%s:",str[i]);gets(s);uriage[i]+=atoi(s);}
}
else if(num==99)break;
printf("本日までの売上は");
for(i=0;i<5;i++)printf("%s:%d ",str[i],uriage[i]);puts("");
}
return 0;
}
下記のプログラムを要素が降順で並んでいるlong型の配列からの探索をbsearch関数を 用いて行うプログラムを作成して欲しいのです。 よろしくお願いします。
/* bsearch関数を利用して要素を探索 */ #include <stdio.h> #include <stdlib.h> /*--- 整数を比較する関数 ---*/ int int_cmp(const int *a, const int *b) { if (*a < *b) return (-1); else if (*a > *b) return (1); else return (0); }
int main(void) { int i, ky, *p; int x[7]; int nx = sizeof(x) / sizeof(x[0]); printf("%d個の整数を昇順に入力してください。\n", nx); printf("x[0]:"); scanf("%d", &x[0]); for (i = 1; i < nx; i++) { do { printf("x[%d]:", i); scanf("%d", &x[i]); } while (x[i] < x[i - 1]);/* 一つ前の値よりも小さければ再入力 */ } printf("探す値:"); scanf("%d", &ky); p = bsearch(&ky,/* 探索値へのポインタ */ x,/* 配列 */ nx,/* 要素数 */ sizeof(int),/* 要素の大きさ */ (int (*)(const void *, const void *))int_cmp/* 比較関数 */ ); if (p == NULL) puts("探索に失敗しました。"); else printf("%dは%d番目にあります。\n", ky, (int)(p - &x[0]) + 1); return (0); } 以上です。期待しています。
150 :
デフォルトの名無しさん :03/05/28 20:47
選択ソートのプログラムで標準入力から最大100個までの配列データを 読み込んで小さい順にソートし、結果を出力するプログラムを作る。 作ってはみたんですが、例えば50個のデータをソートすることが出来ませ ん。どうすればいいんですか?
>>147 @@ -8,9 +8,9 @@
/*--- 整数を比較する関数 ---*/
int int_cmp(const int *a, const int *b)
{
- if (*a < *b)
+ if (*a > *b)
return (-1);
- else if (*a > *b)
+ else if (*a < *b)
return (1);
else
return (0);
@@ -21,14 +21,14 @@
int i, ky, *p;
int x[7];
int nx = sizeof(x) / sizeof(x[0]);
- printf("%d個の整数を昇順に入力してください。\n", nx);
+ printf("%d個の整数を降順に入力してください。\n", nx);
printf("x[0]:");
scanf("%d", &x[0]);
for (i = 1; i < nx; i++) {
do {
printf("x[%d]:", i);
scanf("%d", &x[i]);
- } while (x[i] < x[i - 1]);/* 一つ前の値よりも小さければ再入力 */
+ } while (x[i] > x[i - 1]);/* 一つ前の値よりも大きければ再入力 */
}
printf("探す値:");
scanf("%d", &ky);
indent消えてわかりにくい。 頭に-の付いた行を+の行と置換すれ。
153 :
デフォルトの名無しさん :03/05/28 20:50
>>150 ちなみに最初に要素の個数を指定することはできません。
155 :
デフォルトの名無しさん :03/05/28 20:56
>151さん、お返事ありがとうございます。 インデントの件ですが、改行を削除する際に消してしまいすいません。 改行が多いと投稿が出来ないので・・・・。 さっそくコンパイルして実行してみました。 エラーも起きることなく上手くいっているみたいですが、 long型で宣言などしなくても大丈夫なのですか? 問題文にはlong型の配列から・・・・とあるので心配です。 intをLongに置き換えるだけでいいのですか? お時間がありましたら改良をよろしくお願いします。
157 :
名無し募集中。。。 :03/05/28 21:09
1/1-1/sqrt(2)+1/sqrt(3)-1/sqrt(4)..のnまでの和を計算するプログラムたのんますm(__)m
>>156 問題のlongを読み飛ばしてた。
iと関数の戻り値以外のintを全部longに、
longを受ける%dを%ldに変えれ。
>151さま、出来たらその箇所を教えてもらえませんか? 全部置き換えてもいいのならそうします(笑)。 よろしくお願いします。
>>157 #include <stdio.h>
#include <math.h>
int main() {
int i, n = 100, sign = -1;
double x = 1;
for (i = 2; i <= n; i++) {
x += sign / sqrt(i);
sign *= -1;
}
printf("%g\n", x);
return 0;
}
>147を完全にしてくれる方はいませんか? int型なのをlong型にしてもらえるだけで結構です。 急いでいます。よろしくお願いします。
>>160 べりーありがとうございましたm(__)m
エディタの置換機能をつかってintをlongに%dを%ldに置き換える。
prlongf
バイオリズムで、身体・感情・知性が誕生日からそれぞれ周期23日・28日・33日の正弦波に従うとするとき、今日の日付と生年月日を入力したら、身体・感情・知性それぞれの次の要注意日 (正弦波がx軸と交差する日)を出力するプログラムを作りなさい。 ヒント:まず今日の日付をy/m/dの形式で入力したとき、今日が今年の何日 めか計算する(関数timeを用いる)。同様に生年月日を入力したとき、その年 の元旦から何日目に当たるかを計算し、うるう年(4で割り切れ、かつ100 では割り切れない年だが、400で割り切れる場合はうるう年とする)を考慮 し、365日または366日から引くことによって、誕生日からその年の年末 までの日数を計算する。そして、例えば身体であれば、それを23で割った剰 余を出し、その剰余が23/2より大きければ23から引き、23/2以下であ れば23/2から引くと次のよう注意日までの日数が求まる。 お願いします
>>165 今日の日付を入力する必要性が感じられないのですが
163さん、無理です。コンパイルエラーがでます(涙)。
>>165 やれるところからやるべし、
うるう年判定関数 うるう年なら戻り値1, 平年なら戻り値0
int uru(int year)
{
if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
return 1;
} else {
return 0;
}
}
2分木探索のdelete関数「int BSTdelete(keyType a_key)」のプログラムを教えて下さい。
170 :
デフォルトの名無しさん :03/05/29 00:06
#include<stdio.h> #define N 100 main(){ int i,j,min,x[N]; for(i=0;i<N;i++) scanf("%d",&x[i]); for(i=0;i<N-1;i++){ for(j=i+1;j<N;j++){ if(x[i]>x[j]){ min=x[i]; x[i]=x[j]; x[j]=min; } } } for(i=0;i<N;i++) printf(" %d ",x[i]); printf("\n"); } これを改良してデータ数が100未満でも動くようにして下さい。
>>171 #include<stdio.h>
#define N 99
main(){
int i,j,min,x[N];
for(i=0;i<N;i++)
scanf("%d",&x[i]);
for(i=0;i<N-1;i++){
for(j=i+1;j<N;j++){
if(x[i]>x[j]){
min=x[i];
x[i]=x[j];
x[j]=min;
}
}
}
for(i=0;i<N;i++)
printf(" %d ",x[i]);
printf("\n");
}
>>169 >>94 と同一人物?
あと前スレでリスト構造のinsert、deleteを作ってくれっていってた人?
いきなり
>>169 の書き込みだけじゃ情報が少なすぎるんだけど…
>>169 何でBSTdeleteだけなんだ?
BSTinsertとかはなくていいの?
リストのときにあったnodeType構造体はどういう定義なの?
>>170 戻ってきたな。
>>150 でいってたプログラムを貼り付けたんだね。
標準入力からいくつデータが入るかをプログラムに教えなければならない。
その情報がない。
例えば標準入力で個数をしていするとか、
EOFを検出したとこまで、有効なデータの個数とか。
適当に作ってくれというんならそれでもいいし。
訳のわからない課題が出されました 「C言語を使ってサインカーブ(sin(x))の模様を書け」 * * * * * * * * * * * * * * * 関数(<math.h>を使った式計算のプログラム)に 入ったばかりなのにいきなりです。もうお手上げです。 もちろんprintf(" *\n *\n......なんてのはだめです
177 :
デフォルトの名無しさん :03/05/29 01:24
あれ、模様がうまくかけないな
やっぱりいいです
181 :
ためしてないけど、こんな感じ :03/05/29 01:39
>>176 for( 角度 = 0°; 角度 < 360°;角度 += 10°)
{
printf("%*s*", sin( 角度→弧度(角度) ) * 幅 + 幅/2 ) ;
}
ちと、まちがてる・・・
配列でプリントするぽい
>>176 #include <stdio.h>
#include <math.h>
#define RAZIAN(KAKUDO) 3.141592/(180/KAKUDO)
int main(void)
{
int i,n;
double sinNum[73];
for(i=0;i<=72;i++)
sinNum[i]=sin(RAZIAN((double)(i*5)));
for(i=10;i>=-10;i--)
{
for(n=0;n<=72;n++)
if(sinNum[n]>=(double)i/10-0.05&&sinNum[n]<(double)i/10+0.05)printf("*");
else if(i==0)printf("-");
else printf(" ");
puts("");
}
return 0;
}
RAZIAN
RAZIAN・・・
187 :
デフォルトの名無しさん :03/05/29 02:32
前スレの953で重複は認めます。 ちなみに問題は 和が一定となるような自然数の列を列挙するプログラムを作成せよ です
被った・・・
ラズィアン
>>165 #include <stdio.h>
#include <time.h>
#define MONSPERYEAR 12
#define SECSPERMIN 60
#define MINSPERHOUR 60
#define HOURSPERDAY 24
#define DAYSPERNYEAR 365
#define DAYSPERLYEAR 366
#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY)
#define TM_YEAR_BASE 1900
#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
static const int mon_lengths[2][MONSPERYEAR] = {
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
};
static const int year_lengths[2] = {
DAYSPERNYEAR, DAYSPERLYEAR
};
#define BIORHYTHMS 3 static const int bio_cycles[BIORHYTHMS] = { 23, 28, 33 }; static const char* bio_types[BIORHYTHMS] = { "身体", "感情", "知性" }; int daysbetween(int y, int m, int d, struct tm* tm) { int yt = tm->tm_year + TM_YEAR_BASE; for (--m; m < MONSPERYEAR; ++m) d -= mon_lengths[isleap(y)][m]; for (++y; y < yt; ++y) d -= year_lengths[isleap(y)]; d -= tm->tm_yday + 1; return -d; }
int main() { int y, m, d, days, i; time_t t, tx; struct tm tm; char buf[BUFSIZ]; if (fputs("生年月日を入力してください: ", stdout) != EOF && fgets(buf, sizeof buf, stdin) != NULL && sscanf(buf, "%d/%d/%d", &y, &m, &d) == 3 && 1 < m && m < MONSPERYEAR && 1 < d && d < mon_lengths[isleap(y)][m]) { time(&t); localtime_r(&t, &tm); days = daysbetween(y, m, d, &tm); printf("今日は生まれてから %d 日目\n", days); for (i = 0; i < BIORHYTHMS; ++i) { tx = t + SECSPERDAY * ((bio_cycles[i] - days % bio_cycles[i]) % (int)((bio_cycles[i] + 1) / 2)); localtime_r(&tx, &tm); printf("次の%sの要注意日: %d/%02d/%02d\n", bio_types[i], tm.tm_year + TM_YEAR_BASE, tm.tm_mon + 1, tm.tm_mday); } } return 0; }
>>193 の10行目11行目を以下のように修正してください。
1 <= m && m <= MONSPERYEAR &&
1 <= d && d <= mon_lengths[isleap(y)][m - 1]) {
>>165 今日の日付を聞かないのを作ってしまいました。
>>194 中学の時、中学のLVがあれば、わざわざ中卒でない。
>>187 #include <stdio.h>
#define KOU_SUU 5//項の数
#define HENIKI 5//それぞれが0~HENIKIの値をとりうる 0が自然数でない派はnum[]を1で初期化して、num[i]=0をnum[i]=1に直す
#define WA 10//表示する和
int main(void)
{
int num[KOU_SUU]={0},i,goukei,show=0;
for(;num[KOU_SUU-1]<=HENIKI;)
{
for(i=KOU_SUU-1,goukei=0;i>=0;i--)goukei+=num[i];
if(goukei==WA)
{
for(i=KOU_SUU-1;i>=0;i--){printf("%d",num[i]);if(i)printf("+");else printf("=");}
printf("%d\n",WA);show++;
if((show%20)==0)getchar();
}
num[0]++;
for(i=0;i<=KOU_SUU-2;i++)
if(num[i]>HENIKI){num[i]=0;num[i+1]++;}
}
return 0;
}
伝えようとしてたことは分かったんですね。実行したらちゃんとsin(x)の模様ができました。 でもsin(x)をsin(x-3)pi/5に置き換えて、縦書きにつまり * * * * * * * * * * * * * このようにS字にするにはどうすればいいんですか?
>>198 置き換えるのは分からんけど、縦書きはこう。
#include <stdio.h>
#include <math.h>
#define RAZIAN(KAKUDO) 3.141592/(180/KAKUDO)
int main(void)
{
int i,n,sinNum;
for(i=0;i<=20;i++)
{
sinNum=(int)(sin(RAZIAN((double)(i*18)))*100);
for(n=-100;n<=100;n+=5)
if(n-2<=sinNum&&n+2>=sinNum)printf("*");
else if(n==0)printf("|");
else printf(" ");
puts("");
}
return 0;
}
アドバイスの甲斐あってやっと完璧にできました。
ヒント(もう答え同然かもしれませんけど)くださった
>>184 さん、
>>199 さん。
ありがとうございます。
>>165 ちゃんと今日の日付を聞くようにしました。
#include <stdio.h>
#include <time.h>
#define MONSPERYEAR 12
#define SECSPERMIN 60
#define MINSPERHOUR 60
#define HOURSPERDAY 24
#define DAYSPERNYEAR 365
#define DAYSPERLYEAR 366
#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
#define SECSPERDAY ((long) SECSPERHOUR * HOURSPERDAY)
#define TM_YEAR_BASE 1900
#define EPOCH_YEAR 1970
#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
static const int mon_lengths[2][MONSPERYEAR] = {
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
};
static const int year_lengths[2] = {
DAYSPERNYEAR, DAYSPERLYEAR
};
#define BIORHYTHMS 3 static const int bio_cycles[BIORHYTHMS] = { 23, 28, 33 }; static const char* bio_types[BIORHYTHMS] = { "身体", "感情", "知性" }; typedef struct { int year, mon, day; } DATE; int getdays(DATE* from, DATE* to) { int i, days = to->day; for (i = from->mon - 1; i < MONSPERYEAR; ++i) days += mon_lengths[isleap(from->year)][i]; for (i = from->year + 1; i < to->year; ++i) days += year_lengths[isleap(i)]; for (i = to->mon - 2; i >= 0; --i) days += mon_lengths[isleap(to->year)][i]; return days - from->day; }
int getdate(const char* str, DATE* d) { char buf[BUFSIZ]; return (fputs(str, stdout) != EOF && fgets(buf, sizeof buf, stdin) != NULL && sscanf(buf, "%d/%d/%d", &d->year, &d->mon, &d->day) == 3 && d->mon >= 1 && d->mon <= MONSPERYEAR && d->day >= 1 && d->day <= mon_lengths[isleap(d->year)][d->mon - 1]); }
int main() { DATE from, to, epoch = { EPOCH_YEAR, 1, 1 }; int days, base, i; time_t t; struct tm tm; if (getdate("生年月日を入力してください: ", &from) && getdate("今日の日付を入力してください: ", &to)) { base = getdays(&epoch, &to); days = getdays(&from, &to); printf("今日は生まれてから %d 日目\n", days); for (i = 0; i < BIORHYTHMS; ++i) { t = SECSPERDAY * ((bio_cycles[i] - days % bio_cycles[i]) % (int)((bio_cycles[i] + 1) / 2) + base); localtime_r(&t, &tm); printf("次の%sの要注意日: %d/%02d/%02d\n", bio_types[i], tm.tm_year + TM_YEAR_BASE, tm.tm_mon + 1, tm.tm_mday); } } return 0; }
5人の学生の3科目(国語、数学、英語)の点数を前期と後期の二回分3次元配列に入力して 各学生の前期と後期の合計および前後期の総合計を求めるプログラムをつくりなさい。 これどなたかおねげーしますだ。
>>170 100未満でも100より多くても動く
#include <stdio.h>
#include <stdlib.h>
int main() {
int i, j, min, n = 0, alloc = 512 * BUFSIZ, *x;
char buf[BUFSIZ];
x = (int*)malloc(alloc * sizeof(int));
if (x == NULL) goto err;
while (fgets(buf, sizeof buf, stdin) != NULL &&
sscanf(buf, "%d", &x[n]) == 1) {
n++;
if (n == alloc) {
alloc *= 2;
x = (int*)realloc(x, alloc * sizeof(int));
if (x == NULL) goto err;
}
}
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
if (x[i] > x[j]) {
min = x[i];
x[i] = x[j];
x[j] = min;
}
for (i = 0; i < n; i++)
printf("%d\n", x[i]);
return 0;
err:
fputs("virtual memory exhausted\n", stderr);
return 1;
}
207 :
デフォルトの名無しさん :03/05/29 08:04
>>175 ファイルに100個以下のデータ(個数は不明)が入っていてそれをソートできる
ようにしたいんです。
>>207 >>206 のfgets()のstdinを、自分で開いたストリームのFILE*に変更すればいい。
>>209 いや、それでわかる奴なら質問しないだろうと思ってね。
program < file
>>207 #include<stdio.h>
#define N 100
int main(){
int i,j, n, t, min, x[N];
for(i=0;i<N;i++) {
if (scanf("%d", &x[i]) <= 0) {
break;
}
}
n = i;
for(i = 0; i < n - 1; i++){
min = i;
for(j = i + 1; j < n; j++){
if(x[j] < x[min]) min = j;
}
t = x[i];
x[i] = x[min];
x[min] = t;
}
for(i=0;i<n;i++)
printf("%d ", x[i]);
printf("\n");
return 0;
}
>>205 #include <stdio.h>
int main(void)
{
int ten[5/*生徒*/][2/*前後*/][3/*科目*/];char str[BUFSIZ];
const char zengo[2][5]={"前期","後期"};int i,n,g;int goukei[2];
for(i=0;i<=4;i++)for(n=0;n<=1;n++)
{
printf("生徒%cの%sの点数は?国語、数学、英語をスペースで区切って入力して下さい\n",i+'A',zengo[n]);
fgets(str, sizeof(str), stdin);
if(sscanf(str, "%d %d %d", &ten[i][n][0],&ten[i][n][1],&ten[i][n][2])!=3)
{puts("入力エラー やり直し");n--;continue;}
for(g=0;g<=2;g++)if(ten[i][n][g]<0||ten[i][n][g]>100){puts("入力エラー やり直し");n--;continue;}
}
puts("\n 前期 後期 総合");
for(i=0;i<=4;i++)
{
for(n=0;n<=1;n++)for(g=0,goukei[n]=0;g<=2;g++)goukei[n]+=ten[i][n][g];
printf("%c%5d%6d%6d\n",i+'A',goukei[0],goukei[1],goukei[0]+goukei[1]);
}
return 0;
}
>>132 支店ができ,合計で3店舗となって、
3店舗分のプログラムにするにはどうしたらいいでしょうか?
東京支店、神奈川支店、群馬支店のように3店舗ぶんの売り上げを、
表示させたいんですが条件があり
(1)3つのユーザ定義関数の定義は書き換えず,そのまま使用する.
(2)データは下図のように各支店の売上を管理する配列を用意し,
それぞれへのポインタを格納する配列を使って管理する.
この条件をみたしてのプログラムの作り方が、
いまいちわかんないです
>>132 支店ができ,合計で3店舗となって、
3店舗分のプログラムにするにはどうしたらいいでしょうか?
東京支店、神奈川支店、群馬支店のように3店舗ぶんの売り上げを、
表示させたいんですが条件があり
(1)3つのユーザ定義関数の定義は書き換えず,そのまま使用する.
(2)データは各支店の売上を管理する配列を用意し,
それぞれへのポインタを格納する配列を使って管理する.
この条件をみたしてのプログラムの作り方が、
いまいちわかんないです
>>132 には一切ユーザ定義関数のことは書かれてませんが?
#include<stdio.h> double fibonacci(int) ; int main() { double result; int number; printf("整数を入力してください:"); scanf("%d", &number); result = fibonacci (number); printf("Fibonacci (%d) = %g\n", number, result); return 0; } double fibonacci (int n) { if (n == 0 || n == 1) { return n; } else { return fibonacci(n - 1) + fibonacci (n - 2); } } コレを再帰を使わず反復構造を用いて書き換えてください。 お願いします。
218 :
デフォルトの名無しさん :03/05/29 12:47
void swap1(int *nx, int *ny, int *nz) { int temp = *nx; *nx = *ny; *ny = *nz; *nz = temp; } void sort3(int *n1, int *n2, int *n3) { if(*n1 > *n2 && *n2 > *n3) swap1(n3, n2, n1); if(*n1 > *n3 && *n3 > *n2) swap1(n3, n2, n1); if(*n2 > *n1 && *n1 > *n3) swap1(n1, n3, n2); if(*n2 > *n3 && *n3 > *n1) swap1(n3, n1, n2); if(*n3 > *n1 && *n1 > *n2) swap1(n1, n2, n3); } int main(void) { int na, nb, nc; puts("3つの整数を入力してください。"); printf("整数A"); scanf("%d", &na); printf("整数B"); scanf("%d", &nb); printf("整数C"); scanf("%d", &nc); sort3(&na, &nb, &nc ); puts("これらを昇順に並べました。"); printf("整数Aは%dです。\n", na); printf("整数Bは%dです。\n", nb); printf("整数Cは%dです。\n", nc); return(0); } 3つのint型整数を昇順にならべかえる関数をつくれ ポインタのところです うまくいきません 間違いを指摘してください
>>218 突っ込み所満載だな…。
まずは、ソートとは何か?から勉強しれ!
そーっとしといてやれ
>>217 double fibonacci(int n)
{
int i;
double d, route5;
if (n == 0 || n == 1) return n;
d = 1;
route5 = sqrt(5);
for (i = 0; i < n - 2; i++) {
d = d * (1 + route5) / 2;
d = round(d);
}
return d;
}
double fibonacci (int n) {int a = 0, b = 1; for (; n != 0; n--) { int tmp = a; a += b; b = tmp; } return a; }
意味和漢ねーし まんどくせーからやってちょ
>>223 swap1だのsort3だのは誰が作ったんだ?
おまえが作ったのか?
まさか問題で与えられたわけじゃないよな。
3つだからどうにかなってるけど、
もっと多かったらどうなるかちゃんと考えてみろ。
sort3は問題で与えられてます. swap1 は自分で作りました もっと多かったらできなくなりますね どうすればいいんすか?
>>217 #include <math.h>
#include <float.h>
double fibonacci(int n)
{
double a = 0, b = 1, c;
for (; n; --n) {
c = a;
a += b;
b = c;
}
if (log(a) > log(2) * DBL_MANT_DIG) {
fputs("もうだめぽ\n", stderr);
a = -1;
}
return a;
}
sort3の最初のswap呼び出しがおかしいんじゃねーの?
すいません。もう訳が分からないのでぱぱっと やってもらえないでしょうか 3つのint型整数を昇順にならべかえる関数をつくれ ポインタのところです void sort3(int *n1, int *n2, int *n3) これは使ってください。
void swap1(int *nx, int *ny) {int temp = *nx; if(temp > *ny) { *nx = *ny; *ny = temp;}} void sort3(int *n1, int *n2, int *n3) {swap1(n1,n2); swap1(n2,n3); swap1(n1,n2);}オレモワケワカラン
えらそだな。質問者。
その処理のどこがswapなのかと小一時間・・・
>>218 問題で与えられてるsort3()関数がおかしいでFA
void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp;} void sort3(int *n1, int *n2, int *n3){ if (*n1 > *n2) swap(n1, n2); if (*n1 > *n3) swap(n1, n3); if (*n2 > *n3) swap(n2, n3);}
こんな宿題を出す学校なんか辞めちまえ!
行ってても意味なさそだしな
ちょっとすいません VCでdao使ってるんですけど レコードを削除するコードがわかりません ちゅぼウみたいな質問ですが おしえてください
厨房以下だ。他所へ逝け。
243 :
デフォルトの名無しさん :03/05/29 16:35
>>242 そう言わずに教えてください 師匠!!
さわりだけでも。
>>240 なんかコンパイルできませんでした。
誰か217を教えてください。
246 :
動画直リン :03/05/29 17:13
247 :
デフォルトの名無しさん :03/05/29 17:52
>>215 215の続きなんですが、こういった実行例のプログラムを
作っていただけないでしょうか?
(実行例)
初期化を完了しました.
売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):1
今日の売上を入力してください.
【星が丘本店】
りんご:200みかん:300イチゴ:500ナシ:800イチヂク:250
【塩釜口支店】
りんご:200みかん:300イチゴ:500ナシ:800イチヂク:250
【上社支店】
りんご:200みかん:300イチゴ:500ナシ:800イチヂク:250
248 :
デフォルトの名無しさん :03/05/29 17:53
>>247 の続き
<<本日までの売上>>
【星が丘本店】
りんご:200みかん:300イチゴ:500ナシ:800イチヂク:250
【塩釜口支店】
りんご:200みかん:300イチゴ:500ナシ:800イチヂク:250
【上社支店】
りんご:200みかん:300イチゴ:500ナシ:800イチヂク:250
売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):1
今日の売上を入力してください.
(以下略)
売上を入力しますか.プログラムを終了しますか.(入力:1,終了:99):99
終了します.
#include<stdio.h> #define N 8 void merge(int end_a,int end_b){ int i=0,j=0,k=0,m,a[N],b[N],c[N]; while((i<end_a)&&(j<end_b)) if(a[i]<=b[j]) c[k++]=a[i++]; else c[k++]=b[j++]; if(i>=end_a) for(m=j;m<end_b;m++) c[m+end_a]=b[m]; else for(m=i;m<end_a;m++) c[m+end_b]=a[m]; } void sort(int p,int q){ int i,med,a[N],b[N],c[N],d[N]; if(p<q){ med=(p+q)/2; sort(p,med); sort(med+1,q); for(i=p;i<med;i++) a[i-p]=d[i]; for(i=med+1;i<=q;i++) b[i-med-1]=d[i]; merge(med-p-1,q-med); for(i=p;i<=q;i++) d[i]=c[i-p]; } }
>>249 の続き
main(){
int i,j,d[N];
printf("Input : ");
for(i=0;i<N;i++)
scanf("%d",&d[i]);
printf("\n");
sort(0,N-1);
printf("Result :");
for(i=0;i<N;i++)
printf(" %d ",d[i]);
printf("\n");
}
マージソートのプログラムを作ったつもりなんですが、コンパイルエラーが
出ないのに動きません。どう改良したら動くようになりますか?
どうやら、mainで宣言される配列dに入力された値を格納するようですが、 どのように配列dと関数sortが関連を持ってるのかが良くわかりません。 とりあえず、スコープという言葉の意味を調べてみて下さい。
252 :
デフォルトの名無しさん :03/05/29 21:00
氏名と5科目の点数を標準入力から読み込み、ファイル「gakusei.dat」に保存するプログラムkakikomiを作成せよ。但し、氏名は最大20文字とし、「Q」を入力した時点で終了するものとする。また、学生のデータは構造体を用いて管理せよ。 誰かお願いします。解けませんでした。
>>1 を読むとC++がデフォルトのように思えてくるんだな
255 :
デフォルトの名無しさん :03/05/29 21:49
main() { ofstream of("gakusei.dat"); of << "名前,数学,英語,国語,理科,社会" << endl; for(;;) { Student st; cout << "名前?" << endl; cin >> st.name; if(st.name == "Q") break; if(st.name.size() > 20) { cerr << "名前永杉" << endl; break; } cout << "数学?" << endl; cin >> st.math; cout << "英語?" << endl; cin >> st.eng; cout << "国語?" << endl; cin >> st.jap; cout << "理科?" << endl; cin >> st.sci; cout << "社会?" << endl; cin >> st.nat; st.Output(of); } }
>>255 遅いよ。もうC++で書いちゃったよ。
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
struct Student
{
string name;
int eng, math, jap, sci, nat;
void Output(ostream &os) { os << math << "," << eng << "," << jap << "," << sci << "," << nat << endl; }
}
しかも順番逆だよ
259 :
デフォルトの名無しさん :03/05/29 22:18
>>256-257 ありがとうございます。
C++に触れたことないので全然分かりませんでしたが
短時間でこれだけできるのは流石ですね。
もしできたらCのほうでもお願いします。
260 :
お願いします。 :03/05/29 22:21
自然数nを入力として与えたとき、 ・もしnが偶数ならば、n/2を新たにnとおく。 ・もしnが奇数ならば、3n+1を新たにnとおく。 という操作を繰り返す。どんな自然数nを入力として与えても、 高々有限回の反復で必ず1になるという予想をL.Collatzの予想という。 自然数nを入力したとき、それが1に収束するまでのステップと そのステップ数を表示するようなプログラムを作成せよ。 お願いします。
アルゴリズムわかったんなら自分でできるだろ
>>260 #include <iostream>
main()
{
int step;
for(step = 0 ;n > 1;step++)
{
n = n % 2 ? n/2 : 3*n+1;
cout << n << endl;
}
cout << "ステップ数:" << step << endl;
}
using忘れた
264 :
デフォルトの名無しさん :03/05/29 22:37
自然数n≧2を一つの入力として与えたとき、次のように動作するプログラムを作成せよ。 ●各m=2,3,…,nについて、mが素数ならば『mは素数である』という旨のメッセージを、 そうでない場合はmの自明でない因数分解を一つ、各々表示する。 ●2からnまでの素数の個数を数えて、その結果を表示する。 プログラムについて何もわからないので、どうか宜しくお願いします。
265 :
デフォルトの名無しさん :03/05/29 22:38
252をCで解ける人いまつか? できたらお願いします。C++はサパーリでした。
reverseと素数問題はテンプレにすべきだな
>>264 (1,2)共通
#include <iostream>
using namespace std;
int GetPrime(int n)
{
for(int i=2; i<n-1;i++)
{
if(n%i == 0)
return n;
}
return 0;
}
(1) main() { int n, pr; cout << "数入れて" << endl; cin >> n; pr = GetPrime(n); if(pr) cout << pr << "が因数" << endl; else cout << n << "は素数" << endl } (2) main() { int n, count; cout << "数入れて" << endl; cin >> n; for(int i=2; i<n; i++) count = GetPrime(n) ? count : count+1; cout << "素数は" << count << "個" << endl; }
CとC++は共通部分が多いんだから 処理の流れくらいは分かるだろ
>172 >174 はいそうです。 どうもすみませんでした。 他にどんな情報が必要になるんでしょうか? 問題が2分探索木のdelete関数を作れなんですよ。 ヒントでポインタのポインタを使うとなっているのですが。
>172 >174 リストの時の構造体の定義は、 typedef struct node{ dataType data ; struct node *next ; }nodeType ; /* リストのノードの型 */ です。
>>271 2分探索木ぐらいあちこちに落ちてるだろ。
>>271 R.セジウィックのアルゴリズム本を買いなさい。
>>271 > 他にどんな情報が必要になるんでしょうか?
今回はliststructure.hやlist_appli_header.hのようなヘッダファイルはないの?
keyTypeはどのように定義されているんだ?
前のprintAllDataのように既に作ってある関数とかないの?
> 問題が2分探索木のdelete関数を作れなんですよ。
delete関数だけ作れっていう問題なら、既に作ってある関数がいくつか
あると思うんだけど。
欠席したんでもらえなかったというオチ?
>>272 ごめん言い方悪かった。
リストの時のnodeType構造体に相当するものは、今回ないの?
という質問でした。
>>275 にも書いたように2文木探索のヘッダファイルを
貼り付けてくれればいいんだけど。
277 :
初心者プログラマー :03/05/30 00:12
>275 >276 探したらありました! ●bin_appli_header.h typedef int keyType ; typedef struct { keyType key ; } dataType ; typedef struct node { dataType data ; struct node *left ; struct node *right ; } nodeType ; int less(keyType, keyType) ; int equal(keyType, keyType) ; keyType key(dataType *p) ; keyType key2(nodeType *p) ; void setKey(nodeType *p, keyType a_key) ; void printKey(nodeType *p) ;
>275 >276 ●bintreestructure.h int BSTinit(void) ; int BSTinsert(dataType *dp) ; nodeType* BSTsearch(keyType) ; int BSTdelete(keyType) ; nodeType *delete_min(nodeType **mp); void printAllData( ) ; /* print out the data in preorder */ static nodeType *head ; static nodeType *sentry ;
281 :
初心者プログラマー :03/05/30 00:38
すいません
>275 >276 そして、 #include <stdio.h> #include <stdlib.h> #include "bin_appli_header.h" #include "bintreestructure.h" int BSTinit(void) { sentry = (nodeType *)malloc(sizeof(nodeType)) ; if (sentry == NULL) { return 0 ; } else { head = sentry ; sentry->left = sentry->right = sentry ; return 1 ; } }
>275 >276 続き、 int BSTdelete(keyType a_key) { /*この部分が宿題*/ } void printAllData2(nodeType *p) { if (p == sentry) return ; printKey(p) ; printAllData2(p->left) ; printAllData2(p->right) ; } void printAllData(void) { printAllData2(head) ; } こうなってました。よろしくお願いします!
284 :
デフォルトの名無しさん :03/05/30 01:58
int BSTdelete(keyType a_key) { nodeType **pp = &head; while ((*pp) != sentry) { if (a_key == (*pp)->data.key) { nodeType *node = *pp; if (node->left == node->right) *pp = sentry; else if (node->left == sentry) *pp = node->right; else if (node->right == sentry) *pp = node->left; else { nodeType *p = node->left; while (p->right != sentry) p = p->right; p->right = node->right; *pp = node->left; } free(node); return 1; } pp = (a_key < (*pp)->data.key)? &(*pp)->left : &(*pp)->right; } return 0; }
>285 どうもありがとうございます! コンパイルも問題なく出来ました。 お願いなんですが、リストの時のように解説して頂けますか? お願いします!
fgetcってポインタで指定されてるファイルから1文字読み込みこんでそれを返すんですよね? それなのにint fgetc()なの? char fgetc()じゃないのでしょうか? 俺すげー勘違いしてる?
エラーをどう返すのかと小一時間
>>287 ×ポインタで指定されてるファイル
○ストリーム
だろ?
>>287 >>288 も言っているが、0-255のキャラクタとEOFというエラーを返すために
int型になっていると思えばいい。
#古いCがcharを返すことができなかったのは内緒。
unsigned long total = 0L; こんな宣言がでてきたんですけど 0の後ろのLはどういう意味があるのでしょう?
>>286 改良版。sentryを有効活用。
int BSTdelete(keyType a_key)
{
nodeType **pp = &head;
nodeType *node;
sentry->data.key = a_key;
while (a_key != (*pp)->data.key) {
pp = (a_key < (*pp)->data.key)? &(*pp)->left : &(*pp)->right;
}
if (*pp == sentry) return 0;
node = *pp;
if (node->left == node->right) *pp = sentry;
else if (node->left == sentry) *pp = node->right;
else if (node->right == sentry) *pp = node->left;
else {
nodeType *p = node->left;
while (p->right != sentry) p = p->right;
p->right = node->right;
*pp = node->left;
}
free(node);
return 1;
}
解説は夜になってしまうかも
long宣言してるからLを付ける意味無いんじゃ? unsigned long total = 0L; unsigned long total = 0; これって違いがあるんですか?
>293 ありがとうござます。 夜でもいいので解説待ってます!
>>294 double d = 0.0;
とするのと同じ。
プログラムを読む人間に対するメッセージとでも。
fgetcとgetcって一緒な予感なんですが 違いあるのでしょうか?
298 :
デフォルトの名無しさん :03/05/30 11:24
>>297 fgetc() は関数だが getc() はマクロでも良い。
>>297 機能的には同じだが
getcはマクロとして実装されていることがある
ここは宿題スレだ。 しょうもない質問すんな。 するなら「〜の意味を述べよという宿題が出た」とか書くぐらいの頭使え。
302 :
デフォルトの名無しさん :03/05/30 11:59
こんな宿題がでたんですけど誰かやってもらえないでしょうか? 学生番号(3桁の整数)と氏名(アルファベットで姓のみ)をメンバとする構造体を定義し, キーボードから学生番号と氏名を5名分読み込むプログラムを作成しなさい. ただし,3桁以外の整数値を入力した場合は再入力するようにし,最後に5名分のデータをすべて表示すること. 〔実行結果〕 学生番号(3桁の整数)> 444 氏名(アルファベットで姓のみ)> takeda ………… 学生番号(3桁の整数)> 1100 学生番号(3桁の整数)> 99 学生番号(3桁の整数)> 631 氏名(アルファベットで姓のみ)> Sato 学生番号(3桁の整数)> 107 氏名(アルファベットで姓のみ)> Furukawa 〈5名分のデータ表示例〉 学生番号: 444 氏名: Takeda 学生番号: 221 氏名: Kato 学生番号: 859 氏名: Azuma 学生番号: 631 氏名: Sato 学生番号: 107 氏名: Furukawa
001とか023とかの扱いは? あとCかC++ちゃんと書かないと、
>>293 冗長な箇所があったので修正
if (node->left == node->right) *pp = sentry;
else if (node->left == sentry) *pp = node->right;
↓
if (node->left == sentry) *pp = node->right;
>>302 考えてみたけど上手く動きません。
プロの人どこがおかしいのかおせーてくだせーませ
#include <stdio.h>
int main(void)
{
struct Seito{
int num;
int name[30];
} S_s[5];
int i;
for(i = 0; i < 5; i++){
do{
printf("学生番号(3桁の整数)>");
scanf("%d",&S_s[i].num);
}
while(S_s[i].num < 100 || S_s[i].num > 999);
printf("氏名>");
gets(S_s[i].name);
}
for(i = 0; i < 5; i++){
printf("学生番号:%d 氏名:%s\n",S_s[i].num,S_s[i].name);
}
return 0;
}
どう動かんの?
char name[30]; じゃないかな。
getsで名前入力しようとしてるんだけど そのまま素通りなのです。 getsが何故か働いてくれない
だから001とか053はどう扱うのか 受け取るのか弾くのか
受け取る方向で!
なるほど!
何故動かないかは分かったけどどうすればいいのかさっぱりです! scanfとgets使うなといわれても何を使えばいいのか。 プロの人ならどう書くのでしょう?
どうすればいいのかわからないうちはわかったことにはならん。 再度C FAQを熟読しなさい。 fgetsしてsscanfすれと書いてあるだろうが。
>>302 名前にアルファベット以外を使った時の扱いは?
もうエラーチェックなしでいいだろ
こんなかんじにしたら動いた!
突込みどころあったら教えてもらいたいです。
ちなみに俺は
>>302 じゃないす。
#include <stdio.h>
int main(void)
{
struct Seito{
int num;
int name[30];
} S_s[5];
int i;
int buf[30];
for(i = 0; i < 5; i++){
do{
printf("学生番号(3桁の整数)>");
fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%d",&S_s[i].num);
}
while(S_s[i].num < 100 || S_s[i].num > 999);
printf("氏名>");
fgets(S_s[i].name,sizeof(S_s[i].name),stdin);
}
for(i = 0; i < 5; i++){
printf("学生番号:%d 氏名:%s\n",S_s[i].num,S_s[i].name);
}
return 0;
}
>>313 scanfやgets問題はエラーチェック。整数を入力して欲しい所で文字列を入力
したり、2つの要素を入力して欲しい所で1つや3つだったりすると、プログラムが
おかしくなる。scanfやgetsでも、後々何か足すことでエラーチェックは出来るが、
単独で使うことは、テスト用に作った小さいものぐらい。
fgets、sscanfコンボは、エラーチェックが出来る物でいちばん有名で、精度も
高く、簡単に出来るから使われる。さっきも書いたようにエラー入力と扱いたい所
は、型と要素数だが、それが簡単に出来る。
まず、fgetsでバッファに格納する。入力する文字列をBUFSIZにして、getsでも
いいが、長さを自由に変えられるfgetsの方が良い。次に入力した文字列をsscanf
で分解していく。欲しい要素が名前、年齢、血液型、年収の時、型は左から%s、%d
、%s、%ld、となる。Tarou 25 AB 6000000と正しく入力すると、sscanfは4を
返す。Tarou 25 ABと要素を少なく入力すると、今度は3を返す。Tarou Zirou AB
6000000と型を間違えて入力すると、sscanfは0を返す。
つまり、入力して欲しい要素数とsscanfの戻り値が同じ時以外、全てエラー入力
だったことに成るので、そこだけをチェックすれば、エラーチェックを出来たこと
になるから、簡単に正しく出来るということで、よく使われる。
319 :
デフォルトの名無しさん :03/05/30 16:32
自然数nを入力として与えたとき、 ・もしnが偶数ならば、n/2を新たにnとおく。 ・もしnが奇数ならば、3n+1を新たにnとおく。 という操作を繰り返す。どんな自然数nを入力として与えても、 高々有限回の反復で必ず1になるという予想をL.Collatzの予想という。 自然数nを入力したとき、それが1に収束するまでのステップと そのステップ数を表示するようなプログラムを作成せよ。 学校の宿題なんですが、始まったばかりで最初に#include<stdio.h>とか書くくらいしかわかりません。 くだらない問題かもしれませんが、どうかお願いします。
>>318 scanf()は工夫すれば何とかなるが、gets()はオーバーフローがまったくチェッ
クできない。
322 :
デフォルトの名無しさん :03/05/30 17:27
与えられた文字列の中から所定の位置に存在する部分的な文字列を抽出する関数を次の仕様で作成し、 それを用いたプログラムを作成しなさい。 関数:int strext(s,t,m,n) 引数:char *s 抽出された文字列部分の先頭アドレス char *t 与えられた文字列の先頭アドレス int m 抽出する開始位置(文字列の左端を0) int n 抽出する文字列部分の長さ 戻り値:抽出成功のとき1、失敗で0 たとえば、"thunderbird",2,6と入力すると、関数は1を返して、"under"と出力する。 試行錯誤してみたんですが・・・
あるホームページの1分あたりのアクセス要求がλ=5の ポアソン分布に従うとき、1分ごとのアクセス要求の系列を 生成するプログラムを作成しなさい お願いします
>>322 > たとえば、"thunderbird",2,6と入力すると、関数は1を返して、"under"と出力する。
引数nはNULを含めるの?
>>322 int strext(char *s, const char *t, size_t m, size_t n)
{
if (m + n > strlen(t))
return 0;
memcpy(s, t + m, n);
*(s + n) = '\0';
return 1;
}
int strext(char *s, const char *t, size_t m, size_t n) { while (m && *t) { *t++; m--; } while (n && *t) { *s++ = *t++; n--; } *s = 0; return (!m && !n); }
327 :
デフォルトの名無しさん :03/05/30 18:01
【緊急】ちょっと現調いってきてください!
名前: 頭脳土方
E-mail:
[email protected] 内容:
現調にいってくれるひと募集。
5月31〜6月1日 宿泊費、交通費、でます。
もちろん、現調なのでお金払います。(値段は相談)
C++が分かる人。開発室と電話連絡しながら、
コンパイルしたりテストしたり、してください。
メール
[email protected] もまいら、よろしくおねがいします。
> *t++;
そんなものわざわざ関数にしないでstrncpyかstrncatを使えばいいのに。
NULLじゃないや。'\0'だね。 修正版 int strext(char *s, const char *t, size_t m, size_t n) { while (m && *t) { t++; m--; } while (n-- && n && *t) *s++ = *t++; *s = 0; return !m && !n; }
>>322 > 戻り値:抽出成功のとき1、失敗で0
成功と失敗の基準は?
要求仕様>>>Cらしい仕様
/*
>>323 */
#include <time.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define drand() (((double)rand())/RAND_MAX)
int
poisson(double lambda)
{
int k;
for(k=0, lambda=exp(lambda)*drand(); lambda>1; k++) lambda*=drand();
return k;
}
int
main(int argc, char **argv)
{
int n,m; double lambda;
srand(time(NULL));
n = m = argc > 1 ? abs(atoi(argv[1])) : 20;
lambda = argc > 2 ? abs(atof(argv[2])) : 5;
while(m--) printf("%d ", poisson(lambda)); puts("");
return 0;
}
337 :
デフォルトの名無しさん :03/05/30 19:29
すみません。
>>264 のプログラムに用いたアルゴリズムの説明を添えろとのことなのですが、
そもそも根本からわからないのでどうかお願いします。
C言語でブロック崩しを作るのですが、先生は 「面白いのを作れ」と言ったんです。 創造力の無い僕はブロックの影にエロ画像でもいれとくか、とか考えたのですが、 何処かにイイ画像は無いですか? 老若男女全ての人が見て、綺麗、エッチなのがここで言うイイ画像です。 とりあえず現状で使用を考えてるのは Pasera です。
341 :
デフォルトの名無しさん :03/05/30 21:15
「1!〜53!を計算してそれらを桁をそろえて出力せよ。」 double factorial(int ) を用いるのではなく、 53!≒4.27*10^69を使いたいのです。 Cでよろしくお願いします。
4.27と 69を持つ構造体を作って 掛け算をしたあとに10で割る。
#include <stdio.h> int main(void) { double n, i; n = 4.27e+69; for (i = 53; i > 0; i--) { printf("%3.2e\n", n); n /= i; } return 0; }
>>341 問題が意味不明だが、こういうことか?
#include <stdio.h>
#include <math.h>
double factorial(unsigned n)
{
static double C;
static double E;
if (C == 0) {
C = sqrt(2 * acos(-1));
E = exp(1);
}
return C * pow(n, n + .5) / pow(E, n);
}
int main()
{
int i;
for (i = 1; i <= 53; i++)
printf("%d! = %.2e\n", i, factorial(i));
return 0 ;
}
#include <stdio.h> struct num { double x; int y; }; struct num product(struct num n, int i) { n.x *= i; while (n.x > 10) { n.x /= 10; n.y += 1; } return n; } struct num factorial(int i) { struct num n; n.x = 1; n.y = 0; while (i > 0) n = product(n, i--); return n; } void print_factorial(int i) { struct num n = factorial(i); printf("%02d!=%1.2f*10^%02d\n", i, n.x, n.y); } int main(void) { int i; for (i=1; i<=53; i++) print_factorial(i); return 0; }
>>341 lgamma や gamma がある環境ならそれを使うのが素直
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char **argv)
{
int i,j;
for(i=1;i<=53;i=j) printf("%2d! = %.2e%s",i,exp(lgamma(j=i+1)),i%5?" ":"\n");
return 0;
}
347 :
デフォルトの名無しさん :03/05/31 01:43
Cの問題です。 下のプログラムを名前(氏名)のアルファベット順に 構造体のリストに登録するように変更せよ。 1 #include <stdio.h> 2 3 /* 構造体型GAKUSEIの定義 */ 4 typedef struct gakusei{ 5 char name[11]; 6 int kokugo; 7 int suugaku; 8 int rika; 9 int syakai; 10 int eigo; 11 struct gakusei *next; 12 } GAKUSEI; 13 14 15 main(){ 16 GAKUSEI start_dmy; /* リストの先頭の構造体変数(データは入らない) */ 17 GAKUSEI *ptr; /* 作業用のポインタ */ 18 GAKUSEI *new_ptr; /* 新しく確保した領域を指すポインタ */ 19 20 ptr = &start_dmy; /* 作業用のポインタを先頭の要素を指すようにする */
21 ptr->next = NULL; /* 最初の要素のメンバnextをNULLに設定する */ 22 while(1){ 23 24 /*** 構造体1個分の領域を確保する ***/ 25 new_ptr = (GAKUSEI *)malloc(sizeof(GAKUSEI)); 26 if(new_ptr == NULL){ 27 printf("メモリを確保できませんでした。\n"); 28 exit(1); 29 } 30 31 /*** キーボードからの学生データの入力 ***/ 32 printf("氏名を入力してください:"); 33 scanf("%s", new_ptr->name); 34 if(strcmp(new_ptr->name, "Q")==0){ /* 名前の入力がQだったら入力終了 */ 35 break; 36 } 37 printf("国語の点数:"); 38 scanf("%d", &new_ptr->kokugo); 39 printf("数学の点数:"); 40 scanf("%d", &new_ptr->suugaku);
41 printf("理科の点数:"); 42 scanf("%d", &new_ptr->rika); 43 printf("社会の点数:"); 44 scanf("%d", &new_ptr->syakai); 45 printf("英語の点数:"); 46 scanf("%d", &new_ptr->eigo); 47 48 /*** 新しく確保した領域をリストの最後に繋げる ***/ 49 ptr->next = new_ptr; /* これまでの最後の構造体のメンバnextを 50 新しく確保した領域を指すように変更 */ 51 new_ptr->next = NULL; /* 新しく確保した構造体のメンバnextを 52 NULLに設定 */ 53 ptr = new_ptr; /* 作業用のポインタを新し領域を指すよ 54 うに変更 */ 55 } 56 57 printf("\n\n\n"); 58 for(ptr = start_dmy.next ; ptr!=NULL ; ptr=ptr->next){ 59 printf("氏名:%10s ", ptr->name); 60 printf("国語:%3d ", ptr->kokugo); 61 printf("数学:%3d ", ptr->suugaku); 62 printf("理科:%3d ", ptr->rika); 63 printf("社会:%3d ", ptr->syakai); 64 printf("英語:%3d\n", ptr->eigo); 65 } 66 }
行番号邪魔
確かに。行番号のためコピペで確かめにくいw
352 :
347修正 :03/05/31 01:51
Cの問題です。 下のプログラムを名前(氏名)のアルファベット順に 構造体のリストに登録するように変更せよ。 #include <stdio.h> /* 構造体型GAKUSEIの定義 */ typedef struct gakusei{ char name[11]; int kokugo; int suugaku; int rika; int syakai; int eigo; struct gakusei *next; } GAKUSEI; main(){ GAKUSEI start_dmy; /* リストの先頭の構造体変数(データは入らない) */ GAKUSEI *ptr; /* 作業用のポインタ */ GAKUSEI *new_ptr; /* 新しく確保した領域を指すポインタ */ ptr = &start_dmy; /* 作業用のポインタを先頭の要素を指すようにする */
353 :
347修正 :03/05/31 01:53
ptr->next = NULL; /* 最初の要素のメンバnextをNULLに設定する */ while(1){ /*** 構造体1個分の領域を確保する ***/ new_ptr = (GAKUSEI *)malloc(sizeof(GAKUSEI)); if(new_ptr == NULL){ printf("メモリを確保できませんでした。\n"); exit(1); } /*** キーボードからの学生データの入力 ***/ printf("氏名を入力してください:"); scanf("%s", new_ptr->name); if(strcmp(new_ptr->name, "Q")==0){ /* 名前の入力がQだったら入力終了 */ break; } printf("国語の点数:"); scanf("%d", &new_ptr->kokugo); printf("数学の点数:"); scanf("%d", &new_ptr->suugaku);
354 :
347修正 :03/05/31 01:54
printf("理科の点数:"); scanf("%d", &new_ptr->rika); printf("社会の点数:"); scanf("%d", &new_ptr->syakai); printf("英語の点数:"); scanf("%d", &new_ptr->eigo); /*** 新しく確保した領域をリストの最後に繋げる ***/ ptr->next = new_ptr; /* これまでの最後の構造体のメンバnextを 新しく確保した領域を指すように変更 */ new_ptr->next = NULL; /* 新しく確保した構造体のメンバnextを NULLに設定 */ ptr = new_ptr; /* 作業用のポインタを新し領域を指すよ うに変更 */ } printf("\n\n\n"); for(ptr = start_dmy.next ; ptr!=NULL ; ptr=ptr->next){ printf("氏名:%10s ", ptr->name); printf("国語:%3d ", ptr->kokugo); printf("数学:%3d ", ptr->suugaku); printf("理科:%3d ", ptr->rika); printf("社会:%3d ", ptr->syakai); printf("英語:%3d\n", ptr->eigo); } }
>>295 >>293 +
>>304 の解説
左の方から昇順になっている2分木から引数a_keyと一致するkeyをもつ要素を削除する関数。
return 0; までが要素を探している部分。その後が木から要素を削除している部分。
リストでは要素を削除にするためには、1つ前の要素をもっていれば良かった。
その要素の次を示すのがnextだけだったからである。
今回はleftとrightがあるので、前の要素をもっていてもどちらに削除の要素が付いているのか
わかりづらい。そのため、ポインタのポインタのppを使ってleft、right(あとhead)を
もつようにしている。
要素を探している部分は、「番兵」という技法を使っている。
木の端(葉の先)には必ずsentryが指すものがあるが、これのkeyにa_keyを代入すると、
この木は必ずa_keyと一致するkeyをもつ要素があるということになり、
ループの終了条件を一致するまでとすることができる。
左から昇順になっているので、今*ppが指しているの要素がa_keyよりも大きければ、
leftを小さければrightを辿る。
一致した要素が見つかったら、それが前に仕込んだ番兵かどうかを確認し、
番兵だったら木の中には、一致するものがなかったということになる。
要素を削除している部分だが、まず*ppを書き換えるので、 freeで削除する要素をnodeでもつようにする。 削除した要素を埋めるのはleftかrightかがもつ要素になる。 leftに有効な要素がない(== sentry)のなら、rightで埋める。 このときrightもsentryかもしれないが、その場合*ppにはsentryを入れることになるので 構わず代入する。同様にrightに有効な要素がないのなら、leftで埋める。 else節は両方とも有効な要素がある場合となる。 このときどちらにするかはいろいろ考え方はあるが、今回はシンプルにleftで 埋めることにした。ただright側の要素を指すものがなくなってしまうので、 leftが指す木の一番右にある要素をループを使って探し、その更に右に rightの要素を付けている。 木の変更が終わったらfreeで削除。
>>347 この関数を追加して、
void insert(GAKUSEI* list, GAKUSEI* new)
{
GAKUSEI* prev = list;
for(list = list->next; list; prev = list, list = list->next)
if (strcmp(list->name, new->name) > 0)
break;
new->next = list;
prev->next = new;
}
48-54行目を消して、替わりに↓を書く。
insert(&start_dmy, new_ptr);
>>347 これってソートもしないといけないのか?
>356 >357 約束通り解説して頂きありがとうございました。 質問なのですが、 &(*pp)->leftと&(*pp->left)は違うんですか?
訂正 &(*pp->left)→&((*pp)->left)
>356 >357 それと、*ppは常にheadになるんですか?
>>360 違います。
*pp->leftは*(pp->left)と同値です(&(*pp->left)は&(*(pp->left))と同値)。
ppが構造体へのポインタのポインタであるならば、(*pp)->leftのようにしないとなりません。
そうしなければコンパイラはエラーを報告してくるでしょう。
headとppのメモリを確保したら、headは根を指してて、ppはheadを指してるんですよね? それで*ppつまりheadの指している要素が削除したい要素でないならば、さらに潜り、 削除したい要素がheadの指している要素より小さかったらleft大きかったらrightへ。 この時のポインタの付け替えは、 ppは根の左の構造体を指すようになると考えてよいのでしょうか?
>363 うーむ、どうやらポインタのポインタの性質がわかってないみたいです・・・。 ポインタの時はわかったのに、ポインタのポインタになっただけで かなりややこしくなりますね。
366 :
347修正 :03/05/31 16:35
>>359 おそらくソートもしないといけないとおもいます。
367 :
99323 :03/05/31 17:07
あるホームページの1分あたりのアクセス要求がλ=5の ポアソン分布に従うとき、1分ごとのアクセス要求の系列を 生成するプログラムを作成しなさい お願いします
368 :
デフォルトの名無しさん :03/05/31 17:11
問題の意味がわからん... ただたんにλ=5のときのポアソン分布でいいの? (来客数がx人になる確率pを求めればいいのかな?)
369 :
動画直リン :03/05/31 17:13
371 :
デフォルトの名無しさん :03/05/31 17:23
以下の問題お願いします。 3つの条件を満たす「横の長さ」と「縦の長さ」を求めるCプログラムを作成せよ。 1.縦*横 = 4000 2.縦/横 < 10 3.縦+横 が最小値
>>368 どうです。λ=5のときのポアソン分布です。
#include <stdio.h> int main(){ int h,w; int h_of_hw_min,w_of_hw_min; double hw_min=1e+16; for(w=1;w<4000;w++){ h=(int)4000/w; // h*w = 4000を変形 if((double)h/w < 10.0) break; // 条件を満たしてないならskip if(h+w < hw_min) { // 最小値を求める h_of_hw_min=h; w_of_hw_min=w; hw_min=h+w; } } //結果表示 printf("h*w=%d \n",h_of_hw_min*w_of_hw_min); printf("h=%d * w=%d \n",h_of_hw_min,w_of_hw_min); printf("h+w = %lf",hw_min); } やるきなーくコーディング。 ただし、横と縦の長さは整数限定。
#include <stdio.h> #include <math.h> double poisson(int x,double lamda){ double ret; int i; ret = exp(-lamda)*pow(lamda,(double)x); for(i=1;i<=x;i++){ ret/=(double)i; } return ret; } int main(){ int x; const double lamda=5.0; for(x=0;x<20;x++){ printf("%d %lf \n",x , poisson(x , lamda) ); } }
375 :
デフォルトの名無しさん :03/05/31 17:49
#include<stdio.h> int main(int argc,char**argv) { int H,S,A=8000,H2=0,S2; for(H=1;H<4000;H++) for(S=1;S<4000;S++) if(S*H==4000) if(H/S<10) if(H+S<=A) { A=H+S; H2=H; S2=S; } if(H2==0) printf("それらの条件を満たす数はありません\n"); else printf("それらの条件は縦%d,横%dが満たします\n",H2,S2); return 0; } ifのネストが見にくいなぁ。 一応、自然数のみで書いたが、 問題の条件が不足してるぞ。 縦、横の範囲設定がわからん
>>375 policyの問題だが、変数名に大文字を使うのはいかがなものかと...
あと、Sってなに?
>>375 実は二通りあるのだな、これ。
縦、横が80,50と50,80。
そこ修正してまたUPするわ。
http://pc.2ch.net/test/read.cgi/mac/1053924514/l50 新・mac板でAppleから新しく出たブラウザSafariを掘り下げています。
まだ設定できる項目も少なく、標準的な機能が欠如していたりしていますが
タブに対応していたり、Googleの検索機能が標準装備されていたりと
めぼしい機能が盛り込まれてあり、今年出たばかりのソフトの強みというか
将来性を感じさせてくれます。
オープンソースで未だBeta版なのでこれからどうなるか楽しみです。
よろしければプログラム板の住人さんにも意見をいただきたいです。
--コピペをお許しを--
悪い、縦>横が条件にあるので、一つだけだ。 ついでに、自分のプログラムは間違えてて欝だ。
h/w>10 だから解は1つでは? #include <stdio.h> int main(){ int h,w; int h_of_hw_min,w_of_hw_min; double hw_min=1e+16; double area=4000; for(w=sqrt(area);w>1;w--){ h=(int)4000/w; // h*w = 4000を変形 if(4000 % w !=0)continue; if((double)h/w >= 10.0) continue; // 条件を満たしてないならskip if(h+w < hw_min) { // 最小値を求める h_of_hw_min=h; w_of_hw_min=w; hw_min=h+w; } } //結果表示 printf("h*w=%d \n",h_of_hw_min*w_of_hw_min); printf("h=%d * w=%d \n",h_of_hw_min,w_of_hw_min); printf("h+w = %lf",hw_min); } **breakとcontinue間違えるなんざ...
>>379 ん?なんで?
縦/横 < 10しかないじゃん。
縦/横 > 1という条件は無いけど・・・
50/80=... あ、本当だ(笑 スマン
>>371 #include <math.h>
#include <stdio.h>
int main(void)
{
printf("%g\n", sqrt(4000));
return 0;
}
>>379-380 完全版。(一応十個まで対応)
#include<stdio.h>
int main(int argc,char**argv)
{ int H,W,A=8000,H2[10]={0},W2[10],i=0;
for(H=1;H<4000;H++) for(W=1;W<4000;W++)
if(H*W==4000) if(H/W<10){
if(H+W==A){
if(i==10) break;
H2[i]=H; W2[i]=W;
i++;
}if(H+W<A){
i=1; A=H+W;
H2[0]=H; W2[0]=W;
}
}
if(H2==0) printf("それらの条件を満たす数はありません\n");
else
for(;i--;) printf("それらの条件は縦%d,横%dが満たします\n",H2[i],W2[i]);
return 0;
}
ちなみにSに関しては、
High,Sideから取っていたので。
修正して
Height,Widthから取りました。
さすがに負は範囲外だよな
これだから数学の出来ない奴は…… 3個以上がありえないのは、図を書いてみれば一発でわかるだろうに
>>387 いや、プログラムで求める以上
「3個以上はない。」と決めるのはプログラムだ。
実際なら10個までも誤りなのさ。
けど、何回もreallocするのも面倒だから
10個までにした。
┐(´-`)┌
まあ、純粋に数学的に(少ない労力で)解ける問題を プログラムを作って解け、という出題にも無理があるわけで、 あまり突っ込まないのが吉でしょう
>>391 整数だけなら別に無理のない出題だと思うが?
ぜひこちらをお願いします。 10人分の成績を入力し、60点以上の人数を表示し、その合計点ならびに平均点を表示するプログラムをお願いします。 for( ; ; ; )実行文 ブロック文 {実行文;} ++ お願いしまっす。
> for( ; ; ; )実行文 > ブロック文 {実行文;} > ++ これは何?
> ifのネストが見にくいなぁ。 C言語なんだから、短絡評価使えばいいと思うけど。 if(S*H==4000) if(H/S<10) if(H+S<=A) ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ if(S*H == 4000 && H/S < 10 && H + S <= A)
/*
>>393 */
#include <stdlib.h>
#include <stdio.h>
#define DATASIZE 10
int
main(int argc, char **argv)
{
int i, n, score;
double sum=0;
char buf[BUFSIZ];
n = argc > 1 ? atoi(argv[1]) : DATASIZE;
for (i=0; i<n; i++) {
if (feof(stdin)) break;
fgets(buf, BUFSIZ, stdin);
sscanf(buf, "%d", &score);
sum += score;
}
printf("%f\n", sum/i);
return 0;
}
成功/失敗で戻り値を変えたほうbetterかな?
398 :
デフォルトの名無しさん :03/06/01 00:08
独自の演算子関数を含むクラスをC++で作成し、実験せよ。 例1)Average:整数または実数データの平均値を求めるクラスで、 +=演算子でデータを追加し、!演算子で結果を返す 例2)Point3D:3次元座標の点を扱うクラスで、-演算子で2点間の距離を計算する 例3)Fraction2:分数を扱うクラスで、^演算子で分数のべき乗(整数乗) を返し、!演算子で逆数を返す 例4)その他:独自のクラスと演算子を定義する 例1〜3は何とかできるんですが、例4の独自の演算子の定義が出来ません。 アイディアでは、簡単な文字列の連結を行う演算子を作ろうと思うのですが・・・ 例えば、 1)文字を入力汁! ABC 2)文字を入力汁! DEG 結果 ABCDEFG ・・・といった実行結果にしてみたいです。 おながいします
>>398 >簡単な文字列の連結を行う演算子
それは、VC で言う CString、C++Builder で言う AnsiString クラスでは?
>>398 こっから煮るなり焼くなりして
#include <iostream>
class MyString
{
char str_[32768];
public:
MyString()
{
str_[0] = '\0';
}
MyString& operator=(const char str[])
{
strcpy(str_, str);
return *this;
}
MyString& operator+(const char str[])
{
strcat(str_, str);
return *this;
}
const char* operator() ()
{
return str_;
}
};
main() { MyString str; str = "hello"; str = str + " world"; std::cout << str() << std::endl; }
>>395 複雑な論理式よりも、if文のネストのほうが遥かにマシ
だと思うが。
あるホームページの1分あたりのアクセス要求がλ=5の
ポアソン分布に従うとき、1分ごとのアクセス要求の系列を
生成するプログラムを作成しなさい
>>336 ありがとうございます。でも、absを使用しないプログラムは出来ないんですか?
#include <time.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define drand() (((double)rand())/RAND_MAX)
int
poisson(double lambda)
{
int k;
for(k=0, lambda=exp(lambda)*drand(); lambda>1; k++) lambda*=drand();
return k;
}
int
main(int argc, char **argv)
{
int n,m; double lambda;
srand(time(NULL));
n = m = argc > 1 ? abs(atoi(argv[1])) : 20;
lambda = argc > 2 ? abs(atof(argv[2])) : 5;
while(m--) printf("%d ", poisson(lambda)); puts("");
return 0;
}
>>402 「もしAでBでCなら」よりも、「もしAで、もしBで、もしCなら」のほうがいいと?
>>403 > ありがとうございます。でも、absを使用しないプログラムは出来ないんですか?
いらんならそのまま外せばいい。なんなら n = 20; lambda = 5; とすればいい。
この場合コマンドラインから出力の個数や平均を渡せなくなるだけ。
漏れもそう思う
問題 : Bin-Packing 問題 容積がそれぞれ C(i) (i=1,2,...,n) である n 個の物体がある。これらの物体を適当に組み合わせて、容積 W のいくつかの箱 (Bin) に詰める。物体の形は考慮しないものとする。このとき、箱の個数を最小にする詰め方を示せ。 ※近似解、局所最適解ではなく、厳密最小解を求めよ。 [入力] 箱の容積 W、物体の容積 C(i) (i=1,2,...,n) データ形式 1 行目: 箱の容積 W (正整数) 2 行目以降: 物体の容積 C(i)、各行 1 個ずつ (正整数) 最終行: "-1" 各行の最初の整数以外はコメント [出力] 箱の個数を最小にする詰め方 (各箱に入れる物体の容積の組み合わせ)
[例] 入力: 12 # 箱の容積 12 4 1 8 3 8 2 8 2 4 5 6 8 -1 出力: (表示形式は適宜変えてよい) 箱の容積: 12 詰め方: ( 4 8 ) -> 12 ( 1 3 8 ) -> 12 ( 2 8 2 ) -> 12 ( 5 6 ) -> 11 ( 4 8 ) -> 12 箱の個数: 5 おながいします
あと、実際には入力データは数千行あるみたいなんで、 なるべく速い方法でおながいします。 入力と出力は標準入力と標準出力で、 数千行のデータはリダイレクトで入力します。
> 入力と出力は標準入力と標準出力で、 > 数千行のデータはリダイレクトで入力します。 意味不明 この箱は変形自在な箱なのね・・・
typedef struct RGBA{ unsigned char Red; unsigned char Green; unsigned char Blue; unsigned char Alpha; }RGBA; RGBA Buffer[Width][Height]; ↑みたいにカラー情報が入っています。 これを、 Buffer[0][0]Buffer[1][0]Buffer[2][0]・・・Buffer[0][1]Buffer[1][1]Buffer[2][1]・・・ というように並べ替えてブロックソートしたいのですが、どうすればいいでしょうか? できれば簡単(単純)にやる方法を教えていただきたいのですが・・・。
>>412 末尾行に-1があるファイルからリダイレクトで入力するので、
標準入力と標準出力ということで処理でOKという事です。
>>413 CかC++ならOKです。
>>414 > Buffer[0][0]Buffer[1][0]Buffer[2][0]・・・Buffer[0][1]Buffer[1][1]Buffer[2][1]・・・
> というように並べ替えてブロックソートしたいのですが、どうすればいいでしょうか?
というようにって、どういうようにか全くわからん
なんにしてもスレ違いだから、アルゴリズム系のスレに行け
説明が分かりにくくなってしまったようなのですが、 //iostream,vector,algorithm,limitsをincludeする using namespace std; main() { vector<int> objectsizes; int boxsize; cin >> boxsize; cin.ignore(numeric_limits<int>::max(), '\n'); while(cin.good()) { int n; cin >> n; if(n == -1) break; objectsizes.push_back(n); cin.ignore(numeric_limits<int>::max(), '\n'); } sort(objectsizes.begin(), objectsizes.end()); //いろいろ処理とか //std::coutに結果を出力 } 入出力の部分はこんな感じです。 このコードは自分で書いた物なので他のコンテナに入れるべきなのかもしれないし、 ソートしなくてもいいのかもしれません。 C++で書いてますがCでも脳内でC++に変換するので構いません。 肝心のどうやって入力した内容から箱の個数を最小にする詰め方を導き出すのかが 私には想像も付かないのです。
418 :
デフォルトの名無しさん :03/06/01 21:02
問題:受験者の得点を連続して入力し、最後に受験者人数と平均点を表示する プログラムを作成しなさい。 《入力形式》 ・最初のメッセージ 平均点を求める処理 処理を続けますか:はい(0)、いいえ(9): ・処理を続行するとき 平均点を求める処理 処理を続けますか:はい(0)、いいえ(9):0[Enter] 点数を入力してください(0〜100): ・得点を入力する時 平均点を求める処理 処理を続けますか:はい(0)、いいえ(9):0[Enter] 点数を入力してください(0〜100):100[Enter] 処理を続けますか:はい(0)、いいえ(9): ・得点に0〜100以外の点数を入力したとき 平均点を求める処理 処理を続けますか:はい(0)、いいえ(9):0[Enter] 点数を入力してください(0〜100):110[Enter] もう一度0〜100の間で点数を入力してください 点数を入力してください(0〜100): ・処理を終了するとき 処理を続けますか:はい(0)、いいえ(9):9[Enter] 人数=受験者人数 平均点=算出した平均値 《平均点の算出について》 •点数の合計÷受験者人数で求める。 –注)受験者人数が0のときは、割り算をしないで、0を平均点にする。 •表示形式 –小数部を2桁で表示する。 –※計算結果を%6.2fの指定で表示する。 と言う問題です。do文を使ってお願いします。
あ、while文でもfor文でも結構です。よろしくお願いします。
住所データを入力してファイルに記録するプログラム作ったつもりなんですが 上手く動かないです。 どこに問題があるかご教授願いします。 #include <stdio.h> #include <string.h> struct jyusyo{ char address[50]; char name[20]; char tel[15]; int age; }; int get_keybord(struct jyusyo *); void put_disk(struct jyusyo *, int,FILE *);
int main(void) { struct jyusyo js_s[10]; int cnt; char f_name[20]; FILE *fp; cnt = get_keybord(js_s); do{ printf("ファイル名>>"); fgets(f_name,sizeof(f_name),stdin); }while(!strlen(f_name)); fp = fopen(f_name,"w"); put_disk(js_s, cnt,fp); return 0; }
int get_keybord(struct jyusyo *jp ) { int i = 0; char buff[5]; do{ printf("住所>>"); fgets(jp->address,sizeof(jp->address),stdin); printf("名前>>"); fgets(jp->name,sizeof(jp->name),stdin); printf("電話>>"); fgets(jp->tel,sizeof(jp->tel),stdin); printf("年齢>>"); fgets(buff,sizeof(buff),stdin); sscanf(buff,"%d",&jp->age); i++; }while((strlen((jp++)->address)) == 0); printf("チェック"); return i-1; } void put_disk(struct jyusyo *jsp, int num,FILE *f_p) { int i; for(i = 0;i < num; i++){ fprintf(f_p,"%s\n",jsp->address); fprintf(f_p,"%s\n",jsp->name); fprintf(f_p,"%s\n",jsp->tel); fprintf(f_p,"%d\n",jsp->age); } fclose(f_p); }
>>418 #include <stdio.h>
int main()
{
char buf[BUFSIZ];
int x, n = 0;
float sum = 0;
for (;;) {
do {
fputs("平均点を求める処理 処理を続けますか:はい(0)、いいえ(9):",
stdout);
if (fgets(buf, sizeof buf, stdin)) {
if (sscanf(buf, "%d", &x) == 1 && x == 9)
goto out;
}
else {
putchar('\n');
goto out;
}
} while (x != 0);
for (;;) { fputs("点数を入力してください(0〜100):", stdout); if (fgets(buf, sizeof buf, stdin)) { if (sscanf(buf, "%d", &x) == 1) { if (x >= 0 && x <= 100) break; else puts("もう一度0〜100の間で点数を入力してください"); } } else { putchar('\n'); goto out; } } sum += x; n++; } out: printf("人数=%d 平均点=%6.2f\n", n, n ? sum / n : 0); return 0; }
>>420 > }while((strlen((jp++)->address)) == 0);
↑ここがクサイ。
>>423 やっていただいてありがとうございます。
でもまだ初心者なのでわからないものばかりです。
学校の宿題なので習ってない記号や文字を使うわけには行かないので。
printf,scanf,do,if,else,while,putchar,for辺りだけ使って出来ませんか?
よろしくお願いします。
> 学校の宿題なので習ってない記号や文字を使うわけには行かない そういうもんなの?
>>426 最初から言え
俺はやらんから他の誰かに期待しろ
あとは自分でやれ。
>>427 教授に習ってない奴を使うと何で知ってるって言われるし自分自身も
そのプログラム見て理解したいですし。
>>428 すいません。申し訳ないです。
431 :
デフォルトの名無しさん :03/06/01 22:31
>>430 それぞれの要素を調べて理解した上で、「自分で調べました」って言えばいいだろ。
>>432 今
>>423 さんのプログラム見て要素を理解しようとしてるんですけど
わからないキーワードが多くて。。
「s」scanfとか「f」putsとか頭文字にわからないものがついていたり
char buf[BUFSIZ]とかマジわからんのです。。
>>433 それはわからんのじゃなくて知らんのだ。調べやがれ。
だから調べろって。
最近のガッコは最初に調べ方を教えないのかねえ・・・
sscanfはscanfの文字列版。 fputsはファイルに出力。 char buf[BUFSIZ]はBUFSIZだけ入る文字列。
>>436 今後のために調べ方教えて下さい。。
>>437 putsとfputsは違うんですかね?情けないことにほとんど知識がないので
わかりません。難しい。
いや、グーグルは知ってます。。
>>440 それで調べ方がわからんと申すか?
貴様プログラムの要る単位あきらめろ。
fgets(buf, sizeof buf, stdin) この辺とか全部見たことないっす。どうか教えて下さい。
>>440 ってことはgoogleの使い方を知らないのですね。
知識がなくて判らないのではなくて、 知恵がなくて調べられないのだろ?
UNIX環境ならmanで一発なんだけどなあ。 WIN環境だと厳しいのだろうか?
>>443 おお、このページかなり役だつっぽいです。ありがとうございました。
>>418 #include <stdio.h>
int main()
{
int a, num = 0, sum = 0;
float avg = 0;
while (1) {
printf("平均点を求める処理 処理を続けますか:はい(0)、いいえ(9):");
scanf("%d", &a);
if (a == 9)
break;
if (a != 0)
continue;
while (1) {
printf("点数を入力してください(0〜100):");
scanf("%d", &a);
if (a >= 0 && a <= 100)
break;
printf("もう一度0〜100の間で点数を入力してください\n");
}
sum += a;
num++;
}
if (num)
avg = sum / num;
printf("人数=%d 平均点=%6.2f\n", num, avg);
return 0;
}
>>448 ホントありがとうございます。もう見てわからないのはfloat avg
位です。
嘘だろ
24行目は avg = (float)sum / num; の間違いだ。
>>450 もちろん何もない状態からこんなの作れなかったです。
ただ単純に見たことのないキーワードがないので教科書を見ながら
解決していけば何とかプログラムが何でこうなるのか理解できそうだと
言う事です。
>>451 わざわざ基本のキーワードだけ本当に使っていただいてありがとうございました。
454 :
デフォルトの名無しさん :03/06/02 00:27
文字列勉強してるんで、
>>41 をやってみたんですけど、値が変なんです。
これって文字列のやつですよね?
任意の行列を入れるってのがよくわかんないんです。
誰か教えてください。
高校で習うまでやらなくてよいです。
>>453 提出は火曜でしょ?もう少し考えなさいな。
つか素数抽出は何度もでてきてるが
たかだか1000までの素数でリストはオーバースペックだな
課題なら仕方ないでしょうな
つーか、リスト要らないんですが… 何に使えと?
1000までリストで作る。 ふるいにかけて削除していく。
メモリと時間の無駄にしか感じられん。 いや、宿題だというのはわかってるよ。
ぁぅ、DPではbin-packingって難しいのね 0-1 knapsack ならうまくいくのに…
・ある文字が英字かどうかを判定する ・ある英字を小文字ならば大文字に変換する このような処理を行うにはどうすれば良いでしょうか? ただしisalpha()などの文字列処理関数を使わずにやりたいのですが… お願いします。
>>465 ある文字がcという変数に代入されてるとして
ASCII前提なら、
if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'))
/* … */
で英字の判定ができる。
ある文字が小文字のとき、大文字に変換するのは
if ('a' <= c && c <= 'z')
c += 'A' - 'a';
でできる。
1000〜2のリストを作る(普通にやると、最初のpopで1000が出てくるので) 最初の要素2をゲトー リストを順順に見て、 2の倍数ハケーンしたら、自分->次->次の次 の関係において、自分->次の次、にしつつ次を殺す。 例えば、2->3->4->5->6->NULLなら、 n=2 [2] 3->4->5->6->NULL [4] 3->5->6->NULL [6] 3->5->NULL で、結果を入れるリストに2をappendしておけ。
int main(void) { struct jyusyo js_s[10]; int cnt; char f_name[20]; FILE *fp; cnt = get_keybord(js_s); do{ printf("ファイル名>>"); fgets(f_name,sizeof(f_name),stdin); }while(!strlen(f_name)); fp = fopen(f_name,"w"); put_disk(js_s, cnt,fp); return 0; }
>>462 悪い、実行してみたら、表示の際、ちゃんとなるようになってるわ。
470 :
デフォルトの名無しさん :03/06/02 08:47
教えてください。困ってます。 1!〜53!を計算して、それらを桁を揃えて出力するCプログラムは? (桁は右に揃える) その際、53!は4.27×10の69乗であることを考慮して 階乗値を入れる配列の大きさを決めなさい。 お願いします。
前にあったけど多倍長でやるのか?
多倍長を使ってお願いします。
#include <stdio.h> #define SIZE 10 #define BASE 10000000 long factrial[SIZE] = { 0 }; void print_factrial(void) { long *p = factrial; for (; p < factrial + SIZE && *p == 0; p++) printf(" "); printf("%7ld", *p++); for (; p < factrial + SIZE; p++) printf("%07ld", *p); } void product(int i) { long *p = factrial; for (; p < factrial + SIZE; p++) *p *= i; for(p--; p > factrial; p--) { *(p-1) += *p / BASE; *p %= BASE; } } int main(void) { int i; factrial[SIZE-1] = 1; for (i = 1; i <= 53; i++) { product(i); printf("%2d!=", i); print_factrial(); putchar('\n'); } return 0; }
474 :
デフォルトの名無しさん :03/06/02 11:05
コマンドラインからふたつの引数を与え、第一引数で示されるファイルを第二引数の名前でコピーするプログラムを作成せよ。 言語はCです。よろしくお願いします。
475 :
デフォルトの名無しさん :03/06/02 11:20
以下のプログラムがどのように実行されるか説明せよ. int count; void func1(int val, int *called) { int count; count = 2; printf("func1: count は %d です.\n", ++count); printf("func1: called は %d です.\n", *called); printf("func1: val は %d です.\n", val); ++count; ++(*called); } void func2(int count, int *called) { printf("func2: count は %d です.\n", ++count); printf("func2: called は %d です.\n", *called); ++count; } void main(int argc, char *argv[]) { int called = 1; count = 1; printf("main: count は %d です.\n", count); func1(count, &called); printf("main: count は %d です.\n", count); func2(count, &called); printf("main: count は %d です.\n", count); }
#include <unistd.h> int main( int argc , char* argv[] ) { char program[] = "cp"; argv[0] = program; return execvp( program , argv ); }
477 :
デフォルトの名無しさん :03/06/02 11:25
ものスゴク下らない質問してもよいですか? VC++で テキストエデイタのコントロールが 未入力(NULL)の場合にメッセージを表示したいんです おしえてください。おながいします
fgetc使えば?
int count; void func1(int val, int *called) { int count; count = 2; printf("func1: count は %d です.\n", ++count); 3 printf("func1: called は %d です.\n", *called); 1 printf("func1: val は %d です.\n", val); 1 ++count; 4 ++(*called); 2 } void func2(int count, int *called) { printf("func2: count は %d です.\n", ++count); 1 printf("func2: called は %d です.\n", *called); 2 ++count; 2 } void main(int argc, char *argv[]) { int called = 1; count = 1; printf("main: count は %d です.\n", count); 1 func1(count, &called); printf("main: count は %d です.\n", count); 1 func2(count, &called); printf("main: count は %d です.\n", count); 1 }
>>477 それ宿題なの?
GetWindowText() の返り血を "" と比較すればいいんじゃない?
481 :
デフォルトの名無しさん :03/06/02 12:59
>>480 ナルフォドstrcmpで比較する手がありますたね
ありがとうございます。
482 :
YahooBB219001164144.bbtec.net :03/06/02 13:46
学校の教科書の例題なんですけど、 ヒットミス法でeのx乗を0から1までの定積分を求めよ という問題があるのですが、いまいちどういう方針でとけばいいのかわかりません。 だれかヒント教えてくれませんか?
ちなみに、 ヒットミス法 与えられた関数f(x)を「0 <= f(x)/fmax <=1」で規格化します。 試行回数(発生した乱数の数)をNとします。 乱数sを発生させ、そのsに対するf(s)を求め、さらにもう1個の乱数rを発生させます。 もし、r<=f(s)ならrを採用(hit)し、それ以外は捨てます(miss)。 採用された回数をnとすると、f(x)の0から1までの積分値は、 (n/N)*fmaxによって求められます
>>474 main(int argc, char* argv[])
{
execvp("cp", argv);
}
487 :
デフォルトの名無しさん :03/06/02 14:48
hoge[0] == '\0'でいいのでは。
for (i = 0; i < N; i++) { s = rand(); r = rand(); if (r <= f(s)) n++; }
>>487 つーか、GetWindowText()の戻り値って文字列長じゃなかったっけ?
全くわからないのでおながいします。 身長と標準体重の対応表を表示するプログラムを for 文を使って作成せよ。 なお、表示する身長の範囲(開始値,終了値,増分)は、整数値として読み込み、標準体重は小数点以下を2桁だけ表示すること。 実行例:(下線部分は実行時に入力) 開始値: 130 終了値: 190 増分: 5 130 cm 37.2 kg 135 cm 40.1 kg : : 190 cm 79.4 kg
scanfとかで入れてforループだろ。
494 :
駆け出し厨 :03/06/02 16:30
すいません ボタンコントロールのウインドウハンドルって どうやって取得したらいいですか?
>>490 乱数の発生法として線形合同法をつかわないといけないのですが。。。
#include <stdio.h> #include <math.h> #include <stdlib.h> #define N 100000 int b ,i , n ; long int a , m , mod ,seed ; double c , fx , p ;
main() { n = 0 ; a = 1664525 ; b = 1 ; m = 1013904223 ; seed = 10 ; fx = exp(0.3) ; for ( i=1 ; i <= 2*N ; i++){ seed = ( a * seed + b ) % m ; c = (double)seed / m ; if ( fx >= c ){ n++ ; } fx = exp(c) ; } p =(double)n / N ; printf ("%f\n", p ) ; }
ここまでやったのですが、どこがまちがってるのかわからないのです
>>494 ここは質問スレじゃない。
CButton::m_hWnd;
>>495 ヒントをくれと言うから、
>>490 がちゃんとヒント(というか答)を書いてるのに、
もとの文章には一切書いてないことで文句を言う。
どういう教育受けたらそういう馬鹿なれるの?
一回のループで乱数は2回生成しなければ。 こんなんはいかが? #include <stdio.h> #include <stdlib.h> #include <math.h> double f(double x){ return exp(x);} #define fmax f(1.0) static unsigned long seedS; #define a 1664525UL #define b 0UL #define m 4294967296UL void usr_srand(unsigned long s){ seedS = s;} double usr_rand(void){ seedS = ( a * seedS + b ) % m; return (double)seedS / m;} #define N 10000000 main() { double r, s; long i, n; usr_srand(1UL); n = 0; for (i = 0L; i < N; i++) { s = usr_rand(); r = usr_rand();if (r <= f(s) / fmax) n++; } printf("S=%12.8f\n", (double)n / N * fmax); }
なんかいちいち煽る奴がうざい。言い方があるだろ。
>>502 ありがとうございます。
そっか、一回のるーぷで乱数を2回生成したらいいのか。。。。
もうちょいよくかんがえてみます。
#include <stdio.h> int main(void) { int h_min, h_max, dh; double h, w; printf("開始値: "); scanf("%d", &h_min); printf("終了値: "); scanf("%d", &h_max); printf("増分: "); scanf("%d", &dh); for (h = h_min; h <= h_max; h += dh) { w = h * h * 22 / 10000; printf("%.0f cm\t%.2f kg\n", h, w); } return 0; }
>>504 結局、おまえは全部答書いてもらわないと理解できないんだろ?
なら、「ヒントくれ」なんて書かずに、正直に「作ってくれ」って丸投げしろよ。
507 :
>>504 :03/06/02 18:40
508 :
デフォルトの名無しさん :03/06/02 19:11
509 :
>>453 :03/06/02 23:31
> 単純に大きな配列を準備する方法は、一般化が行き届いていないのが不満です。 意味不明。説明求む。
511 :
>>510 :03/06/02 23:48
確かに意味不明でした。 巨大な配列を準備するのに抵抗があるという感覚にすぎません。 なお、N=100 が巨大、というわけではないので念のため。
やってくださいというわけじゃないですが、 1からhttpサーバ作ろうと思ったらどれくらい時間かかるでしょうか…?
「1から」は削除してください。 UNIXで作るんですが…今からソケット覚えて3日かそこらで作れるでしょうか?
>>512 Apacheでさえ多くの人と時間ががかかわってきてるのにまだ完成に至らない。
>>516 エラー処理無しでGETにファイル返すだけならいけるかも
>>509 > 終了判定に難がありますが、私としてはリストを使うこの方法は好ましく思います。
この用途の場合、最初から要素数が決まっていて増える事がないし、
消してもその領域を再利用することがないので、リストは必要ないと思います。
>>516 PとかRではじまるスクリプト言語なら簡単に書けると思うが
PythonとRubyか?
PostScriptとR言語
7行プログラムスレにHTTPDがあるわけだが
Cです… とりあえずエラー処理なしならいけそうですか。どうもです。
525 :
>>519 :03/06/03 00:51
御意。 エラトステネスの篩で配列を使用すれば、その Ο(1)で望みの場所にフラグを立てる /落とすことができるという特徴を十分にいかすことができますから、速度・領域 のいずれの点からもリストには分がないですね。
C++で、足し算を行うプログラム&引き算を行うプログラムを教えてくれ
いいから教えろ
>>529 釣りだよな?w
ま、それは「教えて」というか「作ってくれ」ということなんだろうなw
数字と+読みとって足せばいい。
そうですw 教えてくれってゆうか作ってくれ
どういう仕様なのかはっきり書け。
int main() { int a = 1; int b = 2; int resultTasizan = a + b; int resultHikizan = a - b; printf("足し算の答え %d\n引き算の答え %d\n", a, b); return 0; } //使うときにはソースを書き換えてあげてください。
>>528 「IE」とは限らないだろ?
「ブラウザ」って書けよ。
ブラウザって、何をブラウズするものなんですか?
ここってマジで教えてくれるんですか?
540 :
デフォルトの名無しさん :03/06/03 12:51
f(x)=exp(1.37*x)とする。 (2) xを二つの領域(0<=x=<0.2 , 0,2<=x=<0.4)にわけ、それぞれの領域で ラグランジュ補間を行い、0から0,4までの間で0.02きざみで、f(x) の値、 補間による近似値 g(x) 及び、 f(x)-g(x) の値を表にして示すとともに、 グラフとして図示せよ。表は線はいらず、計算結果をプリントアウトしたものとする。 図は手書きでもグラフソフト使用でも可。 ex x f(x) g(x) f(x)-g(x) 0 〜〜 〜〜 〜〜 0.2 〜〜 〜〜 〜〜 ・ 〜〜 〜〜 〜〜 ・ 〜〜 〜〜 〜〜 ・ ・ (3) (2)で得られた21個のxとf(x)のデーターに対し、最小二乗法による理論式 y=A*x+B の最適のA,Bの値を推理せよ。
(4) exp(0.37*x)テイラー展開して、第二項までを取った直線の式を y=A'*x+B'とするとき、(3)で得られた y=A*x+Bに対する N E(A,B)= (yi-A*xi-B)^2 i=1 と、y=A'*x+Bに対する N E(A',B')= (yi-A'*xi-B')^2 i=1 を求め、E(A,B)<=E(A',B')を示せ・・・。 提出物 @ (2),(3),(4)が一気に行えるプログラム A 動作結果 B アルゴリズム C フローチャート もうだめですTT どなたかお願いします。
542 :
540 続き :03/06/03 12:52
(4) exp(0.37*x)テイラー展開して、第二項までを取った直線の式を y=A'*x+B'とするとき、(3)で得られた y=A*x+Bに対する N E(A,B)= (yi-A*xi-B)^2 i=1 と、y=A'*x+Bに対する N E(A',B')= (yi-A'*xi-B')^2 i=1 を求め、E(A,B)<=E(A',B')を示せ・・・。 提出物 @ (2),(3),(4)が一気に行えるプログラム A 動作結果 B アルゴリズム C フローチャート もうだめですTT どなたかお願いします。
二重投稿スマソ。
あーおれもスプライン補完ラグランジュ補完は JAVAでやったことあるけど意味不明だったな・・・
545 :
デフォルトの名無しさん :03/06/03 12:59
>>534 のは使えません!
もっとちゃんと教えろ!
おいおい・・・ただ「足し算と引き算を行うプログラム」を やってくれと言ってるだけだぞ? 例1 1+5+10をキーボードから入力すると、 結果は16ですと表示されるようにしたいんだ!! これも加えて引き算もわからんので頼む!
549 :
動画直リン :03/06/03 13:13
>>548 そんなに簡単だと思うのなら自分でやってみたら?
実は以前ここで+-*/をやる計算機って問題が出て、
それを解いたものがあるんだけど、
オーバースペックだし行数多いから張らないw
551 :
デフォルトの名無しさん :03/06/03 13:51
552 :
デフォルトの名無しさん :03/06/03 14:11
すみません C++というかVC++(5.0)なんですけど いいですか? 同じ cppファイル内で関数 a_Function()というのを作って それをボタンが押された度に呼出したいのですが うまくいきません。 a_Function:定義されていない識別子です。のコンパイルエラーが出ます。 VCはまだ浅いので どなたさんか問題点の指摘 アドバイス等 頂けないでしょうか。
>>526 、
>>539 ここは質問スレじゃないってば。
>>526 #include <stdio.h>
int main(void)
{
char buf[BUFSIZ - 30];
char cmd[BUFSIZ];
fgets(buf, sizeof(buf), stdin);
sprintf(cmd, "awk 'BEGIN {print \"結果は\"%s\"だろうよ\"}' /dev/null", buf);
system(cmd);
return 0;
}
>>552 MFCかVC++の質問スレはなかったか?
クラスウィザードでボタンのIDを選んでメッセージBN_CLIKEDを選んで関数の追加。
その名前をa_Function()にすれば医員で内科医?
555 :
デフォルトの名無しさん :03/06/03 14:28
>>554 そ そんなウラワザがあったんですね。
大変たすかりました。
ありがとうございました。
>>553 error C2065: 'system' : 定義されていない識別子です。
っていうエラーがでますたww
>>557 あ、いつも(自作の)テンプレ使ってるから忘れてた。
テンプレートならいつもの三点セットは入れておかなくちゃ。
いつもの三点とは何かと小一時間
stdio.h stdlib.h string.h
c: In function `emp':どんないみですか?
563 :
デフォルトの名無しさん :03/06/03 15:04
empという関数の中で
ありがとうございまつ。
invalid operands to binary * はどんないみですか?
>>565 「今すぐ英和辞典を買ってきなさい」という意味
>>565 いんヴぁりどおぺらんずつーばいなりあすてりすく
といういみでつ。
>>559 テンプレには入ってるよ。<stdlib.h
>>540-541 ここはそういうレベルの高い宿題は分かる人がいないので教えてくれません。
最近では
>>409-410 などもレベルの高い問題にあたります。
ここでは素数の求め方とか階乗とか文字列のひっくり返し方とか聞いて下さい。
>>540 (2)どの点を使って補間するのかわからん。(3)以降を見るに、0と0.2、0.2と0.4の点を
使ってやるようにも思える。合ってるか?
(4)xi、yiの定義は?もし、(3)で使ったxとf(x)のデータなら、
そうなるのは当たり前。最小二乗法だから。
予想通り教えてくれる人が現れた。
俺も教えてやりたいが10年早い。 10年後を楽しみに待っててくれ!
576 :
デフォルトの名無しさん :03/06/03 18:23
/* 1) 学籍番号:0381074 氏名:中島裕吾 作成日:平成15年5月30日 2) 問題:(a+b)*c/bとa+b*c/bを計算するプログラムを作成せよ。 3) 問題の分析:実数の計算をし、実数で表示させるプログラム。 4) ソースプログラム: */ #include <stdio.h> int main(void) { float a=2.34,b=5.58,c=6.765,d,e; d=(a+b)*c/b; e=a+b*c/b; printf("(a+b)*c/b=%f \n a+b*c/b=%f \n",d,e); } /* 5) 実行結果:(a+b)*c/b=9.601935 a+b*c/b=9.105000 6) 結果の分析の感想:()があるかないかで答えがちがうところ が出力できた。 */
577 :
デフォルトの名無しさん :03/06/03 18:26
/* 1) 2) 問題:scanf()を使ってキーボードからdouble型変数a,b,cにデータを入力し、 (a+b)*c/bとa+b*c/bを計算するプログラムを作成せよ。 3) 問題の分析:double型とscanf()を使って計算をするプログラム。 4) ソースプログラム: */ #include <stdio.h> int main(void) { double a,b,c,d,e; printf("実数を入力して下さい!12.3 23.4 2.65\n"); scanf("%lf%lf%lf",&a,&b,&c); d=(a+b)*c/b; e=a+b*c/b; printf("%.1f %.1f %.2f\n",a,b,c); printf("(a+b)*c/b=%.3f \n a+b*c/b=%.3f \n",d,e); } /* 5) 実行結果:12.3 23.4 2.65 (a+b)*c/b=4.0 a+b*c/b=15.0 6) 結果の分析の感想:出力は課題どうりになったと思う。指定子で小数点以下を 指定したのでとても見やすくなった。 */
1.実名を書いてしまったので、困って逃げた。 2.嫌いな奴の実名を書いて、さらしage
>>409-410 は方針は考えてあるんだけど、プログラムを書くまとまった時間がとれん。
あー、やる気が途中でうせた版ならあげてみるか。
void ResolveProblem(int iBottle,int iThings[],int iNumThings){
int volume[100]; // bottleの使用容量
int i,j,n;
for(i=0;i<iNumThings;i++){
volume[i]=0;
}
j=0;
for(n=0;n<iNumThings;n++){
int flag = 0;
for(i=0;i<j;i++){
if(volume[i] + iThings[n] <= iBottle){
printf("%d is inserted No. %2d : %d: before(%d) -> after(%d) \n"
, n , i , iThings[n] , volume[i] , volume[i]+iThings[n]);
volume[i]+=iThings[n];
flag = 1;
break;
}
}
if(flag == 0){
printf("Make a new bottle -> %d \n", j);
printf("%d is inserted to No. %2d : %d: before(%d) -> after(%d) \n"
, n , j , iThings[n] , volume[j] , volume[j]+iThings[n]);
volume[j++]=iThings[n];
}
}
for(n=0;n<j;n++){
printf("%d ",volume[n]);
}
}
予め、iThingsにはデータを物体の重さをソートして入れておく。 nはどの物体をビンに入れようとしているか。 iは物体を入れるビンの番号 jは現在のビンの本数 あー、もっといい方法があったなぁ、でも面倒なのでやめ。
ソートは、逆順(あれ?データが大きい→小さい順ってこれだっけ?)で。 1.今持ってるビンのなかで、物体iを入れれるのがあるか? 2.あれば、入れる。 3.なければ、新しいビンを用意して入れる。 これだけ。実際には、ビンに入れれるデータの件数とか気にしなければ、 ビンnにデータiが入れれるのに、新しいビンを用意した場合だけが非効率となるので、 まあこれでいいんじゃないの?
582 :
デフォルトの名無しさん :03/06/03 19:56
3次元正方向行列Aと3次元ベクトルxの各要素の値を入力し y=Ax を求めよ。 という問題なんですが、具体的にどういう計算をすれば良いのでしょうか? (入力するデータはすべて与えられています) Cと言うより数学の質問のような気がしますがお願いします。
3次元正方向行列て何?
x: x1 x2 x3 A: a11 a12 a13 a21 a22 a23 a31 a32 a33 y: a11*x1+a12*x2+a13*x3 a21*x1+a22*x2+a23*x3 a31*x1+a32*x2+a33*x3
Cで XMLのデータをパースしなきゃならないんですが、 詳しい人います?
expat libxml
587です。 C言語のことなら俺にきけ板でも書いたのですが、 宿題っぽいので、こっちに書きます。
いくつもデータがあるかもしれない データをCでパースしなきゃいけない のですが、どうすればいいですか?
ここは質問スレじゃない
ここは宿題をやりたいやつが集まるスレだ。 勘違いすんなよ!
Cで次のような出力を表示するタイピングプログラムを作成せよ 問題1:"tamachan">gomachan Miss! 問題2:"Asakusa">Asakusa OK!
>>596 問題は"tamachann"と"Asakusa"で固定です。
問題の数字が全角なのがメンドクセw
俺も思った。
600 :
デフォルトの名無しさん :03/06/03 23:07
じゃあ半角でいいよ
ムカツク
602 :
リアル宿題 :03/06/03 23:10
配列を使ってプログラムを書いてください。二つのベクトルA、Bを考えます。 A=a1ix+a2iy+a3iz ,B=b1ix+b2iy+b3izとします。ここで、ix,iy,izはX、Y、Z方向の 単位ベクトルです。二つのベクトルの内積を計算しなさい。 A・B=a1b1+a2b2+a3b3です。要素の値はa1=1、a2=2、a3=3、 b1=2、b2=3、b3=4とします。 FOR文を使った場合と使わない場合のプログラムを書いてください。
printf("%d\n", 1*2+2*3+3*4);
>>595 /* タイピングプログラム */
#include <stdio.h>
int main()
{
puts("問題1:\"tamachan\">gomachan\n"
"Miss!\n"
"問題2:\"Asakusa\">Asakusa\n"
"OK!");
return 0;
}
8桁の2進数を00000000〜11111111まで数え上げるプログラム 出力結果例 10進数 2進数 0 00000000 1 00000001 2 00000010 ・ ・ ・
>>604 それ使って提出したレポートが返ってきました…。
配列使わないと駄目みたいです…
>>606 int main() {
int i, j:
for( i = 0; i<256; i++ ) {
printf("%d ",i);
for( j = 0x80; j != 0; j >>= 1 )
printf("%s" j & i ? "1" : "0" );
printf("n");
}
}
>>605 >の右側は自分で入力して、それが問題と同じ文字列なら"OK!"を、違っていたら"Miss!"を出力する、という意味ですが・・・説明足りなくてすみません。
>>611 そうなんですか・・・
あきらかに「大学の課題を解いてくれ!」みたいな質問は
相手にされない、ということですか?
>>609 >printf("n");
printf("\n");
だろ?
>>595 #include <stdio.h>
#include <string.h>
int main()
{
const char* answer[] = { "Miss!", "OK!" };
const int n = 2;
const char* question[] = { "tamachann", "Asakusa" };
char buf[BUFSIZ];
int i;
for (i = 0; i < n; i++) {
printf("問題%d:\"%s\">", i + 1, question[i]);
if (fgets(buf, sizeof buf, stdin) == NULL) {
putchar('\n');
break;
}
puts(answer[strncmp(question[i], buf, strlen(question[i])) == 0]);
}
return 0;
}
#include <stdio.h> #include <string.h> int main() { char buf[123456]; printf("問題1:\"tamachan\">"); fgets(buf,sizeof buf,stdin); if(strcmp(buf,"tamachan\n") printf("Miss!\n"); else printf("OK!\n"); printf("問題2:\"tamachan\">"); fgets(buf,sizeof buf,stdin); if(strcmp(buf,"Asakusa\n") printf("Miss!\n"); else printf("OK!\n"); return 0; }
>>614 エラく危険なコードを書いてくれますね…
tamachannnnnnnn123456789abcefと入力してもOK!と表示されそうだ。
確かに
>>619 そのときは、本当はどう表示するのが正解なの?
修正版 #include <stdio.h> #include <string.h> int main() { const char* answers[] = { "Miss!", "OK!" }; const int nqustions = 2; const char* questions[] = { "tamachann", "Asakusa" }; char buf[BUFSIZ], *p; int i; for (i = 0; i < nqustions; i++) { printf("問題%d:\"%s\">", i + 1, questions[i]); if (fgets(buf, sizeof buf, stdin) == NULL) { putchar('\n'); break; } if ((p = strchr(buf, '\n'))) *p = 0; puts(answers[strcmp(questions[i], buf) == 0]); } return 0; }
include <stdio.h> #include <string.h> main(){ char a[20],b[20],c[20]={"tamachan"},d[20]={"Asakusa"}; printf("問題1:\"tamachan\">"); gets(a); if(strcmp(a,c)==0){ printf("OK! "); }else{ printf("Miss!!"); } printf("問題2:\"Asakusa\">"); gets(b); if(strcmp(b,d)==0){ printf("OK! "); }else{ printf("Miss!!"); } return (0); } スペース入れたらダメだけど作ってみたぽ
一番上の#だけコピペ失敗
100 個以下の正の整数を配列に入力。その配列要素の値を逆順に入 れ替えを行った後、表示するプログラムを作成せよ。(入力した整数の個数 をnなら、0番目の要素はn-1番目の要素と、1番目の要素はn-2番目の要 素と入れ替える。)入力終了は,負の数で検出するものとする。また、使用 する配列は一つのみとする。
gets使うな
>>625 #include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
typedef std::vector< int > vector;
vector::size_type const max = 100;
vector v;
int input;
while( v.size() < max && std::cin >> input && input >= 0 ) v.push_back( input );
std::reverse( v.begin() , v.end() );
std::copy( v.begin() , v.end() , std::ostream_iterator< int >( std::cout , "\n" ) );
}
ワーイC++サイコー
#include <algorithm> #include <iterator> #include <iostream> int main() { const int max = 100; int array[max], input, i; for(i=0;i<100 && std::cin >> input && input >= 0;++i) array[i] = input; std::reverse(array, array + i); std::copy(array, array + i, std::ostream_iterator<int>(std::cout, "\n")); }
>>625 #include <stdio.h>
#include <string.h>
#define ARRAYSIZE 100
void reverse(int a[], int n) {
int i, j, t;
for (i = 0, j = n - 1; i < j; ++i, --j) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
int main() {
char buf[BUFSIZ];
int i, a[ARRAYSIZE], n;
for (n = 0; n < ARRAYSIZE;) {
if (!fgets(buf, sizeof buf, stdin))
break;
if (sscanf(buf, "%d", &a[n]) == 1) {
if (a[n] < 0)
break;
++n;
}
while (!strchr(buf, '\n') &&
fgets(buf, sizeof buf, stdin));
}
reverse(a, n);
for (i = 0; i < n; ++i)
printf("%d\n", a[i]);
return 0;
}
もうすこし易しくかけないものかね、、、
630の意図がわからない。627の後にそのコードを出すことに何の意味があるのでしょう?
>>572 様
俺もよくわかんないんですTT
金曜日に提出なので明日中にはっきりしてきたいと思います・・。TT
635 :
デフォルトの名無しさん :03/06/04 02:48
□□□□□□■ □□□□□■■ □□□□■■■ □□□■■■■ □□■■■■■ □■■■■■■ ■■■■■■■ と ■□□□□□■ ■■□□□■■ ■■■□■■■ ■■■■■■■ ■■■□■■■ ■■□□□■■ ■□□□□□■ を表記するプログラム作ってください! #include <stdio.h> main() { intsize, i, j; printf("サイズを入力して下さい:"); scanf("%d", &size ); for( j = 0; j < size; j++ ) の後続けて
static char str={ "□□□□□□■\n" "□□□□□■■\n" "□□□□■■■\n" "□□□■■■■\n" "□□■■■■■\n" "□■■■■■■\n" "■■■■■■■\n" }; printf(str);
for(int j=0;j<MAX;j++) { for(int i=0;i<MAX;i++) printf("%s",(MAX-i-1)>j?"□":"■"); printf("\n"); }
639 :
デフォルトの名無しさん :03/06/04 03:01
2重ループを使って表示するのですが…。
640 :
デフォルトの名無しさん :03/06/04 03:04
できるだけ簡単な初歩的な関数だけを使って作成してください・・・
ちょうちょのヤツは、それを工夫して ^(排他的論理和)を使うとできるよ。
typedef char* ET; struct node { ET x; struct node *next; }; こういう構造体の単方向リストで、 一つ前のノードを返す関数struct node * prevnode(struct node *p) を作成するという問題を教えてください。
無理
C++で構造体(クラスでもいいのですが)を直接ファイルに読み書きしたいのですが 下記ソースで行うと正常に読み書きできません。 MSDN見ながらがんがったのですが(´・ω・`) ちなみに環境はVC++6.0コンパイラを使いますた。 どのように修正すればよいか教えて下さい。 #include <iostream.h> #include <fstream.h> struct tbl { int a; char b[10]; }; void main(){ tbl t1 = {100,"abc"}; tbl t2; ofstream ofs("c:\\test.dat",ios::binary); ofs.write(char*)&t1,sizeof(struct tbl)); ofs.close; ifstream ifs("c:\\test.dat",ios::binary); ifs.read((char*)&t2,sizeof(struct tbl)); ifs.close(); cout << t2.a << "\t" << t2.b << endl; }
コンパイル通らないように見えますが?
>>646 レス遅くなりました。ごめんなさい
えっと学校で作った時のソースを思い出しながら書いたのでどこかスペルミスがあるかもしれません。
コピペで家のVC.NETでコンパイルしたら通りませんでした・・・
で、打ち直して動かしたら普通に動いちゃいました・・・
動作確認済みのソースを下に張っておきます。
それにしても、学校での苦労はなんだったのだろう。・゚・(ノД`)・゚・。
ずれて読みにくかったら申し訳ございません。(先にお詫びを・・・)
#include <iostream.h>
#include <fstream.h>
struct tbl{
int a;
char b[10];
};
void main(){
tbl t1 = {115,"abc"};
tbl t2;
ofstream ofs("c:\\test.dat",ios::binary);
ofs.write((char *)&t1,sizeof(struct tbl));
ofs.close();
ifstream ifs("c:\\test.dat",ios::binary);
ifs.read((char *)&t2,sizeof(struct tbl));
ifs.close();
cout << t2.a << "\t" << t2.b << endl;
}
たびたびすいません。 ↑のソースコピペでビルドして動作確認致しました。
>>648 学校でコンパイルした時はコンパイルエラーは出なくて
読み込みと書き込みは行っているのですが
正常にt1→ファイル→t2とデータが移ってもらえなかったのです。
状況報告あいまいで申し訳ございません。
構造体を詳しく教えろ!
構造体は変数を複数格納しておけるもの。 変数が物を格納できるバケツに例えられるならば、 構造体はそのバケツを複数格納できる棚のようなもの。 プログラマは棚とバケツを指定してやって中の値を取り出すことができる。 Cでは格納や取り出しは自由自在だが、C++になるとアクセス制限もかけられるようになる。 概念的な解説は以上だ。わかったか?
653 :
デフォルトの名無しさん :03/06/04 12:19
ポインタを用いたリスト(リンクによるリスト)によるキュー(待ち行列)のプログラムである.キューの各要素は以下のような構造体となっている. typedef struct node{ char word[MAXWORDLEN] ; struct node *Next ; } node_t ; ex4o を実行すると最初は次のようになる. %ex4o Initialize a queue. > ここで,”> “ は,キューの処理のためのコマンド入力を促すプロンプトである.入力できるコマンドは以下の3つである. c (キューを初期化する) e #WORD(s) (キューの先頭に要素(単語(複数も可)WORD(s)をwordに格納した構造体node_t)を追加する) d (キューの先頭の要素を取り出し,wordの中身を出力する.キューになにもデータがない時は,No more data.と出力する). 以下は実行例である. % ex4o Initialize a queue. > d No more data. > e programming Enqueue: [programming] > e group 3 Enqueue: [group 3] > d Ctrl-d (コントロールキーを押しながらdを押すこと)でプログラムは終了する,このプログラムを作成せよ.
>>653 データがある時のdの実行例がないのは、何も出力しなくていいからか?
あれ?計算量(の最悪値)は、 「最終的なbottleの数 x 要素の数」 じゃないかな?データが倍になっても、計算時間は倍になるだけpo.
>>581 の方法はどれに入れるかが指定されていないので不完全だが、
一つの完成として first fit という algorithm がある。
しかし first fit は最適解を与えない場合があることが知られている。
げ、よく考えたらsearch関数の一番外側のfor文がおかしいかも。
>>657 そんなわけない。bin-packing の最適化問題は有名なNP完全問題だ。
やっぱりfor文の辺りを間違えていました。
20個でも直に終わるようになりました。
だけど再帰を使ってるから
>>659 さんのものより多分遅いTT
>>658 だよね。
厳密解を要求されてるから、結局は全組み合わせを調べるしか無いのかなあ、と。
665 :
デフォルトの名無しさん :03/06/04 14:52
>>653 です。訂正してもう一度書き込みます!!
ポインタを用いたリスト(リンクによるリスト)によるキュー(待ち行列)のプログラムである.キューの各要素は以下のような構造体となっている.
typedef struct node{char word[MAXWORDLEN] ;struct node *Next ;} node_t ;
ex4o を実行すると最初は次のようになる.
%ex4o
Initialize a queue.
>
ここで,”> “ は,キューの処理のためのコマンド入力を促すプロンプトで入力できるコマンドは以下の3つである.
c (キューを初期化する)
e #WORD(s) (キューの先頭に要素(単語(複数も可)WORD(s)をwordに格納した構造体node_t)を追加する)
d (キューの先頭の要素を取り出し,wordの中身を出力する.キューになにもデータがない時は,No more data.と出力する).
% ex4o
Initialize a queue.
> d
No more data.
> e programming
Enqueue: [programming]
> e group 3
Enqueue: [group 3]
> d
Dequeue: [programming]
> d
Dequeue: [group 3]
> e practice
Enqueue: [practice]
> c
Initialize a queue.
> d
No more data
>
Ctrl-d (コントロールキーを押しながらdを押すこと)でプログラムは終了する,このプログラムを作成せよ.
667 :
デフォルトの名無しさん :03/06/04 15:36
>>664 だと
Initialize a queue.
No more data.
Enqueue: [programming]
Enqueue: [group 3]
Dequeue: [programming]
Dequeue: [group 3]
Enqueue: [practice]が出ないんですよ〜
668 :
デフォルトの名無しさん :03/06/04 15:50
整数値を扱うための線形連結リストにおいて セルの挿入、削除を行う関数を教えてください。
セルってなに?
670 :
デフォルトの名無しさん :03/06/04 16:05
C++の演算子関数とクラスを使って、 cinした数値の平均と総和出せるようにしたいんですけど、 クラスの宣言くらいしかやり方わかんないんです。 どんなプログラムにすればいいか教えてください(つд`)
>669 最強の人造人間
>>667 ふうん。そこは、
mainに書けばいいと思ったんだけど。
まぁいいか。どうでも。
673 :
赤木ハルコ :03/06/04 17:19
π(円周率)を小数以下10000桁まで求めるプログラムをC言語で作成し、 9991桁から10000桁の10個の数字を表示しなさい。 諸注意 ANSI準拠のC言語を用いること。マーチンの法則を用いること。 こんな宿題が出ましたが〜どなたかやっていただけないでしょうか? よろしくお願いいたします
>>670 #include <iostream>
#include <numeric>
#include <vector>
using namespace std;
class NumArray
{
protected:
vector<double> vec;
public:
void Add(double d) { vec.push_back(d); }
double GetTotal() { return accumulate(vec.begin(), vec.end(), 0.0); }
double GetAverage() { return accumulate(vec.begin(), vec.end(), 0.0) / vec.size(); }
}
void main()
{
NumArray array;
while(cin.good())
{
double num;
cin >> num;
array.Add(num);
}
cout << "平均は" << array.GetAverage() << endl;
cout << "総和は" << array.GetTotal() << endl;
}
× double GetAverage() { return accumulate(vec.begin(), vec.end(), 0.0) / vec.size(); } } ○ double GetAverage() { return accumulate(vec.begin(), vec.end(), 0.0) / vec.size(); } };
>>668 >673の
struct nodeを、整数を格納できるように変更して
Node_Create()とNode_Display()をそれにあわせて変更する。
それでOK。
>厳密解を要求されてるから、結局は全組み合わせを調べるしか無いのかなあ、と。 うがぁ。調べて分かりますた。ショボーン
1分間に処理できるアクセス要求がμ=6であるWWWサーバーを考え、そのサーバーに1分あたりのアクセス要求の系列がλ=5のポアソン分布に従う負荷が掛かるとき、各分ごとの未処理のアクセス要求数はいくらになるかシミュレーションにより求めよ。 ここでn分目開始時点における未処理のアクセス要求をXn(初期状態としてX1=0)、n分目に到着するアクセス要求をAnとおくと、Xn+1=max(Xn+An−μ、0)であることに注意する。またシミュレーションでは初期状態の影響を取り除 くため、n=200分目から1200分目のXnについて平均を求め、さらに乱数の種を変えて20回実行し、これら20個のデータから95%信頼区も評価せよ。ただし自由度19のt分布における95%信頼区間を与えるt0は2.09である onegaisimasu
681 :
デフォルトの名無しさん :03/06/04 18:27
一回のループでいいかと思いまつ 見づらいソースで申し訳ありませぬ(´Д`;)
int reverse_replace(char *s,char c) { int i,j,r; char tmp; r=0; for(i=0,j=strlen(s)-1;i<j;i++,j--){ tmp=s[i]; s[i]=(s[j]==c)? r++,'\\':s[j]; s[j]=(tmp==c)? r++,'\\':tmp; } return r; }
>674さん ありがとうございますおかげで何とかできました。 たびたび注文してすいませんが、protectedではなくprivateにして、 演算子はoperatorメンバ関数を使ってオーバーロードする方法だったらどうなりますか? 良かったら教えてください
686 :
デフォルトの名無しさん :03/06/04 19:13
>>680 このスレのどっかにそれとおなじようなのがあったきがする
>>684 バグってた。鬱
int reverse_replace(char *s,char c)
{
int i,j,r;
char tmp;
r=0;
for(i=0,j=strlen(s)-1;i<j;i++,j--){
tmp=s[i];
s[i]=(s[j]==c)? r++,'\\':s[j];
s[j]=(tmp==c)? r++,'\\':tmp;
}
if((i==j)&&(s[i]==c)) r++;
return r;
}
687サン ありがとうございまつ〜
689 :
デフォルトの名無しさん :03/06/04 19:32
>>681 その変換文字数 5というのはどのようにして得られた値なの?
>>685 #include <iostream>
#include <numeric>
#include <vector>
using namespace std;
class NumArray
{
private:
vector<double> vec;
public:
void operator+=(double d) { vec.push_back(d); }
void Add(double d) { vec.push_back(d); }
double GetTotal() { return accumulate(vec.begin(), vec.end(), 0.0); }
double GetAverage() { return GetTotal() / vec.size(); }
friend ostream& operator<<(ostream& os, NumArray& na);
};
ostream& operator<<(ostream& os, NumArray& na)
{
os << na.GetTotal() << endl;
return os;
}
int main() { NumArray array; for(;;) { double num; cin >> num; if(cin.fail()) break; array += num; } cout << "平均は" << array.GetAverage() << endl; cout << "総和は" << array << endl; }
この行いらない void Add(double d) { vec.push_back(d); }
五行五列の行列AとBを加えた行列Cを求めるプログラムを作成せよ。 又、Aは先に定義し、Bはキーボード入力、Cは標準出力とする 又、宣言は配列で、処理はポインタを用いて行え。 ヨロシクオネガイシマス
694 :
デフォルトの名無しさん :03/06/04 19:41
インクリメント デクリメントの詳しい説明してるサイトが見つからない 本当は1を足したり引いたりするためのものじゃないと聞いたのだが
695 :
デフォルトの名無しさん :03/06/04 19:42
hello world と出力したいんだが
700 :
デフォルトの名無しさん :03/06/04 20:35
>>881 新規取得中です
全部更新チェックです
タイミングによって
>>864 のように無限エラーになる時と
>>879 のように消したのに
続きが読み込まれる時があります。
702 :
デフォルトの名無しさん :03/06/04 21:01
Perlで書くと sub func{ my $a = shift; my @list = split( /\n/, $a ); foreach( @list ){ ... } } みたいなことをCでやりたいんだけど、どう書けばいいんですか? 足りない脳みそひねってるうちに煙出てきた(´ー`)
strtok
706 :
デフォルトの名無しさん :03/06/04 21:17
>>680 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define drand() ((double)rand()/RAND_MAX)
int poisson(double lambda)
{
int k;
for(k = 0, lambda = exp(lambda) * drand(); lambda > 1; k++)
lambda *= drand();
return k;
}
int main()
{
const int mu = 6;
const double lambda = 5;
const int start = 200;
const int end = 1200;
const int ntrial = 20;
const double t0 = 2.09;
double xn, xm, an, sum, rms, mean = 0, m2 = 0, hw;
int i, j;
for (i = 0; i < ntrial; i++) { srand(rand()); sum = 0; xm = 0; for (j = 1; j < end; j++) { an = poisson(lambda); xn = max(xm + an - mu, 0); xm = xn; if (j >= start) sum += xn; } sum /= (end - start); mean += sum; m2 += sum * sum; } mean /= ntrial; rms = sqrt(m2 / ntrial - mean * mean); hw = t0 * rms / sqrt(ntrial); printf("mean = %g\trms = %g\n", mean, rms); printf("%g <= mean <= %g (95%%CL)\n", mean - hw, mean + hw); return 0; }
>>704 strtok_r() は POSIX.1c に、strtok() は XPG4 と XPG4-UNIX にある。
実装に依存した話と、仕様を混同しない注意が必要。
すいません、質問です 1からNまでをランダムに選ぶのはどうやったらできるでしょうか?
rand() % N + 1
713 :
デフォルトの名無しさん :03/06/04 21:51
>>711 1からNまでペンで書いた紙をシャッフルして選ぶんだ
>>712 の前にsrand(time(NULL))入れとけ
>>711 (int)((double)rand()/RAND_MAX*N)+1
>>712 それはrand()が線形合同法の場合やばい
>>711 この問題をなるべく速くメモリを使わないで正確に行うのは
結構難しいと思うのだが。
717 :
デフォルトの名無しさん :03/06/04 21:58
>>715 rand()が線形合同法じゃないと仮定した場合
その方法は問題ないのか?
721 :
デフォルトの名無しさん :03/06/04 22:01
>>720 (int)((double)rand()/RAND_MAX*N)+1
>>722 方法によっては上位ビットに偏りがあるので問題あり。
>>711 色々ありますが、とりあえずC FAQに書いてあります
#include <iostream> #include <algorithm> using namespace std; template<int N> class Matrix { protected: double val[N][N]; public: Matrix() { fill(&val[0][0], &val[N-1][N], 0); } Matrix(double v[N][N]) { copy(&v[0][0], &v[N-1][N], &val[0][0]); } Matrix operator+(Matrix& m) { Matrix<N> mat; for(int i=0; i<N; i++) for(int j=0; j<N; j++) mat.val[i][j] = val[i][j] + m.val[i][j]; return mat; } double* operator[](int i) { return val[i]; }
friend ostream& operator<<(ostream& os, Matrix& na) { for(int i=0;i<N;i++) { for(int j=0;j<N;j++) os << na.val[i][j] << ' '; os << endl; } return os; } }; int main() { double dm[5][5] = { 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.2, 4.4, 4.6, 4.8, 5.0 }; Matrix<5> mat(dm), mat2; for(int i=0; i<5; i++) for(int j=0; j<5; j++) { double num; cin >> num; mat2[i][j] = num; } Matrix<5> mat3 = mat + mat2; cout << mat3 << endl; }
>>727-728 なら多分ポインタも使ってる。
この辺とか
fill(&val[0][0], &val[N-1][N], 0);
copy(&v[0][0], &v[N-1][N], &val[0][0]);
double* operator[](int i) { return val[i]; }
>>680 for (j = 1; j < end; j++) {
じゃない、こっちだ
for (j = 0; j < end; j++) {
data1に任意の任意個の数字データが入ってる。これを並べ替えて、マージソート したとき比較回数が最大になるようにdata2を作れ。
>>732 とりあえず疑似コード。
int sorted[n];
sortTo( sorted, data1, n );
for( i = 0; i < n/2; i++ ) {
data2[i] = sorted[i];
data2[i + n/2] = sorted[n - i];
}
つーか、マージソートの実装によって、
比較回数って異なりそうな議がするなぁ
>>733 マージソートの実装は以下の通りです。
void mergesort(int first, int last)
{
int middle;
static int i, j, k, p;
if (first < last) {
middle = (first + last) / 2;
mergesort(first, middle);
mergesort(middle + 1, last);
p = 0;
for (i = first; i <= middle; i++) work[p++] = a[i];
i = middle + 1; j = 0; k = first;
while (i <= last && j < p)
if (work[j].key <= a[i].key) a[k++] = work[j++];
else a[k++] = a[i++];
while (j < p) a[k++] = work[j++];
}
}
>>735 つまり、1個目のwhileでどんだけ処理できるかが問題だな。
結合する時、iとjが交互に増分されるようにする。
まず、最後の結合で
for( int i = 0; i < n/2; i++ ) {
data1[i] = sorted[i * 2];
data1[n/2 + i] = sorted[i * 2 + 1];
}
となればいい。
これをdata1の0〜n/2とdata1のn/2+1〜n について、再帰的に適用する。
738 :
>673, >677 :03/06/05 01:36
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> void main(void) { char moji; /* 文字列の一時的な格納領域 */ int len; int number; /* 変換後の数値 */ while(1) { printf("数値を6桁以内に入力して=>"); rewind(stdin); scanf("%s",&moji); len=strlen(moji); if (len>=7) { printf("7桁以上です。\n"); } if (!isdigit(moji)) { printf("数値じゃありません。\n"); }
number=atoi(moji); if(number>0) { printf("プラスです。\n"); } else if(number==0) { printf("ゼロです。\n"); } else { printf("マイナスです。\n"); } } } エラーが error C2664: 'strlen' : 1 番目の引数を 'char' から 'const char *' に変換できません。 (新しい機能 ; ヘルプを参照) 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。 error C2664: 'atoi' : 1 番目の引数を 'char' から 'const char *' に変換できません。 (新しい機能 ; ヘルプを参照) 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。 cl.exe の実行エラー と出るんですけど分かりません
>>739 >>740 そのまんま。charは1文字で、char *は文字列の事。だから比べる型が違うので
エラーになる。constは変数を定数のように使う時につける。仮引数に付いている
場合は、渡した関数で値を変換しないと言う意味。strcpyを例に見て見ると、
左側がchar*で、右側がconst char*。右側の文字列を左側にコピーすることをが
分かる。コードを変えるなら、char mozi[BUFSIZ]で良い。
char moji[BUFSIZ]; /* 文字列の一時的な格納領域 */ int len; int number; /* 変換後の数値 */ while(1) { printf("数値を6桁以内に入力して=>"); rewind(stdin); scanf("%s",&moji); これでエラーは無くなりましたが 数値じゃありませんを出力するにはどうしたらいいんでしょうか?
無限ループで実行結果が 数字を入力してください6桁以内=>99----scanfで プラスです 数字を入力してください6桁以内=>1234567 6桁以内に入力して(符号ふくむ) 数字を入力してください6桁以内=>fdfjhふぃえ 数字じゃありません 数字を入力してください6桁以内=>fd4324343 数字じゃありません 数字入力してください6桁以内=>12345678fdふぁ 6桁以内に入力して(符号ふくむ) 数字入力してください6桁以内=>0000 ゼロです 数字入力してください6桁以内=>−434 マイナスです 数字入力してください6桁以内=>jjj 数字じゃあれません という感じに出力されるプログラムができません
>>743 scanfで文字列に読み込んで、strlenとisdigitで長さと文字種を
調べることは出来るが、scanfで文字列を安全に読むのは無理だろう。
scanfを使うのをやめてfgetsとatoiにすることを薦める。
ああ、数値にする必要はないのか。ならばatoiを使う必要はないな。
746 :
デフォルトの名無しさん :03/06/05 08:36
このスレで、「実行例」の、ユーザ入力箇所と思しき部分が
必ず全角なのはなんでだ?
何かそうゆうネタなのんか?
>>473 while( fgets( buf, 100, stdin ), strcmp(buf, "exit") != 0 ) {
if( buf[0] == '-' ) {
minouse = 1;
lim = 5;
ptr = buf + 1;
} else {
minouse = 0;
lim = 6;
ptr = buf;
}
for( i = 0; i < lim && ptr[i] != '¥0' && isdigit(ptr[i]); i++ ) {
}
if( i == lim ) {
printf("桁数オーバ¥n");
} else if( ptr[i] != '¥0' ) {
printf("数字でない¥n");
} else if( minouse == 1 ) {
printf("マイナスです。¥n");
} else if( minouse == 0 ) {
printf("プラスです¥n");
}
適当に修正汁
ミノウスって何だ?
>748 頼むから中学生からやり直すかgoogle覚えてきてくれ。
>>746 参考文献は「
http://e-words.jp/w/FIFO.html 」でいいだろ。
あと、「
http://e-words.jp/w/E382ADE383A5E383BC.html 」だ。
node_t 入力された言葉(word)を保持するためのノードの構造体
Node_Create 引数で与えられた「言葉」を持つノードを追加。返り値:ノードのポインタ
Node_Display 引数で与えられたポインタ上にあるノードの内容を表示
queue 入力された文字を、FIFOで保存するための構造体。
Queue_Create queueの先頭要素を作成。
Queue_Clear 全てのqueueを再帰で削除。
Queue_AddNode 新しいqueueを追加する。
Queue_Pop 先頭のqueueの内容(node)を返り値とし、その先頭要素を削除する。
使用方法
e 言葉(word)で、言葉を保存する。
c で全ての内容を破棄する。
d 保存している中で、もっとも古いものを表示し、その要素を削除する。
実行例:
>e abc
>e bcd
>e cde
>d
[ abc ]
>d
[ bcd ]
>d
[ cde ]
>d
>
>>748 いいたいことは解った。googleなんかじゃ乗ってないな...
中学生からやり直してきます。
>>751 googleをなめちゃいかん。39件見付かった。
ちなみにそのうち約半数は、"the Minouse Empire"
何おまいら脱線しまくってんだよw
756 :
デフォルトの名無しさん :03/06/05 20:03
下記のプログラムを再帰関数を用いらずに、関数factorialを実現してください。 よろしくお願いします。 /* 階乗値を再帰的に求める */ #include <stdio.h> /*--- 整数値nの階乗を返却 ---*/ int factorial(int n) { if (n > 0) return (n * factorial(n - 1)); else return (1); } int main(void) { int x; printf("整数を入力せよ:"); scanf("%d", &x); printf("%dの階乗は%dです。\n", x, factorial(x)); return (0); }
いきなり二つも投稿してしまいすいませんが、よろしくお願いします。 下記のプログラムも再帰関数を用いらず関数gcdを実現してください。 /*ユークリッドの互除法によって最大公約数を求める*/ #include <stdio.h> /*--- 整数値x, yの最大公約数を返却する ---*/ int gcd(int x, int y) { if (y == 0) return (x); else return (gcd(y, x % y)); } int main(void) { int x, y; printf("整数を入力せよ:"); scanf("%d", &x); printf("整数を入力せよ:"); scanf("%d", &y); printf("最大公約数は%dです。\n", gcd(x, y)); return (0); }
760 :
デフォルトの名無しさん :03/06/05 20:27
プログラム1で、フィボナッチ数列を100まで求めてバイナリティファイルに保存して、 プログラム2でバイナリティファイルを開いて,fseek()関数を用いて、フィボナッチ数列を10項間隔で求めよ。 という問題なのですが、プログラム2を実行したときにフィボナッチの値がおかしくなってしまいます。 どうか宜しくお願いします /* プログラム1 */ #include<stdio.h> int main(void) { FILE *fp; long double f[101]; int i; f[0]=0.0; f[1]=1.0 printf("%d[byte]\n",sizeof(long double)); for(i=2;i<101;++i) f[i]=f[i-1]+f[i-2]; for(i=0;i<101;++i) printf("n = %d, fibo = %21.0Lf\n", i, f[i]); /* fibo.binをバイナリ書き込みようにオープンする*/ if((fp=fopen("fibo.bin","wb"))==NULL){ fprintf(stderr, "ファイルを開けません\n"); return 0; } /* バイナリデータの書込 */ fwrite(f,sizeof(long double),101,fp); fclose(fp); return 0; }
続きです /* プログラム2 */ #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; int i,c; long double data[11]; if((fp = fopen("fibo.bin", "rb")) == NULL ) { fprintf(stderr,"ファイルオープンエラー\n"); exit(1); } fseek(fp,0L,SEEK_SET); fread(&data[0],sizeof(long double),1,fp); printf("n=%d, fibo = %22.0Lf\n",0,data[0]); for(i=1;i<=10L;++i){ fseek(fp,10,SEEK_CUR); fread (&data[i],sizeof(long double),1,fp); printf("n=%d, fibo = %22.0Lf\n",i*10,data[i]); } return(0); }
>>761 fseekの第2引数は10じゃなく9*sizeof(long double)
>759さん、お返事ありがとうございます。 しかし、過去スレでは 任意の数の階乗ではなく、15までであったり 再帰を使っていたりと私が求める答えとは異なっています。 一緒に考えてもらえませんか?お願いします。
764 :
デフォルトの名無しさん :03/06/05 20:37
やらせてスレだしなあ。
ループに換えればいいの。
int factorial(int n) { int i = 1; for (; n > 0; n--) i *= n; return i; } int gcd(int x, int y) { while (y != 0) { int tmp = x; x = y; y = tmp % y; } return x; }
>>762 お返事ありがとうございます
言われたとおりにやったらうまくいきました
感謝です
ありがとうございました
768 :
デフォルトの名無しさん :03/06/05 21:05
関数f(x)の微分の定義 df/dx=lim{f(x+h)-f(x)}/h に従い、十分小さいhを与えて関数x^3の微分値数値計算する関数を作成。 また解析解dx^3/dx=3x^2と比較するプログラムを考える事。 *比較するxの値の個数は20程度 小さい実数 h を実行時に与えるようにしてください. atof(argv[1]) あるいは scanf() どちらを用いてもいいです. x の 範囲は実行時に与えるようにしなくとも結構です. プログラム内で適当に(例:0から10まで0.5刻み)固定してください. −−−−−−−−−−−− 友人に頼まれたのですがほとんどCの入り口にいる僕にとっては難しいです・・ どうかご教授お願いいたします。C++ではなくC言語の課題らしいです。
769 :
デフォルトの名無しさん :03/06/05 21:10
Cです。お願いします。 [0,2π] の間で π/100 毎に正弦と余弦の値を表示するプログラムを作成せよ。 ただし、出力は角度毎に改行し、正弦の値、余弦の値の順に 出力させる。
これの軸名を数値でなく、文字列で表せますか? たとえば、A軸 B軸 C軸 のように。 /*ハノイの塔*/ #include <stdio.h> /*--- 円盤をx軸からy軸へ移動 ---*/ void move(int no, int x, int y) { if (no > 1) move(no - 1, x, 6 - x - y); printf("[%d]を%d軸から%d軸へ移動\n", no, x, y); if (no > 1) move(no - 1, 6 - x - y, y); } int main(void) { int n;/* 円盤の枚数 */ printf("円盤の枚数:"); scanf("%d", &n); move(n, 1, 3); return (0); }
771 :
デフォルトの名無しさん :03/06/05 21:42
>>769 算数弱いんならプログラム止めた方が良いよ。
まさか sin(), cos() も知らない訳じゃないでしょ。
なんでそんなに偉そうなの?
for (rad = 0; rad <= 2 * PI; rad += PI / 100) { printf("%f\t%f\n", sin(rad), cos(rad)); }
774 :
デフォルトの名無しさん :03/06/05 21:50
>>770 #include <stdio.h>
main(){printf("%c%c%c\n", 0+'A', 1+'A', 2+'A');}
776 :
デフォルトの名無しさん :03/06/05 21:56
>>772 偉そうに見えたらごめんね。
でもC言語の問題じゃなくて純粋に算数(数学に有らず)の話でしょ。
この業界に向いてないのかなぁと思っただけです。
int main(void) { float h, x, dfx1, dfx2; printf("Input \"h\": \n"); scanf("%f", &h); for (x = 0; x <= 10; x += 0.5) { dfx1 = ((x + h) * (x + h) * (x + h) - x * x * x) / h; dfx2 = 3 * x * x; printf("%f\t%f\n", dfx1, dfx2); } return 0; } 精度については聞くな
775さま、もっと詳しく教えてもらえませんか? とりあえず、main関数に挿入したのですが上手くいきません。
779 :
>>770 :03/06/05 22:56
そのまま挿入したのでは、main() が二つになって動作しない...。 (どっちのmain()から実行するの?) printf("[%d]を%d軸から%d軸へ移動\n", no, x, y); を printf("[%d]を%c軸から%c軸へ移動\n", no, (char)x+'A', (char)y+'B'); としたら、と>775はいっているかと。
780 :
>732 :03/06/05 22:58
マージソート?クィックソートの間違いじゃないのですか?
皆様のお力で解決することが出来ました。ありがとうございました。 そして、今回は更に発展させたプログラムを作りたいです。 要素数がnである配列aの全要素の最大公約数を求める関数です。 int gcdary(int a[], int n) ; を利用して欲しいです。よろしくお願いします。
”通信用語の基礎知識”にエンディアンの判別プログラムが掲載されていたのですが、
どうしてもプログラムの内容が理解できません。なぜ型変換をしたりするんでしょうか?
どなたか解説をお願いいたします。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 1;
if(*((char *)&i) == 0x01)
printf("リトルエンディアン\n");
else if(*((char *)&i + sizeof(i) - 1) == 0x01)
printf("ビッグエンディアン\n");
else
printf(">謎<\n");
return EXIT_SUCCESS;
}
http://www.wdic.org/?word=%A5%A8%A5%F3%A5%C7%A5%A3%A5%A2%A5%F3%A5%CD%A5%B9+%3ATECH
785 :
>781 :03/06/05 23:44
了解。 奥村晴彦氏の著書をみて納得しました。 (なぜ a.key, a.info と構造体にしているかもわかりました。)
>>783 *((char*)&i) はiのポインタをchar*と見做してその先頭を表す。
char*では連続するバイトが順々に割り当てられるので、
格納されている順に参照される。
sizeof(int)==4 を仮定すると、
littleendian なら [4321] の順に格納されているので、
先頭は4番目のバイトとなる。
bigendian なら [1234] の順に格納されているので、
先頭は1番目のバイトとなる。
>>770 このスレか前スレ辺りに私が書いたハノイの塔のプログラムがある。
それはバーの名前をキャラクタで与えている。
788 :
デフォルトの名無しさん :03/06/05 23:52
グレゴリ−級数(1.0,1000000)の部分和を、与えられた共用体を用いて、8つの1バイト変数として16進数表示(ダンプ表示)するプログラムなのですが グレゴリ−級数は求まったのですが、ダンプ表示の仕方が全く分かりません どなたかお願いします #include<stdio.h> #include<math.h> union dump{ double f; unsigned char byte[8]; }; float G(double i,double x); int main(void) { double Gre; double i=1.0; double x=1.0; int c; Gre=G(i,x); } float G(double i, double x) { float Gre=0.0; for(i=1.0;i<=1000000.0;++i) Gre += (-1.0)*pow((-1.0), i)*pow(x, 2.0*i-1.0) / (2.0*i-1.0); return(Gre); }
789 :
>783 :03/06/05 23:53
このプログラムでは int を2バイトと仮定して読んでみてください。 (すなわち size(int) = 1 ) char のサイズは処理系によらず 1 バイトだったはずですから、 (char *)&i で2バイト構成中の先頭の1バイトのアドレスを、 (char *)&i + 1 ならば2バイト構成中の後ろの方のアドレスを 求めることになりますね。
>このプログラムでは int を2バイトと仮定して読んでみてください。 >(すなわち size(int) = 1 ) めちゃくちゃだな。sizeof(int)==2って言いたいんじゃないのか?
791 :
デフォルトの名無しさん :03/06/05 23:58
>>789 > (すなわち size(int) = 1 )
これの説明を。
792 :
デフォルトの名無しさん :03/06/06 00:03
仮定しなくても、sizeof(int)を使えばintの大きさに依ることなく調べられると思うけど。 つーかリトルじゃなかったらビッグにしちゃっていいんじゃないの?
>>788 floatとdoubleが入り乱れてますね。
for(j=0;j<8;j++) printf("%02x",dump.byte[j]);
でいいの?IEEE表記を見てわかる人じゃないと・・・。
>>793 申し訳ないのですがもう少し詳しく説明していただけませんでしょうか?
C言語は全くの素人なもので…
本当に、すいません
>>794 これでいい?
int main(void)
{
double Gre;
double i=1.0;
double x=1.0;
int c;
union dump d;
Gre=G(i,x);
d.f=Gre;
for(c=0;c<8;c++) printf("%02x",d.byte[c]);
printf("\n");
return 0;
}
0123456789 1234567890 2345678901 3456789012 …100回繰り返す for文、if文、while、do-whileなどを使って賢く表示せよ お願いします
>>796 賢いかどうか判らんが。
#include <stdio.h>
int main() {
int i, j;
for( i = 0; i < 100; i++ ) {
for( j = 0; j < 10; j++ )
printf( "%d", i % 10);
putchar('¥n');
}
return 0;
}
>>797 おまえ、あちこちでレスしてあちこちで間違いまくりだな。
>>798 ああ。今日はコンパイルもせずに書き込んでるかならな。
>>795 ありがとうございます
お陰で今日のレポート提出期限に間に合いそうです
本当に助かりました
>>800 floatとdouble揃えておいてね
Real programmers don't use float type.
うまく表示されません(T_T)
Direct3Dはfloat使った方が速度速い罠
今日が提出期限です・・・・・
友達も誰も宿題ができないまま、時間が僕をおそいます・・・
もう死にます・・・・
どなたか
>>540 からのやつをおねがいします(T0T)
授業で解説がなかったなら、 できない人の方が多いだろうから大丈夫じゃない? 解説があったなら聞いてないのが悪い。
>>805 馬鹿だから分からないの。ごめんね('-'*)
>>803 i%10を(i+j)%10と置換してみよう
>>808 すごい!!ばっちり表示されました!!感動!
どうもありがとうございました!
>>805 >>807 と同じく。せめてプログラムのみの問題に書き換えてくれれば・・・
流れ図書けば誰かやってくれるかも知れない。
それすらできないなら、質問する板が違う。
すみません実はあと2問…。 (1) ********** * ********* ** ******** *** ******* **** ****** ***** ***** ****** **** ******* *** ******** ** ********* * ********** (2) 0123456789 1023456789 1203456789 1230456789 1234056789 1234506789 1234560789 1234567089 1234567809 1234567890 2134567890 2314567890 …繰り返す この2つです、よろしくお願いします! 123456789
すみません、(1)の1行目の先頭はスペース、最後は*です。
char s[] = "0123456789"; で交換する。
if、for、while、do-whileしか使っちゃ駄目なんです(>_<)
if ((i+j)%10 == 0) { printf(" "); } else { printf("*"); }
デバッグエラーが…!
#include <stdio.h> int main() { int i,j; for(i=0;i<11;i++) { for(j=0;j<11;j++) { if(i==j) printf(" "); else printf("*"); } printf("\n"); } return 0; }
表示されました!!ありがとうございます!!m(__)m
>>815 (1)
int i,j;
for(i=0;i<11;i++){
for(j=0;j<11;j++)
printf("%c",(i==j)?' ':'*');
printf("\n");
}
(2) なんか汚い。。。
int i,j;
for(i=0;i<100;i++){
int l=i/10;
int m=i%10;
if(i>0 && m==0) continue;
for(j=0;j<10;j++){
int n;
if(j==m){
n=l;
} else if(j<m){
n=(j+l+1)%10;
} else {
n=(j+l)%10;
}
printf("%d",n);
}
printf("\n");
}
今友達と話し合ってわかった!!! まず (1) x f(x) 0 〜〜 0,1 〜〜 0,2 〜〜 0,3 〜〜 0,4 〜〜 この表を完成させて、そしてそれで(2)に行きます・・ それぞれの領域とは、5つの数字の間の、4領域だと思います。 今日は友達が泊まりに来て、他のレポは全部終わった・・・・。 あとはこれだけです。 いろいろ迷惑かけてすいません。もう死にそうなんです(ToT)
すごい…!表示されました! 初心者なんでもう全くついていけてないんですが、しっかり表示されてる! どれぐらい勉強すればこのぐらいすぐ書けるようになるんだろう(゚o゚)
>>824 >>540 には2つの領域って書いてあるが?
0 0.1 0.2 と 0.2 0.3 0.4 の3点で補間するんじゃないのか?
2点でやるならLagrange補間の意味が全くないんだが。
>>826 様
多分そうだと思います。それぞれの領域じゃなくて、その二つだけでした。
ラグランジュ補間、今友達と、テキスト見てやっと少しわかりました。
>>826 領域毎に補間するのだろうが3点に限る根拠もよく分からない。
データ長が不定の時のデータ処理プログラムって課題なんですけど、構造体がわからなくてプログラムが作れないんです。 こんな課題です。 データ件数はプログラムの最初に入力させます。 構造体を使って、名前と生年月日を入力させ、それを出力します。 生年月日の形式は、19741113のような形でいいです。 一応プログラムは作成してみました。 でも、構造体がわからないので、現状では構造体を使わないプログラムになってます。 このプログラムを、構造体を使うように直していただけませんか? 私の作成したプログラムに問題点があったら、そこも直して欲しいです。
>>828 (1)で求めてる5点を使うとして、
領域を2つに分けるとそれぞれに3点ずつしか存在しないから
4領域じゃなくて。。。3点の二領域なのかな・・・多分
三点によるものでそれで、1領域で それが二つ・・・・です。
私が作成したプログラムはこんなのです。よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<string.h> #define BUFF_SIZE 1024 #define NAME_DATA_SIZE 3 void main() { int i,j,data_size=0; char s[100],buff[BUFF_SIZE]; char*array[NAME_DATA_SIZE]; char*karray[NAME_DATA_SIZE]; printf("データ件数を入力せよ\n"); fgets(s,100,stdin); sscanf(s,"%d",&data_size); printf("%d人分のデータを入力せよ\n",data_size); for(i=0;i<data_size;i++){ printf("%d人目の名前を入力せよ\n",i+1); if(fgets(buff,sizeof(buff),stdin)==NULL){break;} array[i]=(char*)malloc(strlen(buff)+1); if(array[i]!=NULL) strcpy(array[i],buff); printf("%d人目の生年月日を入力せよ\n",i+1); if(fgets(buff,sizeof(buff),stdin)==NULL){break;} karray[i]=(char*)malloc(strlen(buff)+1); if(karray[i]!=NULL) strcpy(karray[i],buff); } for(j=0;j<i;j++)printf("\n%d人目:%s生年月日:%s\n",j+1,array[j],karray[j]); for(j=0;j<i;j++){ if(array[j]!=NULL) free(array[j]); if(array[j]!=NULL) free(karray[j]); } }
表はずれてるけどこうです x f(x) 0 〜〜 0,1 〜〜 0,2 〜〜 0,3 〜〜 0,4 〜〜
明日の一こまのテストのために寝ます・・・ 神様〜〜なんてこんなときだけ祈ってもな・・・ おやすみなさい
>>829 struct KOZOTAI{
char *name;
time_t birthday;
};
19741113ってのは1974/11/13という意味か。じゃあ、 struct KOZOTAI{ char *name; char birthday[20]; };
>>837 様
構造体の宣言とかはわからないこともないんです。
でも、mainの中で使うときに、どんなふうにして使えばいいのかわからないんですよ。
さっき上げたプログラムの
array[i]=(char*)malloc(strlen(buff)+1);
ってのは、構造体を使うとどんな風に書けるのか教えていただけませんか?
>>839 名前を保持する領域も動的に確保しないといけないの?
初歩的な質問で申し訳ありません。 「動的」とか「静的」って何の事なのでしょうか?
>>841 この場合は動的=mallocとでも思って。
課題内容が「名前は固定長でも可変長でも良い」となっているので、 たぶん、どっちでもいいと思います。
844 :
デフォルトの名無しさん :03/06/06 03:09
やらせろ
struct data { char name[64], char birthday[10], } と定義して struct data d[256]; と構造体の配列つくったら mallocいらないよ。
ごめん文法間違ってら。 struct data{ char name[64]; char birthday[10]; }; ですた。
>>843 じゃあ固定長で
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAMEBUFSIZ 80
#define BDBUFSIZ 20
struct data{
char name[NAMEBUFSIZ];
char birthday[BDBUFSIZ];
};
int main()
{
struct data *pdata;
int i,ndata;
printf("データ件数を入力せよ > ");
scanf("%d",&ndata); /* 面倒なのでscanfで */
if(!(pdata=malloc(ndata*sizeof(struct data)))){
fprintf(stderr,"メモリー不足!!\n");
return 1;
}
printf("%d人分のデータを入力せよ\n\n",ndata);
for(i=0;i<ndata;i++){ printf("%d人目の名前を入力せよ > ",i+1); fgets(pdata[i].name,NAMEBUFSIZ,stdin); printf("%d人目の生年月日を入力せよ > ",i+1); fgets(pdata[i].birthday,BDBUFSIZ,stdin); } for(i=0;i<ndata;i++) printf("%d人目 名前:%s 生年月日:%s\n",i,pdata[i].name,pdata[i].birthday); free(pdata); return 0; }
う〜ん・・・わかったような、わからないような・・・ とりあえず、自分でがんばってみます。 皆様、ありがとうございました。
string.hなんていらないな。
さらに名前や生年月日の末尾につくであろう改行文字を削除していないから、表示が崩れるな。
おお・・・書き込んでる間に救世主が!
>>848 様、ありがとうございます!
848様が書かれたのを参考にして、自分で理解しながら少しずつ作っていこうと思います。
本当にありがとうございます。
scanf("%d"じゃ改行を拾わないことを忘れていた。まあいいか(ワラ
855 :
デフォルトの名無しさん :03/06/06 06:10
784さま、レスどうもです。 下記のように付け加えてみました。ですが、コンパイルするとエラーがでます。 どうしたらいいのですか? パラメータ 'a' は int * 型として定義されているので intは渡せない(関数 gcd ) パラメータ 'a' は int * 型として定義されているので intは渡せない(関数 main ) /*ユークリッドの互除法によって最大公約数を求める*/ #include <stdio.h> /*--- 整数値x, yの最大公約数を返却する ---*/ int gcd(int n, int a[]) { int i, d; d = a[0]; for (i = 1; i < n && d != 1; i++) d = gcd(a[i], d); return d; } int main(void) { int x, y; printf("整数を入力せよ:"); scanf("%d", &x); printf("整数を入力せよ:"); scanf("%d", &y); printf("最大公約数は%dです。\n", gcd(x, y)); return (0); }
>>856 784じゃないが
ngcd を勝手に gcd にしているではないか。
int ngcd(int n, int a[]) は int gcd(int x, int y) を使って
配列 a のGCDを求める関数。あなたが呼ぶべきは gcd の方。
857さま、gcdを付け加えてみました。 ですが、2つの数のgcdしか求めることが出来ません。 #include <stdio.h> int gcd(int x, int y){ if (y == 0) return x; else return gcd(y, x % y); } int ngcd(int n, int a[]){ int i, d; d = a[0]; for (i = 1; i < n && d != 1; i++) d = gcd(a[i], d); return d; } int main(void){ int i,x,y; char s[2]; static int a[100]; printf("整数を入力せよ:"); scanf("%d", &x); printf("整数を入力せよ:"); scanf("%d", &y); printf("最大公約数は%dです。\n", ngcd(i, a)); return (0); }
859 :
デフォルトの名無しさん :03/06/06 08:35
ngcd(i, a) iは代入してるの?
>>858 main をこれで置き換える。
int
main(void){
static int a[100];
printf("整数を入力せよ:");
scanf("%d", a+0);
printf("整数を入力せよ:");
scanf("%d", a+1);
printf("最大公約数は%dです。\n", ngcd(2, a));
return 0;
}
>>860 static は要らん
int a[100] でいい
862 :
デフォルトの名無しさん :03/06/06 08:55
>>860 2個以上の場合
#include <stdlib.h>
#define ARRAYSIZE 100
#define max(x,y) ((x)>(y) ? (x) : (y))
int
main(int argc, char **argv)
{
int n,i,a[ARRAYSIZE];
n = argc > 2 ? max(ARRAYSIZE, atoi(argv[1])) : 3;
fprintf(stderr, "整数%d個入力せよ:", n);
for (i=0; i<n; i++) scanf("%d", a+i);
printf("最大公約数は%dです。\n", ngcd(n, a));
return 0;
}
>>863 #define min(x,y) ((x)<(y) ? (x) : (y))
n = argc > 2 ? min(ARRAYSIZE, atoi(argv[1])) : 3;
だった。
865 :
デフォルトの名無しさん :03/06/06 09:35
プログラムの処理時間を測る関数ってなんですか?
#include <stdio.h> main() { int indata, rem, sum=0; printf(" ### 整数(>=)入力 ?"); scanf("%d", &indata); printf(" ### 反転した整数は =>"); if( indata == 0 ){ printf("%d", indata); }else{ do{ □□□□□□□□□ □□□□□□□□□ }while(indata != 0); } } というので、↓のように数字反転 98765 => 56789 12300 => 321 0 => 0 するプログラムを作りたいのですが、 do-While文の本文を自分で考えて書き込めといわれました。 しかしハッキリいって全く思い付きません。 解説 or ソースのどちらかだけでもいいですので、どうか教えて下さい
プ
例えば、98765の場合、 sum=0 98765 mod 10 = 5, sum = sum*10 + 5 = 5; 98765 / 10 = 9876 9876 mod 10 = 6, sum = sum * 10 + 6 = 56 9876 / 10 = 987 : : : を繰り返す。 modはあまりを求める(%に該当) 合計はsumに代入する。 で、最後、indata==0になったらsumを表示する。 if(indata==0){printf("ぬるぽ");}
まあ、 printf("%d",indata%10); indata/=10; でもいいけど、上の変数定義が意味無いので無理につかうとこうなる
テストは何とか乗り切った・・・・・ 後はプログラムの宿題だけだ〜〜〜 うわああああん T0T
>>786 ,789,790,791,792
皆さんありがとうございます。何とか理解しました。
BCCで試したのですが、4バイトであるintのアドレスをchar型のポインタに格納して
1バイトずつアクセスできるようにして格納されている値を調べている、
ということですよね?
どうもありがとうございました。
みなさま、ありがとうございます。 今までのレスを統合してみました。ですが、まだ求めることが出来ていません。 一部だけではなく全体を投稿してもらえませんか?理解力がなくてすいません。 #include <stdio.h> int gcd(int x, int y) { if (y == 0) return x; else return gcd(y, x % y); } int ngcd(int n, int a[]) { int i, d; d = a[0]; for (i = 1; i < n && d != 1; i++) d = gcd(a[i], d); return d; } #include <stdlib.h> #define ARRAYSIZE 100 #define min(x,y) ((x)<(y) ? (x) : (y)) int main(int argc, char **argv) { int n,i,a[ARRAYSIZE]; n = argc > 2 ? min(ARRAYSIZE, atoi(argv[1])) : 3; fprintf(stderr, "整数%d個入力せよ:", n); for (i=0; i<n; i++) scanf("%d", a+i); printf("最大公約数は%dです。\n", ngcd(n, a)); return 0; }
>>878 > n = argc > 2 ? min(ARRAYSIZE, atoi(argv[1])) : 3;
n = argc > 1 ? min(ARRAYSIZE, atoi(argv[1])) : 3;
こうしたかったんだろう。
ところで、これで何がいかんの?
私が求めたいのは、任意の個数の数の最大公約数なのです。 上記のプログラムだと3つしか求めることしかできないからです。 あと、コンパイル時に マクロ 'min' の重複定義 とでてしまいます。 >879さんはエラーなくコンパイルすることが出来ましたか?
>>792 > つーかリトルじゃなかったらビッグにしちゃっていいんじゃないの?
世の中には、PDP エンディアンみたいな変態的な奴もあったからなぁ...。
>>880 コマンドライン引数で個数が与えれるようになってる。
% ./a.out 4
整数4個入力せよ:12 24 6 18
最大公約数は6です。
%
手元では警告レベルを最大にしたけど min は怒られなかった。
駄目なら MIN とかにすれば?
>>880 回答の近似値(多分間違いはあるだろうから鵜呑みにしない)
#include <stdarg.h>
unsigned int two_gcd(unsigned int a,unsigned int b){
if(b>a)
return two_gcd(a,b);
if(b==0)
return a;
return gcd(b,a % b);
}
unsigned int gcd(unsigend int a1,unsigned int a2,...){
va_list more;
unsigned int result=two_gcd(a1,a2);
if(result==1)
return 1;
va_start(more);
while(more){
result=two_gcd(result,var_arg(more,int));
if(result==1)
return 1;
}
return result;
}
コマンドラインですか・・・。実行時に入力したいです。お願いします。
配列の変換なんですが、下にアルゴリズムを書きますのでよろしくお願いします。 長さnの配列のうち、まえからk個と後ろのk+1〜n個目までとを入れ替える問題です。 @kがn/2以上のとき、DからF、それ以外はAからCを行う。 A配列の先頭からk個目までを作業配列までを作業配列に移す。 B配列のk+1番目から後ろのn番目までを配列の1番目からn-k個目までに入れる。 C作業配列のk個を配列のn-k+1番目以降にうつす。 D配列のk+1番目から最後までを作業配列に転送する。 E配列の先頭からk番目までをn−k個後ろへ転送する。 F作業配列のn−k個を配列の先頭からn−kまで転送する。
実行時のイメージとしては、 (1)数を入力 (2)最大公約数を求める と表示された後、(1)(2)に従って進み 最大公約数は■です。 となるようなプログラムを欲しいのです。言葉が足りなくてすいません。
2^m個の数字列a[n]が与えられた時 (1)i=0〜n について data1[i] = sorted[i * 2]; data1[n/2 + i] = sorted[i * 2 + 1]; (2)これを0〜n/2とdata1のn/2+1〜n について、再帰的に適用する。 このようなプログラムを作って下さい。 実行例 (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16) →(1 3 5 7 9 11 13 15 2 4 6 8 10 12 14 16) →(1 5 9 13 3 7 11 15 2 6 10 14 4 8 12 16) →(1 9 5 13 3 11 7 15 2 10 6 14 4 12 8 16)
>>886 intの配列の場合
if (k < n / 2) {
memcpy(work, array, k * sizeof(int));
memmove(array, array + k, (n - k) * sizeof(int));
memcpy(array + n - k, work, k * sizeof(int));
}
else if (k <= n) {
memcpy(work, array + k, (n - k) * sizeof(int));
memmove(array + n - k, array, k * sizeof(int));
memcpy(array, work, (n - k) * sizeof(int));
}
890 :
デフォルトの名無しさん :03/06/06 16:41
switchを使ってるのですがCtrl-dを終了条件にしたいのですがどうしたらいいですか?
891 :
デフォルトの名無しさん :03/06/06 16:43
データ構造の1つであるリストとはなにか説明せよ.また,スタックおよびキューとはなにか説明せよ. さらに,そのプログラムでの実現には,配列あるいはポインタを使う.それぞれの場合の利点・欠点を説明せよ
>>890 もうちょい具体的に。
求めてるのは多分 case EOF: だと思うけど。
894 :
デフォルトの名無しさん :03/06/06 16:51
getcharだYO!
int c; while ((c = getchar()) != EOF) { switch (c) { : : } } /*終了*/
>>888 data1 sorted が定義されてない
data1の方は別にいいか
898 :
デフォルトの名無しさん :03/06/06 17:05
899 :
デフォルトの名無しさん :03/06/06 17:07
せめて環境を書かなければCtrl+Dが何を意味するのかわからないだろ
>>877 様
ありがとうございます。結局間に合わなかったんだけど。クラスの7割くらいが
まだだしてないみたいなので、遅れても受け取ってもらえるようです。
明日かあさってまで出せそうです。ありがとうございました。
901 :
デフォルトの名無しさん :03/06/06 17:19
>>899 http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=78 このプログラムです!
実行結果↓ 本当は下の様にしたい
Initialize a queue. Initialize a queue.
>d >d
No more data. No more data.
>e programming >e programming
Enqueue:[programming] Enqueue:[programming]
>e group 3 >e group 3
Enqueue:[group 3] Enqueue:[group 3]
>d >d
Dequeue:[programming] Dequeue:[programming]
>e ALGORITHM >e ALGORITHM
Enqueue:[ALGORITHM] Enqueue:[ALGORITHM]
>d >d
Dequeue:[group 3] Dequeue:[group 3]
>e practice >e practice
Enqueue:[practice] Enqueue:[practice]
>d >d
Dequeue:[ALGORITHM] Dequeue:[ALGORITHM]
>c >c
Initialize a queue. Initialize a queue.
>d >d
No more data. No more data.
>No more data. >
↑--ここでCtrl+D--↑
>>901 fgetsの戻り値がEOFかどうかチェックしろ
EOFじゃないNULLだ
904 :
デフォルトの名無しさん :03/06/06 17:26
>>901 です!
実行結果おかしいのでもう一度
Initialize a queue.
>d
No more data.
>e programming
↑
略
↓
>c
Initialize a queue.
>d
No more data.
>No more data.←Ctrl+D
本当は下の様にしたい
Initialize a queue.
>d
No more data.
↑
略
↓
>d
No more data.
>←Ctrl+D
宿題ではないんだけど 今画像ファイルを読み込んで(ppm形式) そのファイルに書かれている輝度の分散やら平均もとめてるんですが たとえば平均とか求めるときにどうしても0で割らないといけない状況も あって,もし0ならberakするようにしたんですけどそれではループ自体 ぬけてしまうんです。C言語では普通どのようにかくのですか?
continue
>>889 さん
ありがとうございました。さっそく明日学校で試行して見ます。
berakってなんだ? 平均を求めるなら0で割らなきゃいけない状況に落とす方が間違い。
ところで、いいかげん前スレうめないか
911 :
デフォルトの名無しさん :03/06/06 18:28
マーチンの法則を用いてπ(円周率)を小数以下10000桁まで求める プログラムをC言語で作成してください。お願いいたします。
マチンの公式でぐぐれ。
>>888 注文どおりにバグを入れておきました。
void foo(int* data1, int* sorted, size_t n)
{
int i;
if (n > 1) {
for(i = 0; i < n; i++) {
data1[i] = sorted[i * 2];
data1[n / 2 + i] = sorted[i * 2 + 1];
}
foo(sorted, data1, n / 2);
foo(sorted + n / 2, data1 + n / 2, n / 2);
}
}
いいぞがんばれドラゴンズ〜
このプログラムの出力結果の説明をお願いします。 1.〜 2.〜 という感じで。 #include<stdio.h> main() { char a[10]; int n,k,i,j,l,m,h,g; scanf("%d %d",&n,&k); for(i=0;i<n+1;i++) if(i%2==1) a[i]='*'; else a[i]=' '; g=0; if(n%2==0) g=1; for(i=0+g;i<n+g;i++) for(l=0;l<k;l++) { h=0; if(i%2==0) h=1; for(j=0+h;j<n+h;j++) for(m=0;m<k;m++) printf("%c",a[j]); printf("\n"); } } おかしな出力結果になったら教えて下さい。ではお願いします。
このプログラムは、市松模様を描くプログラムである。 1.パターンが何回黒と白を交換するか(n)、と大きさ(k)を入力する。 n=1であれば、a[]="*"; n=2であれば、a[]="* "; n=5であれば、a[]="* * *"; となる。 2.gは、nが奇数か、偶数かを判断した結果である。 表示する際、高さをこれで調整している。 3.iは縦幅である。また、lは縦幅の倍率となる。 4.hは、iが奇数か、偶数かを判断した結果である。 表示する際、横幅をこれで調整している。 5.jは横幅である。また、mは横幅の倍率となる。 6.a[j]を表示する。 こんな感じかい?ついでに、n>=10だと(理論的に)危ない。
ごめん、ちゃんと細く a[]="* * * ..."; に対し、gやhはどれだけマスをずらすか、である。 g=1ならば、 a[]|g=1 = " * * * ..."; となる。 ごめん、日本語難しいけど、とりあえずこの2つでa[]の表示する位置をずらしてるんだよ!
たびたび質問もうしわけありません。 入力した文字列に886の処理を施して、処理後の配列を 画面に表示させるにはどうしたらいいのでしょう。。。
>>891 リストとはデータ要素をノードによって順に繋いだデータ構造をいう。
各データ要素が並びの次の要素へのノードだけを持つものを単方向リスト、前後の要素へのノードを双方向リストという。
スタックとはデータ要素を順序を保って格納し、入力の新しいものから順に取り出せるデータ構造(LIFO:Last In First Out)である。
キューとはデータ要素を順序を保って格納し、入力の古いものから順に取り出せるデータ構造(FIFO:First In First Out)である。
C言語などでは、リストはノードによるデータの連結を、ポインタによるアドレス参照をつかって実現する。
リスト内の任意のデータを取得するには、ノードをたどる必要があり時間的コストがかかるという欠点を持つ。
リスト内へのデータ追加や取り出しは、前後の要素のノードを繋ぎ換えるだけで完了するため、短時間で処理を行える。
スタックやキューはリストによって実装することができる。
スタックは、配列により実装することが多い。
配列に順にデータを入力し、最も新しく入力したデータ(または次にデータを格納する位置)へのポインタを保持することでLIFOを実現する。
ランダムなデータへのアクセスはできないが、データの追加、取り出しは、対象データの移動とポインタのインクリメント、デクリメントだけのため時間的コストが非常に少ない。
一般に固定長配列で実装するが、適切なサイズを確保しないとオーバーフローしやすくなるという欠点を持つ。
スタックはリストによる実現も容易だが、データ入出力に関するコストでは固定長配列での実装のほうが有利である。
ただし、リストで実現した場合、動的なデータ領域確保がしやすいため、システムの記憶領域がある限りいくらでもデータを格納することができるという利点を持っている。
キューは、リストにより実装することが多い。
データ要素を入力順に繋いだリストに格納し、リストの先頭と末尾へのポインタを保持することでFIFOを実現する。
配列を使って実装することもあり、その場合、データ入出力位置を示すポインタが配列の先頭と末尾を行きするリング状にすると効率的である。
配列による欠点利点、リストによる欠点利点はスタックの場合と殆ど同じである。
上の方で質問されているか違いますが、ハノイの塔についてです。 上に出てきているプログラムは再帰関数を利用しているようですが、 私が作りたいプログラムは再帰を使わないやつです。 よろしくお願いします!
自分でやれ。
>>923 #include <stdio.h>
#include <string.h>
int main()
{
int sorted[] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
};
int data1[sizeof sorted / sizeof(int)], *dst, *src;
int i, j, k, n = sizeof sorted / sizeof(int);
for (i = n; i > 1; i >>= 1) {
for (j = 0; j < n; j++)
printf("%d ", sorted[j]);
putchar('\n');
dst = data1;
src = sorted;
for (j = 0; j < n / i; j++) {
for (k = 0; k < i / 2; k++) {
*(dst + k) = *(src + k * 2);
*(dst + i / 2 + k) = *(src + k * 2 + 1);
}
memcpy(src, dst, i * sizeof(int));
dst += i;
src += i;
}
}
return 0;
}
やはり難しいですかねー。もう一つのイメージとしては、 最大公約数を求めるための要素数は? と表示された後、入力された値に従って(たとえば入力が3なら) 一つ目の数は?:■ 二つ目の数は?:▲ 三つ目の数は?:● それを演算して最後に、 最大公約数は〜です。 と言うのはどうですか?
>>926 n = argc > 1 ? min(ARRAYSIZE, atoi(argv[1])) : 3;
を
fprintf(stderr, "最大公約数を求めるための要素数は? ");
scanf("%d", &n);
にすれば良いだけだろ?
928 :
デフォルトの名無しさん :03/06/06 22:44
./a.out < input.txt > output.txt としたとき、output.txt にプロンプトが必要なことはそう多くない。
なるほど・・・結果をファイルにリダイレクトしたいのか。
t2 δA=∫ {(∂/∂x)Lδx+(∂/∂v)Lδv}dt t1 プログラムにすると・・・・・めんどくせ
次のような課題が出ました. ---- データ(x_i, y_i) [i=(1,2,・・・,N)] を直線近似する. 直線とそれぞれの点との 距離r_i の距離の和 Σr_i を最小にする直線を求める方法でプログラミングせよ. ---- 直線( ax + by + c = 0 )と点 (x_i, y_i) との距離は r_i = | a * x_i + b * y_i + c | / sqrt{a^2+b^2} なので,距離の和は Σr_i であり,これが最小になる a, b, c を求めればいいことはわかったのですが, ここから先がわからないので,ヒントください.
>934 最小自乗法の式の展開は理解できたのですが, r_i = | a * x_i + b * y_i + c | / sqrt{a^2+b^2} は絶対値の記号が入っているために,どうやって 偏微分,その後の展開をしたらいいかわかりません. よろしくおねがいします.
936 :
デフォルトの名無しさん :03/06/06 23:58
>>934 最小二乗法の結果は距離の和を最小にしない
939 :
デフォルトの名無しさん :03/06/07 10:00
動的データ構造と線形リストがわかりません
そうか
動的データ構造: 静的でないデータ構造 線形リスト:線の形のリスト
数学の知識が工房程度しか無いのですが、
>>933 の課題は
直線 y = ax + b と点 ( x_i, y_i )を点( 0, b )を中心にarctan(a) (=sとする)度回転させて、考える。
直線 y = b と 点(0, x_i*sin(s) + y_i*cos(s) )の距離の和、つまり
Σ( x_i*sin(s) + y_i*cos(s) - b ) が最小になるような s を求める。でaが求まる?
そしたら s を固定して b を求める。
というやり方で楽にできますか?
あ、-arctan(a)度かぁ?
乱数の種を変えて、10回の独立な計算をして、分散の平均値をとりたいのですが、次のプログラムをどういじったらいいですか?自分なりにやってみたんですが、値がおかしくなってしまい、どこがおかしいのかもわからないんです。
#include <stdio.h> #include <stdlib.h> #include <math.h> static unsigned long seed ; #define a 1664525 #define b 1 #define m 4294967296 #define N 100 void usr_srand(unsigned long s) { seed = s; } double usr_rand(void){ seed = ( a * seed + b ) % m; return (double)seed / m; }
main() { double z ,v ,r, s ,t ,q ,ave ,bun ; long l , n , k , i , j , u , sum , p , wa , wb , h[N] ; usr_srand(137); u = 0; wa = 0; wb = 0; v =0; for (i = 0; i < N; i++){ h[i] = 0; } for (l =0; l < 10000; l+=100){ for (i = 0; i < N; i++) { s = usr_rand(); r = usr_rand(); t = usr_rand(); q = usr_rand(); sum = 0; j = floor(r*N); p = h[j];
if ( t < 0.5 ){ h[j] = h[j] - 1; } else{ h[j] = h[j] + 1; } for (k = 1 ; k < N; k++){ sum = sum + fabs(h[k]-h[k-1]); } if ( sum-u <= 0 ){ u = sum ; } if ( sum-u > 0 && q <= exp(-1 / 0.6) ){ u = sum ; } if ( sum-u > 0 && q > 1 - exp(-1 / 0.6) ){ h[j] = p ; u = u ; } }
for (i = 0; i < N; i++){ wa = wa + h[i]; } ave = (double)wa / N ; v = v + ave ; z = v / (l/100 + 1) ; for (i = 0; i < N; i++){ wb = wb + pow(h[i] - z, 2); } bun = (double)wb / N ; printf("step=%d 分散=%f\n" , l+100 ,bun); wa = 0; wb = 0 ; } } これをいじってできるようにしたいのですが。。。
unsigned long int 符号無し倍長整数型 32bit 0〜4294967295
>>942 できない。
s= -atan(a);
Σ| x_i * cos(s) + (y_i - b) * sin(s) |
絶対値を取る必要がある。
構造体などについて質問させて頂いた829です。 皆様のアドバイスのおかげで、 なんとか金曜日中にレポートを提出することが出来ました。 本当に有難うございました。
あ、間違えた Σ| x_i * sin(s) + (y_i - b) * cos(s) |
954 :
デフォルトの名無しさん :03/06/08 01:33
>>948 for (i = 0; i < N; i++){
wb = wb + pow(h[i] - ave, 2);
}
じゃないの?
10回の独立な計算とか分散の平均値とかよくわからん。 何がしたいのか詳しく説明して。
マクスウェル方程式の導出 をプログラムにして
自然対数をだすプログラムを作成せよ
log
ガンダムのプログラム作って
>>959 学校名か、学部名か、学科名を教えて下さい。
962 :
デフォルトの名無しさん :03/06/08 06:05
最大25桁(少数も有り)の四則演算をしなければいけないのですが、 桁あふれしないようにするには、一体どうすればいいでしょうか?
d[25]
>>960 ホワイトファング所属
オペレーションメテオ科
>>962 mail(){long long double x;}
これがコンパイルできるなら long long double を使えば良い。
さもなくば多倍長数を使う。既存なら libmp か libruby など。もしくは自作。
Cを使わなくていいなら bc コマンドなど。
>>944 あんたの main を整理してみたがやっぱりやりたいことが分からん。
数学の試験問題程度に明確に書いてくれ。
(^^)(^^)(^^)(^^)(^^)(^^) (^^)(^^)(^^)(^^)(^^)(^^) (^^)(^^)(^^)(^^)(^^)(^^) (^^)(^^)(^^)(^^)(^^)(^^) 山崎渉
文字列を文字数の制限なしに入力するにはどうしたらいいですか? 文字数の制限というのはa[100]なら100文字(99?)までしか入れれないという感じのやつです どうかよろしくお願いします
>>968 一文字ごとに領域確保と解放を繰り返せ(w
適当な文字数毎にリンクリストに繋いでいくとか。 読んだ端からファイルに格納していくとか。 想定される最大文字数 (メモリーに入るのか否か) と、そのあとどう言うことしたいんだ ?
すいません、ホント宿題なので・・・ C言語でとりあえず文字列を文字数制限なく読み込めって感じの課題なので、 読み込んだことが分かるようにそのまま表示しようと思っています
>>971 文字の読み込みにはどの関数を使うん?
getchar?
バッファをreallocで伸長しながら読むとか。
特に指定なしです 最近習ったstrlenとmallocなどを使ってやるのかと思ったのですが、無理でしょうか?
>>975 じゃあ1文字ごとにmallocしてリストとして繋げばいいだろ。
どうも聞いてる限りでは大した課題じゃないっぽいし。
リスト構造の勉強にもなるし、いい機会じゃないか。
文字列を文字数制限なく読み込んで何するんだろ・・
文字数制限なく読み込むけど、 メモリへの格納何もしないプログラム #include <stdio.h> int main() { while( !feof(stdin) ) getchar(); } 読み込みつつ、全部表示するバージョン #include <stdio.h> int main() { while( !feof(stdin) ) putchar( getchar() ); }
文字数制限無しで読み込んで、格納先のアドレスを返す。ちゃんとfreeしてね。 けど多分、VCじゃないとコンパイル通らない。 char* hogealloc(void) { char*str; chardummy;/* 先頭1文字の格納先*/ scanf("%c", &dummy);/*stdinと関連付ける*/ if( ( str=(char*)calloc( stdin->_cnt+1, 1 ) ) == NULL ) { fprintf(stderr, "メモリの確保に失敗しました。\n"); exit(1); } strncpy(str, stdin->_base, stdin->_cnt); fflush(stdin); return str; }
#include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h> です。
>>979 おいおい、構造体FILEの実装に依存したコードかくなよ…
VC++じゃないと通らないというか、
VC++の特定のバージョンじゃないと通らないかも知れんぞ。
はい、それで無くても全然ダメっぽいです。 stdin->_cntで表現できない程の文字数は格納できないです。 でもそんな事言ってたら、reallocもsize_t型の変数で領域の大きさ指定するしなぁ。 それじゃ逝きます。さよなら!
便乗質問。 gcc -ansi -pedantic -Wall でワーニングもエラーも出なかったら、どのコンパイラでも OKと考えていいですか?
>>983 どのコンパイラでもコンパイルが通ることだけは期待できる。
が、それがちゃんと動くかどうかは別問題。
>>968 どの処理系でもイケるはず。
#include <stdio.h>
#include <stdlib.h>
#define CELL_SIZE 100
typedef struct cell {
char data[ CELL_SIZE + 1 ];
struct cell* next;
}cell_t;
cell_t* CreateCell() { return (cell_t*)calloc( 1, sizeof( cell_t ) ); }
void Cell_Display( const cell_t* cell ) {
while( cell != 0 ) {
fputs( cell -> data, stdout );
cell = cell -> next;
}
}
void Cell_Clear( cell_t* cell ) {
cell_t* target;
while( cell != 0 ) {
cell = ( target = cell ) -> next;
free( target );
}
}
int main(int argc, const char** argv) {
cell_t *head, *tail;
FILE* fp = 1 < argc ? fopen( argv[1], "r" ) : stdin;
tail = head = CreateCell();
while( !feof( fp ) )
fgets( ( tail = tail -> next = CreateCell() ) -> data, CELL_SIZE, fp );
Cell_Display( head );
Cell_Clear( head );
}
メモリ確保に失敗するのが恐いときは、 cell_t* CreateCell() { cell_t* cell = (cell_t*)calloc( 1, sizeof( cell_t ) ); if( cell == 0 ) exit(-1); return cell; } とでも。 # 未チェック。
987 :
デフォルトの名無しさん :03/06/08 14:04
8代目まだ?
>>985 CamelCase と underscore_delimited を混ぜたのは初めて見たかも
>>985 exit の直前に限っては free する必要はない。
>>983 あらゆるコンパイラがANSI Cに完全準拠しているわけじゃないし、ライブラリの問題もあるし。
線形リスとなんぞ使わなくても、これで十分だろ。 #include <stdio.h> #include <stdlib.h> int main( int argc, const char** argv ) { FILE* fp; char* buf; size_t size; if( fp = fopen( argv[1], "rb" ), fp == 0 ) { return -1; } fseek( fp, 0, SEEK_END ); buf = malloc( ( size = ftell( fp ) ) + 1 ); rewind( fp ); fread( buf, size, 1, fp ); buf[size] = '\0'; printf( "[%s]\n", buf ); }
>>991 うわー、絶対いっしょに仕事したくないタイプ。
>>992 なんで?カンマ演算子とか使ってるから?
めちゃ素直なコードだと漏れは思うよ。 fopen は検査して malloc は検査しないのは分からんが。
main()の戻り値に-1を使うような奴とは仕事したくないと言うなら
>>992 に同意。
>>978 下の方のプログラムは一文字余分に表示される。
プログラム板だと1000取り合戦も起こらないんですね
C++ >>>>>>> Java
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。