トップページ⇒tech
1001コメント433KB

ぼるじょあがC/C++の宿題を片づけますYO! 47代目

■ このスレッドは過去ログ倉庫に格納されています
0001ぼるじょあ ◆yBEncckFOU 2005/07/05(火) 09:19:12
(・3・)アルェー C++房のぼるじょあですYO!
わからない宿題を片づけますYO!

――【注意点】―――――――――――――――――――――――――
・質問は必ず【質問テンプレ】に従ってください。
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
・計算問題は必ず数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
・複雑なAAはスレが荒れたり問題が埋もれる原因になりますので使用を控えてください。
―――――――――――――――――――――――――――――――

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS:Windows/Linux/等々
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C/C++/どちらでも可 のいずれか
[4] 期限:yyyy年mm月dd日hh:mmまで または 無期限 のいずれか
[5] その他の制限:どこまで習っているか、等々

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

【前スレ】
C/C++の宿題を片付けます 46代目
http://pc8.2ch.net/test/read.cgi/tech/1119514274/

【歴代スレは>>2-13】
0159デフォルトの名無しさん2005/07/06(水) 23:17:19
>>156-157
お上手。勉強になります。
0160デフォルトの名無しさん2005/07/06(水) 23:20:10
>>149
「二で割る」の所に「割った余りをs[index]に記録」みたいなのが足んないんだと思う。
フローチャート通りだと計算の記録を残すところが無いし。
0161デフォルトの名無しさん2005/07/06(水) 23:23:23
>>156
なんでEDなんだよw
0162132005/07/06(水) 23:24:01
>>158さん
有難うございます。
講師には、「二で割る」〜「商≠0」の部分がいくつか欠けているといわれました。
とりあえず「変数int index =0,left = 0 を宣言 」など頭のほうにつけてみましたがよく
わかりません。余りを保存(記憶?)のチャートはどの部分に入りますか?
0163デフォルトの名無しさん2005/07/06(水) 23:24:54
>>145
君が「C++ではなくCだ」と書いておかないからだ
0164デフォルトの名無しさん2005/07/06(水) 23:28:53
>>145
質問
・引数として渡されたchar配列に変換結果を書き込んでそれを戻り値と
 して返すの?
 それとも新たに中で動的に確保したポインタを返すの?
01651372005/07/06(水) 23:38:44
>>131
バグ修正版。
致命的なものは少ないので面倒ならスルー可。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/678.zip
01661452005/07/06(水) 23:52:04
>>163
おっしゃるとおりです。というか、追加で出されたものでして

>>164
引数はそのままの値を保持します
新たに確保して返せばそれで大丈夫のはずです
0167デフォルトの名無しさん2005/07/06(水) 23:54:09
>>166
当然呼び出し側でfreeすることになるんだけれども、そういうプログラムで
いいのかな?
0168デフォルトの名無しさん2005/07/06(水) 23:54:40
>145
void btox(char *x, char *b)
{
int len, xch, i, j;
len = strlen(b);xch=0;
for(i=0;i<len%4;i++){
xch <<= 1;xch |= b[i]-(b[i]>9?'a':'0');
}
x[i/4]=xch+(xch>9?'a':'0');
while(i<len){
xch = 0;
for(j=0;j<4;j++){
xch <<=1;xch |=b[i]-'0';i++;j++;
}
x[i/4]=xch+(xch>9?'a':'0');

}

void xtob(char *b, char *x)
{
int len, xch, i, j;
len = strlen(x);len *= 4;i=0;
while(x[i] != '\0'){
xch = x[i]-(x[i]>9?'a':'0');
b[4*i]=!!(xch & 0x8)+'0';
b[4*i+1]=!!(xch & 0x4)+'0';
b[4*i+2]=!!(xch & 0x2)+'0';
b[4*i+3]=!!(xch & 0x1)+'0';
}
b[4*i] = '\0';
}
01691582005/07/06(水) 23:55:56
>>13
講師は C 言語のプログラムを適当に間引いたものが欲しいのではなく、
単に文を象形文字化したものが欲しいだけ。
だから i=i+1; とかは
「i に 1 を足す」でも「i を 1 増やす」でもなく、
「i に 1 を足したものを i に代入する」と完璧機械的直訳をすれば Ok
a[b]=c[d]; なら
「配列 c の d 番目の要素を配列 a の b 番目に代入する」とかね。
プログラムの意味なんか全然考えなくていいよ。
0170デフォルトの名無しさん2005/07/06(水) 23:56:36
>>127
そのシリーズたまにやってくれ。
おもろいw
01711452005/07/06(水) 23:57:30
連投すみません

>>145の 余計にわからなく〜は
streamを使うやり方はよく解ったけど、
char配列でうまく処理できない、ということで
お答えをいただいて余計に混乱した、ということではないです
気分を害した方がいらっしゃったら、ごめんなさい
01721452005/07/06(水) 23:58:58
>>167

はい、ダメなようなら
こちらで頑張って修正したいと思ってます
0173デフォルトの名無しさん2005/07/07(木) 00:01:50
フローチャートを使うなら、ループ記号も使ってあげてください。
0174デフォルトの名無しさん2005/07/07(木) 00:14:03
>>168
おお!なるほど・・・ありがとうございます!

あと、xtobの方で疑問に思ったのですが、
b[4*i]=!!(xch & 0x8)+'0'; あたりの
"!!" と "+'0'" の意味はなんなんでしょうか・・・?
もしよろしかったらお答えを聞きたく思います


01751452005/07/07(木) 00:14:43
興奮していろいろ忘れた・・・145ですorz
01761672005/07/07(木) 00:17:02
>>172
新しく確保するよりバッファを渡す方がCらしいわな。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
char* to_radix_n(unsigned int x, char* s, int n) {
    int index = 0, left = 0, digit;
    char temp;
    do {
        digit = x % n;
        s[index++] = digit > 9 ? digit - 10 + 'A' : digit + '0';
    } while (x /= n);
    s[index--] = '\0';
    while (left < index) {
        temp = s[left];
        s[left++] = s[index];
        s[index--] = temp;
    }
    return s;
}
unsigned int from_radix_n(char* s, int n) {
    unsigned int x = 0, i, len;
    for (i = 0, len = strlen(s); i < len; i++) (x *= n) += isdigit(s[i]) ? s[i] - '0' : toupper(s[i]) - 'A' + 10;
    return x;
}
int main(void) {
    char s1[256], s2[256];
    printf("Enter Number:"); scanf("%255s", s1);
    printf("%s(16) = %s(2)\n", s1, to_radix_n(from_radix_n(s1, 16), s2, 2));
    printf("Enter Number:"); scanf("%255s", s1);
    printf("%s(16) = %s(2)", s1, to_radix_n(from_radix_n(s1, 2), s2, 16));
}
01771672005/07/07(木) 00:20:25
>>168は頭いいんだろうなぁ…
0178デフォルトの名無しさん2005/07/07(木) 00:22:02
>>174
!!→二重否定。つまり、0は0、1は1、2も1、以下同様に。
+'0'→一桁の数値を文字に。つまり、0は'0'、1は'1'、2は'2'、以下同様に。
0179デフォルトの名無しさん2005/07/07(木) 00:23:09
tに何か値が入っているとき1を、
0が入っているときに0をセットしたいときに
x = !!tとすると
否定の否定でxに値があれば1、なければ0が入る。

"+'0'"はx=!!tと
下二式から考えてみて
'0' = '0' + 0;
'1' = '0' + 1;
0180デフォルトの名無しさん2005/07/07(木) 00:24:00
>>104
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/679.c
01811682005/07/07(木) 00:25:30
xtobの
len = strlen(x);len *= 4
入らなかった削除しといて。
01821682005/07/07(木) 00:27:26
>179はむちゃくちゃ言っちゃってるな書き直し

tに何か値が入っているとき
xに1を、0が入っているときに0をセットしたいときに
x = !!tとすると
否定の否定でtに値があれば1、なければ0がxに入る。

"+'0'"はx=!!tと
下二式から考えてみて
'0' = '0' + 0;
'1' = '0' + 1;
0183デフォルトの名無しさん2005/07/07(木) 00:31:03
>>176
これまた別のやり方・・・すごく参考になります
mainまで気を配っていただいて、ありがたい限りです

>>181
了解しました

小さな質問にも答えていただいて感謝です
お二人のを参考に仕上げて行きたいと思います

本当にご親切にありがとうございました
01841682005/07/07(木) 00:33:40
while(x[i] != '\0'){
xch = x[i]-(x[i]>9?'a':'0');
b[4*i]=!!(xch & 0x8)+'0';
b[4*i+1]=!!(xch & 0x4)+'0';
b[4*i+2]=!!(xch & 0x2)+'0';
b[4*i+3]=!!(xch & 0x1)+'0';
i++;//ここが抜けてたたびたびすまん
}
01851452005/07/07(木) 00:38:49
>>184
あ、わかりました〜

とりあえず自分はまず名前とsage練習ですねorz
なんにせよ助かりました、もう一度、ありがとうございました
0186デフォルトの名無しさん2005/07/07(木) 00:42:23
不完全でわるいが、こんなんどーぉ?
static void uint2b_sub(char **, int);
char *uint2b(char *buf, int n)
{
  char *s = buf;
  uint2b_sub(&s, n);
    *s = '\0';
  return buf;
}
static void uint2b_sub(char **s, int n)
{
  if (n > 2)
    uint2b_sub(s, n / 2);
  *(*s)++ = "01"[n%2]; /* ここがトリッキーだよなぁ・・・ */
}
0187デフォルトの名無しさん2005/07/07(木) 00:43:23
if (n > 2) → if (n >= 2)だった。鬱だ寝よう。
01881482005/07/07(木) 01:10:10
すみません、148です。よくわからないんですけど多分表示っていうのは参照
するってことなんだと思います。説明不足ですみませんでした。それと、もしよかったら
削除と挿入だけでもいいのでどなたかやってもらえないでしょうか?
0189デフォルトの名無しさん2005/07/07(木) 01:16:59
>>188
> [3.3] 言語:C/C++/どちらでも可 のいずれか
どれだよw
0190デフォルトの名無しさん2005/07/07(木) 01:42:10
[1] 授業単元: Cプログラミング
[2] 問題文(含コード&リンク): キーボードからchar型変数 str1 , str2 にそれぞれ
文字列を入力する。str2 を str1 に連結し、str1 の内容を出力するプログラムを作成せよ
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン): VC++ 6.0
 [3.3] 言語:C
[4] 期限: 無期限

こんな感じに書きました↓
01911902005/07/07(木) 01:42:24
#include <stdio.h>

void main(){
char str1[128],str2[128],*p_str1,*p_str2;

p_str1 = str1;
p_str2 = str2;

printf("1: "); scanf("%s",p_str1);
printf("2: "); scanf("%s",p_str2);

//文字列 str1 の終点のアドレスがポインタに代入された状態にする
for( ; *p_str1 != '\0' ; p_str1++ );
//連結
for( ; *p_str2 != '\0' ; *p_str1++ = *p_str2++ );
//p_str1 を出力 たぶんここが悪い
for( p_str1 = str1 ; *p_str1 != '\0' ; p_str1++ )
printf("%c",*p_str1);
printf("\n");
}

たぶん出力するところの条件がおかしいんだとは思うんですが。。。
色々考えてはみたものの結局答えは出ず。どなたかご教授願います
0192デフォルトの名無しさん2005/07/07(木) 01:53:18
>>190
残念そこじゃない。そのコードでは末尾に'\0'が付加されない。
//連結
while (*p_str1++ = *p_str2++) {}
0193デフォルトの名無しさん2005/07/07(木) 01:53:35
>>191
> //連結
> for( ; *p_str2 != '\0' ; *p_str1++ = *p_str2++ );

これだと、'\0'の手前でコピーが終了してstr1の末尾に'\0'がつかない
のに、
後で出力時にはstr1の末尾に'\0'がついていることを期待しているのが
問題。

連結は、
while (*p_str1++ = *p_str2++);
でよい。コンパイラが警告を出すならば、別に無視しても構わないが
気になるなら
while ((*p_str1++ = *p_str2++) != '\0');
とでも書けばよい。
0194デフォルトの名無しさん2005/07/07(木) 01:53:54
かぶった
01951902005/07/07(木) 02:17:12
ウホッ
>>192,193
サンクス!
0196デフォルトの名無しさん2005/07/07(木) 03:20:43
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):要素数が10個の整数型配列を、任意のデータで初期化し、
その要素の最大値と最小値を求めるプログラムを作りなさい
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:7月8日迄
[5] その他の制限:配列、ソート、サーチ処理までしか習っていません。
よろしくお願いします
0197デフォルトの名無しさん2005/07/07(木) 03:35:51
>>196
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b){return *(int*)a - *(int*)b;}
int main()
{
  int a[] = { 1, 4, 2, 0, 5, -3, 3, 3, 4, 7 };
  qsort(a, 10, sizeof(int), cmp);
  printf("(max, min) = (%d, %d)\n", a[0], a[9]);
  return 0;
}
0198デフォルトの名無しさん2005/07/07(木) 03:36:58
逆だった

× printf("(max, min) = (%d, %d)\n", a[0], a[9]);

○ printf("(mim, max) = (%d, %d)\n", a[0], a[9]);
0199>1482005/07/07(木) 03:48:47
#include <stdio.h>
int find(int key, int tblSize, int *tbl)
{ int i;
for(i=0; i<tblSize; ++i) if(tbl[i]==key) return i; /* あった */
return tblSize; /* なかった */
}
int ins(int val, int prevNum, int maxSize, int *tbl)
{ int now;
if(prevNum+1>=maxSize) return -1; /* もう挿入できません */
tbl[now=find(val,prevNum,tbl)]=val;
return (now<prevNum)?prevNum:now+1;
}
int del(int key, int tblSize, int *tbl)
{ int pos=find(key,tblSize,tbl);
if(pos>=tblSize) return tblSize; /* ないから消せない */
if(pos<tblSize-1) tbl[pos]=tbl[tblSize-1];
return --tblSize;
}
int main(void)
{ int i,cnt=0,tbl[10]={0},maxSize=sizeof(tbl)/sizeof(tbl[0]);
/* 追加 */
for(i=2; i<=10; i+=2) cnt=ins(i,cnt,maxSize,tbl);
/* 削除 */
cnt=del(4,cnt,tbl);
/* 表示 */
for(i=1; i<=10; ++i) printf("%d:%s\n", i, (find(i,cnt,tbl)<cnt)?"あった":"なかった");
return 0;
}
0200デフォルトの名無しさん2005/07/07(木) 03:59:40
int i,min,max,a[] = { 1, 4, 2, 0, 5, -3, 3, 3, 4, 7 };
min=max=a[0];
for(i=1; i<sizeof(a)/sizeof(a[0]); ++i){
if(min>a[i]) min=a[i];
if(max<a[i]) max=a[i];
}
printf("(max, min) = (%d, %d)\n", max, min);
0201デフォルトの名無しさん2005/07/07(木) 09:21:55
[1] 授業単元:C言語
[2]
英数字と半角スペース、特殊文字(’や#など)からなる英文文字列を入力し、この文字列から英数字のみからなる単語に切リ出して出力するプログラムを作成しなさい。入力・出力例については、下記の入力・出力例を参照のこと。
ただし、プログラムの仕様は下記の通りです。
(1) 英数字は、英数字以外の文字が出てきたら、そこまでを切り出す。
(2) 数字から始まる系列や数字のみ、特殊記号のみの系列を単語とはみなさない。
(3) 各単語は出現順に二次元文字配列に格納され、最後にこの二次元文字配列に格納された単語を順番に出力して終了する、という形式のプログラムとする。
(4) 全角文字は考えなくてよい。


------------------------------
[入力・出力例]
[345:] This is the machine134. -> 444 (Read the “document”!!! ).


単語=This
単語=is
単語=the
単語=machine134
単語=Read
単語=the
単語=document
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):VC++ 6.0
 [3.3] 言語:C++
[4] 期限:7月7日まで
宜しくお願いしますm(__)m

0202デフォルトの名無しさん2005/07/07(木) 10:12:51
[1] プログラミング基礎
[2]
strcpy関数とstrncpy関数の二つの機能を併せ持つ関数を自作せよ。
[3]
 [3.1] Linux
 [3.2] コンパイラ(バージョン):
 [3.3] C++
[4] 期限:7月8日まで
[5] オーバーロード、テンプレートを出来れば使用して欲しいです

よろしくお願いします。
0203デフォルトの名無しさん2005/07/07(木) 10:45:01
>>202
特にstrncpy()の機能の部分について仕様を詳しく。
#あんな妙な挙動を再現しろというのなら私はパスする。
0204デフォルトの名無しさん2005/07/07(木) 10:53:24
[1]授業単元:C++言語
[2]2次元配列で表現された迷路がある.現在の位置を○で示している.
立ち往生することなく,○がいつまでも迷路内を移動し続けるプログラム
maze.cpp を作成しなさい.但し,クラスを利用すること.
もちろん壁を通り抜けることはできない.また,画面左上がスタート地点
である.なお,キー入力によりプログラムの中断とポーズ,および表示待ち時間
の増減を行えるようにしなさい.

[2.1]迷路の表現について
迷路は,int 型の2次元配列で表現することができる.
例えば,壁=1,道=0,現在位置=9という値であると定義すれば,
配列要素を調べることで何を表示すればよいかが分かる.

[2.2]迷路内の移動について
○は現在座標(x, y)を持っている.この座標値(x, y)を
ループの中で毎回更新することで,○が迷路内を移動して行くように
見せることができる.表示が速すぎると移動の様子が確認できないので,
適宜,空ループを利用することで待ち時間を作り,擬似的に表示速度の増減を行えば良い.

[2.3]迷路の探索アルゴリズムについて
迷路は固定されているが,○は進行方向によって東西南北の
どちらを向いているかが変化する.


[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):VC++ 6.0
 [3.3] 言語:C++

[4] 期限:7月8日まで
よろしくお願いします。
0205デフォルトの名無しさん2005/07/07(木) 11:09:27
宿題ラッシュ
0206デフォルトの名無しさん2005/07/07(木) 11:30:45
>>204
仕様が穴だらけだ。
・描画に関して
どこにどう描画する? その手段は?
授業で既に何かを描画しているのならそれを利用すべきではないのか?
・迷路に関して
迷路の大きさは? 生成手段は?
授業で既に迷路を作成(r
・迷路探索に関して
分岐に到達した場合の移動方向は?

って、面白そうだけど結構分量ありそうだな。私ゃパスだ。
0207>>2022005/07/07(木) 11:34:14
#include <numeric>
template<typename Type>
Type* Func(Type* lpDest,const Type* lpSource,size_t count = std::numeric_limits<size_t>::max()){
size_t i = 0;
for(;i < count && lpSource[i] != '\0';i++) lpDest[i] = lpSource[i];
if( i < count) lpDest[i] = '\0';
return lpDest;
}
0208デフォルトの名無しさん2005/07/07(木) 11:45:14
#include <stdlib.h>
void d2b(int i);
int main()
{
int i;
printf("2進数に直したい10進数の正の整数を入れてください,負の数の場合は終了です\n");
scanf("%d",&i);
if(i<0 || i>255){
exit(i);
}
else if(i >= 0){
printf("10進数表示%dの2進数表示は,\n ",i);
d2b(i);
printf("です.\n");
}
}
void d2b(int i)
{
int a[8],x;
for(x=0;x<8;x++){
a[x]=i%2;
}
for(x=7;x>=0;x--){
printf("%d\n",a[x]);
}
printf("\n");
}
計算結果が、変な値になってしまいます、教えてください。
0209デフォルトの名無しさん2005/07/07(木) 11:51:26
208ですが、よーやく、わかりました、ありがとうございました。
0210デフォルトの名無しさん2005/07/07(木) 11:52:18
>>208
> for(x=0;x<8;x++){
> a[x]=i%2;
> }

for(x=0;x<8;x++,i>>=1){
a[x]=i%2;
}
0211デフォルトの名無しさん2005/07/07(木) 11:53:11
>>201
その1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <ctype.h>

void split(char *str, char **buffer) {
  char *start, *ptr;
  int length, num = 0, skip = 0;
  start = str;
  for (ptr = str; *ptr != '\0'; ptr++) {
    if ((isdigit(*ptr) || !isalpha(*ptr)) && (ptr - start) == 0) {
      skip = 1;
    }
    if (!isalpha(*ptr) && !isdigit(*ptr)) {
      if ((length = ptr - start) != 0 && skip == 0) {
        buffer[num] = (char *)malloc(sizeof(char) * length + 1);
        strncpy(buffer[num], start, length);
        buffer[++num] = (char *)NULL;
      }
      start = ptr + 1;
      skip = 0;
    }
  }
}
0212デフォルトの名無しさん2005/07/07(木) 11:53:23
>>201
その2
int main(int argc, char **argv) {
  char buffer[4096], *tokens[1024], *token;
  int i = 0;
  printf("Input String (Max length is 4095) : ");
  fgets(buffer, 4095, stdin);
  split(buffer, tokens);
  while ((token = tokens[i]) != (char *)NULL) {
    printf("Token: %s\n", token);
    ++ i;
  }
  return 0;
}
0213デフォルトの名無しさん2005/07/07(木) 11:55:15
>>208
ただ「変な値になる」ではなく、きちんと実例を挙げて説明したまえ。
0214デフォルトの名無しさん2005/07/07(木) 11:57:47
>char buffer[4096], *tokens[1024], *token;
>printf("Input String (Max length is 4095) : ");
>fgets(buffer, 4095, stdin);
この辺が馬鹿。
0215デフォルトの名無しさん2005/07/07(木) 11:58:36
>        buffer[num] = (char *)malloc(sizeof(char) * length + 1);
この辺も馬鹿。
02162072005/07/07(木) 12:08:26
#include <numeric>
template<typename Type>
Type* Func(Type* lpDest,const Type* lpSource,size_t count){
size_t i = 0;
for(;i < count && lpSource[i] != '\0';i++) lpDest[i] = lpSource[i];
if( i < count) lpDest[i] = '\0';
return lpDest;
}
template<typename Type>
Type* Func(Type* lpDest,const Type* lpSource){
size_t i = 0;
for(;lpSource[i] != '\0';i++) lpDest[i] = lpSource[i];
lpDest[i] = '\0';
return lpDest;
}

>>202
一つの関数で済まそうとするとダメダメだったことに気づいた
0217デフォルトの名無しさん2005/07/07(木) 12:12:31
>>203
言葉足らずでした。すいません。
strcpy(s1,s2)の時にs1にs2をコピーする。
strncpy(s1,s2,n)の時はs1にs2の先頭n文字がコピーされる。

という事です。
0218デフォルトの名無しさん2005/07/07(木) 12:16:30
>>207
ありがとうございます。
既習範囲をぶっ飛んでてちょっと厳しいですが
もう少し勉強して参考にさせていただきます。
0219412005/07/07(木) 12:16:57
>>42
はい、割り勘です。
もし、割り切れなかった場合はM君が余りを支払います。
0220デフォルトの名無しさん2005/07/07(木) 12:19:54
[1] 授業単元: プログラミング基礎
[2] 問題文(含コード&リンク): eのx乗は次の式で近似される。
eのx乗=1+x+xの2乗/2!+・・・+xのn乗/n!+・・・
xが入力されると、n乗の項の絶対値が10の-5乗より大きい間、
eのx乗の値を計算して、答えを出力するプログラムを以下の手順で作成せよ。
(1) 上記の近似式を漸化式で表しなさい。なお、漸化式とは第n項を第n-1項以下の
値を使って表現したものである。
(2) 漸化式を利用して、プログラムを書きなさい。
 [実行例]
  eのx乗を計算します。xを入力せよ→1
  eの1乗は2.71828です。
  eのx乗を計算します。xを入力せよ→0.1
  eの0.1乗は1.10517です。
  eのx乗を計算します。xを入力せよ→-1
  eの-1乗は0.367879です。

[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン): Cygwin(よく分かりません…)
 [3.3] 言語:C++
[4] 期限:今日中なんです…
[5] その他の制限:問題文の指示通り、漸化式を利用して作る

期限が悲惨ですが、どなたかお願いします…
0221デフォルトの名無しさん2005/07/07(木) 12:43:57
(1)
E(n)=E(n-1)+(x^n)/(n!), n>0
E(0)=1

(2)
double E(double x, unsigned int n)
{
  double result;
  static double term = 1.0;
  
  if (n == 0)
    return term = 1.0;
  
  result = E(x, n-1);
  term *= x / n;
  
  return result + term;
}
02222212005/07/07(木) 12:55:08
>>220
おっと、漸化式を

E(n) = E(n-1) + T(n-1)*x/n, n>0
E(0) = 1, T(0) = 1

に変更しておこうかな。
mainは自分で書いてくれ。

unsigned int N = 100; /* 適度にデカい数字 */
/* x にユーザから入力 */
printf("eの%f乗は%fです。\n", x, E(x, N));

って感じ。あ、C++か。
std::cout << でw
0223デフォルトの名無しさん2005/07/07(木) 13:05:48
>>222
おお…なんとも素晴らしく早い対応ありがとうございます!
今から引用させてもらいますW
0224デフォルトの名無しさん2005/07/07(木) 14:06:58
[1]プログラミング
[2] 問題文
void List(struct LIST *pt){
while(pt != NULL){
printf(" %d",pt -> a);
pt = pt -> nextptr;}
putchar('\n');}
これを繰り返し構造ではなく関数の再帰呼び出しを用いて表せ
[3] 環境
 [3.1]Linux
 [3.2]gcc
 [3.3]C
[4]明日まで
[5]できれば説明もつけていただけるとありがたいです
よろしくお願いします
0225デフォルトの名無しさん2005/07/07(木) 14:17:01
>>224
void List(struct LIST *pt){
if (pt == NULL) {
putchar('\n');
} else {
printf(" %d",pt -> a);
List(pt->nextptr);
}
}
解説:再帰(的)関数。リスト構造。などでぐぐれ。
0226デフォルトの名無しさん2005/07/07(木) 14:42:04
#include<stdio.h>
#define N 200
#define INF 100000
#define fixed 2
#define in 1
#define out 0

struct station{
int num;
char name[20];
};
int start,mark[N],dist[N],length[N][N],n=0;
struct station data[N];

void read_graph(void);
void write_dist(void);
void Dijkstra(void);

main(){
read_graph();
printf("start point = ");
scanf("%d",&start);
printf("\n");
start=start-1;
Dijkstra();
write_dist();
}
0227デフォルトの名無しさん2005/07/07(木) 14:42:28
void read_graph(void){
int i,j,k;

for(k=0;k<N;k++){
n+=1;
scanf("%d",&data[k].num);
scanf("%s\n",&data[k].name);
if(data[k].num==-1)k=N;
}
for(i=0;i<N;++i)
for(j=0;j<N;++j)
length[i][j]=INF;
printf("start node,end node,edge length\n");
for(k=0;k<N;k++){
scanf("%d %d",&i,&j);
if(i==j)k=N;
scanf("%d",&length[i-1][j-1]);
length[j-1][i-1]=length[i-1][j-1]; /*(j-1,i-1)と(i-1,j-1)の距離を同じに書き換える*/
}
}
0228デフォルトの名無しさん2005/07/07(木) 14:42:56
void write_dist(void){
int i;

for(i=0;i<n-1;++i){
printf("distance[%15s] = %d\n",data[i].name,dist[i]);
}
}

void Dijkstra(void){
int m,i,j,k,v,temp;

for(i=0;i<N;i++)
dist[i]=INF;
dist[start]=0;
for(i=0;i<=n-3;i++){

for(k=0;k<n-1;k++){
for(m=0;m<n-1;m++){
if(length[k][m]<INF){
if(dist[k]+length[k][m]<dist[m]){
dist[m]=dist[k]+length[m][k];
}
}
}
}
}
}
0229デフォルトの名無しさん2005/07/07(木) 14:47:29
#include<stdio.h>
#define N 200
#define INF 100000
#define fixed 2
#define in 1
#define out 0

struct station{
int num;
char name[20];
};
int start,mark[N],dist[N],length[N][N];
struct station data[N];

void read_graph(void);
void write_dist(void);
void Dijkstra(void);

main(){
read_graph();
printf("start point = ");
scanf("%d",&start);
printf("\n");
start=start-1;
Dijkstra();
write_dist();
}
0230デフォルトの名無しさん2005/07/07(木) 14:48:20
>>225様迅速な対応ありがとうございました
0231デフォルトの名無しさん2005/07/07(木) 14:48:29
89ですがプログラマのみなさんでも無理でしょうか?.....
0232デフォルトの名無しさん2005/07/07(木) 14:49:16
void read_graph(void){
int i,j,k;

for(k=0;k<N;k++){
scanf("%d",&data[k].num);
scanf("%s\n",&data[k].name);
if(data[k].num==-1)k=N;
}
for(i=0;i<N;++i)
for(j=0;j<N;++j)
length[i][j]=INF;
printf("start node,end node,edge length\n");
for(k=0;k<N;k++){
scanf("%d %d",&i,&j);
if(i==j)k=N;
scanf("%d",&length[i-1][j-1]);
length[j-1][i-1]=length[i-1][j-1];
}
}
0233デフォルトの名無しさん2005/07/07(木) 14:50:27
void write_dist(void){
int i;

for(i=0;i<N;++i){
if(mark[i]==fixed)printf("distance[%15s] = %d\n",data[i].name,dist[i]);
}
}

void Dijkstra(void){
int i,j,k,v,temp;

for(i=0;i<N;i++)mark[i]=out;
dist[start]=0;
mark[start]=in;
0234デフォルトの名無しさん2005/07/07(木) 14:50:57
for(;;){
for(i=0;(i<N)&&(mark[i]!=in);++i);
if(i==N)return;

for(v=i++;i<N;++i)if((mark[i]==in)&&(dist[i]<dist[v]))v=i;
mark[v]=fixed;

for(i=0;i<N;++i)
if(length[v][i]<INF){
temp=dist[v]+length[v][i];
if(mark[i]==in){
if(temp<dist[i])dist[i]=temp;
}
else if (mark[i]==out){
dist[i]=temp;
mark[i]=in;
}
}
}
}
0235デフォルトの名無しさん2005/07/07(木) 15:23:10
次は、Rubyで長方形のクラスを定義し、インスタンスを一つ作り出しているものです。C言語で同様のプログラムを作成しなさい。
class Rectangle
def initialize(x1,y1,x2,y2)
@x1 = x1
@y1 = y1
@x2 = x2
@y2 = y2
end
attr_accessor :x1,:y1,:x2,:y2
end

rect1 = Rectangle.new(10,10,20,20)
p rect1

printf("長方形の対角の座標は(%d %d)と(%d %d)です。\n",rect1.x1,rect1.y1,rect1.x2,rect1.y2")
0236デフォルトの名無しさん2005/07/07(木) 16:11:57
いやです。
0237デフォルトの名無しさん2005/07/07(木) 16:16:26
そもそもCだと出来ねーし
0238デフォルトの名無しさん2005/07/07(木) 16:19:26
>>89
#include <stdio.h>
int main( void )
{
FILE *pf; int i, m, n, x, y; char f[ 256 ];
for ( m = 0; m != 3; ) {
printf( "\n1. Output file. - function.dat\n2. Output file. - n_xy.dat\n3. Exit program.\n>" ); scanf( "%d", &m );
switch ( m ) {
case 1 :
pf = fopen( "function.dat", "wb" ); if ( pf == NULL ) break;
for ( x = 0; x <= 1001; x++ ) { y = x * x;
for ( i = 0; i < sizeof( int ) / sizeof( char ); i++ ) fputc( ( ( char * )&x )[ i ], pf ); for ( i = 0; i < sizeof( int ) / sizeof( char ); i++ ) fputc( ( ( char * )&y )[ i ], pf ); }
fclose( pf );
printf( "Success." );
break;
case 2 :
printf( "Number = " ); scanf( "%d", &n ); if ( n < 0 || 1000 < n ) break;
pf = fopen( "function.dat", "rb" ); if ( pf == NULL ) break;
fseek( pf, n * sizeof( int ) * 2, SEEK_SET );
for ( i = 0; i < sizeof( int ) / sizeof( char ); i++ ) ( ( char * )&x )[ i ] = fgetc( pf ); for ( i = 0; i < sizeof( int ) / sizeof( char ); i++ ) ( ( char * )&y )[ i ] = fgetc( pf );
fclose( pf );
sprintf( f, "%04d_xy.dat", n ); pf = fopen( f, "wt" );
if ( pf == NULL ) break;
fprintf( pf, "x = %d\n", x ); fprintf( pf, "y = %d\n", y );
fclose( pf );
printf( "Success." );
break;
}
}
return 0;
}
02391482005/07/07(木) 16:45:30
148です、返事遅くなってすみません。199さんありがとうございます。
助かりました、まだコンパイルも実行もしていないので今からしてきます。
本当にありがとうございました。
0240デフォルトの名無しさん2005/07/07(木) 16:49:39
同様ってんだから似てりゃいいんじゃないの?

>>235
#include <stdio.h>
#include <stdlib.h>
struct Rectangle { int x1, y1, x2, y2; };
struct Rectangle * new_rect(int x1, int y1, int x2, int y2);
void kill_rect(struct Rectangle * p);
int main()
{
struct Rectangle * rect1;
rect1 = new_rect(10, 10, 20, 20);
printf("長方形の対角の座標は(%d %d)と(%d %d)です。\n", rect1->x1, rect1->y1, rect1->x2, rect1->y2);
kill_rect(rect1);
return 0;
}
struct Rectangle * new_rect(int x1, int y1, int x2, int y2)
{
struct Rectangle * p = (struct Rectangle *) malloc(sizeof(struct Rectangle));
p->x1 = x1;
p->y1 = y1;
p->x2 = x2;
p->y2 = y2;
return p;
}
void kill_rect(struct Rectangle * p)
{
free(p);
}
02411482005/07/07(木) 17:17:59
すみません、148です。説明不足でした。私が言いたかったのは例えば
実行時にコマンドとして
「address」と入力すると添え字を聞かれ数字を入れると添え字を指定できる。
「show」と入力すると指定した添え字に対応する要素を参照できる。
「delete」と入力すると添え字を聞かれ数字を入れて指定した要素を削除できる。
「insert」と入力すると添え字を聞かれ数字を入れて指定した所に要素を挿入できる。
ということで、そういったプログラムを作ることを教授が課題として出しました。
0242デフォルトの名無しさん2005/07/07(木) 17:28:17
>>241
要素を削除ってのが消した上で詰める&挿入が一切上書きせずに間に追加するって
意味でいいなら完全に線形リストだが、それでいいならいくらでもサンプルコード
あるからググってみれ
02431482005/07/07(木) 17:37:44
242さん、ありがとうございます。線形リストっていうんですか。
さっそくググってきます。
0244デフォルトの名無しさん2005/07/07(木) 17:52:29
ファイル内に下記のようなデータがあって

あいうえお,1,8
かきくけこ,2,16
さしすせそ,4,32

Cのプログラムで"かきくけこ,2,16"を削除して間を詰める方法を教えてください
0245デフォルトの名無しさん2005/07/07(木) 17:55:54
>>244
途中だけ削る事はできない
0246デフォルトの名無しさん2005/07/07(木) 18:00:18
>244
mmapして、memmoveして、ftruncateしたら?
0247デフォルトの名無しさん2005/07/07(木) 18:03:29
>>244
あいうえおとさしすせそを別ファイルにコピーして、元のファイルを消し、
作ったファイルを名前を元のファイル名にする。
0248デフォルトの名無しさん2005/07/07(木) 18:07:18
>>245、246、247
ありがとうございます

可能なものから試してみます
0249デフォルトの名無しさん2005/07/07(木) 18:17:08
system("sed -e '2d' < srcFile > destFile; mv destFile srcFile");
0250デフォルトの名無しさん2005/07/07(木) 20:08:29
[1] 授業単元:プログラミング及び演習
[2] 問題文(含コード&リンク):
符号なし関数xのposビット目を、1にした値を返す関数set、0にした値を返す関数reset、
反転した値を返す関数inverse
unsigned set(     unsigned x, int pos) { /* ・・・ */ }
unsigned reset(   unsigned x, int pos) { /* ・・・ */ }
unsigned inverse(unsigned x, int pos) { /* ・・・ */ }
を作成せよ。

[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:7月8日(金)まで

おねがいします
0251デフォルトの名無しさん2005/07/07(木) 20:10:40
posビット目は右(LSB)から数えるのか、それとも、左(MSB)から数えるのか?
また、posは0から始まるのか、それとも、1から始まるのか?
0252デフォルトの名無しさん2005/07/07(木) 20:14:09
set(...) { return (x | (1U << pos)); }
reset(...) { return (x & (~(1U << pos))); }
inverse(..) { return (x ^ (1U << pos)); }
0253デフォルトの名無しさん2005/07/07(木) 20:17:23
>>251
そういったことは指定されてません。
0254デフォルトの名無しさん2005/07/07(木) 20:19:30
じゃ、決めてください。
0255デフォルトの名無しさん2005/07/07(木) 20:21:13
set(...) { return (x | (1U << (INTBITS - pos - 1))); }
reset(...) { return (x & (~(1U << (INTBITS - pos - 1)))); }
inverse(..) { return (x ^ (1U << (INTBITS - pos - 1))); }
0256デフォルトの名無しさん2005/07/07(木) 20:23:26
>>254
右から数えてposは0からでお願いします
0257デフォルトの名無しさん2005/07/07(木) 21:52:17
>>256

>>252
02581482005/07/07(木) 23:16:49
すみません、148です。「線形リスト」と「サンプルコード」でググってみましたが
サンプルコードが載っているサイトが見つかりません。なんてググればいいでしょうか?
それと、線形リストじゃなくて配列ではできないでしょうか?

■ このスレッドは過去ログ倉庫に格納されています