
プログラミング学習の記録 #009(C)
夜の寒さがだんだんと厳しくなってきた。学生控室で夜遅くまで学習していると、帰る気がなくなってきてしまう。寒夜を自転車で駆け抜けて下宿まで帰ると、下宿もまた寒い。布団に入っても寒い。ただ、こんなに寒い京都の冬も、今年が最後になるかもしれないので、どうにか楽しんでいきたいところである。
前回の復習
-lmオプションについて
以前、#005と#006あたりで、「-lm」を付けずに「#include <math.h>」を使ったコードをコンパイルしても、なぜか数学関数の計算が正常に行われるということについて触れた。#006で友人からの説明を記載したが、その後、どうやらMac OSではデフォルトで「-lm」が適用されるかもしれないという情報をその友人からもらった。難しい話なので、あまり気にしないことにはしたが、今後、興味が出てきたときのために記録しておく。
練習問題 6.1
数列$${\{ x_{i} = i^{2} \} (i=1,2, \cdots )}$$の和を求めるプログラムを作成せよ。$${i=1}$$から$${i=10}$$までの和、$${i=1}$$から$${i=100}$$までの和などを計算してみて、公式により求めたものと比較してみよ。
#include <stdio.h>
#include <math.h>
int main()
{
int y ;
int i, max, count;
printf("I can calculate the sum of i^2 (1<=i<=n).\n");
printf("Input the number of terms n: ");
scanf("%d", &max);
y = 0 ;
for( i=1 ; i <= max ; i = i+1 )
{
y = y + pow(i,2) ;
printf("sum =%6d, i =%3d\n", y,i);
}
printf("By the way, I know a useful formula.\n");
printf("The formula is \"sum = n * (n + 1) * (2 * n + 1 ) / 6\"\n");
printf("I calculated the sum of i^2 by the formula.\n");
y = max * (max + 1) * (2 * max + 1 ) / 6 ;
printf("sum by the formula =%6d \n", y);
printf("HAPPY SMILE (^_^)v\n");
return 0;
}
練習問題 6.3
円周率$${\pi}$$に関連して次のような無限級数がある。
$$
\dfrac{\pi^{2}}{6}
= \sum_{n=1}^{\infty} \dfrac{1}{n^{2}}
= 1 + \dfrac{1}{2^{2}} + \dfrac{1}{3^{2}} + \dfrac{1}{4^{2}} + \cdots
$$
この式の右辺を適当な項数まで計算するプログラムを作成せよ。実際に値を計算し、左辺の値と比較してみよ。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
double x, y;
int i, max, count;
printf("Input the number of terms n(>=10): ");
scanf("%d", &max);
if(max < 10)
{
printf("Error in n.\n");
exit(1);
}
x = 0 ;
y = pow(M_PI , 2) / 6 ;
count = max / 10;
for(i = 1; i <= max; i = i+1 )
{
x = x + 1 / ( pow(i,2) ) ;
if(i == floor(i / count) * count) //Display calculation results about 10 times.
{
printf("sum = %13.10f ( i = %7d)\n", x,i );
}
}
printf("π/6 = %13.10f \n", y);
printf("HAPPY SMILE (^_^)v\n");
return 0;
}
このサイトによると、円周率の数値は、「M_PI」を用いることで扱うことができるらしい。
練習問題 6.4
3個の自然数を入力し、その3個の自然数の最小公倍数を求めるプログラムを作成せよ。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int max, i, n, n2;
printf("Input the numbers of integers you have: "); //How many integers you have?
scanf("%d", &max);
if(max < 2)
{
printf("Error in this number.\n");
exit(1);
}
int num[max] ;
for(i=1; i <= max; i = i+1) //Input integers you have.
{
printf("Input integer %d: ",i);
scanf("%d", &num[i]);
if(num[i] < 2)
{
printf("Error in integer %d.\n",i);
exit(1);
}
}
printf("I will find the LCM of "); //I will check intergers you input.
printf("integers: ( ");
for(i=1; i <= max - 1; i = i+1)
{
printf("%d,",num[i]);
}
printf("%d )\n",num[max]);
n = num[1] ;
for(i=1; i <= max - 1; i = i+1) //I will find the LCM.
{
n2 = n ;
while(n % num[i+1] != 0)
{
n = n + n2 ;
}
}
printf("LCM( ");
for(i=1; i <= max - 1; i = i+1)
{
printf("%d,",num[i]);
}
printf("%d ) ",num[max]);
printf("= %d\n",n);
printf("HAPPY SMILE (^_^)v\n");
return 0;
}
3個の自然数ではなく、任意の個数の自然数を入力して、それらすべての最小公倍数を求めるようなプログラムとした。このサイトを参考にして、配列というものを用いた。配列を用いると便利であった。これまで、コピーアンドペーストをして冗長になっていたが、比較的短く書けるようになった気がする。
今日は、日曜日なので、前回の復習だけで終わることにする。
-----
動け!タイムライン
いいなと思ったら応援しよう!
