シラバスはここにあります。
テキストは最初の授業で配布しますが,紛失した人は ここからダウンロード してください。このファイルはpdfファイルです。
プログラムの例(素数を求めるプログラム)
1: /* 素数を求めるプログラム prime.c*/ 2: #include <stdio.h> 3: #include <stdlib.h> 4: #include <time.h> 5: #define _TRUE 1 6: #define _FALSE 0 7: 8: int main(int argc, char *argv[]) 9: { 10: /* 各種変数の宣言 */ 11: int i,j,k,n,*prime; /* 整数 */ 12: long *list; /* 倍長整数 */ 13: time_t start,end; /* 時間変数 */ 14: 15: /* パラメータの設定 */ 16: if ( argc > 2){ 17: printf("Usage: prime Maximum_Integer \n"); 18: exit(1); 19: } else if ( argc<2 ){ 20: printf("Usage: prime Maximum_Integer \n"); 21: printf("Input Maximum_Integer -->"); 22: scanf("%d",&n); 23: } else { 24: n=atoi(argv[1]); 25: } 26: /* 時間の計測 始まりの時刻 */ 27: time(&start); 28: 29: /* 配列prime[n]とlist[n]の動的確保 */ 30: prime=(int *)malloc(n*sizeof(int)); 31: list=(long *)malloc(n*sizeof(long)); 32: k=1; 33: list[k]=2; 34: 35: for(i=3;i<=n;i+=2) prime[i]=_TRUE; 36: for(i=3;i<=n;i+=2){ 37: if(prime[i]){ 38: list[++k]=i; 39: for(j=i;j<=n;j+=i) prime[j]=_FALSE; 40: } 41: } 42: 43: for(i=1;i<k;i++){ 44: printf("%7d,",list[i]); 45: if(i%10==0) printf("\n"); 46: } 47: printf("%7d. \n",list[k]); 48: 49: /* 時間の計測 終わりの時刻 */ 50: time(&end); 51: 52: printf("%g[sec]\n",difftime(end,start)); 53: return 0; 54: }
1: /* ex0001.c 何もしないプログラム */ 2: /* 作成者 xxxxx */ 3: /* 作成日 2004/04/14 */ 4: 5: int main() 6: { 7: return 0; 8: }
1: /* ex0101.c */ 2: /* 作成日 2004/04/21 */ 3: /* 作成者 xxxxx */ 4: #include <stdio.h> 5: 6: /* 開始 */ 7: int main() 8: { 9: printf("Hello, World!\n"); 10: return 0; 11: } 12: /* 終了 */
1: /* ex0201.c y=x*x+2*x+1を計算するプログラム */ 2: /* 作成日 2004/05/12 */ 3: /* 作成者 xxxxx */ 4: #include <stdio.h> 5: 6: /* 開始 */ 7: int main() 8: { 9: int x,y; /* x,yを整数型変数として宣言。 (宣言文) */ 10: 11: printf("xを入力してください->"); 12: scanf("%d",&x);/* xに値を整数型のデータとして入力 */ 13: 14: y=x*x+2*x+1; /* yに値を代入 (代入文)*/ 15: 16: printf("xが%dのとき,y=x*x+2*x+1は %d です\n",x,y); 17: return 0; 18: } 19: /* 終了 */
1: /* ex0206.c 角度を「度」から「ラジアン」に変換するプログラム */ 2: /* 作成者 xxxx */ 3: /* 作成日 2004/05/26 */ 4: 5: #include <stdio.h> /* stdio.hをインクリュードする */ 6: int main() /* main関数 */ 7: { 8: int radian,degree=0; /* 整数型radian, degreeの宣言 */ 9: float PI=3.141592654; /* PI 円周率 */ 10: 11: while(degree <= 180){ 12: radian = degree*PI/180; /* ラジアンの換算 */ 13: printf("%d %d\n",degree,radian); /* 結果の出力 */ 14: degree+=10; /* degreeを10増やす */ 15: } 16: return 0; /* 終了 */ 17: }
1: /* ex0210.c 行列と配列の対応 */ 2: /* 作成日 2004/06/02 */ 3: /* 作成者 xxxxx */ 4: #include <stdio.h> 5: 6: int main() 7: { 8: int a[2][3]={{11,12,13},{21,22,23}}; 9: int i,j; 10: 11: i=j=0; 12: while(i<2){ 13: while(j<3){ 14: printf("aの%1d行%1d列の要素a_{%1d,%1d}=%2d\n",i+1,j+1,i+1,j+1,a[i][j]); 15: j++; 16: } 17: j=0;i++; 18: } 19: return 0; 20: }
1: /* ex0211.c ベクトルの内積 */ 2: /* 作成日 2004/06/02 */ 3: /* 作成者 XXXXXX */ 4: #include <stdio.h> 5: #include <math.h> 6: #define NDIM 2 7: 8: int main() 9: { 10: double alpha,la,lb,ab,a[NDIM],b[NDIM]; 11: int i=0; 12: 13: while(i<NDIM){ 14: printf("ベクトルaの第%d成分を入力してください-->",i+1); 15: scanf("%lf",&a[i]); 16: printf("ベクトルbの第%d成分を入力してください-->",i+1); 17: scanf("%lf",&b[i]); 18: i++; 19: } 20: 21: la=lb=ab=0.0; 22: i=0; 23: while(i<NDIM){ 24: la+=a[i]*a[i]; 25: lb+=b[i]*b[i]; 26: ab+=a[i]*b[i]; 27: i++; 28: } 29: alpha=acos(ab/sqrt(la*lb)); 30: printf("aとbの成す角は%10.3f度です\n",alpha/M_PI*180); 31: return 0; 32: }
1: /* ex0301.c1からnまでの和を求めるプログラム*/ 2: /* 作成者 xxxxxxxx */ 3: /* 作成日 2004/06/16 */ 4: #include <stdio.h> 5: 6: int main() 7: { 8: int s,n,i; /* i,s,n を整数型として宣言 */ 9: 10: i=0; /* iの初期化 */ 11: s=0; /* sの初期化 */ 12: 13: printf("Input n -->"); 14: scanf("%d",&n); /* nの入力 */ 15: 16: while(i<=n){ /* i が n より小さかったら */ 17: s+=i; /* sにiを加える */ 18: i++; /* iを1増やす */ 19: } 20: printf("%5d %5d\n",n,s); /* 結果の出力 */ 21: return 0; 22: }
1: /* ex0400.c 星の三角形 for文の例 */ 2: /* 作成者 xxxxxxxx */ 3: /* 作成日 2004/06/16 */ 4: #include <stdio.h> 5: int main(){ 6: int i,j; 7: 8: for(i=0;i<10;i++){ 9: for(j=0;j<=i;j++) printf("*"); 10: printf("\n"); 11: } 12: 13: for(i=9;i>=0;i--){ 14: for(j=0;j<=i;j++) printf("*"); 15: printf("\n"); 16: } 17: return 0; 18: }
1: /* ex0401.c 角度を「度」から「ラジアン」に変換するプログラム */ 2: /* 作成者 xxxxxx */ 3: /* 作成日 2004/06/23 */ 4: #include <stdio.h> 5: 6: int main() 7: { 8: int degree; 9: float radian; 10: float PI=3.141592654; 11: 12: for(degree=0;degree<=180;degree+=10){ 13: radian = degree*PI/180; 14: printf("%4d %8.3f\n",degree,radian); 15: } 16: return 0; 17: }
1: /* ex0404.c 角度を「度」から「ラジアン」に変換するプログラム */ 2: /* 作成者 xxxxxx */ 3: /* 作成日 2004/06/23 */ 4: #include <stdio.h> 5: 6: int main() 7: { 8: int degree=0; 9: float radian; 10: float PI=3.141592654; 11: 12: do{ 13: radian = degree*PI/180; 14: printf("%4d %8.3f\n",degree,radian); 15: degree+=10; 16: }while(degree<=180); 17: return 0; 18: }
1: /* ex0407.c if文を使ったプログラム */ 2: /* 作成者 xxxxxx */ 3: /* 作成日 2004/06/23 */ 4: #include <stdio.h> 5: 6: int main() 7: { 8: int a,b; 9: 10: printf("aとbを入力してください-->"); 11: scanf("%d %d",&a,&b); 12: 13: if(a>b){ 14: printf("a(%d)はb(%d)より大きい\n",a,b); 15: } else { 16: printf("a(%d)はb(%d)より大きくない\n",a,b); 17: } 18: return 0; 19: }
1: /* ex0409.c 複数の分岐を持つプログラム */ 2: /* 作成者 xxxxxxx */ 3: /* 作成日 2004/06/23 */ 4: #include <stdio.h> 5: 6: int main() 7: { 8: double a; 9: 10: printf("実数 a を入力してください-->"); 11: scanf("%lf",&a); 12: if(a>=1000.0){ 13: printf("aは1000以上(a=%10.3f)\n",a); 14: }else if(a>=500.0){ 15: printf("aは500以上1000未満(a=%10.3f)\n",a); 16: }else if(a>=100.0){ 17: printf("a は 100以上500未満(a=%10.3f)\n",a); 18: }else if(a>=50){ 19: printf("a は 50以上100未満(a=%10.3f)\n",a); 20: }else if(a>=10){ 21: printf("a は 10以上50未満(a=%10.3f)\n",a); 22: }else if(a>=0){ 23: printf("a は 0以上10未満(a=%10.3f)\n",a); 24: }else{ 25: printf("a は 負(a=%10.3f)\n",a); 26: } 27: return 0; 28: }
1: /* ex0410.c もう1つのif文 */ 2: /* 作成者 xxxxx */ 3: /* 作成日 2004/06/23 */ 4: #include <stdio.h> 5: 6: int main() 7: { 8: int a,b,n,m; 9: 10: n=m=0; 11: printf("整数aを0から10の範囲で入力してください-->"); 12: scanf("%d",&a); 13: while(a<0||a>10){ /* 「a<0またはa>10」のとき */ 14: ++n; 15: if(n>3) { 16: printf("しつこい奴だ!\n aは 7とするぞ!\n"); 17: a=7; 18: }else{ 19: printf("もう一度,整数aを0から10の範囲で入力してください-->"); 20: scanf("%d",&a); 21: } 22: } 23: 24: printf("整数bを0から10の範囲で入力してください-->"); 25: scanf("%d",&b); 26: while(b<0||b>10){ /* 「b<0またはb>10」のとき */ 27: ++m; 28: if(m>3){ 29: printf("しつこい奴だ!\n bは6とするぞ!\n"); 30: b=6; 31: }else{ 32: printf("もう一度,整数bを0から10の範囲で入力してください-->"); 33: scanf("%d",&b); 34: } 35: } 36: printf("aは%2d, bは%2dです。\n",a,b); 37: 38: if(a-b) printf("38行目: (真) aとbは等しくない。 a-b=%2d\n",a-b); 39: else printf("39行目: (偽) aとbは等しい。 a-b=%2d\n",a-b); 40: 41: if(!(a-b)) printf("41行目:!(真) aとbは等しい (a-b)=%2d\n",a-b); 42: else printf("42行目:!(偽) aとbは等しくない。 a-b=%2d\n",a-b); 43: 44: return 0; 45: }
tmp.dat | ||||
1 | 浅井清和 | 56 | 45 | 2.3 |
2 | 井上ひかる | 45 | 66 | 2.5 |
3 | 宇野泰三 | 91 | 21 | 4.1 |
4 | 遠藤芳美 | 54 | 25 | 5.4 |
5 | 岡村文雄 | 87 | 41 | 7.3 |
1: /* ex0501.c データを読み込ませるプログラム */ 2: /* 作成者 xxxxxx */ 3: /* 作成日 2004/07/07 */ 4: #include <stdio.h> 5: #include <stdlib.h> 6: #define N 5 7: 8: int main() 9: { 10: FILE *fp; 11: char name[N][20]; 12: int i; 13: int num[N],kokugo[N],sansuu[N]; 14: double hyouka[N]; 15: 16: fp=fopen("tmp.dat","r"); 17: if(fp==NULL){ 18: printf("ファイルがありませんでした"); 19: exit(1); 20: } 21: for(i=0;i<N;i++) 22: fscanf(fp,"%d %s %d %d %lf", 23: &num[i],name[i],&kokugo[i],&sansuu[i],&hyouka[i]); 24: fclose(fp); 25: 26: for(i=0;i<N;i++) 27: printf("%2d %s %4d %4d %5.2f\n", 28: num[i],name[i],kokugo[i],sansuu[i],hyouka[i]); 29: return 0; 30: } 31:
1: /* ex0502.c データを読み込ませ, 2: 計算結果をファイルに書き込ませるプログラム */ 3: /* 作成者 xxxxxx */ 4: /* 作成日 2004/07/07 */ 5: #include <stdio.h> 6: #include <stdlib.h> 7: #define N 5 8: 9: int main() 10: { 11: FILE *fin,*fout; 12: char name[N][20]; 13: int i; 14: int num[N],kokugo[N],sansuu[N],total; 15: double hyouka[N]; 16: 17: fin=fopen("tmp.dat","r"); 18: if(fin==NULL){ 19: printf("ファイルがありませんでした"); 20: exit(1); 21: } 22: for(i=0;i<N;i++) 23: fscanf(fin,"%d %s %d %d %lf", 24: &num[i],name[i],&kokugo[i],&sansuu[i],&hyouka[i]); 25: fclose(fin); 26: 27: fout=fopen("kekka.dat","a"); 28: for(i=0;i<N;i++) { 29: total=kokugo[i]+sansuu[i]; 30: printf("%2d %s %4d\n",num[i],name[i],total); 31: fprintf(fout,"%2d %s %4d\n",num[i],name[i],total); 32: } 33: fclose(fout); 34: return 0; 35: } 36:
planet.dat | ||
惑星 | 公転周期 | 軌道半径 |
水星 | 0.24085 | 0.37100 |
金星 | 0.61521 | 0.72400 |
地球 | 1.00004 | 1.00000 |
火星 | 1.88089 | 1.50800 |
木星 | 11.86223 | 5.19300 |
土星 | 29.45772 | 9.51600 |
天王星 | 84.01300 | 19.14000 |
海王星 | 164.79000 | 30.08000 |
冥王星 | 248.40000 | 36.78000 |
1: /* ex0601.c 関数を使ったプログラム */ 2: /* 作成者 xxxxx */ 3: /* 作成日 2004/07/14 */ 4: #include <stdio.h> 5: double MaX(double a,double b); /* 関数のプロトタイプの宣言を定義する */ 6: int main() /* main関数 */ 7: { 8: double aa,bb,cc; 9: 10: printf("数値を入力してください a-->"); 11: scanf("%lf",&aa); 12: printf("もう1つ数値を代入してください b-->"); 13: scanf("%lf",&bb); 14: 15: cc=MaX(aa,bb); /* 関数 MaXをaa,bbを使って呼び出している。ccに結果が戻される */ 16: printf("%fと%fでは%fのほうが大きい\n",aa,bb,cc); 17: return 0; 18: } 19: double MaX(double a,double b) 20: { 21: double c; 22: 23: if(a>=b) c=a; 24: else c=b; 25: return c; 26: }
1: /* ex0603.c void関数の例 */ 2: /* 作成者 xxxx */ 3: /* 作成日 2004/07/14 */ 4: #include <stdio.h> 5: void star(int n); 6: 7: int main() 8: { 9: int i,j; 10: for(i=0;i<10;i++) star(i); 11: 12: for(i=9;i>=0;i--) star(i); 13: return 0; 14: } 15: 16: void star(int n) 17: { 18: int i; 19: for(i=0;i<n;i++)printf("*"); 20: printf("\n"); 21: }
1: /* ex0604.c 数値の配列を関数に渡すプログラム N次元の内積 */ 2: /* 作成者 xxxxxx */ 3: /* 作成日 2004/07/14 */ 4: #include <stdio.h> 5: double ScalarProduct(double a[],double b[], int n); 6: 7: int main() 8: { 9: double a[10],b[10],sprd; 10: int N,i; 11: 12: printf("ベクトルの次元はいくつ?-->"); 13: scanf("%d",&N); 14: 15: for(i=0;i<N;i++){ 16: printf("ベクトルaの%2d番目の成分の値を入力してください。-->",i+1); 17: scanf("%lf",&a[i]); 18: } 19: 20: for(i=0;i<N;i++){ 21: printf("ベクトルbの%2d番目の成分の値を入力してください。-->",i+1); 22: scanf("%lf",&b[i]); 23: } 24: 25: sprd=ScalarProduct(a,b,N); /* aとbの内積 */ 26: printf("aとbの内積は%5.2fです。\n",sprd); 27: 28: return 0; 29: } 30: 31: double ScalarProduct(double x[],double y[], int n) /* 内積の定義 */ 32: { /* nでデータが入っている配列の数を指定する。*/ 33: int i; 34: double sp=0.0; 35: 36: for(i=0;i<n;i++) sp+=x[i]*y[i]; 37: return sp; 38: }
1: /* ex0605.c 複数のデータを返す関数の例 */ 2: /* 作成者 xxxxxx */ 3: /* 作成日 2004/07/14 */ 4: #include <stdio.h> 5: void MaXMiN(int a,int b,int *m, int *n); 6: /* void型関数としてプロトタイプ宣言*/ 7: 8: int main() 9: { 10: int a,b,mx,mn; 11: 12: printf("2つ整数を入力してください。"); 13: scanf("%d %d",&a,&b); 14: MaXMiN(a,b,&mx,&mn); /* 関数の呼び出し */ 15: printf("大きいのは %dで,小さいのは %dです。\n",mx,mn); 16: return 0; 17: } 18: 19: void MaXMiN(int a,int b,int *m, int *n) /* 関数の定義 */ 20: { /* m,n はポインタと呼ばれるアドレスを値とする変数 */ 21: if(a>=b){ 22: *m=a; /* "*m"はmで指定されたアドレスの値。*/ 23: *n=b; /* aの値をmで指定したアドレスに記憶させる。*/ 24: }else{ 25: *m=b; 26: *n=a; /* "*n"はnで指定されたアドレスの値。 */ 27: } /* bの値をnで指定したアドレスに記憶させる。*/ 28: }
1: /* trape.c 台形公式を使った数値積分 */ 2: /* 作成者 xxxxxx */ 3: /* 作成日 2004/07/14 */ 4: #include <stdio.h> 5: #include <math.h> 6: 7: double func(double x); 8: double Sekibun(double a,double b,double h); 9: 10: int main() 11: { 12: double h,a,b,S; 13: char fname[40]; 14: FILE *fout; 15: int i=0,N=1; 16: 17: printf("ファイル名を入力してください-->"); 18: scanf("%s",fname); 19: fout=fopen(fname,"w"); 20: 21: a=0.0; 22: b=1.0; 23: 24: 25: h=b-a; 26: while(i<20){ 27: i++; 28: h*=0.5; 29: N*=2; 30: S=Sekibun(a,b,h); 31: printf("%2d %7d %10.5e %20.16f %15.10e\n",i,N,h,S,1.-S/M_PI); 32: fprintf(fout,"%2d %7d %10.5e %20.16f %15.10e\n",i,N,h,S,1.-S/M_PI); 33: } 34: fclose(fout); 35: return 0; 36: } 37: 38: double Sekibun(double a,double b,double h) 39: { 40: double x,sum; 41: 42: x=a; 43: sum=0.5*(func(a)+func(b)); 44: while((x+=h)<b) sum+=func(x); 45: sum*=h; 46: return sum; 47: } 48: 49: double func(double x) 50: { 51: return 4.0/(1.0+x*x); 52: }
自分のパソコンにCコンパイラを導入するには, Borland社のCコンパイラ(bcc32)がFreeソフトとして 以下のURLで公開されているので,これを使うとよいでしょう。