1 :
デフォルトの名無しさん :
2006/10/19(木) 20:39:01
スレ立て乙です
[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] 期限: 無期限
double kansuu(double de, double theta, double ad) { return de*tan(theta)+ad ; }
>>4 double be_height(double de, double theta, double ad){
theta*=M_PI/180;
return (de*tan(theta)+ad);
}
あ、θは度か。
9 :
デフォルトの名無しさん :2006/10/19(木) 23:21:18
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):100までの全ての素数とその個数表示 するプログラム。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: (gcc [3.3] 言語: (C [4] 期限: 明日 [5] その他の制限:
[1] 授業単元:システム学 [2] 問題文:行列の積を用いた性能評価プログラムを作成しなさい 計算に何秒かかったのか表示し、行列の大きさは任意で変更が出来るように組むこと [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C++ [4] 期限: 2006年10月20日14時 [5] その他の制限: コンパイルオプションには最適化を指示する。 倍精度浮動小数点を用いること 前スレにも書き込みましたがよろしくお願いします
こんなの出来る奴はいねーよ。
>>9 isPrime(int n) {
int i;
for(i=2;i<n;i++)
if(n%i == 0)
return 0;
return 1;
}
13 :
デフォルトの名無しさん :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);
#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); }
15 :
デフォルトの名無しさん :2006/10/19(木) 23:39:35
>>10 どんな行列の積を計算して性能評価にするんだ?
>>15 正方行列の積を計算してその計算にかかった時間と、繰り返しの回数からMflopsを求めるプログラムです。
1,2,4,8…といったように倍の大きさの行列でどのように計算の時間が変わるのか測定するのが目的です。
>>17 ゴテゴテしすぎてて、Mflops を求める、という用途には全然役に立たないような。
>>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;
}
>>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;}
printf("2,3,5,7,11,…
>>20 main()の7割が引数チェック…
そこまで丁寧に作らなくても#defineでいいんでね?
>>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;}
>>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;}
前スレの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);}} このプログラムを実行するとコマンドラインの引数すべての部分集合を表示することができるらしいのですが どうして表示されるのか解説をしろという問題なのですが どうしてなるのかわかる方はいらっしゃいませんか? 解説できる方がいたら解説をお願いします。
>>26 mainの再帰ってありなのか…おもしろいな
解説者がすぐ現れるかもしれんけど面白そうだからじっくり考えてみるか
29 :
28 :2006/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--; }
30 :
28 :2006/10/20(金) 12:35:46
>>29 は
>>26 のプログラムを改変していろいろ出力してみたもの。
(環境によっては0とOの違いが見分けづらいので、変数名も変えた)
O[Q][0]^=0X80で値を負にすることによって、出力するかどうかのフラグにしている。
XORなので再び実行されると元に戻るのもポイント。
今は時間がないので、詳細はまた後で。
31 :
デフォルトの名無しさん :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] その他の制限: なし 宣しくお願いします。
日本語でおk
>>28 ちなみにC++ではmainの再帰が禁じられた。
グローバルなオブジェクトの初期化との兼ね合いのようだ。
>>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;
}
>>31 超指数分布の意味が分からなかった。超幾何分布じゃないよね?
分布ってなにの分布?
プロセスの発生頻度?プロセスの所要時間?両方?その他?
期待してる入力と出力が分からない。
下のコードでもおk?
#include<stdio.h>
int main(void){
printf("シミュレーション開始\n");
printf("シミュレーション終了\n");
return 0;
}
>>17 >>35 説明不足だったり、お礼が遅れてしまいすいません。
ありがとうございました。
とても参考になります。
[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] その他の制限:標準ライブラリのみを使用すること。
ほらよ 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" ) ;
[1] 授業単元:計算物理 [2] 問題文(含コード&リンク):キーボードからL(一遍の長さ)、p(0から1までの数) を入力し、pの確立でL*Lのグリッド内に木を詰めなさいと。(森を作るのね) それで、左淵にある木、すべてに火を付けて、燃えてる木がなくなるまでシミュレート し、その時間を計算しろっての。火がついた木は次のステップで灰になって、その木の 近隣にある木(縦と横)に火がうつるワケです。で、近隣に火を移す木がなくなるまで プログラムは実行されるのだ。 [3] 環境 [3.1] OS:Windows,Mac,Linux、どれでもよか [3.2] コンパイラ名とバージョン: (gcc [3.3] 言語: (C言語 [4] 期限: ([出来れば来週] [5] その他の制限: 出来れば 下のプログラムに近い物をお願い。 シミュレーション自体は上手くいってるっぽいけど、ステップをちゃんと 計算してくれないのだ
//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));
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 }
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
45 :
デフォルトの名無しさん :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;
}
注意: スペースは全角を使っているから、半角に変換してね
>>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
48 :
デフォルトの名無しさん :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++すること。
for(i=1;i<L-1;i++){ 1〜L-2 ?
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]]; } このやり方の方が多少簡潔に書ける
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]; } の方が佐賀
intの配列へのptrはどう書きますか? int * arr[]はintのptrの配列ですよね?
int (*parr)[4];w
int **ptr
適度な難易度の宿題キボン おまけ #define 無しで顔文字プログラム main(){int i,l,o,P; l^o^l/ (o-o)? :-P ; }
56 :
デフォルトの名無しさん :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); | |後略 | これが動くのに
57 :
56 :2006/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);/*ここでセグメンテーションフォルト*/ | |後略 | これがセグメンテーションフォルトになってしまう理由がわかりません。
58 :
56 :2006/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; } | |後略 | これが動くのに
>53, 54 ありがとうございます。というか、 intのptrの配列がこれですね→int (*parr)[4]; intの配列へのptrはこんなん?→int *(arrp [4]);←あり? 実際にはptrのptr→int **ptr で考えるかと思いますが、理屈的なところで。
60 :
55 :2006/10/21(土) 12:09:41
main(){int l,o,P,w; l^o^l/ (o-o)? l^w^l :-P ;}
61 :
56 :2006/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でセグメンテーションフォルトにな ります。 なぜセグメンテーションフォルトになるのか、どう対処したらよいのか教えてください。
>>56 エスパー回答
arr の領域を確保せずに使用して、変なアドレスを破壊しようとしてる。
おそらくセグメンテーションフォルトはあなたが思っているところでは起こっていない。
コードを全て晒してください。
>>56 printf("abc") を呼んだからといって、
すぐに "abc" が画面に表示されるわけではない。
>>56 は、そこまでは表示されていたから、
その直後でセグメンテーションフォルトが起こったと
思っているのだろう。
恐らく、
|
|後略
|
のところにバグがある。
>>56 >>62 と同じ意見
後略の部分をコメントアウトしても落ちるかどうか位のチェックはしたほうがいい
char name[256]; >scanf("%s",&name); 配列の先頭のポインタのポインタを渡してる気がする
>>65 そこも確かに意味としては間違ってる
でもこのコードだと値としては &name[0]=name=&name
になると思う。
67 :
56 :2006/10/21(土) 13:13:45
>>56 for(i=0;i<num;i++){
fscanf(fp,"%d",arr[i]);/*配列にデータを格納*/
}
arr[i] の前に & が無い
>>67 ソースがもう見れない
>>68 がもう答えだしてるみたいだけど、
コメントアウトして正常動作したなら、そのコメント部分の処理が怪しいだろう
1行ずつ削るなり増やしていけば大抵バグは見つかる
>>69 このコードでのセグメンテーションフォルトの原因にはなりませんが、
誤作動の元になるので、危険なことには変わりないです。
(name を動的割り当てに変更したときとか)
要するにバグですね
>>59 逆。
int (*parr)[4];とすると、parrはint [4]へのポインタ。
int *(arrp[4]);とすると、arrpはint *の配列(4要素)。
int (*parr)[4];という宣言は、括弧にしたがって、
「parrをまず*で逆参照し、その結果に対して[]でwアクセスすると、intが得られる」
と読むべし。
デバッグのときに使うと便利なマクロ __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__ マクロが使えるコンパイラならもっと便利にできるよ
>>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)++);
}
}
>>75 良くない。
>int *parr=arr; //pointer of array
これではparrはintへのポインタだし、
arrではなくarrの先頭要素を指している。
arrへのポインタが欲しいなら、
int (*parr)[5] = &arr;
とするw。
>>76 ありがとうございます。他もぼろぼろでした。ごめんなさい。
int arr[5];のとき、arrと&arrの区別が付きません。中身は両方とも
arrの先頭アドレスかと思います。
arr=&(arr[0])で配列の先頭要素へのポインタであり、&arrはarrそのもの
へのポインタということですか?
だからね、そろそろありきたりな問題とその模範解答を記述したサイトでも作ってくれよ あれほど言っているでしょうに?
80 :
デフォルトの名無しさん :2006/10/21(土) 15:33:59
>>78 , 79 安易に書き込んですいませんでした。
>>80 ありがとうございます。修行します。
>>77 >int arr[5];のとき、arrと&arrの区別が付きません。中身は両方とも
>arrの先頭アドレスかと思います。
機械の観点から見れば同じ値だけど、C言語から見ると型が違うので解釈も違う。
例えば、arr + 1はarrの第二要素を指すポインタだけど、
&arr + 1は違うところ(具体的には、arrをint [5]の配列(つまり配列の配列)の一要素とみなして
その次の要素)を指す。
>arr=&(arr[0])で配列の先頭要素へのポインタであり、&arrはarrそのもの
>へのポインタということですか?
その通り。w
>>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です。)
#うざく感じているみなさん、大変申し訳ありません。
#もう少しなので、多めに見てくださいますよう、お願いします。
>>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
>>83 どうも腑に落ちないと思ったら、処理系の問題とは。
cintがそんな不細工とは思えないので、設定ミスかな?
ちゃんとしたコンパイラで勉強するようにします。
> インクリメントの中での左辺値が無効です
++arrはNGということですね(arrのポインタならOK)?
ありがとうございました。
86 :
デフォルトの名無しさん :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 を利用して作ってください
87 :
86 :2006/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 と出力するようなプログラムを作ろう. (上のサンプル平均とサンプル分散の値は正しくありません。)
>>86 yってなに?
1/4の確率でx座標が-1、3/4で+1ってこと?
[1] 授業単元:プログラム [2] 問題文: 整数型intは32ビットの内部表現をもつ。どの範囲の整数まで表現できるか 調べなさい。 その上で、範囲外の結果となる演算をしたときにどのような値が出力されるのか。 そしてなぜ、そのような値が出力されるのか、 コンピュータの計算原理をふまえて説明しなさい。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:VC++ 6.0 [3.3] 言語:C++ [4] 期限:2006年10月23日まで [5] その他の制限: なし コンピュータの計算原理というのがよくわからなくて… お願いします。
90 :
89 :2006/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] その他の制限: なし
91 :
デフォルトの名無しさん :2006/10/21(土) 19:10:33
前から思ってたんだが宿題スレってVC++6.0を使ってるやつが多いような気がするんだが何でだ? 学校がくれるのか? 教えて学生さん><
アカデミックパックってやっすいのさー
93 :
デフォルトの名無しさん :2006/10/21(土) 19:17:43
>>92 それは知ってる
俺もアカデミックですから
Amazonは年齢認証なしに買わせてくれたし・・・
でも6.0って今売ってるの?
学校だと何年かに一回しかマシンやソフトを買い換えないからVC++6.0でも不思議はない あとはVC++6.0ってアクティベーションないんじゃないかな、古いし
つまり割れ率も高いと、こう言いたいわけですね?
>>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;
}
>>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);
}
99 :
デフォルトの名無しさん :2006/10/21(土) 22:02:11
ああ
[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] その他の制限: お願いします
[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 なんかしっくり来ないです…
>>100 何そのcase0個の方が手っ取り早い問題(;´Д`)
>>101 そのソースコードは何?
「しっくりこない」って何?
106 :
ワンダフル魁 ◆F9pJmydzS. :2006/10/21(土) 23:14:13
これがうまく実行できないのですが、問題点を教えてください #include<stdio.h> int main(void) { int ch; printf("10進数を入力してください。\nCtrl+Zで処理を終了します。\n"); scanf("%d",&ch);
107 :
ワンダフル魁 ◆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; }
>>106 printf("10進数を入力してください。\nCtrl+Zで処理を終了します。\n");
scanf("%d",&ch); ←ここ
>>106 printf("10進数を入力してください。\nCtrl+Zで処理を終了します。\n");
↓
printf("10進数を入力してください。\n-1で処理を終了します。\n");
111 :
ワンダフル魁 ◆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);
全く調べようとしないんだね
113 :
ワンダフル魁 ◆F9pJmydzS. :2006/10/21(土) 23:36:02
scanf("%c",&word2); } printf("等しい文字列を入力しました。"); return 0; }
皆さんのスルー力が試されております。
全力で答えてやるぜ! printf("異なる文字列を入力しました"); ↓ printf("異なるアドレスです\n");
永遠を感じるプログラムだな
ずっとスルーカだと思ってた・・・
「えいえんはあるよ」
彼女は言った。
「ここにあるよ」
確かに、彼女はそう言った。
永遠のある場所。
…そこにいま、
>>113 は立っていた。
120 :
116 :2006/10/21(土) 23:54:07
要するに問題っていうのは期待した状態と違うって事だろうけど、 期待している状態が分からない以上適当に答えるか質問するかスルーしかない。 こんなときオレは全力で答える。(分かる範囲なら)
>>120 エスパーでがんがれ!
・・・俺はやらん。
質問テンプレ以外にはあまり首をつっこまなくてもいいんじゃね?
>>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;
}
124 :
デフォルトの名無しさん :2006/10/22(日) 00:28:45
無料でC言語ができる環境が欲しいのですが、 初心者向けのわかりやすいやつを教えてください
126 :
56 :2006/10/22(日) 00:35:18
学校から帰ってきました。 ありがとうございました
127 :
デフォルトの名無しさん :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]その他制限事項:ポインタ使用不可 お願いします
>>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];
}
[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] その他の制限:標準ライブラリのみ使用 どうしてもできません…よろしくお願いします><
これは配列の[ ]が内部ではポインタとして解釈されているのにってギャグなのか
>>130 stdio.hとかの中でもポインタ使ってるだろうから・・・
>>129 多分4行8列の行列に読み込んで画面に[ ]のような記号を外に付けて表示しろって
事だと思うけど、データが3行分しかないよ?
134 :
40 :2006/10/22(日) 04:57:52
>>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;}
136 :
135 :2006/10/22(日) 05:39:14
>>135 の訂正
最後から2行目k=0をk=1に訂正
137 :
135 :2006/10/22(日) 09:40:32
しかも転置じゃないよなorz
138 :
135 :2006/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]に
すればなんとかいけるかな
139 :
デフォルトの名無しさん :2006/10/22(日) 10:10:02
スタックの内容の型を構造体にすることはできますか? さらに言うと(pop関数に戻り値が書かれているので)、構造体を 戻り値にするのは不可能ですよね? 文法書を読んでも書かれていないので混乱しています。 これが解らないと宿題にとりかかれないので教えてください。
>>139 > 文法書を読んでも書かれていないので混乱しています。
規格には書かれている。
文法書ってなんや?
>140 問題以前の話だけど、ここで聞くのが適切かと思ったんだよ
>141 C言語の参考書のことです
>>143 言語が違うんじゃ?
Perlじゃない?
>>139 できますよ。
std::stack<std::pair<int,int> >
>>139 > スタックの内容の型
初耳の表現
型有/無に関わらず、”スタック”は抽象構造だぞ?
それともC++にはスタック型という唯一の型があったのか?
>>147 ?
見当違いの予感。
唯一の型じゃないからそこに入れられるものの型について質問してんじゃないの?
149 :
147 :2006/10/22(日) 12:26:03
>>148 うーん、そこまで考えてもいいのかな?
”スタック”が何を指してるのか分からない限り話が進まないよね
もしかしたら
>>139 はwindowsのtlsの話してるかもしれないし、
stlのstack<T>かもしれないし、自前のstackかもしれないし。
さすがにリアルワールドの積荷の話じゃないだろうけど
150 :
139 :2006/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 その通りです
そろそろエスパーの能力が必要だとこのスレを見ている誰もが感じているに違いない
153 :
デフォルトの名無しさん :2006/10/22(日) 12:59:22
>>150 既視観があるのう。
それってオライリーの入門C++?
もしそうなら記述のソースがソースが古いのかもしれまへん。
その本でサンプルファイル、
gcc3だと配布されてるサンプルファイルのコンパイルがうまくいかない
(ソース中のtypedef int boolがC++ヘッダ内で既に定義されとるわエラーとかがでたりする。コメントアウトすればOK)
VC6のSP3より前だとreturnにデクリメントとか書くとコード生成がバグるってのは聞いたことあるけど。 もしかしてVC6?
155 :
139 :2006/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; }
156 :
139 :2006/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); }
157 :
139 :2006/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です・・・・・
>>157 OS:Windows XP
コンパイラ:VC++ Toolkit 2003
オプション:-Za -O2(-Microsoft言語拡張機能off,-コード最適化)
それと同じコードをコンパイルしてコンソールから入力してみたけどとくにエラーなく
157のとおりの結果がでる。
オプション:-O2(-コード最適化)
でもおんなし。
なぞス
>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 こうならなきゃおかしいですよね。
VC6のSP3前のコード生成バグと思ってたけど
>>158 でも再現するということは違うのかなぁ。
ちなみに自分のとこのvc,gcc,dmcでは
>>159 と同じ結果が出ました。
俺も、VC++ 2005 EEでオプション無し、/O2、/Za /O2、/Ox (最大限の最適化)を試したが全て159と同じになった。 またVC++ .NET 2003 Pro SP1で、/Za /O2、/Oxを試したが、やはり159のとおりになった。 なお、共にコマンドプロンプトから実行した。
163 :
158 :2006/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
164 :
158 :2006/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); }
166 :
デフォルトの名無しさん :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 を使用する事
167 :
139 :2006/10/22(日) 15:29:07
やはりVC6のバグが原因だったようです。 >165 おかげさまでサービスパックをインストールしたら直りました。 ですが、構造体変数の宣言をmain内でしようとするとgccでは出ないエラーが出るので、もう好きになれません。
自分で途中までやってみたんですけど、もう全然わかりません。 一応自分がどれくらいのレベルか分かってもらうために 途中まで書いたのを載っけときますので、よろしくお願いします。 #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; };
続き: 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;
続き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);
続き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; }
172 :
デフォルトの名無しさん :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] 途中までやったんで埋める形でお願いします 途中までやったぶんは次書きます
173 :
129 :2006/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 のプログラムをどのようにすれば、
表示させることができるのでしょうか?
教えて君で本当に申し訳ありません。
174 :
172 :2006/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; } よろしくお願いします
>>174 scanf("%d", &t); な
if(t == 50*x+80*y+120*z)
176 :
172 :2006/10/22(日) 16:15:41
#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++) { if(t == 50*x+80*y+120*z) { printf("50円×%d枚+80円×%d枚+120円×%d枚"\n",x,y,z); } } } } return 0; } これであってますか?
とりあえず
>>168 をベースに適当に書いた。
#include<iostream>
#include<iomanip>
#include<numeric>
using namespace std;
const int NUM_STUDENT = 10;
const int NUM_TEST = 4;
const char*number_string[NUM_TEST]={"first","second","third","fourth"};
struct Student
{
char name[25];
int id,testScore[NUM_TEST];
int total(){return accumulate(testScore,testScore+4,0);}
static float average(int total){return total / 4.0f;}
static char grade(int total){return "FFFFFFDCBAA"[total / 4 / 10];}
void input(){
cout << "Enter name of the student:";
cin.getline (name, 25);
cout << "Enter id of the student:";
cin >> id;
/*
残り */ for(int i=0;i<4;++i){ cout << "Enter the "<<number_string[i]<<" test score:";cin >> testScore[i]; } cin.ignore(std::numeric_limits<int>::max(),'\n'); } void output(){ int total = this->total(); cout << setw(8) << name << setw(8) << id << setw(16) << average(total) << setw(8) << grade(total) << endl; } }; int main () { Student a[NUM_STUDENT]; for(int i=0;i<NUM_STUDENT;++i)a[i].input(); cout << "名前 生徒番号 テストの平均点 成績" << endl; cout << "----------------------------------------" << endl; for(int i=0;i<NUM_STUDENT;++i)a[i].output(); return 0; }
>>176 まあ、やりたいこととしては合ってるんだが…それくらい自分でテストしようよ
ちなみにそのままだとコンパイル通らないぞ
180 :
172 :2006/10/22(日) 16:25:48
>>179 "が多かったですね。
自分でテストできるの忘れてました。ありがとうございました。
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
完全に昇順ソートされているデータうち、配列の添字の範囲L中のn組の2個のデータがわざと交換されているとする(L>2n)。
この場合,データが昇順である性質が一部失われる。L=10, n<=1のとき,すなわち,配列の添字の範囲10以内では,1もしくは2個の
データの値の昇順が保証されない場合に,二分探索をどのように改良すれば,正しい探索が行えるだろうか?そのプログラムを実現せよ。
補足
用いるデータは,全部で100個。データの作成は手作業で構わない。
データを全部ソートし直すのはまずいが,二分探索をしながら辺りを調べその結果,一部何らかのデータ操作を行うことは禁止していない。
100個のデータを昇順に並び替えるプログラム載せてみます。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2804.txt [3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: borland
[3.3] 言語: C
[4] 期限: 10/23
[5] その他の制限: どんな改良をしたか書いていただければ幸いです。
どうか、よろしくお願いします。
おまえらprintfデバッグをやるときにどんな文字列を表示させてる?俺はいつもunkoって表示させてる。
ひさびさに面白そうな問題が。
>>181 >L=10, n<=1のとき,すなわち,配列の添字の範囲10以内では,1もしくは2個の
>データの値の昇順が保証されない場合に,
この条件をもうちょっと厳密に頼む。
>>182 そこで使っている変数の値を表示させることが多い。
その必要がなければ、関数名や"enter"/"leave"とか。
>>181 実装は面倒なのでアイデアだけ.n ≦ 1 ならこれで動くはず.
・二分探索を行う.ただし端点の要素は三つくらいの要素の
中間値でも取って昇順条件を外れた要素を踏まないようにする.
・二分探索で範囲を絞りきったときの状態は
1. 目的の値が見つかった → 終了.
2. 昇順条件には従うが目的の値は見つからない → 存在しない.
3. 昇順条件に反する値が見つかった → その値をキーにして再度二分探索.
一般の L, n については考えてないけど,O(n log L) くらいがある気はする.
>>188 >一般の L, n については考えてないけど,O(n log L) くらいがある気はする.
なんでLの増加関数?
Lが小さいほど頻繁な交換が許されるので
より時間が掛かるようになるんじゃないか?
>>189 L はリストの長さだから,全く交換が許されないとしても O(log L) はかかる.
L が小さいときは全然単調じゃなくなって線型探索したほうが早くなる(かもしれない)
けど,O 表記は漸近的に大きいときの挙動をあらわすので関係ない.
>>190 >L はリストの長さだから
俺は違うように読んだ。正確な事は読み取れないけど、例えば
「任意の長さLの部分列について、n組が交換されている」
とか。これだとそんな列は存在し得ないので正しい解釈じゃないけど。
それに、
>>180 ではL=10でデータ数は100個と言っている。
>>191 なるほど,再読すると 191 のように読めた.俺の誤読っぽい.
やっぱり細かいところがわからんので 181 は再説明求む.
全然関係ないんだけど,や.の句読点になってるのは 何のソフト使ってるのか教えてくれないか? 翻訳ソフトだとしたら高機能っぽいので興味がある。
>>193 翻訳?
MSIMEで「、」「。」の変換候補に出てくるけど?
>>193 皮肉だと思うがマジレス。
理系の人は日常的に使う。論文などでもそれが普通。
MS-IMEでも設定で句読点変えれる。
俺は文系だけどな!
[1] C言語プログラミング [2] 問題文(含コード&リンク): ファイルからの入力・構造体 ファイル「kyotocity.txt」には、京都市の区ごとの人口(人)と面積(平方キロメートル)が記述されている。 これらの情報を格納する構造体 struct division を宣言しなさい。 struct division { char name[20]; int population; double area; } struct division型の配列 kyoto[11]を用意し、ファイルからデータを読んで、配列に入力しなさい。 入力した構造体の配列を調べて、以下の情報を出力しなさい。 人口が最大の区と最小の区の、名前と人口。 面積が最大の区と最小の区の、名前と面積。 人口密度が最大の区と最小の区の、名前と人口密度。 ↓txtファイル中身のデータ↓ Kita 124306 94.92 Kamigyo 83082 7.11 Sakyo 168133 246.88 Nakagyo 100145 7.38 Higashiyama 41659 7.46 Yamashina 136769 28.78 Shimogyo 74897 6.82 Minami 97877 15.78 Ukyo 201819 291.95 Nishikyo 155973 59.20 Fushimi 284812 61.62 [3.1] OS: windws xp pro [3.2] visual studio 2003 [3.3] 言語: C [4] 期限: 11月までに、なるべく早くお願いします [5] その他の制限: 反復構造、ソート、探索、ポインタ、ファイル、構造体
197 :
デフォルトの名無しさん :2006/10/22(日) 21:26:22
>>196 です。
196の問題の解く部分は
人口が最大の区と最小の区の、名前と人口。
まででも構いません。
面積が最大の区と最小の区の、名前と面積。と
人口密度が最大の区と最小の区の、名前と人口密度。
は、前者の問題を応用して自分でやります
よろしくお願いします
>>193 MS-IMEを始めとして、多くの日本語IMEは句読点に何を使うか、,と。.の組み合わせを設定できる。
たとえば,.を使用するように選んだ場合、キーボードの、。を叩くと変換するまでもなく直接,.が入力される。
スレ違いすまん。
いや、IMEで設定するのは数字のあとに.や,にするにしておけばいいことじゃん 日本語のあとじゃないだろ。
わざわざ,や.に設定する意味が分からない。
>>201 別に、や。である必要もない。
それぞれの分野での習慣。
、や。は文として必要。 数字の後の,や.以外での必要性が分からない。
205 :
181 :2006/10/22(日) 21:59:30
>>188 具体案ありがとうございます。
>>183 ,
>>192 100個の範囲の中から、10個見たとき昇順でない要素があると言ってましたが、
問題文その物のようです。
これ以上細かなことは聞いてないんです・・・
1...100のうち任意に取り出した、連続した10個ってことなんだろうか
207 :
デフォルトの名無しさん :2006/10/22(日) 23:41:00
[1] 授業単元:コンピューター実習 [2] 問題文 文字列に文字列を挿入する関数 str_ins を作成する。 str_ins( 挿入先の文字列 , 挿入する位置 , 挿入文字列) -------------------雛形-------------------------- #include <stdio.h> int str_ins(char str[], int p, char pat[]) { } int main(void) { char a[128]; strcpy(a, "abcdef"); str_ins(a, 3, "xyz"); puts(a); } -------------実行結果----------------- [yokoyama@pratpc02 Temp]$ ./a.out abcxyzdef [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 10月24日 [5] その他の制限:特になし よろしくお願いします
>>207 #include <string.h>
int str_ins(char str[], int p, char pat[])
{
size_t len = strlen(pat);
memmove(str+p+len,str+p,strlen(str+p)+1);
memcpy(str+p,pat,len);
}
>>208 そりゃ文字列操作じゃなくてメモリ操作だろ
pの例外とか考えにゃならん
けど良く頑張った
>>208 memmoveの引数、一番目と二番目が逆じゃね。
>>211 str_ins(a,-1,b);
とか出来るけど、おかしいよね
>>211 strの範囲外をpが指してる時とかじゃね?
まぁ俺は変なデータを渡す奴が悪い、そんなの知らん。という主義だけど。
214 :
181 :2006/10/23(月) 00:06:54
>>206 取り出すのではなく、1〜100までの中の任意の連続した10個の中に
昇順ではない並びがある時といった感じだったと思います。
昇順ではない箇所はいくつかというのは指定されていなかったと思うので、
拡大すれば1〜100のなかで1箇所だけ順序が違うけど2分探索しろ ということだと思います。
[1] プログラミング [2] 2 数 n と m を入力すると, 下のように '@' を n x m 個並べたパターン (画像) を出力するプログラムを作成せよ. 制御部は for 文の 2 重ループを用いよ. [3] [3.1] winXP sp2 [3.2] cygwin [3.3] C [4] 23時59分 [5] n=5 m=8でこんなん @@@@@@@@ @@@@@@@@ @@@@@@@@ @@@@@@@@ @@@@@@@@ よろしくお願いします
>>212 >>213 負の値はさすがにアレだけど、
> str_ins( 挿入先の文字列 , 挿入する位置 , 挿入文字列)
↑に従うと文字サイズ渡せないから、エラーチェックなんてどうでもいい課題なんじゃないかね?
文字サイズ?
>>216 まぁ人それぞれの解釈になるわな
というわけで俺は愚問でFAした
>>215 #include<stdio.h>
#include<stdlib.h>
int main(int argc,char**argv){
if(argc==3){
int n=atoi(argv[1]);
int m=atoi(argv[2]);
int i,j;
for(i=0;i<n;putchar('\n'),++i)
for(j=0;j<m;++j)
putchar('@');
}
}
2数が2進数に見えた もう寝よう…
222 :
◆3zNBOPkseQ :2006/10/23(月) 00:31:46
入力した一字を判別したプログラムをif制御で作りたいのですが、下のどこが違いますか? #include <stdio.h> int main (void) { int mozi; printf("文字を一字入力してください。"); scanf("%s",&mozi); if(mozi>='A' && mozi<='Z')printf("英大文字です"); else if(mozi>='a' && mozi<='z') printf("英小文字です"); else if(mozi>=0 && mozi<=9) printf("数字です"); else printf("英字でも数字でもありません"); return 0; }
scanf("%c",&mozi);
めんどうだから int main(){ char c; scanf("%c",&c); とかじゃなかった?
char mozi;
226 :
◆3zNBOPkseQ :2006/10/23(月) 01:03:47
>>225 文字列でなくて一字でもcharの方がいいのですか
サンクスコ
227 :
215 :2006/10/23(月) 01:11:59
すいません、#include<stdlibh>とかはまだ使ってないです。
>>174 と同じくらいの感じで出来ないでしょうか。
>>227 #include <stdio.h>
int main()
{
int m, n, i, j;
printf("m> "); scanf("%d", &m);
printf("n> "); scanf("%d", &n);
for (; m > 0; putchar(\n), m--) {
for (i = 0; i < n; i++)
putchar("@");
}
}
putchar(\n) => putchar('\n') putchar(@) => putchar('@') に修正
230 :
デフォルトの名無しさん :2006/10/23(月) 02:31:20
231 :
デフォルトの名無しさん :2006/10/23(月) 02:34:44
>>230 です。
エラー文訂正します
/*
以下エラー文です。
c:\MyC>gcc foo.c
foo.c: In function `main': ←foo.c: In function `sort': が正しいです。すみません><
foo.c:42: incompatible types in assignment
foo.c:43: incompatible types in assignment
foo.c:44: incompatible types in assignment
*/
strcpy使えよ
233 :
215 :2006/10/23(月) 02:38:39
228 ありがとうございました
234 :
デフォルトの名無しさん :2006/10/23(月) 02:49:37
最近はポインタ使っちゃいけないと学校で教えてるのか…?
馬鹿学生が多くて理解できないから 最初からポインタを教えないらしい。
教える側がポインタを理解してないらしい
[1] 授業単元:プログラミング基礎 [2] 問題文(含コード&リンク): あるフォルダ(sample)の中にある画像(.jpg,.jpeg)の更新日時(作成日時?)を取得し yyyy-mmの様にフォルダを作成し各々のフォルダに振り分けるプログラムを作成せよ。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 水曜日まで [5] その他の制限: よろしくお願いします。
ファイルの日付だよな? Unixシステムコールか、Win32APIのどっちで取ってくるのか
>>239 質問者じゃねーけど、OSがWinXPなんだから、APIでいいんじゃね?w
いあコンパイラはgccとか書いてあるしさ 学校のPCじゃLinuxだけど、うちだとWinしかないとかありうるかなーと まぁやる気はないんだが
242 :
238 :2006/10/23(月) 06:50:30
>>239 言葉が足りなくてすみません。
Win32APIでお願いします。
JavaでLinuxは触っていますがCではXPにCygwin+gccがメインです。
それじゃAPIじゃダメだろ。
FindFirstFile()とFindNextFile()で作るしかなかろう。
245 :
238 :2006/10/23(月) 07:36:30
自分はCがあまり得意で無い為にこちらで聴く事にしたんです。 Win32APIだと作る事ができないんですか? 漠然と課題内容の物作って来いと言う課題だったので…。
247 :
デフォルトの名無しさん :2006/10/23(月) 08:01:49
>>246 わざわざありがとうございます。
自分でやってみて詰まったらまた着ますのでよろしくお願いします。
249 :
デフォルトの名無しさん :2006/10/23(月) 08:12:37
逐次でやりゃあオケじゃん
251 :
238 :2006/10/23(月) 10:34:13
>>250 様
出先からなので携帯から失礼します。
本当にありがとうございます。
参考を見ても全くどうすれば良いか分からずに半ば諦めモードでした。
凄く助かりました本当にありがとうございました。
>>181 ターゲット m は検索結果の場所 n を元に n-L < m < n+L の範囲にあるので
その範囲を線形サーチすると見つかる(はず)
int search(int search_value, int *data, int data_num){
intcenter, search_start, search_end;
inti;
search_start=0;
search_end=data_num-1;
while(search_end-search_start>=0){
center=(search_end-search_start)/2+search_start;
if(data[center]==search_value)
return center;
if(data[center]>search_value){
search_end=center-1;
}
else{
search_start=center+1;
}
}
search_start-=L;
search_end+=L;
if(search_start<0)
search_start=0;
if(search_end>=data_num)
search_end=data_num-1;
for(i=search_start;i<=search_end;i++)
if(data[i]==search_value)
return i;
return -1;
}
制限時間内で未解決の問題ってもうないの? 「オレの質問答えが出てない」っていう質問者さん、是非もう一度書きこんで下さい。
[1] 授業単元:C演習 [2] 問題文(含コード&リンク): コマンド行から複数の数値を受け取りその平均値を出力するプログラムを作成し、プログラムリストと実行結果を示せ。 ヒント:受け取った文字列をdouble型に変換するには関数double atof(const char *nPtr)を使うこの関数を使うにはstdlib.hのインクルードが必要である #include <stdio.h> #include <stdlib.h> int main(void) { char str[] = "1.41421356"; double x; x = atof(str); } [3] 環境 [3.1] OS: (Linux) [3.2] コンパイラ名とバージョン: (gcc 3.4) [3.3] 言語: (C) [4] 期限: ([金曜まで]) [5] その他の制限: ヒントみたいなのがあるけどよくわかりません、おねがいします
[1] 授業単元: オペレーティングシステム [2] 問題文(含コード&リンク): 無限に走り続けるプログラムtest.cを作り、実行可能なプログラムにtestという名前をつけ、これをバックグラウンドで走らせ、そのプロセスを殺すこと。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 明日まで [5] その他の制限: 特になし
>>254 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char *argv[])
{
int i=0,n;
double *x;
double a=0,m=1,h=0;
if(argc<2) {
fprintf(stderr,"error : no input");
exit(1);
}
n=argc-1;
x=(double *)malloc(sizeof(double)*n);
while(i<n)
x[i++]=atof(argv[i+1]);
for(i=0;i<n;i++) {
a+=x[i];
m*=x[i];
h+=1/x[i];
}
a/=n;
m=pow(m,1/(double)n);
h=n/h;
printf("Arithmetical average = %lf\n",a);
printf("Multiply mean = %lf\n",m);
printf("Hamonic mean = %lf\n",h);
free(x);
return 0;
}
>>257 なるほど。算術平均とは言われてないもんな。
259 :
デフォルトの名無しさん :2006/10/23(月) 17:58:00
[1] 授業単元:C演習 [2] 問題(含コード&リンク): 括弧、加算、減算、乗算、除算に対応した記述を認識し、 先行順走査と後行順走査に書き換えるプログラムを作成せよ。 後行順 入力例:(a+b)-c 出力例:ab+c- [3] 環境 [3.1] OS: (Linux) [3.2] コンパイラ名とバージョン: (gcc 3.4) [3.3] 言語: (C) [4] 期限: ([来週まで]) [5] その他の制限:
260 :
デフォルトの名無しさん :2006/10/23(月) 19:38:55
262 :
デフォルトの名無しさん :2006/10/23(月) 20:14:02
so。
266 :
181 :2006/10/24(火) 01:59:14
>>252 ありがとうございます。
早速、組み込んでみます。
267 :
デフォルトの名無しさん :2006/10/24(火) 03:00:38
>>264 コンパイルするとこのようなエラーがでました。
ex02.c: In function `main':
ex02.c:64: parse error before `int'
ex02.c:67: `t' undeclared (first use in this function)
ex02.c:67: (Each undeclared identifier is reported only once
ex02.c:67: for each function it appears in.)
>>267 int main() {
char buf[256];
fgets(buf, 256, stdin);
int p = 0;
tree *t = equation(buf, &p);
を
int main() {
char buf[256];
int p = 0;
tree *t:
fgets(buf, 256, stdin);
t = equation(buf, &p);
に変更
>>269 1次元適合度検定って何?カイ二乗検定なら聞いた事があるが。
よろしかったら詳しく説明してあるサイトへのリンク貼ってくれたら
プログラム書けると思うよ。
>>271 携帯からなんでサイトは貼れませんけどカイ二乗というやつです。
一次元適合度検定はx軸をM個の区間に分けN個のデータの度数分布を調べ、カイ二乗を計算するものです
273 :
デフォルトの名無しさん :2006/10/24(火) 14:06:38
ファイル出力する際、putsを使うと読み込んだ文字列を 片っ端から出力しちゃうんですが、どの文字(何文字目)を出力するか 指定できますか?
数字1? 1 数字2? 2 1足す2の結果は3です。 というプログラムをお願いします
276 :
デフォルトの名無しさん :2006/10/24(火) 14:59:04
指定の仕方を教えていただけますか? 指定の仕方の載ってるサイトだけでも・・・。
>>275 <?
echo "数字1?<br>1<br>数字2?<br>2<br>1足す2の結果は3です。";
?>
278 :
asd ◆TJ9qoWuqvA :2006/10/24(火) 15:32:31
[1] 授業単元:Cプログラミング [2] 問題文(含コード&リンク):実数riを入力すると自然対数を求めて表示するプログラムを作成せよ。 ただし、0以下の場合は不可能と出る。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:Crescent [3.3] 言語:C [4] 期限:10月25日1時 [5] その他の制限:特になし
279 :
デフォルトの名無しさん :2006/10/24(火) 15:49:30
>>273 その文字列がchar momoji[32]="nunenumEor"で宣言されてたら、
Eだけ表示させたかったら、put(momoji[7])で読み込め
280 :
デフォルトの名無しさん :2006/10/24(火) 17:20:04
>>278 #include<stdio.h>
#include<math.h>
intmain(void)
{
double ri;
printf("Input value :");
scanf("%lf", &ri);
if(ri<=0.0)
printf("不可能\n", ri);
else
printf("自然対数 %f\n", log(ri));
return 0;
}
281 :
280 :2006/10/24(火) 17:22:56
訂正 printf("不可能\n", ri); ↓ printf("不可能\n");
[1] 授業単元:Cプログラミング [2] 問題文(含コード&リンク):二行二列の行列の掛け算をせよ。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語:C言語 [4] 期限:2006年10月26日07:00まで [5] その他の制限:void関数までは習いました。 void sum(int x[][2],int y[][2],int z[][2]);みたいな関数を授業で使ったのですが、 さっぱり意味がわからなくて困ってます。 int x11,x12,x21,x22; int y11,y12,y21,y22; int a[2][2]={{x11*y11,x12*y12},{0,0}}; int b[2][2]={{x11,x12},{x21,x22}}; int c[2][2]={{y11,y12},{y21,y22}}; printf("x11="); scanf("%d",x11); こんな感じで数値を代入しようとしても代入されないので、この状態からまったく進みません。 どうかよろしくおねがいします。
>>282 C言語だと変数宣言のときに変数の値って使えないんじゃないかな
Borand C++ bilder使ってます わからないので教えてください Form1のメンバとして整数型の変数countを用意します。 TButtonコンポーネントとTLabelコンポーネントをForm1に貼り付けます。 Buttonをクリックするごとに、クリックした回数と何か文章をLabelに表示してください。 この時、文章の中身はできるだけ更新してください。 たとえば5種類文章を用意して、それをクリックごとに順番に表示させてもOKです。
>>286 よくしらんがVCLなので。
引数とかはよく知らない。BCBもってないし。
Button1Click {
count++;
Label1.Caption = IntToStr(count) + "回クリックされました";
}
for(i=0;i<=100;i++) printf("%3d", i) としたとき 0 1 2 ・ ・ ・ 10 11 となるところを 001 002 003 ・ ・ ・ 010 としたいのですが、何かよい方法はないでしょうか?
291 :
デフォルトの名無しさん :2006/10/25(水) 09:42:26
改行コードが4回カウントされるまでfgetcを繰り返す
[1]C言語演習T [2] 今回はファイル入出力の応用で、 ファイルの簡単な暗号化及び複合化を行うプログラムを作成する。 暗号化は改行以外の文字のアスキーコードに1を足す 複合化はその逆の動作を行うこと 引数の2番目が暗号化と複合化のどちらかを決定、 3番目が入力ファイル名を示し、 4番目が出力ファイル名を示す 上記のようなプログラムを作成せよ [3]OS:Linux コンパイラ:gcc3.4 言語:C [4]明日午前9時30分 [5]C言語の基礎 関数・ポインタ・構造体・ファイル入出力まで学んでいます よろしくお願いします
[1]計算機プログラミング [2] ● 西暦の年号を入力して、閏年かを判定するプログ ラムを作成しましょう。 ■ 入力は正の整数 ■ 入力ミスの場合(0か負の整数)は、 「正の整数を入力しましょう。」と表示する ■ 閏年の場合は、「閏年です。」と表示する ■ 閏年でない場合は、「閏年ではないです。」と表示する ■ 閏年は、年号が4で割り切れる年。(2004年) ただし、100で割り切れる年は閏年ではない。(1900年) しかし、400で割り切れる年は閏年となる。(2000年) ■ 条件をうまく考えよう(「かつ」と「または」で言い換えよ う)。プログラムは、例題を参考にしよう。 ■ プロジェクト名:06leap ファイル名:06leap.c ■ ソースコードを印刷し、自分の生まれた年で試した結果 を記入して提出しよう [3]windowsXP [4]10月30日
>>291 #include <stdio.h>
#include <stdlib.h>
int main(){
FILE *readfile,*writefile;char buff[512],*endptr;long i,pos,num;double data;
readfile=fopen("sample.txt","r"); writefile=fopen("result.txt","w");
if(!readfile || !writefile){ puts("エラー"); exit(1); }
for(i=0;i<4;++i)fgets(buff,sizeof(buff),readfile);
for(i=0;1;i^=1){
pos=ftell(readfile);
if(!fgets(buff,sizeof(buff),readfile)) break;
num=strtol(buff,&endptr,10); fprintf(writefile,"%03d\n",i?num%1000:num/1000);
while(fgets(buff,sizeof(buff),readfile)){
if(buff[0]=='9') continue;
num=strtol(buff,&endptr,10);
if(num){
if(i)data=strtod(endptr,&endptr);
data=strtod(endptr,&endptr);
fprintf(writefile,"%06d %f\n",num,data);
}else{
fprintf(writefile,"%06d\n\n",num);
break;
}
}
if(!i)fseek(readfile,pos,SEEK_SET);
}
fclose(readfile); fclose(writefile);
return 0;
}
>>294 #include <stdio.h>
int main(){
int year;
printf("西暦を入力してください:");
scanf("%d", &year);
if(year <= 0){
printf("正の整数を入力しましょう。");
return -1;
}
if((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)){
printf("閏年です。");
}else{
printf("閏年ではないです。");
}
return 0;
}
297 :
デフォルトの名無しさん :2006/10/25(水) 12:01:34
質問です。宿題で期限が土曜日正午です。 「多倍長整数を使うことによって、フィボナッチ数列の100番目 までを正しく計算するプログラムをC言語で作成しなさい。」 いろいろ調べたんですが、多倍長整数がなんなのかよくわかっていないので。。。 よろしくおねがいします。
299 :
デフォルトの名無しさん :2006/10/25(水) 12:15:32
>>298 すいません。書き直します。
[1]単元は多倍長整数、二重リンクリスト、ポインタあたりですたぶん。
[2]「多倍長整数を使うことによって、フィボナッチ数列の100番目
までを正しく計算するプログラムをC言語で作成しなさい。」
[3]環境はUnix?
コンパイラ名は・・・gccって書いてコンパイルはしてるんですが。。
言語はC言語
[4]今週の土曜日正午まで
[5]まだ初めて3週間くらいです。超簡単な入門書は一応全部目を通しました。
よろしくお願いします。
300 :
デフォルトの名無しさん :2006/10/25(水) 12:43:19
日本ハゲひちょりーズ
301 :
289 :2006/10/25(水) 12:45:11
>>291 awk または gawk で
BEGIN{
for(i=0;i<4;i=i+1)
getline
}
{
if(NF==1){
kind1=substr($1, 1, 3)
kind2=substr($1, 4, 6)
kind[kind1]=1;
kind[kind2]=1;
}else{
if(substr($1,1,1)=="9")
continue
data_num[kind1]+=1
data_label[kind1,data_num[kind1]]=$1
data[kind1,data_num[kind1]]=$2
data_num[kind2]+=1
data_label[kind2,data_num[kind2]]=$1
data[kind2,data_num[kind2]]=$3
}
}
END{
for(kind_loop in kind){
print kind_loop
for(i=1;i<=data_num[kind_loop];i+=1)
{
printf "%s %s\n", data_label[kind_loop,i], data[kind_loop, i]
}
}
}
305 :
デフォルトの名無しさん :2006/10/25(水) 13:18:26
>>302 ありがとうございます。
本を見ながら何が書いてあるか考えます。
306 :
295 :2006/10/25(水) 13:31:48
307 :
デフォルトの名無しさん :2006/10/25(水) 17:48:36
>>298 書き直したらシカト・・・
結局、いちゃもんしかつけれないのねw
309 :
291 :2006/10/25(水) 18:01:14
お返事が遅くなり、大変申し訳ありません。 >295,306 >304 ありがとうございます。助かりましたm(_ _)m こんなすれ違いな質問に回答をしていただき感謝しています。
310 :
デフォルトの名無しさん :2006/10/25(水) 18:26:26
ビット論理演算子の(Aは同じ関数をとる) A^A→0 になるのは何がすごいのでしょうか・・・
当たり前のこと。何もすごくない。
312 :
デフォルトの名無しさん :2006/10/25(水) 18:30:32
1)プログラム演習 C言語コース 2) A-1 ファイルを読み込み、行番号をつけて出力するプログラムを作成せよ A-2 引数に3つのファイル名を取ると、最初の二つのファイルを結合し、 3つめのファイルに保存するプログラムを作成せよ -実行例- % cat text01.txt good morning!! % cat text02.txt good bye!! % ./a-2 text01.txt text02.txt text03.txt % cat text03.txt good morning!! good bye!! 3)OS:Linux コンパイラ:gcc3.4 言語:C 4)明日 5)ポインタを終えてファイル入出力まで学んだ所です 構造体はまだやっていません よろしくお願いします
>>313 A-2
#include <stdlib.h>
int main(int argc, char* argv[])
{
if(argc != 4)
return 0;
char com[1024] = "cat ";
strcat(com, argv[1]);
strcat(com, " ");
strcat(com, argv[2]);
strcat(com, " > ");
strcat(com, argv[3]);
system(com);
return 0;
}
#include <string.h>
int main(){
318 :
デフォルトの名無しさん :2006/10/25(水) 20:54:27
[1] 授業単元: 計算数学演習 [2] 問題文(含コード&リンク): 3つの自然数を選んだところ、それらの和は2006になり、それらの最小公倍数は2006の倍数に なった。このような3つ自然数の組を列挙しなさい。 [3] 環境 [3.1] OS: (Windows) [3.2] コンパイラ名 :VC 6.0 [3.3] 言語: (C/C++) [4] 期限: 無期限 [5] その他の制限:実行時間が1000msを超えるのもは不可
>>293 #include<stdio.h>
int main(int argc,char **argv){
char c;
int key;
FILE *infp,*outfp;
/*手抜き*/
key = (0 == strcmp(argv[1],"encode"))? 1:-1;
infp = fopen(argv[2],"r");
outfp = fopen(argv[3],"w");
while(EOF != (c = fgetc(infp))){
fputc((c == '\n')? c:c+key,outfp);
}
fclose(infp);
fclose(outfp);
return 0;
}
>>318 高速化の余地は大いにあるけど、1000msも掛かることはないと思う。
# include <iostream>
/*
* a, b, cの最小公倍数が2006の倍数である
* は、
* a, b, cのいずれかが2の倍数であり、かつa, b, cのいずれかが17の倍数であり、
* かつa, b, cのいずれかが59の倍数である
* と同値である。
*/
bool test(int a, int b, int c)
{
# define DIVISIBLE(n) !(a % n && b % n && c % n)
return DIVISIBLE(2) && DIVISIBLE(17) && DIVISIBLE(59);
# undef DIVISIBLE
}
int main()
{
for(int i = 1; i <= 2004; i++)
for(int j = 1; j <= 2005 - i; j++)
if(test(i, j, 2006 - i - j))
std::cout << "(" << i << ", " << j << ", " << 2006 - i - j << ")\n";
}
321 :
デフォルトの名無しさん :2006/10/25(水) 21:48:29
問題文があいまいなのはエスパーの訓練も兼ねているということか
325 :
デフォルトの名無しさん :2006/10/25(水) 23:54:59
失礼します. C/C++初心者なのでご教授お願いしたいのですが, javaでいうところのset/get 関数を配列で扱う場合 C/C++ではどのように実装するのでしょうか? javaでは配列ごと int[] AA(){return aa;} とreturn できるのですが Cでは配列は返せないのでC特有のスマートな方法があるのでしょうか? よろしくお願いします.
326 :
デフォルトの名無しさん :2006/10/25(水) 23:59:18
配列へのポインタを返せば? つか、そんなことが必要になる時点で設計失敗だがなw
>>326 > 配列へのポインタを返せば?
で、墓穴を掘り
…*vector返せよ
> つか、そんなことが必要になる時点で設計失敗だがなw
で、人生に終止符を打つ
…すべてファーストクラスオブジェクトなんだからどうでもいいだろ
>>313 A-1
#include<stdio.h>
int main(int argc, char *argv[]){
FILE *fp;
int moji, line_no=0;
int flag_prev_is_linefeed=1;
if(argc<2){
fprintf(stderr, "\nUsage: %s filename\n", argv[0]);
exit(1);
}
fp=fopen(argv[1], "r");
if(fp==NULL){
fprintf(stderr, "\nError: %s file cannot open.\n", argv[1]);
exit(1);
}
while(1){
moji=fgetc(fp);
if(moji==EOF)
break;
if(flag_prev_is_linefeed)
{
flag_prev_is_linefeed=0;
printf("%4d ", ++line_no);
}
putc(moji, stdout);
if(moji=='\n')
flag_prev_is_linefeed=1;
}
fclose(fp);
return 0;
}
>>323 χ2乗検定の前まで
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define HYOUHON_KIND 11
#define HYOUHON_NUM 100
double uniform_rand(void){ /* 一様擬似乱数 */
return (double)rand()/(RAND_MAX-1);
}
double p(double x){ /* 確率密度関数 */
if(x<0.0 || x>=4.0)
return 0.0;
return (-x/8+0.5);
}
int p_rand(double x){ /* 確率分布に従う擬似乱数 */
if(uniform_rand()<p(x))
return 1;
return 0;
}
int main(void){
int data[HYOUHON_KIND]={}; /* 配列を 0 で初期化 */
int i, j;
double hyouhon_value;
srand(time(NULL));
for(i=0;i<HYOUHON_KIND;i++){
hyouhon_value=4.0/(HYOUHON_KIND-1)*i;
for(j=0;j<HYOUHON_NUM;j++)
data[i]+=p_rand(hyouhon_value);
printf("%3d %.3f %d/%d\n", i, hyouhon_value, data[i], HYOUHON_NUM);
}
return 0;
}
331 :
デフォルトの名無しさん :2006/10/26(木) 10:28:01
[1] 授業単元:C言語 [2] 問題:ボイヤームーア法を用いた文字検索プログラムの作成とその動作解説 [3] 環境 [3.1] OS:WindowsXP(動作はUNIX上で行う) [3.2] コンパイラ名とバージョン:不明 [3.3] 言語:Cのみ [4] 期限:2006年10月31日 23:59:59まで [5] テキストファイルから文章を読み込んで、それに対してこちらが検索文字を打ち込みます。 結果は「icchi:〜gyou〜moJime」とし、最後に合計を「total:〜」として出力します。 他の人からもらったものがあるんですが、いまいち動作が理解できません。 あと、条件として同じ文字が続いている文章に対してそれよりも少ない数 の同じ文字で検索した際は、検索文字の数ずつではなく1文字ずつずらさな ければいけないそうです。 例を挙げると、「aaaaaaaaa」という文字列に「aaa」で検索をしたときの 出力結果は3個ではなく7個になります。 以下にもらったものを張ります。よろしければ動作説明もお願いします。 よろしくお願いします。
332 :
デフォルトの名無しさん :2006/10/26(木) 10:30:13
#include <stdio.h> #include <string.h> #define MAXCHR1 1000 #define MAXCHR2 256 int main(void) { char filename[MAXCHR2],ex[MAXCHR1],strg[MAXCHR2],x[MAXCHR2]; FILE *fp; int a,m,nall,s,M,N,b,c,resoult,P,e,t; printf("Input filename\n"); scanf("%s",filename); printf("Input search string.\n"); scanf("%s",strg); M=strlen(strg); if((fp=fopen(filename,"r"))==NULL) { printf("read open error!\n"); return (-1); }
333 :
デフォルトの名無しさん :2006/10/26(木) 10:30:44
a=0; m=0; while(m<M-1) { if(strg[M-1]==strg[m]) { x[a]=M-m; a++; } m++; } P=0; e=0; while(fgets(ex,MAXCHR1,fp)!=NULL) { N=strlen(ex); P++; nall=0; s=0; while(nall+M-1<N) { nall=nall+s;
334 :
デフォルトの名無しさん :2006/10/26(木) 10:31:57
if(ex[M-1+nall]==strg[M-1]) { resoult=strncmp(ex+nall,strg,M); if(resoult==0) { printf("icchi:%dgyou%dmojime\n",P,nall+1); e++; } b=0; while(b<a) { resoult=strncmp(ex+nall+x[b],strg,M); if(resoult==0) { printf("icchi:%dgyou%dmojime\n",P,nall+1); e++; } b++; } if(a==0) { s=M; } else { s=x[0]-1; } }
335 :
デフォルトの名無しさん :2006/10/26(木) 10:32:34
else { c=1; t=0; while(c<M-1 && t==0) { c++; if(ex[M-1+nall]==strg[M-c]) { t=c; } } if(t!=0)s=c-1; else s=M; } } } printf("total:%d\n",e); fclose(fp); return(0); }
とても基本的な問題ですみません、自分の好きな関数名を利用して 関数をつくり、座標X,Yを入力して0点からの距離とθを求める プログラムなのですが、 #include <stdio.h> #include <math.h> int kyori(float y, float x,float l) { return l=sqrt((x*x)+(y*y)); } sita(float y, float x,float C) { return C=atan2(y,x); } void main() { float x; float y; float l; float C; printf("座標Xを入力してください。\n"); scanf("%f", &x); printf("座標Yを入力してください。\n"); scanf("%f",&y); kyori (l,x,y); printf("距離は%fです\n",l); printf("角度θは%f \n",C); } で一応完成はして実行もできるのですが計算結果がマイナスになったりなど どうもおかしいのです、間違っている箇所等ございましたらお願いいたします。
>>338 たぶんθがマイナスになってるんだと思うが、どこもおかしくはない。
atan2の戻り値は-πからπまでだから。
0から2πにしたいのなら、2πを加えてやればいい
[1] 授業単元: 情報処理工学 [2] 問題文: pixelを用いて図形を描く問題です。 15×15の画面に(3,3)-(10,8)の直線を描きなさい。 また、(3,3)-(8,10)の直線も加えなさい。 授業で扱った例題を応用して書くプログラムだと思います。 下に授業で扱った例題プログラムを示しておきます。 #define XSIZE 15 #define YSIZE 15 #include <stdio.h> main(){ char pixel[XSIZE][YSIZE]; int x,y; for(y=0;y<YSIZE;y++) for(x=0;x<XSIZE;x++)pixel[x][y]='.'; for(x=0;x<XSIZE;x++) pixel[x][x]='*'; for(y=0;y<YSIZE;y++){ for(x=0;x<XSIZE;x++) printf("%c",pixel[x][y]); printf("\n"); } } このプログラムをもとに上記の課題プログラムを作るんだと思います。 [3] 環境 [3.1] OS:UNIX [3.2] コンパイラ名とバージョン: (viエディタ) [3.3] 言語:C [4] 期限:2006年10月31日(火) [5] その他の制限:なし
>>343 こんな感じ
struct node **a,**b;
for(a=&start;1<d1;--d1) a=&((*a)->next);
for(b=&start;1<d2;--d2) b=&((*b)->next);
p = *a;
*a = *b;
*b = p;
p = (*a)->next;
(*a)->next = (*b)->next;
(*b)->next = p;
347 :
デフォルトの名無しさん :2006/10/27(金) 01:25:32
>>347 お兄ちゃん、罠だよ♪
メモ帳の自動認識が誤爆してるだけ。
prime.txt作られたけど別に文字化けしてないよ。
351 :
デフォルトの名無しさん :2006/10/27(金) 02:55:53
352 :
デフォルトの名無しさん :2006/10/27(金) 03:02:50
>>344 #include <stdio.h>
#define XSIZE 15
#define YSIZE 15
/* 点p1と点p2を通る直線の式y=ax+bを求める */
void linexpr(double p1[2], double p2[2], double *a, double *b)
{
*a = (p1[1] - p2[1])/(p1[0] - p2[0]);
*b = p1[1] - (*a)*p1[0];
}
353 :
デフォルトの名無しさん :2006/10/27(金) 03:03:37
>>344 続き
int main(){
char pixel[XSIZE][YSIZE];
int x,y;
double a; /* 直線の傾きa y = ax + b */
double b; /* 直線のY軸との交点 y = ax + b */
double p1[2]; /* 点1の座標 */
double p2[2]; /* 点2の座標 */
for(y=0;y<YSIZE;y++) for(x=0;x<XSIZE;x++)pixel[x][y]='.';
p1[0] = 3; p1[1] = 3; /* 点(3, 3) */
p2[0] = 10; p2[1] = 8; /* 点(10, 8) */
linexpr(p1, p2, &a, &b); /* 直線の式を求める */
for(x=0;x<XSIZE;x++) {y = a*x+b+0.5; if (y >= 0 && y < YSIZE) pixel[x][y]='*';};
p1[0] = 3; p1[1] = 3; /* 点(3, 3) */
p2[0] = 8; p2[1] = 10; /* 点(8, 10) */
linexpr(p1, p2, &a, &b); /* 直線の式を求める */
for(x=0;x<XSIZE;x++) {y = a*x+b+0.5; if (y >= 0 && y < YSIZE) pixel[x][y]='*';};
for(y=0;y<YSIZE;y++){
for(x=0;x<XSIZE;x++) printf("%c",pixel[x][y]);
printf("\n");
}
return 0;
}
354 :
デフォルトの名無しさん :2006/10/27(金) 03:13:08
355 :
◆asHRtOTOD2 :2006/10/27(金) 10:55:35
[1] 授業単元: プログラミング基礎 [2] 問題文(含コード&リンク): 1次元配列を用いてn人分の数学の得点を100点満点で入力し、得点の高い順に並び替えて表示するプログラムを作成しなさい。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン: borland [3.3] 言語: C [4] 期限: 2006年10月30日17:00まで [5] その他の制限: わかる方がいたら、どうかお願いします。
#include <stdio.h> #include <string.h> int main(void){ int i,n; int sort[100]; int *points; printf("nを入力:"); scanf("%d",&n);i f(n<0) return 1; points=(int*)malloc(n,sizeof(int)); for(i=0;i<n;i++){ printf("%d番目の入力:",i); scanf("%d",&points[i]) if(!(0<=points[i] && points[i]<=100)) return 1; } for(i=0;i<100;sort[i++]=0); for(i=0;i<n;sort[points[i++]]++); for(i=100;i<0;i--) for(n=0;n<sort[i];i++) printf("%d点",i); free(points); } みたいな
357 :
◆asHRtOTOD2 :2006/10/27(金) 11:44:31
ありがとうございます。 でも エラーが出てコンパイルができませんでした。あと授業でやっているような組み方と違いますのでもう一度お願いしてもいいですか?授業では #include <stdio.h> void main(void) { int i, x[100], sum=0,n; printf("n="); scanf("%d",&n); for(i = 0; i <n ; i++){ printf("x[%d] =", i ); scanf("%d",&x[i]); } for(i = 0; i <n; i++){ sum += x[i]; } printf("sum = %d \n",sum); } こんな風にやっています。 本当に図々しくてすいません
>>357 それじゃ、>357の最後の行の前にこれを追加して味噌。
--
int nums[100 + 1];
for (int ic = 0; ic <= 100; ++ic) {
nums[ic] = 0;
}
for (int ic = 0; ic < n; ++ic) {
++nums[x[ic]];
}
for (int ic = 100; ic >= 0; --ic) {
for (int nc = 0; nc < nums[ic]; ++nc) {
printf("%d pts.\n", ic);
}
}
--
360 :
◆asHRtOTOD2 :2006/10/27(金) 12:12:31
すいません それでもエラーがでてコンパイルできません
362 :
デフォルトの名無しさん :2006/10/27(金) 12:17:13
エラー直してはいるんですけど ひとつなんとか直すたびに、他のエラーがどんどん出てきてしまって俺の力じゃ、むりっぽいです
363 :
358 :2006/10/27(金) 12:21:35
>>362 なんだよ、今時C89なのか?
ちょっと待て、書き直すから。
>>359 やってみてからほざけ。漏れは>356を書き直しただけだ。
364 :
358 :2006/10/27(金) 12:24:29
>>355 あーすまん、確かにコンパイラが過去の遺物になっていたな。
ほれ、これで通るだろ。
--
{
int ic;
int nums[100 + 1];
for (ic = 0; ic <= 100; ++ic) {
nums[ic] = 0;
}
for (ic = 0; ic < n; ++ic) {
++nums[x[ic]];
}
for (ic = 100; ic >= 0; --ic) {
int nc;
for (nc = 0; nc < nums[ic]; ++nc) {
printf("%d pts.\n", ic);
}
}
}
--
言うまでもないが、括弧の数に注意な。
365 :
◆asHRtOTOD2 :2006/10/27(金) 12:32:00
ありがとうございます なんとかなりました 本当にありがとうございました
こんなソート法初めてみたぜ。ビンソートとかバケットソートとか、 そういうたぐいの物なのか?
ソート効率は確かに悪そうだな。O(n^2)程度か。交換ソートと 大差ないかもな
入力を一回スキャンするだけでソートが完了するわけだから処理速度は無茶苦茶速いよ。
値域が狭いときは重宝する。
#普通こういう場合は何点が何人って表現になるはずだけどね。
どうでもいいけど、
>>364 のコードってどう見ても癖の強い熟練プログラマの手が入ってるっぽいんだけどw
#前置インクリメントとか制御変数名が二文字だとか
それはさておき、
>>356 はお粗末だの。0-100点の入力を許容しているのに配列は100要素しかない。
>>368 いやそうではないだろう。
表示部分のように二重ループがないとちゃんとソートされた出力が
出来ない事から、オーダーはO(N^2)だろ。
いや、出力部のループはO(N^2)じゃなくてO(N)だよ。それに
>>368 で書いたような出力でいいなら定数時間だし。
#勿論、値域が狭い(というか取り得る値のバリエーションが少ない)ことが前提ね。
具体的な応用としてはこういう何かの成績みたいなものとかグレイ256諧調画像の濃度分布とかね。
>>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]);
375 :
374 :2006/10/27(金) 13:54:37
書き込み成功してたのかよ orz
>>373 >>364 のコードでは、外側のループは101回まわり、
その一回ごとに内側のループはnums[ic]回まわる。
したがって、内側のループは合計するとΣ{ic=0..101}(nums[ic])回まわる。
一方、Σ{ic=0..101}(nums[ic])はnに等しいので、全体でO(n)。
377 :
373 :2006/10/27(金) 14:10:24
>>376 おお確かにそうだな。良く見てなかった。サンクス。
>>376 あっそうか。101というのはNじゃなくて固定されてるもんな。
379 :
330 :2006/10/27(金) 16:03:56
>>323 ごめ、問題勘違いしてた。
問題文の p(x) 確率分布密度に沿った乱数は次の式になります。
double p_rand(void){
return 4*sqrt(1.0-uniform_rand());
}
380 :
291,309 :2006/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をどのように修正したら、このような出力を行うことが出来ますか?
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++ おねがいします
383 :
380 :2006/10/27(金) 19:10:08
>382 いけました。ありがとうございます
[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] 期限: 無期限
[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 を利用して作ってください
>>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
>>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);
>>381 C++ Builde 6 持ってないので、
TButtonコンポーネントとTLabelコンポーネントをForm1に貼り付けた、ソースコードをアップロードしてちょ
391 :
291,380,383 :2006/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と続きます。すみませんが、よろしくお願いします。
>392 ありがとうございます。 最初のころにすれ違いとも書いていましたが、卒論データのまとめなんです。 データが多すぎて、ツール作ってってことだったんですが、Cの入門書を買ってきても 全然分からなくて。 すみません
394 :
393 :2006/10/27(金) 23:14:52
>392 ところで、 使い方 ./a.out ファイル名 管理番号 例 ./a.out result-C-11.txt 11 これって、どういう意味なんですか?
395 :
392 :2006/10/27(金) 23:24:50
管理番号を手動で切り分けて入力してくださいという意味です。 コンパイル・リンクしてできた実行ファイルの後に続けて 〜.exe ファイル名 管理番号 と入れて下さい ※gcc でコンパイル・リンクした場合には オプションで出力ファイル名をしていない限り実行可能ファイルが a.out という名前になります。 但し ms-windows 環境だと a.exe です(ファイル種別を拡張子で判断しているため)
396 :
393 :2006/10/27(金) 23:41:47
>393 です。 WindowsXP VC++6.0 という環境でコンパイルをかけています。 実行すると、 Usage: パス\a.exe filename number Press any kiy to continue となり、入力が出来ないのですが、これはどのようにしたら入力が 出来るのでしょうか?
397 :
396 :2006/10/27(金) 23:51:21
ぐぐりました。 自己解決しました。
398 :
396 :2006/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桁に変えた横にある二列の数字も書き出すことは出来ませんか?
399 :
392 :2006/10/28(土) 00:08:56
>>393 出力結果をファイルにしたいという意味でしょうか?それなら
〜.exe ファイル名 管理番号 > 出力ファイル名
として下さい。
あなたが出力として欲しいフォーマットと違うという意味であれば、
例を書いて下さい。
>>393 卒論で急いでるのはいいですが、残念ですがCは難しいからそう簡単に分かるものでも、教えられるものでもありません。きっと諦めた方が早いでしょう。
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]); と変更して試してみて下さい。
402 :
393 :2006/10/28(土) 00:30:48
すみません。 C、難しいです。(入門書を読んだ限りでは、簡単そうだったのですが。) 書き出しフォーマット、ファイル出力 ともに>399 >401 で解決しました。 ありがとうございました。
[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] 途中までやったんで埋める感じでお願いします。 問題文のページ数とかは本使ってやってるから出てるだけです。
404 :
403 :2006/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行だけ出てプログラムが固まります。
>>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;/*関数の戻り値*/
}
406 :
403 :2006/10/28(土) 04:34:12
>>405 正常に動作しました。ありがとうございます。
意味は自分で考えとく
>>402 Cは簡単過ぎて難しいな。
キーワードが少なく、しかもいろんな意味を割り当ててある上に、
演算子が結構多くて優先順位が決まっている上に、ポインタが
あって、他の高級言語とはかなり毛色が違うからな。
408 :
388 :2006/10/28(土) 10:08:54
409 :
388 :2006/10/28(土) 10:14:36
アップするまえに確認すりゃよかった orz 問3 maximum=minimum=data[i]; ↓ maximum=minimum=data[0];
410 :
デフォルトの名無しさん :2006/10/28(土) 11:11:27
[1] 授業単元: 情報処理 [2] 問題文: 実行したファイル名を除いたコマンドライン引数に、複数個指定した全てのファイルの内容を標準出力に表示するプログラム [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:明日まで よろしくお願いします。
やっぱりこう言うスレは、とても勉強になるよ。 何でこう言う方法を思いつくの?って感じのソースが沢山ある。 ただ宿題を頼む側としては、このまま出して大丈夫なのかなぁ? 考え方が学生レベルを遥かに逸脱してて先生に怒られそう。
412 :
デフォルトの名無しさん :2006/10/28(土) 11:21:40
そんなレベルの高い回答があったか禿げしく疑問
>>411 いろんなプログラムを見たり書いたりしてれば思いつく必要さえなくなるよ
> ただ宿題を頼む側としては、このまま出して大丈夫なのかなぁ?
そこまで真面目な人なら、
ロジックを追って自分なりに書き直してみるのもいいかもね
>>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;
}
>>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;
}
[1] 授業単元:情報処理概論 [2] 問題文(含コード&リンク):0から99の乱数を使って6×6ビンゴの表を作成しなさい。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:BorlandC++ [3.3] 言語:C++ [4] 期限: 10月30日まで [5] その他の制限: よろしくお願いします。
417 :
cがわからない学生 :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] その他の制限:なし?
418 :
cがわからない学生 :2006/10/28(土) 12:04:42
↑↑よろしくお願いしますm(_ _)m
>>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;
}
>>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;
}
421 :
419 :2006/10/28(土) 12:15:48
>>416 rand_data[i]=i;
↓
rand_data[i]=i+1;
422 :
c不明な人 :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] その他の制限: なし よろしくお願いします。
>>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;
}
425 :
c不明な人 :2006/10/28(土) 12:50:19
ちゃんとできました。ありがとうございました!
426 :
cがわからない学生 :2006/10/28(土) 12:51: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] その他の制限: 構造体、ポインタを使用。
>>427 work[n].next = &work[n];
は
saigo->next = &work[n];
の誤りだな。
>>428 早速ありがとうございます
ちゃんとcase2が正常に動きました
構造体とポインタの部分が難しいです…
430 :
デフォルトの名無しさん :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
>>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);
}
433 :
デフォルトの名無しさん :2006/10/28(土) 15:04:32
>>431 それをどこに入れたらよいのでしょうか?
434 :
デフォルトの名無しさん :2006/10/28(土) 15:15:35
>>433 dst = stdin
↓
dst = stdout
436 :
デフォルトの名無しさん :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);
}
に変えるだけですか?
次に来る質問は 「セミコロンがないというエラーが出るんですがどうしたらいいですか?」 だな
438 :
416 :2006/10/28(土) 16:27:51
出来ました。答えていただいた方 ありがとうございました。
んで、ぽまいらはWindowsVistaに乗り換える気があるん?
今の彼女から鞍替えするほど魅力はない
自分が乗り換える気は無くてもメーカーPCはいやでもVistaが載るだろうね
443 :
384 :2006/10/28(土) 19:44:38
444 :
デフォルトの名無しさん :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 コンパイラは何の文句も言ってくれません。
助けてください。お願いします。
445 :
デフォルトの名無しさん :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の入力によって検出する。 と言う方法でやるようにと言われてます。 お願いします。
>>444 まずは main 関数内の head_a, head_b, head_t の領域を確保しましょう。
>>444 at main ():
struct digitへのポインタだけ作って、実体が宣言されてないんだが。
head_a->next = head_a->prev = head_a;
でコケるぞ。
で、ロジックも何がしたいのか良く分からん。
head_aが二つ前の要素、head_bが一つ前の要素、head_tが現在の要素のように
見えるんだが、add()では全然そのような計算をしていない。
>>444 どう途中まで問題ないんだよw
main始まってすぐ落ちてるじゃねーか
#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; }
451 :
444 :2006/10/28(土) 20:30:58
>>446 ありがとうございます!
最初で落ちなくなりました。
きっちり確保してあげなきゃいけないんですね…。
>>447 head_aが現在の要素、head_bが一つ前の要素、
head_tは退避用の一時リストのつもりです。
わかりにくいソースでごめんなさい。
解答ありがとうございました、助かりました。多謝です。
452 :
デフォルトの名無しさん :2006/10/28(土) 20:35:47
すいません。 449のはC言語じゃないんですか? C++じゃないと怒られます。
>>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;
}
>>451 多倍長整数の演算部分とフィボナッチ部分を分けた方が見やすいと思う
455 :
デフォルトの名無しさん :2006/10/28(土) 21:33:17
453 ホントありがとうございます。 どこのどなたかもわかりませんがホントにありがとうございます。 これからは、なるべく自力で出来るようにがんばります。
[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年なのでよく分からないのでよろしくお願いします。
文系か・・・ こんな授業とるなよw
int n = 0; int i = 0; while(i < 10) { /* printf で好きなように出力 */ n = 2*n+3; } 2年になったらもっとわからなくなるんでない?
459 :
デフォルトの名無しさん :2006/10/28(土) 22:28:25
C++言語で 繰り返し計算をしててその結果を随時for文の中に coutを入れて発散してないか(計算がおかしくないか) 見ているのですが、今一回一回改行する設定にしてて DOS画面にバーッと下のほうに出てくるような感じになっているのですが、 これをDOS画面の一番最初の数字のところだけどんどん更新させる事はできないのでしょうか? ご存知の方がおられましたら教えてください。よろしくお願いします。
461 :
デフォルトの名無しさん :2006/10/28(土) 22:38:23
>>460 すみません・・・やっても使い方がわからず
ググっても"/r C++言語"などと調べても
中の人からいい検索結果が返ってきません。
申し訳ないんですがやりかたを書いていただけないでしょうか?
462 :
デフォルトの名無しさん :2006/10/28(土) 22:40:54
>>460 と思ったらできました!!"¥"という字が文字化け?してたのか
/の左右逆さまの文字になっていて分かりませんでした。
改行と同じように使えばいいのですね!わかりました。ありがとうございました!
463 :
デフォルトの名無しさん :2006/10/28(土) 23:04:16
>>444 の方と恐らく同じ授業です。
ここに書いてあるアドバイスを参考に作ってみたのですがよくわかりません。
>>444 の方のプログラムを具体的にどう直せばいいでしょうか・・・
プログラム初心者なのにこんな授業取ってしまって非常に困ってます
出来れば回答宜しくお願いします・・・
日本では、半角バックスラッシュ(半角\)と半角円記号(半角¥)は事実上同一だと思え。 そして半角スラッシュ( / )は別物。
>>463 さすがに同じ授業とってる奴のとほとんど同じなのはまずいだろ
466 :
デフォルトの名無しさん :2006/10/28(土) 23:16:55
>>465 一応変えられる所は出来る限り変えますので・・・
そんなんはできるんかいなww
468 :
初心者 :2006/10/28(土) 23:38:32
どちら様教えて、VC++プログラミングするときにひとつのボタン押して 他の.exeファイル実行できるようにどうすればいいですか??
471 :
カッパ :2006/10/29(日) 09:45:51
charはカタカナでなんと読みますか?
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 2と17と5の倍数を入力した時のみ 終了するプログラムを作りなさい。 [3] 環境 [3.1] OS: WindowsXP [3.2] borland [3.3] C言語 [4] 期限: 10月30日の12時まで [5] その他の制限: 特に無し。 よろしくお願いします。
>>472 #include <stdio.h>
int main (void) {
int input;
/* ずっと繰り返す */
while (1) {
printf ("数値を入力してください。\n");
scanf ("%d", &input);
/* nの倍数 <=> nで割った余りが0 */
if (input % 2 == 0) break;
if (input % 5 == 0) break;
if (input % 17 == 0) break;
}
return 0;
}
474 :
デフォルトの名無しさん :2006/10/29(日) 10:46:42
>>473 そんないいげんなソースよく公開できるな
匿名ならではw
>>474 具体的箇所を示さずオナニーできるのが匿名ならでわなのだw
477 :
デフォルトの名無しさん :2006/10/29(日) 11:22:10
エラー処理ww
481 :
デフォルトの名無しさん :2006/10/29(日) 11:31:32
[1]授業単元:情報処理 [2]問題文:以下のプログラムを参考に、UNIXのgrepコマンド同様に1つ目の引数に示された文字列を持つ行を、2つ目の引数で示されたファイル内から抜き出して表示するプログラムを作ってください。 strlenght関数とstrinclude関数に関しては宣言だけで結構です。 int strinclude(char str1[], char str2[]){ int i, j; int len1, len2; len1 = strlength(str1); len2 = strlength(str2); if(len1 < len2) return 0; for(i = 0; i <= (len1 - len2); i++){ for(j = 0; j < len2; j++){ if(str1[i+j] != str2[j]){ break; } } if(j == len2){ return 1; } } return 0; } [3] 環境 [3.1] OS: WindowsXP [3.2] gcc [3.3] C言語 [4] 期限:本日中 よろしくお願いします。
なんだろう・・・標準関数使ったら殺される勢いなのかな・・・?
>>482 よし、じゃああえて標準関数で
>>481 /* 宣言だけで結構らしいので宣言だけする */
int strlenght(char[]);
int strinclude(char[],char[]);
#include<stdio.h>
#include<string.h>
int main(int argc,char**argv){
char*pattern;
char buf[1024];
int lineno;
if(argc <= 1)return 0;
pattern = argv[1];
if(argc > 2)freopen(argv[2],"r",stdin);
for(lineno=1;fgets(buf,sizeof buf,stdin);++lineno)
strstr(buf,pattern) && printf("%3d: %s",lineno,buf);
}
そもそも問題文が曖昧。
公倍数なら&&つけりゃええやん
489 :
デフォルトの名無しさん :2006/10/29(日) 18:12:49
#include <stdio.h> main() { int *x; *x=1; printf("x=%o *x=%d\n",x,*x); } これを実行しろって問題なんだけど、コンパイルできませんでした。 なぜコンパイルできないのですか? テンプレ無視ってスマソ
490 :
デフォルトの名無しさん :2006/10/29(日) 18:15:41
>>489 こんなカンジかな。
#include <stdio.h>
int main(void)
{
int *x;
x=malloc(sizeof(int));
*x=1;
printf("x=%o *x=%d\n",x,*x);
free(x);
return 0;
}
492 :
デフォルトの名無しさん :2006/10/29(日) 18:21:46
>>489 xがどこにも指定されてない。
#include<stdio.h>
int main()
{
int a=1;
int *x;
*x=a;
x=&a;
printf("x=%o *x=%d\n",x,*x);
return 0;
}
>>489 俺の環境(gcc-4.1.1)ではコンパイルできた。
*x=a; x=&a; 順番逆じゃない佐賀?
495 :
489 :2006/10/29(日) 19:37:31
>>495 セグメンテーション違反です (core dumped)
497 :
489 :2006/10/29(日) 19:40:49
>>497 プログラムが不正なメモリ操作をしたので強制終了、くらいの意味。
>>489 コンパイルエラーは?
まともなC89コンパイラなら通すはずだと思うんだが。
501 :
492 :2006/10/29(日) 19:56:47
>>499 こんな感じ?
#include<stdio.h>
int main()
{
int a=1;
int *x;
x=&a;
printf("x=%o *x=%d",x,*x);
return 0;
}
502 :
デフォルトの名無しさん :2006/10/29(日) 21:06:35
CのプログラムをC++に書き直してもらえませんか??
503 :
デフォルトの名無しさん :2006/10/29(日) 21:08:44
CのプログラムをC++に書き換えてもらえませんか??
505 :
デフォルトの名無しさん :2006/10/29(日) 21:41:50
[1] 授業単元:コンピューター実習1 [2] 発生させた乱数の値に関して度数分布を求める関数を作る 関数 frequency( データ配列、データ配列の要素数、値の範囲、結果の配列、結果の配列の要素数) とする。例えば、値の範囲が0〜100で、結果配列の要素数が20であれば、5刻みの区間で その区間にある値をカウントする。つまり(0〜5、6〜10、11〜15.。。。。 96〜100) のそれぞれの区間にあるデータの個数を結果として返す。 関数frequency内は、できるだけポインタを使ってきじゅつすること。以下雛形↓ #include <stdio.h> int main( void ) { int n; int x[1024], f[20]; generate_dist( x , 1024, 100); for(n=0; n<1024; n++) printf("%5d",x[n]); frequency( x , 1024 , 100, f , 20); puts(""); for(n=0; n<20; n++) printf("%5d",f[n]); } int frequency( int x[], int numx, int r, int f[], int numy) { } int generate_dist( int x[], int num, int r) { int *p; for (p=x; p != &x[num] ; p++ ) { *p = rand() % (r+1); *p += rand() % (r+1); *p += rand() % (r+1); *p /= 3; } } [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語: C [4] 期限: 10月31日 [5] その他の制限:特になし
506 :
デフォルトの名無しさん :2006/10/29(日) 22:26:17
>>505 #include <stdio.h>
#include <stdlib.h>
void frequency( int x[], int numx, int r, int f[], int numy);
void generate_dist( int x[], int num, int r);
int main( void )
{
int n;
int x[1024], f[20];
generate_dist( x , 1024, 100);
for(n=0; n<1024; n++) printf("%5d\n",x[n]);
frequency( x , 1024 , 100, f , 20);
puts("");
for(n=0; n<20; n++) printf("%d: %5d\n",n, f[n]);
return 0;
}
507 :
デフォルトの名無しさん :2006/10/29(日) 22:26:54
つづき void frequency( int x[], int numx, int r, int f[], int numy) { int i; double tick = (double)r/numy; for (i = 0; i < numy; i++) f[i] = 0; for (i = 0; i < numx; i++) { int n; n = x[i]/tick; f[n]++; } } void generate_dist( int x[], int num, int r) { int *p; for (p=x; p != &x[num] ; p++ ) { *p = rand() % (r+1); *p += rand() % (r+1); *p += rand() % (r+1); *p /= 3; } }
[1] プログラミング [2] # 2つの自然数 a, b に対し, a と b の最大公約数を求める関数 int gcd(int a, int b) を作成せよ. # 2つの自然数 a, b に対し, その公約数をすべて表示する関数 void print_cd(int , int) を作成せよ. ※ 「a と b の公約数」は「a と b の最大公約数の約数」なので, gcd(a,b) を呼び出して 2 数の最大公約数 g を求めてその全約数を表示すればよい. i = 2, 3, …, g について i が g を割り切るかどうかテストし, 割り切ればそれを表示するようにする. # main から gcd と print_cd を呼び出し, キーボードから入力した自然数 a, b に対して, 最大公約数とすべての公約数とを表示するようにせよ (表示形式は任意). [3] [3.1] winXP sp2 [3.2] cygwin [3.3] C [4] 23時59分 [5] 途中までやったんで続きお願いします。最大公約数は出せました
509 :
508 :2006/10/30(月) 01:08:49
#include<stdio.h> void gcdprint(int,int); int gcd(int,int); int main (void) { int a,b; printf("a bを入力して下さい>>"); scanf("%d %d",&a,&b); gcdprint(a,b); return 0; } void gcdprint(int a,int b)/*最大公約数を印字する関数*/ { printf("%d\tgcd\t%d\t=\t%d\n",a,b,gcd(a,b)); } int gcd(int a,int b)/*最大公約数を計算する関数*/ { int z; while((z=a%b)!=0)/*aをbで割った余りをzに代入し*/ {/*zが0以外のあいだにループする*/ a=b;/*aにbを代入し*/ b=z;/*bに余りzを代入する*/ } return b;/*bに余りzを代入する*/ } これに埋めて下さい。よろしくお願いします
510 :
デフォルトの名無しさん :2006/10/30(月) 01:58:44
再帰つかえよ
void gcdprint(int a,int b)/*最大公約数を印字する関数*/ { int g, i; g = gcd(a, b) printf("%d\tgcd\t%d\t=\t%d\n",a,b,g); for (i = 1; i < g; i++) { if (g & i == 0) { printf("%d\n", i); } } }
>>508 低速版
void print_cd(int a, int b){
int c, i;
c=gcd(a, b);
for(i=1;i<=c;i++){
if(c%i==0)
printf("%d\n", i);
}
}
>>508 高速版
void print_cd_recursive_call(int a, int b){
int c, i, j, k;
if(a==1){
printf("%d\n", b);
return;
}
for(i=2;a/i>=i;i++){
if(a%i==0){
c=a;
for(j=0;c%i==0;j++)
c/=i;
break;
}
}
if(a/i<i){
i=a;
j=1;
c=1;
}
for(k=0;k<=j;k++){
print_cd_recursive_call(c, b);
b*=i;
}
}
void print_cd(int a, int b){
int c;
c=gcd(a, b);
print_cd_recursive_call(c, 1);
}
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 1.入力した文章の半角スペースを改行に変換して表示せよ。 2.1の改行を削除し,文字を詰めて表示せよ ex. Hello World ans1. Hello World ans2. HelloWorld [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン: Borland C [3.3] 言語: C [4] 期限: 10月30日まで ご教授宜しくお願い致します。
>>514 #include<stdio.h>
int main(void){
char c;
while(EOF != (c = fgetc(stdin))){
if(c == ' ') c = '\n';
if(c != '\n'){
printf("%c",c);
}
}
return 0;
}
517 :
515 :2006/10/30(月) 12:49:58
訂正。 × char c; ○ int c;
>>514 /* 問1 */
#include<stdio.h>
#define BUF_SIZE 1024
int main(void)
{
char buf[BUF_SIZE];
int i;
gets(buf);
for(i=0;buf[i]!='\0';i++)
{
if(buf[i]!=' ')
putchar(buf[i]);
else
putchar('\n');
}
return 0;
}
>>514 /* 問2 */
#include<stdio.h>
#define BUF_SIZE 1024
int main(void)
{
char buf[BUF_SIZE];
int i;
gets(buf);
for(i=0;buf[i]!='\0';i++)
{
if(buf[i]!=' ')
putchar(buf[i]);
}
return 0;
}
520 :
デフォルトの名無しさん :2006/10/30(月) 15:00:57
[1] 授業単元:プログラミング [2] 以下の文法を(Lexical analyze)字句解析するプログラムを作成せよ。 program --> declaration_list statement_list declaration_list --> empty_string | declaration ; declaration_list declaration --> VAR variable variable --> a|b|c statement_list --> statement | statement_list ; statement statement --> variable := expression | PRINT variable expression --> term | expression + term | expression - term term --> integer | variable integer --> digit | integer digit digit --> 0 | 1 [3] 環境 [3.1] OS:Unix [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限: 明後日まで よろしくお願い致します。
521 :
デフォルトの名無しさん :2006/10/30(月) 18:12:07
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): (1)画面に繰り返し数を入力させるメッセージを表示し、キーボードから入力させる。 (2)画面に2つの整数を入力させるメッセージを表示し、キーボードから入力させる。 (3)画面に計算方法を2つ提示し、その中から1つを選択させる。 計算方法は四則演算、剰余、ビット演算のいずれか。 (4)選択された計算方法で、計算を行う。計算は関数を用いて行うこと。 関数には引数と戻り値があること。 (5)計算結果を画面に出力する。 (6)(2)に戻り、繰り返し数ぶん処理を繰り返す。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: cigwin [3.3] 言語: C [4] 期限: 11月10日 [5]if文、for文、関数まで習いました。 よろしくお願いします。
def_func(add,+) def_func(sub,-) def_func(mul,*) def_func2(div,/) def_func2(jouyo,%) def_func(bit_and,&) def_func(bit_or,|) def_func(bit_xor,^) ↓ int add(int a, int b){return a + b;} int sub(int a, int b){return a - b;} int mul(int a, int b){return a * b;} int div(int a, int b){if(b==0)return 0;return a / b;} int jouyo(int a, int b){if(b==0)return 0;return a % b;} int bit_and(int a, int b){return a & b;} int bit_or(int a, int b){return a | b;} int bit_xor(int a, int b){return a ^ b;}
524 :
デフォルトの名無しさん :2006/10/30(月) 18:50:49
>>516 「置換」でなく「変換」しろとおっしゃいますか(;´Д`)
[1] 授業単元:情報処理(テーマ:配列) [2] 問題文: 問題1@キーボードから姓と名を(別々に)入力して、文字列として結合して入力せよ。 (strcat()を使う?) 問題2@まず4桁の整数を入力する(要素数4の配列にそれぞれの桁を格納) 次に'\l'か十分な数だけ'\n'を出力(画面をスクロールアウトさせてクリアするため) 今度は別の人が4桁の整数を入力、入力に応じて、それぞれの桁の数字について 「位置も数字も当たっていればHを1つ」 「その数字は入っているけど位置が違うときはBを1つ出力」 当たるまで整数の入力を繰り返す。ただし何回かで終了してもよい。 当たったら、それまでの回数を表示。 問題3@4桁の数字を入力⇒1234(1234を入力) ここで画面をスクロールアウト 他の人が4桁の数字を入力する 1回目:1352 ⇒ 1は場所を含めて正解、2と3は場所が違う。よって「H1B2」と出力 2回目:1235 ⇒ 1と2と3は場所を含めて正解。よって「H3B0」と出力 このようにH4B0になるまで繰り返させる(5回目で正解を表示して終了させる) [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C言語 [4] 期限: 無期限
527 :
508 :2006/10/30(月) 22:08:11
528 :
508 :2006/10/30(月) 22:11:35
10分法のアルゴリズムにより、x^3-10=0の非線形方程式の解を求めるプログラムを作成せよ。 なお、許容誤差をε=10^-7とし、区間幅がεを下回ったところで計算を打ち切ること。 (for文とwhile文を使用すること)
531 :
526 :2006/10/30(月) 22:55:37
>>530 改行の数に指定はないんで3個でお願いします
532 :
529 :2006/10/30(月) 23:13:09
[1] 授業単元:非線形方程式の解法 [2] 問題文(含コード&リンク):10分法のアルゴリズムにより、x^3-10=0の非線形方程式の解を求めるプログラムを作成せよ。 なお、許容誤差をε=10^-7とし、区間幅がεを下回ったところで計算を打ち切ること。 [3] 環境 [3.1] OS:windows [3.2] コンパイラ名とバージョン:borland 5.5 [3.3] 言語: C [4] 期限: [無期限] [5] その他の制限:for文とwhile文を使用すること
>>532 #include<stdio.h>
int main(void)
{
const double eps = 10e-7;
double cube = 10.0;
double ans = 0.0;
double level = 1.0;
int i;
while(level>=eps){
for(i=1; i<=10; i++){
double temp = ans+i*level;
if(temp*temp*temp>cube){
ans += (i-1)*level;
level *= 0.1;
break;
}
}
}
printf("x = %f\n",ans);
return 0;
}
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 「座席予約システム」を二種類のADTを用いて作成する。「座席予約システム」は(ある車両)の10人分の座席の予約を行うプログラムである。 次の七種類の命令を受け付ける。 a:予約を追加する l:現在の予約状況を表示する d:指定した座席番号の予約を取り消す s:指定した予約社名の座席番号を表示する e:指定した予約者名の予約を取り消す h:ヘルプを表示する q:終了する 一つ目のADTはseat_tで、個々の座席をあらわす。 typedef struct{ int occup; char name[100]; }seat_t seat_tに対して次の四つの操作を準備する。 1:void makeSeatEmpty(seat_t *sp) spがさす座席を空席にする。座席がもともと空席の場合は何もしない 2:void makeSeatOccup(seat_t *sp, const char *nm) spがさす座席をnmの名前で予約する。座席にすでに予約が入っている場合は、それまでの予約者名は消され、新しい予約者名nmを登録する 3:int isSeatEmpty(seat_t st) 座席stが空席かどうかを問い合わせる。空席なら1、予約済みなら0を返す。 4:const char *getSeatName(const seat_t *sp) spが刺す座席の予約者名を返す
もう一つのADTは車両全体を現す。 typedef struct{ int numres; seat_t seat[10]; } car_tに対する操作は次の四つ 1:void makeCarEmpty(car_t *cp) cpでさす車両全体を空席にする 2:void dispCarStatus(car_t cr) 車両crの予約状況を表示する 3:int appendRsv(car_t *cp, const char *nm) cpでさす車両に名前nmで予約を追加し、予約した座席番号を返す 4:void cancelRsv(car_t *cp, int sn) cpでさす車両のsn番の座席の予約を取り消す 5:int searchRsv(car_t cr, const char *nm) 車両cr、予約者名nmの座席番号を返す。ただし見つからない場合は-1を返す。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: kterm [3.3] 言語:C [4] 期限: 2006年11月1日正午
(aggregate|abstract|algebraic) data type か?
連レスすみません。 たぶん、ADTは構造体のことだと思います。
542 :
デフォルトの名無しさん :2006/10/31(火) 10:58:21
[1] 授業単元:情報制御 [2] 問題文: 問題 マウスの左ボタン右ボタンを押したときの左右それぞれの反応時間を 保存するプログラム [3] 環境 [3.1] OS: WindowsXP [3.2] C++ 6.0 [4] 期限: 11月4日 よろしくお願いします
545 :
544 :2006/10/31(火) 13:11:39
546 :
デフォルトの名無しさん :2006/10/31(火) 13:31:52
[1] 授業単元:プログラミング
[2] 問題文:
>>1 のロダが使えなかったのでこちらに書きます
#include <stdio.h>
#include <stdio.h>
#include <math.h>
#define PI 3.14159
#define HABA 40
int main(void)
{
int a,b,c;
double i,s,t;
printf(" ?p?x ");
for(a=0; a<HABA; a++){
if(a==HABA/2){
printf("+");
}
else{
printf("-");
}
}
printf("\n");
for (t=0.0; t<=360.0; t+=18.0){
547 :
542 :2006/10/31(火) 13:52:08
そうです C++ VC 6.0 >543
質問です。 クラスAからfriend指定したクラスBがあるとします(BからAのprivateメンバアクセスを許す) この時、Bの派生クラスからもクラスAのprivateメンバにアクセス可能でしょうか?
スレ違いな上にすぐに検証できる内容だな
>>542 反応時間って何の反応時間?
もぐら叩きみたいな感じにするのか?
それとも、「マウス右クリック」→「メニュー」 がでるまでの時間とか?
マウスボタンを押した時刻を記録していくのか?
さっぱり分からん
>>532 10分法について解説plz
解説してあるサイトの URL でもおk
>>534 「サーバが見つかりませんでした」と出て問題文が見えないよ
[1] 授業単元:Cプログラミング [2] the shortest remaining time next (SRTN) job scheduling algorithm. 入力: 0 6 1 1 2 5 2 6 3 2 から以下の実行結果を出力するプログラムのrun_srtn関数を作成しプログラムを完成させよ。 *出力結果 Job 0 Arrival Time 0 Service Time 6 Job 1 Arrival Time 1 Service Time 1 Job 2 Arrival Time 3 Service Time 5 Job 3 Arrival Time 5 Service Time 6 Job 4 Arrival Time 8 Service Time 2 --- Scheduling Statistics --- JOB # Arr Fin Svc TA 0 0 7 6 7 1 1 2 1 1 2 3 14 5 11 3 5 20 6 15 4 8 10 2 2 *{arr= arrival time, Fin = finish time,Svc =service time,TA= turn around time(finish-arrival_time)}
#include <stdio.h> typedef struct job { int job_id; /* job id */ int arr_time; /* arrival time */ int srv_time; /* service time */ int rem_time; /* remaining time */ int finish; /* finish time */ int turn_around; /* turn around time */ struct job *prev, *next; /* pointer to the previous and next jobs in the list */ } job; job *front, *tail; /* front and tail pointers to the job queue */ void append_job(); void remove_job(); void run_srtn();
main(){ char line[80]; int job_id =0; int cur_time = 0; int dat, svt; job *tmp_job; /* read delta arrival time and service time from stdin. Allocate a memory chunk for a 'job' struct, which is pointed to by tmp_job. Set arr_time and srv_time using the data read from stdin */ while(scanf("%d %d",&dat, &svt) != EOF){ tmp_job = malloc(sizeof(job)); tmp_job->job_id = job_id++; tmp_job->arr_time = (cur_time + dat); tmp_job->srv_time = svt; /* initialized other fields of the job here */ cur_time += dat; /* advance the clock */ printf("Job %d Arrival Time %d Service Time %d\n", tmp_job->job_id, tmp_job->arr_time, tmp_job->srv_time); /* append the created job at the end of the list append_job(tmp_job);*/ } /* set finish, turn_around for each job in the queue, and then print the job statistics*/ run_srtn(); /*use the following printf statements to write out the job scheduling result.*/ printf("--- Scheduling Statistics ---\nJOB #\tArr\tFin\tSvc\t TA\tNTA \n"); printf("%3d\t %3d\t %3d\t %3d\t %3d\n",tmp_job->job_id,tmp_job->arr_time,tmp_job->finish,tmp_job->srv_time,tmp_job->turn_around); }
void append_job( job *tmp_job ){ if( front == NULL ){ front = tmp_job; tail = tmp_job; } else{ tail->next = tmp_job; tmp_job->prev = tail; tail = tmp_job; } } void remove_job( job *tmp_job ){ job *l = tmp_job->prev, *n = tmp_job->next; if( tmp_job == front ){ front = tmp_job->next; front->prev = NULL; } else if( tmp_job == tail ){ tail = tmp_job->prev; tail->next = NULL; } else{ l->next = n; n->prev = l; } free( tmp_job ); } void run_srtn(void){ }
[3] 環境 [3.1] OS:Unix [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限:今週中 連続カキコ失礼しました。よろしくお願いします。
>>550 マウスボタンを押したときの時刻じゃないかなと勝手な想像妊娠
>>559 void append_job( job *tmp_job )
void remove_job( job *tmp_job )
のバグは放っておいておk?仕様?っていうかバグ取りしろってか!
562 :
デフォルトの名無しさん :2006/10/31(火) 20:13:39
>>561 バグもあるんですか・・・。
run_srtn関数だけじゃなくプログラム全体を修正する問題みたいです
asciiコードをstring型に変換するクラスなどご存じの方はいませんか?
564 :
542 :2006/10/31(火) 20:52:41
返事遅れてすみませんでした 課題は 部屋に3台のスピーカーが左、中、右と配置されています 音は3回出ますが、 真中のスピーカーから2回音が鳴り、3回目で左右どちらか から音が鳴ります もし左から音がすれば、マウス左ボタンを 右の音なら右ボタンを押します この時、3番目の音と マウスを押したときの反応時間を出す課題です どなたか分かりますか? おそらく、プロシージャーを 変えると出来る?と思うのですが。。。よろしくお願いします
>>563 stringのコンストラクタにcharだけを受け取るものがある。
explicitは付いていないのでキャスト演算子も可。
>>542 音を出す制御は必要無い?もし必要なら適当なダミーの関数いれたほうがいい?
それともマウスボタンをクリックした時刻を記録するだけでおk?どっち?
例.
enum{SPEAKER_CENTER, SPEAKER_RIGHT, SPEAKER_LEFT};
sound(SPEAKER_CENTER);
みたいなのをいれるか?ってこと
クリックのイベントを取るのは適当なウインドウを作って、ウインドウでのイベント取得でいいの?
それともAPIフックして、PCで他の作業中(ワープロ打ちながらとか)であっても反応しないとダメ?
専用のウインドウを作るとしたら全画面?サイズ指定あり?
>>564 の書き方からすると、元になるソースコードがありそうだけどアップロードできない?
564>>すみません、質問を間違えました。 クラスじゃなくて、stringか何かのメソッドでありますでしょうか?
間違えました。上の質問は
>>565 に対してでした。
>>566 氏はエスパー検定二段以上と予想される。
要求定義を聞き出すのって難しい・・・
C++で、STLを使って、名前、住所、電話番号、年齢を入力して、それらを格納し、出力ができるプログラムを作っていう宿題です。 よろしくお願いします。
>>571 意味がわからんので適当に超解釈を入れて書いた。
もし、超解釈が希望と違ってもめんどいからなおさん。
#include<vector>
#include<iostream>
#include<algorithm>
#include<iterator>
using namespace std;
struct Data{
string name,addr,tel;
int age;
};
istream&operator>>(istream&cin,Data&d){return cin>>d.name>>d.addr>>d.tel>>d.age;}
ostream&operator<<(ostream&cout,const Data&d){return cout<<d.name<<" "<<d.addr<<" "<<d.tel<<" "<<d.age;}
int main(){
vector<Data>a;
copy(istream_iterator<Data>(cin),istream_iterator<Data>(),back_inserter(a));
copy(a.begin(),a.end(),ostream_iterator<Data>(cout,"\n"));
}
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク):STLを用いて、名前、年齢、住所、電話番号を入力、格納、出力ができるプログラムを作れ。(STLは何をしようしてもよい) [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン: VC++EE [3.3] 言語: C++ [4] 期限: 来週の月曜日 [5] その他の制限: STLはvector, list の基本的なことをならいました。クラスは使ってお願いします。
>>573 >> 575
ありがとうございます!!
これで宿題は完成しました。
感謝☆
577 :
542 :2006/10/31(火) 23:14:13
>>566 音を出す制御は完成しています。 適当なダミー関数は入れても大丈夫です
三番目の音を基準に0とし、マウスのボタンが押されるまでのわずかな時間です.
>enum{SPEAKER_CENTER, SPEAKER_RIGHT, SPEAKER_LEFT};
>sound(SPEAKER_CENTER);
>クリックのイベントを取るのは適当なウインドウを作って、ウインドウでのイベント取得でいいの?
はい、それで良いです。
>専用のウインドウを作るとしたら全画面?サイズ指定あり?
特に指定はありません。全画面で無くても良いです。マウスでの反応時間
を取っている間はPCは使われない事とします。
実はほぼプログラムは出来ていますが、アップロードのやり方が分かりません
全文載せようとしても文字数オーバーになってしまいます。どうしたらよろしいでしょうか?
説明不足ですがよろしくお願いします Eメールアドレス 載せときます
578 :
デフォルトの名無しさん :2006/10/31(火) 23:56:35
>>573 >>574 横スレですが、勉強になりました。
STLが、何なのか分からなかったので一から調べてみました。
コンテナの種類には、複数あってそれぞれに適したクラスが既に用意されているのね。
C++って結構便利なのねぇ。
579 :
デフォルトの名無しさん :2006/11/01(水) 00:37:08
>>579 インデントが汚い。コンパイルすら通らない。コードから何をしたいのか掴むのは不可能。
まずこのコードはどんな動作をして欲しいのか日本語で説明したほうが良い。
581 :
デフォルトの名無しさん :2006/11/01(水) 01:19:44
>>580 失礼しました。
問題は0〜360度を18度ずつ進むSinカーブを
アスタリスクで縦に表示するプログラムを作成するものです。
説明下手なので分りにくければ、Sinカーブをアスタリスクで縦に表示するプログラムを作成すると考えて下さい。
よろしくお願いします。
エスパー求む、って感じだな。
583 :
579 :2006/11/01(水) 01:31:46
自分の説明下手が恨めしいorz プリントをうpできる環境も無いし・・・ 大人しく諦めます、お手数お掛けしました。
584 :
582 :2006/11/01(水) 01:36:10
わりいわりい。581読む前に書き込んじゃった。 ほいこれ・・・ってもういないか。 #include<stdio.h> #include<math.h> #define PI 3.14159 #define HABA 40 int main(void) { int i, t, x; char line[HABA + 1]; line[HABA] = '\0'; for (i = 0; i < HABA; ++i) line[i] = '-'; line[HABA/2] = '+'; puts(line); for (t = 0; t < 360; t += 18) { for (i = 0; i < HABA; ++i) line[i] = ' '; line[HABA/2] = '|'; x = (int)(HABA/2 * sin(PI * t / 180)) + HABA/2; line[x] = '*'; puts(line); } return 0; }
こんな感じにしたいって事なのか? * *** ***** ****** ***** *** * *** **** ***** **** *** *
587 :
デフォルトの名無しさん :2006/11/01(水) 07:09:18
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): 【与えられた漸化式に基づいて数列の第0項から第N項までの値を表示する。】 【A0 = A1 = 1, An = An-1+An-2 (n≧2のとき) 】 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:よくわかりませんが、Visual Studio2005のC++(Win32)でやってます。 [3.3] 言語:◆ C++ ◆ [4] 期限:11月3日金曜日 [5] その他の制限:どこまで習っているか:習い始めて演習の講義を5時限分経験のみ よくわかりませんが、 #include <iostream> using namespace std; から始まるようにと言われています。
#include <iostream> using namespace std; int main() { int N = 10; int Ax = 1, Ay = 1; for (int i = 0; i <= N; ++i) { // Ax = A[i], Ay = A[i+1] cout << "A[" << i << "] = " << Ax << endl; int temp = Ax + Ay; Ax = Ay; Ay = temp; } }
>>587 #include<iostream>
using namespace std;
#include<vector>
#include<numeric>
#include<functional>
#include<iterator>
#include<algorithm>
template<typename It>It next (It it){return ++it;}
template<typename It>It prior(It it){return --it;}
int main(){
cout << "n? ";int n;cin>>n;
vector<int>a(n+1);
a.front() = 1;
adjacent_difference(a.begin(),prior(a.end()),next(a.begin()),plus<int>());
copy(a.begin(),a.end(),ostream_iterator<int>(cout," "));
cout << endl;
}
590 :
デフォルトの名無しさん :2006/11/01(水) 08:05:52
すいません。587のやつ、 // A_i // A_{i-1} // A_{i-2} // 添字 // (1) 第0項と第1項の値を求めて表示する。 // (2) 添字iを2から上限値まで1ずつ増やしながら以下の処理を繰り返す。 // (2-1) A_iの値を求めて表示する。 // (2-2) A_{i-1}の値をA_{i-2}に移す。 // (2-3) A_iの値をA_{i-1}に移す。 っていうふうにお願いできますか? (途中に足りない所があれば自分で追加するようにと言われてます)
>>590 条件の後だしウゼーーーーーーー
#include<iostream>
#include<boost/numeric/ublas/vector.hpp>
#include<boost/numeric/ublas/matrix.hpp>
#include<boost/numeric/ublas/io.hpp>
using std::cout;using std::cin;using std::endl;
using namespace boost::numeric::ublas;
int main(){
int n=10;
matrix<int>b(2,2);b(0,0) = 0;b(0,1) = b(1,0) = b(1,1) = 1;
matrix<int>c(b);
// A_i
// A_{i-1}
// A_{i-2}
vector<int>a(2);
int i;// 添字
// (1) 第0項と第1項の値を求めて表示する。
a[0]=1;
a[1]=1;
cout << a[0] << endl;
cout << a[1] << endl;
// (2) 添字iを2から上限値まで1ずつ増やしながら以下の処理を繰り返す。
for(i=2;i<=n;++i){
// (2-1) A_iの値を求めて表示する。
// (2-2) A_{i-1}の値をA_{i-2}に移す。
// (2-3) A_iの値をA_{i-1}に移す。
a = prod(a,b);
cout << a[1] << endl;
}
}
592 :
デフォルトの名無しさん :2006/11/01(水) 08:37:30
条件の後だし、大変申し訳なかったです。 ありがとうございました。
593 :
デフォルトの名無しさん :2006/11/01(水) 08:41:13
すいません、587みたいな学校の課題に役に立ちそうなC++の初心者向けの本があったらどなたか教えてもらえませんか?
>571の宿題って棒H○Lの宿題じゃ・・・
596 :
デフォルトの名無しさん :2006/11/01(水) 11:23:17
[1] 授業単元:情報処理 VC++ [2] 問題文(含コード&リンク):waveファイルのヘッダー情報を取得して、表示する。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: [3.3] 言語: Microsoft Visual C++ 2005 [4] 期限: 今週中 [5] その他の制限: バイナリで読み込むのだが、そのバイナリの値を表示する必要はないとのこと。 表示するヘッダー情報は、ファイル容量・フォーマット(PCMとか)・チャンネル数・周波数・ビット数です。
597 :
デフォルトの名無しさん :2006/11/01(水) 11:24:32
598 :
PIC :2006/11/01(水) 13:22:00
ここはPICマイコンのプログラム作成の宿題も可能なんでしょうか?
IOのインターフェイスさえ公開して、ハードウェアの制限も明記してくれれば、 できる*かも*しれない。 メモリは4kまでとか、intは16bitとか色々な制限あると思うんだが…
600 :
デフォルトの名無しさん :2006/11/01(水) 15:59:23
>>596 その手の問題は解答がつかない可能性が高いです。
なんせ、ここの人等は
文字列を逆順にしたり、四則演算程度の算数
等、なんの役にも立たないプログラムなら得意ですからねw
これはひどい自演
自演かもしれんが、的を射てる
toybox問題には変わりないと思うんだぜ
構造体の名前さえ分かれば fread(&wave_info, sizeof(wave_info), 1, fp); SetDlgItemInt(dlgWnd, dlgItem, wave_info.???, TRUE) でできるじゃん Hit&Blow の方が余程面倒だよ
>291 や >393 でお世話になりました卒論のものです。 その節はありがとうございました。 以前の入力データは問題なく行えました。追加で、このようなデータもあるのですが 以下の条件で変更を行いたいのですが。 C-01-0(削除) 001 152.473 179.709 -0.22 -0.12(削除) 002 152.484 179.823 -0.47 -0.36(削除) 002100 -97217.32 111872.02 529.36(先頭が0は削除) 400100 -99483.17 110373.47 576.80 160100 -96582.70 108696.32 364.00 160200 -98327.02 111334.33 311.60 002 152.484 179.823 -0.47 -0.36(削除) 003 152.477 179.754 -0.11 0.04(削除) 002100 -97217.32 111872.02 529.36(先頭0は削除) 400200 -97778.83 110554.77 427.08 160100 -96582.70 108696.32 364.00(数字重複は削除) /EOF ↓ 400100 -99483.17 110373.47 576.80 160100 -96582.70 108696.32 364.00 160200 -98327.02 111334.33 311.60 400200 -97778.83 110554.77 427.08 このようなファイルを作成したのちに、>391 の名前変更ルールでリネームを行った ファイルを出力したいのですが。 すれ違いですが、すみませんがよろしくお願いします。
>>605 awk または gawk で
/^[1-9]+.*$/{
if(!($1 in already_print)){
already_print[$1]=1;
print
}
}
例)a.awkの内容は上記のプログラム通り。余計な改行は入れないこと(動作が変わるので)
gawk -f a.awk a.txt > b.txt
>>605 その程度のデータ処理なら、
>>606 みたいにUNIXコマンドを使って処理した方が楽だよ。
609 :
291,393 卒論 :2006/11/01(水) 19:04:21
>392 のようなプログラムで処理ということはできませんでしょうか?
610 :
579 :2006/11/01(水) 19:14:01
>>584 さんありがとう御座います!
そして本当に申し訳ないのですが、
>>584 さんの作ってくれた
プログラムの実行結果の左側に
コレを↓足していただけないでしょうか?条件の後出しになってしまい申し訳ありません。
角度
0:
18:
36:
54:
72:
90:
108:
126:
144:
162:
180:
198:
216:
234:
252:
270:
288:
306:
324:
342:
360:
>>610 puts(line);
↓
printf("%3d:%s\n", t, line);
613 :
579 :2006/11/01(水) 19:51:36
>>612 実行してみたのですが、縦の数値が360まで表示されず
342で止まってしまいます・・・
>611 ありがとうございます。 すみません。。
>611 このようなエラーが出る原因はなんでしょうか? error C2440: '=' : 'void *' から 'struct tag_print_data *' に変換することはできません。(新しい動作 ; ヘルプを参照) 'void*' から非 'void' 型への変換には明示的なキャストが必要です。 あと質問なのですが、>606は同じ結果になるということなんでしょうか?
>615 new_member=malloc(sizeof(print_data)); ここでエラーが出ているようなのですが。。
.cppでコンパイルしている馬鹿がいるに一票
>>615 new_member=malloc(sizeof(print_data));
↓
new_member=(print_data*)malloc(sizeof(print_data));
619 :
デフォルトの名無しさん :2006/11/01(水) 20:09:42
(d[0]==1 && d[1]==1 && d[2]==1) って(d[0]&&d[1]&&d[2]==1) っていう風に書いても大丈夫ですか? 宿題というか宿題の一部みたいなもので・・・よろしくお願いします。
>>619 d[0] および d[1] が 1 か 0 の値しか取らないのであれば、大丈夫。
あとは自分で試せば分かる
>618 ありがとうございます
>>619 想定する値にもよるけど。多分無理。
!(~-d[0]|~-d[1]|~-d[2])なら可
>>620 なるほど。1以外の値もとるんでこういう風にはかけないんですね。てかこういう書き方自体しないみたいですね。
>>622 ~ と − の意味がわかりません><
624 :
291,393 卒論 :2006/11/01(水) 20:38:03
>618 で作成された↓のデータ。>391と同じ要領でリーネームを行いたい場合、 >392のどこを変えればよいのでしょうか? 400100 -99483.17 110373.47 576.80 160100 -96582.70 108696.32 364.00 160200 -98327.02 111334.33 311.60 160300 -98881.64 112843.92 411.20 160400 -98744.69 112829.23 426.60 400200 -97778.83 110554.77 427.08
>624 今回は入力データが↓のように変わっていますが、ほかは391と同じ条件です 001(←この行なし) 400100 -99483.17 110373.47 576.80(ここが3列) 160100 -96582.70 108696.32 364.00 160200 -98327.02 111334.33 311.60 0000((←この行なし)
>>624 char data[2][BUF_SIZE];
↓
char data[3][BUF_SIZE];
それと
ret=sscanf(one_line, "%[0-9] %[-.0-9] %[-.0-9]", left_code, data[0], data[1]);
if(ret==2 || ret==3)
↓
ret=sscanf(one_line, "%[0-9] %s %s %s", left_code, data[0], data[1], data[2]);
if(ret>=2 && ret<=4)
オレってスルー力皆無だな
宿題じゃなくて仕事の下請けだなぁw
このスレ見てたら問題出てから回答までのスピードが半端じゃなく早いことがあるね。 かなりできる人が暇つぶしでもしてるんだろうな…
宿題は自分がやらなきゃ意味がないと説教するのはもう古いのか。 ここで宿題訊くような奴は端からマになろうなんて思ってないから 一時しのぎで人のを写しても別に問題ないのだろうな。
>626 ありがとうございました
631 :
デフォルトの名無しさん :2006/11/01(水) 22:28:52
>>631 view.cppって何?
VBAでやれば?
633 :
デフォルトの名無しさん :2006/11/01(水) 22:34:54
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク): レポート課題:フェルマーの予想 フェルマーは、x^n+y^n=z^n (x,y,z,n:整数)においてn≧3に対して、 この式を満たすものはないと断言した。これはつい最近になって証明された。 n=3に対して、x,y,z≦100の範囲内でこれに対する反例がないか確認せよ。 ヒント: 一見すると、3重ループになるようであるが、 うまく工夫して2重ループにせよ。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:Microsoft Visual C++ 6.0 [3.3] 言語: C++ [4] 期限: 2006年11月7日まで [5] その他の制限: 基礎的な知識で出来るプログラミングでおねがいします。
>>633 多分整数じゃなくて正数
#include<stdio.h>
/* 1≦x≦y≦z≦100 */
int main(void){
int x, y, z;
long data[100+1];
for(x=0;x<=100;x++)
data[x]=x*x*x;
for(z=1;z<=100;z++){
y=z;
for(x=1;x<=z;x++){
if(data[z]-data[x]<data[y]){
y--;
if(y<x) break;
}
if(data[z]-data[x]==data[y])
printf("反例 x=%d y=%d z=%d\n", x, y, z);
}
}
return 0;
}
635 :
デフォルトの名無しさん :2006/11/01(水) 23:07:10
2重ループでは出来ないのでしょうかね?
637 :
デフォルトの名無しさん :2006/11/01(水) 23:14:36
forが3つあっても2重ループなんですか? 初歩的な質問ですいません。
>このスレ見てたら問題出てから回答までのスピードが半端じゃなく早いことがあるね。 去年提出したソースかも。
>>638 内の大学はBCB3だった
6〜7年前の話
641 :
デフォルトの名無しさん :2006/11/01(水) 23:31:08
>>634 についてですけど、このプログラミングの説明も必要なんで、
できたら解説をお願いします。
後出し良くないアル
643 :
デフォルトの名無しさん :2006/11/01(水) 23:40:06
644 :
デフォルトの名無しさん :2006/11/01(水) 23:49:17
どうしても解説をして欲しいです。 今後、後出ししません。 お願いします<m(__)m>
>>633 ,
>>641 x≦y の時
(x+1)^3-x^3 ≦ (y+1)^3-y^3
なので
x←x+1 の時、y←y 又は y←y-1 のどちらかで追従できる
646 :
デフォルトの名無しさん :2006/11/01(水) 23:51:00
>>645 ありがとうございます
プログラミング能力が凄いですね
感謝です。
647 :
デフォルトの名無しさん :2006/11/02(木) 00:39:13
1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 数値を順番に読み込んで、計算結果を返す次のどちらかのプログラムを書け。 まず係数 a, b を標準入力より読みとる。次に変数 x の値を読み込んで y=a*x+b を計算して表示する。 この x の読み込みと y の表示を、x に数値以外が入力されるまで繰り返す。 x と y の数値の対を読み込むことを繰り返す。 数値以外が入力されると最小二乗法による回帰直線 y=a*x+b の係数 a, b を計算して表示する。 注) 直線回帰係数 a, b は、実験指導書はじめの誤差論の式(6.5)で、c=0のときの上2つの式で、 データ個数と x, y, x2, y2, xy の総和から求めることができる。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C 期限: 2006年11月9日まで]
>>647 #include<stdio.h>
#define BUF_SIZE 1024
int main(void)
{
double a, b, x, y;
char buf[BUF_SIZE];
int scanf_ret;
printf("Input a, b:");
scanf("%lf %lf", &a, &b);
while(1)
{
printf("Input x:");
scanf("%s", buf);
scanf_ret=sscanf(buf, "%lf", &x);
if(scanf_ret!=1)
break;
y=a*x+b;
printf("y=a*x+b y=%f x=%f a=%f b=%f\n", y, x, a, b);
}
return 0;
}
ここはVC++でもおk?
おk
651 :
デフォルトの名無しさん :2006/11/02(木) 01:31:25
どうしてもわかりません。お助け願います。 [1] 授業単元:プログラミング [2] 問題文( 問題1 キーボードから入力した5 件のデータのうち、最大値と最小値を調べ、最後に 表示してください。なお、プログラム作成時は以下の仕様に従ってください。 ファイル名: kadai2.c 【 問題作成時の注意点 】 ・キーボードから入力したデータはint 型配列で管理してください。 ・データを入力する際にはscanf 関数を利用してください。 ・画面にメッセージを表示する際にはprintf 関数を利用してください。 なお、結果表示時は、最大値/最小値となる要素の添字もあわせて 表示してください。また、最大値/最小値が複数ある場合は、 すべての要素を表示してください。 【 実行時のイメージ 】 ----------------------------- data[0] ... 69 ←「...」の後ろはキーボード入力部 data[1] ... 91 ←「...」の後ろはキーボード入力部 data[2] ... 91 ←「...」の後ろはキーボード入力部 data[3] ... 72 ←「...」の後ろはキーボード入力部 data[4] ... 86 ←「...」の後ろはキーボード入力部 Max : data[1] = 91 Max : data[2] = 91 Min : data[0] = 69 ----------------------------- [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C++ [4] 期限: ([2006年11月2日17:30まで [5] その他の制限:なし
652 :
デフォルトの名無しさん :2006/11/02(木) 01:37:25
こちらの問題もお願いします。 [1] 授業単元:プログラミング [2] 問題文( キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを 作成してください。なお、プログラム作成時は以下の仕様に従ってください。 ファイル名: kadai3.c 【 問題作成時の注意点 】 ・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから 入力した値が以下の番号以外の場合、再びメニュー番号を入力するように してください。 1 三角形 2 四角形 ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で プログラムを終了してください。 エラーメッセージの例) wrong number ・図形の表示には関数を利用してください。関数のプロトタイプ宣言は以下の 通りとします。 void DrawTriangle(int); void DrawRectangle(int); [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C++ [4] 期限: ([2006年11月2日17:30まで [5] その他の制限:なし
653 :
デフォルトの名無しさん :2006/11/02(木) 01:39:58
VC++おkなんですか!助かった!
[1] 授業単元:卒論の一部
[2] 問題文(含コード&リンク):
MFCダイアログベースでピクチャボックスに2値化された画像で、にょろにょろとした線分が一本あってですね、それを最小二乗法を使って一本の直線にしたいんですよ。
http://homepage3.nifty.com/ishidate/vcpp6_19/vcpp6_19.htm こことか参考にしてるんですけど、ボタンを一つ押すと直線になるようなものを作りたいんですよ。。
[3] 環境
[3.1] OS: WindowsXP
[3.2] VC2005 Pro
[3.3] 言語: C++
[4] 期限: こいつができてないと先に進めないのでできるだけ早いほうが・・・
[5] その他の制限:ピクチャボックスの変数名はm_pictです。
ほんとにお願いします( ・∀・)!先生、卒業がしたいです・・・
>>651 #include <stdio.h>
#define COUNT 5
int main(void)
{
int data[COUNT];
int min,max;
int i;
/*入力*/
for(i=0; i<COUNT; i++){
printf("data[%d] ... ",i);
scanf("%d",&data[i]);
}
/*最小値と最大値を求める*/
min = max = data[0];
for(i=0; i<COUNT; i++){
if(min>data[i]) min = data[i];
if(max<data[i]) max = data[i];
}
/*最小値と最大値にそれぞれ等しい値を全て表示する*/
for(i=0; i<COUNT; i++){
if(max==data[i]) printf("Max : data[%d] = %d\n",i,data[i]);
}
for(i=0; i<COUNT; i++){
if(min==data[i]) printf("Min : data[%d] = %d\n",i,data[i]);
}
return 0;
}
>>651 #include<stdio.h>
#define DATA_NUM 5
int main(void){
int data[DATA_NUM];
int maximum, minimum;
int i;
printf("-----------------------------\n");
for(i=0;i<DATA_NUM;i++){
printf("data[%d] ... ", i);
scanf("%d", &data[i]);
if(i==0)
maximum=minimum=data[0];
if(maximum<data[i])
maximum=data[i];
if(minimum>data[i])
minimum=data[i];
}
for(i=0;i<DATA_NUM;i++)
if(data[i]==maximum)
printf("Max : data[%d] = %d\n", i, data[i]);
for(i=0;i<DATA_NUM;i++)
if(data[i]==minimum)
printf("Min : data[%d] = %d\n", i, data[i]);
printf("-----------------------------\n");
return 0;
}
657 :
デフォルトの名無しさん :2006/11/02(木) 02:00:50
>>652 #include<stdio.h>
#include<stdlib.h>
int main(void){
int figure, height, i;
while(1){
printf("1 三角形\n2 四角形\n");
scanf("%d", &figure);
if(figure==1 || figure==2) break;
}
printf("図形の段数(高さ)を入力してください :");
scanf("%d", &height);
if(height<=1){
printf("wrong number\n");
exit(1);
}
switch(figure){
case 1:
printf("\n*\n");
for(i=1;i<height-1;i++) printf("*%*s*\n", i-1, "");
for(i=0;i<height;i++) printf("*");
printf("\n");
break;
case 2:
printf("\n**********\n");
for(i=1;i<height-1;i++) printf("* *\n");
printf("**********\n");
break;
}
return 0;
}
659 :
デフォルトの名無しさん :2006/11/02(木) 02:19:12
<<658 本当にありがとうございます。実行イメージを下のようにするには どうすればよいですか?ほんと初心者でわからなくて、、教えてく ださい、お願いします。 The figure is drawn. 1. Triangle 2. Rectangle Please input the number ... 1 ←「...」の後ろはキーボード入力部 Please input height ... 5 ←「...」の後ろはキーボード入力部 * * * * * * * ********* 三角形は正三角形のような形で ----------------------------- (メニューとして「2」、段数として「5」を入力した場合) ***** * * * * * * *****
660 :
デフォルトの名無しさん :2006/11/02(木) 02:20:49
[1] 授業単元:プログラミング [2] 問題文:生成した乱数をファイルに出力するプログラムを拡張し2つの乱数を生成し出力するプログラムを作成する。 それらの乱数データを配列に読み込み、その配列の行列の和と積を求め、結果をファイルに出力するプログラムを作成せよ。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限:11/3 [5] その他の制限:使えるようであればmalloc()、strtok()を活用するとの事です。 よろしくお願いします。
661 :
デフォルトの名無しさん :2006/11/02(木) 02:21:09
<<659 すみません、図形がずれました。 三角形は正三角形 四角形は普通の四角形です。
>>680 >生成した乱数をファイルに出力するプログラム
とりあえずこれあげないと作れねーだろ
663 :
658 :2006/11/02(木) 02:34:56
>>659 ごめ問題読み違えてた
#include<stdio.h>
#include<stdlib.h>
void DrawTriangle(int height){
int i;
printf("%*s*\n", height-1, "");
for(i=1;i<height-1;i++) printf("%*s*%*s*\n", height-i-1, "", i*2-1, "");
for(i=0;i<height*2-1;i++) printf("*");
printf("\n");
}
void DrawRectangle(int height){
int i;
for(i=0;i<height*2;i++) printf("*");
printf("\n");
for(i=1;i<height-1;i++) printf("*%*s*\n", height*2-2, "");
for(i=0;i<height*2;i++) printf("*");
printf("\n");
}
int main(void){
int figure, height;
while(1){
printf("The figure is drawn.\n1. Triangle\n2. Rectangle\nPlease input the number ... ");
scanf("%d", &figure);
if(figure==1 || figure==2) break;
}
printf("Please input height ... ");
scanf("%d", &height);
if(height<=1){printf("wrong number\n");exit(1);}
if(figure==1) DrawTriangle(height);
else DrawRectangle(height);
return 0;
}
>>660 >乱数データを配列に読み込み、その配列の行列の和と積を求め、
配列の行列???
665 :
デフォルトの名無しさん :2006/11/02(木) 02:43:14
>>663 本当にありがとうございました!!これで提出に間に合います。
>>653 >>654 で回帰直線の求め方は分かるんじゃないかな
なんで VC 多いんだろう。参加できねーよ
makefile 〜.rc 〜.cpp
でうpしても使い方分かってくれなさそうだし… orz
667 :
660 :2006/11/02(木) 03:03:04
申し訳ないです・・・とりあえず作った生成した乱数をファイルに出力するプログラム です #include<stdio.h> #include<stdlib.h> int main(void) { int i; time_t current; FILE *myFile; myFile = fopen("random.dat","w"); if(myFile==NULL){ return 1; } srand((unsigned int)time(& current)); for (i=0; i<10; i++){ fprintf(myFile,"%3d\n",rand()/%10+1); } fclose(myFile); fprintf(stderr,"done\n"); return 0; } 問題文そのまま書いたんですけど・・・多分配列の行列っていうのは乱数を読み込ませた配列の値を使って行列計算をしろって ことだと思うんですけど・・・どうでしょうか?
668 :
デフォルトの名無しさん :2006/11/02(木) 04:36:47
>>666 へへへ、ダンナ。そういうことができないからここで聞かせてもらってるんでゲスぜ。
先生方が思っている以上にオイラの能力はありやせんぜ。
どなたか
>>653 を作成してくれませんか?ボタンクリックのとこだけでいいんですよ( ;・∀・)
670 :
デフォルトの名無しさん :2006/11/02(木) 09:32:44
すいません教えてください。色々調べたのですが、混乱中です。 C++ではなく、Cでウィンアプリを作れと言われたのですが、 これはMFCっていうのは使ってもいいのでしょうか? あと、開発環境はVSでもおkなんでしょうか?? しかも、CでDB接続とかもできるんでしょうか??? CとC++の情報を切り離せずに混乱しております。 助けて!
>>670 猫でもわかるのサイトか本みんさい
全部C言語だから。
あと、MFCはAPIをラップしたクラスだからC++になります。
猫でもの本とか買って、適当に載ってるソースコピペして
いじったらいいじゃな〜い。
672 :
デフォルトの名無しさん :2006/11/02(木) 10:38:13
>>648 助かりました!ありがとうございました!!
673 :
デフォルトの名無しさん :2006/11/02(木) 11:17:03
教えてください!! [1] 授業単元:プログラミング [2] 問題文(含コード&リンク): ベッセル関数 (j0() と j1()) の数表を出力する C のプログラムを作り、 その出力結果を Excel でグラフにして、Word 等でレポートを書いて その中にグラフも挿入して、このWebCTで提出せよ。 作業手順は添付ファイルを参照のこと。 ベッセル関数 J0, J1 は sin, cos と同じようにCの標準関数として用意されているので、 それを呼び出せばよい。ただし borland C compiler には用意されていないようなので、 大学の cygwin あるいは Unix 環境でプログラムを行うこと。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語:C [4] 期限: 2006年11月15日まで
674 :
◆xQTfY.P6Xs :2006/11/02(木) 11:18:23
1] 授業単元: プログラム言語基礎 [2] 問題文(含コード&リンク):n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: borland 2,31 [3.3] 言語: C [4] 期限: 今日の17時まで [5] その他の制限: まだ習い始めて間もないです。 #include <stdio.h> void main(void) { int x; printf("x = "); scanf("%d",&x); if(x%2 !=0) { printf("\n xは奇数"); } else{ printf("\n xは偶数"); } } これを応用して作れだそうです。 どうかよろしくお願いします
675 :
デフォルトの名無しさん :2006/11/02(木) 11:19:27
【添付ファイルの内容】 Excel を用いて計算結果のグラフを描く 描画データの準備: CSV ファイル(コンマ区切りファイル)として、C プログラムから計算結果を書き出す。 例えば2つの整数変数、i, n を出力するのならば、プログラム中の書式指定において、 printf("%d, %d\n", i, n); のようにコンマで区切って出力するように指定する。さらに、このプログラムを実行するとき、 $ ./a > data.csv というように指定してデータファイルに書き込む。 “>” はリダイレクトと呼ばれる機能であり、この後ろに指定されている data.csv という名 前のファイルに今まで画面に出ていた出力(標準出力)を書き込む。ファイル名はどのようにつけてもかまわないが、 日本語やスペースは使わない方がよい。また拡張子は、Excel で開くために .csv としておくこと。 Excel でグラフを描く: Windows 上でファイル data.csv を探してクリックすると、Excel が起動してデータが表示される。 描画するデータ範囲を選択して、グラフウイザードを起動する ([挿入(I)]メニューから[グラフ(H)]を選んでもよい)。 グラフウイザードでグラフの種類を選択して実行する。この場合は散布図を選んでいる。 画面にしたがって次へと進み、[完了]をクリックすると、Excelの画面にグラフが挿入される。 Word 文書への貼り付け: Excel 上のグラフを選択して、[編集]→[コピー] (あるいはCtrl+C )でコピーし、Word などで [編集]→[貼り付け] (あるいは Ctrl+V) を選ぶと、文書中にグラフが挿入される。
>>673 どうでもいいがj0,j1はCの標準関数じゃねー
677 :
デフォルトの名無しさん :2006/11/02(木) 11:28:30
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク):◎見にくくなりそうなので一番下に書きます。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:VC++ 2005 [3.3] 言語:C++ [4] 期限:明日 11/3 [5] その他の制限: 標準入出力ストリームで、 整数除算による商の計算表(下記の例を参照)を表示する. ÷ | 除数 -------+ 1 2 3 4 5 6 7 8 9 被除数 +-------------------------------------------- 1 | 1 0 0 0 0 0 0 0 0 2 | 2 1 0 0 0 0 0 0 0 3 | 3 1 1 0 0 0 0 0 0 4 | 4 2 1 1 0 0 0 0 0 5 | 5 2 1 1 1 0 0 0 0 6 | 6 3 2 1 1 1 0 0 0 7 | 7 3 2 1 1 1 1 0 0 8 | 8 4 2 2 1 1 1 1 0 9 | 9 4 3 2 1 1 1 1 1 これを出力するようなプログラムを教えてください。
678 :
デフォルトの名無しさん :2006/11/02(木) 11:29:22
すいません、表がちょっとずれました。
679 :
デフォルトの名無しさん :2006/11/02(木) 11:30:32
÷ | 除数 -------+ 1 2 3 4 5 6 7 8 9 被除数 +-------------------------------------------- 1 | 1 0 0 0 0 0 0 0 0 2 | 2 1 0 0 0 0 0 0 0 3 | 3 1 1 0 0 0 0 0 0 4 | 4 2 1 1 0 0 0 0 0 5 | 5 2 1 1 1 0 0 0 0 6 | 6 3 2 1 1 1 0 0 0 7 | 7 3 2 1 1 1 1 0 0 8 | 8 4 2 2 1 1 1 1 0 9 | 9 4 3 2 1 1 1 1 1
>>677 表のフォーマットがよくわからんからその辺すこし適当。
#include<iostream>
#include<iterator>
#include<algorithm>
#include<iomanip>
#include<functional>
using namespace std;
int main(){
int a[9];for(int i=1;i<=9;++i)a[i-1]=i;
cout << " ÷ | 除数" << endl;
cout << "++++++++ ";
copy(a,a+9,ostream_iterator<int>(cout," "));
cout << endl << "非除数 +";
*fill_n(ostream_iterator<char>(cout),18,'-')++ = '\n';
for(int i=1;i<=9;++i){
cout << setw(6) << i << " | ";
transform(a,a+9,ostream_iterator<int>(cout," "),bind1st(divides<int>(),i));
cout << endl;
}
}
>>674 #include<stdio.h>
int main(void){
int i,n,x,odd=0,even=0;
printf("n:");
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&x);
(x%2==0)? even++:odd++;
}
printf("偶数:%d,奇数:%d\n",even,odd);
return 0;
}
682 :
◆xQTfY.P6Xs :2006/11/02(木) 12:03:33
>>681 さん
ほんとうにありがとうございました。 いきなり課題とかだされて全くわからなくてこまっていたんです。ほんとうにありがとうございます。
当日、1日、2・3日前ならともかく、まだ1週間以上期限があるなら、 じっくり自分で考えてみた方が自分のためにもなるし、 出された回答を理解するだけより、よっぽど勉強になると思うんだ。
684 :
デフォルトの名無しさん :2006/11/02(木) 12:45:30
すいません。677の者ですが、680の回答の#include<iterator> #include<algorithm> #include<iomanip> #include<functional> とかはまだ習ってないので、怒られます。 まことに勝手ながら<iostream>しか習ってません。setwとかcharとかも習ってません。 条件の後出しですいませんが、 //除数 //被除数 //商 //(1)計算表の第1行を表示 //(2)計算表の第2行を表示 //(3)計算表の第3行を表示 //(4)各被除数について以下の処理を繰り返す(反復) //(4-1)当該被除数を表示する //(4-2)各除数について、被除数を除数で割った商を表示する //(4-3)改行する おおまかに、このアルゴリズムでお願いできませんでしょうか?
685 :
デフォルトの名無しさん :2006/11/02(木) 12:49:23
>>638 ありがとうございます!
今からじっくり見させていただきます。
686 :
デフォルトの名無しさん :2006/11/02(木) 12:55:17
÷ | 除数 ------+ 1 2 3 4 5 6 7 8 9 被除数+--------------------- 1 | 1 0 0 0 0 0 0 0 0 2 | 2 1 0 0 0 0 0 0 0 3 | 3 1 1 0 0 0 0 0 0 4 | 4 2 1 1 0 0 0 0 0 5 | 5 2 1 1 1 0 0 0 0 6 | 6 3 2 1 1 1 0 0 0 7 | 7 3 2 1 1 1 1 0 0 8 | 8 4 2 2 1 1 1 1 0 9 | 9 4 3 2 1 1 1 1 1 ズレませんように
687 :
デフォルトの名無しさん :2006/11/02(木) 16:30:07
684、ずっと考えても出来ません。 教えてもらえませんか?
688 :
デフォルトの名無しさん :2006/11/02(木) 16:40:47
テスト
689 :
デフォルトの名無しさん :2006/11/02(木) 16:53:47
>>669 >>653 です。
おお。早い!
そうです、こんな感じですが2値化画像を参照して開くんで、とりあえず簡単な1本の完璧でない直線の画像(BMP)をリソースに登録してそれを表示して
そのにょろにょろ直線を直線にするプログラムがいいですね。。。
あと直線も画面の端から端ではなく、線分の一番左のX座標から右のX座標までの線分にしていただけませんか?
しかし、ここの先生方の馬力はすごいですね。お願いします><
>>689 あっ!ちなみに線分は細線化されてますので太さは「1」です><
691 :
デフォルトの名無しさん :2006/11/02(木) 23:08:42
いやいや、689先生もたいしたものですよ
692 :
デフォルトの名無しさん :2006/11/02(木) 23:10:29
そんな・・・、691さんほどではありません><
693 :
デフォルトの名無しさん :2006/11/02(木) 23:12:09
>>634 実行したのですが、何も表示されなかったのですが
どうすれば?
695 :
デフォルトの名無しさん :2006/11/02(木) 23:25:22
697 :
デフォルトの名無しさん :2006/11/02(木) 23:39:07
問題読みましたよ 反例があるっぽいんですけど。
>フェルマーは、x^n+y^n=z^n (x,y,z,n:整数)においてn≧3に対して、 > この式を満たすものはないと断言した。これはつい最近になって証明された。
699 :
デフォルトの名無しさん :2006/11/02(木) 23:54:47
つまり、反例がでないってのが答えなんですね なるほど
>>694 先生・・・すさまじいです。。。オイラの卒論なんて一週間でできちゃいそうですね。
ほんとに感謝感激です。ありがとうございました。
701 :
デフォルトの名無しさん :2006/11/03(金) 00:41:32
694の方 ありがとうございました 手助け感謝します
702 :
デフォルトの名無しさん :2006/11/03(金) 03:18:18
[1] 授業単元: 分割コンパイル、ポインタ [2] 問題文(含コード&リンク): 見にくくなりそうなので下に書きます。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VC 2005 [3.3] 言語: C [4] 期限: 明日23時 [5] その他:分割コンパイルとポインタ習い始めましたが、よく分かりませんorz 1.分割コンパイル 引数として受け取ったint型の数値nについて、 1からnまでの総和を計算して返す関数 int sum(int n) nの階乗を計算して返す関数 int fact(int n) を作成しなさい。 ただし、main関数を記述するファイルとは別のファイルに作成すること。 2.ポインタによる疑似間接参照 要素数が10のint型の配列に キーボードから数値を入力する関数を作成し (main関数の中で)呼び出しなさい。 配列はmain関数の中で宣言し、 入力の関数には配列のアドレスを引数で与えること。 【ヒント】 void input(int *p) 2問ありますが、よろしくお願い致します。
703 :
デフォルトの名無しさん :2006/11/03(金) 04:05:17
>>269 が未だに解けてません。検定の前まででいいのでお願いします。
704 :
デフォルトの名無しさん :2006/11/03(金) 06:36:34
>>702 int sum(int n)
{
n*(1+n)/2
}
int fact(int n)
{
int i = 1;
int result = 1;
for(;i<=n;i++)
result *= i;
return result;
}
void input(int *p, int size)
{
int i = 0;
for(;i < size; i++)
fscanf(stdin,%d,p[i]);
}
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
線形リストを作成するプログラムを作れ。
メニュー番号は以下の通りである。
1・・・先頭に新規ノードを挿入
2・・・最後に新規ノードを挿入
3・・・挿入したいノード名を指示して、指示されたノードの後ろに新規のノードを指定する
4・・・削除したいノード名を指示して、指示されたノード名を削除する
8・・・リストを先頭より表示する
9・・・終了
>>427 のプログラムの応用編です。
自分なりにやってみましたが、case3, 4の部分がうまく動いてくれないんです…
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2869.txt [3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2006/11/04 PM01:00
[5] その他の制限: 構造体、ポインタを使用
[1] 授業単元:計算科学
[2] 問題文
確率変数Xが確率密度関数
1/6( -3 ? x < 0)
p(x)=2( 0 ? x < 1/4)
0( それ以外 )とする。
double get_uniform_random(void) を利用して, p(x)に従う乱数X を返す関数
double get_myrandom(void) をまず定義する.
繰り返し回数?
300
シード?
128478
と入力すると, double get_myrandom(void)でサンプルを300回発生し,
サンプル平均 10.0 嘘です
サンプル分散 1.0 嘘です
…
-3.050000 0.000000
-2.950000 0.016000
-2.850000 0.018000
…
のようにサンプル平均, サンプル分散, ヒストグラムを計算して出力するプログラムを作ろう, ここで,
-2.950000 0.016000
は, -2.95 を中心値とするビンに, 300回中 300*0.016 回はいったということをいっている.
[3] 環境
[3.1] OS: Windows XP
[3.2] コンパイラ名とバージョン: Visual Studio.NET2003
[3.3] 言語: C
[4] 期限: 2006年11月07日09:00まで
[5] その他
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2870.txt ヒントです。利用して下さい。
>>705 うっかり間違いが多いな
・ノード追加
trace = &work[n];
-> trace->next = &work[n];
・ノード削除
sento->next = trace->next
-> previous->next = trace->next;
previous = NULL;
-> previous = trace;
if( trace->name != value )
-> if ( trace == NULL )
>>708 ありがとうございます
ちゃんと正常動作できました
>>706 hist[(int)((x-xmin)/dx)]++;
average=sum/nn;
variation=(sum2-sum*sum/nn)/nn;
double get_myrandom(void){
double x;
double r;
r=get_uniform_random();
if(r<=0.5)
x=-r*6;
else
x=(r-0.5)/2;
return x;
}
>>703 >>386 のここだけ修正すればいけるんじゃない?
return (double)rand()/(RAND_MAX-1);
↓
return (double)rand()/(RAND_MAX+1);
712 :
703 :2006/11/03(金) 12:49:47
713 :
デフォルトの名無しさん :2006/11/03(金) 13:51:43
>>704 ありがとうございます。
しかし、正常動作しないので、
>>702 の問題答えてくれる方よろしくお願いします。
1と2、分けて書いてくれると有難いです。
714 :
デフォルトの名無しさん :2006/11/03(金) 14:02:59
俺なんてまだwhile文を習ったレベルだよ。
715 :
デフォルトの名無しさん :2006/11/03(金) 14:12:59
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):2 つの整数 a と b を入力し, 小さい方を出力するプログラムを条件演算子を用いて作成せよ [3] 環境 [3.1] OS: Windows98 [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2006年11月3日16:00まで
(a >b) ? printf("%d",b) : printf("%d",a);;
[1] 授業単元:計算機システム [2] 問題文1整数のビットパターンを表示するプログラムを作成せよ 2単浮動小数点数のビットパターンを表示するプログラムを作成せよ [3] 環境 [3.1] OS:Windows XP [3.2] コンパイラ名とバージョン:borland C++ 5.5 [3.3] 言語:C++ [4] 期限:今日中 11/3
>>716 普通はこうじゃね?
printf("%d",a>b?b:a);
720 :
デフォルトの名無しさん :2006/11/03(金) 15:04:16
#include <bitset>
722 :
デフォルトの名無しさん :2006/11/03(金) 15:09:20
久々ありがとうって言われちゃった 嬉しいからあげちゃお
>>718 問題1
#include <stdio.h>
union {
int n;
struct {
unsigned b0: 1; unsigned b1: 1; unsigned b2: 1; unsigned b3: 1;
unsigned b4: 1; unsigned b5: 1; unsigned b6: 1; unsigned b7: 1;
unsigned b8: 1; unsigned b9: 1; unsigned b10: 1; unsigned b11: 1;
unsigned b12: 1; unsigned b13: 1; unsigned b14: 1; unsigned b15: 1;
unsigned b16: 1; unsigned b17: 1; unsigned b18: 1; unsigned b19: 1;
unsigned b20: 1; unsigned b21: 1; unsigned b22: 1; unsigned b23: 1;
unsigned b24: 1; unsigned b25: 1; unsigned b26: 1; unsigned b27: 1;
unsigned b28: 1; unsigned b29: 1; unsigned b30: 1; unsigned b31: 1;
};
}a;
int main()
{
scanf("%d", &a.n);
printf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d"
"%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
a.b31, a.b30, a.b29, a.b28, a.b27, a.b26, a.b25, a.b24,
a.b23, a.b22, a.b21, a.b20, a.b19, a.b18, a.b17, a.b16,
a.b15, a.b14, a.b13, a.b12, a.b11, a.b10, a.b9, a.b8,
a.b7, a.b6, a.b5, a.b4, a.b3, a.b2, a.b1, a.b0);
return 0;
}
>>718 #include<iostream>
#include<bitset>
using namespace std;
int main(){
float f = 7.18;
bitset<32> a(*(int*)&f);
string s = a.to_string<char,char_traits<char>,allocator<char> >();
cout << s << endl;
}
[1] 授業単元:C言語演習
[2] 問題文(コピペ)
引数で受け取ったunsigned int型変数を2進数で表示する関数を作成せよ。
(例えば,0xf0f0f0f0が入った変数の値を表示させると,
11110000111100001111000011110000 が画面に表示されるようにする。)
ヒント:
unsigned int mask = 1<<31; は1000 0000 0000 0000 0000 0000 0000 0000を表すので,
この変数maskをうまく使って最上位ビットを取り出す。次に mask = mask
>>1 ; とすると,
0100 0000 0000 0000 00000000 0000 0000となるので,これを使うと,
最上位から2番目のビットを取り出すことが出来る。
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ名とバージョン:borland C++ 5.5
[3.3] 言語:C
[4] 期限:明日の朝まで。
#define BIT 32
int xxx( unsigned int num)
{
unsigned int mask = 1 << BIT-1;
int i;
for( i = 0; i < BIT-1; i++ ){
printf( "%d", (num & mask) >> (BIT-1-i) );
mask = mask
>>1 ;
}
printf("\n");
return 0;
}
[1] 授業単元:アルゴリズム(並び替えと探索) [2] 問題文(含コード&リンク): 英単語を各行に一語ずつ入力してもらい、単語がそれぞれ 何回ずつ出現したかの頻度を出力するプログラムを作りなさい。 単語を辞書式順序で出力しなさい。ここで、単語は、次のような 木構造で管理しましょう。 struct tree{ struct tree *left; struct tree *right; char *word; int count; }; wordが単語を表し、countがその単語の出現回数を表しています。 leftからリンクされている木の単語は、wordより辞書式順序で 前にあるものばかりで、rightはwordより後にあるものばかり になるように木構造を管理しなさい。辞書式順序の比較には strcmpを使います。文字列pとqに対して、 strcmp(p,q) は、pがqより辞書式順序で前にある場合には-1を、 等しい場合には0を、後ろの場合には1を返します。 [3] 環境 [3.1] OS:unix [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語:C [4] 期限: 2006年11月4日23:00 [5] その他の制限:今までは制御構造、ポインタ、構造体など、 今回はクイックソート、バブルソート、バイナリサーチまで習いました。
>>726 ありがとうございます。参考になりました。
731 :
727 :2006/11/03(金) 21:30:34
>>730 素早い返答ありがとうございます。
非常に助かりました。
>>731 すまんfreeの順序間違えた。
free(p->word);
free(p);
にしといて
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):正の整数値を読み込み、その数を逆順に表示するプログラムを作成せよ 例えば、1234が入力されたら4321と出力するする [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:C [4] 期限: 11月7日 [5] その他の制限: while文を使う 10で割ってその余りを表示していくらしいんですがうまくいきません
>>733 #include<stdio.h>
int main(void)
{
int number;
printf("Input positive number : ");
scanf("%d", &number);
while(number>0)
{
printf("%d", number%10);
number/=10;
}
return 0;
}
>>734 ありがとうございます
こんなに早く答えてもらえるとは
736 :
デフォルトの名無しさん :2006/11/03(金) 23:44:36
[1] 授業単元:OpenGLとアニメーション
[2] 問題文(含コード&リンク):これを利用して別の動き,オブジェクトを用いたOpenGLアニメーションを作成せよ
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC 6.0等
[3.3] 言語:C
[4] 期限: 11月6日(月)朝9:30まで
[5] その他の制限: なし
希望としましてはプログラム実行時の現在左下から動き出す1個の四角形を犬の口から3個発射できるようにして、
4回目の発射から四角形が四方八方に花火のように破裂する openglアニメーションを作成したいのですがどうすればいいですか?
実行ファイルはbackground.cです。
ファイル:
http://up2.viploader.net/mini/src/viploader84139.zip.html
737 :
デフォルトの名無しさん :2006/11/04(土) 09:54:05
[1] 授業単元:プログラミング [2] 問題文:与えられた漸化式に基づいて数列の第0項から第N項までの値を表示する。 A0 = A1 = 1, An = An-1+An-2 (n≧2のとき) [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:VC++ 2005 [3.3] 言語:C++ [4] 期限: 11月6日(月)まで [5] その他の制限:よくわからないんで、プログラムを作るときの設定をいいますと、Win32→Win32コンソールアプリケーション→コンソールアプリケーション→(ここからプログラムを作ってます) アルゴリズムの指定制限: ・データ構造: An An-1 An-2 添字(n) ・操作部: (1)第0項と第1項の値を表示する。 (2)添字を上限値(20)まで1づつ増やしながら以下の処理を繰り返す(反復) (2-1)Anの値を求めて表示する。 (2-2)An-1の値をAn-2に移す。 (2-3)Aの値をAn-1に移-1す。 自分で、やってみるとAn-1とかのn-1などが漸化式の様に連動していかない(数値として変化していってない)みたいで、どういう風に記述したらいいのかわかりません。 数日前にもこの課題を答えて頂いたんですが、ビルドできませんでした。 参考にはなったんですが、自分はアホなのでこんな風につまづいてます。
738 :
デフォルトの名無しさん :2006/11/04(土) 09:59:30
737に入りきれないと思ったので補足です。 最初のところは、 #include <iostream> using namespace std; void main(){ しか習ってません。 あと cout cin int for while if…else くらいしか習ってません。
741 :
デフォルトの名無しさん :2006/11/04(土) 12:34:52
なぜ、いつもgoogleなの? 別にyahooでもinfoで変わらなくね?
742 :
デフォルトの名無しさん :2006/11/04(土) 12:43:41
737の者です。739の返事を遅れてすいません。 #include <iostream> using namespace std; void main() { #define N 20 int An //An int An-1 //An-1 int An-2 //An-2 int n //Aの添字 …int n を一番最初にしてみましたけどダメでした。 int A1 = 1 int A2 = 1 ← どの辺で、A1=A2=1って書かないといけないのでしょうか。 cout << A1 << endl; cout << A2 << endl; //(1)第0項と第1項の値を表示 for ( int 2; n <= N ; n++ ) { //添字を2から上限値まで1ずつ増やしながら表示 An = An-1 + An-2; ←これもA1=A2=1と同じでどの辺に書くべきですか? An-2 = An-1; //An-1の値をAn-2に移す An-1 = An; //Anの値をAn-1に移す cout << endl; } }
743 :
デフォルトの名無しさん :2006/11/04(土) 12:48:01
742のコンパイル結果です。 ------ ビルド開始: プロジェクト: enshu1-5-3, 構成: Debug Win32 ------ コンパイルしています... enshu1_5_3.cpp c:\enshu1\enshu1-5-3\enshu1_5_3.cpp(21) : error C2144: 構文エラー : 'int' は ';' によって先行されなければなりません。 c:\enshu1\enshu1-5-3\enshu1_5_3.cpp(21) : error C2601: 'A_' : ローカル関数の定義が正しくありません。 c:\enshu1\enshu1-5-3\enshu1_5_3.cpp(16): この行は '{' を含んでいますが、これに対応するものがありません。 c:\enshu1\enshu1-5-3\enshu1_5_3.cpp(21) : error C2065: 'i' : 定義されていない識別子です。 c:\enshu1\enshu1-5-3\enshu1_5_3.cpp(21) : error C2143: 構文エラー : ';' が '}' の前にありません。 c:\enshu1\enshu1-5-3\enshu1_5_3.cpp(24) : error C2470: 'A_' : 関数定義のようですが、パラメータ リストがありません。外見上の本体をスキップします。 c:\enshu1\enshu1-5-3\enshu1_5_3.cpp(27) : error C2371: 'i' : 再定義されています。異なる基本型です。 c:\enshu1\enshu1-5-3\enshu1_5_3.cpp(36) : warning C4091: '' : 変数が何も宣言されていないときは、'int' の左辺を無視します。 c:\enshu1\enshu1-5-3\enshu1_5_3.cpp(48) : error C2143: 構文エラー : ';' が '{' の前にありません。 c:\enshu1\enshu1-5-3\enshu1_5_3.cpp(48) : error C2143: 構文エラー : ';' が '}' の前にありません。 An,An-1,An-2が計算上(An)-1,(An)-2とかになってるんですかね?
コンパイラの言葉に耳を傾けてあげてください。・゚・(ノД`)・゚・。
>>742 > 自分で、やってみるとAn-1とかのn-1などが漸化式の様に連動していかない
連動しないも何もコンパイル通らないぞ…
・行末のセミコロンがない
・An-1 ←変数名にマイナス記号は使えない(Anから1を引く計算と区別できないから)
・for ( int 2; n <= N ; n++ ) ←もの凄くおかしい(nをカウンタにするならn = 2だろ)
これでコンパイルは通るはず。
実際動かしてみるとforの中で最初のn = 2のとき
> An = An_1 + An_2;
An_1, An_2の値は何も代入されてないので不定。これがいけない。
An_1 = 1;
An_2 = 1;
とループの前に与えておけば問題ない。
あと、A1, A2は使ってない&必要ない。
> cout << endl;
これじゃ改行出すだけで答えが出力されない。
A_nを出力しよう。
とりあえず仕様に沿って書き直してあげた。 #include <iostream> using namespace std; int main(){ int An; //An int An_1; //An-1 int An_2; //An-2 int n; //添字 #define N 20; _asm{ mov n, 2 mov An_1, 1 mov An_2, 1} cout << An_2 << endl; //第0項 cout << An_1 << endl; //第1項 while(n <= N){ _asm{ mov eax, An_1 add eax, An_2 mov An,eax} cout << An << endl; _asm{ mov eax, An_1 mov An_2, eax mov eax, An mov An_1, eax inc n}} return 0;}
749 :
秋葉の大学生&rlo;望志んさ屋トフソ :2006/11/04(土) 19:19:48
こんばんわ。C++暦2日目の学生です。
乱数で0が出るまでの回数をtemp[]配列に記憶しておき,それを1万回試行してtemp[]の平均を求める。
http://ipoko.skr.jp/ransuu.cpp.txt というプログラムを考えたのですが,なぜか最初の1回だけランダムな数字が出て
残りの9999回は全部0になってしまいます。
何故でしょうか?誰か教えてくださいm(__)mペコ
>>749 j = 0;
↓
j = 0; s=1;
751 :
秋葉の大学生&rlo;望志んさ屋トフソ :2006/11/04(土) 19:27:54
>>750 アッー!
なるほど、どうもありがとうございましたw
752 :
デフォルトの名無しさん :2006/11/04(土) 20:17:20
大学生の方にお願いです。 あまりにもレベルの低い宿題を晒さないでください。 大学いってもその程度ができないのかと思うと中学生ながら絶句してしまいます。
中学生でプログラムの授業があるのは少数派です
>>753 13年前に中学生だった俺でも授業でやったよ。(N88-BASICだったが)
最近なら程度の差はあれやってるんじゃないかな。
755 :
デフォルトの名無しさん :2006/11/04(土) 20:33:58
普通科高校だと99%の学校はプログラムやらない 大学に入るまでにやるのは高専・商業科・専門の低収入組くらい
私立でもやってないよ
>>754 さりげなく数学の教科書にはあるが・・・・やってない
758 :
デフォルトの名無しさん :2006/11/04(土) 20:49:35
別に授業でなくても、プログラミングが趣味なんてヲタクな中高生じゃねーの
俺の家にパソコンが登場したのは大学に入ってから
760 :
デフォルトの名無しさん :2006/11/04(土) 20:51:58
プログラミングが好きな人の9割は負け組みです 頭が良い人の9割は勝ち組です また将来の勝ち組は子供時代にプログラミングに対して興味を持ちません
>>752 ここで聞くような奴はそもそもプログラミングを職業にするような奴ではなく、
ただ課程として履修しないといかんからやってるだけの奴なんだと気づけ。
出来ないんじゃなくて、出来る必要のない、出来なくても何の問題なく生きていける人種なのさ。
そしてそのための時間を彼らは(彼らの社会的地位を高めるような)別のことに使ってるのさ。
まぁ、そういうのを2chで偉そうに言う奴の9割は負け組
で,宿題まだー?
まだなのさ。
>>761 出来なくても何の問題もないことないじゃん。
過程として履修しないと卒業できないんだろ?
それじゃあおねがいします [2] 問題文(含コード&リンク): 正の整数値を読み込み、その数だけ*を連続して表示するプログラムを作成せよ。 例えば、3が入力されたら***と表示すること。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 7日 [5] その他の制限: while文で
>>765 でも多くの大学で「過程」ではなく「成果物」が重要
とりあえず出来てればいい
>>765 そりゃ行く学校による。
さわり程度にプログラミングの講義やって終わりにして
就職先はプログラミングとは何の関係もないところなら、
宿題でそこそこの回答を提出して成績稼いだほうが結果的にお得。
それを分かってて、それでもなおここの連中は回答し続けるのさ。
なぜならそこに問題があるからだ。
次の指示にしたがったプログラムを作り提出しなさい. * 整数型配列 a[ ] を定義し, 次のように初期化しなさい int a[ ] = {92, 56, 89, 76, 81, 82, 46, 79, 88, 91}; * 整数型の配列を引数に取り, その平均値を浮動小数点型(double) で返す 関数 average を作りなさい. ただし, main から average は, 次のよう な呼び出し型をされるものとする. x = average( 配列名, 要素数 ); * 作成した関数を使って, 配列 a[ ] の要素の平均値を計算するプログラム を作りなさい. という宿題が出ているのですが、 #include<stdio.h> double average(int k[],int b); int main(void) { int a[ ] = {92, 56, 89, 76, 81, 82, 46, 79, 88, 91}; double x; x = average(a,10); printf("%f\n",x); return 0; } double average(int k[],int b) { int i; double y; for(i=0;i<b;i++) { y=y+k[i]; } y=y/b; return y; } で大丈夫でしょうか?
std::accumulateを使いたくなる
>>770 double y;
↓
double y=0.0;
774 :
秋葉の大学生&rlo;望志んさ屋トフソ :2006/11/04(土) 21:47:04
すいませんさっきの大学生ですが ボクの計算機では1万回やると約3秒かかりました。 しかし2万回以上に増やすとエラーで強制終了してしまうのですが・・・ 原因はメモリ不足でしょうか? C言語では乱数を2万回作ったくらいじゃメモリ不足?で強制終了されなかったと思いますが C++はそんなもんなのでしょうか?? [3] 環境 [3.1] OS: WindowsXP-SP1 [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 for Win32 & Turbo Incremental Link 5.00
775 :
秋葉の大学生&rlo;望志んさ屋トフソ :2006/11/04(土) 21:50:12
あ、CPUとメモリも載せておきます 演算装置:Athlon64-3600+ メインメモリ:DDR SDRAM 1024GB
static double temp[20000]; とかにしてみれば? 多分スタックオーバーフローが生じてる
>>766 釣られてみる
#include<stdio.h>
int main(void)
{
int c;
printf("数字を入力してください:");
scanf("%d", &c);
while (c-- > 0)
putchar('*');
return 0;
}
>>774 さっきの
>>749 のことか?
temp[10000];で10000個のメモリしか確保してないんなら
20000にしたら不正アクセスで落ちるのは当然だぞ。
779 :
秋葉の大学生&rlo;望志んさ屋トフソ :2006/11/04(土) 21:54:21
http://ipoko.skr.jp/ransuu.cpp.txt n=20000ちょいくらいで実行させてみてください
他にもエラーで強制終了する人いますか?
自分で使うプログラムだからいいけど
例えば,仕事とかで顧客に納品するアプリやシステムでこういうことが起こったら
どう対処するべきなんですか?(顧客側の計算機のスペックのせいで台無しになったら・・・)
780 :
秋葉の大学生&rlo;望志んさ屋トフソ :2006/11/04(土) 21:55:19
781 :
秋葉の大学生&rlo;望志んさ屋トフソ :2006/11/04(土) 21:57:44
C++では int temp[n]; ってのは使えないんですか?Cでも使えたかなぁ・・・?
782 :
秋葉の大学生&rlo;望志んさ屋トフソ :2006/11/04(土) 21:58:17
動的に確保するしかないのか malloc()とかって使えるのかなぁ
783 :
_ :2006/11/04(土) 21:58:50
>>779 もしかしてwin32consolアプリでやってる?
DOS窓は286でも使えるように(今回の場合、仮想86モードだろうけど)、すなはちセグメント切り替えできない、すなはち64KBの壁があって、
それ以上のプログラムははじかれると思ったけれど・・
784 :
_ :2006/11/04(土) 22:00:50
785 :
秋葉の大学生&rlo;望志んさ屋トフソ :2006/11/04(土) 22:04:34
2万回でやると 27780前後の乱数に収束する
DOS窓でやってます
C++のrand()関数で返ってくる値の最大値RAND_MAXが分からない そこで統計的に近似させることが出来るのではないかと考えた。 【モデル】 1.0〜RAND_MAXの中から任意のある値を決め 2.その数が 何回目のrand()で返ってくるか。 3.1〜2を何回も繰り返す。
789 :
_ :2006/11/04(土) 22:10:41
ごめんmalloc(C,C++)とnew(C++)まちがえたwwwwwww
>>783 WIN32コンソールアプリはDOSアプリとは違い、
64KBの壁はない。
WIN32コンソールアプリとDOSアプリの違いが分からない。
795 :
_ :2006/11/04(土) 22:15:28
>>790 なるほど
ところでWIN32コンソールアプリもコンパイル時にFARCALLやってくれるのかな
>>345 の気をつけますというのは
>>343 に対してです(汗
342 名前:秋葉の大学生♂?望志んさ屋トフソ 投稿日:2006/11/04(土) 19:31:28
Cはそれなりに得意ですが
CとC++の違いがまだ分からないです。
勉強に当たって何に気をつければいいとかありますか?
343 名前:デフォルトの名無しさん 投稿日:2006/11/04(土) 19:35:16
罠が増えてるので気をつけましょう
788=796=797
799 :
デフォルトの名無しさん :2006/11/04(土) 22:21:21
http://www.jurapun.com/Tutorial/Batch/index.htm 「MS-DOSプロンプト」はWindowsではMS-DOSアプリケーションだけでなく、Win32コンソールアプリケーションを動作させるための環境でもあります。
このWin32コンソールアプリケーションは、見た目はMS-DOSアプリケーションと変わりませんが、中身はれっきとしたWin32アプリケーションです。
よって、MS-DOSアプリケーションとは違ってセグメント(64KB)境界を気にしないでアプリケーションが組めるわけです。
バッチ
801 :
デフォルトの名無しさん :2006/11/04(土) 22:22:31
main()関数でかいからCよりC++のほうが好き???
>>800 さん
ギリギリまでがんばったんですが、わからなかったんです・・・
803 :
デフォルトの名無しさん :2006/11/04(土) 22:23:21
メールやWEB等のインターネットによる提出だと 24:00までが〆切ってのも結構あうr
>>798 別なところで質問して答え貰ってただろw
806 :
デフォルトの名無しさん :2006/11/04(土) 22:27:14
タンゴ で思い出した! yahoo映画れびゅーで フラガールって人気あるけど面白いの?
>>804 さん
明確な指定はないです
一応単語数は100語に指定してあります
>>805 さん
恐らく同じ授業取っている別人ではないかと・・・
808 :
デフォルトの名無しさん :2006/11/04(土) 22:27:55
>>807 おまえ、小林じゃねーか!
どうしたんだよ、おい
これは酷い( ^ω^)
なんだ答え出てるじゃん
しかもmain関数がコンパクトで分かりやすいな
>>809 さん
あ、はい
出来ればtree構造を使えという指定を使うとこれですね
私がやったのは使わない方法なので・・・
だが個人的にmainを最後に書くのは好かない
>>814 俺はmainを最後に書く派。
プロトタイプ宣言面倒じゃね?
プログラミングの宿題なんて先生や上司しだいで 天と地ほど難易度に差が出てくる
???????????????? ??????????■?■???? ??????■〓?? ????? ????■?? ???? ??????? ?????? ?????? ??????? ? ? ??? ?????????? ? ? ???? ??? ■??????? ???? ?? ?? ????????? ?? ?? ■ ■???????? ???? ?? ?????????? ????? ?これがコピペできないとPC関連の仕事は難しい ?????????? ??■? ? ???????????? ?? ????????■????? ??▲
>>817 あれは書く癖つけたほうがよくないか一応
>>815 聞いても何の役にも立たんと思うけど、俺は2回生だな。
mainを最後に書いてるのはぶっちゃけプロトタイプ宣言面倒だから。
なんか1ファイルで収まるレベルの課題だと、真面目に書くのだるいんだよな。
奇遇だな 俺も2年生だ
>>823 ぶっちゃけも何もそれ以外の理由はないだろうなw
書く癖はつけておいたほうがいいかもな といWinnyのソースコード見て思った Winnyのmain.cはヘッダファイルでまとめちゃって どこいっちゃてるかもう沸け分からないけど
827 :
798 :2006/11/04(土) 22:44:15
みなさん迅速な対応ありがとうございます! 先ほど教えていただいたソースをがんばって理解していじってみます
普通のアプリケーションなら書くべきだけど、宿題レベルなら省略しても問題ないだろ
>>826 ありゃバイナリから再構成したものだから全体的にむちゃくちゃ。
>>832-833 あ、ちなみにソースコードの
int temp[];のところで3万以上を入力しても駄目なんです><
>>834 ここは宿題スレだ。用事が済んだのなら帰ってくれ。
というよりint temp[3万以上]; としたソースをコンパイルして実行させると強制終了しちゃいます。 ユーザが入力する前に・・・
スタックがスパッツとかストックの親戚だとおもてる悪寒 すなおにヒープで確保しろとおも
>>839 え?
int temp[1000000];とかにすると強制終了します
winnyってDephiって聞いたことあるんだが違ったのか
>>837 ソフト屋さん志望してないなら
ヒープ・スタックの区別なんて知る必要ないよ
(逆読みってことはそういうことだよね)
>>841 もうお前添え字1000個超えたらヒープからもってくるようにしろ
これは命令です
私、mixiのとあるC言語コミュに加入していたのですが、そこの管理人があまりに横柄&失礼な文を書くので退会してきました(^_^;) 初心者の人が虫食い状態のソースを埋めて完成させる簡単な課題を丸投げしていたのですが… わざと理解できないように難しく書き直したり、きちんとお礼を言っている質問者に対して『この程度の事が分からないのはやる気がないだけ、そんな人間にお礼を言われる筋合いもないし、虫酸が走る』とまで書いていました…。 分かる人には大した事の無いことだったとしても、分からない人にはそうでないのですから、もう少し常識ある態度が取れないのかな…と思った訳です。
実は、他の掲示板でも似たような事があり、非常に不愉快な気分になった事もありました。初心者&入門者用と謳っていながら、分かる人が知識をひけらかし、分からない人を中傷するような感じだったんです。 こういうのを見た後に、ここのサイトにやってきたので、余計に素晴らしいなと思ったんですよね(笑) 私の拙い知識でも役に立つ人がいるのならば…と、今後を驕ることなく書き込みしていきたいと思ってますよ(^-^)
>>845 もしかしてその発言した奴はKusa○○○eじゃないのか。
>>845 わかってないですね
その人にはあなたには分かっている「常識」が分かっていなかったんですよ?
なんで分かりやすく「常識」を教えてあげなかったんですか
結局あなたも一緒じゃないですか!!
べろべろば〜♪
ネットの人間なんて他人を誹謗中傷することで相対的に自分をよく見せようと思ってるやつばかりだよ
PGにはそうゆうタイプの人間多いよ
kusakabeをブックーマークしますた
>>845 >>846 そういう真面目さは裏切られるのがオチなのでお勧めしない。
個別の疑問に優しく答えて欲しいならそれ相応の金を払って家庭教師でも雇えばいい。
タダで人から何でもかんでも教わろうという考えが既に虫のいい考えだ。
855 :
デフォルトの名無しさん :2006/11/04(土) 23:16:49
>>773 あ、そうですね。ありがとうございます。
面白い宿題ならわりと食いつく。 (そういう宿題はめったにないけど。) GIVE&TAKEの精神で。 ネタを提供するかわりに回答を教えてもらうと。 一方通行は健全じゃないよな。
このスレの場合、からかいながらも真っ当な(ときには間違いもあるが)ヒントを出してる ってところでちゃんと宿題の助けにはなってると思う。 単に答えを教えて、それに大してありがとうってだけでは誰のためにもなってないわけで、 一見して穏やかなようでもそれが正しいとは思えない。
ところで宿題が数問すっとばされてるのは気のせいか
>>845-846 言いたいことは分かるが常識ある人間ならこんなところで陰口をたたくのはやめような
861 :
デフォルトの名無しさん :2006/11/04(土) 23:41:16
すいません さっきの大学生ですが
http://ipoko.skr.jp/ransuu.cpp.txt int型の配列を25000個なら確保できるけど,
30000個以上だとプログラム実行させても強制終了しちゃいます
配列の宣言のところで
int temp[3万以上]; としたソースをコンパイルして実行させると強制終了しちゃいます。
これの原因は何でしょうか?
流れ早いぞ
原因は大宇宙の神秘♪
864 :
デフォルトの名無しさん :2006/11/04(土) 23:42:34
Ransuu::RandomToukei() { int n, s=9999, temp[1000000]; //30000以上にすると強制終了? float sum = 0.0;
>>861 言語の意味的には間違ってないと思う。
だけど、現実には無制限にメモリを使えるわけじゃないんだ。
スタックからあまりたくさん確保するのは基本的に避けよう。
スタック領域 <<きっと超えられない容量の壁<< ヒープ領域
>>861 だからilinkのオプションに/S:0x8000000 (=8MB) でも付けてみろって。
マルチすんな。ますます誰も答えなくなるぞ。
868 :
デフォルトの名無しさん :2006/11/04(土) 23:46:31
1000000×4byte=4MB
869 :
デフォルトの名無しさん :2006/11/04(土) 23:47:12
質問した相手が悪かったんだろう。これからは質問する前に Ku○○○○○eがいないかどうか確かめて、もしいたらそこには 何も書き込まない事だな。
>>870 推測だけど多分
double j0(double)
double j1(double)
>>870 多分
>>555 はこういうこと。
入力は
仕事の到着する時間 仕事開始から終了まで必要な時間
となる。んで、仕事番号は 0 から順番に勝手に付けろ、と。
出力の前半は要するに入力したデータをフォーマットだけ入れてそのまま出力。
後半は、最後の仕事終了時刻が最も早くなるようにスケジュールを組み、その状況をしめす。
"JOB #"は仕事番号、"Arr"は仕事が到着する時刻、"Fin"はその仕事が終了する時刻、
"Svc"は仕事にかかる時間、"TA"は仕事に実質的にかけた時間(終了時間-到着時間)
>>673 #include<stdio.h>
int main(void)
{
double x;
printf("x,j0(x),j1(x)\n");
for(x=0.0;x<=20.0;x+=0.1)
{
printf("%f,%f,%f\n", x, j0(x), j1(x));
}
return 0;
}
874 :
デフォルトの名無しさん :2006/11/05(日) 00:55:47
IT化だから最近の子供は凄いのか〜とか思うのは間違い!! 最近の子供はコンピュータがブラックボックス化してしまたせいで コンピュータの仕組みについては何も知らない MS-DOS?Windows3.1?コマンドライン?(謎)って感じ 昔に比べて自分でプログラム作る必要は無くなったし 自作する必要も無くなった(自作PCと既製PCの値段の差が無くなってきている!) (まぁインターネットサーフェインやHP作成はちょっと昔の子供より出来そう?だが) 商業高校の掲示板とかスレとか見てみ? 情報をたくさん勉強してるはずなのに何も知らないよ? 資格もワープロ検定やパソコン検定などエンドユーザ側の試験ばかり(それはそれで悪くはない・・?)
スタック領域って決まってたんだ…始めて知った(初級者) メモリあるだけ使えるのはヒープだけの特権なのね
スタック知ってる時点で初心者じゃない気がする
ポインタの本の最初の方に書いてあったから知ってるだけとです どんなアルゴリズムなのか全然わからんとです…('A`) スレ違いすみませんでした 学校で習ってるわけじゃないので質問したことはないけど、色々勉強になるのでROMせてもらってます
878 :
デフォルトの名無しさん :2006/11/05(日) 01:12:55
え? スタックやキューの大きさって自分で決められないの? 今までかってに配列宣言してたけど
変にでかい値じゃなけりゃ(・ε・)キニシナイ!!
>>878 > スタックやキューの大きさって自分で決められないの?
↑と↓の展開の速さが釣りを表しています
> 今までかってに配列宣言してたけど
きっと余程急いでいたのでしょう・・・
881 :
デフォルトの名無しさん :2006/11/05(日) 04:16:15
∧ l'vヘ ハ ┌( ;/ ト, ,、 rヘ r'^ナrジ-z __}ヽ,__ (ヽ/ス_r^フしz,り い)n/イr〜^′ 'っヾ、r'__ |レ'ノ_C'入彳勺ソメろ_j/し-,_ `フ ヾ勹_| <_r' !|刀_」r''>||/⌒(_rヘ-‐' <_ゝし||フぅ(ひzメ__ゝ'l !'そ ~zヾ|て 、l レ^ //'| |'~ | | ヽl| // }| | :! || | | ,/ ,' すいません、ちょっと通りますよ | :{. || | |/ / l !|| | | / ヽ ヽ.|/ // _,r)_ j (_,( ciz ,ノこ_- __,ーヽ ん|Zゥ レz zjそ_ } ... 丿 ろ、,_!|乙7ムLそ/し-z ノ""'' 一( `う.l !シ/ア了//_⊂, /、__ ヽ ^'| |~//,/_ソ ハr^ / ...... ーl | |// //ノ /~"' 、__/ ,,,...} |/ /// {' _ `y′ 一 / r'〜(_ノ 人 =/‐- ハ 丿" ''( ヽ '' / __,, / / ‐- ''') '∨ X. }''' ....ノ j ー/ /== ノ'ヽ /=‐ r'´-ヽ } ー/'''' { ,' _,, 人 ''"`、 ノ.. '' ノ`ヽ ''"ヽ {ー / \ -'} / / \'''}` ハ 〈 )八 ( f )ハ ヽ ) (( )ノ / ノ/ ') _/
882 :
デフォルトの名無しさん :2006/11/05(日) 04:16:40
>>365 そりゃ、スタックオーバーフローだろうな。
temp配列の領域をスタックに置いているから、ある程度以上のインデックスを超えると
リンカで用意しているスタック領域を超えて、メモリ領域を壊しまくる。か、MMUによってアクセス例外が起きる。
普通ある程度大きな領域を必要とする場合は、ヒープ領域にとる。
int* temp = new int[1000000]; //領域確保
... 処理
delelte[] temp; //使い終わったら必ず領域開放
883 :
デフォルトの名無しさん :2006/11/05(日) 04:17:41
>>861 そりゃ、スタックオーバーフローだろうな。
temp配列の領域をスタックに置いているから、ある程度以上のインデックスを超えると
リンカで用意しているスタック領域を超えて、メモリ領域を壊しまくる。か、MMUによってアクセス例外が起きる。
普通ある程度大きな領域を必要とする場合は、ヒープ領域にとる。
int* temp = new int[1000000]; //領域確保
... 処理
delelte[] temp; //使い終わったら必ず領域開放
884 :
秋葉の大学生&rlo;望志んさ屋トフソ :2006/11/05(日) 04:20:26
>>883 ありがとうございました。
スタックがそんなところに存在して
あの場所で宣言すると勝手にリンカのスタックに入ってしまい
しかもゴチャゴチャした制約があったなんて知りませんでした
勉強になります
885 :
デフォルトの名無しさん :2006/11/05(日) 04:42:30
問題:年代と月のインデックス(1-12)を読み込み、 曜日ごとに整理された表(カレンダー)を表示するプログラムを製作せよ
887 :
デフォルトの名無しさん :2006/11/05(日) 10:47:30
保存してないデータを別プログラムから読み出せ、とは書いてないから 問題文のプログラムにFFTのルーチン書き加えたりして、そのままbufを読みに行けば?
[1] 授業単元:Cプラクティス
[2] 問題文(含コード&リンク):
異なる40個の正の自然数が書かれた40枚のカ−ドが1次元(直線)上にランダムに並べられている。
先手と後手が交互に1枚づつ取る。ただし、カ−ドの取り方は直線上に並べられたカ−ドの右端、
または左端のカ−ドしか取れないものとする。
先手は意図的に偶数番目、奇数番目どちらかのカードを取りつづけることが出来る。
先手が必ず勝つには、偶数番目、奇数番目のカードの和を求め、大きいほう種類のカードをとりつづければいい。
このとき、引き分けの場合と先手が勝つ場合に分け、プログラムで計算し、その結果を確かめる。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:BCC5.5
[3.3] 言語:Cのみ(coutは可)
[4] 期限:2006年11月06日10:00まで
[5] その他の制限:C習い始めて1年くらいの奴が書くような感じでお願いします。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2877.txt ここまでは書いたのですが、うまく動きません。
よろしくお願いします。
>>889 勝つ条件は?
それと
>先手は意図的に偶数番目、奇数番目どちらかのカードを取りつづけることが出来る。
ここもよくわからないんだけどランダムに並んだカードの端からしか取れないのに
どうやって意図的に選べるんだ?
>>890 勝つ条件抜けてました。すいません。
取ったカードに書かれた数字の和が大きいほうが勝ちです。
1 2 3 4 5 6
とあるときに、自分が偶数番目である6を取った場合、1 2 3 4 5 となり、相手は1か5の奇数番目を取るしかなくなる。
で、相手がどちらを取ったとしても左右の端どちらかは必ず偶数番目なので、また偶数番目をとることができる。
同様に一番最初に奇数番目を取った場合も同じ。
こうやって先手は偶数番目、奇数番目どちらかを意図的にとりつづけることが出来る、ってわけです。
脳内コンパイラしか通していないが・・・ enum {LEFT, RIGHT}; int delete_card(int a[], int n, int side) { int i; if (a == NULL || n < 1) return -1; if (side == RIGHT) return n - 1; for (i = 0; i < n - 1; i++) a[i] = a[i + 1]; return n - 1;} /* 左右のうち大きいほうを取る */ int cpu1(int a[], int n) { if (a == NULL || n < 1) return -1; if (a[0] > a[n - 1]) return LEFT; return RIGHT;} /* 奇数、偶数番目の和を考える */ int cpu2(int a[], int n) { int i, sum[2]; sum[0] = sum[1] = 0; if (a == NULL || n < 1) return -1; for (i = 0; i < n; i++) sum[i % 2] += a[i]; return (sum[0] > sum[1]) ? LEFT : RIGHT;}
>>891 偶数奇数で交互に並んだランダムな数列という事ですね。
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):3つの整数をキーボードから入力し、switch文を用いて大きい順に並べるプログラムを作成しなさい。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:Borland C(V5.5) [3.3] 言語:C [4] 期限:11月06日 12:00まで [5] その他の制限: 本当に基本的なプログラムでお願いします。 いろんなサイトを参考にしましたが、自分の頭じゃどうプログラムを組めばいいのか全くわかりませんorz
>>894 if (a < b) swap(&a, &b);
↓
switch (a < b) { case 1: swap(&a, &b);}
ぐらいしか思いつかんのだが・・・。
なんで苦し紛れでswitch文を使う必要があるんだよ
int main(void) { switch(
a、b、cの3つの変数なら最大8種類までの大小関係があるに過ぎないから、 switch文も8個の条件を書けばいい。
abc acb bac bca cab cba 6種類じゃなくて?
あ、イコールがあると10種類か
なら abc acb bac bca cab cba a=b>c a=b<c a=c>b a=c<b b=c>a b=c<a a=b=c で15通り ではなくて?
904 :
903 :2006/11/05(日) 21:52:16
間違えた13通り
gdgdだなww
906 :
894 :2006/11/05(日) 21:56:26
すみません、せっかくレスしていただいたのに全くと言っていい程進んでないですorz
>>898 この講義の担当教員はかなり生徒の評判が悪いです。
質問しに行って話しているといきなり「何でこんなことも分からないんだ!?」と
いきなり怒りだしたりと、あまり講義を受けたいと思う人じゃないです。
でも必修科目で選択の余地無しなんです('A`)
#include <stdio.h> void int swap(int *a, int *b) { int t; t = *a; *a = *b; *b = t; } int main(void) { int a, b, c; scanf("%d%d%d", &a, &b, &c); printf("%d %d %d\n", a, b, c); switch (a < b) { case 1: swap(&a, &b); }; switch (b < c) { case 1: swap(&b, &c); }; switch (a < b) { case 1: swap(&a, &b); }; printf("%d %d %d\n", a, b, c); return 0; } うーん・・・中途半端。
TRUEが1って保証されてたっけ
書いてるうちに訳が分からなくなってきた orz switch ( (a > b) + (a > c) * 2 + (b > c) * 4 ) { case 0: printf("%d %d %d\n", a, b, c); break; case 1: printf("%d %d %d\n", b, a, c); break; //case 2: printf("%d %d %d\n", a, b, c); break; // a<=b b<=c -> a<=c : 0 case 3: printf("%d %d %d\n", b, c, a); break; case 4: printf("%d %d %d\n", a, c, b); break; //case 5: printf("%d %d %d\n", c, b, a); break; // a>b b>c -> a>c : 7 case 6: printf("%d %d %d\n", c, a, b); break; case 7: printf("%d %d %d\n", c, b, a); break; }
>>908 > TRUEが1って保証されてたっけ
さあ?
まあ、詳しくは規格書みてくれ。
trueが1になるように書けばいいじゃん。 (a > b ? 1:0) + (a > c ? 1:0) * 2 + (b > c ? 1:0) * 4
913 :
912 :2006/11/05(日) 22:14:58
どんどん壊れていってるな。 switchの呪い、恐るべし。
>>915 あぁ…、22行目いらん。
あと153行目の300とかいう数字はマクロにしといて下さい。
>>910-
>>912 俺の認識ではNo
0か非0かだと思った
( ( a > 1 ) == 1 ) は良くない
( ( a > 1 ) != 0 ) と書くべき・・・・だったと
ただTUREとtureは違うとも....
918 :
917 :2006/11/05(日) 22:25:09
>ただTUREとtureは違うとも.... !! TRUEとtrue ね
>>894 解答例とか公開されるの?
オレも模範解答が知りたい
C99 6.5.8の6 Each of operators < (less than), ... shall yield 1 if the specified relation is true ...
921 :
894 :2006/11/05(日) 22:36:37
模範解答はおそらく公開されると思います。 しかし、たまに前回の課題について何もふれないまま講義が進み 次の課題が出たりすることもあるのであまり期待はしないでください。
>>917 不正確な認識は仕様書を読んで改めよ。
if 文の中で非ゼロが評価された場合真、
ゼロが評価された場合偽になるのは正しいが、
それとは別に比較演算子は 1, 0 を返す。
if(b >= a){ if(c >= b) d = 1; else if(c >= a) d = 2; else d = 3; } else if(a >= c) d = 4; else d = 5; switch(d){ case 1 : printf("%d %d %d\n",c,b,a); break; case 2 : printf("%d %d %d\n",b,c,a); break; case 3 : printf("%d %d %d\n",b,a,c); break; case 4 : printf("%d %d %d\n",a,c,c); break; case 5 : printf("%d %d %d\n",c,a,b); break; } うーむ・・・
>>921 把握した
…スマートな方法は無さそうだが
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク):各値を格納した構造体をvector<>に格納し、さらに、構造体にある値を検索し表示させるプログラムを作れ。 [3] 環境 [3.1] WindowsXP [3.2] CV++6 [3.3] 言語:C++ [4] 期限:本日中 [5] vectorに格納する構造体の個数は2個以上でお願いします。 struct{ int age; char *name; }; void main(){ while( 1 ){ 各値の入力格納、vectorに格納 } vector<T>::iterator i = find(・・・); 検索した値の構造体のすべての値を表示 } 上記のは例みたいなものなので、できればこれに近い形のプログラムをお願いします。
926 :
923 :2006/11/05(日) 23:06:14
間違いまくりorz
>>925 #include <algorithm>
#include <iostream>
#include <string>
#include <vector>
struct human {
int age;
std::string name;
human() {}
human(int a, std::string n) : age(a), name(n) {}
bool operator==(const human& rhs) {return age == rhs.age && name == rhs.name;}
};
int main() {
std::vector<human> v;
int age;
std::string name;
while (std::cin >> age >> name) {
v.push_back(human(age, name));
}
std::vector<human>::iterator i = std::find(v.begin(), v.end(), human(5, "Bob"));
if (i != v.end()) {
std::cout << i->age << " " << i->name << std::endl;
}
return 0;
}
928 :
925 :2006/11/05(日) 23:19:34
929 :
887 :2006/11/05(日) 23:20:49
930 :
デフォルトの名無しさん :2006/11/06(月) 00:29:51
>>929 凄い難しいことやってるのね。
大学って凄いね。
東京大学情報学部の課題だけあってさすがにレベル高いな
>>929 課題4
status = write(fd, buf, sizeof(buf)); /* play it back */
↓
{
#if (SIZE==16)
short *pvalue=(short *)buf;
#elif (SIZE==8)
signed char *pvalue=(signed char *)buf;
#endif
int i;
FILE *fp;
fp=fopen("parrot_4.txt", "a");
for(i=0;i<LENGTH*RATE;i++)
{
status = write(fd, pvalue, SIZE/8*CHANNELS); /* play it back */
if(CHANNELS==1)
fprintf(fp, "%d\n", pvalue[0]);
if(CHANNELS==2)
fprintf(fp, "%d,%d\n", pvalue[0], pvalue[1]);
pvalue+=CHANNELS;
}
fclose(fp);
}
933 :
894 :2006/11/06(月) 01:17:31
int a,b,c; printf("一つ目の整数値-->"); scanf("%d",&a); printf("二つ目の整数値-->"); scanf("%d",&b); printf("三つ目の整数値-->"); scanf("%d",&c); if (a>b) if (b>c) printf("%d>%d>%d",a,b,c); else if (c>b) printf("%d>%d>%d",a,c,b); if (b>a) if (a>c) printf("%d>%d>%d",b,a,c); else if (c>a) printf("%d>%d>%d",b,c,a); if (c>a) if (a>b) printf("%d>%d>%d",c,a,b); else if (b>a) printf("%d>%d>%d",c,b,a); return(0); } switchを使うのは無理なので減点覚悟でif文で組んでみたのですが ちょっと自信がないので確認していただけないでしょうか?お願いします。
>>933 重箱の隅つつくみたいだけど、表示形式がそれだとa=bのときは?
935 :
894 :2006/11/06(月) 01:24:27
しまった、忘れてましたorz
[1] プログラミング [2] 自然数 n に対して 1/1+1/2+1/3+1/4+…+1/n を計算する関数 double h(int n) を作成せよ. main 関数から h を呼び出し, 1〜10 の整数 i について h(i) を表示 (小数点以下 5 桁) するようにせよ. 次のような結果が得られることを確認せよ i h(i) 1 1.00000 2 1.50000 3 1.83333 4 2.08333 5 2.28333 6 2.45000 7 2.59286 8 2.71786 9 2.82897 10 2.92897 [3.1] winXP sp2 [3.2] cygwin [3.3] C [4] 20006/10/6/23時59分 [5] どんな感じにするか次に書くので埋めて下さい。
937 :
936 :2006/11/06(月) 01:35:24
#include<stdio.h> double h(int);/*プロトタイプ宣言*/ int main(void) { int n; for(i=1;i<=10;i++) { printf("%d\t%5.3f\n",i,distance(i,(i+2))); } return 0; } double h(int n)/*関数の定義*/ { return n; } よろしくお願いします。
939 :
936 :2006/11/06(月) 01:37:28
・・2006年です。><
西暦10000年問題が心配です
>>936 #include<stdio.h>
double h(int);/*プロトタイプ宣言*/
int main(void)
{
int i;
printf("i\th(i)\n");
for(i=1;i<=10;i++)
{
printf("%d\t%.5f\n", i, h(i));
}
return 0;
}
double h(int n)/*関数の定義*/
{
double value=0.0;
int i;
for(i=1;i<=n;i++)
value+=1.0/i;
return value;
}
942 :
936 :2006/11/06(月) 02:31:54
>>941 ありがとうございます。
あとこのプログラムが動かないんですが誰か間違い探しお願いします。
本とか見て考えても分かりません。
#include<stdio.h>
void gcdprint(int,int);
void printf_cd(int,int);
int gcd(int,int);
int main (void)
{
int a,b;
printf("a bを入力して下さい>>");
scanf("%d %d",&a,&b);
gcdprint(a,b);
print_cd(a,b);
return 0;
}
長いから続きで
943 :
936 :2006/11/06(月) 02:32:27
void gcdprint(int a,int b)
{
printf("gcd=\t%d\n",gcd(a,b));
}
void print_cd(int a,int b)
{
int g,i;
g=gcd(a,b);
printf("%d\tgcd\t%d\t=\t%d\n",a,b,g);
for(i=2;i<g;i++)
{
if(g%i==0)
{
printf("%d\n",i);
}
}
}
int gcd(int a,int b)
{
int z;
while((z=a%b)!=0)
{
a=b;
b=z;
}
return b;/*bに余りzを代入する*/
}
よろしくお願いします。
>>936 は正常に動作しました。
945 :
936 :2006/11/06(月) 02:35:43
たしかに問題文がありませんでした。
実は
>>508 に出した奴です。
提出日勘違いで1週間先だったようです。
>>942 どう動かないのか詳しく書いてくれないとエスパー回答しかできないぞ
ってことでエスパー回答
for(i=2;i<g;i++)
↓
for(i=2;i<g;i++)
947 :
946 :2006/11/06(月) 02:44:00
訂正 for(i=2;i<=g;i++)
948 :
946 :2006/11/06(月) 02:45:48
さらに訂正 for(i=1;i<=g;i++) ミス多すぎ。もうダメ。寝よう Zzz
949 :
デフォルトの名無しさん :2006/11/06(月) 02:54:56
次スレではもっとレベルの高い出題を願います。 中学生でもできるようなものを教えてもらって恥ずかしくないのですか?
>>929 ('A` 家のVMにdspデバイスが無いっぽいので実験できねぇ・・・ムチャクチャ楽しそうだ
中学でプログラミングなんてオタク以外やりません
今時は小学校でもプログラミング教えてるぞ
>>950 ('∀` とおもったらcygwinさんが/dev/dspをサポーチしてくれてた!!!やった!楽しスwwwwwwwwwwww
>>946 そうでした。
動かしてみたら11行目のprint_cd(a,b); あたりにエラー出てまず動きません。
プログラムの書き方自体に問題があるようです。
mainからgcdとprint_cdを呼び出すようんしたいんですが、
2つを同時にする方法が分かりません。
ちなみに11行目のprint_cd(a,b); 削除したらプログラムは動作するようになりますが
>>508 の問題文の
# 2つの自然数 a, b に対し, a と b の最大公約数を求める関数 int gcd(int a, int b) を作成
だけが正常に表示されて他は出ません。
アドバイスか添削お願いします。
>>936 ,
>>942 ,
>>954 コンパイラの吐くメッセージの事を言ってるならコピペしてよ
void printf_cd(int,int);
↓
void print_cd(int,int);
956 :
デフォルトの名無しさん :2006/11/06(月) 03:23:12
>>953 どうせコンパイルでき、実行できただけ喜んでんだろw
>>894 結局のところ、if文とswitch文を正しく把握してるかどうか試されてるだけだと思うぞ。
エレガントな書き方ではないが、if文をswitch文に置き換えることは可能だし。
あと、自力で考えないでこんなところに丸投げしてる奴に、教授を非難する資格はないよ。
>>894 通常は教員としての仕事は評価されない上に、
簡単な問題に対する質問に時間をとられて研究できなくなると
教員にとっての死活問題になるからなぁ…
ここの住人からすれば面白くない問題を出したという意味で、
叩かれても仕方ないけどね
>>956 音鳴ったスwwww
やべぇwwww
Win32API使うのなんて目じゃないくらいに簡単wwwww
うは、これでUDP broadcast使ってネット越しに音流せるwwww
960 :
デフォルトの名無しさん :2006/11/06(月) 04:18:35
ヲタ発見
(^ω^) フヒヒ 何とでも言うがいいぉ どうせボクの足元にも及ばない愚民の鳴き声なんだぉ フヒヒヒヒッヒ
コマンドからいくつか引数を取って 一つの文字列につきメモリをその都度動的に確保し 逆順に並べ替えて、さらに出力行の最後の一文字目だけ大文字にして 出力するプログラム (動的メモリ割り当て) スレ違いと言われここに来ました 誰か教えて下さい
964 :
963 :2006/11/06(月) 07:03:07
すいませんちゃんと書きます [1] 授業単元:プログラミング [2] 問題文(含コード&リンク):コマンドからいくつか引数を取って 一つの文字列につきメモリをその都度動的に確保し 逆順に並べ替えて、さらに出力行の最後の一文字目だけ大文字にして 出力するプログラム [3] 環境 [3.1] OS: unix [3.2] コンパイラ名とバージョン: (gcc [3.3] 言語: (C [4] 期限: 今日 [5] その他の制限:
965 :
デフォルトの名無しさん :2006/11/06(月) 07:06:51
いってることがさっぱりわけわか そんなプログラム作ってなんの役に立つの?
966 :
963 :2006/11/06(月) 07:20:57
動的メモリ割り当ての復習らしいです 宿題なんでやらなきゃどうしようもない あとコマンドじゃなくてコマンドラインです 例えば ./○○○ orange appleと入力したら egnarO elppA となるようなプログラムです 誰か教えて下さい
>>964 適当に
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stddef.h>
#include<ctype.h>
char*strdup_(char*s);
char*capitalize(char*s);
char*strrev_(char*s);
int main(int argc,char**argv){
(void)argc;//unused
while(*++argv){
char*p = strrev_(capitalize(strdup_(*argv)));
if(!p){perror("main:");break;}else puts(p);
}
return 0;
}
/*
*/ char*strdup_(char*s){ size_t len = strlen(s); char*p = (char*)malloc(len+1); if(p)memcpy(p,s,len+1); return p; } char*capitalize(char*s){ if(s)*s = (char)toupper(*s); return s; } char*strrev_(char*s){ size_t len,i; if(!s)return s; len = strlen(s); for(i=0;i<--len;++i){char c=s[i];s[i]=s[len];s[len]=c;} return s; }
>>967 あ、メモリリーク。C++にどっぷり毒されてるから開放忘れてた。
修正修正
while(*++argv){
char*p = strrev_(capitalize(strdup_(*argv)));
if(!p){perror("main:");break;}else puts(p);
free(p);
}
970 :
894 :2006/11/06(月) 07:37:16
>>957 ここに課題を持込んでここの住人の人達に解いてもらい、その上で教員を
批判するような発言をする権利など無いというのは反論する余地がありません。反省します。
あと、まだ少しですが時間はあるので自分の頭を使って考えてみます。
>>958 自分はまだ研究室に配属されていないので忘れがちですが、先生方の本業は自分の研究ですから
このようなルーチンワークに時間を割かれるのを嫌うということを考えもしませんでした・・・。
971 :
963 :2006/11/06(月) 07:51:03
>>967-969 ありがとうございます
だけど自分アマチュアなんでちょっと分からない
下のやつ改造して教えてくれませんか?
(間違いは多々あるとおもいますが…)
あと他に条件で一度確保したメモリは次の文字列を処理する前に解放せよ
ってのがありました
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
int i, j, elem;
char *array;
if(argc == 1){
exit(1);
}
elem = argc - 1;
array = malloc(elem * sizeof(char));
ここらへんがわかりません
printf("\n");
free(array);
}
972 :
デフォルトの名無しさん :2006/11/06(月) 08:07:49
>>969 C++にどっぷりだと開放忘れる?
意味不明
C#やJAVAなんておこちゃま言語につかりすぎてるだけでは?
今日ageて書き込んでる奴は同一人物かな 批判しかしねぇー
974 :
963 :2006/11/06(月) 08:23:17
>>967 967さん上の改造して作れませんか?
マジで分からないです
>>941 瑣末なことだけど1/nから足していった方がよくね
mainでは有効数字5桁しかいらないからどうでもいいといえばどうでもいいが
>>972 スマートポインタにどっぷりなんだろうよ。
>>974 俺は
>>967 ではないが。これ以上初心者向けには(俺には)できない。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i, j, length;
char *a, temp;
if (argc == 1) exit(1); /* 引数なしなら終了 */
for (i = 1; i < argc; i++) { /* それぞれの引数に対して */
length = strlen(argv[i]); /* 引数の文字数 */
a = malloc(length + 1); /* 文字数分だけメモリの確保 */
strcpy(a, argv[i]); /* aに引数をコピー */
for (j = 0; j < length / 2; j++) { /* 文字列を反転 */
temp = a[j]; /* あらかじめ文字を保存しておいて */
a[j] = a[length - j - 1]; /* 手前を後ろの文字で置き換えて */
a[length - j - 1] = temp; /* 後ろの文字をあらかじめ保存した文字で置き換える */
}
a[length - 1] = toupper(a[length - 1]); /* 最後の文字を大文字に */
printf(a); /* 表示 */
free(a); /* 確保したメモリの開放 */
printf("\n"); /* 改行 */
}
return 0;
}
977 :
デフォルトの名無しさん :2006/11/06(月) 13:45:17
問題1 整数xに1を加えた値を返す関数inc(x)と、1を引いた値を返す関数dec(x)をつくれ。 問題2 整数xを2倍した値を返す関数mult2(x)をつくれ。但し、乗算*を使ってはいけない。 問題1で用いたinc(x)とdec(x)を用いること。 (ヒント:inc(x)とdec(x)を同じ回数だけdec(x)が0になるまで繰り返す) テンプレ無視ってスマソor2
>>977 int inc(x){return x+1;}
int dec(x){return x-1;}
>>977 何のためのテンプレなんだよ
謝りゃいいって思ってるんならとっとと辞めちまえ
というわけで
>>1
>>977 int mult2(x){pow(inc(x),2)-pow(x,2)+dec(0);}
>>977 #include <stdio.h>
int inc(int x) {return x + 1;}
int dec(int x) {return x - 1;}
int mul2(int x) {
int x2;
for (x2 = x; x != 0; x = dec(x), x2 = inc(x2)) ;
return x2;
}
int main(void) {
printf("%d\n", mul2(10));
return 0;
}
#include <stdio.h> int inc(int x) {return x + 1;} int dec(int x) {return x - 1;} int mul2(int x) { return dec(x)+inc(x); } int main(void) { printf("%d\n", mul2(10)); return 0; } (ヒント:inc(x)とdec(x)を同じ回数だけdec(x)が0になるまで繰り返す) 使ってないけどw
>>955 コピーのやりかたがわからなかったもので。
学校のPCだとコンパイラの表示を選択してエンター押せばできるんですが
家のやつだと同じコンパイラなのに選択すらできません。
でもそれ直したら動きました。こういうミス多いな。。何回も見たのに。
ありがとうございました。
>>979 携帯なんだよそれくらい察しろカス
授業中なんだから早く答えろ
そのうち テスト中なんだから早く答えろ とかレスがつく日がくるのかも
>>977 int inc(int x) {return x + 1;}
int dec(int x) {return x - 1;}
int mult2(int x){
int i,y;
i=x;
y=x;
while(i>0){
y=inc(y);
i=dec(i);
}
return y;
}
前に「XX日OO時からテストなんでお前ら時間開けとけよ」とか言ってた奴がいたな。
>>988 xが負の場合どうするの?
int mult2(int x){ int i,j; i=x; j=x; while(i&&j){ i=inc(i); j=dec(j); } return i+j; }
991 :
990 :2006/11/06(月) 16:07:12
アホな題意を守りつつ書いたつもりなんだが 読み返してみると982がやってることとほとんど変わらないのが悲しい
992 :
889 :2006/11/06(月) 17:59:19
みなさんありがとうございます。 助かります。
993 :
963 :2006/11/06(月) 18:45:30
>>976 本当にありがとうございました
感謝です
994 :
デフォルトの名無しさん :2006/11/06(月) 20:13:35
sqrt()関数を使わずに平方根を求めるにはどうしたらいいですか?
995 :
デフォルトの名無しさん :2006/11/06(月) 20:18:46
>>994 級数展開でもニュートン法でもやりかたはよりどりみどり
>>994 ニュートン法の学習的実装。
#include <stdio.h>
#define eps 0.00000001
double myroot(double x) {
double ym = x, yn;
do {
yn = ym;
ym = 0.5 * (yn * yn + x) / yn;
} while (ym - yn > eps || yn - ym > eps);
return ym;
}
int main(void) {
printf("%.8f\n", myroot(2));
return 0;
}
新スレたったから埋めるかね
埋め
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。