トップページ⇒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
0075デフォルトの名無しさん2006/10/21(土) 14:39:29
>>73
ありがとうございます。こんな理解でいいですね?
#include<stdio.h>
int main(void){

int arr[]={1,2,3,4,5};

int *parr=arr; //pointer of array

int *a, *b, *c , *d , *e;
a=arr;
b=++arr;
c=++arr;
d=++arr;
e=++arr;

int *arrp[]={a,b,c,d,e}; // array of pointer

for(int i=0; i<5; i++){
printf("%d\n", arr[i]);
}
for(int i=0; i<5; i++){
printf("%d\n", *parr++);
}
for(int i=0; i<5; i++){
printf("%d\n", *(*arrp)++);
}
}
0076デフォルトの名無しさん2006/10/21(土) 14:53:15
>>75
良くない。
>int *parr=arr; //pointer of array
これではparrはintへのポインタだし、
arrではなくarrの先頭要素を指している。
arrへのポインタが欲しいなら、
int (*parr)[5] = &arr;
とするw。
0077デフォルトの名無しさん2006/10/21(土) 15:12:13
>>76 ありがとうございます。他もぼろぼろでした。ごめんなさい。
int arr[5];のとき、arrと&arrの区別が付きません。中身は両方とも
arrの先頭アドレスかと思います。
arr=&(arr[0])で配列の先頭要素へのポインタであり、&arrはarrそのもの
へのポインタということですか?
0078デフォルトの名無しさん2006/10/21(土) 15:27:21
だからね、そろそろありきたりな問題とその模範解答を記述したサイトでも作ってくれよ
あれほど言っているでしょうに?
0079デフォルトの名無しさん2006/10/21(土) 15:31:56
>>78
がんばれ
0080デフォルトの名無しさん2006/10/21(土) 15:33:59
ttp://www9.plala.or.jp/sgwr-t/index.html
の
ttp://www9.plala.or.jp/sgwr-t/c/sec10-2.html
配列とポインタ


こことかいいんじゃないか?
0081デフォルトの名無しさん2006/10/21(土) 15:50:16
>>78, 79 安易に書き込んですいませんでした。
>>80 ありがとうございます。修行します。
0082デフォルトの名無しさん2006/10/21(土) 15:55:00
>>77
>int arr[5];のとき、arrと&arrの区別が付きません。中身は両方とも
>arrの先頭アドレスかと思います。
機械の観点から見れば同じ値だけど、C言語から見ると型が違うので解釈も違う。
例えば、arr + 1はarrの第二要素を指すポインタだけど、
&arr + 1は違うところ(具体的には、arrをint [5]の配列(つまり配列の配列)の一要素とみなして
その次の要素)を指す。

>arr=&(arr[0])で配列の先頭要素へのポインタであり、&arrはarrそのもの
>へのポインタということですか?
その通り。w
0083デフォルトの名無しさん2006/10/21(土) 16:53:18
>>77 ありがとうございます。
#include <stdio.h>
int main(void){
int arr[]={11,21,31,41,51};
printf("arr: %d\n", arr);
printf("arr+1: %d\n", arr+1);
printf("&arr+1: %d\n", (&arr)+1);
int (*parr)[5] = &arr;
printf("parr+1: %d\n", parr+1);
printf("parr++: %d\n", ++parr);
int * ptr=arr;
printf("++arr: %d\n", ++arr);
printf("++ptr: %d\n", ++ptr);
}

で、結果が
arr: 4278992
arr+1: 4278996
&arr+1: 4278996
parr+1: 4278996
parr++: 4278996
++arr: 0
++ptr: 4278996

&arr+1はarr+(5 * 4byte)先ということではないのですね?
あと、最後の3行から、arrは配列arrの先頭要素のアドレスを返すけれど、
ポインタでは無いと考えていいでしょうか?(処理系はcintです。)

#うざく感じているみなさん、大変申し訳ありません。
#もう少しなので、多めに見てくださいますよう、お願いします。
0084デフォルトの名無しさん2006/10/21(土) 17:01:44
>>83
それはたぶん処理系がおかしい。
gcc-4.1.1では、
test.c: In function ‘main’:
test.c:11: error: インクリメントの中での左辺値が無効です
と言われる。この部分をコメントアウトしてコンパイル・実行すると、
arr: -1080531448
arr+1: -1080531444
&arr+1: -1080531428
parr+1: -1080531428
parr++: -1080531428
++ptr: -1080531444
こうなって、&arr+1はarrより20バイト先を指していることが分かる。w
0085デフォルトの名無しさん2006/10/21(土) 17:16:40
>>83
どうも腑に落ちないと思ったら、処理系の問題とは。
cintがそんな不細工とは思えないので、設定ミスかな?
ちゃんとしたコンパイラで勉強するようにします。
> インクリメントの中での左辺値が無効です
++arrはNGということですね(arrのポインタならOK)?
ありがとうございました。
0086デフォルトの名無しさん2006/10/21(土) 17:56:03
[1] 授業単元:計算科学
[2] 問題文
1次元離散座標ランダムウォークで, 遷移確率が
1/4(y=x-1),
w(y|x)=3/4(y=x+1),
0(それ以外)
というものを考える.
x=0から出発して3ステップ歩いた後のウォーカーの
位置を X(3) と書こう. X(3)の平均と分散を計算しよう,.
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Visual Studio.NET2003
 [3.3] 言語: C
[4] 期限: 2006年10月24日09:00まで
[5] その他
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2686.txt
を利用して作ってください
0087862006/10/21(土) 17:56:45
この確率によるステップ数3のランダムウォークを, 指定した回数だけ繰り返し,
到達地点の座標 X(3) のサンプル平均 m とサンプル分散 s2 を計算するプログラムを作ろう.
つまり,
サンプルの個数?
10
ランダムウォークの長さ?
3
シード?
3098
とすると, とすると, 3098 を seed として, 長さ 3 のランダムウォークを10回行い,
# サンプル番号 到達地点の座標
0 3
1 -1
2 -1
3 1
4 1
5 -3
6 1
7 -3
8 3
9 -1
サンプルの個数 10
サンプル平均 1.400000
サンプル分散 8.711111
と出力するようなプログラムを作ろう. (上のサンプル平均とサンプル分散の値は正しくありません。)
0088デフォルトの名無しさん2006/10/21(土) 17:59:41
>>86
yってなに?
1/4の確率でx座標が-1、3/4で+1ってこと?
0089デフォルトの名無しさん2006/10/21(土) 18:37:15
[1] 授業単元:プログラム
[2] 問題文:
整数型intは32ビットの内部表現をもつ。どの範囲の整数まで表現できるか
調べなさい。
その上で、範囲外の結果となる演算をしたときにどのような値が出力されるのか。
そしてなぜ、そのような値が出力されるのか、
コンピュータの計算原理をふまえて説明しなさい。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:VC++ 6.0
 [3.3] 言語:C++
[4] 期限:2006年10月23日まで
[5] その他の制限: なし

コンピュータの計算原理というのがよくわからなくて…
お願いします。
0090892006/10/21(土) 18:44:48
もうひとつお願いします。

[1] 授業単元:プログラム
[2] 問題文:
整数型intの値を、どの段階で実数型doubleに型変換すべきか検討しなさい。
2つ以上の場合で実際にプログラムを作成し、計算結果が同じとなるデータ、
異なるデータを示しなさい。
計算結果が異なる場合、なぜそうなるのか、コンピュータの計算原理、
コンピュータの計算原理をふまえて説明しなさい。

#include<stdio.h>
int main(void) {
int x, y, z;

printf("xを入力して下さい。: ");
scanf("%d", &x);
printf("yを入力して下さい。: ");
scanf("%d", &y);
printf("zを入力して下さい。: ");
scanf("%d", &z);

printf("[x+y+z] heikin = %f\n", (double)( x + y + z ) / 3);
return(0);
}

[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:VC++ 6.0
 [3.3] 言語:C++
[4] 期限:2006年10月23日まで
[5] その他の制限: なし
0091デフォルトの名無しさん2006/10/21(土) 19:10:33
前から思ってたんだが宿題スレってVC++6.0を使ってるやつが多いような気がするんだが何でだ?
学校がくれるのか?
教えて学生さん><
0092デフォルトの名無しさん2006/10/21(土) 19:16:28
アカデミックパックってやっすいのさー
0093デフォルトの名無しさん2006/10/21(土) 19:17:43
>>92
それは知ってる
俺もアカデミックですから
Amazonは年齢認証なしに買わせてくれたし・・・
でも6.0って今売ってるの?
0094デフォルトの名無しさん2006/10/21(土) 19:48:14
学校だと何年かに一回しかマシンやソフトを買い換えないからVC++6.0でも不思議はない
あとはVC++6.0ってアクティベーションないんじゃないかな、古いし
0095デフォルトの名無しさん2006/10/21(土) 19:57:31
つまり割れ率も高いと、こう言いたいわけですね?
0096デフォルトの名無しさん2006/10/21(土) 21:24:54
>>89
#include<stdio.h>
int main(void)
{
int a, i;
a=0x7FFFFFFE;
for(i=0;i<3;i++)
printf("%d\n", a++);
printf("\n");
a=0x80000001;
for(i=0;i<3;i++)
printf("%d\n", a--);
printf("\n");
return 0;
}
0097デフォルトの名無しさん2006/10/21(土) 21:29:48
>>90
試しに x=1 y=2 z=4 でもいれてみてください
#include<stdio.h>
int main(void) {
int x, y, z;

printf("xを入力して下さい。: ");
scanf("%d", &x);
printf("yを入力して下さい。: ");
scanf("%d", &y);
printf("zを入力して下さい。: ");
scanf("%d", &z);

printf("[x+y+z] heikin = %f\n", (double)( x + y + z ) / 3);
printf("[x+y+z] heikin = %f\n", ( x + y + z ) / (double)3);
printf("[x+y+z] heikin = %f\n", (double)(( x + y + z ) / 3));
return(0);
}
0098デフォルトの名無しさん2006/10/21(土) 21:58:15
>>86
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2802.c
一応やってみたけど、根本的にやり直したほうが…
0099デフォルトの名無しさん2006/10/21(土) 22:02:11
ああ

0100デフォルトの名無しさん2006/10/21(土) 22:47:37
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): キーボードから月(12ヶ月)に相当する整数値を入力し,その月の値に応じて,例のように表示するプログラムを作成せよ.ただし,switch~case文を使い,できる限り少ない個数のcase文で記述するよう工夫すること.
(実行例)
何月? => 3
1st month of spring
何月? => 4
2nd month of spring
何月? => 5
3rd month of spring
何月? =>6
1st month of summer
何月 => 13
そんな月ない!


[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: VisualStudio.net2003
 [3.3] 言語: C
[4] 期限: 10月25日
[5] その他の制限: お願いします
0101デフォルトの名無しさん2006/10/21(土) 22:52:09
[1] 授業単元:プログラミング演習 II
角度    sin    cos
0     0.00    1.00
…

180    1.00    0.00
[2] 問題文:↑みたいな感じに正弦、余弦の値を求める物です。
で、開始値、終了値、間隔は都度入力、単位はdegree、度数法です。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ:Borland C
[3.3] 言語:C (printf, scanf, if-else, swich, do-while, forと算術処理関連まで来てます。)
[4] 期限:基本無制限
[5] そのほか:特には

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2803.txt
なんかしっくり来ないです…
0102デフォルトの名無しさん2006/10/21(土) 22:58:18
>>100
何そのcase0個の方が手っ取り早い問題(;´Д`)
0103デフォルトの名無しさん2006/10/21(土) 22:58:34
>>101
そのソースコードは何?

「しっくりこない」って何?
0104デフォルトの名無しさん2006/10/21(土) 23:07:30
>>100
http://pc8.2ch.net/test/read.cgi/tech/1158844912/684
0105デフォルトの名無しさん2006/10/21(土) 23:08:01
>>103
スルーしろ
0106ワンダフル魁 ◆F9pJmydzS. 2006/10/21(土) 23:14:13
これがうまく実行できないのですが、問題点を教えてください
#include<stdio.h>
int main(void)
{
int ch;
printf("10進数を入力してください。\nCtrl+Zで処理を終了します。\n");
scanf("%d",&ch);
0107ワンダフル魁 ◆F9pJmydzS. 2006/10/21(土) 23:15:19
while(ch!=EOF) {
switch(ch){
case 1:
printf("apple\n");
scanf("%d",&ch);
break;
case 2:
printf("banana\n");
scanf("%d",&ch);
break;
case 3:
printf("cherry\n");
scanf("%d",&ch);
break;
default:
printf("???\n");
scanf("%d",&ch);
break;
}
}


return 0;
}

0108デフォルトの名無しさん2006/10/21(土) 23:17:05
>>106
printf("10進数を入力してください。\nCtrl+Zで処理を終了します。\n");
scanf("%d",&ch); ←ここ
0109デフォルトの名無しさん2006/10/21(土) 23:19:22
>>106
printf("10進数を入力してください。\nCtrl+Zで処理を終了します。\n");
↓
printf("10進数を入力してください。\n-1で処理を終了します。\n");
0110ワンダフル魁 ◆F9pJmydzS. 2006/10/21(土) 23:24:29
>>108
>>109
ありがとうございます
0111ワンダフル魁 ◆F9pJmydzS. 2006/10/21(土) 23:31:47
これの問題点はなんですか?
#include<stdio.h>
int main(void)
{
char word1[32],word2[32];

printf("同じ長さの文字列を二つ入力しなさい。\n");


gets(word1);
gets(word2);


while(word1!=word2){
printf("異なる文字列を入力しました");
scanf("%c",&word1);
0112デフォルトの名無しさん2006/10/21(土) 23:32:26
全く調べようとしないんだね
0113ワンダフル魁 ◆F9pJmydzS. 2006/10/21(土) 23:36:02

scanf("%c",&word2);

}

printf("等しい文字列を入力しました。");
return 0;
}
0114デフォルトの名無しさん2006/10/21(土) 23:41:22
皆さんのスルー力が試されております。
0115デフォルトの名無しさん2006/10/21(土) 23:45:03
http://0xcc.net/blog/archives/000133.html
これだろ?スルーできなかったww
0116デフォルトの名無しさん2006/10/21(土) 23:49:12
全力で答えてやるぜ!
printf("異なる文字列を入力しました");
↓
printf("異なるアドレスです\n");
0117デフォルトの名無しさん2006/10/21(土) 23:50:38
永遠を感じるプログラムだな
0118デフォルトの名無しさん2006/10/21(土) 23:53:03
ずっとスルーカだと思ってた・・・
0119デフォルトの名無しさん2006/10/21(土) 23:53:52
「えいえんはあるよ」
彼女は言った。

「ここにあるよ」
確かに、彼女はそう言った。
永遠のある場所。
…そこにいま、>>113は立っていた。
01201162006/10/21(土) 23:54:07
要するに問題っていうのは期待した状態と違うって事だろうけど、
期待している状態が分からない以上適当に答えるか質問するかスルーしかない。

こんなときオレは全力で答える。(分かる範囲なら)
0121デフォルトの名無しさん2006/10/21(土) 23:55:53
>>120
 エスパーでがんがれ!


・・・俺はやらん。
0122デフォルトの名無しさん2006/10/22(日) 00:00:24
質問テンプレ以外にはあまり首をつっこまなくてもいいんじゃね?
0123デフォルトの名無しさん2006/10/22(日) 00:17:09
>>111
#include<stdio.h>
#include<string.h>

#defineBUF_SIZE(1024)

int main(void)
{
char word1[BUF_SIZE],word2[BUF_SIZE];

while(1){
printf("同じ長さの文字列を二つ入力しなさい。\n");
gets(word1);
gets(word2);
if(strcmp(word1, word2)==0)
break;
printf("異なる文字列を入力しました\n");
}
printf("等しい文字列を入力しました。\n");
return 0;
}
0124デフォルトの名無しさん2006/10/22(日) 00:28:45
無料でC言語ができる環境が欲しいのですが、
初心者向けのわかりやすいやつを教えてください
0125デフォルトの名無しさん2006/10/22(日) 00:31:27
>>124
スレ違いだ

http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
0126562006/10/22(日) 00:35:18
学校から帰ってきました。
ありがとうございました
0127デフォルトの名無しさん2006/10/22(日) 01:31:05
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
文字列strを逆順に格納する関数(recを受け取ったらcerを表示する)
void rev_string(char str[]){ /*…*/ }
を作成せよ。
[3.1]OS:Windows XP
[3.2]コンパイラ:gccバージョン不明
[3.3]言語:C言語
[4]期限:2006/10/24 9:00まで
[5]その他制限事項:ポインタ使用不可
お願いします
0128デフォルトの名無しさん2006/10/22(日) 01:47:50
>>127
バッファオーバーフローの脆弱性があります

void rev_string(char str[]){
char str2[1000];
int i,len;
len = strlen(str);
strcpy(str2, str);
for(i = 0; i < len; i++)
str[i] = str2[len - 1 - i];
}
0129デフォルトの名無しさん2006/10/22(日) 01:55:15
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):nyuryoku.datというファイルを作り、そのファイルに
格納されている文字列を行列形式で表示させよ。

↓以下nyuryoku.datの中身
4 8
1 3 5 7 9 0 2 4
6 8 1 3 5 7 9 0
2 4 6 8 1 3 5 7

[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン: Borland C(V5.5)
 [3.3] 言語: C言語
[4] 期限: 10月23日18:00まで
[5] その他の制限:標準ライブラリのみ使用

どうしてもできません…よろしくお願いします><
0130デフォルトの名無しさん2006/10/22(日) 01:55:53
これは配列の[ ]が内部ではポインタとして解釈されているのにってギャグなのか
0131デフォルトの名無しさん2006/10/22(日) 02:14:04
>>130
stdio.hとかの中でもポインタ使ってるだろうから・・・
0132デフォルトの名無しさん2006/10/22(日) 02:52:59
>>129
行列形式って何?
0133デフォルトの名無しさん2006/10/22(日) 03:07:21
>>129
多分4行8列の行列に読み込んで画面に[ ]のような記号を外に付けて表示しろって
事だと思うけど、データが3行分しかないよ?
0134402006/10/22(日) 04:57:52
>>46~>>51
ありがとうございます。>>48の明確な解説ありがとさんでした。
ここの人たちはずばらしいですね。
0135デフォルトの名無しさん2006/10/22(日) 05:08:32
>>129を見てちょっとやってみた。
nyuryoku.datというファイルを作り、そのファイルに格納されている文字列を行列形式で表示させるプログラム。
転置行列は省いてしまったが。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define FILENAME "nyuryoku.dat"
int main(void){int i,j,k,c,m,count=0,size=256,tcount=0;int*buf,*row,*column;
int nyuryoku[4][8]={{4,8,},{1,3,5,7,9,0,2,4,},{6,8,1,3,5,7,9,0,},{2,4,6,8,1,3,5,7,}};
FILE *fp;if((fp=fopen(FILENAME,"wt"))==NULL){fprintf(stderr,"error : can't open file");exit(1);}
for(i=0;i<4;i++){if(i==0){fprintf(fp,"%d %d",nyuryoku[0][0],nyuryoku[0][1]);}else{fprintf(fp,"%d",nyuryoku[i][0]);
for(j=1;j<8;j++)fprintf(fp," %d",nyuryoku[i][j]);}fprintf(fp,"\n");}fclose(fp);
if((fp=fopen(FILENAME,"rt"))==NULL){fprintf(stderr,"error : can't open file");exit(1);}
buf=(int*)malloc(sizeof(int)*size);while(fscanf(fp,"%d",&buf[count])!=EOF)if(++count>=size){size*=2;buf=(int*)realloc(buf,sizeof(int)*size);}fclose(fp);
m=sqrt(count);row=malloc(sizeof(int)*m);column=malloc(sizeof(int)*m);for(i=1;i<=m;i++)if(count%i==0){row[tcount]=i;column[tcount]=count/i;tcount++;}
for(i=0;i<tcount;i++){for(j=0;j<row[i];j++){printf("%d",buf[j*row[i]]);for(k=0;k<column[i];k++)
printf(" %d",buf[j*row[i]+k]);printf("\n");}printf("\n");}free(buf);free(row);free(column);return 0;}
01361352006/10/22(日) 05:39:14
>>135の訂正
最後から2行目k=0をk=1に訂正
01371352006/10/22(日) 09:40:32
しかも転置じゃないよなorz
01381352006/10/22(日) 09:52:46
>>135の訂正
最後から3行目m=sqrt(count)をm=countに
最後から2行目j*row[i]をj*column[i]に
最後の行j*row[i]をj*column[i]に
すればなんとかいけるかな
0139デフォルトの名無しさん2006/10/22(日) 10:10:02
スタックの内容の型を構造体にすることはできますか?
さらに言うと(pop関数に戻り値が書かれているので)、構造体を
戻り値にするのは不可能ですよね?
文法書を読んでも書かれていないので混乱しています。
これが解らないと宿題にとりかかれないので教えてください。
0140デフォルトの名無しさん2006/10/22(日) 10:14:41
>>139
>>1
0141デフォルトの名無しさん2006/10/22(日) 10:27:30
>>139
> 文法書を読んでも書かれていないので混乱しています。

規格には書かれている。
文法書ってなんや?
0142デフォルトの名無しさん2006/10/22(日) 10:27:33
>140
問題以前の話だけど、ここで聞くのが適切かと思ったんだよ
0143デフォルトの名無しさん2006/10/22(日) 10:28:41
>141
C言語の参考書のことです
0144デフォルトの名無しさん2006/10/22(日) 10:34:43
>>143
言語が違うんじゃ?
Perlじゃない?
0145デフォルトの名無しさん2006/10/22(日) 10:36:22
>>139
http://www.google.com/search?num=50&lr=lang_ja&q=%E6%A7%8B%E9%80%A0%E4%BD%93%20%E6%88%BB%E3%82%8A%E5%80%A4
0146デフォルトの名無しさん2006/10/22(日) 10:42:30
>>139
できますよ。
std::stack<std::pair<int,int> >
0147デフォルトの名無しさん2006/10/22(日) 10:57:55
>>139
> スタックの内容の型
初耳の表現
型有/無に関わらず、”スタック”は抽象構造だぞ?
それともC++にはスタック型という唯一の型があったのか?
0148デフォルトの名無しさん2006/10/22(日) 11:18:54
>>147
?
見当違いの予感。
唯一の型じゃないからそこに入れられるものの型について質問してんじゃないの?
01491472006/10/22(日) 12:26:03
>>148
うーん、そこまで考えてもいいのかな?
”スタック”が何を指してるのか分からない限り話が進まないよね
もしかしたら>>139はwindowsのtlsの話してるかもしれないし、
stlのstack<T>かもしれないし、自前のstackかもしれないし。

さすがにリアルワールドの積荷の話じゃないだろうけど
01501392006/10/22(日) 12:41:19
みなさん有難うございます。結論から申し上げるとVisualC++のバグ?のようですorz

struct division {
int x;
int y;
};

typedef struct division elementtype;

struct stack {
int top;
elementtype elements[STACKSIZE];
};

elementtype pop(struct stack *s) {
if (s->top < 0) {
printf("stack underflow"); exit(1); }
else return s->elements[s->top--];
}

メイン関数でpushはうまくできたのですが、popをするとエラーが発生してしまい、
原因がさっぱりだったため、血迷って愚かな質問をしてしまい申し訳ありません。
popの戻り値がおかしかった(メンバx,y共になぜかtop-1の値が入っている)ので、
[s->top--]のところの--を取ってみたらメンバの値が正常に入力されていました。
そこで、まさかと思いLinuxでコンパイルしてみたらできました・・・。
これでやっと宿題が始められます。お騒がせいたしました。

>148
その通りです
0151デフォルトの名無しさん2006/10/22(日) 12:52:14
>>150
良ければソース見せてもらえない?
0152デフォルトの名無しさん2006/10/22(日) 12:57:56
そろそろエスパーの能力が必要だとこのスレを見ている誰もが感じているに違いない
0153デフォルトの名無しさん2006/10/22(日) 12:59:22
>>150
既視観があるのう。
それってオライリーの入門C++?
もしそうなら記述のソースがソースが古いのかもしれまへん。

その本でサンプルファイル、
gcc3だと配布されてるサンプルファイルのコンパイルがうまくいかない
(ソース中のtypedef int boolがC++ヘッダ内で既に定義されとるわエラーとかがでたりする。コメントアウトすればOK)
0154デフォルトの名無しさん2006/10/22(日) 13:00:51
VC6のSP3より前だとreturnにデクリメントとか書くとコード生成がバグるってのは聞いたことあるけど。
もしかしてVC6?
01551392006/10/22(日) 13:13:07
>151
スタックの動作を確かめるためだけのプログラムです。

#include <stdio.h>
#include <stdlib.h>
#define N 4
#define STACKSIZE N*N

struct division {
int x;
int y;
};

typedef struct division elementtype;

struct stack {
int top;
elementtype elements[STACKSIZE];
};

void push(struct stack *s, elementtype x) {
s->top++;
if(s->top >= STACKSIZE) {
printf("stack overflow"); exit(1); }
else
s->elements[s->top]=x;
}
01561392006/10/22(日) 13:14:46
続き

elementtype pop(struct stack *s) {
if (s->top < 0) {
printf("stack underflow"); exit(1); }
else { printf("s->top=%d s-elements[s->top].x=%d\n", s->top, s->elements[s->top]);
return s->elements[s->top--]; }
}

void initstack(struct stack *s) {
s->top=-1;
}

int stackempty(struct stack *s) {
return s->top < 0;
}

int main() {
struct stack suuretu;
elementtype test;

initstack(&suuretu);
while(scanf("%d %d", &test.x, &test.y)!=EOF) {
push(&suuretu, test); printf("top=%d\n",suuretu.top);
}
test=pop(&suuretu);
printf("test.x=%d test.y=%d\n", test.x, test.y);

}
01571392006/10/22(日) 13:15:58
結果(VisualC++)
1 2
top=0
3 4
top=1
5 6
top=2
7 8
top=3
^Z
s->top=3 s-elements[s->top].x=7
test.x=2 test.y=2

>153
スタックの部分は大学でもらった資料です。

>154
VisualC++6.0です・・・・・
0158デフォルトの名無しさん2006/10/22(日) 13:32:30
>>157
OS:Windows XP
コンパイラ:VC++ Toolkit 2003
オプション:-Za -O2(-Microsoft言語拡張機能off,-コード最適化)
それと同じコードをコンパイルしてコンソールから入力してみたけどとくにエラーなく
157のとおりの結果がでる。

オプション:-O2(-コード最適化)
でもおんなし。
なぞス
0159デフォルトの名無しさん2006/10/22(日) 13:42:31
>158
( ̄□ ̄;)!!

Linuxでやると
1 2
top=0
3 4
top=1
5 6
top=2
7 8
top=3
s->top=3 s-elements[s->top].x=7
test.x=7 test.y=8

こうならなきゃおかしいですよね。
0160デフォルトの名無しさん2006/10/22(日) 13:47:18
VC6のSP3前のコード生成バグと思ってたけど>>158でも再現するということは違うのかなぁ。
ちなみに自分のとこのvc,gcc,dmcでは>>159と同じ結果が出ました。
0161デフォルトの名無しさん2006/10/22(日) 14:00:03
BCCでの>>139-140の実行結果は>>159になったよ。
コンパイラの性格なんじゃない?
前置演算子に変えてみては?
0162デフォルトの名無しさん2006/10/22(日) 14:00:56
俺も、VC++ 2005 EEでオプション無し、/O2、/Za /O2、/Ox (最大限の最適化)を試したが全て159と同じになった。
またVC++ .NET 2003 Pro SP1で、/Za /O2、/Oxを試したが、やはり159のとおりになった。

なお、共にコマンドプロンプトから実行した。
01631582006/10/22(日) 14:02:24
あ、すまん。ここ読み飛ばしてたw
>>s->top=3 s-elements[s->top].x=7
>>test.x=2 test.y=2
デバッガつかってなかったんで、以下のようにmainを書き換えたところ
159と同じ結果でました。VC6の問題かも;・
結果:
1 2
top=0
3 4
top=1
5 6
top=2
7 8
top=3
s->top=3 s-elements[s->top].x=7
test.x=7 test.y=8

01641582006/10/22(日) 14:03:42
デバグプリント文(追加開始ー追加終了まで):
int main() {
struct stack suuretu;
elementtype test;
initstack(&suuretu);
while(scanf("%d %d", &test.x, &test.y)!=EOF) {
push(&suuretu, test);
printf("top=%d\n",suuretu.top);
/* ここ追加開始 */
if(suuretu.top==3)
break;
/* ここ追加終了 */
}
test=pop(&suuretu);
printf("test.x=%d test.y=%d\n", test.x, test.y);
}
0165デフォルトの名無しさん2006/10/22(日) 14:13:12
あーやっぱりそうか。

ついでに適当に探してみた。
多分、VC6 SP3で修正されたこのバグの亜種だな。
http://www.microsoft.com/japan/msdn/vstudio/downloads/sp/vs6fixes.aspx
> 6.3.5.2
> return ステートメントに ++ 演算子を使用すると、
> /Od を指定してコードをコンパイルしたときにアクセス違反となっていました。
0166デフォルトの名無しさん2006/10/22(日) 15:24:06
自分はアメリカの大学に行ってて、専攻はプログラミングじゃないんですけど
C++が必修で今学期初めてプログラミングの授業をとりました。
初心者で何もわからないのでどうか助けて下さい。
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):10人の生徒の名前、生徒番号、
4つのテストの点数を入力して、そこからテストの平均点を求め、
平均点から成績を割り出し、それらの記録を表示するプログラムを作成せよ。
成績は4つのテストの平均点が59点以下の場合=F、60−69点=D、
70−79点=C、80−89点=B、90−100点=A。

最終的な表示はこんな感じになります。
名前  生徒番号 テストの平均点  成績
-------------------------------------------
生徒1  28584 90.3 A
生徒2 359 71.6 C
 :
生徒10 1701 82.4 B

[3] 環境
 [3.1] OS: (Windows
 [3.2] コンパイラ名とバージョン: VC 6.0
 [3.3] 言語: C++
[4] 期限: 明日
[5] その他の制限: struct type array を使用する事
01671392006/10/22(日) 15:29:07
やはりVC6のバグが原因だったようです。

>165
おかげさまでサービスパックをインストールしたら直りました。
ですが、構造体変数の宣言をmain内でしようとするとgccでは出ないエラーが出るので、もう好きになれません。
0168デフォルトの名無しさん2006/10/22(日) 15:34:21
自分で途中までやってみたんですけど、もう全然わかりません。
一応自分がどれくらいのレベルか分かってもらうために
途中まで書いたのを載っけときますので、よろしくお願いします。
#include<iostream>
#include<iomanip>
using namespace std;

const_int NUM_STUDENT=10;

void getStudentInfo(char name[25],int &points);
char calculateGrade(int points);
void displayResult(char name[25],char grade);

struct Student

{
char stuName[25];
char grade;
int idNum;
int *testScore;
float average;
};
0169デフォルトの名無しさん2006/10/22(日) 15:36:21
続き:
int main()

{
char stuName[25],grade;
int earnedPoints=0;

getStudentInfo(stuName,earnedPoints);
grade=calculateGrade(earnedPoints);
displayResult(stuName,grade);

return 0;
}

void getStudentInfo(char name[25],int &points)

{
int test1, test2, test3, test4;
int scores [NUM_STUDENT];
int idNum;
float average;
0170デフォルトの名無しさん2006/10/22(日) 15:37:44
続き2:
{
cout<<"Enter name of the student:";
cin.getline(name,25);
cout<<"Enter the first test score:";
cin>>test1;
cout<<"Enter the second test score:";
cin>>test2;
cout<<"Enter the third test score:";
cin>>test3;
cout<<"Enter the fourth test score:";
cin>>test4;

points=test1+test2+test3+test4;
}
}

char calculateGrade(int points)

{

char letterGrades;
int average=(points/4);
0171デフォルトの名無しさん2006/10/22(日) 15:38:17
続き3:
if (average>=90)
letterGrade='A';
else if (average>=80)
letterGrade='B';
else if (average>=70)
letterGrade='C';
else if (average>=60)
letterGrade='D';
else
letterGrade='F';
return letterGrade;
}

void displayResult(char name[25],char grade)

{
cout<<endl<<endl;
cout<<"Student Name"<<" "<<name<<endl;
cout<<setw(45)<<setfill('-')<<"-"<<setfill('-')<<endl;
cout<<setw(14)<<"GRADE"<<" "<<grade<<endl<<endl;

}
0172デフォルトの名無しさん2006/10/22(日) 16:00:12
[1] プログラミング
[2] 50円切手が 5 枚, 80円切手が 4 枚, 120円切手が 3 枚あるとき, キーボードから金額 t を入力し, 金額の合計がちょうど t 円になるような切手の枚数の組合せを求めるプログラムを作成せよ.

次のような出力が得られることを確認せよ (表示形式は各自工夫せよ).
o 310円 → 50円×3枚+80円×2枚+120円×0枚
o 390円 → 50円×3枚+80円×0枚+120円×2枚, 50円×3枚+80円×3枚+120円×0枚
[3] 環境
 [3.1] winXP sp2
 [3.2] cygwin
 [3.3] C
[4] 2006年10月23日23時59分
[5] 途中までやったんで埋める形でお願いします
途中までやったぶんは次書きます
01731292006/10/22(日) 16:00:33
>>135様

実際に動かしてみたところ、様々な行列表示にはなるのですが、
>>129で設定したdat形式のように、

4 8
1 3 5 7 9 0 2 4
6 8 1 3 5 7 9 0
2 4 6 8 1 3 5 7

と、そのまま表示させるには、>>135のプログラムをどのようにすれば、
表示させることができるのでしょうか?
教えて君で本当に申し訳ありません。
01741722006/10/22(日) 16:01:44
#include<stdio.h>

int main (void)
{
int x,y,z,t;

printf("金額tを入力してください>>");
scanf("%d",t);
for(x=0;x<=5;x++)
{
for(y=0;y<=4;y++)
{
for(z=0;z<=3;z++)
{
printf(" );
}
}
}
return 0;
}

よろしくお願いします
■ このスレッドは過去ログ倉庫に格納されています