トップページ⇒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
0052デフォルトの名無しさん2006/10/21(土) 11:39:25
intの配列へのptrはどう書きますか?
int * arr[]はintのptrの配列ですよね?
0053デフォルトの名無しさん2006/10/21(土) 11:41:59
int (*parr)[4];w
0054デフォルトの名無しさん2006/10/21(土) 11:55:00
int **ptr
0055デフォルトの名無しさん2006/10/21(土) 11:57:48
適度な難易度の宿題キボン

おまけ #define 無しで顔文字プログラム
main(){int i,l,o,P;
l^o^l/
(o-o)?
:-P
;
}
0056デフォルトの名無しさん2006/10/21(土) 12:04:24
[1] 授業単元:プログラムミング応用
[2] 問題文:各種ソートやサーチのプログラムを比較する
[3] 環境
 [3.1] OS:suse Linax
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限: 11月中ですが実行して比較するのでもう少し余裕が要る
[5] その他の制限:特になし

#include <stdio.h>
void linear(int t,int num,FILE *fp) ;
int main(){
int t,num;
char name[256];
FILE *fp;
printf("Put target file of sarch\n");/*検索するファイル名を入力*/
scanf("%s",&name);
fp=fopen(name,"r");
if(fp==NULL){/*ファイルオープンに失敗*/
fprintf(stderr,"file open error!!\n");
return 1;
}
fscanf(fp,"%d",&num);/*乱数の個数を読み込む*/
printf("put target number\n");/*検索する目的の値を入力*/
scanf("%d",&t);
|
|後略
|
これが動くのに
0057562006/10/21(土) 12:04:54
#include <stdio.h>
#include <stdlib.h>

void bynali(int *x,int first,int last,int t,int c);

int main()
{
int num,*arr,i,t;
char name[256];
FILE *fp;

printf("Put sarch file\n");/*検索する対象のデータファイルを入力*/
scanf("%s",&name);
fp=fopen(name,"r");
if(fp==NULL){/*ファイルオープンに失敗*/
fprintf(stderr,"file open error!!");
return 1;
}

printf("put target number\n");/*検索する目的の値を入力*/
scanf("%d",&t);/*ここでセグメンテーションフォルト*/
|
|後略
|
これがセグメンテーションフォルトになってしまう理由がわかりません。
0058562006/10/21(土) 12:08:53
同様に
void BubSort(int *x);

int main(void)
{
int *arr,num,i;
FILE *fp,*fo;
char name[256];

printf("Put target file of sort\n");/*ソートする対象のデータファイルを入力*/
scanf("%s",&name);
fp=fopen(name,"r");
if(fp==NULL){/*ファイルオープンに失敗*/
fprintf(stderr,"file open error!!");
return 0;
}
printf("Put file name to sort\n");/*ソート結果を出力するファイル名を入力*/
scanf("%s",&name);
fo=fopen(name,"w");
if(fo==NULL){/*ファイルオープンに失敗*/
fprintf(stderr,"file open error!!");
return 0;
}
|
|後略
|
これが動くのに
0059デフォルトの名無しさん2006/10/21(土) 12:09:41
>53, 54 ありがとうございます。というか、
intのptrの配列がこれですね→int (*parr)[4];
intの配列へのptrはこんなん?→int *(arrp [4]);←あり?
実際にはptrのptr→int **ptr で考えるかと思いますが、理屈的なところで。
0060552006/10/21(土) 12:09:41
main(){int l,o,P,w;
l^o^l/
(o-o)?
l^w^l
:-P
;}
0061562006/10/21(土) 12:12:13
#include <stdio.h>
#include <stdlib.h>

void quick(int *x,int first,int last);

int main()
{
int num,*arr,i;
char name[256];
FILE *fp,*fo;

printf("Put target file of sort\n");/*ソートする対象のデータファイルを入力*/
scanf("%s",&name);
fp=fopen(name,"r");
if(fp==NULL){/*ファイルオープンに失敗*/
fprintf(stderr,"file open error!!");
return 1;
}
printf("Put file name to sort\n");/*ソート結果を出力するファイル名を入力*/
scanf("%s",&name);/*ここでセグメンテーションフォルト*/
|
|後略
|
これがセグメンテーションフォルトになるのがどうしてもわかりません。
しかもquickの方は二つのscanfを入れ替えると必ず二つ目のscanfでセグメンテーションフォルトにな

ります。
なぜセグメンテーションフォルトになるのか、どう対処したらよいのか教えてください。
0062デフォルトの名無しさん2006/10/21(土) 12:21:12
>>56
エスパー回答
arr の領域を確保せずに使用して、変なアドレスを破壊しようとしてる。
おそらくセグメンテーションフォルトはあなたが思っているところでは起こっていない。

コードを全て晒してください。
0063デフォルトの名無しさん2006/10/21(土) 12:39:49
>>56
printf("abc") を呼んだからといって、
すぐに "abc" が画面に表示されるわけではない。
>>56 は、そこまでは表示されていたから、
その直後でセグメンテーションフォルトが起こったと
思っているのだろう。

恐らく、
|
|後略
|
のところにバグがある。
0064デフォルトの名無しさん2006/10/21(土) 12:40:21
>>56
>>62と同じ意見
後略の部分をコメントアウトしても落ちるかどうか位のチェックはしたほうがいい
0065デフォルトの名無しさん2006/10/21(土) 13:06:23
char name[256];
>scanf("%s",&name);
配列の先頭のポインタのポインタを渡してる気がする
0066デフォルトの名無しさん2006/10/21(土) 13:10:41
>>65
そこも確かに意味としては間違ってる
でもこのコードだと値としては &name[0]=name=&name
になると思う。
0067562006/10/21(土) 13:13:45
ご教授ありがとうございます。
確かにその後をコメント化したところ正常に終了しました。
が、どこが原因なのかが全くわかりません。

1のロダが死んでるみたいなんで別ロダに上げたソース↓
http://kossie.run.buttobi.net/cgi-bin/up/src/kos0002.txt
0068デフォルトの名無しさん2006/10/21(土) 13:21:24
>>56
for(i=0;i<num;i++){
fscanf(fp,"%d",arr[i]);/*配列にデータを格納*/
}
arr[i] の前に & が無い
0069デフォルトの名無しさん2006/10/21(土) 13:26:13
>>66
そうだったのか
無知ですまんかった
0070デフォルトの名無しさん2006/10/21(土) 13:27:45
>>67
リンクエラーになってる
0071デフォルトの名無しさん2006/10/21(土) 13:29:12
>>67
ソースがもう見れない

>>68がもう答えだしてるみたいだけど、
コメントアウトして正常動作したなら、そのコメント部分の処理が怪しいだろう
1行ずつ削るなり増やしていけば大抵バグは見つかる
0072デフォルトの名無しさん2006/10/21(土) 13:31:13
>>69
このコードでのセグメンテーションフォルトの原因にはなりませんが、
誤作動の元になるので、危険なことには変わりないです。
(name を動的割り当てに変更したときとか)

要するにバグですね
0073デフォルトの名無しさん2006/10/21(土) 13:45:06
>>59
逆。
int (*parr)[4];とすると、parrはint [4]へのポインタ。
int *(arrp[4]);とすると、arrpはint *の配列(4要素)。
int (*parr)[4];という宣言は、括弧にしたがって、
「parrをまず*で逆参照し、その結果に対して[]でwアクセスすると、intが得られる」
と読むべし。
0074デフォルトの名無しさん2006/10/21(土) 13:47:04
デバッグのときに使うと便利なマクロ
__FILE__ __LINE__
使い方
#include<stdio.h>
#define DEBUG 1
#if DEBUG
#define debug_print(msg) fprintf(stderr, "File:%s Line:%d %s\n", __FILE__, __LINE__, msg)
#else
#define debug_print(msg)
#endif
int main(void)
{
debug_print("debug1");
debug_print("debug2");
return 0;
}
__VA_ARGS__ マクロが使えるコンパイラならもっと便利にできるよ
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
良ければソース見せてもらえない?
■ このスレッドは過去ログ倉庫に格納されています