C/C++の宿題やらせてください。8代目。

このエントリーをはてなブックマークに追加
私はC++房。
今まで1年*ヶ月、ほとんど毎日休まず一生懸命C++を勉強してきた。
わからない宿題若しくは処理があったら私にやらせてくださいm(_ _)m

7代目: (前スレ)http://pc2.2ch.net/test/read.cgi/tech/1053963794/l50
6代目: http://pc2.2ch.net/test/read.cgi/tech/1053045530/l50
5代目: http://pc2.2ch.net/tech/kako/1051/10515/1051594046.html
4代目: http://pc2.2ch.net/tech/kako/1045/10450/1045074808.html
3代目: http://pc2.2ch.net/tech/kako/1041/10419/1041992392.html
2代目: http://pc3.2ch.net/tech/kako/1039/10397/1039772622.html
宿題手伝いますYO!!: http://pc3.2ch.net/tech/kako/1038/10380/1038024989.html

ラウンジ:質問が長い時はココを使うと便利
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
>>1
3デフォルトの名無しさん:03/06/08 16:44
おぽんぽん

「n個の自然数(3桁[100-999]をランダムで作る。nはプログラム実行時に入力する。」
「関数実行にかかった時間を計測する(void bubble等)」

問題の一部なのですがここだけお願いします。
5デフォルトの名無しさん:03/06/08 18:26
>>4
timeとかclockとか使えばできるよ。
65:03/06/08 18:28
あ、2つの文は別の要件なのか。
でも、上の条件満たす方法すらわからないようなら、
プログラムなんてやめちゃえ!
7デフォルトの名無しさん:03/06/08 18:30
>>4
そんまえにランダムになんて作れんべ
>>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は全く扱ってないので、
ふつー最適化されちゃって一度しか評価されないんじゃない?
135:03/06/08 19:25
>>12
そんなこと期待するのは勝手だが…
>>11
別に、マシンパワー余ってればいいんじゃない?
それよりも、buf[16]が引っかかった漏れは駄目人間ですか?
16桁だと環境によっては、あふれる予感が...

999,999,999,999,999 = 0x38D7EA4C67FFF

計算違うか?違ってたらごめん。
そんなことより
> void bubble
が引っかかってる奴はいませんか?
165:03/06/08 19:59
>>15
確かに。
ソートにかかる時間がアルゴリズムによってどう変わるか計測
しよとしてるのかなって予想ついたから言わなかったけど…。
>>12
Cの関数呼び出しって、そういう最適化はできないんじゃねーの?
atoi()は標準関数だから、コンパイラが特別に対応すればできるかもしれないけど。
(VC6では最適化してない)
アセンブラコードに落として死ぬまで復唱しろ
19デフォルトの名無しさん:03/06/08 22:26
誰かhttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=78に
あるプログラムにコメントつけてください!
あとCtrl-dで終わるように条件をつけてほしいのですが…
おねがいします
>>19はブラクラ
アドレスにjunkroomって、バレバレだよね
>>19
あのさぁ....


あ、それって、提出したら教授が「excellent」をくれるレベルだと思うよ。
もう十分。
235:03/06/08 22:38
>>20-21は思考停止馬鹿。
24r:03/06/08 22:39
>>20-21
いや、>>1をみろ。長いソース用のうpローダですよ。
>>19
Ctrl-dの話なら前スレでアドバイスがあっただろ
Cで XMLのデータ抜き出す作業 について詳しい方いますか?
いますよ
ちょっと これみてくれませんか?
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1055071590

考えたんですが、わからなくて^^;
>>19
ctrl+d でおわるじゃん。
コメントもついてるじゃん。
>>28
みたよ
どこがいけないんですかね?
32デフォルトの名無しさん:03/06/08 23:08
>>29
もっと詳しいコメントがほしいのです
要するに
「俺でも分かるように説明しろ」
28ですが、
おしえてもらえませんか?
>>34
ここまで複雑なのになると…
フリーでCのXML処理ライブラリってあったと思ったからそれを探してみたほうが早いかも。
どうしても自分で作るというのなら、パーザと内容の解釈を分離したほうがいいと思うな。
そうですかぁ・・・
ありがとうございます
>>35さん
37デフォルトの名無しさん:03/06/09 02:43
@ 
行列の掛け算を行います、行列aとbは4行4列とします。行列aの要素の値は、
各自決めたください。行列bは単位行列とします。

計算はマトリクスの積を使うと便利。
3837:03/06/09 02:43
#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値を自由に決めるってのは、どういうふうに書くんですか
3937:03/06/09 02:45
訂正

ぎょうれつA値〜〜〜〜  

aの値を好きに決めるってのはどういうふうに書くんですか?
a[0][0] = 1;
a[0][1] = 2;
行列の話が出たのでついでに聞きたい。ps2などのvuユニットって直接
行列の計算できるんでしょ?俺今行列を使った透視投影変換で悩んで
るんだが、回転や移動変換なら良く見るから知っているんだが透視投影
変換はどうも良く分からない。(x,y,z,w)があって4*4の何をすれば(x',y')
になるんですか?
スクリーン(例えば平面)に投影するんだから
オブジェクトと視点を結ぶ線分とスクリーン面の交点のスクリーン上での座標を求めれば
R^3→R^2の変換が得られるだろ。それを4x4のでも同じことだ。下に書いてあるとおりだ
http://www.sccs.chukyo-u.ac.jp/~miyazaki/classes/cg/perspective/perspective_lecture.html
43デフォルトの名無しさん:03/06/09 06:45
http://www1.linkclub.or.jp/~aishin/Chorus/Mybara.html

これ聞いてもちつけ
漏れにとっては(・∀・)イイ
44デフォルトの名無しさん:03/06/09 08:11
誰かhttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=78に
あるプログラムにコメントつけてください!
あとCtrl-dで終わるように条件をつけてほしいのですが…
おねがいします
>>44 >>19によく似た質問が挙がっていますよ。
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()のほうがいいよ。
>>51 BMじゃないバージョン。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=79
found_t型のオブジェクトは削除してない。自前で削除よろしく。
>>46
前スレのバイオリズムのお題でそういうことをやってたような気がする。
60デフォルトの名無しさん:03/06/09 17:50
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=80&fi=no
↑にあるプログラムにコメントをつけてください!終了条件はCtrl-dです
上のプログラムを実行すると
Initialize a queue.
   > d
No more data.
   > e programming
Enqueue: [programming]
   > d
Dequeue: [programming]
   > e ALGORITHM
Enqueue: [ALGORITHM]
   > e practice
Enqueue: [practice]
   > d
Dequeue: [ALGORITHM]
   > c
Initialize a queue.
   > d
No more data
   > No more data
となるのですが、↑
        ここを表示させないで終了させたいのです。修正お願いします

> printf("No more data.\n");
これを消せば?
62デフォルトの名無しさん:03/06/09 18:12
>>61実行例があってNo more dataを表示させないといけないので消せません
終了条件がCtrl+Dってどういうこと?
Ctrl+Dを押せばいつでも強制終了じゃないの?
環境にもよるけど、大抵強制終了はCtrl+Cでは。
fgetsの戻り値をチェックしろって前スレに書いてあったろ
コンパイルして実行させたのか?
そのプログラム最後にそんなメッセージ出るはず無いぞ。
そこ、入力行でしょ?
6766:03/06/09 18:28
ああ、そういうことか
Ctrl+Dするとそうなるってことね。
前言撤回
>>60
あれ?そのコード、ちょっと前までコメント付きだったじゃん。
何でコメント削除したの?
if (fgets( command,MAXLINE,stdin ) == NULL) {
 exit(EXIT_FAILURE);
}
>>69
うわー、絶対いっしょに仕事したくないタイプ。
>>70
…はやってんのか?
72デフォルトの名無しさん:03/06/09 19:29
宿題お願いしますw
合計台数とタイヤの総本数を入力して、
自転車と三輪車のそれぞれの台数を表示させるプログラムを作りたいんです。
んで、合計台数とタイヤの数がありえない組み合わせのときは
「無理だ」って表示させるよーにって。
73デフォルトの名無しさん:03/06/09 19:31
fgetsの戻り値をチェック??
74デフォルトの名無しさん:03/06/09 19:34
てか、まったく持ってわからんのですわ。・゚・(ノД`)・゚・。
しかも、ほとんど初めてやる人にこんな宿題出されても
わからんちゅーねんヽ(`Д´)ノウワァァァン
>>73
日本語ですよ。文法的にもおかしくない。
>>74
もう学期始まってから2ヶ月もたってますよ。
>>74
もし、それが本当ならクラスの誰もできてないから安心しろ
>>78
もしまかり間違って正解を持っていったら、
カンニングする要注意人物としてマークされたりしてなw
> 宿題お願いしますw
これでやる気失せた
つるかめ算のたぐいでは?
スレタイよく読んでください
宿題お願いしますウェーハッハッハ
>72
鶴亀ざーーーーーーーーーーーーーーーん
まぁ出題ミスだろうな。
stdioの制御をそこまで求められなければ成らない宿題とは思えない。
>q で終了とかにおするべき問題だな。
>>85
問題はこれ。まったくの初心者にいきなり出来るわけない。
http://pc2.2ch.net/test/read.cgi/tech/1053963794/653
>>86みれないよ。
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個の数字を表示しなさい。

だれかよろしくお願いします。
91くりりん:03/06/09 20:01
鶴亀斬?
92>>87-88:03/06/09 20:01
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;
}
94くりりん:03/06/09 20:03
#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;
95くりりん:03/06/09 20:05
続き
}
>>90
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=76

前スレでも2回同じ依頼があったけど同じ人じゃないよね?
同じ授業を受けてるなら、それを持っていったら目を付けられるかもね。
#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ちゃんに宿題聞きに来る愚奴がこんなにいるって、どんな学校だよ!!
電気通信大学



あ、言っちゃった!
大丈夫だ。東京か大阪か、特定されていない(にや
>>104
イタタタタタタ
2chで宿題をやってもらおうとする愚か者は大阪にはいない。
>>63
Unix なんでしょうな。
fgets では EOF とエラーの区別がつかないから、
エラー処理をするなら feof で検査するしかないね。
ttp://www-ccs.ucsd.edu/c/stdio.html#fgets
そもそも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 となります。
 
120r:03/06/10 00:23
>>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 );
}
1215:03/06/10 00:25
>>120
お前さ、いろいろレスつけてるけど、全然だめだからもうやめとけ。
そのプログラムで、3は1+1+1って答えが出せるか?
122r/120:03/06/10 00:25
>>119
おっと!間違った。

もし、その和の数が100のときは、
1,1,1,1,1,1,....,1
1,1,1,1,1,1,...,2
とか、ぜんぶ挙げるの?
123デフォルトの名無しさん:03/06/10 00:26
うっかり引数をつけないで実行しただけであぼーんか。
124r/120:03/06/10 00:30
>>121
>>全然だめだからもうやめとけ。
なんでさ?
1255:03/06/10 00:31
>>119
再帰関数使えよ。
「重複はみとめる」ってことは重複しなくても解として認めるって
ことだろ。なら簡単だ。
1265:03/06/10 00:32
>>124
「全然だめだから」っつってんだろ。
日本語読めてない時点で全然だめなんだよ。
>>119
分割する数でループ回せばいいのかな。
2・・・1,1,1
1・・・1,2 2,1
0・・・3
って感じで。
簡単ならやってやれよw
ちなみに俺には難しい。
>>125
簡単だとか言うのはコードを出してからにしろ
>>125
配列を使わないと結構、パフォーマンス悪くなる。
131r/120:03/06/10 00:36
>>126
全然だめだと、なんで駄目なんだよ。

「宿題やらせて」ってのに、
「相手のために、宿題をやってやる」ってニュアンスはねーだろ。
「自分のために、宿題をやらせてもらう」なんだよ。
とりあえずコテハンはやめたら?
133デフォルトの名無しさん:03/06/10 00:40
>>127
・・・の左と右の関係はなに?コンマの数?
1345:03/06/10 00:40
>>128
n!の計算とかクイックソートとか勉強すれば思いつくよ。

>>129
この程度思いつかないやつはすっこんでろって。

>>130
え?パフォーマンスは要件に入ってないからかまわんだろ?

>>131
ああ、確かにな。すまん。
135デフォルトの名無しさん:03/06/10 00:42
>>134
だから>>119のためにやってあげなよ。
ここはそういうスレだよ。
>>134
口だけ番長
再帰関数を最初に呼び出す関数にも for 文があって、
再帰関数の中にも for 文がある?ややこしい。
138デフォルトの名無しさん:03/06/10 00:44
>>120
再帰関数を使ってです
>>134
まだ出来ないの?
>>119
LISP版ならこの前かいたんだがな。
簡単だと思ってやってみたけど実は難しかったというパターンかな。
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;
}
150149:03/06/10 01:33
print_listは関数に分ける必要なかったな。
151r/120:03/06/10 01:44
>>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ですね。
152r/120:03/06/10 01:46
>>149
先に出てた...しかも短くて綺麗...鬱。
153出来た予感:03/06/10 01:47

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;
}
154149:03/06/10 01:50
// 簡単に重複取り除けました
#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;
}
>>156
>>156
許容範囲狭すぎ
>>158
> for (i = 1 << (n-1); --i >= 0;) {
で 1<<(n-1)回のループをまわしてる
つまりこの個数分の出力があるってことだろ?
オーバーフローするほどの数だったらそもそも数が多すぎて出力しきれないんじゃないか?
>>159
32が多すぎですか?
>>160
多すぎだろ?
>>161
154のやつだと32入れても数秒で完了するようですが。
>>162
重複取り除いてるからね
>>162
154は
1,1,1,1,1,1,1,1,2も
1,1,1,1,1,1,1,2,1も全部同じものとみなすから出力数が少ない
156は全てのパターンを出力するからその数は桁違いに多くなる
ふむ。n!オーダーで増えるのですね。
重複を取り除いた場合のオーダーは・・・・
もぅねむいや。
>>164
その都度プリン度して、データを溜め込んでるわけじゃないから、
パターン数の多さは関係ないんじゃないの?
167166:03/06/10 02:53
×プリン度
○プリント
どうでもいいが重複を取り除いてもいいってのは125の勝手な解釈じゃないか?
「認める」ってのが、答えに対して認める(=答えに重複が含まれてもかまわない)のか、数列に対して認める(=組み合わせではなく順列)のかわからないが。
まぁまぁ、でもリストつくってそれをスタックにしつつ列挙していくのが正攻法だな。
正攻法かは知らんが(´-`;)かなり巧いテクだな
リストっつったらmallocすることしか考えてなかったよ
再帰してスタック使えばサイズも動的に変えられるもんな
>>170
でも、スタック消費が多くなるね。
mallocしながらグローバルスコープにリストをつくっていったほうが
より大きな数まで処理できるかもしれない。
172デフォルトの名無しさん:03/06/10 07:45
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=80&fi=no
↑にあるプログラムにコメントをつけてください!終了条件はCtrl-dです
上のプログラムを実行すると
Initialize a queue.
   > d
No more data.
   > e programming
Enqueue: [programming]
   > d
Dequeue: [programming]
   > e ALGORITHM
Enqueue: [ALGORITHM]
   > e practice
Enqueue: [practice]
   > d
Dequeue: [ALGORITHM]
   > c
Initialize a queue.
   > d
No more data
   > No more data
となるのですが、↑
        ここを表示させないで終了させたいのです。修正お願いします
すげえムカツク。あぼ〜んしよ
そこまでできていれば十分だと思うんだが。
何も分からないくせに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;
}
>>177
rは糞ってことか。
他にも文句はあるな。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;と書け。
183:03/06/10 14:38
>>179
いや、ほら、main()は適当に書いただけだから...
184:03/06/10 14:41
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);
}

きー文字列を逆にする発送が思い浮かばない罠。

おねがいいたします。
>>185
具体的に
189186:03/06/10 17:03
ありがとう、でも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
まぢ?クラスのメンバ関数内でコンストラクタ呼び出すとそこで
自分自身の一時オブジェクト生成しちゃうの?
だとしたら、今までの俺の理解は激しく違ってたことになるな。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=81

上記のプログラムを配列処理をのこしつつ、ポインタを使用して書き換えよ。

ポインタが理解できないまま機嫌が切れそうなので、よろしくおねがいします。
>>191
コンストラクタ内でthisポインタの値を表示してみればよく分かるよ。
デストラクタの中でも表示したほうがいいかな。
194デフォルトの名無しさん:03/06/10 17:45
>>192
*aってなんだ?
>>192
おまいの機嫌なんかどうでもいいが、なにを書き換えればいいのかいまいちわからん
196192:03/06/10 17:59
>>194-195
*aはポインタをなんとか使おうとした名残ですね、すみません。
*aはjです。
何かしらの形でポインタが使用されていれば良いので、
どこかポインタを使って処理できるところを書き換えればよいそうです。
じゃあ
void (*f)() = print_matrix;
(略)
f(m_C);
とかしてみれば?
>>192
できたよー
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=82

どこをポインタに書き換えればいいかわかんなかったから、
適当にやっといたよー
199デフォルトの名無しさん:03/06/10 18:06
>>193
ほ、ほんとだ。 (゚Д゚;))ガタガタブルブル
知らんかったー。そっか、new CTest()とかでメモリ確保できるのも理解できる。
いや、ほんとサンクスコです。勉強になっただす。
200デフォルトの名無しさん:03/06/10 18:10
配列だからポインタをインクリメントさせて内容みるのがいいんじゃないかな。
それ狙った課題だと思ふ。
201192:03/06/10 18:10
>>198
ありがとうございます〜
202192:03/06/10 18:36
>>200
その場合はどうなるのでしょう?
>>198
ふざけてるのか?
204デフォルトの名無しさん:03/06/10 19:39
(1)テキストファイルがある.各行のデータを,ID,姓名,読み(ローマ字)の
三つの要素をもつ構造体に格納するプログラムを書け.
(2)木とはなにか.また,2分木とはなにか.説明せよ.
(3)(1)でデータを格納した構造体を節点とする2分木を作成するプログラムをかけ.
新しいデータを一行ずつ構造体に読み込んで,木に追加していくこと.必ずポインタを
使って木を実現し(構造体に必要な修正を加えること),データが増えても対処できるようにすること.また,すべての節点をなぞりながら,データ(ID,姓名,読み)を出力できるようにもせよ.その際できるだけ見やすい形に表示するよう工夫すること.
205デフォルトの名無しさん:03/06/10 19:53
C言語でよろしくお願いします。

文字列を圧縮するプログラムを作成せよ
例 aaaabbbcccccdddd

4a3b5c4d
>205
文字列はどうやって与えるのん?
念力
208205:03/06/10 20:26
>>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");
}
>>210
サーバ作らなきゃ駄目じゃん。
>>203
きかないとわかんないのか?
215sage:03/06/10 21:33
10個の数列を配列に格納し、これらの順序を入れ替えて、入れ替え前と
入れ替え後のの前配列要素の値を求めるプログラムを
教えて頂きたい。順序を入れ替えるのはd[0]とd[9]で
お願いしますm(__)m
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉






     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉


>>215
要求定義が意味不明
218215:03/06/10 21:40
>>217
要求定義ってどういうことをさすのですか?
初心者でスミマセン
>>215の問題を提示されて解ける奴はこのスレには一人もいねーっつーことだ
エスパーでも呼んで来い
その説明じゃあどんな天才プログラマでも
何をつくればいいのか分からない。
2215:03/06/10 21:43
簡単だ。
この程度思いつかないやつはすっこんでろって。
222215:03/06/10 21:49
>>5
プログラム作成をどうかお願いしますm(__)m
できる限りのことは頑張ります。
223 :03/06/10 22:00
>>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');
}

}

 
224 :03/06/10 22:04
>>215

>前配列要素の値を求める

'全'配列要素のことか?

というかどういう数列を入れるかが分からんけど、
枠組みだけなら作れると思うよ。
エスパーが簡単だと言ってるから任せてみよう
どんなのが出てくるか楽しみだ
226224:03/06/10 22:07
これはもっと短くできるんだろうか・・
まだまだ初心者なんで、なんか改善すべき点があったら是非教えてくらはい。
227223:03/06/10 22:08

223の間違いです。
>223
配列の初期化ってもっと簡た(ry
C言語でプリンターポートにHEXファイルを出力したいのですが
どうしたらできるのでしょうか?
230215:03/06/10 22:18
>>224
>全'配列要素のことか?
そうです。字を間違えました。
数列は1とか10とか簡単な数字を格納すればいいと思います。



前配列要素の値を求める
がどういうことかを教えてもらいたい。
int d[10];
に数字が入っているとして
d[0]とd[9]を入れ替えて
配列の要素すべて表示すればいいのか?
233224:03/06/10 22:23
>>230
それは数列とは言わんよ。
数字だよ。
>>229
スレ違い
>>229
大まかに2通りあると思うけど。

1.プリンタを直接操作して書き込み <-面倒
2.テキストか何かに出力してプリントアウト <-簡単
236223:03/06/10 22:26
>>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は適当に付けた名前だよ。
他のとこはできると思うよ。
245242:03/06/10 22:40
おっと、数字と文字の並びかたが逆だった。
でも、言いたいことには影響ないな。
察してくだされ。
#define swap(a, b) (a ^= b ^= a ^= b)
247223:03/06/10 22:46
色々指摘してもらってありがたいです。

>>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 〜〜  〜〜   〜〜
・    〜〜  〜〜   〜〜 
・    〜〜  〜〜   〜〜


250249:03/06/10 22:54
(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 どなたかお願いします。
>>249
前スレで出されてたのはダメなのか?
252249:03/06/10 22:56
前にこれを乗せたら、親切な方が@をやってくっれたので、
アルゴリズムとフローチャートを自分で作って提出したら、
その二つが不十分で再提出になりましたT0T

どなたかフローチャートとアルゴリズムお願いします。
とくにアルゴリズムお願いします。

253>96:03/06/10 23:00
>>238
IDとはどういうデータだ?
姓名、読みの文字数は可変か?それとも最大文字数が決まっている?
木に追加するとき、どう追加すればいい?2分木って左の枝と右の枝が
あるわけだけど、どっちに追加すればいい?その条件を明確にしてくれ。
見やすい形とは?
255215:03/06/10 23:01
>>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]);
}

}
こんな感じにできたけど、大丈夫かな?
256223:03/06/10 23:03
>>248
ありがとう。

>int a[100] = { 0 }
こうやるのか!
こっちの方がスマートにかけていいですね。
自分はもっと勉強せんとあかんようです・・
> こんな感じにできたけど、大丈夫かな?
知るか!!
エスパーはどこいった?
258249:03/06/10 23:04
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&rm=100


このスレッドの84番です タイプスクリプトは
259hide:03/06/10 23:07
この宿題解いてください。

#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を、静的変数(または大域変
数)として宣言せよ。二重に計算することのな
いよう工夫すること。

>>259大学の宿題ですか?
ちなみに何年?
261244:03/06/10 23:09
>>255
いやまだ自分は教えられるほど偉くもないんだけど、
俺がアドバイスできることといえば、
変数sはいらないんじゃない?

for( i = 0 ; i < SIZE ; ++i ){
printf("%5d",dim[i]);
}
でどうだろう。
>>259
なんか逆の気がするな。
まず再帰を使わないのから作って、次に再帰関数で
やってみましょーが普通の手順じゃないのかな。
それにグローバル使ってもいいってなんでだろー。
263hide:03/06/10 23:12
>>260
 大学2年です。
 計算機言語という授業の宿題です。
264直リン:03/06/10 23:13
265デフォルトの名無しさん:03/06/10 23:13
>>254
テキストファイルがあるのですがそれを読み込んで
ID,姓名,読み(ローマ字)の三つの要素をもつ構造体に格納します
IDは、番号です!例えばaaa2241見たいな感じです。
姓名、読みの文字数はおそらく不変です。
枝の追加は左の枝と右の枝どっちでもいいと思います(左と右変えると違うのですか?)
見やすい形…おそらく表示させて木とわかればいいと思います!
>>265
そのテキストファイルの内容が知りたいといっているのだよ
>>265
だいたいどれをキーにするの?
268262:03/06/10 23:20
>>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)
のように括弧がついた式になるとスタックに入れる順番が分からなくなって
しまいます。
誰か詳しく教えて頂けませんか?

270225:03/06/10 23:25
こんな感じで?
#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
フィボナッチ数列は定義が再帰(帰納)になってるので、
再帰で実装するのが自然だと思う。
272262:03/06/10 23:30
>>271
んー…しかしたかだか40程度で10秒以上かかってたぞ。
この程度の簡単なものに再帰は効率悪すぎる気がするな。
>>272
うんもちろん。実装が自然かというのといい実装かというのは別の問題。
再帰を使わずに実装できるのならそっちのほうがたいていいい実装だろう。
274262:03/06/10 23:33
なるほど。
>>269
ネタか?
逆ポーランド記法のメリットに括弧を使わずに演算の優先順位を決めれると
いうものがあるのだが。
式変形をするんだろ。
277275:03/06/10 23:35
あ、まだ変換してないのね・・・

逝ってきます・・・
ループはこんなんだと思う。
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
>>280
除去しなくていいです
282デフォルトの名無しさん:03/06/10 23:45
えっちなサンプルムービー多数有ります☆!
http://cg.iclub.to/link/ranran1/
二分木を見やすく表示せよ(通りがけ順)

一例として、たとえば左の子はアルファベットの早いもの、右は遅いものが来る二分木なら、
       d
      / \
     c f
          \
           g

のように
284283訂正:03/06/11 00:00
       d
      / \
     c    f
          \
           g
285デフォルトの名無しさん:03/06/11 00:02
お願いします。
ファイルがあります。
そのファイルには、データがそれぞれ19行×2列あります。
そのファイルのデータを読み込んで、各行のデータの平均と、その平均をつかって共分散を
求めるプログラムをどなたかお願いします。
データの型はdoubleです。
>>285
一行にはどういう形式で列が記録されているのか?
>>114
思いつくままにコーディングしてみた。
検算のためにシュテルマーの公式でπを小数点以下100桁まで計算するプログラム。
とりあえず遅い。固定小数点で計算するやつの数千倍遅い。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=85
288あぼーん:03/06/11 00:06
289まりお:03/06/11 00:07
>>283
なるほど!
後は自分で考えてみます
290283訂正:03/06/11 00:08
二分木を作る関数はわかっているので、それを表示する
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で。
294275:03/06/11 00:25
>>269

>ttp://weinberg.hoops.ne.jp/soft/

誤解したお詫び。
本当は漏れ自身が解こうかとおもたが、スタックの実装がめんどく感じたので却下。
(C++だとstackがあるんだが・・・Cにもある!?)
優先順位の判定をいじればそんなに難しいものじゃないかと。
295 :03/06/11 00:26
ちょっと聞きたいんですけど,今あるファイルを開いて値を読み取っていくという
プログラムをC言語でやってます。そこで
# a a a
36 56

というファイルを読むときに#が現れたらその行は無視して
36と56を用意した変数に格納する。
もし#がないファイルでもきちんと36と56を用意した変数に格納する
というプログラムをCで書きたいのですがどうもうまくいきません。
どなたかちからかしてください
どういう意味であるかどうか聞いているのか分からないけど、標準ライブラリにはない。
そういうものは自分で実装するかライブラリを入手する。
297デフォルトの名無しさん:03/06/11 00:28
>>295
aaa # bbbという行があった場合はどうするんだ?
aaa まで読んであとは無視するのか?それとも行全体を無視するのか?
>>297
一般的に考えると前者だと思うが、
>>295の書き方だと後者にも思えるな。
299295:03/06/11 00:35
すいません説明不足でした。
#がある行は無視します。
300デフォルトの名無しさん:03/06/11 00:37
>>299
じゃあfgetsで読んだ後にstrchrで'#'を探して、NULLが返ってこなければ無視すればいいんじゃないの?
301わからずや:03/06/11 00:39
>>275
返事ありがとうございます。
http://weinberg.hoops.ne.jp/soft/ に行けませんでした。
Cにはstackはありません(たぶん)。stackは配列かポインタで表せます。
優先順位はだいたい分かるんですけど優先順位の判定はどうするんですか?
教えて下さい。
>>299
つまり、「#」のある行は問答無用で無視する訳だな。
それなら、

 1.fgets()で一行読み込む
 2.strchr()で'#'を検索
 3.検索した結果、'#'が見つかれば次の行へ
   見つからなければ、データを変数に格納する

と言うステップを踏めばいい。
303295:03/06/11 00:39
ちなみに#は行の先頭に現れます。
>>300
strchrですか一度やってみます。。
>>293
お早い回答ありがとうございます。これで友人の鼻を明かしてやれそうです。(´∀` )
この辺を集中して学ぶにはどうしたらいいのでしょう?これはポインタ、もしくは構造体なんでしょうか?
ホント馬鹿で申し訳ないです。持ってるビギナー向けの参考書に載ってなくて・・・(´Д⊂
305295:03/06/11 00:46
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にいれる。
307275:03/06/11 00:56
>>301
実は漏れも同じ様な講義を受けたことあるんだが(w

他の演算子と同じように判定すればいいよ。
ただ、最終的にはスタックに残らないような処理にしなきゃいけないのを
忘れないように。
308わからずや:03/06/11 01:10
>>275
親切に有り難うございました。
309無料動画直リン:03/06/11 01:13
310244: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()
>>301
昔、何代目かのスレで作った逆ポーランドへ変換するプログラムが残っていたので
貼っときます。再帰下降構文解析を使っています。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=86
315249:03/06/11 02:20
どなたかアルゴリズムお願いします。

ここなら必ずできる方がいると信じています。

進級できるかな・・・
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
331_:03/06/11 09:45
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
>>333
それのどこが二分木?
336デフォルトの名無しさん:03/06/11 10:03
>>333うまく表示できませんでした。すいません
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
342249:03/06/11 10:53
どなたか助けてください。
アルゴリズムさえわかれば何とかなるんですTT

ラウンジに二分木置いたYO
本当にその「できるだけ見やすく」というのは木らしく表示するという意味なんだろうな?
345まりお:03/06/11 11:15
二分木マダー? (AA略
>>342
提出して不十分と言われたレポートを晒せ
347316:03/06/11 11:35
無視されてるTT
>>347
仕様が違うんじゃない?
どうもIDをキーにするのでは無いらしい。
(だから前もって聞いたのに)
てか、ここがおかしい
>枝の追加は左の枝と右の枝どっちでもいいと思います
>>347
なんだっての?
315にソースがあるけど、これがなんなの?
351350:03/06/11 12:12
ごめん間違い316ね。
でも347と315は別の人なの?
二分木のプログラムは316にあるけど。
352350:03/06/11 12:14
あ、同じひとだね。
何ができないのか良く分からないよ、どっちにしても。
353デフォルトの名無しさん:03/06/11 12:17
2つの文字列が等しいかどうか判定するアルゴリズムをフローチャートを用いて表現せよ。
そのフローチャートに基づいてプログラムを作成せよ。フローチャートは分かりやすさも評
価します。

Cでお願いします
354デフォルトの名無しさん:03/06/11 12:20
キレイな娘のヌード厳選してます☆
http://endou.kir.jp/moe/linkvp.html
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;
}
>>355
大変デンジャラスなコードでつね。
357デフォルトの名無しさん:03/06/11 12:43
>>356
どこが?
>>353
int strcmp( const char *s1, const char *s2 )
{
  while( *s1==*s2 ) /* 比較が一致している間ループ */
  {
    if( *s1=='\0' ) /* s1、s2 共に文字列の終端か? */
    {
      return 0;
    }
    s1++,s2++;
  }
  return *s1 - *s2;
}
>>358
大小比較はいらないと思う。
s1とs2でs1の方が短い場合前方一致になっちゃうよ。
>>359
libcのコードだろ

>>360
・・・・・
>>360
終端文字('\0')が同じ場所にあればif(*s1=='\0') が真となり1がかえる。
s1の方が前にあればforの*s1==*s2が偽となりループを抜け0が返る。
s1の方が後にある場合は上と同じ。
363353:03/06/11 12:50
>>355 >>358
ありがとうございます!
しかしレポートはメールで提出なのでフローチャートを
文字で書かないといけないみたいです
なにかアドバイスをお願いします
>>363
フローチャートはスレ違い
フローチャートを文字でって…
罫線文字か何かで表現するのか?
Visioで作ってメールに添付。
Visioって何ですか?
>>367
自分で調べもせず、すぐ人に聞く癖は直したほうがいいよ。
いいかげんフローチャートみたいなものを学校で教えるのはよして欲しいなあ。
過去の遺物というだけならまだいいが、害悪垂れ流しだからなあ…。
>>369
では何で記述しろというんだ?
過去の遺物でないアクティビティ図ならいいのか?
何も変わるところはないと思うが
むしろ誰が誰になんの目的で見せるものかをはっきりさせればいいかと。
目標を明確にしないで書かせることが多いみたいだから実際あんまり意味ないと思われ。
>>370
箇条書き
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のときはどうするのか」
が書いてないし
>>387
同じ授業を取ってる別人でしょう
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
>>391
行列の要素はいつ入力するんだ?
>>393
ゲーム開始前じゃねーの?
395C語初心者: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
> 最短距離の座標

ってなんじゃらほい。
それから最短経路を求めるのか分岐点のない経路を一つでも求めれば良いのか。
>>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;}
402C語初心者:03/06/11 20:09
皆様、ご返答ありがとうございます。
>>397
> 最短距離の座標
(y,x)座標で迷路のゴールまでの最短距離だと思います。

>それから最短経路を求めるのか分岐点のない経路を一つでも求めれば良いのか。
最終的に 壁を*、迷った所を?、解を0で表示するプログラムになればいいと思います。
様は、壁の座標を*で、最短距離をの座標を0で、残りを?で埋めればよいかと。
よろしくお願いします。
>>400
前にあったかもしれんぞ。
404401:03/06/11 20:16
401のプログラムは最短経路を求めてないんだよな・・・。
405C語初心者:03/06/11 20:17
>>397
> 最短距離の座標
(y,x)座標で迷路のゴールまでの最短距離だと思います。

追加です
単純にこの時の(y,x)の値を表示するだけです。

>>401
ありがとうございます
>>402
日本語が変なのはともかくとして、問題の意味が曖昧だ。
ゴールに到達する経路のうち、最短経路には分岐点はないが、
分岐点のない経路が最短であるとは限らんよ。
どっちを求めればいいんだ?
それとも分岐点のない経路が最短であるような迷路しか
扱わないことを仮定して良いのか?
>>406
>最短経路には分岐点はない
意味がわからん。
>>407
そうだな悪かった。
409C語初心者:03/06/11 20:35
>>402
とりあえず最初に示した、1と0の迷路では
ゴールへの道は一つしかないと思うんですが…。
>>409
Windowsならスクリーンセーバーの迷路を見てみるといい。
片手を壁に当てて迷路をたどると(出口が壁にそってる場合は)必ず出口に出ることができる、という法則。
これだと必ず出口に出ることはできるが、歩く距離は必ずしも短いわけではない。
411C語初心者:03/06/11 20:59
>>410
そういうことですか。
勘違いしていました。
単純に、分岐点の無い経路を求めてください。
C言語でとあるディレクトリの中にあるファイルの情報を取得させたいのですが
なにかイイ関数、いい方法でもないですか?
>>412
「ファイルの情報」とは、サイズ?内容?ファイル名のみ?
OSによっても答えがかわってきそうなので、OSも追記したほうが。
414275:03/06/11 21:11
>>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 );
}
}
415275:03/06/11 21:11
続き...
double func(double x)
{
return x * x * x;
}

void main()
{
double h;
cin >> h; // hを入力

bibun( h );
}
416412:03/06/11 21:19
>>413
とりあえず、ファイル名とファイルサイズが知りたいのです。
環境はUNIXです。
417382:03/06/11 21:23
390さん有難う御座います
ニュートン法というのもよろしかったら教えてください


2分法のやり方教えてください
y=tan(x)-x^x
が0になる点を探したいのですが
二分法でなくても答えが出せるのがあったら
教えてください


>>416
readdir()
>>416
stat
420デフォルトの名無しさん:03/06/11 21:29
421デフォルトの名無しさん:03/06/11 21:30
Cでチャットや掲示板を作るのは可能ですか?
>>421
技術的には可能。
423デフォルトの名無しさん:03/06/11 21:35
では、Cで作ったそれらをWeb上にアップできるのですか?
Cはどのようにして・・・
>>423
web上にアップって意味わからん。
ちなみに板違い
>>423
WebProg板
>>423
躍動感に乏しいが、WebProg板に「C言語のCGIを語りつつ普及するスレ」がある。
http://pc2.2ch.net/test/read.cgi/php/1048393217/l50
>>424
会社のお姉ちゃんが言ってた「ネットワーク上に保存しました」
くらい微妙な言葉だな。
>>423
サーバにソースをアップしてサーバ上でコンパイル。
同じ環境ならコンパイル後にアップしてもいいけど。
429デフォルトの名無しさん:03/06/11 21:45
下記の機能アルゴリズムを設計し,C言語により実装せよ.
「1.任意の個数のint型数値をコンソールより入力された順に保存する.
2.文字列"Sort"の入力により,入力された数値群を降順に並び替える.
3.最大値と最小値の平均値を計算し,2分探索法で検索する.」

設計指針
・ソート部,探索部は,別のアルゴリズムを採用しても利用できるように設計/実装せよ.
・コンソール入力は,scanf()を使い,文字列,記号,整数値以外は,それぞれ別のエラーコードを返し,
入力を継続するようにせよ.
・メモリ節約のため,数値保存のためのメモリは動的に確保せよ.
>>429
マルチやめれ
問題:
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();
>>431
なんというバカにした問題なんだ!!
434デフォルトの名無しさん:03/06/11 23:06
>>433
簡単ですか?ご教授お願い致します
435382:03/06/11 23:38
>>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
再帰を用いたプログラムと、再帰を用いないプログラムとでは、
読みやすさ、計算にかかる手間などは
どう違うのですか?
>>447 C/C++の宿題なのか?
再帰を使った方がたいてい読みやすい。
手間は、階乗なんかだと掛ける回数は同じでも
関数を呼び出すためにスタックに入れて、また返ってくる分再帰は無駄になる。
フィボナッチ数列だと二つに分岐して再帰してさらに分岐した時に
同じ計算をするからさらに手間がかかる。
450デフォルトの名無しさん:03/06/12 01:21
>447,8
c++の宿題です。
451デフォルトの名無しさん:03/06/12 01:23
C++ は C より優れたので、C を忘れましょう。
Javaも勉強しよう
Ruby もなかなか面白い
PHP もなかなかね

とにかくC は捨てましょう
>>451
それは宿題か?
>>451
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();
}
}
460_:03/06/12 03:06
>>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桁。
>>459 宿題じゃないのにそういうことやるような人は、
C FAQ にもあげられている "What every computer scientist should know
about floating-point arithmetic" みたいな概説は読んでおくのが良いと思うなあ。
日本語訳はbit別冊コンピュータ・サイエンス1993年9月号別冊にあったけど、
webにもあるようだ。 ttp://www.google.com/search?q=%22scientist+shoud%22
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って決まってるの?
ぐぐって調べて理解して自分でやってみよう。
>>442の導関数間違ってる
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
アジア大学?
外人?
>>483
どの問題がそうなの?
>>486
>>119ですw
ログ見ててワロタww
>>483
犯人は喪前だ!
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の二次元配列は動くのですがなぜか・・・
コードをみせろ。
492111:03/06/12 19:31
まずfor(;;)をwhile(1)にする
メモリ不足

>>492
釣れますか?
494デフォルトの名無しさん:03/06/12 20:09
C言語2二次元配列でビンゴを作るというものですけどどうすればいいか分かりませんどうか教えてください。
処理手順
3行3列の2次元配列に1から99までの数値を入力する。
そのあと1から99までの数値をランダムにキーボード入力し、予め入力した
3行3列の数値にあうものがあったらその数値を0に置き換える。
当たりが縦又は横に並んだら「ビンゴ」とと何回目の入力で「ビンゴ」となったかを表示する。
>>494 昨日と同一人物?
496495:03/06/12 20:12
フィボナッチ数列の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]);
504382:03/06/12 22:04
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になる点を探したいのですが
教えてくださ
505382:03/06/12 22:11
割線法について  訂正です
>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;
507292:03/06/12 23:31
えー>>293様に教わったキーワードを検索したらやっと理解しかけてきたのですが
検索するファイルの中身が一致したら、その行だけを出力する場合、
どうしたらよいのでしょうか?
strcmp、strncmp使っても全然拾ってくれません・・・
strstr使うと検索文字列全て拾っちゃうし・・・(aokiと入れたらaokiiroまで拾う)(´Д⊂

具体的な記述方法ご教授いただけませんか?
愚案では検索する文字列の文字数で絞ればいいと思っているのですが・・・
エスパー召喚だな
コードを見せろ。
510495:03/06/12 23:45
フィボナッチ数列の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}
512292:03/06/12 23:56
すいません。突込みどころ満載でしょうけど目を瞑ってくださいね。(/ω\)ハズカシーィ
#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したのでは一致しません。

読んだ文字列の最後に改行が付いていればそれを取る、
または、検索したい文字列に改行を付け加えるかすれば良いでしょう。
>>512
キーワードもfgetsしろ
515292:03/06/12 23:58
>>508 >>509が抜けてました。誰に聞いとんだ俺は。(/ω\)ハズカシーィ
あと、愚作はまだ試してません。
516292:03/06/13 00:00
レス早っ!すいません、言われた事を理解&実践してきます。ありがとうございます(´∀` )
>>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);
}
519292:03/06/13 00:34
>>517
あわわわ、ごっごめんなさい。へたれなものでよく分かっていなかったんです。(というか今も)
>>292のテキストのままfgetsを使ったらばっちり拾ってくれました!!

>>518
My God・・・
「これからこうしたいんですけどどうすれば」と打つ前に回答が・・・
あぁ・・・3日悩んでた朕が救われていく・・・ほんとにありがとうございます。
520デフォルトの名無しさん:03/06/13 04:51
初めまして。初めてC++の授業取ってますが、全く分かりません(涙)。
宿題、誰か助けてください・・・。
人の名前と給料の額を入力すると、
厚生年金や車のローンなど、
あらかじめ給料の〇%と決めてある物をそれぞれ計算して出し、
最後にそれらを全部引いた、給料の手取りが出るというプログラムです。
よろしくお願いします m(_ _)m
>>520
「など」ってのはプログラミングできないぞ。
あとC++なの?
Cは理解してる?
設計の方針みたいなものは何にもないの?
クラス構成から考えて来いっていう宿題?
522520:03/06/13 05:21
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
とりあえずその情報だけだと人名を入れる意味がないね。
給料の額が同じなら誰がやっても同じ結果になるんじゃないの?
525520:03/06/13 05:31
人の名前と給料の額は、実行画面での入力です。
説明が悪くてほんとすいません。
いや、そうじゃなくて。
税金とかって、誰がやっても同じなんでしょ?
個人個人で差異のある要素って、給料だけでしょ。

なんで名前入れるの?
>>526
名前を出力するためなんじゃないの?
数値以外の入力処理をさせたいんでは
そうなると、名前と給料入れると

○○さんの手取りは$■■です。

とでも表示すればいいだけのことか。
529520:03/06/13 05:47
仰る通りです。別に名前入れる意味ないですね。
でも、それが宿題の指示だからとしか言いようがないです。
530520:03/06/13 05:49
表示は、名前、給料の額、それぞれの税金の額、
そして手取り額全ての表示です。

>>522
> C++です。問題全部書いていいですか?しかも英語ですいません。

というか問題と仕様は最初にすべて書かないとこうやってやりとりが必要になる。
532デフォルトの名無しさん:03/06/13 05:58
>>530
【最初は】 Hello World 【必ず】
http://pc2.2ch.net/test/read.cgi/tech/1033579539/
533520:03/06/13 06:20
>>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を引き忘れてた。
537520:03/06/13 06:50
>>534
教科書の宿題と全く一緒!

>>535,536
ありがとうございます。
でも初心者過ぎて見ても全く意味がわからないです・・・。
今からこんなんで単位落とさないかかなり心配。
じっくり本読んで勉強することにします。
あれぇ、そんなんでいいの?
C++つうから、まじめにクラスとか作っちゃったよ。
折角だからはっとく。
>>520
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=89
簡単なプログラムにしかレスしないのですね
当たり前だろ。
541デフォルトの名無しさん:03/06/13 08:35
誰か>>500やってください
542デフォルトの名無しさん:03/06/13 09:31
2から数えて100万番目の素数を出来るだけ早く計算するプログラムを教えて下さい。
543542:03/06/13 10:05
Cでお願いします。
>>542
まずはそれだけの計算に耐えられるコンピュータを用意してくれ。
その辺のパソコンで十分。15485863
546542:03/06/13 11:54
>>545
おぉ!
プログラムを見せて貰えませんか?
お願いします(´Д⊂)
548fe:03/06/13 14:19
#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になっちゃうんだけどなんで?
>>548
コンパイラは警告を出さなかった?
>>548
dが0のとき、何が返るでしょうか。
>>548

54
552548:03/06/13 17:10
ああああ…
そうかそうか。
そんな簡単なミスが分からなかったなんて…

ありがとうございます!!
まずキーボードから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;
}
557542:03/06/13 17:49
>>553
ありがとうございました!
>>555>>556
ありがとうございます。
559デフォルトの名無しさん:03/06/13 19:11
>>554のを
Cでおねがいできないでしょうか?
C以外は分からないんで、すみません
きみはCも分かっていない
561デフォルトの名無しさん:03/06/13 19:14
C以外は全く分からないんで。
C++は関数名も何も分からないです
562555:03/06/13 19:17
>>559
555はCでもあるのだが。もちろんC++でも動くはずだ。
とはいえ、typoがあってそのままだとコンパイルとおらねえな。
Cがわかるのならどう直せばいいかもわかるだろう。わかんないかな…
あとエラーチェックはほとんどしてないのでその辺よろしく。
563デフォルトの名無しさん:03/06/13 19:17
誰か>>500やってください
564サンプルです:03/06/13 19:18
★おすすめ★オススメ★
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
:・゜゚・*:.。..。.:*・゜(゚∀゚)゚・*:.。. .。.:*・゜゚・*
・゜゚・*:.。..。.:*・゜(゚∀゚)゚・*:.。. .。.:*・゜゚・*
>>563
さんざん既出なんだよハゲ
既出なのは知っておりますが、解決していないようなので質問します。

下記のプログラムを変更して、要素数が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);
}
> 解決していないようなので
(゚Д゚)ハァ?
568int gcdary {int a[], int n};:03/06/13 21:16
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;
}
過去ログ検索スレになりそうだな
>>569
何もわからんなら教えがいがない…
検索なんて高度なテクニックを持ってるやつはそもそもこのスレには聞きに来ないからな
結局>>569の正解は出てなかった気がするが
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));
}
>>580
elseはいらない。
>>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;

}
>>582
問題をよく読め
>>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;
}
>>583
ん?
586デフォルトの名無しさん:03/06/13 21:57
>>582
ほんと馬鹿みないな質問で恐縮なんですが、
#include <stdio.h>で始まるプログラムでお願いしたいのですが、
そもそも#include <stdio.h>と#include <iostream>は何が違うんですか?
本当にすみません、くだらないこと聞いてしまって…
こんな奴に単位取らせて日本の未来は大丈夫ですか?
>>585
偶数と奇数は知ってるか?
>>588
あー逆になってるね。n%2も好きじゃないけど。
そんなことよりC/C++を分かっていないのに
問題を出してくる>>586の考えが知りたい。
591591:03/06/13 22:23
標準出力関数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;
}
594566:03/06/13 22:57
>580さま、お返事どうもです。

ですが、このままでは任意の数Nを入力することは出来ないので、
main関数も変更しないといけないと思います。
是非よろしくお願いします。
誰かやってくれ・・・
なにを
あまりにもバカバカしいのとあまりにも難しいのはやらない罠
>>594
それくらい自分で追加しろヴォケ
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;
}
601580:03/06/13 23:25
>>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);
}
>>599
>>316を応用しろ、つってもできねえんだろうなあ・・・
603デフォルトの名無しさん:03/06/13 23:32
>>602
わかりません
>>599
で、学生のデータは入力用ファイルにどのように書かれているの?
こっちで勝手に決めつけてもいい?
605デフォルトの名無しさん:03/06/13 23:51
学籍番号,姓,名,性別の様にカンマでくぎられていればいいです
606サンプルです:03/06/13 23:54
★おすすめ★オススメ★
http://endou.kir.jp/betu/linkvp2/linkvp.html
:・゜゚・*:.。..。.:*・゜(゚∀゚)゚・*:.。. .。.:*・゜゚・*
・゜゚・*:.。..。.:*・゜(゚∀゚)゚・*:.。. .。.:*・゜゚・*
>>601
君、情報系学部?
608607:03/06/13 23:58
ごめん間違い、見なかったことにして。
見ました
610見ました:03/06/14 00:11
見ました
611デフォルトの名無しさん:03/06/14 00:35
うん。みなっかったよ。
612599:03/06/14 00:36
お願いします。締め切りまであと2週間なんです!
>>612
おい、たっぷり時間あるじゃねぇか!
アルゴリズムの本一冊買えばそこに答えがあるよ
配列を回転するプログラムを作成…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
>>624
コードが短く出来ていいな。
626615:03/06/14 02:42
>616〜625さん、レスありがとうございます〜
…617さん…ワライマシタ(ヲ
問題はどーやってディスプレイに配列と表示させるか…(マテ
622さん、解答ありがとうございます…まだこっちで試してはいませんが

そして…ネタを提供してくれた教授、ありが…なんて言うか、カエレ!
教授なのか!!一か八か勝負だな
628 :03/06/14 02:56
>>601
なかなかいいコードかくね。
if文のなかを==0と書くところがいいな,わかりやすくて。
ロジックは return y>0 ? gcd(y,x%y) : x; としないと負数が与えられたら
abs付ければいいんだよ
unsignedじゃだめなの?
>>631
何が?
>>632
負数が与えられたらまずいとか言っているから。
>>502やってけろ
これって面倒な部類に入りまつかね・・?
>>634
for(i=0;i<nyuryoku_sareta_kosu;i++)
if(hairetsu[i]>=shikiichi)
printf("%d ",hairetsu[i]);
>>502
>>503 にあるじゃん
>>632
与えられてもまずくはない
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--)
ここじゃないかな。
反復挿入法に該当するページが見つかりませんでした。
>>599
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=91
↑に問1のソースを置きました。
問2は他の人にやってもらってください。オーダーとかきちんと勉強したことないんで…
>>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
焦りすぎ
>647
明解C言語と見た
650649:03/06/14 17:23
>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
ありがとうございます(ノд`)
お陰できちんと書けました
>>651
とりあえず=と==は違うぞ
>>654
== は等しければ真、等しくなければ偽

とテキストに書いてあります。頑張ります・・・
>>650
そこはどうでもいいだろ
657646:03/06/14 17:33
だー今初期の間違いに気づいた・・・・
代入してどう汁んだ・・・
int Count = (x==y) + (y==z) + (x==z);
switch(Count){
case 3: puts("3つとも同じ。");break;
case 1: puts("一組同じ。");break;
case 0: puts("全てことなる。");break;
}
>>658
X
>>657
凡ミスは誰にでもある。がんがれ
>>659
何が?
trueは1だと保証されないだろ。
c 言語では、 偽は0、それ以外の数値は全て真
関係演算子は真なら1、偽なら0を出す
考え方の順序がおかしいのでは?
たとえば(5 == 5) は必ず1を返す
0 以外は 真であるので (5 == 5) =true
ということじゃないのか?
話にならんな
667658:03/06/14 17:51
関係演算子の戻り値は 0 か 1 でしょうよ。
正式な仕様書とか読んだことないけどw
668デフォルトの名無しさん:03/06/14 17:51
ぬるぽ
>>665
その知識は何処から得たの?
670658 != 665:03/06/14 17:58
 
じゃぁ両方に答えて欲しいな。>>669
http://www.catnet.ne.jp/kouno/c_faq/c9.html#2
↑を読む限りでは >>659 が間違っていると思うが
コンパイラがANSI Cに準拠してさえいれば、x==yとかx!=yとした場合に返ってくる値は0か1だぞ。
674デフォルトの名無しさん:03/06/14 18:54
>>644をやってくれた方したの問題のご教授お願いします
テキストファイルはの名簿である.各行のデータを,ID,姓名,読み(ローマ字)の
三つの要素をもつ構造体に格納するプログラムを書け.
テキストファイルの内容例↓
aaa0101,井川慶,igawa/kei(aaa0101)
>組み込みの演算子によってブー ル値が産み出されるときは、1か0であることが保証されている

φ(..)メモメモ
>>674
そのフォーマットどっかで見たような…
>Javaは死滅

φ(..)メモメモ
678デフォルトの名無しさん:03/06/14 19:21
井川遥ってだれ
>井川遥ってだれ

φ(..)メモメモ
パシャ パシャ  パシャ パシャ パシャ  パシャ パシャ パシャ パシャ パシャ
   パシャ パシャ パシャ パシャ パシャ  パシャ パシャ パシャ  パシャ  パシャ
 ∧_∧      ∧_∧     ∧_∧  ∧_∧    ∧_∧     ∧_∧
 (   )】      (   )】    (   )】 【(   )    【(   )    【(   )
 /  /┘ .   /  /┘.    /  /┘ └\ \   └\ \   └\ \
ノ ̄ゝ     ノ ̄ゝ      ノ ̄ゝ     ノ ̄ゝ    ノ ̄ゝ     ノ ̄ゝ
>>674
どこがわからないの?
必要な処理は

・ファイルから読む
・構造体に格納する

の2つだが

682681:03/06/14 19:26
その間にもう一つ、
・読み込んだデータを要素に分ける
ってのがあるか
>>674
>>238に同じ問題が書かれてあって、
>>316にその解答ソースの在り処が書かれている。
>>500にも同じ問題が書かれてあって、
>>501>>316をみろと書かれてある。
>>541>>500をやってくださいと書かれてあって、
>>547>>501をみろと書かれてある。
>>563にも>>500をやってくださいと書かれてあって、
>>565にさんざん既出だと書かれてある。

どこまで同一人物かは知らんけど、
>>316のソースをみてから何かいってくれ。
>>684
暇人だな
>>685
必死だな
687デフォルトの名無しさん:03/06/14 19:58
>>316じゃ表示できないんですけど
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
入力したか?
>>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
>>692の様になるんですけど、木と分かるように表示させたいのです
>>327>>341の様に
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);
}
698697:03/06/14 21:04
あーだめか、いまいちうまくいかないな。
>>697
そんな感じでOKです
700デフォルトの名無しさん:03/06/14 22:02
>>697もう少し!!!!!!!!!!
701デフォルトの名無しさん:03/06/14 22:03
http://jbbs.shitaraba.com/computer/6765
Cを勉強するならここしかない!
コピペ宣伝中
>printf("%*c --L--", depth * 2, ' ');

こんな書き方できるんやね。
インデントあわせに便利やね。しらんかった。
703デフォルトの名無しさん:03/06/14 23:00
"textfile"という名前のファイルを読みとり標準出力に出力するプログラムを作成せよ。
ただし、連続する改行文字はひとつの改行文字にして出力すること。
704703:03/06/14 23:01
言語は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;
}
707316:03/06/14 23:40
ちょっとバグ情報を…
× char name[ID_LEN];
○ char name[NAME_LEN];

× Display_r(0, root->left);
○ Display_r(1, root->left);
>>706
だめぽですな

#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");
711646:03/06/15 01:11
やべーわかんない・・・Cの宿題なんですが・・・
三つの最大を求めるプログラムを改造して、どの変数が最大だったかを
表示するようにせよ。ただし、二つ以上の変数が同時に(同じ値で)最大
だった場合は、それらの変数の名前をすべて出力しなければならない。

どなたかご指導お願いします(ノд`)
712646:03/06/15 01:16
>二つ以上の変数が同時に(同じ値で)最大
だった場合は、それらの変数の名前をすべて出力しなければならない。

この部分が出来ません(ノд`)
ありえないぐらい長い文書いてしまいます
713デフォルトの名無しさん:03/06/15 01:17
>>711
改造元になるソースキボヌ
714646:03/06/15 01:24
三つのプログラム(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;
}
717646:03/06/15 01:58
>>715
>>716
ありがとうございまつ(ノд`)
正の整数を読み込んで、素因数に分解するプログラムをお願いします。

[考え方]
 除数を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;
}
>>719
違う
>>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
>>718
では、再帰版をば。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=92
余分に '*' が表示されるのは勘弁してくださいな。
723デフォルトの名無しさん:03/06/15 19:03
最近おもしろい宿題がないね
>>724
ほとんど読み飛ばし。問題の条件が曖昧なのとか、
以前答えが出てるのに同じ問題が何度も何度も書かれるとか(本人は1度目なのかもしらんが)。
あとちょっと仕事の片手間に答えるには難しすぎる問題とかw

最後のは興味深く読んで頭のなかでコードを浮かべたりするんだけど、
結局時間がなくてできないw
俺は能力不足でできないw
727arc:03/06/16 14:26
下の反復構造を再帰関数に書き換えるのですが誰か教えてくださいませんか?
これは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
734732:03/06/16 16:16
2重で書き込んでスマソ
>>731
longやintは整数型で小数点以下が無い。そして小さな値しか扱えない
float,doubleは小数点の概念がある。そして桁数が大幅にアップ。
精度はそれぐらいえらいぜって意味
736646:03/06/16 16:18
三つの変数をx、y、zに読み込む。
これらを大きさの順に並べ替えて、その順に出力するプログラムを書け。
出力の1行目に最小値、2行目に2番目の値、三行目に最大値を入力すればよい。
二つが等しくて、残る一つがそれらより大きい場合、1行目と2行目は同じ値になる

という問題なのですが、同じ値になった場合どうやって表示させればよいのかわかりません。
どなたかご指導お願いします(´・ω・`)
737デフォルトの名無しさん:03/06/16 16:21
自分の名前をローマ字で表し、アスキーコードを変数に代入して、
自分の名前をアルファベットで表示させるプログラム。はどう造ればいいですか?
>>737
意味が分からん
>>736
できてるプログラムを見せなさい。
おなじ値じゃなければわかるんでしょ?
740732:03/06/16 16:28
素数を求めるアルゴリズムをみんなに説明してください。
そして、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
748646:03/06/16 16:33
>>739
(;´д`)同じ値という条件でなくてもわからないです・・・
>>743
char[]
750646:03/06/16 16:37
>>744
すごい・・・
でもまだ一年生なので学校では
while,for,if,else,and,or,printf,scanf,intしか習ってません(;´д`)
この範囲で組むにはどうしたらよいでしょうか?

すいませんわがままばっかりで・・・
>>750
その範囲で組んでるジャン。
関数習ってない?
ほなら
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);
}
754753:03/06/16 16:44
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になる)
をもう一度する必要がある。
755732:03/06/16 16:46
お願いします。
あの問題が気になって仕方がないです。
>>755
ソクラテスの篩を検索してくれ。
>>755
じゃあ、少しは調べろよ
>>755
よくわからんが、答えを書いたらおまえが添削するってことか?
ヤナコッタ
エラトステネスのふるい だ、ごめん
760756=759:03/06/16 16:50
横文字の名前はわからん...
>>759
ネタじゃなかったのか……

>>755
これ最強
http://wwwhomes.uni-bielefeld.de/achim/prime_sieve.html
762646:03/06/16 16:52
>>754
ありがとうございます
763arc:03/06/16 17:08
>>728
入れてみてもなんか出来ませんでした。
誰か分かる人727の問題を教えてください。
>>741 にはだれもつっこまないの?
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
ちょっとした調べものに・・・
http://mypage.odn.ne.jp/home/dongrico
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);
>>771>>773
一箇所ずつ間違えるのはわざとかい?
775771:03/06/16 22:45
わり、適当にやってたから

>> 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
すみません、以下のサイトに書いてある問題がわかりません。

http://www.fun.ac.jp/icpc/problems/C/C.html

アルゴリズムだけでもいいのでお願いします。
総当り、またはGAで。
781サンプルです:03/06/17 00:08
☆皆さんの応援が頼りです。頑張ってまーす!!☆
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
>>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;
}
>>779の問題を誰か日本語に訳してちょ
#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]);
}
}
}
}
785782:03/06/17 00:17
ごめん、負の数のときの処理忘れてた。

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;
}
786782:03/06/17 00:26
あー、よく考えたら全然ダメだ。すまそ
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だ。。。ウツダ
800( ○ ´ ー ` ○ ):03/06/17 01:13
>>798-799
>>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
>>771>>773の間違いって何?
>>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
>>805
でできるんだねスマソ
>>803
少しは頭使え
>>807
少しは気をつかえ
Cでアナログ時計作れと言われて作っているのですが
アニメーションさせるあたりが全く分からなくて困っています
どんな命令を使うのか教えてください
お願いしますm(__)m
>>795
>このプログラムをグラフの上限値をじゆうに設定できるようにするには
意味不明。
それから、ソースを載せるなら省略せずに全部載せろ。
#できれば私が出勤するまでにv
>>809
標準Cでは無理。ウインドウズアプリケーションなら、Win32APIと言うのがあって、
ドットを打てる関数があるので、その点で時計を表示する。SetPixelとか、速度に
こだわるなら、BitBltとか。
アニメーションはまず止まっている時計を書けるようにする。
次に引数によって針の角度が変えられる止まっている時計をかけるようにする。
後は、時間を得られる関数を引数にして、時計の表示→消す→表示を繰り返す。
>>809
ディスプレイに表示する限りどうがんばってもアナログにはならない
出題者にお前は脳みそが腐っているから病院へ逝けと言っておけ
Cで組み込み制御すると言うのなら話は別だが
>>812
うわー、頭いいねー、すごーい
チゴイネ
815811:03/06/17 11:16
>>812
その手があったか。
816デフォルトの名無しさん:03/06/17 11:18
>>812
ディスプレイだとある意味アナログかもしれないよ
それを言い出すと、針を使っていてもクォーツを使っている限りアナログ時計にならない罠。
この世界は、不連続な物質と、不連続な時間から成るデジタル名世界ですよ?
>>817
針の動きは一定でこそないがアナログさ(w
(n秒の位置からn+1秒の位置へ瞬間移動するわけじゃないから)
>>801
何ゆえに標準エラー出力?
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;
}
全角スペースに気をつけてください
824823:03/06/17 12:38
>>823
ifがネストしているみたいに
なってますがネストしてません。
全角スペースでずれました。すいません
825821:03/06/17 12:49
>>823>>824
あ、ありがとうございます!!
これから講義なんで終わったらやって見ます!
本当にありがとうございました〜
>>822
class test{
public:
  void foo();
  test(){foo();}
};
同じ処理をするものを作っておいて、
コンストラクタはそれを呼ぶようにする。

宿題ではないのなからスレ違いだな。
827826:03/06/17 12:54
ないのなから…
>>826
822の目的とは多少違うだろ
スレ違いにマジレスしてやる義理は無いが
根本的にクラスとして初期化された実体がないのに、通常のメンバ関数を呼ぶ時点で謝り
newが領域の確保しかしていないと思っているのだろうか?
呼ぶのなら関数にstaticを付けるべき
>>822
クラス内にコンストラクタと同じ処理の関数をPublicで作り、
コンストラクタはそれを呼ぶ。
>>826と同じことを言っているようだが「コンストラクタと同じ処理」を
外部に公開しないですむ。
謝りー>誤り
832826:03/06/17 13:06
>>828
>>829
そうですね。言われて気がつきました。もう引っ込みます。
>>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;
}
837835:03/06/17 13:45
>>836
はやっ

後日に友達から教えてもらった先生の解答は
printf( "%s\n", array ) だった。

...ちなみに折れは思いつかなかった。
838836:03/06/17 13:50
ループを使わない→各要素を羅列する→つまらん
  →各要素を連結する→最初から切れ目を作らない
以上v
839835:03/06/17 14:06
最後が"yz"だからうまくいくんだよねぇ。
アルファベットが27文字だったら4文字ずつ区切ったのだろうか。
840画像処理か:03/06/17 14:10
>>795
ピンク色の本に洗脳されすぎ。
それから,INT_MINってなに?どこで定義されてる?
842836:03/06/17 14:13
>>839
例えば12文字。
char const array[][3] = {
"abc", "def", "ghi", "jkl", "",
};
INT_MINも知らないくせに偉そうな口が叩けるんですね(^^;
844835:03/06/17 14:16
>>842
なる。考えればあたりまえかも ;;
アラインメントは大丈夫か
>>845
何の話だ?
847デフォルトの名無しさん:03/06/17 17:08
この日本語だけでつたわるかどうか不安なのですが、こんなんでました。

コマンドプロンプトからファイル名を一つだけ読み込み、 そのファイルを開いて数字列を読み込み、 平均値を求め、標準出力に表示するプログラムを作成せよ。

というのがUNIX Cの授業で出ました。
がくがく。
どなたかおねがいいたしますー。
ファイルの中身を見せろ
>>846
sizeof (*array) == 3 でない可能性があるという事だろう。
850847:03/06/17 17:14
失礼しました。
ファイルの中身は、
たとえば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);
}
853852:03/06/17 17:33
間違えた
×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しか格納できないから、それじゃだめ
865864:03/06/17 19:54
じゃぁどうするかというと、文字ではなく文字列として扱う。
star++;
で星が増えていくわけじゃないぞ。
867863:03/06/17 20:02
根本的に間違ってました。
自分は寝惚けてたんでしょうか
868863:03/06/17 20:02
>>866
warata
870863:03/06/17 20:16
>>866
恥を忍んで聞かせていただきます。
では、どのようにしたらいいですか?
>>870
ループで出力したい個数だけ改行を打たずに★をプリントし、
その後一個改行を出力。

それを行数分繰り返す。
>>870
printfで★一つ表示。
printfをn回実行。
873863:03/06/17 20:23
★はどのように宣言すればよいでしょうか。
>>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
の方がよくない?
>>873
ここいってみては?
http://jbbs.shitaraba.com/computer/6765/
あんたみたいな人が盛り上げられるかもしれん
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回ループすればいい。
883880:03/06/17 20:52
ん〜、難しすぎて分かりません。
僕も超初心者ですから
>>883
char *s = "★"; //sに星マークをセット

printf("%s",s); //★ を表示

printf("%s",s);を2回実行 //★★ を表示

printf("%s",s);を10回実行 //★★★★★★★★★★ を表示
885880:03/06/17 21:02
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("★");
}
関数でくくれ。
>>885
forの使い方理解してる?
>>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やったことない漏れには分からない。
どういう動きなのか説明してもらえんかの
892890:03/06/17 21:10
あ、ごめん、勘違いした。
893デフォルトの名無しさん:03/06/17 21:12
1回から10回★を印字する
894デフォルトの名無しさん:03/06/17 21:13
>>886分かりやすい!!!!
>>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
>>896
しょっぱなから改行かませるの
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
>>905
おながいします
909デフォルトの名無しさん:03/06/17 21:53
906です。902とかぶってた。鬱々…
>>907
相手しなきゃ良いじゃん。(「あ、そう」で良いじゃん)
そもそも労力に見合うって何よ。
ここは自己満足の為に書き込むスレざんしょ。
だから簡単な問題で自己満足するんだな。
911デフォルトの名無しさん:03/06/17 21:59
912。。。:03/06/17 22:00
 三種類の括弧(),{},[]が並んだ文字列を読みこみ、括弧のつじつまがあっているか
を検査するプログラムを作りたいのですが。
そんな君達にささげるスレ
http://pc2.2ch.net/test/read.cgi/tech/1055749538/l50
914649:03/06/17 22:04
>912
フラグを立ていろいろする
>>903
Cの本持ってんなら、
制御文のところをよ〜く読んで、
あとは自分で考えろ。
>>912
宿題なら宿題らしく。
カウンタの加減算で良いのでは?
917デフォルトの名無しさん:03/06/17 22:09
>>912
作ればいーじょん。
918912: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++の宿題ってあるんだろうか?
「循環参照をおこさないスマートポインタのテンプレートを書け」
とかだされたら俺できないよ
>>933
高校の数学でやったろ
>>934
再帰使うと書けるよ
>>935
厨房に言っても・・・
938デフォルトの名無しさん:03/06/17 23:52
>>937
ガーソ。
ズボシジャン
939デフォルトの名無しさん:03/06/17 23:58
>>935
高校なのか?
漏れは小学校でやったが
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までだったと思うが
中学生の時に理科年表か何かで見て知った。
>>949
おなじだべ
>>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;
}
956955:03/06/18 01:23
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);
>>960
ほんとだ。ワロタ。
963will:03/06/18 19:51
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1055933323

これは2個のサイコロの目を足して出た数をカウントするというものなのですが
カウントしてヒストグラムの表示がうまくいきません。
分かる人、誰か教えてください。
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に。
これと同じ人ならば、配列の要素の順序は移動する。
http://pc2.2ch.net/test/read.cgi/tech/1055864305/49-

968デフォルトの名無しさん:03/06/18 21:09
死にてーな。どうしたらいいかな。
>>968
Kill();
>>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,…てのがずれてる気がするけどそこは自分でなおしてね
>>964
すぐに思いつくのはこれの前後を組にしていく方法。
http://pc2.2ch.net/test/read.cgi/tech/1055864305/49
それ以外だとこれ。
http://pc2.2ch.net/test/read.cgi/tech/1055864305/56
並びに関しては、できる組合せ全てに対して上記の操作を行えばよい。

でも、2個目の方法だと同じものが重複して出てくるのを
どうやってさければよいかが思いつかないな。

例えば4つの時、
abcd
境界は012
これの組合せは6通り、
012 (((ab)c)d)
021 ((ab)(cd))
102 ((a(bc))d)
120 (a((bc)d))
201 ((ab)(cd))
210 (a(b(cd)))
021と201が同じだということをどうやって判別するか。
972デフォルトの名無しさん:03/06/18 21:51
Cのコンソールで、あるところをクリックしたら
〇〇を表示するって可能ですか?
Cのコンソールときたか
974972:03/06/18 22:07
やっぱ不可能ですか?
>>972
ブラウザでアクセスすれば?
976972:03/06/18 22:10
ブラウザでアクセスっすか。
う〜ん・・
メンソーレ
>>972
>クリック〜
マウスを使う時点で環境依存。無理。
いま、20030618と出力されているのを、
2003年06月18日と出力せよ。
980964:03/06/18 22:29
>>965
場所は入れ替わりOKです。
ただ、(ad) と (da) は同じとみなします。
>>967
http://pc2.2ch.net/test/read.cgi/tech/1055864305
は私です。
>>971
これも私です。
たとえば 012 と 021 は最後の3つが一緒なので、
それを判別するだけです。
なんですけど、うまい方法が分からないのです。
>>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とか、カメラは出てしまいました。なんかわからない・・・・
こーゆーのって、ここは場所が違いますかね・・(汗
>>983
どういう計算だ、そりゃ?

>>986
正解。
>>986
板違いも甚だしい
俺達はデジタル化されているがまだ誰も気が付いていないのだ
住基ネット?
微視的に見れば全て離散的
992964:03/06/18 22:42
>>985
すいません。勘違いしました。
021 と 201 でしたね。
993デフォルトの名無しさん:03/06/18 22:44
エッ!!そんなこと言わないでくださいヨー・・・

じゃあどこへ行けばいいですかね?あ、986です。
>>980
> ただ、(ad) と (da) は同じとみなします。
こんな条件があるなら、これしかないような気がする。
http://pc2.2ch.net/test/read.cgi/tech/1055864305/49
んじゃ、地上波デジタル放送でどうよ
意表をついてデジタル時計で行ってみろ
>>980
これは別物?
((ab)c) (c(ab))
1000
@`
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。