3 :
デフォルトの名無しさん :03/06/08 16:44
おぽんぽん
「n個の自然数(3桁[100-999]をランダムで作る。nはプログラム実行時に入力する。」 「関数実行にかかった時間を計測する(void bubble等)」 問題の一部なのですがここだけお願いします。
5 :
デフォルトの名無しさん :03/06/08 18:26
>>4 timeとかclockとか使えばできるよ。
あ、2つの文は別の要件なのか。 でも、上の条件満たす方法すらわからないようなら、 プログラムなんてやめちゃえ!
7 :
デフォルトの名無しさん :03/06/08 18:30
>>7 /dev/urandomから取り出せばOK
>>4 乱数の品質が悪くてよければ
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
char buf[16];
if (fgets(buf, sizeof(buf), stdin) == NULL)
return 0;
for (i = 0; i < atoi(buf); i++)
printf("%d\n", rand() % 900 + 100);
return 0;
}
時間を計測するのは、えーと、めんどくせ。だれか頼んだw
#include <time.h> clock_t start,end; start=clock(); /* しょりぃ */ end=clock(); printf("%.2f秒くらいじゃないかな。\n",(double)(end-start)/CLOCKS_PER_SEC);
11 :
デフォルトの名無しさん :03/06/08 19:02
ループ続行条件チェックの度ににatoiはねーだろ。
>>11 そう? atoiはconst char*とるし、ループ中でbufは全く扱ってないので、
ふつー最適化されちゃって一度しか評価されないんじゃない?
>>11 別に、マシンパワー余ってればいいんじゃない?
それよりも、buf[16]が引っかかった漏れは駄目人間ですか?
16桁だと環境によっては、あふれる予感が...
999,999,999,999,999 = 0x38D7EA4C67FFF
計算違うか?違ってたらごめん。
そんなことより > void bubble が引っかかってる奴はいませんか?
>>15 確かに。
ソートにかかる時間がアルゴリズムによってどう変わるか計測
しよとしてるのかなって予想ついたから言わなかったけど…。
>>12 Cの関数呼び出しって、そういう最適化はできないんじゃねーの?
atoi()は標準関数だから、コンパイラが特別に対応すればできるかもしれないけど。
(VC6では最適化してない)
アセンブラコードに落として死ぬまで復唱しろ
19 :
デフォルトの名無しさん :03/06/08 22:26
アドレスにjunkroomって、バレバレだよね
>>19 あのさぁ....
あ、それって、提出したら教授が「excellent」をくれるレベルだと思うよ。
もう十分。
>>19 Ctrl-dの話なら前スレでアドバイスがあっただろ
Cで XMLのデータ抜き出す作業 について詳しい方いますか?
いますよ
>>19 ctrl+d でおわるじゃん。
コメントもついてるじゃん。
どこがいけないんですかね?
32 :
デフォルトの名無しさん :03/06/08 23:08
要するに 「俺でも分かるように説明しろ」 と
28ですが、 おしえてもらえませんか?
>>34 ここまで複雑なのになると…
フリーでCのXML処理ライブラリってあったと思ったからそれを探してみたほうが早いかも。
どうしても自分で作るというのなら、パーザと内容の解釈を分離したほうがいいと思うな。
そうですかぁ・・・
ありがとうございます
>>35 さん
37 :
デフォルトの名無しさん :03/06/09 02:43
@ 行列の掛け算を行います、行列aとbは4行4列とします。行列aの要素の値は、 各自決めたください。行列bは単位行列とします。 計算はマトリクスの積を使うと便利。
#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; } 全スレの問題と答えなんだけど、 実行すると4行4列の0行列になります・・ ぎょうれつA値を自由に決めるってのは、どういうふうに書くんですか
訂正 ぎょうれつA値〜〜〜〜 ↓ aの値を好きに決めるってのはどういうふうに書くんですか?
a[0][0] = 1; a[0][1] = 2;
行列の話が出たのでついでに聞きたい。ps2などのvuユニットって直接 行列の計算できるんでしょ?俺今行列を使った透視投影変換で悩んで るんだが、回転や移動変換なら良く見るから知っているんだが透視投影 変換はどうも良く分からない。(x,y,z,w)があって4*4の何をすれば(x',y') になるんですか?
43 :
デフォルトの名無しさん :03/06/09 06:45
44 :
デフォルトの名無しさん :03/06/09 08:11
46 :
デフォルトの名無しさん :03/06/09 08:56
環境はUNIXのCで、日付に関する宿題がでています。助けてください。 日付+N日を求めるという処理が必要なんです。(うるう年、30日、31日等を考慮して) こんな関数提供関数でありそうなものなんですけど、なさそうなんです。 調べたんですが分かりません。 やっぱり、自作するしかないですか?
自作してください。ちなみにN日を秒で表して、time_tと足し算すればいいよ。
48 :
無料動画直リン :03/06/09 09:13
C/C++の宿題やらせてくださいスレだろここは。
ソース書いてやれ。
>>1-1000
>>49 ここは隔離スレ。
まともに宿題やってやるやつのほうがアホ。
ファイルに含まれる文字列を照合(探索)するプログラムを以下の仕様にしたがって作成しなさい。 1.「力まかせの方法」を用いる。 2.探索を行う関数名は、search1とする。 3.関数search1は一致した文字列のすべての位置を返すものとする。(連結リストの先頭アドレスを返せばよい)関数の中で、一致した文字列をprintすることはしないこと。 4.プログラム(main文)では、一致する文字列を含めて前後10文字を表示するものとする。 5.プログラムは、一致するすべての文字列を表示しなければならない。 6.プログラムは任意のファイルをプログラム実行時に指定できること。
>>51 の問題で力任せの方法ではなく「Boyer-Moore法」を用いる。
Cなんですがメインの探索する関数の部分をどうすればいいか
わかりません。わかる方いたらよろしくお願いします
何をもって「力まかせ」って言うのだろう? 「力まかせの方法」の定義キボヌ。
>>53 自分もよくわからないんですが何もひねらない
一番効率が悪いやり方ということだと思います。
例えば
abcdefghijdkhjakjshfkajという感じで検索対象の文字列があるとすると
abcdefghijdkhjakjshfkaj←検索対象文字列
↑
ここから検索
↓
agh←検索したい文字列
aは一致するので次の文字を検索
↓
bとgは一致しないので
abcdefghijdkhjakjshfkaj
↑
bの部分から再び検索開始
↓
agh
こんな感じです。わかりますかね・・・?
そんなに難しくないといってたんですがわかりませんでした
標準関数使わないで?
>>54 strcharで先頭の文字だけ引っ掛けて、strncmpで比較でどうかな。
力技だと思うけど。
>>56 それだったら、strstr()のほうがいいよ。
>>46 前スレのバイオリズムのお題でそういうことをやってたような気がする。
60 :
デフォルトの名無しさん :03/06/09 17:50
> printf("No more data.\n"); これを消せば?
62 :
デフォルトの名無しさん :03/06/09 18:12
>>61 実行例があってNo more dataを表示させないといけないので消せません
終了条件がCtrl+Dってどういうこと? Ctrl+Dを押せばいつでも強制終了じゃないの?
環境にもよるけど、大抵強制終了はCtrl+Cでは。
fgetsの戻り値をチェックしろって前スレに書いてあったろ
コンパイルして実行させたのか? そのプログラム最後にそんなメッセージ出るはず無いぞ。 そこ、入力行でしょ?
ああ、そういうことか Ctrl+Dするとそうなるってことね。 前言撤回
>>60 あれ?そのコード、ちょっと前までコメント付きだったじゃん。
何でコメント削除したの?
if (fgets( command,MAXLINE,stdin ) == NULL) { exit(EXIT_FAILURE); }
>>69 うわー、絶対いっしょに仕事したくないタイプ。
72 :
デフォルトの名無しさん :03/06/09 19:29
宿題お願いしますw 合計台数とタイヤの総本数を入力して、 自転車と三輪車のそれぞれの台数を表示させるプログラムを作りたいんです。 んで、合計台数とタイヤの数がありえない組み合わせのときは 「無理だ」って表示させるよーにって。
73 :
デフォルトの名無しさん :03/06/09 19:31
fgetsの戻り値をチェック??
74 :
デフォルトの名無しさん :03/06/09 19:34
てか、まったく持ってわからんのですわ。・゚・(ノД`)・゚・。 しかも、ほとんど初めてやる人にこんな宿題出されても わからんちゅーねんヽ(`Д´)ノウワァァァン
>>74 もう学期始まってから2ヶ月もたってますよ。
>>74 もし、それが本当ならクラスの誰もできてないから安心しろ
>>78 もしまかり間違って正解を持っていったら、
カンニングする要注意人物としてマークされたりしてなw
> 宿題お願いしますw これでやる気失せた
つるかめ算のたぐいでは?
スレタイよく読んでください
宿題お願いしますウェーハッハッハ
>72 鶴亀ざーーーーーーーーーーーーーーーん
まぁ出題ミスだろうな。 stdioの制御をそこまで求められなければ成らない宿題とは思えない。 >q で終了とかにおするべき問題だな。
DAT落ちしていますが
>>72 #include <stdio.h>
#include <stdlib.h>
int main(int argc,char **argv){
int daisuu,taiya;
int jitensya,sanrinsya;
if(argc<2) return 0;
daisuu = atoi(argv[1]);
taiya = atoi(argv[2]);
if(( daisuu * 3 < taiya) || (daisuu * 2 > taiya)){
printf("ありえねー\n");
}else{
jitensya = daisuu * 3 - taiya;
sanrinsya = daisuu - jitensya;
printf("自転車 %d 三輪車 %d\n",jitensya,sanrinsya);
}
return 0;
}
コマンドラインの第一引数に台数、第二引数に車輪の数を与えてくれ。
90 :
お願いします!!! :03/06/09 19:59
π(円周率)を小数以下10000桁まで求めるプログラムをC言語で作成し、 9991桁から10000桁の10個の数字を表示しなさい。 だれかよろしくお願いします。
鶴亀斬?
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を押すこと)でプログラムは終了する,このプログラムを作成せよ.
>>72 #include <stdio.h>
#include <stdlib.h>
void error(void)
{
fprintf(stderr, "無理だ\n");
exit(1);
}int DivWithCheck(const int a, const int b)
{
if(a % b)
error();
return a / b;
}int prompt(const char *const msg)
{
int tmp;
printf("%s を入力してくれると有難い。\n", msg);
scanf("%d", &tmp);
return tmp;
}int main(void)
{
int sum, wheel;
int jit, san;
sum = prompt("合計台数");
wheel = prompt("タイヤの数");
jit = DivWithCheck(wheel - 3 * sum, 2 - 3);
san = DivWithCheck(2 * sum - wheel, 2 - 3);
if(jit < 0 || san < 0)
error();
printf("自転車:%d\n三輪車:%d\n", jit, san);
return 0;
}
#include <stdio.h> int main() { int x, y, t; printf("input body >"); scanf( "%d", &x ); printf("input tire >"); scanf( "%d", &y ); t = y - 2 * x; if( t < 0 || x < t ) printf("(-_-)\n"); else printf("3rin:%d\t2rin:%d\n", t , x - t ); return 0;
続き }
#include <stdio.h> int main(void) { int bicycle, tricycle, tire, amount; puts("合計台数を入力すれ"); scanf("%d", &amount); puts("タイヤの本数も入れやがれ"); scanf("%d", &tire); bicycle = 3 * amount - tire; tricycle = tire - 2 * amount; if (bicycle < 0 || tricycle < 0) puts("無理だ、ボケ\n"); else printf("自転車 %d台, 三輪車 %d台だ。これくらい自分で計算しろや\n", bicycle, tricycle); return 0; }
>>96 2回もあったんですか…
同じ授業の可能性大な気がします…
これって他のパターンとかってできないんですかね?
99 :
デフォルトの名無しさん :03/06/09 20:17
この回答ラッシュ...このスレのレベルがよく分かるな。
>>98 今まではマーチンの公式を使えとあったけど、今回ないから違うの使えば?
>>100 あ…。それ絶対同じ授業だ。
ヒントとしてπの求め方はマーチンの公式が与えられてます。
あと、桁数の多い数の演算の方法として配列使えっていうのも
>>101 ヒントなら別の使っても構わないのでは?
っていうか、2ちゃんに宿題聞きに来る愚奴がこんなにいるって、どんな学校だよ!!
電気通信大学 あ、言っちゃった!
大丈夫だ。東京か大阪か、特定されていない(にや
2chで宿題をやってもらおうとする愚か者は大阪にはいない。
そもそもCtrl+DがEOFにバインドされてる保証は無い
宿題スレでそんなこと言ってもむなしく響くだけ。
ねむくなるスレだ
112 :
デフォルトの名無しさん :03/06/09 21:38
C/C++の宿題やらせてください
114 :
デフォルトの名無しさん :03/06/09 23:05
すみません、明日までの宿題です。 UNIXのCで 最大30桁(少数含む)の四則演算を 行う関数を作りたいのです。 long double や decimal型はダメです。 おそらくchar型やdouble型を使って作るのだと 思いますが、どなたか力添えをください。 お願いします。
115 :
デフォルトの名無しさん :03/06/09 23:20
明日の夜、手伝ってやろう。
class real { public: static const int precision = 30; real(); real( double x ); real& operator += ( real const& rhs ); real& operator -= ( real const& rhs ); real& operator *= ( real const& rhs ); real& operator /= ( real const& rhs ); private: char mantissa[ precision ]; int exponent; }; real operator + ( real const& lhs , real const& rhs ){ return real( lhs ) += rhs; } real operator - ( real const& lhs , real const& rhs ){ return real( lhs ) -= rhs; } real operator * ( real const& lhs , real const& rhs ){ return real( lhs ) *= rhs; } real operator / ( real const& lhs , real const& rhs ){ return real( lhs ) /= rhs; }
Cじゃないし実装がないじゃん。
思いついたまでの力添えだ。答えじゃない。
119 :
デフォルトの名無しさん :03/06/10 00:09
前スレにあるのですが、配列を使わずにお願いします。 和が一定となるような自然数の列を列挙するプログラムを作成せよ。 重複はみとめる。 例えば、和が3の自然数の列は 1,1,1 1,2 2,1 3 となります。
>>119 int main( int argc, const char** argv ) {
int wa = atoi( argv[1] ), i;
for( i = 1; i <= wa / 2; i++ )
printf("%d = %d + %d\n", wa, i, wa - i );
}
>>120 お前さ、いろいろレスつけてるけど、全然だめだからもうやめとけ。
そのプログラムで、3は1+1+1って答えが出せるか?
>>119 おっと!間違った。
もし、その和の数が100のときは、
1,1,1,1,1,1,....,1
1,1,1,1,1,1,...,2
とか、ぜんぶ挙げるの?
123 :
デフォルトの名無しさん :03/06/10 00:26
うっかり引数をつけないで実行しただけであぼーんか。
>>121 >>全然だめだからもうやめとけ。
なんでさ?
>>119 再帰関数使えよ。
「重複はみとめる」ってことは重複しなくても解として認めるって
ことだろ。なら簡単だ。
>>124 「全然だめだから」っつってんだろ。
日本語読めてない時点で全然だめなんだよ。
>>119 分割する数でループ回せばいいのかな。
2・・・1,1,1
1・・・1,2 2,1
0・・・3
って感じで。
簡単ならやってやれよw ちなみに俺には難しい。
>>125 簡単だとか言うのはコードを出してからにしろ
>>125 配列を使わないと結構、パフォーマンス悪くなる。
>>126 全然だめだと、なんで駄目なんだよ。
「宿題やらせて」ってのに、
「相手のために、宿題をやってやる」ってニュアンスはねーだろ。
「自分のために、宿題をやらせてもらう」なんだよ。
とりあえずコテハンはやめたら?
133 :
デフォルトの名無しさん :03/06/10 00:40
>>127 ・・・の左と右の関係はなに?コンマの数?
>>128 n!の計算とかクイックソートとか勉強すれば思いつくよ。
>>129 この程度思いつかないやつはすっこんでろって。
>>130 え?パフォーマンスは要件に入ってないからかまわんだろ?
>>131 ああ、確かにな。すまん。
135 :
デフォルトの名無しさん :03/06/10 00:42
再帰関数を最初に呼び出す関数にも for 文があって、 再帰関数の中にも for 文がある?ややこしい。
138 :
デフォルトの名無しさん :03/06/10 00:44
簡単だと思ってやってみたけど実は難しかったというパターンかな。
LISP版でもいいから、もう一回作って書いて下さい。
ひらめいた 配列の代わりにリスト使うっつーのはどうだ?
mallocでいいじゃん。
:||:: \おい、ゴルァ 出て来い!! ドッカン ゴガギーン
:||::  ̄ ̄ ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ _m ドッカン ☆
:||:: ___ ======) ))_____ / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
:|| | | | ̄.ミ∧_∧ | | ────┐||:: ∧_∧ < おらっ!
>>125 出てこい!!
:|| |ぁゎゎ. | |_..( ) | | .___ │||:: (´Д` ) \___________
:|| |Д`); | |_「 ⌒ ̄ ,|.. |_... 5 ..||||:: / 「 \
:|| |⊂ノ; | |_| ,/  ̄ .  ̄ ̄ ̄ │||:: | | /\ \
:||:  ̄ ̄ ̄  ̄| .| :||│ ;, │||; へ//| | | . |
:||:: :; ; ,, :| :.| ||│ (\/,.へ \| | (r )
:||:: :; 冫、. . | .i .|:||◎ニニニニ\/ \ |  ̄
:||.:,,''; ` .. . :: . | ∧. |:||│::::/ │||::.:. .Y ./
:||:;;;: : | | | |.||│ 冫、 ;;;,,│||:;;;. | .|
:||:;;;: / / / /::||│ ` .,;;;,,.│||:;;;. | .|
:||;::: # ..: ./ / ./ ./ ||│|三三三|. │||;;:..:: | .|
:||;::: #. ..: :::::: (_) .(_).ミ||│ │||;;;k、,,,|,(_)
 ̄ ̄ ̄ ̄ ̄: ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
:::;三三;;;;;三三:::;;;;;;; :::::;;;;;::;;;;;;;;;;::::;; :::::;;;;;:::::;;;;;;;;;;::::;; :::::;;;;;:::;;;;;;;;;;::::;;;;;::三三三
146 :
デフォルトの名無しさん :03/06/10 01:13
>>119 次のプログラムが参考としてあります。
これを参考に作れないでしょか
#include<stdio.h>
void abs_sum( int n, int w);
int main()
{
int w = 2, n =3;
abs_sum( n, w );
return 0;
}
/*
* 和がw以下となる長さnの非負整数の数列を全て列挙する
*/
void abs_sum( int n, int w )
{
void in_abs_sum( int total_length, int n, int w);
in_abs_sum( n, 0, w);
}
147 :
デフォルトの名無しさん :03/06/10 01:13
>>146 続き
/*
* 和がw以下となる長さnの非負整数の数列を全て表示するための内部関数
* 入力
* total_length : 数列の長さ
* pos : 今考えてる数列の場所 ( 0〜 total_length - 1)
*
* w : 数列の重み
*/
void in_abs_sum( int total_length, int pos , int w)
{
int i, j, called = 0;
if ( pos >= total_length ){ /*数列はもうおしまい?*/
putchar( '\n');
return;
}
for( i = 0; i<=w; ++i){ /*数列がまだ続く場合*/
if ( called++){ /*この場所でもう呼ばれたのか?*/
for( j = 0; j < pos; ++j){
printf(" ");
}
}
printf("%2d",i);
in_abs_sum( total_length, pos + 1, w - i); /*再帰的に繰り返す*/
}
}
abs_sumだけプロトタイプ宣言を書いてin_abs_sumのプロトタイプ宣言は書かないんだ。
// 再帰でリスト作ればいけるね #include <stdio.h> #include <stdlib.h> struct list { int n; struct list* next; }; void print_list( struct list* p ) { for( ; p != 0 ; p = p->next ) printf( " %d" , p->n ); puts( "" ); } void xxx( int n , struct list* p ) { if( n > 0 ) { struct list node; node.next = p; for( node.n = 1 ; node.n <= n ; ++node.n ) xxx( n - node.n , &node ); } else { print_list( p ); } } int main( int argc , char* argv[] ) { if( argc > 1 ) xxx( atoi( argv[1] ) , 0 ); return 0; }
print_listは関数に分ける必要なかったな。
>>119 何度なくできましたが、char* とか使ってます。
つか、なんでこれでうまく動くのか、今ひとつ漏れにも判りません。
#include <stdio.h>
#include <stdlib.h>
void d( int wa, int n, char* hist ) {
if( wa < n ) {
} else if( n == 1 ) {
printf( "%s,%d¥n", hist ,wa );
} else {
int i;
for( i = 1; i <= n; i++ ) {
char* buf = malloc( 100 );
sprintf( buf, "%s,%d", hist, i );
d( wa - i, n - 1, buf );
free( buf );
}
}
}
int main( int argc, const char** argv ) {
int wa = argc < 2 ? 5 : atoi( argv[1] ), i;
for( i = 1; i <= wa; i++ ) {
char* buf = malloc( 100 );
sprintf( buf, "" );
printf("---- sum:%d, count:%d -----¥n", wa, i );
d( wa, i, buf );
free( buf );
}
}
>>125 たしかに、重複を取り除くと難しさupですね。
>>149 先に出てた...しかも短くて綺麗...鬱。
int nth_permutation( int sum, int n, int output ){ int current = 1, next_n = -1, i; for( i = 0; i<=n; ++i ){ if ( current==sum ) break; if ( nth_permutation( sum-current, ++next_n, 0 ) ) continue; if ( i==n ) break; ++current; next_n = -1; } if ( output ){ printf( "%d,", current ); if ( current!=sum ) nth_permutation( sum-current, next_n, 1 ); } return current!=sum; // 次があるなら true を返す } int main(void){ int n = -1, sum; if ( scanf( "%d", &sum )!=1 || sum<=0 ) return 1; while( nth_permutation( sum, ++n, 1 ) ) printf( "\n" ); printf( "\n" ); return 0; }
// 簡単に重複取り除けました #include <stdio.h> #include <stdlib.h> struct list { int n; struct list* next; }; void xxx( int n , struct list* p ) { if( n > 0 ) { struct list node; node.next = p; for( node.n = ( p != 0 ) ? p->n : 1 ; node.n <= n ; ++node.n ) xxx( n - node.n , &node ); } else { for( ; p != 0 ; p = p->next ) printf( " %d" , p->n ); printf( "\n" ); } } int main( int argc , char* argv[] ) { if( argc > 1 ) xxx( atoi( argv[1] ) , 0 ); return 0; }
前のスレでもいらっしゃいましたが、解決していないようなので質問させてください。 再帰を利用しないハノイの塔のプログラムをお願いします。
#include <stdio.h> void xxx( int n) { int i,j, k; for (i = 1 << (n-1); --i >= 0;) { for (j = 1 << (n-2), k = 1; j > 0; j >>= 1) if (i & j) { printf("%d,", k); k = 1;} else k++; printf("%d\n", k); } } int main( int argc , char* argv[] ) { if( argc > 1 ) xxx( atoi( argv[1] ) ); return 0; }
>>158 > for (i = 1 << (n-1); --i >= 0;) {
で 1<<(n-1)回のループをまわしてる
つまりこの個数分の出力があるってことだろ?
オーバーフローするほどの数だったらそもそも数が多すぎて出力しきれないんじゃないか?
>>161 154のやつだと32入れても数秒で完了するようですが。
>>162 154は
1,1,1,1,1,1,1,1,2も
1,1,1,1,1,1,1,2,1も全部同じものとみなすから出力数が少ない
156は全てのパターンを出力するからその数は桁違いに多くなる
ふむ。n!オーダーで増えるのですね。 重複を取り除いた場合のオーダーは・・・・ もぅねむいや。
>>164 その都度プリン度して、データを溜め込んでるわけじゃないから、
パターン数の多さは関係ないんじゃないの?
×プリン度 ○プリント
どうでもいいが重複を取り除いてもいいってのは125の勝手な解釈じゃないか? 「認める」ってのが、答えに対して認める(=答えに重複が含まれてもかまわない)のか、数列に対して認める(=組み合わせではなく順列)のかわからないが。
まぁまぁ、でもリストつくってそれをスタックにしつつ列挙していくのが正攻法だな。
正攻法かは知らんが(´-`;)かなり巧いテクだな リストっつったらmallocすることしか考えてなかったよ 再帰してスタック使えばサイズも動的に変えられるもんな
>>170 でも、スタック消費が多くなるね。
mallocしながらグローバルスコープにリストをつくっていったほうが
より大きな数まで処理できるかもしれない。
172 :
デフォルトの名無しさん :03/06/10 07:45
すげえムカツク。あぼ〜んしよ
そこまでできていれば十分だと思うんだが。 何も分からないくせに100点を取らないと気がすまないの?
175 :
デフォルトの名無しさん :03/06/10 09:22
つか、もはやただのアラシだな。自分でmain修正してきたときは、 「がんばったな」って思ったりしたが。
コメントアウトすればいいんじゃない?
%s使え。 while( cur != 0 ) { node_t* target = cur; free(target); cur = cur -> Next; } は while( cur != 0 ) { node_t* target = cur->Next; free(cur); cur = target; }
他にも文句はあるな。e一文字だけ入力されたらどーなるんだ? とか。
180 :
デフォルトの名無しさん :03/06/10 13:09
class CTest { float a; public: CTest() { a = (float)1234.02; } CTest(int num) { CTest(); } float GetA() { return a; } }; こんな感じにfloat型のメンバ変数に初期値を代入しても、 返ってくる値はめちゃくちゃなのはなんでだろう。 ちと悩んでる。
>>180 コンストラクタにvoidもしくはint以外の型のものを渡してないか?
a = (float)1234.02; a=1234.02F;と書け。
>>179 いや、ほら、main()は適当に書いただけだから...
CTest(int num) { CTest(); } これは CTest( int )のなかで、 あたらしい CTestの一時オブジェクトを作るだけです。 その一時オブジェクトはすぐに潰えます。 呼び出し元---CTest( int )---の、this -> a には何の影響も与えません。
えらい嘘教えてるな
186 :
デフォルトの名無しさん :03/06/10 16:46
えーと、今Cの授業を受けているのですが、何やら「配列」と「ポインタ」っていう革命的な概念が登場しまつた。課題を見るとビックリ、もう何がなにやらです。 課題はこんなかんじ。 以下は,標準入力から入力した文字列を逆順にして表示するプログラムの一部である. 関数 reverse の定義を追加し,プログラムを完成させよ. なお,入力される文字列の長さ(文字数)は任意であるが, 99文字以内であることが保証されているものとする. #include <stdio.h> #include <string.h> void reverse(char *s) { /* ここに追加せよ! */ } int main(void) { char str[100]; scanf("%s", str); reverse(str); printf("%s\n", str); return (0); } きー文字列を逆にする発送が思い浮かばない罠。 おねがいいたします。
ありがとう、でもDAT落ちしてる・・・
void reverse(char *s) { size_t len = strlen(s), goal = len /2, i; char tmp; for (i = 0; i < goal; i++) { tmp = s[i]; s[i] = s[len - 1 - i]; s[len - 1 - i] = tmp; } }
191 :
デフォルトの名無しさん :03/06/10 17:35
>>184 まぢ?クラスのメンバ関数内でコンストラクタ呼び出すとそこで
自分自身の一時オブジェクト生成しちゃうの?
だとしたら、今までの俺の理解は激しく違ってたことになるな。
>>191 コンストラクタ内でthisポインタの値を表示してみればよく分かるよ。
デストラクタの中でも表示したほうがいいかな。
194 :
デフォルトの名無しさん :03/06/10 17:45
>>192 おまいの機嫌なんかどうでもいいが、なにを書き換えればいいのかいまいちわからん
>>194-195 *aはポインタをなんとか使おうとした名残ですね、すみません。
*aはjです。
何かしらの形でポインタが使用されていれば良いので、
どこかポインタを使って処理できるところを書き換えればよいそうです。
じゃあ void (*f)() = print_matrix; (略) f(m_C); とかしてみれば?
199 :
デフォルトの名無しさん :03/06/10 18:06
>>193 ほ、ほんとだ。 (゚Д゚;))ガタガタブルブル
知らんかったー。そっか、new CTest()とかでメモリ確保できるのも理解できる。
いや、ほんとサンクスコです。勉強になっただす。
200 :
デフォルトの名無しさん :03/06/10 18:10
配列だからポインタをインクリメントさせて内容みるのがいいんじゃないかな。 それ狙った課題だと思ふ。
204 :
デフォルトの名無しさん :03/06/10 19:39
(1)テキストファイルがある.各行のデータを,ID,姓名,読み(ローマ字)の 三つの要素をもつ構造体に格納するプログラムを書け. (2)木とはなにか.また,2分木とはなにか.説明せよ. (3)(1)でデータを格納した構造体を節点とする2分木を作成するプログラムをかけ. 新しいデータを一行ずつ構造体に読み込んで,木に追加していくこと.必ずポインタを 使って木を実現し(構造体に必要な修正を加えること),データが増えても対処できるようにすること.また,すべての節点をなぞりながら,データ(ID,姓名,読み)を出力できるようにもせよ.その際できるだけ見やすい形に表示するよう工夫すること.
205 :
デフォルトの名無しさん :03/06/10 19:53
C言語でよろしくお願いします。 文字列を圧縮するプログラムを作成せよ 例 aaaabbbcccccdddd ↓ 4a3b5c4d
>205 文字列はどうやって与えるのん?
念力
>>206 実行すると、まず文字列を入力してくださいと表示して、
aaaabbbcccccddddと入力したら、4a3b5c4dと表示しなおすようなプログラムです。
よろしくお願いしますm(__)m
オーラ力
TCPPort8081に文字列が送られてくる。
#include <stdio.h> int main(void){ int c, buf, count; count = 0; buf = EOF; while((c = getchar()) != EOF){ if(buf != c){ if(count != 0){ printf("%c%d", buf, count); } buf = c; count = 1; }else{ count++; } } return 0; }
main(){ char c; printf("入力してください >"); scanf("%c,&); printf("4a3b5c4d"); }
10個の数列を配列に格納し、これらの順序を入れ替えて、入れ替え前と 入れ替え後のの前配列要素の値を求めるプログラムを 教えて頂きたい。順序を入れ替えるのはd[0]とd[9]で お願いしますm(__)m
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉 ∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
>>217 要求定義ってどういうことをさすのですか?
初心者でスミマセン
>>215 の問題を提示されて解ける奴はこのスレには一人もいねーっつーことだ
エスパーでも呼んで来い
その説明じゃあどんな天才プログラマでも 何をつくればいいのか分からない。
簡単だ。 この程度思いつかないやつはすっこんでろって。
>>5 プログラム作成をどうかお願いしますm(__)m
できる限りのことは頑張ります。
>>208 #include <stdio.h>
void main() {
char moji[100],kai[26];
int i;
for (i = 0 ; i < 100 ; ++i ) {
moji[i] = 0;
kai[i] = 0;
}
printf("文字列を入力してください");
scanf("%s",&moji);
for ( i = 0 ; moji[i] != '\0' ; ++i)
++kai[ moji[i] - 'a' ];
for (i = 0 ; i < 26 ; ++i){
if (kai[i] != 0)
printf("%d%c ",kai[i],i + 'a');
}
}
>>215 >前配列要素の値を求める
'全'配列要素のことか?
というかどういう数列を入れるかが分からんけど、
枠組みだけなら作れると思うよ。
エスパーが簡単だと言ってるから任せてみよう どんなのが出てくるか楽しみだ
これはもっと短くできるんだろうか・・ まだまだ初心者なんで、なんか改善すべき点があったら是非教えてくらはい。
↑ 223の間違いです。
>223 配列の初期化ってもっと簡た(ry
C言語でプリンターポートにHEXファイルを出力したいのですが どうしたらできるのでしょうか?
>>224 >全'配列要素のことか?
そうです。字を間違えました。
数列は1とか10とか簡単な数字を格納すればいいと思います。
前配列要素の値を求める がどういうことかを教えてもらいたい。
int d[10]; に数字が入っているとして d[0]とd[9]を入れ替えて 配列の要素すべて表示すればいいのか?
>>229 大まかに2通りあると思うけど。
1.プリンタを直接操作して書き込み <-面倒
2.テキストか何かに出力してプリントアウト <-簡単
>>228 あんがちょ。
俺の持ってる初心者用の教科書では
配列を0にする初期化の方法はこれ以外載ってないんで、
違う本で調べてみます。
237 :
デフォルトの名無しさん :03/06/10 22:28
>215の問題が面白いからage
238 :
デフォルトの名無しさん :03/06/10 22:31
お願いします!!!! (1)テキストファイルがある.各行のデータを,ID,姓名,読み(ローマ字)の 三つの要素をもつ構造体に格納するプログラムを書け. (2)木とはなにか.また,2分木とはなにか.説明せよ. (3)(1)でデータを格納した構造体を節点とする2分木を作成するプログラムをかけ. 新しいデータを一行ずつ構造体に読み込んで,木に追加していくこと.必ずポインタを 使って木を実現し(構造体に必要な修正を加えること),データが増えても対処できるようにすること. また,すべての節点をなぞりながら,データ(ID,姓名,読み)を出力できるようにもせよ.その際できるだけ見やすい形に 表示するよう工夫すること
自分で出来るだろうに。
for (i = 0 ; i < 100 ; ++i ) { moji[i] = 0; kai[i] = 0; } ほんとにこれを教わったのか? どうしようもないな。
void main() { char moji[100],kai[26]; int i; for (i = 0 ; i < 100 ; ++i ) { moji[i] = 0; kai[i] = 0; } バッファオーバーフロー(・∀・)イイ!
>>223 これは多分出題の意図からすると間違ってると思われ。
問題も悪いんだけど、そのプログラムだと。
aabbbbccccaaacccc
は
a5b4c8
だよね。でもこれはデータ圧縮でつかうランレングス法を念頭に置いた出題のはずだから
a2b4c4a3c4
と並びを保ってencodeしないとまずいよ、たぶん。
>>172 printf("\t>");
command[0] = '\0';
fgets(command, MAXLINE, stdin );
>>230 int k;
k = d[0];
d[0] = d[9];
d[9] = k;
d[0]とd[9]の入れ替えはこういうやり方でいいんでない?
kは適当に付けた名前だよ。
他のとこはできると思うよ。
おっと、数字と文字の並びかたが逆だった。 でも、言いたいことには影響ないな。 察してくだされ。
#define swap(a, b) (a ^= b ^= a ^= b)
色々指摘してもらってありがたいです。
>>242 なるほど、そこまで問題の意図を考えてませんでした。
大学で出た宿題と似てたんで、つい同じ方法で書いてしまって・・
これからもういちど、プログラム作り直してみまふ。
>247 これ参考にどぞー>211 int a[100] = { 0 } ( ̄ー ̄)ニヤリッ
249 :
デフォルトの名無しさん :03/06/10 22:53
f(x)=exp(1.37*x)とする。 (1)x=0,0.1,0.2,0.3,0.4に対するf(x)の値を計算により求めて、 xとf(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(1.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 どなたかお願いします。
前にこれを乗せたら、親切な方が@をやってくっれたので、 アルゴリズムとフローチャートを自分で作って提出したら、 その二つが不十分で再提出になりましたT0T どなたかフローチャートとアルゴリズムお願いします。 とくにアルゴリズムお願いします。
253 :
>96 :03/06/10 23:00
>>238 IDとはどういうデータだ?
姓名、読みの文字数は可変か?それとも最大文字数が決まっている?
木に追加するとき、どう追加すればいい?2分木って左の枝と右の枝が
あるわけだけど、どっちに追加すればいい?その条件を明確にしてくれ。
見やすい形とは?
>>244 #include <stdio.h>
#define SIZE 10
main()
{
int dim[SIZE]={1,2,3,4,5,6,7,8,9,10};
int i,s,x;
x=i[0];
i[0]=i[9];
i[9]=x;
s=0;
for(i=0;i<SIZE;++i){
s=dim[i];
printf("%5d",dim[i]);
}
}
こんな感じにできたけど、大丈夫かな?
>>248 ありがとう。
>int a[100] = { 0 }
こうやるのか!
こっちの方がスマートにかけていいですね。
自分はもっと勉強せんとあかんようです・・
> こんな感じにできたけど、大丈夫かな? 知るか!! エスパーはどこいった?
この宿題解いてください。 #include<stdio.h> /* フィボナッチ数列について */ #define NUM 40 /* F(40)まで求める */ int fib(int n) { if(n > 1){ return fib(n-1) + fib(n-2); }else{ return 1; } } int main() { int i; for(i=0; i<=NUM; i++){ printf("Fib(%d) = %d.\n", i, fib(i)); } } 上のプログラムのfib()関数を再帰を使わずに 計算するように書き換えよ。すなわち、結果を 蓄える配列Fib[]とF(count-1)まで計算したこと を表わす変数countを、静的変数(または大域変 数)として宣言せよ。二重に計算することのな いよう工夫すること。
>>255 いやまだ自分は教えられるほど偉くもないんだけど、
俺がアドバイスできることといえば、
変数sはいらないんじゃない?
for( i = 0 ; i < SIZE ; ++i ){
printf("%5d",dim[i]);
}
でどうだろう。
>>259 なんか逆の気がするな。
まず再帰を使わないのから作って、次に再帰関数で
やってみましょーが普通の手順じゃないのかな。
それにグローバル使ってもいいってなんでだろー。
>>260 大学2年です。
計算機言語という授業の宿題です。
265 :
デフォルトの名無しさん :03/06/10 23:13
>>254 テキストファイルがあるのですがそれを読み込んで
ID,姓名,読み(ローマ字)の三つの要素をもつ構造体に格納します
IDは、番号です!例えばaaa2241見たいな感じです。
姓名、読みの文字数はおそらく不変です。
枝の追加は左の枝と右の枝どっちでもいいと思います(左と右変えると違うのですか?)
見やすい形…おそらく表示させて木とわかればいいと思います!
>>265 そのテキストファイルの内容が知りたいといっているのだよ
>>259 を実行してみたら最後のほうすごい時間かかった…
(明日論XP1700+でコンパイラはBCC)
やっぱり再帰はあかんね。おらよ。やっぱりグローバル変数なんか
使わなくていいとおもうよ。
main()
{
int Fib[NUM + 1];
int count;
for (count = 0; count <= NUM; count++) {
if (count > 1) {
Fib[count] = Fib[count - 1] + Fib[count - 2];
}
else {
Fib[count] = 1;
}
printf("Fib(%d) = %d.\n", count, Fib[count]);
}
return 0;
}
269 :
わからずや :03/06/10 23:23
あのー。質問です。 計算式を文字列として読み込みスタックを用いて計算するプログラムに ついて質問です。 逆ポーランド記法でスタックに入れていこうと思うのですが 7*(((6+8)*(3*6))+2) のように括弧がついた式になるとスタックに入れる順番が分からなくなって しまいます。 誰か詳しく教えて頂けませんか?
こんな感じで? #include <stdio.h> #define SIZE 10 main() { int dim[SIZE]={1,2,3,4,5,6,7,8,9,10}; int i,x; x=i[0]; i[0]=i[9]; i[9]=x; for( i = 0 ; i < SIZE ; ++i ){ printf("%5d",dim[i]); } } とりあえず完成したのですが、僕のほうでは 動作を確認する環境がありません。どなたか このプログラムを実際に動かしてはもらえないでしょうか。 出力結果が 1 2 3 4 5 6 7 8 9 10 10 2 3 4 5 6 7 8 9 1 になればいいのですが。お願いします。
>>262 フィボナッチ数列は定義が再帰(帰納)になってるので、
再帰で実装するのが自然だと思う。
>>271 んー…しかしたかだか40程度で10秒以上かかってたぞ。
この程度の簡単なものに再帰は効率悪すぎる気がするな。
>>272 うんもちろん。実装が自然かというのといい実装かというのは別の問題。
再帰を使わずに実装できるのならそっちのほうがたいていいい実装だろう。
なるほど。
>>269 ネタか?
逆ポーランド記法のメリットに括弧を使わずに演算の優先順位を決めれると
いうものがあるのだが。
式変形をするんだろ。
あ、まだ変換してないのね・・・ 逝ってきます・・・
ループはこんなんだと思う。 int fib(int n) { int x = 1, y = 0; for (; n > 0; n--) { int z = x; x += y; y = z; } }
279 :
デフォルトの名無しさん :03/06/10 23:39
>>266 aaa111,井川慶,igawa/kei(aaa111)
aaa112,伊良部秀輝,irabu/hideki(aaa112)
:
:
みたいな感じです!
>>279 読み方の後ろについている括弧で括られたidは除去しなきゃいけないの?
281 :
デフォルトの名無しさん :03/06/10 23:43
282 :
デフォルトの名無しさん :03/06/10 23:45
二分木を見やすく表示せよ(通りがけ順) 一例として、たとえば左の子はアルファベットの早いもの、右は遅いものが来る二分木なら、 d / \ c f \ g のように
d / \ c f \ g
285 :
デフォルトの名無しさん :03/06/11 00:02
お願いします。 ファイルがあります。 そのファイルには、データがそれぞれ19行×2列あります。 そのファイルのデータを読み込んで、各行のデータの平均と、その平均をつかって共分散を 求めるプログラムをどなたかお願いします。 データの型はdoubleです。
>>285 一行にはどういう形式で列が記録されているのか?
二分木を作る関数はわかっているので、それを表示する void printtree(struct node *p) を教えてください
291 :
デフォルトの名無しさん :03/06/11 00:15
>>286 0.XXXXXX 0.XXXXXXX
0.XXXXXX 0.XXXXXXX
.
.
.
0.xxxxxx 0.xxxxxxx
って感じです。
292 :
デフォルトの名無しさん :03/06/11 00:15
本当に簡単な宿題です!・・・できない俺がおかしいんですけどね。 ・名前を入力するとその人の特徴を外部ファイルから読み出して出力するプログラム。 えーとポインタ等使うんでしょうか?tokutyo.txtってファイルの中は aoki ゴルフ大好き akagi 麻雀大好き akebono 抱擁大好き (以下ふざけた名前と特徴が続く(3kb分)) となってるんですけど、これをどうやって読み出すんでしょうか。 多分、これのもっと高度なものを上でやってるんでしょうけど全然わからなかったもので・・・ せめて実現するために使う関数でも教えてもらえませんか(´Д`;)
>>292 fopenでファイルを開きfgetsで読み出す。読み出したものはstrcmpで照合する。表示はprintfで。
ちょっと聞きたいんですけど,今あるファイルを開いて値を読み取っていくという プログラムをC言語でやってます。そこで # a a a 36 56 というファイルを読むときに#が現れたらその行は無視して 36と56を用意した変数に格納する。 もし#がないファイルでもきちんと36と56を用意した変数に格納する というプログラムをCで書きたいのですがどうもうまくいきません。 どなたかちからかしてください
どういう意味であるかどうか聞いているのか分からないけど、標準ライブラリにはない。 そういうものは自分で実装するかライブラリを入手する。
297 :
デフォルトの名無しさん :03/06/11 00:28
>>295 aaa # bbbという行があった場合はどうするんだ?
aaa まで読んであとは無視するのか?それとも行全体を無視するのか?
すいません説明不足でした。 #がある行は無視します。
300 :
デフォルトの名無しさん :03/06/11 00:37
>>299 じゃあfgetsで読んだ後にstrchrで'#'を探して、NULLが返ってこなければ無視すればいいんじゃないの?
301 :
わからずや :03/06/11 00:39
>>299 つまり、「#」のある行は問答無用で無視する訳だな。
それなら、
1.fgets()で一行読み込む
2.strchr()で'#'を検索
3.検索した結果、'#'が見つかれば次の行へ
見つからなければ、データを変数に格納する
と言うステップを踏めばいい。
ちなみに#は行の先頭に現れます。
>>300 strchrですか一度やってみます。。
>>293 お早い回答ありがとうございます。これで友人の鼻を明かしてやれそうです。(´∀` )
この辺を集中して学ぶにはどうしたらいいのでしょう?これはポインタ、もしくは構造体なんでしょうか?
ホント馬鹿で申し訳ないです。持ってるビギナー向けの参考書に載ってなくて・・・(´Д⊂
fscanf(fp,"%d %d %d",&a,&b,&c);
if(width=='#'){
fgets(damy,sizeof(damy),fp);
fscanf(fp,"%d %d %d ",&a,&b,&c);
}
これは掲示板書き込む前に自分でかいたやつなんですが
どこがまずいんでしょうか。うまくよみこめませんでした。
変数a,b,cはすべてintです。damyは文字配列です。
>>302 みなさんその方法を薦められてるようなのでそれでやってみます
>>305 そのwidthってのはなによ?
とりあえず真っ先にfgetsで一行読むこと。
その後に
>>300 ,
>>302 を行う。
#がなければfgetsで読んだものをsscanfで解析してa,b,cにいれる。
>>301 実は漏れも同じ様な講義を受けたことあるんだが(w
他の演算子と同じように判定すればいいよ。
ただ、最終的にはスタックに残らないような処理にしなきゃいけないのを
忘れないように。
308 :
わからずや :03/06/11 01:10
309 :
無料動画直リン :03/06/11 01:13
>ナツメ社 入門ソフトフェアシリーズ1 C言語 河西 朝雄・著 はだめだめです。ANSI準拠といいつつ嘘があるし、 int data[N]; for (i = 0. i <= N; i++) data[i] = 0; みたいなやばいソースが平気でサンプルになってます。 俺が持ってる教科書これだ・・・・
>>310 ピリオドは誤植として、<=はまずいな(笑)
「void main()」なんてのを平気で載せてる本もあるくらいだしなぁ…。
本ではないけど、MSDNライブラリはvoid main()
どなたかアルゴリズムお願いします。 ここなら必ずできる方がいると信じています。 進級できるかな・・・
317 :
デフォルトの名無しさん :03/06/11 03:38
素数関係のスレで見つけたのですが、どなたかこれの意味が分かる方が いたら、Cのソースにしてみていただけないでしょうか? integer n > 1 1. if ( n is of the form a^b , b > 1 ) output COMPOSITE; 2. r = 2; 3. while(r < n) { 4. if ( gcd(n,r) != 1 ) output COMPOSITE; 5. if (r is prime) 6. let q be the largest prime factor of r - 1; 7. if ( q>= 4*sqrt(r)*log(n) and ( n^((r-1)/q) != 1(mod r) ) 8. break; 9. r = r + 1; 10. } 11. for a=1 to 2*aqrt(r)*log(n) 12. if ( (x-a)^n != (x^n -a)*(mod x^n - 1,n) ) output COMPOSITE; 13. output PRIME;
文字型の2次元配列を用意し、いくつかの文字列を読み込み、 それらの文字数の少ない順にソートして表示するプログラムを作成しなさい。 レベル1:配列のままでmain関数だけで処理をする レベル2:ポインタ変数を用いる レベル3:ソートする部分を関数にする
>>312 int main(void)で始めて、return 0;などで終わるのが正しいやり方なんですか?
>>318 こんな感じで
#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
bool string_short( std::string const& lhs, std::string const& rhs ){ return lhs.size()<rhs.size(); }
int main()
{
char dummy[1][1];
std::vector< std::string > array;
std::copy( std::istream_iterator< std::string >( std::cin ), std::istream_iterator< std::string >(), std::back_inserter( array ) );
std::sort( array.begin(), array.end(), string_short );
std::copy( array.begin(), array.end(), std::ostream_iterator< std::string >( std::cout, " " ) );
return 0;
}
322 :
デフォルトの名無しさん :03/06/11 08:58
このスレ伸びるの早いよ
>>319 「void main( /* 中略 */ )」としても、
exit() 関数がある以上 void になり得ない。
324 :
デフォルトの名無しさん :03/06/11 09:03
ところで、擦れ違いかもしれないけど、 int foo (); みたいに、引数を省略した場合って(int)になるんだよね? この挙動って最新のC99で変わってる? 調べても分からなかったんだが
325 :
デフォルトの名無しさん :03/06/11 09:08
cなら、プロとタイプでの引数の省略は、「チェックしない」を意味する。
>>324 >擦れ違いかもしれないけど
わかってるのなら書くなよ。
327 :
デフォルトの名無しさん :03/06/11 09:18
(1)テキストファイルがある.各行のデータを,ID,姓名,読み(ローマ字)の
三つの要素をもつ構造体に格納するプログラムを書け.
(2)木とはなにか.また,2分木とはなにか.説明せよ.
(3)(1)でデータを格納した構造体を節点とする2分木を作成するプログラムをかけ.
新しいデータを一行ずつ構造体に読み込んで,木に追加していくこと.必ずポインタを
使って木を実現し(構造体に必要な修正を加えること),データが増えても対処できるようにすること.また,すべての節点をなぞりながら,データ(ID,姓名,読み)を出力できるようにもせよ.その際できるだけ見やすい形に表示するよう工夫すること.
テキストファイルがあるのですがそれを読み込んで
ID,姓名,読み(ローマ字)の三つの要素をもつ構造体に格納します
テキストファイルの例は
>>279 です
枝の追加は左の枝と右の枝どっちでもいいと思います(左と右変えると違うのですか?)
見やすい形…
>>284 のように木を書いてください
>>327 CUIでツリーを表示するのはかなり難易度が高いぞ?
329 :
デフォルトの名無しさん :03/06/11 09:33
CUI??
character user interface <--> graphical user interface
CUIはいいとして、別に木の形に表示しろというわけじゃないでしょ。
333 :
デフォルトの名無しさん :03/06/11 09:59
こんな感じの木でいいですよ Larry -R- Emilio -R- Brent -R- Adolpho -L- David -L- Jeff -R- Francis -L- null -L- Stephen -R- Mike -R- null -L- Roger -L- Tom
>>326 すれ違いというルールを厳格に主張する奴は目的を見失ってるね。
例えそれが純粋にC/C++の宿題に関することから始まり、最終的にはコンパイラや
Cの仕様の問題になったとしてもそこまで指摘することは自然なことだし
議論としては継続しているじゃないですか。
そのことがスレッドを読みにくくするんですか。
スレ違いなどというものを厳密に守った結果、助言としては誤解を与え得る
中途半端なものになっては本末転倒だが、妙なこだわりに取り付かれた人たちに言っても無駄か。
335 :
デフォルトの名無しさん :03/06/11 10:00
336 :
デフォルトの名無しさん :03/06/11 10:03
338 :
デフォルトの名無しさん :03/06/11 10:15
Larry -R- Emilio -R- Brent -R- Adolpho -L- David -L- Jeff -R- Francis -L- null -L- Stephen -R- Mike -R- null -L- Roger -L- Tom
339 :
デフォルトの名無しさん :03/06/11 10:16
やっぱりうまく表示できません
Larry Emilio Brent Adolpho David Jeff Francis null Stephen Mike null Roger Tom
Larry -R- Emilio -R- Brent -R- Adolpho -L- David -L- Jeff -R- Francis -L- null -L- Stephen -R- Mike -R- null -L- Roger -L- Tom
どなたか助けてください。 アルゴリズムさえわかれば何とかなるんですTT
ラウンジに二分木置いたYO
本当にその「できるだけ見やすく」というのは木らしく表示するという意味なんだろうな?
二分木マダー? (AA略
>>342 提出して不十分と言われたレポートを晒せ
無視されてるTT
>>347 仕様が違うんじゃない?
どうもIDをキーにするのでは無いらしい。
(だから前もって聞いたのに)
てか、ここがおかしい >枝の追加は左の枝と右の枝どっちでもいいと思います
>>347 なんだっての?
315にソースがあるけど、これがなんなの?
ごめん間違い316ね。 でも347と315は別の人なの? 二分木のプログラムは316にあるけど。
あ、同じひとだね。 何ができないのか良く分からないよ、どっちにしても。
353 :
デフォルトの名無しさん :03/06/11 12:17
2つの文字列が等しいかどうか判定するアルゴリズムをフローチャートを用いて表現せよ。 そのフローチャートに基づいてプログラムを作成せよ。フローチャートは分かりやすさも評 価します。 Cでお願いします
354 :
デフォルトの名無しさん :03/06/11 12:20
355 :
デフォルトの名無しさん :03/06/11 12:38
>>353 /* 二つの文字列が等しければ1を異なれば0を返す */
int strequal(const char *s1,const char *s2)
{
for(;*s1==*s2;s1++,s2++)
if(*s1=='\0')
return 1;
return 0;
}
357 :
デフォルトの名無しさん :03/06/11 12:43
>>353 int strcmp( const char *s1, const char *s2 )
{
while( *s1==*s2 ) /* 比較が一致している間ループ */
{
if( *s1=='\0' ) /* s1、s2 共に文字列の終端か? */
{
return 0;
}
s1++,s2++;
}
return *s1 - *s2;
}
s1とs2でs1の方が短い場合前方一致になっちゃうよ。
>>360 終端文字('\0')が同じ場所にあればif(*s1=='\0') が真となり1がかえる。
s1の方が前にあればforの*s1==*s2が偽となりループを抜け0が返る。
s1の方が後にある場合は上と同じ。
>>355 >>358 ありがとうございます!
しかしレポートはメールで提出なのでフローチャートを
文字で書かないといけないみたいです
なにかアドバイスをお願いします
フローチャートを文字でって… 罫線文字か何かで表現するのか?
Visioで作ってメールに添付。
Visioって何ですか?
>>367 自分で調べもせず、すぐ人に聞く癖は直したほうがいいよ。
いいかげんフローチャートみたいなものを学校で教えるのはよして欲しいなあ。 過去の遺物というだけならまだいいが、害悪垂れ流しだからなあ…。
>>369 では何で記述しろというんだ?
過去の遺物でないアクティビティ図ならいいのか?
何も変わるところはないと思うが
むしろ誰が誰になんの目的で見せるものかをはっきりさせればいいかと。 目標を明確にしないで書かせることが多いみたいだから実際あんまり意味ないと思われ。
373 :
デフォルトの名無しさん :03/06/11 15:43
果物の名前とその値段をメンバとして持つ構造体を定義し、 この構造体へのポインタをノードの値として持つ二分木のノードを定義せよ。 次に、果物の名前に対して二分探索木の構造を保つように、 アルファベット順に基づきデータを追加するadd_node()関数、および、 この関数により生成される二分探索木に対し、 果物の名前をキーとしてノード検索を行うsearch_node()関数を定義せよ。 add_node()はノードに格納する値を引数とし、生成されてノードへのポインタを戻り値とします。 search_node()は、ノードへのポインタと探索キーを引数にとり、 探索で見つかったノードへのポインタを戻り値とします。 お願いします。
>>370 最も汎用的なフォーマットはテキスト。
ソースファイルに全て記入しる。
フローチャートを文字だけにすればよかろう。 ifなら 〜ならこっち違うならこっちとか switchなら条件はこういう場合はこうとか 日本語から学んでくるか?すこしは知恵使えよ。 おれは今知恵熱出たけどな
|----------------| | | |----------------| ↓ no < > → ↓yes こんな感じで。
>>376 あんまフローチャートと変わんない気がするんだが
IIOSS落としてきてそれでアクティビティ図書いて印刷すればいいやん
>>375 それはもはや「チャート」ではないのでは?
結局の話ペイント使ってBMPで作っておくれや。 色使いも荒くして極端にファイル重くしろ。 そして送りつけろ
「フローチャートは時代遅れ」と言いたかっただけと
382 :
デフォルトの名無しさん :03/06/11 16:48
2分法のやり方教えてください y=tan(x)-x^x が0になる点を探したいのですが 二分法でなくても答えが出せるのがあったら 教えてください
>>373 NODE* search_node(char *name, NODE *node) {
int result; NODE *next;
if (node==NULL) return node;
if ((result=strncmp(name, node->fruit->name, L))==0) return node;
next = result < 0 ? node->left : node->right;
return next ? search_node(name, next) : NULL;
}
int add_node(char *name, int price, NODE *node) {
int result; NODE **pnext;
if (node==NULL) return (tree = create_node(name, price, NULL, NULL), 1);
if ((result = strncmp(name, node->fruit->name, L))==0) return 0;
pnext = result < 0 ? &node->left : &node->right;
return *pnext == NULL ? (*pnext = create_node(name, price, NULL, NULL), 1) : add_node(name, price, *pnext);
}
384 :
ジュウオウ :03/06/11 17:03
学生番号(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
これも前スレにあったなぁ
#include <stdio.h> #define N 5 #define BUF_SIZE 128 typedef struct _STUDENT { int number; char name[BUF_SIZE]; } STUDENT; STUDENT data[N]; int main(int argc, char *argv[]) { int i,input; char buf[BUF_SIZE]; for(i=0;i<N;i++) { INPUT_NUMBER: printf("学生番号を入力してください(3桁整数)> "), fgets(buf, sizeof(buf), \ stdin); if(!((sscanf(buf, "%d", &input) == 1) && (input > 99) && (input < 1000))) goto INPUT_NUMBER; data[i].number = input; printf("名前を入力してください> "), fgets(buf, sizeof(buf), stdin), buf[str\ len(buf)-1]='\0'; strncpy(data[i].name, buf, sizeof(data[i].name)); } for(i=0;i<N;i++) printf("番号: %d 名前: %s\n",data[i].number,data[i].name); return 0; }
しかも前スレで出てた 「003や067のときはどうするのか」 が書いてないし
gotoツカイ==DQNカクテイ
>>382 Newton法もあるけど2分法で。
#include <stdio.h>
#include <math.h>
double func(double x)
{
return tan(x)-pow(x,x);
}
int main(int argc, char *argv[])
{
double x0,x1,x01;
double y0,y1,y01;
x0 = 0;
x1 = 1;
do{
y0 = func(x0);
y1 = func(x1);
if(y0*y1 > 0) break;
x01 = (x0+x1)/2;
y01 = func(x01);
if(y01*y1 < 0)
x0 = x01;
else
x1 = x01;
printf("f(%g)=%g\n",x01,y01);
}while(fabs(y01) > 1e-10);
return 0;
}
391 :
デフォルトの名無しさん :03/06/11 17:39
C言語。2二次元配列でビンゴを作る。 3行3列の2次元配列に1から99までの数値を入力する。 そのあと1から99までの数値をランダムにキーボード入力し、予め入力した 3行3列の数値にあうものがあったらその数値を0に置き換える。 当たりが縦又は横に並んだら「ビンゴ」とと何回目の入力で「ビンゴ」となったか を表示する。
>370 PAD
395 :
C語初心者 :03/06/11 18:40
誰か暇なC言語マスターの方プログラムを作ってくださいな。 再帰を利用して迷路を解く。 外部変数 int position [9][9]={ {1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,1}, {1,0,1,1,1,1,0,1,1}, {1,0,0,0,0,1,0,0,1}, {1,1,1,1,0,1,1,0,1}, {1,0,0,0,0,1,0,0,1}, {1,1,0,1,1,0,1,1,1}, {1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1}}; 上の迷路で"1"が壁で、"0"が通路です。 Startは(y,x)=(1,1) Goalは(y,x)=(7,7)です。 関数 int visit(int y,int x) を使ってください。 一度通った道には2を、解の道には3を入れてください。 で、最短距離の座標と , 壁を*、迷った所を?、解を0で表示する プログラムをお願いします。表示にはprintfをお願いします。
396 :
デフォルトの名無しさん :03/06/11 19:18
だからこのスレ流れるの速いよ
>>395 > 最短距離の座標
ってなんじゃらほい。
それから最短経路を求めるのか分岐点のない経路を一つでも求めれば良いのか。
しらみってどうやって潰すの?
400 :
デフォルトの名無しさん :03/06/11 20:07
関数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刻み)固定してください. ・・・という問題なのですが、よろしかったらご教授ください(;´〜`)
void print_answer(void) { int i, j; for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) printf("%c", " *?0"[position[i][j]]); printf("\n"); } } int check(int y, int x) { if (x < 0 || x > 8) return 0; if (y < 0 || y > 8) return 0; return position[y][x] % 2 == 0; } int visit(int y, int x) { int r; if (!check(y,x)) return -1; position[y][x] = 3; if (x == 7 && y == 7) return 0; if ((r = visit(y,x+1)) != -1) return 1+r; if ((r = visit(y,x-1)) != -1) return 1+r; if ((r = visit(y+1,x)) != -1) return 1+r; if ((r = visit(y-1,x)) != -1) return 1+r; position[y][x] = 2; return -1; } int main(void) { int n = visit(1,1); if (n == -1) { printf("経路がみつかりません\n"); } else { printf("最短距離は%d\n", n); print_answer(); } return 0;}
402 :
C語初心者 :03/06/11 20:09
皆様、ご返答ありがとうございます。
>>397 > 最短距離の座標
(y,x)座標で迷路のゴールまでの最短距離だと思います。
>それから最短経路を求めるのか分岐点のない経路を一つでも求めれば良いのか。
最終的に 壁を*、迷った所を?、解を0で表示するプログラムになればいいと思います。
様は、壁の座標を*で、最短距離をの座標を0で、残りを?で埋めればよいかと。
よろしくお願いします。
401のプログラムは最短経路を求めてないんだよな・・・。
405 :
C語初心者 :03/06/11 20:17
>>397 > 最短距離の座標
(y,x)座標で迷路のゴールまでの最短距離だと思います。
追加です
単純にこの時の(y,x)の値を表示するだけです。
>>401 様
ありがとうございます
>>402 日本語が変なのはともかくとして、問題の意味が曖昧だ。
ゴールに到達する経路のうち、最短経路には分岐点はないが、
分岐点のない経路が最短であるとは限らんよ。
どっちを求めればいいんだ?
それとも分岐点のない経路が最短であるような迷路しか
扱わないことを仮定して良いのか?
>>406 >最短経路には分岐点はない
意味がわからん。
409 :
C語初心者 :03/06/11 20:35
>>402 様
とりあえず最初に示した、1と0の迷路では
ゴールへの道は一つしかないと思うんですが…。
>>409 Windowsならスクリーンセーバーの迷路を見てみるといい。
片手を壁に当てて迷路をたどると(出口が壁にそってる場合は)必ず出口に出ることができる、という法則。
これだと必ず出口に出ることはできるが、歩く距離は必ずしも短いわけではない。
411 :
C語初心者 :03/06/11 20:59
>>410 そういうことですか。
勘違いしていました。
単純に、分岐点の無い経路を求めてください。
C言語でとあるディレクトリの中にあるファイルの情報を取得させたいのですが なにかイイ関数、いい方法でもないですか?
>>412 「ファイルの情報」とは、サイズ?内容?ファイル名のみ?
OSによっても答えがかわってきそうなので、OSも追記したほうが。
>>400 長いんでスマソ。
C++の文法になっているから必要に応じて書き換えてくれ。
////////////////////////////////////////////////////
#include <stdio.h>
#include <iostream>
using namespace std;
double func(double);
void bibun( double h )
{
for( double x = 0; x <= 10; x += 0.5 )
{
double out;
out = func( x + h ) - func( x );
out /= h;
printf( "x(%f) :3x~2 の値 ->%f 定義による計算結果 ->%f\r\n",x, 3 * ( x * x ), out );
}
}
続き... double func(double x) { return x * x * x; } void main() { double h; cin >> h; // hを入力 bibun( h ); }
>>413 とりあえず、ファイル名とファイルサイズが知りたいのです。
環境はUNIXです。
390さん有難う御座います ニュートン法というのもよろしかったら教えてください < 2分法のやり方教えてください y=tan(x)-x^x が0になる点を探したいのですが 二分法でなくても答えが出せるのがあったら 教えてください
420 :
デフォルトの名無しさん :03/06/11 21:29
421 :
デフォルトの名無しさん :03/06/11 21:30
Cでチャットや掲示板を作るのは可能ですか?
423 :
デフォルトの名無しさん :03/06/11 21:35
では、Cで作ったそれらをWeb上にアップできるのですか? Cはどのようにして・・・
>>423 web上にアップって意味わからん。
ちなみに板違い
>>424 会社のお姉ちゃんが言ってた「ネットワーク上に保存しました」
くらい微妙な言葉だな。
>>423 サーバにソースをアップしてサーバ上でコンパイル。
同じ環境ならコンパイル後にアップしてもいいけど。
429 :
デフォルトの名無しさん :03/06/11 21:45
下記の機能アルゴリズムを設計し,C言語により実装せよ. 「1.任意の個数のint型数値をコンソールより入力された順に保存する. 2.文字列"Sort"の入力により,入力された数値群を降順に並び替える. 3.最大値と最小値の平均値を計算し,2分探索法で検索する.」 設計指針 ・ソート部,探索部は,別のアルゴリズムを採用しても利用できるように設計/実装せよ. ・コンソール入力は,scanf()を使い,文字列,記号,整数値以外は,それぞれ別のエラーコードを返し, 入力を継続するようにせよ. ・メモリ節約のため,数値保存のためのメモリは動的に確保せよ.
問題: 2次の正則行列Aの逆行列A^-1を求める関数を作成せよ。 また確認のために、任意の行列に対して逆行列を計算し、結果を返し、 行列の積A×A^-1を計算し、これが単位行列になることを確認せよ。 説明: 2次の行列A=(αij)の逆行列A^-1は |α22/D -α12/D| A^-1=| | |-α21/D α11/D| で与えられる。ここでDはAの行列式で D=α11α22-α12α21 で与えられる。 まずαijに任煮の数値を読みこみ、Dを計算し、D=0の場合は 逆行列が存在しないと表示し、それ以上の計算はせずに終わる。 D!=0のとき逆行列を計算する。さらにこれが逆行列となっていることを 確認するために、積A×A^-1を計算し、これらの結果を印刷する。 印刷するときには行列であることがわかるように、各自工夫する。 配列の大きさはdefine文を用いてもよい。またA×Bは次の式で与えられる。 |α11Β11+α12Β21 α11Β12+α12Β22| A×B=| | |α21Β11+α22Β21 α21Β12+α22Β22| 以上が問題です。言語はCです。関数を3つ作ってこいと言われました。 よく分からないのでご教授お願い致します。
>>413 system("/bin/ls /targetdir");
結果を利用したいなら
popen("/bin/ls /targetdir", "r");
して
fgets();
434 :
デフォルトの名無しさん :03/06/11 23:06
>>417 で書いたのですが
ニュートン法を使い下に書いたのできますか
教えてください
y=tan(x)-x^x
が0になる点を探したいのですが
二分法でなくても答えが出せるのがあったら
教えてください
微分できるんだから大丈夫なんじゃないの?
2*2の逆行列の公式をそのまま書くだけだろ?
>>437 そうだと思います。
関数をあまりっ理解してないのでプログラムで書くと
どのように書いていいかわかりません。
ご教授お願い致します。
Dを求めるのと逆行列を求めるのと行列を表示するのを 関数にすればいいんじゃない? まずαijに任煮の数値を読みこみ、Dを計算し、D=0の場合は 逆行列が存在しないと表示し、それ以上の計算はせずに終わる。 あとは、これをどうするかぐらいで。
逆行列求めるのに除算があるけど、 丸めとか問題にならない? 分数でやらなきゃならないのかしらん。 行列式なんて忘れたんで、変なこといってたらスマソ。
>>431 これでどうよ?
#include <stdio.h>
#include <float.h>
#define ROW 2
#define COL 2
int readM(double M[][COL])
{ char buf[BUFSIZ];
printf("A00 A01 A10 A11>");
if(fgets(buf,sizeof(buf),stdin)==0) return -1;
if(sscanf(buf,"%lf%lf%lf%lf",&M[0][0],&M[0][1],&M[1][0],&M[1][1])!=4) return -2;
return 0; }
int revM(double A[][COL],double B[][COL])
{ double det=A[0][0]*A[1][1]-A[0][1]*A[1][0];
if(fabs(det) < DBL_EPSILON) return -1;
B[0][0]=A[1][1]/det;B[0][1]=-1*A[0][1]/det;B[1][0]=-1*A[1][0]/det;B[1][1]=A[0][0]/det;
return 0; }
void mulM(double A[][COL],double B[][COL],double C[][COL])
{ int i,j,k; for(i=0;i<ROW;i++) for(j=0;j<COL;j++) for(C[i][j]=0,k=0;k<COL;k++) C[i][j]+=A[i][k]*B[k][j]; }
void printM(double M[][COL])
{ int i,j; for(i=0;i<ROW;i++) { for(j=0;j<COL;j++) printf("%1.4f ",M[i][j]); printf("\n"); } }
int main(int argc, char *argv[])
{ double A[ROW][COL],B[ROW][COL],C[ROW][COL];
while(readM(A)==0){
if(revM(A,B)){ printf("逆行列は存在しません\n"); continue; }
mulM(A,B,C);
printf("[A]\n"); printM(A);printf("[A]^-1\n"); printM(B);printf("[A]*[A]^-1\n"); printM(C);
}
return 0;}
>>435 #include <math.h>
#include <stdlib.h>
#include <stdio.h>
double
newton(double (*f)(double), double (*df)(double), double x, double h, int imax)
{
int c;
while (fabs(f(x))>h && c<imax){x -= f(x)/df(x); c++;}
return c>=imax ? 0.0/0.0 : x;
}
#define IMAX 1000
double f(double x){return tan(x)-pow(x,x);}
double df(double x){return tan(x)*tan(x)-pow(x,x)*(log(x)-1)+1;}
int
main(int argc, char **argv)
{
double x,y,h;
if (argc<3) {fprintf(stderr, "usage: %s x0 delta\n", argv[0]); return 1;}
sscanf(argv[1], "%lf", &x); sscanf(argv[2], "%lf", &h);
y = newton(f, df, x, h, IMAX);
if (y == y) printf("%.10e\n", y); else printf("failed\n");
return 0;
}
>>441 一瞬荒しかと思いますたw
それコンパイルしたらエラーが出た・・
444 :
デフォルトの名無しさん :03/06/12 00:35
>>441 少し直したら回りました!
ありがとうございました。
このスレ面白い。 すごい勉強になる。
>>442 > int c;
これは int c=0; だな
447 :
デフォルトの名無しさん :03/06/12 01:10
再帰を用いたプログラムと、再帰を用いないプログラムとでは、 読みやすさ、計算にかかる手間などは どう違うのですか?
再帰を使った方がたいてい読みやすい。 手間は、階乗なんかだと掛ける回数は同じでも 関数を呼び出すためにスタックに入れて、また返ってくる分再帰は無駄になる。 フィボナッチ数列だと二つに分岐して再帰してさらに分岐した時に 同じ計算をするからさらに手間がかかる。
450 :
デフォルトの名無しさん :03/06/12 01:21
>447,8 c++の宿題です。
451 :
デフォルトの名無しさん :03/06/12 01:23
C++ は C より優れたので、C を忘れましょう。 Javaも勉強しよう Ruby もなかなか面白い PHP もなかなかね とにかくC は捨てましょう
LinuxをC++で書き直してくれ。
c2cpp
>>ワラタ
>>449 そーいや、tail recursionしてる再帰関数ってCではちゃんとループに展開してくれるのかな。
まとまった時間が取れたら追求してみようっと。
458 :
デフォルトの名無しさん :03/06/12 01:59
>449 ありがとうございます
459 :
デフォルトの名無しさん :03/06/12 03:01
宿題じゃないのですが、C++の勉強で平方根を求めるプログラムを作ったのですが ある特定の数以上になるとそれ以上数字が変わらなくなります。 なぜなのでしょうか?BorlandC++とCPADです。 #include<stdio.h> #include<math.h> main() { double a,i; double root=1; double x=1; int hiku; a=root*root; for(i=0;;i++){ if(a<2){root=root+x;} else {root=root-x; x=x/10;} a=root*root; printf("値は%1.30f ルートは%1.30f",a,root); hiku=getchar(); } }
>>459 保持できる桁数には限界がある
float.h の DBL_DIG
正確にはl og10(DBL_MANT_DIG)
間違えた log10(pow(2, DBL_MANT_DIG)-1)
463 :
デフォルトの名無しさん :03/06/12 03:37
表示はできてもこれ以上は計算できないって事ですか?
doubleの精度は十進でせいぜい16桁程度
>>463 そういうこと。
仮数部53ビットの場合、完全に信用できるのは15桁。
467 :
デフォルトの名無しさん :03/06/12 05:12
468 :
デフォルトの名無しさん :03/06/12 05:13
>>466 全言語のページから"scientist shoud"を検索しました。
1件中1 - 1件目
予想される検索キーワード: "scientist should"
2度目の質問をさせてください。 このいたにいる方なら簡単に解けると思ったのですが、返事がないので書きます。 再帰を利用しないで、かわりにifやwhile?を使って ハノイの塔のディスク移動の手順を表示するプログラムを作ってください。 棒は3本で、ディスクは任意で実行できるのをお願いします。
>>469 過去スレにあったよ。
つーか、書いた記憶がある。
>>469 ttp://web.archive.org/web/20010515151844/ http://www.cs.latrobe.edu.au/~lu/xhanoi/hanoi.c $ ./hanoi -h
* Usage: hanoi [-k#1] [-n#2] [-m]
where #1 is the number of pegs, #2 the number of discs,
and -m for printing details of every move.
Example: hanoi -k6 -n25
* Thank you for running this program, written by Xue-Miao Lu.
* This is an implementation of Lu's nonrecursive solution, Algorithm H,
International Journal of Computer Mathematics, Vol. 33, page 24, 1990.
The algorithm works for any number of pegs and for any number of discs.
* Since the number of moves increases exponentially, however, only a very
limited number of cases are presentable within reasonable time and space.
* The limited eligible choices: k in [3..99] and n in [1..u(k,30)].
#include <stdio.h> #include <stdlib.h> #define NSTACK 100 #define NCOLUMN 20 int main(int argc, char **argv) { int na[NSTACK], sa[NSTACK], da[NSTACK], ta[NSTACK], n, c = 0, k = 0; char s,d,t; na[0] = argc>1 ? atoi(argv[1]) : 3; sa[0] = 'A'; da[0] = 'B'; ta[0] = 'C'; k++; while (k > 0) { k--; n = na[k]; s = sa[k]; d = da[k]; t = ta[k]; if (n == 1) printf("%c>%c%c", s, d, (++c)%NCOLUMN ? ' ' : '\n'); else { na[k] = n-1; sa[k] = t; da[k] = d; ta[k++] = s; na[k] = 1; sa[k] = s; da[k] = d; ta[k++] = t; na[k] = n-1; sa[k] = s; da[k] = t; ta[k++] = d; } } printf("%s%d moves\n", c%NCOLUMN ? "\n" : "", c); return 0; }
473 :
デフォルトの名無しさん :03/06/12 12:48
>>442 さんありがとうございます
あと割線法という方法をおしえてください
f(a)とf(b)の直線とx軸との交点を求めて
(交点)<0のとき xa=(交点)
(交点)>0のとき xb=(交点)
をくりかえす
というふうにやるんですがプログラムがわかりません
y=tan(x)-x^x
が0になる点を探したいのですが
教えてください
y=tan(x)-x^x
f(a)<0、f(b)>0って決まってるの?
ぐぐって調べて理解して自分でやってみよう。
tan(x)*tan(x)-pow(x,x)*(log(x)-1)+1; 誤 tan(x)*tan(x)-pow(x,x)*(log(x)+1)+1; 正 かな
数値解析について調べておいて”プログラムがわかりません”ておかしいだろ
479 :
デフォルトの名無しさん :03/06/12 14:51
sqlのデーターはどうしたら表示されるのよ
表示関数に取得した文字列を渡す
(tan x)' = 1/cos^2 x
=tan^2 x + 1
この中に一人以上確実に A大学のjinuの授業受けてる香具師がいるww
アジア大学?
外人?
void quicksort(keytype a[], int first, int last) { int i, j; keytype x, t; x = a[(first + last) / 2]; i = first; j = last; for ( ; ; ) { while (a[i] < x) i++; while (x < a[j]) j--; if (i >= j) break; t = a[i]; a[i] = a[j]; a[j] = t; i++; j--; } if (first < i - 1) quicksort(a, first , i - 1); if (j + 1 < last) quicksort(a, j + 1, last); } 要素同士の比較回数をpとするとき、上の{}内にp++などを付け加え比較回数を カウントできるようにしてください。
doubleの二次元配列を作っているのですがうまく動きません。 まったく同じ内容のintの二次元配列は動くのですがなぜか・・・
コードをみせろ。
まずfor(;;)をwhile(1)にする
494 :
デフォルトの名無しさん :03/06/12 20:09
C言語2二次元配列でビンゴを作るというものですけどどうすればいいか分かりませんどうか教えてください。 処理手順 3行3列の2次元配列に1から99までの数値を入力する。 そのあと1から99までの数値をランダムにキーボード入力し、予め入力した 3行3列の数値にあうものがあったらその数値を0に置き換える。 当たりが縦又は横に並んだら「ビンゴ」とと何回目の入力で「ビンゴ」となったかを表示する。
フィボナッチ数列のn項目の値(fn)を返す再帰関数long int fibo(int n) を作成しなさい。ただし、フィボナッチ数列は次のように定義される。 fn=fn-1+fn-2 f1=f2=1 (n>=3) お願いします
497 :
デフォルトの名無しさん :03/06/12 20:12
ハイ 本当に分からないのです
>>497 別スレで答もらってお礼を言ってたけど、あれは何だったんだ?
499 :
デフォルトの名無しさん :03/06/12 20:15
今日やってもたら出来なかったもので
500 :
デフォルトの名無しさん :03/06/12 20:16
1)テキストファイルは名簿である.各行のデータを,ID,姓名,読み(ローマ字)の三つの要素をもつ構造体に格納する プログラムを書け. (2)木とはなにか.また,2分木とはなにか.説明せよ. (3)(1)でデータを格納した構造体を節点とする2分木を作成するプログラムをかけ.新しいデータを一行ずつ構造体に読み込んで, 木に追加していくこと.必ずポインタを使って木を実現し(構造体に必要な修正を加えること),データが増えても対処できるようにすること. また,すべての節点をなぞりながら,データ(ID,姓名,読み)を出力できるようにもせよ.その際できるだけ 見やすい形に表示するよう工夫すること.
誰か出来る人いたら頼みます。 漏れじゃまったく解けないので・・。 「まず、正の整数を読み込みます、その入力値の分だけ整数値を 配列に読み込む。その後、しきい値(整数値)を読み込み、配列に 格納された値の中から、しきい値よりも大きな値だけを表示させる。 なお、配列に読み込む整数の値は最大で20個、プログラム中で オブジェクト形式マクロを使用すること。 また、最初に0または負の値が入力された場合は正の整数値が 入力されるまで再入力を促す」 しきい値の入力のあとにどうやって配列からそれ以上の整数だけ 抽出すればいいのかがイマイチ・・・。HELP!
for (i = 0; i < N; i++) if (x[i] > y) printf("%d ", x[i]);
474 :デフォルトの名無しさん :03/06/12 13:55 f(a)<0、f(b)>0って決まってるの? はい決まってます!とりあえず 図形の概形を理解してf(a)<0,f(b)>0 となるa,bを入力して求めるということで お願いします。 >割線法という方法をおしえてください f(a)とf(b)の直線とx軸との交点を求めて (交点)<0のとき xa=(交点) (交点)>0のとき xb=(交点) をくりかえす というふうにやるんですがプログラムがわかりません y=tan(x)-x^x が0になる点を探したいのですが 教えてくださ
割線法について 訂正です >f(a)とf(b)の直線とx軸との交点を求めて ↓ f(a) と f(b)を通る直線とx軸の交点を求めて 締め切り間近なのでお願いします いままで教えてくれた方有難う御座います。 c言語の授業苦痛でしたが少しわかって楽しくなって きました
>>489 --- 489 Thu Jun 12 19:07:00 2003
+++ 506 Thu Jun 12 23:29:00 2003
@@ -1 +1 @@
-void quicksort(keytype a[], int first, int last)
+int quicksort(keytype a[], int first, int last)
@@ -3 +3 @@
-int i, j;
+int i, j, n = 0;
@@ -9,2 +9,2 @@
-while (a[i] < x) i++;
-while (x < a[j]) j--;
+while (a[i] < x) {i++, n++;}
+while (x < a[j]) {j--, n++;}
@@ -16,0 +17 @@
+return n;
えー
>>293 様に教わったキーワードを検索したらやっと理解しかけてきたのですが
検索するファイルの中身が一致したら、その行だけを出力する場合、
どうしたらよいのでしょうか?
strcmp、strncmp使っても全然拾ってくれません・・・
strstr使うと検索文字列全て拾っちゃうし・・・(aokiと入れたらaokiiroまで拾う)(´Д⊂
具体的な記述方法ご教授いただけませんか?
愚案では検索する文字列の文字数で絞ればいいと思っているのですが・・・
エスパー召喚だな
コードを見せろ。
フィボナッチ数列のn項目の値(fn)を返す再帰関数long int fibo(int n) を作成しなさい。ただし、フィボナッチ数列は次のように定義される。 fn=fn-1+fn-2 f1=f2=1 (n>=3) どなたかお願いします
511 :
デフォルトの名無しさん :03/06/12 23:47
long int fibo(int n) { return (n>=3)?fibo(n-1) + fibo(n-2):1}
すいません。突込みどころ満載でしょうけど目を瞑ってくださいね。(/ω\)ハズカシーィ #include <stdio.h> #include <stdlib.h> #include <string.h> void main(void) { FILE *fp; char buff[256]; char kword[256]; do{ printf("キーワード: "); gets(kword); if((fp = fopen("saitama.txt", "r")) == NULL){ printf("ファイルあぼーん\n"); exit(1); } while(fgets(buff,256, fp) != NULL) if(!strcmp(buff,kword)) printf("%s",buff); putchar('\n'); fclose(fp); }while(1); } saitama.txtの中身は292を参照してください。でも今はまず一行出力しようと aoki ゴルフ大好き のように、一行でまとめてます。
>>507 fgetsは改行(\n)まで読み込むので、
そのままstrcmpしたのでは一致しません。
読んだ文字列の最後に改行が付いていればそれを取る、
または、検索したい文字列に改行を付け加えるかすれば良いでしょう。
>>508 >>509 が抜けてました。誰に聞いとんだ俺は。(/ω\)ハズカシーィ
あと、愚作はまだ試してません。
レス早っ!すいません、言われた事を理解&実践してきます。ありがとうございます(´∀` )
>>512 1行にまとめるのとまとめないのでやることが違う。どっちかに決めろ。
>>513 は1行に検索したい文字列が1つだと想定して書いた。
>>512 こんなかんじ?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(void)
{
FILE *fp;
char buff[256];
char kword[256];
fp=fopen("saitama.txt", "r");
if(fp==NULL) {
printf("ファイルあぼーん\n");
exit(1);
}
do{
printf("キーワード: ");
fgets(kword,sizeof(kword),stdin);
rewind(fp);
while(fgets(buff,sizeof(buff), fp) != NULL)
if(!strcmp(buff,kword)){
fgets(buff,sizeof(buff),fp);
printf("%s",buff);
break;
}
}while(1);
fclose(fp);
}
>>517 あわわわ、ごっごめんなさい。へたれなものでよく分かっていなかったんです。(というか今も)
>>292 のテキストのままfgetsを使ったらばっちり拾ってくれました!!
>>518 My God・・・
「これからこうしたいんですけどどうすれば」と打つ前に回答が・・・
あぁ・・・3日悩んでた朕が救われていく・・・ほんとにありがとうございます。
520 :
デフォルトの名無しさん :03/06/13 04:51
初めまして。初めてC++の授業取ってますが、全く分かりません(涙)。 宿題、誰か助けてください・・・。 人の名前と給料の額を入力すると、 厚生年金や車のローンなど、 あらかじめ給料の〇%と決めてある物をそれぞれ計算して出し、 最後にそれらを全部引いた、給料の手取りが出るというプログラムです。 よろしくお願いします m(_ _)m
>>520 「など」ってのはプログラミングできないぞ。
あとC++なの?
Cは理解してる?
設計の方針みたいなものは何にもないの?
クラス構成から考えて来いっていう宿題?
C++です。問題全部書いていいですか?しかも英語ですいません。 Write a program that calculates and prints the monthly paycheck. The net pay is calculated after taking the following deductions: Federal Income Tax: 15% State Tax: 3.5% Social Security Tax: 5.75% Medicare/Medicaid Tax: 2.75% Pension Plan: 5% Health Insurance: $75.00 Cは全くやったことないです。 昨日いきなり宿題出されて(しかも締め切り明日)途方に暮れてます。
>>522 そんなものは常識で考えてできるはず無いな。
どういう状況なんだ?
>>522 とりあえずその情報だけだと人名を入れる意味がないね。
給料の額が同じなら誰がやっても同じ結果になるんじゃないの?
人の名前と給料の額は、実行画面での入力です。 説明が悪くてほんとすいません。
いや、そうじゃなくて。 税金とかって、誰がやっても同じなんでしょ? 個人個人で差異のある要素って、給料だけでしょ。 なんで名前入れるの?
>>526 名前を出力するためなんじゃないの?
数値以外の入力処理をさせたいんでは
そうなると、名前と給料入れると ○○さんの手取りは$■■です。 とでも表示すればいいだけのことか。
仰る通りです。別に名前入れる意味ないですね。 でも、それが宿題の指示だからとしか言いようがないです。
表示は、名前、給料の額、それぞれの税金の額、 そして手取り額全ての表示です。
>>522 > C++です。問題全部書いていいですか?しかも英語ですいません。
というか問題と仕様は最初にすべて書かないとこうやってやりとりが必要になる。
532 :
デフォルトの名無しさん :03/06/13 05:58
>>531 申し訳ないです。以後気を付けます・・・。
http://courses.wccnet.org/~bgoldber/course/CPS17108/homework/mp2.htm CPS 171
Machine Problem 2
Formatting Input/Output
Skills Needed: cin, cout, constants, arithmetic expressions, rounding, int main,
meaningful variable names, spacing, indentation, documentation, output manipulators.
#include <stdio.h> #define Federal_Income_Tax 0.15 #define State_Tax 0.035 #define Social_Security_Tax 0.0575 #define Medicare_Medicaid_Tax 0.0275 #define Pension_Plan 0.05 #define Health_Insurance 75 void main(void) { char name[20]; double pay,fit,st,sst,mmt,pp; printf("name :"); scanf("%s",name); printf("pay :"); scanf("%lf",&pay); fit = pay * Federal_Income_Tax; st = pay * State_Tax; sst = pay * Social_Security_Tax; mmt = pay * Medicare_Medicaid_Tax; pp = pay * Pension_Plan; printf(" name:%s\n pay:%lf\n Federal Income Tax:%lf\n State Tax:%lf\n Social Security Tax:%lf\n Medicare/Medicaid Tax:%lf\n Pension Plan:%lf\n net pay:%lf\n" ,name,pay,fit,st,sst,mmt,pp,pay-fit-st-sst-mmt-pp); return; }
printf(" name:%s\n pay:%lf\n Federal Income Tax:%lf\n State Tax:%lf\n Social Security Tax:%lf\n Medicare/Medicaid Tax:%lf\n Pension Plan:%lf\n net pay:%lf\n" ,name,pay,fit,st,sst,mmt,pp,pay-fit-st-sst-mmt-pp-Health_Insurance); Health_Insuranceを引き忘れてた。
>>534 教科書の宿題と全く一緒!
>>535 ,536
ありがとうございます。
でも初心者過ぎて見ても全く意味がわからないです・・・。
今からこんなんで単位落とさないかかなり心配。
じっくり本読んで勉強することにします。
簡単なプログラムにしかレスしないのですね
当たり前だろ。
541 :
デフォルトの名無しさん :03/06/13 08:35
542 :
デフォルトの名無しさん :03/06/13 09:31
2から数えて100万番目の素数を出来るだけ早く計算するプログラムを教えて下さい。
Cでお願いします。
>>542 まずはそれだけの計算に耐えられるコンピュータを用意してくれ。
その辺のパソコンで十分。15485863
>>545 おぉ!
プログラムを見せて貰えませんか?
お願いします(´Д⊂)
#include<stdio.h> int RSA(int tmp,int C,int d,int N){ while(d>1){ tmp=(tmp*C)%N; tmp=RSA(tmp,C,d=d-1,N); return tmp; } } main(){ int C,d,N; printf("plz input (C d N)>"); printf("%d\n",RSA(1,156,107,187)); } このプログラム走らせると、出力が0になっちゃうんだけどなんで?
ああああ… そうかそうか。 そんな簡単なミスが分からなかったなんて… ありがとうございます!!
まずキーボードから30文字以内の文字列を入力する。 次に一文字をを入力し、最初に入力した文字列の先頭からその文字 を探して最初にみつかった位置から先の文字列を出力する。 例えば最初に abcdABCD 次に c と入力すると dABCD と出力される ようなプログラムです。 C++でお願いします。
>>554 #include <stdio.h>
#include <string.h>
int main(void) {
char buf[31], *p, c;
fgets(buf, sizeof(buf), stdin);
c = getchar();
if ((p = strchr(buf, c) != NULL)
puts(p);
return 0;
}
>>554 #include <iostream>
#include <string>
int main(int argc, char *argv[])
{
string buf;
char c;
cin >> buf;
cin >> c;
cout << buf.substr(buf.find(c)+1) << endl;
return 0;
}
559 :
デフォルトの名無しさん :03/06/13 19:11
>>554 のを
Cでおねがいできないでしょうか?
C以外は分からないんで、すみません
きみはCも分かっていない
561 :
デフォルトの名無しさん :03/06/13 19:14
C以外は全く分からないんで。 C++は関数名も何も分からないです
>>559 555はCでもあるのだが。もちろんC++でも動くはずだ。
とはいえ、typoがあってそのままだとコンパイルとおらねえな。
Cがわかるのならどう直せばいいかもわかるだろう。わかんないかな…
あとエラーチェックはほとんどしてないのでその辺よろしく。
563 :
デフォルトの名無しさん :03/06/13 19:17
564 :
サンプルです :03/06/13 19:18
既出なのは知っておりますが、解決していないようなので質問します。 下記のプログラムを変更して、要素数がnである配列aの全要素の最大公約数を 求める int gcdary {int a[], int n}; を作成してください。 /* ユークリッドの互除法によって最大公約数を求める */ #include <stdio.h> 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); }
> 解決していないようなので (゚Д゚)ハァ?
int gcdary {int a[], int n};
569 :
デフォルトの名無しさん :03/06/13 21:19
問題 自然数nを入力として与えたとき、 ●もしnが偶数ならば、n/2を新たにnと置く。 ●もしnが奇数ならば、3n+1を新たにnと置く。 という操作を繰り返す。自然数nを入力したとき、それが1に収束するまでのステップと そのステップ数を表示するようなプログラムを作成せよ。 プログラムについて何もわかりません。 #include<stdio.h>で始まるプログラムお願いします。
またかよ
なぜこうも既出の問題ばかり……
>>569 #include <stdio.h>
int main(void) {
int n;
scanf("%d", &n);
puts("ステップ数は、100回以上か100回以下かそれくらい?");
return 0;
}
過去ログ検索スレになりそうだな
検索なんて高度なテクニックを持ってるやつはそもそもこのスレには聞きに来ないからな
577 :
デフォルトの名無しさん :03/06/13 21:29
まえ聞いたのですが、エラーがたくさん出たので…すみません。
任意の自然数nだろ? しかも数学の問題だろ? ってことは巨大な数も扱えなきゃダメだろ? まず多倍長整数演算からはじめなきゃだろ?
>>577 それならそう書けよ。ちゃんとエラー内容付きでな。アフォ
>>566 このスレでは初のようだから
int gcdary(int a[], int n)
{
if (n == 1)
return a[0];
else
return gcd(a[0], gcdary(a + 1, n - 1));
}
>>576 完全じゃないけど↓で解決してたんじゃないの?
262 名前:デフォルトの名無しさん 投稿日:03/05/29 22:26
>>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;
}
>>569 #include <stdio.h>
int main(void)
{
int n = 1000;
int i = 0;
printf("もとの数 %d \n",n);
while(n != 1){
if(n%2){
n = n*3+1;
i++;
printf("step %4d, n*3+1 = %4d\n",i,n);
}
else{
n /= 2;
i++;
printf("step %4d, n/2 = %4d\n",i,n);
}
}
printf("step %5d で終了しました",i);
return 0;
}
586 :
デフォルトの名無しさん :03/06/13 21:57
>>582 ほんと馬鹿みないな質問で恐縮なんですが、
#include <stdio.h>で始まるプログラムでお願いしたいのですが、
そもそも#include <stdio.h>と#include <iostream>は何が違うんですか?
本当にすみません、くだらないこと聞いてしまって…
こんな奴に単位取らせて日本の未来は大丈夫ですか?
>>588 あー逆になってるね。n%2も好きじゃないけど。
そんなことよりC/C++を分かっていないのに
問題を出してくる
>>586 の考えが知りたい。
標準出力関数fputcを用い、キーボードから入力した文字を1文字づつ ファイルに書き込むプログラムを作成しなさい。 ただし、入力の終了は記号'/'の入力で判定を行うこと。 お願いします
592 :
デフォルトの名無しさん :03/06/13 22:25
プログラムについて学校では4時間くらいしか教わっていないもので…すみません。 ありがとうございました。
593 :
デフォルトの名無しさん :03/06/13 22:29
>>591 #include <stdio.h>
int main()
{
int c;
FILE *fp;
fp=fopen("ファイル","w"); // 失敗しない。絶対に失敗しない。しないったらしない。
while((c=getchar())!='/')
fputc(c,fp);
fclose(fp);
return 0;
}
>580さま、お返事どうもです。 ですが、このままでは任意の数Nを入力することは出来ないので、 main関数も変更しないといけないと思います。 是非よろしくお願いします。
誰かやってくれ・・・
なにを
あまりにもバカバカしいのとあまりにも難しいのはやらない罠
599 :
デフォルトの名無しさん :03/06/13 23:21
問1 2分探索木は,単純で効率のよい動的な探索法で,コンピュータサイエンスにおける最も基本的なアルゴリズム の一つである.2分探索木の一つの節点を表すのに構造体を用いたプログラムを作成せよ.節点の構造体は,1人の 学生のデータ(学籍番号,姓,名,性別)と2つの子節点へのポインタからなるものとする.名の入力により,該当 学生のデータを探索するようにせよ.データはプログラム中に書き込むのではなく,入力用ファイルを用意して, これから読み込むようにする.ある節点の学生と同じ名の学生のデータを挿入する際,節点の右に入れるか左に入れるかは 各自で決めてください.なお,探索時には,同じ名の学生はすべて出力できるようにすること. 問2 問1では,2分探索木を用いたが,その他に蓄積したデータを探索するのに良く用いられる方法 としてハッシュ表をもちいたものがある.これらの利点・欠点を考察せよ(論述問題).
>>594 #include <stdlib.h>
int main(int argc, char* argv[])
{
int k = 0;
while (--argc)
k = gcd(atoi(*++argv), k);
printf("%d\n", k);
return 0;
}
>>594 やっぱmainも書かなきゃならんのね。
あの文章だとgcdaryだけでいいという解釈もできるんだが…
#include <stdio.h>
#include <stdlib.h>
int gcd(int x, int y)
{
if (y == 0)
return (x);
else
return (gcd(y, x % y));
}
int gcdary(int a[], int n)
{
if (n == 1)
return a[0];
else
return gcd(a[0], gcdary(a + 1, n - 1));
}
int main(void)
{
int *a, n, i;
printf("要素数を入力せよ:");
scanf("%d", &n);
a = malloc(sizeof(int) * n);
for (i = 0; i < n; i++) {
printf("整数を入力せよ:");
scanf("%d", &a[i]);
}
printf("最大公約数は%dです。\n", gcdary(a, n));
return (0);
}
603 :
デフォルトの名無しさん :03/06/13 23:32
>>599 で、学生のデータは入力用ファイルにどのように書かれているの?
こっちで勝手に決めつけてもいい?
605 :
デフォルトの名無しさん :03/06/13 23:51
学籍番号,姓,名,性別の様にカンマでくぎられていればいいです
606 :
サンプルです :03/06/13 23:54
ごめん間違い、見なかったことにして。
見ました
見ました
611 :
デフォルトの名無しさん :03/06/14 00:35
うん。みなっかったよ。
お願いします。締め切りまであと2週間なんです!
アルゴリズムの本一冊買えばそこに答えがあるよ
配列を回転するプログラムを作成…cでお願いします ↑のまんま問われて、ほとほと困っていたところで… 脳内補完がかなりいるよなぁ…_| ̄|○
相手が出来る奴なら高度な解を提出すべきだな。バカならそれなりに。 回転か・・・どう回転すればあっと言わせることができるだろうか・・・
アフィン変換とか・・・ そいつの目の前にいって配列を表示しているディスプレイを力いっぱい回すとか
618 :
デフォルトの名無しさん :03/06/14 01:32
「配列」と言う文字列を文字通り回転させろ!
つまりGIFアニメでいいのか
620 :
デフォルトの名無しさん :03/06/14 01:38
FLASHの方が楽
621 :
デフォルトの名無しさん :03/06/14 01:44
C/C++で実現しないとスレ違いになるだろ!
>>618 先にネタを言われてしまった。
エスケープシーケンスを使ってるんで環境依存だけど…
cygwin上で確認。
#include <stdio.h>
#include <time.h>
int hai[] = { 0, 1, 2, 5, 8, 7, 6, 3 };
int retsu[] = { 8, 7, 6, 3, 0, 1, 2, 5 };
int main()
{
int i, j, k;
time_t start, current;
start = time(NULL);
for (i = 0; i < 10; i++) {
for (j = 0; j < 8; j++) {
for (k = 0; k < 9; k++) {
if (hai[j] == k) printf("配");
else if (retsu[j] == k) printf("列");
else printf(" ");
if (k % 3 == 2) printf("\n");
}
do {
current = time(NULL);
} while (difftime(current, start) < i * 8 + j);
printf("\033[3A");
}
}
return 0;
}
つまりC/C++でGIFアニメジェネレータを作ればいいのか
>>621 既存のGIF、FLASHファイルをsystem()でプレイヤーに開かせるってのはどう?
625 :
デフォルトの名無しさん :03/06/14 01:58
>616〜625さん、レスありがとうございます〜 …617さん…ワライマシタ(ヲ 問題はどーやってディスプレイに配列と表示させるか…(マテ 622さん、解答ありがとうございます…まだこっちで試してはいませんが そして…ネタを提供してくれた教授、ありが…なんて言うか、カエレ!
教授なのか!!一か八か勝負だな
>>601 なかなかいいコードかくね。
if文のなかを==0と書くところがいいな,わかりやすくて。
ロジックは return y>0 ? gcd(y,x%y) : x; としないと負数が与えられたら
abs付ければいいんだよ
unsignedじゃだめなの?
>>632 負数が与えられたらまずいとか言っているから。
>>502 やってけろ
これって面倒な部類に入りまつかね・・?
>>634 for(i=0;i<nyuryoku_sareta_kosu;i++)
if(hairetsu[i]>=shikiichi)
printf("%d ",hairetsu[i]);
638 :
デフォルトの名無しさん :03/06/14 15:28
(1)2つのfloat型変数を引用するとそれらの加算を返り値とする関数をadd()、 同様にして減算を行う関数をsub()、 乗算を行う関数をtimes() 除算を行う関数をdiv() として、四則演算を行うプログラムを作成せよ。 (2)int型の数値を2進数にて表示するプログラム。 (3)自分の名前をローマ字で表し、アスキーコードを変数に代入して、 自分の名前をアルファベットで表示させるプログラム。
ネタ?
入力した値を昇順に並べるプログラムを反復挿入法で作りたいのですが、 下のプログラムでできないのでよろしくお願いします。 下のプログラムを変更して完成して下されば幸いです。 嫌なら自分流のプログラムで結構です。 なお、今回は6個の値を入力した場合でお願いします。 #include<stdio.h> main() { int t[6],a,b,c,n; for(a=0;a<6;a++) scanf("%d",&n), t[a]=n; for(a=4;a>=0;a--) for(b=0;b<=a;b++) if(t[b]>t[b+1]) c=t[b],t[b]=t[b+1],t[b+1]=c; for(a=0;a<6;a++) printf("%d",t[a]); } 全然違っていたらすみません。
反復挿入法ってどんなの?
for(a=4;a>=0;a--) ここじゃないかな。
反復挿入法に該当するページが見つかりませんでした。
>>640 どう動かんの?
ソートできてるように思うが。
646 :
デフォルトの名無しさん :03/06/14 17:10
三つの整数を読み込み、それらが次のケースのいずれかに相当するかを出力プログラムを書け。 1.三つの値が全て異なる 2.二つの値は同じだが、もう一つは異なる 3.三つとも同じ値である という問題なのですが、書いてみたのですが何故か三番の判定がされません(´・ω・`) ソース書いてみます
647 :
デフォルトの名無しさん :03/06/14 17:12
#include <stdio.h> int main(void){ int w, x, y; printf("x: ");scanf("%d", &x); printf("w: ");scanf("%d", &w); printf("y: ");scanf("%d", &y); if (x!=y&&x!=w&&y!=w) printf("3tu no atai ha subete kotonaru\n"); else if (x=y&&y!=w) printf("futatuno ataiha onajidaga mou hitotuha kotonaru\n"); else if (x=w&&w!=y) printf("futatuno ataiha onajidaga mou hitotuha kotonaru\n"); else if (y=w&&x!=y) printf("futatuno ataiha onajidaga mou hitotuha kotonaru\n"); else if(x==y&&x==w&&w==y) printf("3tu tomo subete onaji atai\n"); return(0); }
>647 明解C言語と見た
>647 先に1. 3.を判定して残ったのが2.
>>648 どう間違ってるのかわからないのです(´・ω・`)
if (a == b && b == c) { printf("3"); } else if (a != b && b != c && c != a) { printf("0"); } else { printf("2"); }
>>649 ありがとうございます(ノд`)
お陰できちんと書けました
>>654 == は等しければ真、等しくなければ偽
とテキストに書いてあります。頑張ります・・・
だー今初期の間違いに気づいた・・・・ 代入してどう汁んだ・・・
int Count = (x==y) + (y==z) + (x==z); switch(Count){ case 3: puts("3つとも同じ。");break; case 1: puts("一組同じ。");break; case 0: puts("全てことなる。");break; }
trueは1だと保証されないだろ。
c 言語では、 偽は0、それ以外の数値は全て真
関係演算子は真なら1、偽なら0を出す
考え方の順序がおかしいのでは? たとえば(5 == 5) は必ず1を返す 0 以外は 真であるので (5 == 5) =true ということじゃないのか?
話にならんな
関係演算子の戻り値は 0 か 1 でしょうよ。 正式な仕様書とか読んだことないけどw
668 :
デフォルトの名無しさん :03/06/14 17:51
ぬるぽ
コンパイラがANSI Cに準拠してさえいれば、x==yとかx!=yとした場合に返ってくる値は0か1だぞ。
674 :
デフォルトの名無しさん :03/06/14 18:54
>>644 をやってくれた方したの問題のご教授お願いします
テキストファイルはの名簿である.各行のデータを,ID,姓名,読み(ローマ字)の
三つの要素をもつ構造体に格納するプログラムを書け.
テキストファイルの内容例↓
aaa0101,井川慶,igawa/kei(aaa0101)
>組み込みの演算子によってブー ル値が産み出されるときは、1か0であることが保証されている φ(..)メモメモ
>Javaは死滅 φ(..)メモメモ
678 :
デフォルトの名無しさん :03/06/14 19:21
井川遥ってだれ
>井川遥ってだれ φ(..)メモメモ
パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ( )】 ( )】 ( )】 【( ) 【( ) 【( ) / /┘ . / /┘. / /┘ └\ \ └\ \ └\ \ ノ ̄ゝ ノ ̄ゝ ノ ̄ゝ ノ ̄ゝ ノ ̄ゝ ノ ̄ゝ
>>674 どこがわからないの?
必要な処理は
・ファイルから読む
・構造体に格納する
の2つだが
その間にもう一つ、 ・読み込んだデータを要素に分ける ってのがあるか
687 :
デフォルトの名無しさん :03/06/14 19:58
688 :
デフォルトの名無しさん :03/06/14 20:06
ハッシュ関数 (key[i]は,キーのi番目の文字がアルファベット順で何番目かを示すとする.) int hash( int *key, int keysize) { int i; int hashv; hashv = *key ; for( i = 1 ; i < keysize; i++) { hashv = (( hashv*32)+key[i]) % TABLESIZE ; } return hashv ; } 問1 TABLESIZEはどのような値が望ましいか.その理由を述べよ.(論述問題). 問2 どのような場合に異なるキーで同じアドレスが割り当てられる状況が生じるか? また,そのような場合の対処法を2つ説明せよ.(論述問題). 問3 上のハッシュ関数を利用して,人の姓(last name)をキーにして姓名(first nameも含む)を表に格納するプログラムを書け. 必要に応じて上の関数を書き直してよい. ハッシュ値の計算が正しく行われて,正しい位置にデータが格納されていることが確認できるように表示させること.
>>687 いまコンパイルして動かしてみたけど、ちゃんと動いたよ。
表示もした。
690 :
デフォルトの名無しさん :03/06/14 20:25
>>689 どんな風に表示されましたか?
UNIXを使ってるのですがだめでした
691 :
デフォルトの名無しさん :03/06/14 20:27
>>690 aaa1101,井川遥,igawa/haruka
l:aaa0142,細川ふみえ,hosokawa/fumie
r:aaa2103,石川梨華,ishikawa/rika
r:aaa7394,戸川純,togawa/jun
693 :
デフォルトの名無しさん :03/06/14 20:34
Segmentation Fault
694 :
デフォルトの名無しさん :03/06/14 20:45
695 :
デフォルトの名無しさん :03/06/14 20:46
C言語です ファイルのバイト数、行数を数えるプログラムを作りなさい。 `\n' (文字コード 0x0a) の個数を行数と考えることにする。
FILE* const file = ?????; size_t file_size = 0; size_t num_lines = 0; int c; while( c = fgetc( file ) , c != EOF ) { ++file_size; if( c == '\n' ) ++num_lines; }
>>694 これで
>>341 みたいになるが、見やすいとはいえねーな。
----------------------------------------------------------
void Display_r(int depth, Node *node) {
printf("%s,%s,%s", node->id, node->name, node->ruby);
if (node->left != NULL) {
printf("%*c --L--", depth * 2, ' ');
Display_r(depth + 1, node->left);
}
if (node->right != NULL) {
printf("%*c --R--", depth * 2, ' ');
Display_r(depth + 1, node->right);
}
putc('\n',stdout);
}
void Display(void) {
if (root != NULL) {
printf("%s,%s,%s", root->id, root->name, root->ruby);
if (root->left != NULL) {
printf(" --L--");
Display_r(0, root->left);
}
if (root->right != NULL) {
printf(" --R--");
Display_r(0, root->right);
}
}
putc('\n',stdout);
}
あーだめか、いまいちうまくいかないな。
700 :
デフォルトの名無しさん :03/06/14 22:02
701 :
デフォルトの名無しさん :03/06/14 22:03
>printf("%*c --L--", depth * 2, ' '); こんな書き方できるんやね。 インデントあわせに便利やね。しらんかった。
703 :
デフォルトの名無しさん :03/06/14 23:00
"textfile"という名前のファイルを読みとり標準出力に出力するプログラムを作成せよ。 ただし、連続する改行文字はひとつの改行文字にして出力すること。
言語はCです。よろしくお願いします。
705 :
デフォルトの名無しさん :03/06/14 23:02
>>679 どうすれば見やすくなりますか?
見やすいプログラム作ってください!
>>703 #include <stdio.h>
#define FILENAME "textfile"
int
main(int argc, char **argv)
{
FILE *fp;
char a,b = 1,c;
if(NULL == (fp = fopen(FILENAME,"r"))){perror(FILENAME); return 1;}
while(EOF != (c = getc(fp))) if((a = (c != '\n'))||b) {b = a; putchar(c);}
return 0;
}
ちょっとバグ情報を… × char name[ID_LEN]; ○ char name[NAME_LEN]; × Display_r(0, root->left); ○ Display_r(1, root->left);
#include <iostream> #include <fstream> #include <string> int main() { using namespace std; string buf; ifstream fin; fin.open("textfile"); while(getline(fin, buf)){ if(!buf.empty())cout << buf << endl; } return 0; }
>>703 system("sed -e '/^$/d' textfile");
やべーわかんない・・・Cの宿題なんですが・・・ 三つの最大を求めるプログラムを改造して、どの変数が最大だったかを 表示するようにせよ。ただし、二つ以上の変数が同時に(同じ値で)最大 だった場合は、それらの変数の名前をすべて出力しなければならない。 どなたかご指導お願いします(ノд`)
>二つ以上の変数が同時に(同じ値で)最大 だった場合は、それらの変数の名前をすべて出力しなければならない。 この部分が出来ません(ノд`) ありえないぐらい長い文書いてしまいます
713 :
デフォルトの名無しさん :03/06/15 01:17
三つのプログラム(3種類のうちどれでもよい) とあるのでとりあえず一つ 今必死に書いてます(写し間違えたのか正しく動いてない・・・ #include <stdio.h> int main(void){ int x, y , z,max; printf("x: ");scanf("%d", &x); printf("y: ");scanf("%d", &y); printf("z: ");scanf("%d", &z); if (x >=y && x >= z){ printf("x is the largest\n"); max=x;} else if (y >= z && y>= x) { printf("y is the largest\n"); max=y; } else{ printf("z is the largest\n"); max = z; } printf("maximum is %d\n",max); return(0); }
715 :
デフォルトの名無しさん :03/06/15 01:49
int max( int x, int y, int z ) { int ret; if( x>=y && x>=z ) { ret = x; puts( "x" ); } if( y>=x && y>=z ) { ret = y; puts( "y" ); } if( z>=y && z>=x ) { ret = z; puts( "z" ); } return ret; }
>>714 #include <stdio.h>
int main(void)
{
int x, y, z, max;
printf("x: "), scanf("%d",&x);
printf("y: "), scanf("%d",&y);
printf("z: "), scanf("%d",&z);
max=x;
if(y>max) max=y;
if(z>max) max=z;
if(x==max) printf("x is the largest\n");
if(y==max) printf("y is the largest\n");
if(z==max) printf("z is the largest\n");
printf("maximum is %d\n",max);
return 0;
}
正の整数を読み込んで、素因数に分解するプログラムをお願いします。 [考え方] 除数をkとすると、まず、kに素因数となり得る最小の数2を設定する。 kがnの約数かどうかを調べ、約数であれば、kの値を出力する。 このとき、n/kは、それまでに見つかっていない素因数の全ての積に なるので、nの値をn/kの値で置き換える。 同じ素因数がいくつもある場合があるので(上例の2および3)、kが nの約数である限り、同じkの値で、この処理を繰り返す。 nがkで割り切れなくなった時は、kの値を1増やし、以上に述べた処理を 繰り返す。このとき、3以上のkの値については奇数だけを相手にすればよい。 また、一つのnの値については、kが√nを越えない最大の整数になるまで 行えばよい(nの値は変わっていくことに注意しよう)。ただし、kが√nを越えた ときには、nは1以外には√n以下の約数をもたないことになるので、そのときの nの値は素数であるか、1であるかのいずれかである。 sqrt((double)n)か(int)sqrt((double)n)を使うらしいのですが・・・。
>>718 #include <math.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char **argv) {
int i,j,m,max,*sieve;
m = sqrt(max = argc<2 ? 1000 : atoi(argv[1]));
if (NULL == (sieve = (int *)malloc(max*sizeof(int)))) return 1;
for (i=2; i<=max; i++) sieve[i] = i;
for (i=2; i<=m; i++) if (sieve[i]) for (j=i*i; j<=max; j+=i) sieve[j] = 0;
for (i=2; i<=max; i++) if (sieve[i]) printf("%d ", sieve[i]); puts("");
return 0;
}
>>718 #include <stdio.h>
#include <math.h>
int main(void)
{
int n,a;
scanf("%d",&n);
if(n == 1)
printf("1 = 1\n");
else if(n <= 0)
printf("Error\n");
else{
printf("%d = ",n);
a=2;
while(a<=(int)sqrt((double)n)){
if(n%a==0){
printf("%d * ",a);
n/=a;
}
else if(a==2)
a=3;
else
a+=2;
}
printf("%d\n",n);
}
return 0;
}
適当につくったから、あとは煮るなり焼くなり...
722 :
デフォルトの名無しさん :03/06/15 18:51
723 :
デフォルトの名無しさん :03/06/15 19:03
最近おもしろい宿題がないね
>>724 ほとんど読み飛ばし。問題の条件が曖昧なのとか、
以前答えが出てるのに同じ問題が何度も何度も書かれるとか(本人は1度目なのかもしらんが)。
あとちょっと仕事の片手間に答えるには難しすぎる問題とかw
最後のは興味深く読んで頭のなかでコードを浮かべたりするんだけど、
結局時間がなくてできないw
俺は能力不足でできないw
下の反復構造を再帰関数に書き換えるのですが誰か教えてくださいませんか?
これは2分サーチ用なのですがこの関数は引数として整数型配列、
探索範囲の開始添字と終了添字、探索キーを受け取り探索キーが見つかった時は
その配列要素の添字を返してそれ以外はー1を返すのが条件です。
よろしくお願いします。
int binarySearch(int b[], int searchKey, int low, int high)
{
int middle;
while(low <= high){
middle = (low + high)/2;
printRow(b, low, middle ,high);
if(searchKey == b [middle])
return middle;
else if( searchKey < b [middle])
high = middle - 1;
else
low = middle + 1;
}
return -1;
}
プログラムの前文は↓です
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1055741073 よろしくお願いします。
>>727 至極単純置換
- while(low <= high){
+ if(low<=high){
- high = middle - 1;
+ return binarySearch(b,searchKey,low,middle-1);
- low = middle + 1;
+ return binarySearch(b,searchKey,middle+1,high);
729 :
デフォルトの名無しさん :03/06/16 15:53
int型の数値を2進数にて表示するプログラム。を教えてください。
>>729 #include <limits.h>
void f(int n)
{
int i;
for(i=CHAR_BIT*sizeof(int)-1;i>=0;i--)
putchar('0'+((n>>i)&1));
}
731 :
デフォルトの名無しさん :03/06/16 16:14
longやfloat、doubleの違いを教えてもらえませんか? 倍精度実数型など、意味が分かりません。 お願いします
732 :
デフォルトの名無しさん :03/06/16 16:15
733 :
デフォルトの名無しさん :03/06/16 16:15
2重で書き込んでスマソ
>>731 longやintは整数型で小数点以下が無い。そして小さな値しか扱えない
float,doubleは小数点の概念がある。そして桁数が大幅にアップ。
精度はそれぐらいえらいぜって意味
三つの変数をx、y、zに読み込む。 これらを大きさの順に並べ替えて、その順に出力するプログラムを書け。 出力の1行目に最小値、2行目に2番目の値、三行目に最大値を入力すればよい。 二つが等しくて、残る一つがそれらより大きい場合、1行目と2行目は同じ値になる という問題なのですが、同じ値になった場合どうやって表示させればよいのかわかりません。 どなたかご指導お願いします(´・ω・`)
737 :
デフォルトの名無しさん :03/06/16 16:21
自分の名前をローマ字で表し、アスキーコードを変数に代入して、 自分の名前をアルファベットで表示させるプログラム。はどう造ればいいですか?
>>736 できてるプログラムを見せなさい。
おなじ値じゃなければわかるんでしょ?
素数を求めるアルゴリズムをみんなに説明してください。 そして、1〜10までの間の素数を求めるのと、素数を10個求める ソースを記述してください。 「答案です。」とでも書いてたら添削してあげませう。 んじゃね
>>737 #include <stdio.h>
#include <string.h>
main(){
char name[1024];
int code,i;
printf("名前をローマ字で入れてください >> ");
scanf("%s",name);
for(i=0;i<strlen(name);i++) code = name[i];
printf("ローマ字 => %s\n",name);
printf("アルファベット => %s\n",name);
}
742 :
デフォルトの名無しさん :03/06/16 16:31
2つのfloat型変数を引用するとそれらの加算を返り値とする関数をadd()、 同様にして減算を行う関数をsub()、 乗算を行う関数をtimes() 除算を行う関数をdiv() として、四則演算を行うプログラムをどなたかお願いします。
743 :
デフォルトの名無しさん :03/06/16 16:31
scanfの時&が必要なんじゃ?
void compare_sort(int *a,int *b){ int tmp; if(*a > *b){ tmp = *a; *a = *b; *b = tmp; } } int main(){ int x,y,z; scanf("%d",&x); scanf("%d",&y); scanf("%d",&z); compare_sort(&x,&y); compare_sort(&y,&z); compare_sort(&x,&y); printf("%d %d %d",x,y,z); }
>>742 演算を行うための数値はどうやって入れるの?
出力はどういうイメージで出すの?
>>742 「変数を引用する」とはどういう操作なのか。
747 :
デフォルトの名無しさん :03/06/16 16:32
>>739 (;´д`)同じ値という条件でなくてもわからないです・・・
>>744 すごい・・・
でもまだ一年生なので学校では
while,for,if,else,and,or,printf,scanf,intしか習ってません(;´д`)
この範囲で組むにはどうしたらよいでしょうか?
すいませんわがままばっかりで・・・
関数習ってない?
ほなら int main(){ int x,y,z,tmp; scanf("%d",&x); scanf("%d",&y); scanf("%d",&z); if(x>y){ tmp = x; x = y ; y = tmp;} if(y>z){ tmp = y; y = z ; z = tmp;} if(x>y){ tmp = x; x = y ; y = tmp;} printf("%d %d %d",x,y,z); }
return してないな... 減点10だな x,y,zがそれぞれ大きさが解ってないとき、 x>y なら、xとyを交換する(必ず、x<yになる) y>z なら、yとzを交換する(必ず、y<zになる) ただ、これだけだと新しいxとyの関係については解らないので、 x>y なら、xとyを交換する(必ず、x<yになる) をもう一度する必要がある。
お願いします。 あの問題が気になって仕方がないです。
>>755 よくわからんが、答えを書いたらおまえが添削するってことか?
ヤナコッタ
エラトステネスのふるい だ、ごめん
横文字の名前はわからん...
>>728 入れてみてもなんか出来ませんでした。
誰か分かる人727の問題を教えてください。
765 :
デフォルトの名無しさん :03/06/16 20:01
int quux(int x, int y) { if (x==1) { return y; } else { return quux(x-1, (x+y)%65536); } } を再帰を使わず繰り返し(と代入文)を使う C言語の関数に書き換えよ。
766 :
デフォルトの名無しさん :03/06/16 20:09
>>765 int quux(int x, int y) {
while (x != 1) {
y = (x + y) % 65536;
x--;
}
return y;
}
768 :
デフォルトの名無しさん :03/06/16 22:17
N個の数の平均値と標準偏差を求めるにはどうしたらいいのでしょうか?
計算する
770 :
デフォルトの名無しさん :03/06/16 22:20
double sum,ave,var,std; double data[]={1,2,3,4,5,6,7,8,9}; int n = (int)(sizeof(data) / sizeof(data[0])); int i; sum=0.0; for(i=0;i<n;i++){ sum+=data[i]; } ave = sum / n; var=0.0; for(i=0;i<n;i++){ var += pow( (data[i] - ave) , 2 ); } var / = (n-1); std = sqrt(var);
772 :
デフォルトの名無しさん :03/06/16 22:35
>>771 ありがとうございます!!
レスむちゃくちゃ早くて驚きましたw
瞬殺なんですね。
ループは一回で充分。 sum=0.0; sum2=0.0; for(i=0;i<n;i++){ sum+=data[i]; sum2+=data[i]*data[i]; } ave = sum / n; var = (sum2 - sum * sum) / n; std = sqrt(var);
わり、適当にやってたから >> var / = (n-1); var /= (n-1); でいいのか?
776 :
デフォルトの名無しさん :03/06/16 22:58
C言語で、関数atofと関数strtodの作り方がわかりません。 atoiは作れたのですが・・・どなたかよろしくお願いします。
777 :
デフォルトの名無しさん :03/06/16 23:02
ただちに777をゲットせよ
779 :
デフォルトの名無しさん :03/06/17 00:04
総当り、またはGAで。
781 :
サンプルです :03/06/17 00:08
>>776 double my_atof(const char *s){
char buf[256];
double a,b,sig=1;
int i,x;
char *dot = strchr(s,'.');
if(dot == NULL) return (double)my_atoi(s);
x = dot - s;
strncpy(buf,s,x);
a = (double)atoi(buf);
if(a>0) sig = 1; else sig = -1;
strcpy(buf,s+x+1);
b = (double)my_atoi(buf);
for(i=0;i<strlen(buf);i++) b/=10;
return a + b;
}
#include <stdio.h> main( ) { char k[100]={0};//入力した文字を入れる配列 int n[26]={0};//n[0]〜n[25]はa〜zの出現回数に相当する配列 int i,j; scanf("%s",k); for(i=0 ; k[i] != '\0' ; ++i) { if( n[ k[i] - 'a' ] == 0) { ++n[k[i]-'a']; if(i >= 1 && k[i] != k[i-1]) { printf("%d%c",n[k[i-1]-'a'],k[i-1]); n[k[i-1]-'a'] =0; } if(k[i+1]=='\0') printf("%d%c",n[k[i]-'a'],k[i]); }else { if(k[i] == k[i-1]) { ++n[k[i]-'a']; if(k[i+1] == '\0') printf("%d%c",n[k[i]-'a'],k[i]); } } } }
ごめん、負の数のときの処理忘れてた。 double my_atof(const char *s){ char buf[256]; double a,b,sig=1; int i,x; char *dot = strchr(s,'.'); if(dot == NULL) return (double)my_atoi(s); x = dot - s; strncpy(buf,s,x); a = (double)atoi(buf); if(a<0){ sig = -1; a *= (-1);} strcpy(buf,s+x+1); b = (double)my_atoi(buf); for(i=0;i<strlen(buf);i++) b/=10; return (a + b) * sig; }
あー、よく考えたら全然ダメだ。すまそ
In a completed puzzle, the nine pieces are arranged in a 3 x 3 grid, and each of the 12 pairs of edges facing each other must be labeled with one of the following four combinations of symbols: "R" with "r", "G" with "g", "B" with "b", and "W" with "w". 要するに、9枚のパネルを3x3に組み合わせる。 そのパネルには12の接合面があり、 それぞれ下に示す4種類の記号同士で組み合わせなさい。 ですな。
788 :
デフォルトの名無しさん :03/06/17 00:29
9つのピースを持つパズルを完成させます。入力は WwRR wwrg RRGb rGBG RGrb RrRg RGrg rgBB Wrgr のように与えられアルファベットは(上)(右)(下)(左)の辺の記号を 表しています。 サイトの図を見てもらえれば分かりますがwとW,gとG,rとR,bとBがくっつく 条件となります。与えられた9つのピースが3*3で完成するパターン数 を求めよ、というものです。ピースはそれぞれ自由に 回転、移動させることができます。
For example, an edge labeled "R" can only face an edge with "r". Figure 2 is an example of a completed state of a puzzle. In the figure, edges under this restriction are indicated by shadowing their labels. 例を示すなら、"R"には"r"だけが接することが出来ます。 Figure 2はパズルが完成した状態を示しています。 この条件下にある接合面のラベルに網がけをしてあります。 The player can freely move and rotate the pieces, but cannot turn them over. There are no symbols on the reverse side of a piece ! プレイヤーは、ピースを動かし、回転させることができますが ひっくり返すことはできません。 このピースの裏側には記号はありません。
Each piece is represented by a sequence of the four symbols on the piece, starting with the symbol of the top edge, followed by the symbols of the right edge, the bottom edge, and the left edge. それぞれのピースは、4つのシンボルを持っています。 このシンボルは、上、右、下、左の順序を持っています。 For example, gwgW represents the leftmost piece in Figure 1. Note that the same piece can be represented as wgWg, gWgw or Wgwg since you can rotate it in 90, 180 or 270 degrees. 例えば、Figure1において、もっとも左のgwgWに注目してください。 90度、180度、270度回転させれば、wgWgもgwgwもWgwgも同じ物です。
The mission for you is to create a program which counts the number of solutions. 問題は、いくつの回答があるかを求めるプログラムを作成することである。 It is needless to say that these numbers must be multiples of four, because, as shown in Figure 3, a configuration created by rotating a solution in 90, 180 or 270 degrees is also a solution. その数は、4の倍数にならなければならない。 なぜなら、Figure 3によると同じ状態から、 解答が90度,180度,270度回転させていたものがあるからだ。
ICPCか おれも出たことあるぞ
793 :
デフォルトの名無しさん :03/06/17 01:03
電卓の課題が出ました。C言語で作るらしいのですが1回だけの計算で簡単 なものを作らなければならないみたいです。 void printf scanf case if switch などは習いました。 割り算だけは実数型にするということです。 割り算以外は整数型で表示という事です。 よろしくお願いします。
結構簡単そうだけど、多分、何処かに落とし穴があるんだろうな…
795 :
デフォルトの名無しさん :03/06/17 01:06
/* 画像の濃度ヒストグラムの画像を作るプログラム histgram.c */ #include<stdio.h> #include<stdlib.h> #include<limits.h> #include"mypgm.h" #define IMAGESIZE 256 /* = GRAYLEVEL */ void make_histogram_image( ) /* 原画像 image1 のヒストグラムを作り画像としてimage2 に代入 */ { long int histogram[GRAYLEVEL]; /* ヒストグラム用配列 */ long int max_frequency; /* 頻度の最大値 */ int i, j, x, y; /* 制御変数 */ int data; /* 頻度を表すグラフの長さ */
796 :
デフォルトの名無しさん :03/06/17 01:06
/* 原画像のヒストグラムを求める */ for ( i = 0; i < GRAYLEVEL; i ++ ) histogram[ i ] = 0; printf("今,原画像のヒストグラムを求めています.\n"); for ( y = 0; y < y_size1; y ++ ) for ( x = 0; x < x_size1; x ++ ) histogram[ image1[x][y] ] ++; /* 頻度の最大値を求める */ max_frequency = INT_MIN; for ( i = 0; i < GRAYLEVEL; i ++ ) if ( histogram[i] > max_frequency ) max_frequency = histogram[i]; printf("頻度の最大値 = %d\n", max_frequency); /* ヒストグラム画像を image2 に代入 */ x_size2 = IMAGESIZE; y_size2 = IMAGESIZE; for ( y = 0; y < y_size2; y ++ ) for ( x = 0; x < x_size2; x ++ ) image2[y][x] = 0; for ( i = 0; i < GRAYLEVEL; i ++ ){ data = (int)( MAX_BRIGHTNESS / (double)max_frequency * (double)histogram[i] ); for ( j = 0; j < data; j ++ ) image2[IMAGESIZE-1-j][i] = MAX_BRIGHTNESS; } }
797 :
デフォルトの名無しさん :03/06/17 01:07
main( ) { load_image_data( ); /* 原画像を image1 に読み込む */ make_histogram_image( ); /* ヒストグラムの画像を image2 へ */ save_image_data( ); /* image2 を保存する */ return 0; } このプログラムをグラフの上限値をじゆうに設定できるようにするには どうすればいいですか
>>793 数値1: 123
数値2: 456
演算子: +
答え:578
とかこんな感じ?
579だ。。。ウツダ
>>793 こんな感じ?
#include <stdio.h>
#include <string.h>
int
main(void)
{
char op,buf[BUFSIZ]; int x,y;
fprintf(stderr, "try: 2*3\n");
while(!feof(stdin)) {
fprintf(stderr, "> ");
fgets(buf,BUFSIZ,stdin);
if (3 == sscanf(buf, "%d %[-+*/] %d", &x, &op, &y)) {
switch(op) {
case '+': fprintf(stderr, "= %d\n", x+y); break;
case '-': fprintf(stderr, "= %d\n", x-y); break;
case '*': fprintf(stderr, "= %d\n", x*y); break;
case '/': fprintf(stderr, "= %f\n", ((double)x)/y); break;
}
}
}
return 0;
}
>>779 #include <stdio.h>
#include <ctype.h>
struct cell { char up, down, left, right; };
struct cell table[3][3]; int count = 0, flags = 0;
char q[9][4]={"RrGb","WWGR","rGgb","Wbrg","wgBb","GgBg","WbBG","Wwwg","WWGG"};
struct cell rotate(struct cell x) { struct cell y;
y.up = x.right; y.right = x.down; y.down = x.left; y.left = x.up; return y; }
struct cell create(char s[4]) { struct cell x;
x.up = *s++; x.right = *s++; x.down = *s++; x.left = *s; return x; }
int check(char x, char y) { return x != y && tolower(x) == tolower(y); }
void loop(int x, int y) { int i, j; struct cell *p = &table[x][y];
for (i = 0; i < 9; i++) {
if (flags & (1 << i)) continue;
flags |= 1 << i;
for (*p = create(q[i]), j = 0; j < 4; *p = rotate(*p), j++) {
if (x != 0 && !check(table[x-1][y].down, p->up)) continue;
if (y != 0 && !check(table[x][y-1].right, p->left)) continue;
if (x == 2 && y == 2) count++; else if (y == 2) loop(x+1, 0); else loop(x, y+1); }
flags &= ~(1 << i); } }
int main(void) { loop(0, 0); printf("%d\n", count); return 0; }
803 :
デフォルトの名無しさん :03/06/17 03:12
>>793 これでいいのかな?
double waru(double f,double s){
double a;
a=f/s;
return a;
}
main(){
int first,second,third;
printf("最初の数値を入力してENTERを押してください");
scanf("%d",&first);
printf("1,2,3,4の演算を選んでENTERを押してください 1:+ 2:- 3:* 4:/\n");
scanf("%d",&second);
printf("最後の数値を入力してENTERを押してください");
scanf("%d",&third);
if(second==1)printf("%d",first+third);
if(second==2)printf("%d",first-third);
if(second==3)printf("%d",first*third);
if(second==4)printf("%lf",waru(first,third));
return 0;
}
(double)first/third
Cでアナログ時計作れと言われて作っているのですが アニメーションさせるあたりが全く分からなくて困っています どんな命令を使うのか教えてください お願いしますm(__)m
>>795 >このプログラムをグラフの上限値をじゆうに設定できるようにするには
意味不明。
それから、ソースを載せるなら省略せずに全部載せろ。
#できれば私が出勤するまでにv
>>809 標準Cでは無理。ウインドウズアプリケーションなら、Win32APIと言うのがあって、
ドットを打てる関数があるので、その点で時計を表示する。SetPixelとか、速度に
こだわるなら、BitBltとか。
アニメーションはまず止まっている時計を書けるようにする。
次に引数によって針の角度が変えられる止まっている時計をかけるようにする。
後は、時間を得られる関数を引数にして、時計の表示→消す→表示を繰り返す。
>>809 ディスプレイに表示する限りどうがんばってもアナログにはならない
出題者にお前は脳みそが腐っているから病院へ逝けと言っておけ
Cで組み込み制御すると言うのなら話は別だが
チゴイネ
816 :
デフォルトの名無しさん :03/06/17 11:18
>>812 ディスプレイだとある意味アナログかもしれないよ
それを言い出すと、針を使っていてもクォーツを使っている限りアナログ時計にならない罠。
この世界は、不連続な物質と、不連続な時間から成るデジタル名世界ですよ?
>>817 針の動きは一定でこそないがアナログさ(w
(n秒の位置からn+1秒の位置へ瞬間移動するわけじゃないから)
821 :
デフォルトの名無しさん :03/06/17 12:25
助けてください、全然わからなくて困ってます。 要素数が no である int 型の配列 vc の要素の最大値と最小値の差を 返す関数 diamarray(int vc[], int no) を作成せよ。 動作確認をするために、main 関数も作成しなさい。
822 :
デフォルトの名無しさん :03/06/17 12:28
宿題じゃないのですが、クラスの外の関数から、 そのクラスのコンストラクタ・デストラクタを オブジェクトを作成せずに呼び出す方法ありませんか? class test{public:test(){return;};}; int main(int c,char**v) { BYTE*pby=new BYTE [sizeof(test)]; test*pclT=pby; pclT->test();//この処理がしたいが「test」の関数でないとエラーになる } コンストラクタと同じ処理をするものを作っても、いいんですが できれば、一つの定義で収めたいです。方法ありませんか?
823 :
デフォルトの名無しさん :03/06/17 12:36
>>821 動作確認は自分でどうぞ。テストもしてません。
int daimarray(int vc[],int no)
{ int max=vc[0],min=vc[0],i;
for(i=1;i<no;i++)
{ if(vc[i]<min)min=vc[i];
if(vc[i]>max)max=vc[i];
}return max-min;
}
全角スペースに気をつけてください
>>823 ifがネストしているみたいに
なってますがネストしてません。
全角スペースでずれました。すいません
>>823 >>824 あ、ありがとうございます!!
これから講義なんで終わったらやって見ます!
本当にありがとうございました〜
>>822 class test{
public:
void foo();
test(){foo();}
};
同じ処理をするものを作っておいて、
コンストラクタはそれを呼ぶようにする。
宿題ではないのなからスレ違いだな。
ないのなから…
>>826 822の目的とは多少違うだろ
スレ違いにマジレスしてやる義理は無いが
根本的にクラスとして初期化された実体がないのに、通常のメンバ関数を呼ぶ時点で謝り newが領域の確保しかしていないと思っているのだろうか? 呼ぶのなら関数にstaticを付けるべき
>>822 クラス内にコンストラクタと同じ処理の関数をPublicで作り、
コンストラクタはそれを呼ぶ。
>>826 と同じことを言っているようだが「コンストラクタと同じ処理」を
外部に公開しないですむ。
謝りー>誤り
>>830 こういうことかな?
class test{
public:
test(){likeConstractor();}
static void likeConstractor()
{
return;
}
};
コンストラクタもインラインアセンブラで強制的に呼べないこともないが、 そんな馬鹿なプログラムは作りたくない
友達の宿題をやらせてもらった。 ぜひともほかの人にもやってほしい。 問題: 2次元配列に"abc", "def", ... "vwx", "yx"を入れる。 ループなどを使わずにこの配列を使い、「abcdef...vwxyz」を表示せよ。
int main(void) { char const array[][3] = { "abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz", }; printf("%s\n", &array); return 0; }
>>836 はやっ
後日に友達から教えてもらった先生の解答は
printf( "%s\n", array ) だった。
...ちなみに折れは思いつかなかった。
ループを使わない→各要素を羅列する→つまらん →各要素を連結する→最初から切れ目を作らない 以上v
最後が"yz"だからうまくいくんだよねぇ。 アルファベットが27文字だったら4文字ずつ区切ったのだろうか。
840 :
画像処理か :03/06/17 14:10
>>795 ピンク色の本に洗脳されすぎ。
それから,INT_MINってなに?どこで定義されてる?
>>839 例えば12文字。
char const array[][3] = {
"abc", "def", "ghi", "jkl", "",
};
INT_MINも知らないくせに偉そうな口が叩けるんですね(^^;
アラインメントは大丈夫か
847 :
デフォルトの名無しさん :03/06/17 17:08
この日本語だけでつたわるかどうか不安なのですが、こんなんでました。 コマンドプロンプトからファイル名を一つだけ読み込み、 そのファイルを開いて数字列を読み込み、 平均値を求め、標準出力に表示するプログラムを作成せよ。 というのがUNIX Cの授業で出ました。 がくがく。 どなたかおねがいいたしますー。
ファイルの中身を見せろ
>>846 sizeof (*array) == 3 でない可能性があるという事だろう。
失礼しました。 ファイルの中身は、 たとえばclass1.datというファイルが、 83 54 59 80 94 ・・・ といった具合です。
>>849 ありうるのか?
sizeof( array )/sizeof( array[0] ) は array の要素数を返すんじゃないのか?
array = char[3] とすると
sizeof( char[3] )/sizeof( char ) = sizeof( char[3] ) = 3 でないと困るんじゃ?
>>847 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 1024
main(){
FILE *fp;
int sum=0,count=0;
char buf[BUFSIZE];
printf("input file name >> ");
scanf("%s",buf);
fp = fopen(buf,"r");
if(fp==NULL){
printf("ERROR FILE OPEN [%s]\n",buf);
return;
}
while(fgets(buf,BUFSIZE,fp)){
sum += atoi(buf);
count++;
}
printf("平均 : \n",sum/count);
fclose(fp);
}
間違えた ×printf("平均 : \n",sum/count); ○printf("平均 : %d\n",sum/count); あと#include <string.h>はいらないや。
854 :
デフォルトの名無しさん :03/06/17 17:37
c++ version #include <iostream> #include <iterator> #include <fstream> #include <vector> double foo(const char* s) { std::ifstream f(s); std::vector<int> v((std::istream_iterator<int>(f)), std::istream_iterator<int>() ); std::vector<int>::iterator st , en; st = v.begin(); en = v.end(); int cnt; double temp; cnt = temp = 0; while(st != en){ ++cnt; temp += *st++; } return temp/cnt; } int main(int,char **s){ std::cout<<foo(s[1]); return 0; }
855 :
デフォルトの名無しさん :03/06/17 18:58
みなさんはC言語をどのくらいかけて一通りマスターしましたか? 目安は初心者の参考書は見ないで済むくらいのスキルになるまで。
856 :
デフォルトの名無しさん :03/06/17 19:10
sage
よく使う関数 → 参考書見ない、動かなかったら見る。 たまーに使う関数 → google で manpage めったに使わない関数 → 参考書とかgoogleでサンプル探す
858 :
デフォルトの名無しさん :03/06/17 19:34
プロのプログラマーがよく使う関数ってありますか? あと、scanfなどはプロは滅多に使わないと聞いたのですが・・。 他にもそんな関数ありますか?
スレ違い
860 :
デフォルトの名無しさん :03/06/17 19:37
すみません。 調子に乗りすぎました
わけわかんねぇよ。 よく使うとかさ。 目的に最もあったの使えよ。 大体聞いてどうすんだ? おれがmallocつったらお前これからmalloc使いまくる気か?スタックで十分なときでも。 てかなんでこんな連続でスレ違いばっかり・・・
組み込み系だとそもそも標準ライブラリ使えなかったりする。 処理系用の専用ライブラリつかうからmallocもstrcpyもprintfもない。
863 :
デフォルトの名無しさん :03/06/17 19:51
★を1個ずつ増やし改行ながら10まで表示し、 10になったらまたカウントダウンして1までってな感じのプログラムを 作りたいのですが。C初めて3日ですが、何も分からないまま やってみました。ぐちゃぐちゃで申し訳ないんですが、どうか 添削してください。意味不明なら流すか、ネタだと思って 酒のつまみにでもしてください。 #include <stdio.h> int main(void) { char star='★'; int a; for(a=1;a<=10;a++){ printf("%c\n",star); star++; if(a==10){ for(;a>=1;a--){ printf("%c\n",star); star--; } } } }
>>863 平仮名や漢字や★見たいな記号はワイド文字といって2byte使う。
char は1byeしか格納できないから、それじゃだめ
じゃぁどうするかというと、文字ではなく文字列として扱う。
star++; で星が増えていくわけじゃないぞ。
根本的に間違ってました。 自分は寝惚けてたんでしょうか
恥
>>866 恥を忍んで聞かせていただきます。
では、どのようにしたらいいですか?
>>870 ループで出力したい個数だけ改行を打たずに★をプリントし、
その後一個改行を出力。
それを行数分繰り返す。
>>870 printfで★一つ表示。
printfをn回実行。
★はどのように宣言すればよいでしょうか。
>>870 やるとしたらこんな感じ。
void print_n_star(int n) {
int i;
for (i = 0; i < n; i++) {
printf("★");
}
printf("\n");
}
int main(void) {
const int MAX = 10;
int i;
for (i = 1; i <= MAX; i++) {
print_n_star(i);
}
for (i = MAX; i > 0; i--) {
print_n_star(i);
}
return 0;
}
>>873 文字列。
char *s = "★";
>>874 main()の2度目のループは課題が1までなので
i > 0
より
i >= 1
の方がよくない?
878 :
デフォルトの名無しさん :03/06/17 20:31
/*踏まえて*/ #include <cstdio> void show(char *s,int c) { while(c-- > 0) std::printf("%s",s); std::putc('\n',stdout); } void foo() { char *star = "★"; int i; for(i=0; i<10; ++i){ show(star,i); } for(; i>0; i--){ show(star,i); } }
>>878 ネームスペースとxstdioとかいらぬ混乱を招こうとしてまつね
880 :
デフォルトの名無しさん :03/06/17 20:45
横レス失礼します。 ひとつ質問があります。 ★をprintfで10回表示しながら前より1個★の数を増やすには char *s = "★"; を使うのでしょうか? 要するに1〜10の和の数だけ星を表示すると言うことです。 お願いします。
>>880 おまえは874とか878を見て何も感じないのか…
>>880 10個表示させるなら10回、11個なら11回ループすればいい。
ん〜、難しすぎて分かりません。 僕も超初心者ですから
>>883 char *s = "★"; //sに星マークをセット
printf("%s",s); //★ を表示
printf("%s",s);を2回実行 //★★ を表示
printf("%s",s);を10回実行 //★★★★★★★★★★ を表示
forを使ってprintfを1回、2回、3回と表示するにはどうしたら・・・。 この場合、★は6個表示
できたー #include <stdio.h> main(){ int i,j; for(i=1;i<=10;i++){ for(j=1;j<=i;j++){ printf("★"); } printf("\n"); } for(i=1;i<=9;i++){ for(j=9;j>=i;j--){ printf("★"); } printf("\n"); } return 0; }
887 :
デフォルトの名無しさん :03/06/17 21:04
for (i = 6; i > 0; i--) printf("hoge");
for(j=1;j<=i;j++){ printf("★"); } 関数でくくれ。
>>888 関数でもないし、このばあい括らなくてもいいし。
891 :
デフォルトの名無しさん :03/06/17 21:09
int i,j; for(i=1;i<=10;i++){ for(j=1;j<=i;j++){ printf("★"); } printf("\n"); } この部分、Cやったことない漏れには分からない。 どういう動きなのか説明してもらえんかの
あ、ごめん、勘違いした。
893 :
デフォルトの名無しさん :03/06/17 21:12
1回から10回★を印字する
894 :
デフォルトの名無しさん :03/06/17 21:13
>>891 そんなのCでなくてもたいがいのプログラミング言語である話だが・・
896 :
デフォルトの名無しさん :03/06/17 21:15
for(i=1;i<=10;i++){ printf("\n"); for(j=1;j<=i;j++){ printf("★"); } } こう書き換えたらダメ?
なにこれオマンコ?
898 :
デフォルトの名無しさん :03/06/17 21:19
うん、オマソコ
899 :
デフォルトの名無しさん :03/06/17 21:21
900 :
デフォルトの名無しさん :03/06/17 21:28
900げと
901 :
デフォルトの名無しさん :03/06/17 21:35
#include <stdio.h> #define MAX 10 int main(void) { int i,j; for(i=1;i<=MAX;i++){ for(j=1;j<=i;j++){ printf("★"); } printf("\n"); } }
課題が低レベルだと食いつきがいいな
903 :
デフォルトの名無しさん :03/06/17 21:38
このスレのさっきの問題を見て、 どんなプログラムにするかアルゴリズムが思いつきませんでした。 forを2重に使うとあんな風になるなんて。 理解力のない漏れにもわかるようなアルゴリズムの解説サイト ありましぇんか?
>>891 int i,j;//整数i,jを宣言
for(i=1;i<=10;i++){//i=1をi<=10になるまでiを1ずつ足す
for(j=1;j<=i;j++){//@i=1★を一個表示
printf("★");//Bi=2★をニ個表示
}//Di=3★を三個表示i=10まで繰り返し
printf("\n");//A改行C改行E改行
@から見てく
905 :
デフォルトの名無しさん :03/06/17 21:40
アルゴリズム以前のような気がするがな。
906 :
デフォルトの名無しさん :03/06/17 21:44
簡単な問題にはレス付くの早いわな。
難しい問題は労力に見合わん。やってもできない時もあるけど。 やっても「こういう動作じゃないんですよ」とか言われるし 相手するのは面倒。
908 :
デフォルトの名無しさん :03/06/17 21:51
909 :
デフォルトの名無しさん :03/06/17 21:53
906です。902とかぶってた。鬱々…
>>907 相手しなきゃ良いじゃん。(「あ、そう」で良いじゃん)
そもそも労力に見合うって何よ。
ここは自己満足の為に書き込むスレざんしょ。
だから簡単な問題で自己満足するんだな。
911 :
デフォルトの名無しさん :03/06/17 21:59
三種類の括弧(),{},[]が並んだ文字列を読みこみ、括弧のつじつまがあっているか を検査するプログラムを作りたいのですが。
>912 フラグを立ていろいろする
>>903 Cの本持ってんなら、
制御文のところをよ〜く読んで、
あとは自分で考えろ。
>>912 宿題なら宿題らしく。
カウンタの加減算で良いのでは?
917 :
デフォルトの名無しさん :03/06/17 22:09
・開き括弧ならとにかくpush ・閉じ括弧ならpopして、同じ種類の括弧かどうか調べ、異なっていればエラー ・すべての文字を見終わって、スタックも空であれば正解 すいません書き忘れてました
カウンタだと ( [ )] こういうエラー見つけにくいんじゃないかな? スタックに開きカッコをつんでいって、閉じカッコがきたら、取り出してチャックしてみるのがいいんじゃないか?
920 :
デフォルトの名無しさん :03/06/17 22:13
再帰。
921 :
デフォルトの名無しさん :03/06/17 22:52
#include <stdio.h> #include <string.h> int nSt; char aSt[1024]; int KakkoCheck( char* pIn ) { char* sB = "[{("; char* sE = "]})"; nSt = 0; while( *pIn ) { if( strchr( sB, *pIn ) ) {aSt[nSt] = *pIn; nSt++;} if( strchr( sE, *pIn ) ) { if( strchr( sB, aSt[ nSt - 1 ] ) - sB != strchr( sE, *pIn ) - sE ) return -1; // Error nSt--; } pIn++; } if( nSt ) return -1; // Error; return 0; // OK; } int main( void ) { char sBuf[1024]; while( 1 ) { fgets( sBuf, 1024, stdin ); printf( "%d\n", KakkoCheck( sBuf ) ); } return 0; }
922 :
デフォルトの名無しさん :03/06/17 22:55
漏れ921だけんど、汚くて済まんな。 一度に書き込める行数の制限あるんでこんななった。 正式な動作確認もしてないし main() も雑だけど変かな? 突っ込み希望。
923 :
デフォルトの名無しさん :03/06/17 23:10
好きな数字Xをキーボードから入力させて 1〜Xまでの数字全部を足した数を表示させるプログラムを『できるだけ簡潔に』 作ろうとするとどうなりますかね? お話にならないレベルで申し訳ないデス。知恵を授けたまえー。
簡単すぎてやる気にならない
int i; int sum = 0; int c = getc(); if(isdigit(c)){ for(i='1';i <= c;i++){ sum += i - '0'; } printf("sum %d",sum); }
#include<stdio.h> int main(void) { int n; scanf("%d",&n); printf("%d\n",n*(n+1)/2); return 0; } 濡れはここまでしかでけん・・・
927 :
デフォルトの名無しさん :03/06/17 23:20
>>924 はぅぁっ。
そういうものですか…。
PCもレポート書くぐらいにしか使ったこと無いもので。
int x; scanf("%d",&x); printf("%d\n",x*(x+1)/2);
929 :
デフォルトの名無しさん :03/06/17 23:23
>>925 >>926 ご両人に感謝ですw
なんかintは2つまでが好ましい、みたいな事言ってたんですけど、
へっぽこの私では3個が限界でw
930 :
デフォルトの名無しさん :03/06/17 23:24
>>928 おー、短いw
ありがとうございます〜。
って感謝レス多発ですいません。
931 :
デフォルトの名無しさん :03/06/17 23:43
テキストファイルは名簿である.各行のデータを,ID,姓名,読み(ローマ字)の三つの要素をもつ構造体に格納する プログラムを書け.
933 :
デフォルトの名無しさん :03/06/17 23:47
なんでこういう式になるの? n*(n+1)/2
934 :
デフォルトの名無しさん :03/06/17 23:47
C++の宿題ってあるんだろうか? 「循環参照をおこさないスマートポインタのテンプレートを書け」 とかだされたら俺できないよ
938 :
デフォルトの名無しさん :03/06/17 23:52
939 :
デフォルトの名無しさん :03/06/17 23:58
940 :
デフォルトの名無しさん :03/06/18 00:00
スーパー生姜臭い
n〜1まで 1234・・n-2n-1n 1234・・n-2n-1 1234・・n-2 : 1234 123 12 1 これを合計したのが知りたい。これをひっくりかえした 1 12 123 1234 : 1234・・n-2 1234・・n-2n-1 1234・・n-2n-1n をあわせると 1 nn-1n-2・・4321 12 n-1n-2・・4321 123 n-2・・4321 1234 : : : 1234・・n-2 321 1234・・n-2n-1 21 1234・・n-2n-1n 1 これは高さがnで幅がn+1の長方形。n(n+1) これを半分にして n(n+1)/2
942 :
デフォルトの名無しさん :03/06/18 00:02
なんかの公式?
ガウスの公式だったかな。 奴はいろんな公式持ってるが。
944 :
デフォルトの名無しさん :03/06/18 00:05
くそ〜、ガウスのやろ〜
ガキの頃に一発でこれを導いたという伝説がなかったっけ?
確率か?
947 :
デフォルトの名無しさん :03/06/18 00:09
>>945 いたいた。小学校の先生に「1〜9まで足したら何になる?」とか
聞かれて考え出したんでしょ。
948 :
デフォルトの名無しさん :03/06/18 00:10
ん?明日の降水確率か? 明日は100%だよ。 分かったか?傘持ってけよ
>>941 そんな風に習った?
Sn=1+2+・・・+(n-1)+n
として、並びを逆にしたもの
Sn=n+(n-1)+・・・+2+1
と足し合わせると、全ての項が(n+1)になる。つまり、
2*Sn=(n+1)+(n+1)+・・・+(n+1)+(n+1)
全部で項はn個あるから、
2*Sn=n*(n+1)
両辺を2で割って、
Sn=n*(n+1)/2
俺はこう習った。
中学生の時に理科年表か何かで見て知った。
>>947 1から100まで足せ、とクラスに問題を出して
その空き時間で内職しようとした教師が
一瞬で正解を答えたガウスに驚いたという伝説だったかと。
まず、25文字以下の文字列を入力。 次に、一文字を入力、最初に入力した文字列の先頭からその文字を探し 最初に見つかった位置より後ろの文字列を出力する。 AIUEOkakikukeko a kikukeko となるプログラム
955 :
デフォルトの名無しさん :03/06/18 01:21
>>954 #include <stdio.h>
#include <string.h>
int main()
{
char str[1234],*p;
int c;
printf("25文字以下の文字列を入力 : ");
fgets(str,sizeof str,stdin);
if(strlen(str)>25){
fprintf(stderr,"死ね\n");
return 1;
}
c=getchar();
p=strchr(str,c);
if(p)
printf("%s\n",p+1);
else
printf("ねーよ\n");
return 0;
}
getcharの前に入力を促すメッセージを入れるのを忘れた
char str[25+1]; int c; ゲッツ!25文字 c = ゲッシ!1文字 printf("%s\n"strchr(str,c));
958 :
デフォルトの名無しさん :03/06/18 01:26
%sにNULLを渡していいのだろうか。
>>958 NULL! とか印字する処理系があったが、規格はどうかな。
多分だめなような気がする(根拠なし)。
ちなみに印字する処理系は昔のMS-C。6.0あたりかな。
VC++の1.0がMS-Cの8.0に相当するからはるか太古の話だ。
960 :
デフォルトの名無しさん :03/06/18 07:42
じゃあ、ルートをCでどう使うか教えてください。 例えば 36の平方根は6ですよね。 今まで使ったことなくって いまふと使わないといけないんですけど わからなくて困ってます。
961 :
デフォルトの名無しさん :03/06/18 07:54
>>960 そのじゃあってのはなんだ。じゃあってのは。
平方根ならmath.hをインクルードしてsqrtを使えばいい。
#include <math.h>
double sqrt(double x);
964 :
デフォルトの名無しさん :03/06/18 19:57
AT, BV, CX, DY, EZ とかの文字列から ((((AT BV) CX) DY) EZ) とか (((AT BV) CX)(DY EZ)) とかの木を全て書き出したいのですが、うまい書き方が分かりません。 大まかな方針だけでも教えていただけませんか?
>>964 AT, BV, CX, DY, EZ
この順番は保ったまま?
右と左にわけて再帰すればいいのかな。 ((((AT BV) CX) DY) EZ)だったらAT, BV, CX, DYとEZに。 (((AT BV) CX)(DY EZ))だったらAT, BV, CXとDY, EZに。
968 :
デフォルトの名無しさん :03/06/18 21:09
死にてーな。どうしたらいいかな。
>>963 void mode(int freq[], int answer[])
{
int rating, j , h, largest = 0, modeValue = 0;
for(rating = 1; rating <= 12; rating++)
++freq[answer[j]];
これを
void mode(int freq[], int answer[])
{
int rating, j , h, largest = 0, modeValue = 0;
for(j = 0; j < SIZE; j++)
++freq[answer[j]];
こうすればいいんでない?
あと、5,10,15,…てのがずれてる気がするけどそこは自分でなおしてね
972 :
デフォルトの名無しさん :03/06/18 21:51
Cのコンソールで、あるところをクリックしたら 〇〇を表示するって可能ですか?
Cのコンソールときたか
やっぱ不可能ですか?
ブラウザでアクセスっすか。 う〜ん・・
メンソーレ
>>972 >クリック〜
マウスを使う時点で環境依存。無理。
いま、20030618と出力されているのを、 2003年06月18日と出力せよ。
>>979 printf("2003年06月18日");
>>981 strncpyとかstrcatとか 使うらしいんですが・・・
char m1[20]; m2[4][3]; m3[7][5][4]; という風にあって、それぞれの先頭アドレスが同じ時 m1[6] のとき m2[?][?] , m3[?][?][?] という計算は、どのようにすればいいんでしょうか?
char a[256] = {0}; char *b = "2003年06月18日"; strcat(a,b); strcpy(a,b); printf("%s",a);
> たとえば 012 と 021 は最後の3つが一緒なので、 > それを判別するだけです。 どういう意味でしょうか? 私が言ってるのは021と201の話なんですが…
986 :
デフォルトの名無しさん :03/06/18 22:38
あのー、高校生なんですが、よくわからない宿題なんで、 聞いてください 身の回りでデジタル化されたものを1つあげ、その際に生じた メリット・デメリットをあげよ。です。 CDとか、カメラは出てしまいました。なんかわからない・・・・ こーゆーのって、ここは場所が違いますかね・・(汗
俺達はデジタル化されているがまだ誰も気が付いていないのだ
住基ネット?
微視的に見れば全て離散的
>>985 すいません。勘違いしました。
021 と 201 でしたね。
993 :
デフォルトの名無しさん :03/06/18 22:44
エッ!!そんなこと言わないでくださいヨー・・・ じゃあどこへ行けばいいですかね?あ、986です。
んじゃ、地上波デジタル放送でどうよ
意表をついてデジタル時計で行ってみろ
>>980 これは別物?
((ab)c) (c(ab))
1000
@`
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。