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

C/C++の宿題を片付けます 75代目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/10/19(木) 20:39:01
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。
【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して
 投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】
http://www.linux.or.jp/JM/index.html

【前スレ】
C/C++の宿題を片付けます 74代目
http://pc8.2ch.net/test/read.cgi/tech/1158844912/
【過去スレ一覧】
http://makimo.to/cgi-bin/search/search.cgi?q=C%2B%2B%82%CC%8Fh%91%E8&andor=AND&sf=2&H=&view=table&D=tech&shw=2000
0369デフォルトの名無しさん2006/10/27(金) 12:42:05
>>368
いやそうではないだろう。
表示部分のように二重ループがないとちゃんとソートされた出力が
出来ない事から、オーダーはO(N^2)だろ。
0370デフォルトの名無しさん2006/10/27(金) 12:54:44
いや、出力部のループはO(N^2)じゃなくてO(N)だよ。それに>>368で書いたような出力でいいなら定数時間だし。
#勿論、値域が狭い(というか取り得る値のバリエーションが少ない)ことが前提ね。

具体的な応用としてはこういう何かの成績みたいなものとかグレイ256諧調画像の濃度分布とかね。
0371デフォルトの名無しさん2006/10/27(金) 12:58:41
http://www1.cts.ne.jp/~clab/hsample/Sort/Sort7.html

調べてみたらビンソートらしい。
0372デフォルトの名無しさん2006/10/27(金) 13:45:22
>>351 面倒なので全部纏めて。課題4-1は勘違いしてるかもしれない。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2831.txt
0373デフォルトの名無しさん2006/10/27(金) 13:47:22
>>369の言うように364のコードだとO(N)にならないよな。こうじゃね?
int x[] = {7,12,5,8,66,33,24,59,1,0,100};
const int n = sizeof(x)/sizeof(x[0]);
int ic; int nums[100 + 1];
int result[n];
for (ic = 0; ic <= 100; ++ic) nums[ic] = 0;
for (ic = 0; ic < n; ++ic) ++nums[x[ic]];
for (ic = 1; ic <= 100; ++ic) nums[ic]+=nums[ic-1];
for (ic = n-1; ic >= 0; --ic) result[--nums[x[ic]]] = x[ic];
for (ic = n-1; ic >= 0; --ic) printf("%d pts.\n", result[ic]);
0374デフォルトの名無しさん2006/10/27(金) 13:53:34
>>351 面倒なので全部纏めて。課題4-1は勘違いしてるかもしれない。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2831.txt
03753742006/10/27(金) 13:54:37
書き込み成功してたのかよ orz
0376デフォルトの名無しさん2006/10/27(金) 14:05:56
>>373
>>364のコードでは、外側のループは101回まわり、
その一回ごとに内側のループはnums[ic]回まわる。
したがって、内側のループは合計するとΣ{ic=0..101}(nums[ic])回まわる。
一方、Σ{ic=0..101}(nums[ic])はnに等しいので、全体でO(n)。
03773732006/10/27(金) 14:10:24
>>376
おお確かにそうだな。良く見てなかった。サンクス。
0378デフォルトの名無しさん2006/10/27(金) 15:03:27
>>376
あっそうか。101というのはNじゃなくて固定されてるもんな。
03793302006/10/27(金) 16:03:56
>>323
ごめ、問題勘違いしてた。
問題文の p(x) 確率分布密度に沿った乱数は次の式になります。

double p_rand(void){
return 4*sqrt(1.0-uniform_rand());
}
0380291,3092006/10/27(金) 16:53:33
以前(>291)、ここで質問したものです。

>309
で十分まとめの作業を行えていたのですが、

004005
168400 8.793 48.078
↓
004
168400 8.793
005
168400 48.078

というパターンのほかに

004005
168400 8.793 48.078 -70.018 52.845
↓
004
168400 8.793 48.078
005
168400 -70.018 52.845
(左から A B C D Eだとすると A B C  A D Eの組み合わせ)
というパターンが増えました。

>309をどのように修正したら、このような出力を行うことが出来ますか?
0381デフォルトの名無しさん2006/10/27(金) 17:33:57
1] 授業単元:C++言語
[2] Form1のメンバとして整数型の変数countを用意します。
TButtonコンポーネントとTLabelコンポーネントをForm1に貼り付けます。
Buttonをクリックするごとに、クリックした回数と何か文章をLabelに表示してください。
この時、文章の中身はできるだけ更新してください。
たとえば5種類文章を用意して、それをクリックごとに順番に表示させてもOKです。
ちなみに、Buttonをクリックした時のメンバ関数内でif文などは使用できます。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: C++ Builde 6
 [3.3] 言語: C++

おねがいします
0382デフォルトの名無しさん2006/10/27(金) 18:53:08
>>380 これでいけると思う
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2832.c
03833802006/10/27(金) 19:10:08
>382

いけました。ありがとうございます
0384デフォルトの名無しさん2006/10/27(金) 19:29:19
[1] 授業単元:情報処理
[2] 問題文:
第1問@キーボードから5つの整数を入力して、その後その5つの値と平均値を出力するプログラムを作成せよ
     (5つの値は配列にいれるように)

第2問@char c[3]; int i[3]; double d[3]; という配列を確保してそれぞれの変数(全部で9つ)のアドレスを表示
     するプログラムを作成せよ
     (printf()での表示には%pを使いなさい)

第3問@キーボードから5つの実数(範囲0.2〜10.0)を(要素数5の配列に)入力すると、その「5つの値」と「最大値と
     最小値を除いた3つの値の平均」を計算し表示するプログラムを作成
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C言語
[4] 期限: 無期限
0385デフォルトの名無しさん2006/10/27(金) 20:04:24
[1] 授業単元:計算科学
[2] 問題文
これは>>86の続きのようなものです.
t=0に x=0からスタートするランダムウォークを考えよう.
ただしx → yとジャンプする遷移確率は,
2/3(y=x+1,右に1進む),
W(y|x)=1/3(y=x-1,左に1進む),
0(それ以外) とします.

x(t)のサンプル平均, サンプル分散を計算するプログラムを作ろう.
ランダムウォークは nn=1000回繰り返してサンプルを得ます.
各ウォークで, interval=19 歩ごとに, x(i*interval) のサンプル平均,
サンプル分散を計算することにします.
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Visual Studio.NET2003
 [3.3] 言語: C
[4] 期限: 2006年10月31日09:00まで
[5] その他
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2686.txt
を利用して作ってください
0386330,3792006/10/27(金) 20:08:42
>>269,323
間違った答え書いてごめん
正解はこちら
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2833.c
0387>>330>>379>>3862006/10/27(金) 20:25:30
>>269,323
sample_data_index=(int)(p_rand()/SAMPLE_DATA_WIDTH);
↓
#define EPS (1.0e-10)
sample_data_index=(int)((p_rand()-EPS)/SAMPLE_DATA_WIDTH);

何度目の修正だか…orz
0388デフォルトの名無しさん2006/10/27(金) 20:41:14
>>384
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2834.c
0389デフォルトの名無しさん2006/10/27(金) 21:10:15
>>344 直線じゃなくて線分なら次のアルゴリズムが高速
void print_line(char pixel[XSIZE][YSIZE], int x1, int y1, int x2, int y2)
{
int dx, dy, sign_dx, sign_dy;
int x, y, d, cx, cy, i;

dx=x2-x1; dy=y2-y1;
sign_dx=(dx<0)?-1:((dx>0)?1:0);
sign_dy=(dy<0)?-1:((dy>0)?1:0);
dx=abs(dx); dy=abs(dy);

if(dx>dy) d=dx;
else d=dy;

x=x1;y=y1;
cx=cy=d/2;
for(i=0;i<=d;i++){
if(cx>d){x+=sign_dx;cx-=d;}
if(cy>d){y+=sign_dy;cy-=d;}

pixel[x][y]='*';

cx+=dx;
cy+=dy;
}
}

使い方
print_line(pixel, 3, 3, 10, 8);
0390デフォルトの名無しさん2006/10/27(金) 21:13:14
>>381
C++ Builde 6 持ってないので、
TButtonコンポーネントとTLabelコンポーネントをForm1に貼り付けた、ソースコードをアップロードしてちょ
0391291,380,3832006/10/27(金) 21:13:29
さきほどのresult.txtのファイル名は、手動で[グループ名(A〜D)- 2桁の管理番号]を付けています。
例.result.txtをresult-C-11.txtという風に。
result.txtの001(〜) と000000の間にある数字6桁の数字ですが一番左が 0 16 18 26 4 5 の6種類です。6桁の数字を、左側の種類によって異なる変換ルールを用いて9桁の数字に置き換えたいと
思います。グループ名はA=1 B=2 C=3 D=4となりresult-C-11(グループ名-管理番号).txtを読んだ場合、つぎの変更ルールにのっとって名前の変更を行いたいです。
左端が0の場合
001100→111301100(固定値[1] 管理番号[11] グループ名[3] 6桁数字の2番目3番目4番目[011] 固定値[00])  
左端が16の場合
160500→100000516(固定値[1] 固定値[0000] 6桁数字の3番目4番目[05] 固定値[16])
左端が18の場合
181600→100001626(固定値[1] 固定値[0000] 6桁数字の3番目4番目[16] 固定値[18])
左端が26の場合
260500→100000526(固定値[1] 固定値[0000] 6桁数字の3番目4番目[05] 固定値[26])
左端が4の場合
400100→111301040(固定値[1] 管理番号[11] グループ名[3] 6桁数字の3番目4番目[01] 固定値[0] 固定値[40])
左端が5の場合
500100→111301050(固定値[1] 管理番号[11] グループ名[3] 6桁数字の3番目4番目[01] 固定値[0] 固定値[50])

001
001100 -3.080 80.194
160500 -25.997 89.993
181600 -2.786 70.379
0000
↓
001
111301100 -3.080 80.194
100000516 -25.997 89.993
100001626 -2.786 70.379
000000
以下 002 … 000000 003 … 000000と続きます。すみませんが、よろしくお願いします。
0392デフォルトの名無しさん2006/10/27(金) 22:20:51
>>391
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2836.c
使い方
./a.out ファイル名 管理番号

例
./a.out result-C-11.txt 11

ところで、これって宿題?
0393デフォルトの名無しさん2006/10/27(金) 22:57:14
>392

ありがとうございます。

最初のころにすれ違いとも書いていましたが、卒論データのまとめなんです。
データが多すぎて、ツール作ってってことだったんですが、Cの入門書を買ってきても
全然分からなくて。

すみません
03943932006/10/27(金) 23:14:52
>392


ところで、

使い方
./a.out ファイル名 管理番号

例
./a.out result-C-11.txt 11

これって、どういう意味なんですか?
03953922006/10/27(金) 23:24:50
管理番号を手動で切り分けて入力してくださいという意味です。
コンパイル・リンクしてできた実行ファイルの後に続けて

〜.exe ファイル名 管理番号

と入れて下さい

※gcc でコンパイル・リンクした場合には
オプションで出力ファイル名をしていない限り実行可能ファイルが a.out という名前になります。
但し ms-windows 環境だと a.exe です(ファイル種別を拡張子で判断しているため)
03963932006/10/27(金) 23:41:47
>393 です。


WindowsXP
VC++6.0
という環境でコンパイルをかけています。

実行すると、

Usage: パス\a.exe filename number
Press any kiy to continue

となり、入力が出来ないのですが、これはどのようにしたら入力が
出来るのでしょうか?
03973962006/10/27(金) 23:51:21
ぐぐりました。

自己解決しました。
03983962006/10/27(金) 23:57:24
使用方法は自己解決したのですが、

001
001100 -3.080 80.194
160500 -25.997 89.993
181600 -2.786 70.379
0000
↓
001
111301100 -3.080 80.194
100000516 -25.997 89.993
100001626 -2.786 70.379

6桁の数字を9桁に変えた横にある二列の数字も書き出すことは出来ませんか?
03993922006/10/28(土) 00:08:56
>>393
出力結果をファイルにしたいという意味でしょうか?それなら
〜.exe ファイル名 管理番号 > 出力ファイル名
として下さい。

あなたが出力として欲しいフォーマットと違うという意味であれば、
例を書いて下さい。
0400デフォルトの名無しさん2006/10/28(土) 00:10:22
>>393
卒論で急いでるのはいいですが、残念ですがCは難しいからそう簡単に分かるものでも、教えられるものでもありません。きっと諦めた方が早いでしょう。
0401デフォルトの名無しさん2006/10/28(土) 00:15:38
GCC と VC++6.0 で scanf の動作が違うかもしれないので、

ret=sscanf(one_line, "%[0-9] %[-.0-9] %[-.0-9]", left_code, data[0], data[1]);
↓
ret=sscanf(one_line, "%[0-9] %s %s", left_code, data[0], data[1]);

と変更して試してみて下さい。
04023932006/10/28(土) 00:30:48
すみません。

C、難しいです。(入門書を読んだ限りでは、簡単そうだったのですが。)


書き出しフォーマット、ファイル出力 ともに>399 >401 で解決しました。

ありがとうございました。
0403デフォルトの名無しさん2006/10/28(土) 02:49:32
[1] プログラミング
[2] pp. 177〜179 (5.1.5 sqrt 関数を作ってみよう) を読め. [リスト 5.11] の mysqrt は, 結局

a1=1
ai+1=(ai+x/ai)/2

という数列が x の平方根に収束することを利用して計算を行っている. 同様にして, x の 3 乗根を計算する関数 double mycbrt(double x) を作成せよ. 数列には,

a1=1
ai+1=(2ai+x/ai2)/3

を用いよ. [リスト 5.11] と同じように, main から mycbrt を呼び出すことにより, x = 1, 2, 3, …, 10 について x の 3 乗根 r を求めよ.
 [3.1] winXP sp2
 [3.2] cygwin
 [3.3] C
[4] 2006年 10/30 23時59分
[5] 途中までやったんで埋める感じでお願いします。
問題文のページ数とかは本使ってやってるから出てるだけです。
04044032006/10/28(土) 02:51:15
#include<stdio.h>
#include<math.h>

double mycbrt(double r); /*プロトタイプ宣言*/

int main (void)
{
double r;

printf("\tr\tcbrt r\t\tmycbrt r\n");
for(r=1.0; r<=10.0; r += 1.0)
{
printf("\t%3.1f\t%12.10f\t%12.10f\n",r,cbrt(r),mycbrt(r));
}
return 0;
}

double mycbrt (double r)/*square root を求める関数*/
{
const double eps=1.0e-10;/*打ち切り計算誤差*/
doubleguess=1.0;/*推測値*/

while(fabs(guess*guess-x) >= eps)/*推測値がよくなるまで繰り返す*/
{
guess=((2*guess)+r/(guess*guess))/3.0;/*推測値の更新*/
}

return guess;/*関数の戻り値*/
}

途中までやったぶんです、
実行したら最初の1行だけ出てプログラムが固まります。
0405デフォルトの名無しさん2006/10/28(土) 03:41:23
>>403
三箇所ほど直しといた

double mycbrt(double r)/*cube root を求める関数*/
{
    const double eps=1.0e-10;/*打ち切り計算誤差*/
    double guess=r;/*推測値*/

    while(fabs(guess*guess*guess-r) >= eps)/*推測値がよくなるまで繰り返す*/
    {
        guess=((2*guess)+r/(guess*guess))/3.0;/*推測値の更新*/
    }

    return guess;/*関数の戻り値*/
}
04064032006/10/28(土) 04:34:12
>>405
正常に動作しました。ありがとうございます。
意味は自分で考えとく
0407デフォルトの名無しさん2006/10/28(土) 09:31:30
>>402
Cは簡単過ぎて難しいな。

キーワードが少なく、しかもいろんな意味を割り当ててある上に、
演算子が結構多くて優先順位が決まっている上に、ポインタが
あって、他の高級言語とはかなり毛色が違うからな。
04083882006/10/28(土) 10:08:54
>>384
>>388 の修正版
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2837.c

問1、問3の「5つの値を表示」するのを忘れてた
04093882006/10/28(土) 10:14:36
アップするまえに確認すりゃよかった orz
問3
maximum=minimum=data[i];
↓
maximum=minimum=data[0];
0410デフォルトの名無しさん2006/10/28(土) 11:11:27
[1] 授業単元: 情報処理
[2] 問題文: 実行したファイル名を除いたコマンドライン引数に、複数個指定した全てのファイルの内容を標準出力に表示するプログラム
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:明日まで

よろしくお願いします。
0411デフォルトの名無しさん2006/10/28(土) 11:19:14
やっぱりこう言うスレは、とても勉強になるよ。
何でこう言う方法を思いつくの?って感じのソースが沢山ある。

ただ宿題を頼む側としては、このまま出して大丈夫なのかなぁ?
考え方が学生レベルを遥かに逸脱してて先生に怒られそう。
0412デフォルトの名無しさん2006/10/28(土) 11:21:40
そんなレベルの高い回答があったか禿げしく疑問
0413デフォルトの名無しさん2006/10/28(土) 11:25:52
>>411
いろんなプログラムを見たり書いたりしてれば思いつく必要さえなくなるよ

> ただ宿題を頼む側としては、このまま出して大丈夫なのかなぁ?

そこまで真面目な人なら、
ロジックを追って自分なりに書き直してみるのもいいかもね
0414デフォルトの名無しさん2006/10/28(土) 11:35:11
>>410
こうゆうこと?

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *args[]){
FILE *fp;
int i, c;
if(argc <= 1)return EXIT_FAILURE ;
for(i=1; i<argc; i++){
if((fp = fopen(args[i], "r")) == NULL){
puts("ERROR");
return EXIT_FAILURE;
}
while((c=fgetc(fp)) !=EOF){
putchar(c);
}
fclose(fp);
puts("");
}
return EXIT_SUCCESS;
}
0415デフォルトの名無しさん2006/10/28(土) 11:42:19
>>410
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
char cmd[FILENAME_MAX+10];
int i;
for(i=1;i<argc;i++)
{
sprintf(cmd, "type %s", argv[i]);
system(cmd);
}
return 0;
}
0416デフォルトの名無しさん2006/10/28(土) 12:01:48
[1] 授業単元:情報処理概論
[2] 問題文(含コード&リンク):0から99の乱数を使って6×6ビンゴの表を作成しなさい。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン:BorlandC++
 [3.3] 言語:C++
[4] 期限: 10月30日まで
[5] その他の制限:  
よろしくお願いします。
0417cがわからない学生2006/10/28(土) 12:03:11
[1] 授業単元:情報処理�U
[2] 問題文(含コード&リンク):キーボードから1以上26 以下の整数n を入力し,n 番目のアルファベット(大文字)を画面表示
するプログラムを作成しなさい.例えば,「1」が入力された場合には「A」を,「10」が入力された
場合には「J」を画面に表示する.なお,0 以下,あるいは27 以上の数字が入力された場合に
は再入力できるようにすること.また,if やswitch を用いて26 種類の分岐を作ってはならない.
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名:gcc
 [3.3] 言語:C
[4] 期限:2006年10月31日まで
[5] その他の制限:なし?
0418cがわからない学生2006/10/28(土) 12:04:42
↑↑よろしくお願いしますm(_ _)m
0419デフォルトの名無しさん2006/10/28(土) 12:10:17
>>416
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define BINGO_RAND 100

void swap(int *a, int *b){
int temp;

temp=*a;
*a=*b;
*b=temp;
}
int main(void){
int rand_data[BINGO_RAND];
int i, j;

srand(time(NULL));
for(i=0;i<BINGO_RAND;i++)
rand_data[i]=i;
for(i=0;i<BINGO_RAND;i++)
swap(&rand_data[i], &rand_data[rand()%BINGO_RAND]);
for(i=0;i<6;i++){
for(j=0;j<6;j++)
printf(" %2d", rand_data[i*6+j]);
printf("\n");
}
return 0;
}
0420デフォルトの名無しさん2006/10/28(土) 12:13:54
>>417
#include<stdio.h>

int main(void)
{
int n;

while(1)
{
printf("Input value (1-26):");
scanf("%d", &n);
if(n>=1 && n<=26)
break;
}
printf("%c\n", 'A'+(n-1));

return 0;
}
04214192006/10/28(土) 12:15:48
>>416
rand_data[i]=i;
↓
rand_data[i]=i+1;
0422c不明な人2006/10/28(土) 12:19:50
[1] 授業単元:情報処理
[2] 問題文(含コード&リンク):キーボードから,「A」,「B」,「C」,「D」,「K」の5 種類のアルファベットを入力し,それぞれの入
力個数を数えて画面出力するプログラムを作成しなさい.なお,「Z」が入力されるまでキーボ
ード入力を繰り返すこととし,これら6 文字以外の入力はカウントしないようにしておくこと.
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限: 明後日まで
[5] その他の制限: なし
よろしくお願いします。
0423デフォルトの名無しさん2006/10/28(土) 12:20:43
>>421
0-99 の範囲のままでおk
0424デフォルトの名無しさん2006/10/28(土) 12:29:06
>>422
#include<stdio.h>
#include<ctype.h>

int main(void)
{
char check_char[]="ABCDK";
int count[sizeof(check_char)-1]={};
int i;
int moji;

while(1)
{
moji=getchar();
moji=toupper(moji);
if(moji=='Z' || moji==EOF)
break;
for(i=0;check_char[i]!='\0';i++)
if(moji==check_char[i])
count[i]++;
}
for(i=0;check_char[i]!='\0';i++)
{
printf("%c : %d\n", check_char[i], count[i]);
}

return 0;
}
0425c不明な人2006/10/28(土) 12:50:19
ちゃんとできました。ありがとうございました!
0426cがわからない学生2006/10/28(土) 12:51:17
どうもありがとうございました。ちゃんと実行できました。提出に間に合ってよかったです(泣)
0427デフォルトの名無しさん2006/10/28(土) 13:04:17
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
入力された値(1,2,3,9)と名前により線形リストを作成するものである。
値=1の時、名前を含むノードを線形リストの先頭に追加し、ポインタ sentoがそれを指し示す。
値=2の時、逆に線形リストの最後に追加し、ポインタ saigoがそれを指し示す。
値=3の時、現在の線形リストの状態を先頭から順に表示する。
値=9の時、リスト構築を終了する。
なお各ノードの格納場所として配列workが用意され、最初のノードは名前のみの入力により無条件に作成される。

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2839.txt
ほとんど出来たんですが、case2 の場合がうまく動いてくれないので
その部分をどう直していいのかが分かりません…
コンパイラは通ってるんですけど、実行結果がうまい事いかないorz
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 2006/10/29 PM02:00
[5] その他の制限: 構造体、ポインタを使用。
0428デフォルトの名無しさん2006/10/28(土) 13:44:18
>>427
work[n].next = &work[n];
は
saigo->next = &work[n];
の誤りだな。
0429デフォルトの名無しさん2006/10/28(土) 13:51:07
>>428
早速ありがとうございます
ちゃんとcase2が正常に動きました
構造体とポインタの部分が難しいです…
0430デフォルトの名無しさん2006/10/28(土) 14:35:24
書き直します。
[2]問題文:実行したファイル名を除いたコマンドライン引数に、複数個指定したすべてのファイルの内容を標準出力に表示するプログラムです。
#include <stdio.h>
int main(int argc, char *argv[]){
int c;
FILE *src;
FILE *dst;
if(argc != 3){
fprintf(stderr, "使い方: %s ファイル名 1 ファイル名 2\n", argv[0]);
fprintf(stderr, "ファイル名 1 をファイル名 2 に copy します。\n");
return 1;
}
src = fopen(argv[1], "r");
if(src == NULL){
perror(argv[1]);
return 1;
}
dst = fopen(argv[2], "w");
if(dst == NULL){
perror(argv[2]);
return 1;
}
while((c = fgetc(src)) != EOF)
fputc(c, dst);
fclose(src);
fclose(dst);
return 0;
}
を参考につくるのですが。
[3]環境
[3.1]OS:Windows XP
[3.2]コンパイラ名とバージョン:gcc
0431デフォルトの名無しさん2006/10/28(土) 14:52:49
>>430
dst = stdin
for(i=1;i<argc;i++) {
src = fopen(argv[i], "r");
if(src == NULL)
continue;
while((c = fgetc(src)) != EOF)
fputc(c, dst);
fclose(src);
}
0432デフォルトの名無しさん2006/10/28(土) 14:53:48
>>431
stdin -> stdout
0433デフォルトの名無しさん2006/10/28(土) 15:04:32
>>431
それをどこに入れたらよいのでしょうか?
0434デフォルトの名無しさん2006/10/28(土) 15:15:35
>>433
♂ -> ♀
キャッ
0435デフォルトの名無しさん2006/10/28(土) 15:21:40
>>433
dst = stdin
↓
dst = stdout
0436デフォルトの名無しさん2006/10/28(土) 15:55:04
>>435
dst = fopen(argv[2], "w");
if(dst == NULL){
perror(argv[2]);
return 1;
を、
dst = stdout
for(i=1;i<argc;i++) {
src = fopen(argv[i], "r");
if(src == NULL)
continue;
while((c = fgetc(src)) != EOF)
fputc(c, dst);
fclose(src);
}
に変えるだけですか?
0437デフォルトの名無しさん2006/10/28(土) 16:02:23
次に来る質問は
「セミコロンがないというエラーが出るんですがどうしたらいいですか?」
だな
04384162006/10/28(土) 16:27:51
出来ました。答えていただいた方
ありがとうございました。
0439デフォルトの名無しさん2006/10/28(土) 17:16:16
んで、ぽまいらはWindowsVistaに乗り換える気があるん?
0440デフォルトの名無しさん2006/10/28(土) 17:45:36
>>439
ない
0441デフォルトの名無しさん2006/10/28(土) 18:42:59
今の彼女から鞍替えするほど魅力はない
0442デフォルトの名無しさん2006/10/28(土) 19:36:24
自分が乗り換える気は無くてもメーカーPCはいやでもVistaが載るだろうね
04433842006/10/28(土) 19:44:38
>>408
ありがとうございます(`・ω・´)
0444デフォルトの名無しさん2006/10/28(土) 19:47:12
[1] 授業単元:システムプログラミング
[2] 問題文(含コード&リンク):
多倍長整数を使うことによって、フィボナッチ数列の100番目までを
正しく計算するプログラムを作成しなさい。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] borland
 [3.3] C言語
[4] 期限: 本日中
[5] その他の制限: 特に無し。

途中までは問題なかったのですが、
突然原因不明のエラーが出てくるようになってしまいました。
http://www-2ch.net:8080/up/download/1162032169809635.yw2OjQ
コンパイラは何の文句も言ってくれません。
助けてください。お願いします。
0445デフォルトの名無しさん2006/10/28(土) 19:48:51
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):入力された数値の総和を求めるプログラムを作成せよ。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン: VC++ 6.0
 [3.3] 言語: C++
[4] 期限: 2006年10月30日
[5] その他の制限:まだ習い始めて間もないです。
         変数:総和、入力した数値
         1. 総和を0とする。
         2. 最初の数値を入力する。
         3. 入力した値が-1でない限り以下の処理を繰り返す。
         3.1. 入力した数値を総和に加算する。
         3.2. 次の数値を入力する。
         4. 総和を画面に表示する。
          入力終了は値-1の入力によって検出する。
      と言う方法でやるようにと言われてます。
お願いします。
0446デフォルトの名無しさん2006/10/28(土) 19:58:14
>>444
まずは main 関数内の head_a, head_b, head_t の領域を確保しましょう。
0447デフォルトの名無しさん2006/10/28(土) 20:06:54
>>444
at main ():
struct digitへのポインタだけ作って、実体が宣言されてないんだが。
head_a->next = head_a->prev = head_a;
でコケるぞ。

で、ロジックも何がしたいのか良く分からん。
head_aが二つ前の要素、head_bが一つ前の要素、head_tが現在の要素のように
見えるんだが、add()では全然そのような計算をしていない。
0448デフォルトの名無しさん2006/10/28(土) 20:14:52
>>444
どう途中まで問題ないんだよw
main始まってすぐ落ちてるじゃねーか
0449デフォルトの名無しさん2006/10/28(土) 20:21:55
#include <stdio.h>

int main (void) {
  int sum;  // 総和
  int input;  // 入力した数値

  sum = 0;

  printf ("入力された数の総和を表示します。\n");
  printf ("入力を終了するときは、-1を入力してください。\n");
  while (1) {  // ずっと繰り返す
    scanf ("%d", &input);  // inputに値を入力
    if (input == -1) break;  // inputが-1のときループを抜ける
    sum += input;  // 総和にinputを足す
  }

  printf ("総和は %d です。\n", sum);
  return 0;
}
0450デフォルトの名無しさん2006/10/28(土) 20:22:37
すいません、>>449は>>445宛てです。
04514442006/10/28(土) 20:30:58
>>446
ありがとうございます!
最初で落ちなくなりました。
きっちり確保してあげなきゃいけないんですね…。

>>447
head_aが現在の要素、head_bが一つ前の要素、
head_tは退避用の一時リストのつもりです。
わかりにくいソースでごめんなさい。

解答ありがとうございました、助かりました。多謝です。
0452デフォルトの名無しさん2006/10/28(土) 20:35:47
すいません。
449のはC言語じゃないんですか?
C++じゃないと怒られます。
0453デフォルトの名無しさん2006/10/28(土) 20:54:34
>>452
思いっきり勘違いしてました。ごめんなさい。C++だとこうなります。

---

#include <iostream>

using namespace std;

int main (void) {
 int sum;         // 総和
 int input;        // 入力した数値
 
 sum = 0;
 
 cout << "入力された数の総和を表示します。" << endl;
 cout << "入力を終了するときは、-1を入力してください。" << endl;

 cin >> input;       //最初の数値を入力する
 while (input != -1) {  // inputが-1でない間繰り返す
  sum += input;     // 総和にinputを足す
  cin >> input;     // 次の数字を入力する
 }
 
 cout << "総和は " << sum << " です。" << endl;
 return 0;
}
0454デフォルトの名無しさん2006/10/28(土) 21:15:35
>>451
多倍長整数の演算部分とフィボナッチ部分を分けた方が見やすいと思う
0455デフォルトの名無しさん2006/10/28(土) 21:33:17
453 ホントありがとうございます。
どこのどなたかもわかりませんがホントにありがとうございます。
これからは、なるべく自力で出来るようにがんばります。
0456デフォルトの名無しさん ◆HOZlQYR1MY 2006/10/28(土) 21:58:33
[1] 授業単元:情報技術�U
[2] 問題文(含コード&リンク):初期値 N を0とし、N←2*N+3で更新されるNを10回順に出力するプログラムをwhile文を利用して作成せよ。(漸化式N(i+1)=2*N(i)+3、初期値N(0)=0で表される数列のN(0)〜N(9)の値を順に出力するプログラムです。)作成したプログラムを提出せよ。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:2006/11/8

まだ1年なのでよく分からないのでよろしくお願いします。
0457デフォルトの名無しさん2006/10/28(土) 22:05:26
文系か・・・
こんな授業とるなよw
0458デフォルトの名無しさん2006/10/28(土) 22:06:35
int n = 0;
int i = 0;
while(i < 10) {
/* printf で好きなように出力 */
n = 2*n+3;
}

2年になったらもっとわからなくなるんでない?
0459デフォルトの名無しさん2006/10/28(土) 22:28:25
C++言語で
繰り返し計算をしててその結果を随時for文の中に
coutを入れて発散してないか(計算がおかしくないか)
見ているのですが、今一回一回改行する設定にしてて
DOS画面にバーッと下のほうに出てくるような感じになっているのですが、
これをDOS画面の一番最初の数字のところだけどんどん更新させる事はできないのでしょうか?
ご存知の方がおられましたら教えてください。よろしくお願いします。
0460デフォルトの名無しさん2006/10/28(土) 22:30:46
>>459
\r
0461デフォルトの名無しさん2006/10/28(土) 22:38:23
>>460
すみません・・・やっても使い方がわからず
ググっても"/r C++言語"などと調べても
中の人からいい検索結果が返ってきません。
申し訳ないんですがやりかたを書いていただけないでしょうか?
0462デフォルトの名無しさん2006/10/28(土) 22:40:54
>>460
と思ったらできました!!"¥"という字が文字化け?してたのか
/の左右逆さまの文字になっていて分かりませんでした。
改行と同じように使えばいいのですね!わかりました。ありがとうございました!
0463デフォルトの名無しさん2006/10/28(土) 23:04:16
>>444の方と恐らく同じ授業です。
ここに書いてあるアドバイスを参考に作ってみたのですがよくわかりません。
>>444の方のプログラムを具体的にどう直せばいいでしょうか・・・
プログラム初心者なのにこんな授業取ってしまって非常に困ってます
出来れば回答宜しくお願いします・・・
0464デフォルトの名無しさん2006/10/28(土) 23:05:58
日本では、半角バックスラッシュ(半角\)と半角円記号(半角¥)は事実上同一だと思え。
そして半角スラッシュ( / )は別物。
0465デフォルトの名無しさん2006/10/28(土) 23:15:01
>>463
さすがに同じ授業とってる奴のとほとんど同じなのはまずいだろ
0466デフォルトの名無しさん2006/10/28(土) 23:16:55
>>465
一応変えられる所は出来る限り変えますので・・・
0467デフォルトの名無しさん2006/10/28(土) 23:28:00
そんなんはできるんかいなww
0468初心者2006/10/28(土) 23:38:32
どちら様教えて、VC++プログラミングするときにひとつのボタン押して
他の.exeファイル実行できるようにどうすればいいですか??
■ このスレッドは過去ログ倉庫に格納されています