トップページ⇒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
0002デフォルトの名無しさん2006/10/19(木) 20:53:27
>>1
乙
0003デフォルトの名無しさん2006/10/19(木) 21:41:43
>>http://pc8.2ch.net/test/read.cgi/tech/1158844912/990
>>http://pc8.2ch.net/test/read.cgi/tech/1158844912/1000

初の1000GETですた
0004デフォルトの名無しさん2006/10/19(木) 22:36:11
スレ立て乙です

[1] 授業単元:情報処理
[2] 問題文(含コード&リンク):http://www.vipper.net/vip114940.jpg
                  ↑の図の高さBEを求める関数を作成せよ。
                  引数は距離DE(m)、仰角θ(度)、目の高さAD(m)
                  直角三角形ABCにおいてtanθ=BC/AC
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C言語
[4] 期限: 無期限
0005デフォルトの名無しさん2006/10/19(木) 22:40:13
double kansuu(double de, double theta, double ad)
{
  return de*tan(theta)+ad ;
}
0006デフォルトの名無しさん2006/10/19(木) 22:45:23
>>4
double be_height(double de, double theta, double ad){
theta*=M_PI/180;
return (de*tan(theta)+ad);
}
0007デフォルトの名無しさん2006/10/19(木) 23:13:32
>>4
これ、すげー難しい問題だな。
0008デフォルトの名無しさん2006/10/19(木) 23:17:02
あ、θは度か。
0009デフォルトの名無しさん2006/10/19(木) 23:21:18
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):100までの全ての素数とその個数表示
するプログラム。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ名とバージョン: (gcc
 [3.3] 言語: (C
[4] 期限: 明日
[5] その他の制限:
0010デフォルトの名無しさん2006/10/19(木) 23:24:06
[1] 授業単元:システム学
[2] 問題文:行列の積を用いた性能評価プログラムを作成しなさい
      計算に何秒かかったのか表示し、行列の大きさは任意で変更が出来るように組むこと
[3] 環境  
 [3.1] OS: linux
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C++
[4] 期限: 2006年10月20日14時
[5] その他の制限: コンパイルオプションには最適化を指示する。
倍精度浮動小数点を用いること
前スレにも書き込みましたがよろしくお願いします
0011デフォルトの名無しさん2006/10/19(木) 23:27:23
こんなの出来る奴はいねーよ。
0012デフォルトの名無しさん2006/10/19(木) 23:31:49
>>9
isPrime(int n) {
int i;
for(i=2;i<n;i++)
if(n%i == 0)
return 0;
return 1;
}
0013デフォルトの名無しさん2006/10/19(木) 23:32:28
[1] 授業単元: ゼミ
[2] 問題文(含コード&リンク):
サンプル数6個で、2つの変数(x、y)を入力してその共分散と相関係数を出力する
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン:VC 6.0
 [3.3] 言語: Cでお願いします
[4] 期限: 明日中
[5] その他の制限:使う命令は、printf,scanf,for文等長くなってもいいので
初心者が使う文法みでお願いします

#include<stdio.h>
#include <math.h>
main()
{
scanf( "%d%d", &a, &g );
scanf( "%d%d", &b, &h );
scanf( "%d%d", &c, &i );
scanf( "%d%d", &d, &j );
scanf( "%d%d", &e, &k );
scanf( "%d%d", &f, &l );
m=(a+b+c+d+e+f)/6;
n=(g+h+i+j+k+l)/6;
S=((a-m)(g-n)+(b-m)(h-n)+(c-m)(i-n)+(d-m)(j-n)+(e-m)(k-n)+(f-m)(l-n))/6;
X=double sqrt(double((a-m)^2+(b-m)^2+(c-m)^2+(d-m)^2+(e-m)^2+(f-m)^2));
Y=double sqrt(double((g-n)^2+(h-n)^2+(i-n)^2+(j-n)^2+(k-n)^2+(l-n)^2));
R=S/(X*Y)
printf("%d",S);
printf("%d",R);
0014デフォルトの名無しさん2006/10/19(木) 23:36:12
#include<stdio.h>
#include <math.h>
main()
{
double a, b, c, d, e, f, g, h, i, j, k, l, m, n, S, X, Y, R ;
scanf( "%f%f", &a, &g );
scanf( "%f%f", &b, &h );
scanf( "%f%f", &c, &i );
scanf( "%f%f", &d, &j );
scanf( "%f%f", &e, &k );
scanf( "%f%f", &f, &l );
m=(a+b+c+d+e+f)/6;
n=(g+h+i+j+k+l)/6;
S=((a-m)(g-n)+(b-m)(h-n)+(c-m)(i-n)+(d-m)(j-n)+(e-m)(k-n)+(f-m)(l-n))/6;
X=sqrt((a-m)^2+(b-m)^2+(c-m)^2+(d-m)^2+(e-m)^2+(f-m)^2);
Y=sqrt((g-n)^2+(h-n)^2+(i-n)^2+(j-n)^2+(k-n)^2+(l-n)^2);
R=S/(X*Y)
printf("%f",S);
printf("%f",R);
}
0015デフォルトの名無しさん2006/10/19(木) 23:39:35
>>10
どんな行列の積を計算して性能評価にするんだ?
0016デフォルトの名無しさん2006/10/19(木) 23:51:30
>>15
正方行列の積を計算してその計算にかかった時間と、繰り返しの回数からMflopsを求めるプログラムです。
1,2,4,8…といったように倍の大きさの行列でどのように計算の時間が変わるのか測定するのが目的です。
0017デフォルトの名無しさん2006/10/20(金) 00:05:32
>>10
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2795.cpp
0018デフォルトの名無しさん2006/10/20(金) 00:10:44
>>17
ゴテゴテしすぎてて、Mflops を求める、という用途には全然役に立たないような。
0019デフォルトの名無しさん2006/10/20(金) 00:23:17
>>13
#include<stdio.h>
#include<math.h>
#define DATA_NUM 6
int main(void){
double x[DATA_NUM], y[DATA_NUM];
double sum_x, sum_y, ave_x, ave_y, dif_x, dif_y;
double S, X, Y, R, X_2, Y_2;
int i;
sum_x=0.0;sum_y=0.0;
for(i=0;i<DATA_NUM;i++){
scanf("%lf %lf", &x[i], &y[i]);
sum_x+=x[i];
sum_y+=y[i];
}
ave_x=sum_x/DATA_NUM;
ave_y=sum_y/DATA_NUM;
S=0.0;X_2=0.0;Y_2=0.0;
for(i=0;i<DATA_NUM;i++){
dif_x=x[i]-ave_x;
dif_y=y[i]-ave_y;
S+=dif_x*dif_y/DATA_NUM;
X_2+=dif_x*dif_x;
Y_2+=dif_y*dif_y;
}
X=sqrt(X_2);
Y=sqrt(Y_2);
R=S/(X*Y);
printf("%f\n", S);
printf("%f\n", R);
return 0;
}
0020デフォルトの名無しさん2006/10/20(金) 02:06:27
>>9を見てちょっとやってみた
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
int is_prime(int n,int*buf,int p){int i;for(i=0;i<p;i++)if(n%buf[i]==0)return 0;return 1;}
int get_prime(int n,int*buf){int i,j,p,m=sqrt((double)n);j=p=1;buf[0]=2;i=3;while(i<=n){if(is_prime(i,buf,j))buf[p++]=i;if(i<=m)j=p;i++;}return p;}
int main(int argc,char*argv[]){int i=0,n,m,p;int*buf;if(argc<2){fprintf(stderr,"usage error : no input\n");exit(1);}
while(*(argv[1]+i))if(!isdigit(*(argv[1]+i++))){fprintf(stderr,"usage error : illeagal input\n");exit(1);}
n=atoi(argv[1]);if(n<2){fprintf(stderr,"usage error : illeagal input\n");exit(1);}buf=(int*)malloc(sizeof(int)*(n-1));
if(!buf){fprintf(stderr,"out of memory\n");exit(1);}p=get_prime(n,buf);for(i=0;i<p;i++){printf(" %d",buf[i]);if(!((i+1)%10))printf("\n");}
printf("\ninput = %d\ncount = %d\n",n,p);free(buf);return 0;}
0021デフォルトの名無しさん2006/10/20(金) 08:39:31
printf("2,3,5,7,11,…
0022デフォルトの名無しさん2006/10/20(金) 09:09:17
>>20
main()の7割が引数チェック…
そこまで丁寧に作らなくても#defineでいいんでね?
0023デフォルトの名無しさん2006/10/20(金) 09:31:52
>>20を改悪してみた。

#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <math.h>
int is_prime(int n){int i;if(n<=1)return 0;for(i=2;i<=sqrt(double(n));i++)if(n%i==0) return 0;return 1;}
int main(void){int i,c=0,n=100;for(i=1;i<n;i++){if(is_prime(i)){printf(" %d",i);c++;
if(!((c+1)%10))printf("\n");}}printf("\ncount = %d\n",c);return 0;}
0024デフォルトの名無しさん2006/10/20(金) 10:01:31
>>23 の is_prime を変更してみた
int is_prime(int n){int i;if(n<=1)return 0;for(i=2;n/i>=i;i++)if(n%i==0) return 0;return 1;}
0025デフォルトの名無しさん2006/10/20(金) 10:52:25
>>14>>19
どうもありがとうございます。参考までに>>14はどこがおかしいのですか?
0026デフォルトの名無しさん2006/10/20(金) 11:06:36
前スレの942です流れてしまったようなのでもう一度お願いします
David van Brackle って人が書いたプログラムで1行で書けけるプログラムなんだけれども


main(Q,O)char**O;{if(--Q){main(Q,O);O[Q][0]^=0X80;for(O[0][0]=0;O[++O[0][0]]!=0;)if(O[O[0][0]][0]>0)puts(O[O[0][0]]);puts("----------");main(Q,O);}}

このプログラムを実行するとコマンドラインの引数すべての部分集合を表示することができるらしいのですが
どうして表示されるのか解説をしろという問題なのですが
どうしてなるのかわかる方はいらっしゃいませんか?
解説できる方がいたら解説をお願いします。
0027デフォルトの名無しさん2006/10/20(金) 11:09:38
>>25
^ はC言語では XOR の意
0028デフォルトの名無しさん2006/10/20(金) 11:37:24
>>26
mainの再帰ってありなのか…おもしろいな
解説者がすぐ現れるかもしれんけど面白そうだからじっくり考えてみるか
0029282006/10/20(金) 12:34:28
#include <stdio.h>
int ini_n = -1;
int main(int n, char **v) {
static int cnt = 0;
int i;
if(ini_n == -1) ini_n = n;
for(i=0;i<cnt;i++) printf(" ");
printf("main(%d, \"", n);
for(i=1;i<n;i++) printf("%s ", v[i]);
for(i=n;i<ini_n;i++) printf("(%s) ", v[i]);
printf("\")\n");
cnt++;
if(--n) {
main(n,v);
v[n][0] ^= 0X80;
for(i=0;i<cnt;i++) printf(" ");
for(i=1;i<n;i++) printf("%s ", v[i]);
for(i=n;i<ini_n;i++) printf("(%s) ", v[i]);
printf("\n");

for(v[0][0]=0; v[++v[0][0]]!=0; ) {
if(v[v[0][0]][0] > 0) {
for(i=0;i<cnt;i++) printf(" ");
puts(v[v[0][0]]);
}
}
for(i=0;i<cnt;i++) printf(" ");
puts("----------");
main(n,v);
}
cnt--;
}
0030282006/10/20(金) 12:35:46
>>29は>>26のプログラムを改変していろいろ出力してみたもの。
(環境によっては0とOの違いが見分けづらいので、変数名も変えた)

O[Q][0]^=0X80で値を負にすることによって、出力するかどうかのフラグにしている。
XORなので再び実行されると元に戻るのもポイント。

今は時間がないので、詳細はまた後で。
0031デフォルトの名無しさん2006/10/20(金) 13:47:53
[1] 授業単元:ソフトウェア実験演習
[2] 問題文(含コード&リンク):プロセススケジューリングのシュミレータ
スケジューリング(FCFS,SPT,ラウンドロビン)*分布(一様,指数,超指数)の9通り。
[3] 環境
 [3.1] OS: (Linux
 [3.2] コンパイラ名とバージョン: (gcc
 [3.3] 言語: (C言語
[4] 期限: ([2006年11月24日13:00まで]
[5] その他の制限: なし
宣しくお願いします。
0032デフォルトの名無しさん2006/10/20(金) 16:19:24
日本語でおk
0033デフォルトの名無しさん2006/10/20(金) 19:51:22
>>28
ちなみにC++ではmainの再帰が禁じられた。
グローバルなオブジェクトの初期化との兼ね合いのようだ。
0034デフォルトの名無しさん2006/10/20(金) 20:51:00
>>31
これだけの情報でどうしろというのか
0035デフォルトの名無しさん2006/10/20(金) 23:23:58
>>10
>>29 のマネして書き換えてみた
argv[0][0] はループ用の変数として使われてるので i に置き換え。
あとはよく使われる argc argv に変数名を置き換えてみた。
ハノイの塔の問題を解くプログラムに似てるかな…
#include<stdio.h>
int main(int argc, char **argv)
{
if(--argc)
{
int i;
main(argc,argv);
argv[argc][0]^=0x80;
for(i=0;argv[++i]!=0;)
if(argv[i][0]>0)
puts(argv[i]);
puts("----------");
main(argc,argv);
}
return 0;
}
0036デフォルトの名無しさん2006/10/20(金) 23:47:16
>>31
超指数分布の意味が分からなかった。超幾何分布じゃないよね?
分布ってなにの分布?
プロセスの発生頻度?プロセスの所要時間?両方?その他?
期待してる入力と出力が分からない。

下のコードでもおk?
#include<stdio.h>
int main(void){
printf("シミュレーション開始\n");
printf("シミュレーション終了\n");
return 0;
}
0037デフォルトの名無しさん2006/10/21(土) 00:14:53
>>17
>>35
説明不足だったり、お礼が遅れてしまいすいません。
ありがとうございました。
とても参考になります。
0038デフォルトの名無しさん2006/10/21(土) 00:17:50
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):下のような感じで、3行6列の行列を表示させよ。
ただし、一番上の行に○行○列と言った感じで表示させること。

3 6(←こんな感じに)
2 5 10 7 0 4
11 3 5 4 2 9
1 8 7 6 4 1

[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン: Borland C
 [3.3] 言語: C
[4] 期限: 10月23日0:00まで
[5] その他の制限:標準ライブラリのみを使用すること。
0039デフォルトの名無しさん2006/10/21(土) 00:21:54
ほらよ
printf( "3 6\n") ;
printf( "2 5 10 7 0 4\n") ;
printf( "11 3 5 4 2 9\n") ;
printf( "1 8 7 6 4 1\n" ) ;
0040tanomu2006/10/21(土) 00:33:00
[1] 授業単元:計算物理
[2] 問題文(含コード&リンク):キーボードからL(一遍の長さ)、p(0から1までの数)
を入力し、pの確立でL*Lのグリッド内に木を詰めなさいと。(森を作るのね)
それで、左淵にある木、すべてに火を付けて、燃えてる木がなくなるまでシミュレート
し、その時間を計算しろっての。火がついた木は次のステップで灰になって、その木の
近隣にある木(縦と横)に火がうつるワケです。で、近隣に火を移す木がなくなるまで
プログラムは実行されるのだ。
[3] 環境  
 [3.1] OS:Windows,Mac,Linux、どれでもよか
 [3.2] コンパイラ名とバージョン: (gcc
 [3.3] 言語: (C言語
[4] 期限: ([出来れば来週]
[5] その他の制限: 出来れば 下のプログラムに近い物をお願い。
シミュレーション自体は上手くいってるっぽいけど、ステップをちゃんと
計算してくれないのだ
0041tanomu2006/10/21(土) 00:35:29
//forest fire problem

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

#define L 7
#define p 0.8
//tree occupation probability


main()
{
double rnd;
int tree[L][L]; //tree location (i=0,j=0)~(i=L-1,j=L-1)
int i,j;
int n=1;
int t=0; //time
FILE *output1;
FILE *output2;

// srand(time(NULL));
0042tanomu2006/10/21(土) 00:35:59
output1=fopen("before.dat","w");
output2=fopen("after.dat","w");
for(i=1;i<L-1;i++){
for(j=1;j<L-1;j++){
rnd=(double)rand()/RAND_MAX;
if(rnd<p){
tree[i][j]=1; //tree occupied at i,j
fprintf(output1,"%d\t%d\n",i,j);
}else{
tree[i][j]=0; //no tree at i,j
}
} //end of j loop
}//end of i loop
for(i=0;i<L;i++){
tree[i][0]=0; //no trees at the bottom
tree[i][L-1]=0; //no trees at the top
tree[0][i]=0; //no trees on the left side
tree[L-1][i]=0; //no trees on the right side
}
fclose(output1);
for(j=1;j<L-1;j++){
if(tree[1][j]==1) tree[1][j]=2; //sets all the tree on the left edge on fire
}
0043tanomu2006/10/21(土) 00:37:12
while(n>0){
n=0; //reset n. this counts the number of burning tree

t++;
for(i=0;i<L;i++){
for(j=0;j<L;j++){
if(tree[i][j]==2){//if the tree at the current site is on fire

if(tree[i][j]==2) printf("burning tree--> %d\t%d\t%d\n",i,j,n);
//printf("burning tree-->%d\n",n);
if(tree[i+1][j]==1) {tree[i+1][j]=2;} //burns the one on the right
n++;
// if(tree[i][j+1]==1) tree[i][j+1]=2; //burns the one on the top
//if(tree[i-1][j]==1) tree[i-1][j]=2; //burns the one on the left
if(tree[i][j-1]==1) {tree[i][j-1]=2;} //burns the one on the bottom
tree[i][j]=3; //burned tree is gone
// printf("burning tree-->%d\n",n);
}
//printf("burn out time-->%d\n",t);
}//end of j loop
} //end of i loop

}//end of while loop
printf("burn out time-->%d\n",t); // machigatta kekka ga deru!
for(i=0;i<L;i++){
for(j=0;j<L;j++){
if(tree[i][j]==1) fprintf(output2,"%d\t%d\n",i,j);
}
}
fclose(output2);
system("pause");
}//end of main
0044デフォルトの名無しさん2006/10/21(土) 00:47:18
>>37
お礼はおっぱいでいいよ。
0045デフォルトの名無しさん2006/10/21(土) 00:50:06
>>38
#include <stdio.h>

#define ROWS 3
#define COLUMNS 6

int matrix[ROWS][COLUMNS] =
  {
    {2, 5, 10, 7, 0, 4},
    {11, 3, 5, 4, 2, 9},
    {1, 8, 7, 6, 4, 1}
  };

int main(void)
{
  int r, c;

  printf("行=%d 列=%d\n", ROWS, COLUMNS);
  for (r = 0; r < ROWS; r++) {
    for (c = 0; c < COLUMNS; c++) {
      printf("%d ", matrix[r][c]);
    }
    printf("\n");
  }

  return 0;
}

注意: スペースは全角を使っているから、半角に変換してね
0046デフォルトの名無しさん2006/10/21(土) 01:15:28
>>40
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2801.txt
これでいいはず・・・
print関数は確認のために使っただけだから消しといてくれ
0047デフォルトの名無しさん2006/10/21(土) 09:54:50
>>40 森を作る部分こうしたほうが良くね?
memset(tree, 0, sizeof(tree));
for(i=1;i<L-1;i++){
for(j=1;j<L-1;j++){
rnd=(double)rand()/RAND_MAX;
if(rnd<p){
tree[i][j]=1; //tree occupied at i,j
fprintf(output1,"%d\t%d\n",i,j);
}
} //end of j loop
}//end of i loop
0048デフォルトの名無しさん2006/10/21(土) 10:10:34
>>40
何がいけないかというと

状態が2の木に隣接している木を状態2にしているので、同じ時刻のループで
1−>2に変化した木を処理してしまうということだな。
> if(tree[i+1][j]==1) {tree[i+1][j]=2;} //burns the one on the right
だから状態を、
 燃えていない木=1、燃えている木=2、燃え尽きた木=3
でなくて
 燃えていない木=1、火がつけられた木=4、燃えている木=3、燃え尽きた木=2
にして1−>4にすればこれを解決できる。
同じ時刻のループを抜けるときに、4−>2に戻してやるわけだ。
>>46さんのプログラムはそうしている。

あと、
>> n++;
上下左右各々に対してn++すること。
0049デフォルトの名無しさん2006/10/21(土) 10:10:45
for(i=1;i<L-1;i++){

1〜L-2 ?
0050デフォルトの名無しさん2006/10/21(土) 10:16:13
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
for(k=0;k<4;k++) {
    tree[i+dx[k]][j+dy[k]];
}

このやり方の方が多少簡潔に書ける
0051デフォルトの名無しさん2006/10/21(土) 11:32:12
struct _pos{
int x;
int y;
}delta[]={
{0,-1},
{0,1},
{-1,0},
{1,0}};

for(k=0;k<4;k++) {
tree[i+delta[k].x][j+delta[k].y];
}
の方が佐賀
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
なんかしっくり来ないです…
■ このスレッドは過去ログ倉庫に格納されています