下に示すように,音圧[Pa]を入力させ,それを音圧レベル[dB]の値に変換して出力するプログラムを作成してください。

音圧[Pa]を入力してください。:2(enter)
音圧レベルは100 dBです。


学生からの解答例その1

Excellent!!

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

double ptod(double pa)
{
	return ( 20 * log10(pa / 0.00002));
}

int main(void)
{
	double pa;

	printf("音圧[Pa]を入力してください。:"); scanf("%lf", &pa);

	printf("音圧レベルは%.2f dBです。\n", ptod(pa));

	return(0);
}

学生からの解答例その2

Excellent!!

#include<stdio.h>
#include<math.h>
#define P 0.00002

main(){

  double sp;
  double spl;

  printf("音圧[Pa]を入力して下さい:");
  scanf("%lf", &sp);

  spl = 20 * log10(sp/P);

  printf("音圧レベルは%lf[dB]です。\n", spl);

    return 0;
}

学生からの解答例その3

Excellent!!

/* Pa→dB変換 */

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

double func(double pa){
	double	po;
	double	ans;

	po = 2.0 * pow(10, -5);

	ans = 20.0 * log10(pa / po);

	return(ans);
}

int main(void){
	double	pa;

	printf("音圧[Pa]を入力してください。:");	scanf("%lf", &pa);
	printf("音圧レベルは%.3f[dB]です。\n", func(pa));

	return(0);
}

間違いの例


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

double loga(double x)/* この関数はわざわざ自作する意味はないか(log()を呼んでいるだけなので) */
{
return(log(x));/* log()は自然対数(10ではなくてeを底とする対数)です。注意! */
}

int main()
{
double pa;
printf("音圧[Pa]を入力してください。:");scanf("%lf",&pa);
printf("音圧レベルは%6fdBです。\n",20*loga(pa/0.00002));
return(0);
}


下に示すように,音圧レベル[dB]を入力させ,それを音圧[Pa]の値に変換して出力するプログラムを作成してください。

音圧レベル[dB]を入力してください。:100(enter)
音圧は2 Paです。


学生からの解答例

Excellent!!

#include<stdio.h>
#include<math.h>
#define P 0.00002

main(){

  double sp;
  double spl;

  printf("音圧レベル[dB]を入力して下さい:");
  scanf("%lf", &spl);

  sp = P * pow(10,spl/20);

  printf("音圧は%lf[Pa]です。\n", sp);

    return 0;
}

間違いの例


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

double p(double db)
{
    return (pow(10, db / 20));
}

int main(void)
{
    double db;
    
    printf("音圧レベル[dB]を入力してください。:");  scanf("%lf", &db);
    printf("音圧は%.2fPaです。\n", 0.00002 * p(db));/* 小数点以下2桁までしか表示しないと,約40 dB以下が0.00 Paと表示されてしまいます。注意! */

/* ついでに . . .音響理論演習IIの復習 !
   120 dBは,20 Pa
   100 dBは,2 Pa
   80 dBは,0.2 Pa
   60 dBは,0.02 Pa
   40 dBは,0.002 Pa
*/

    return(0);
}


5回目の授業,今日の宿題その2 において,以下のようなプログラムを作成しました。

「温度 t [℃] を 0 ℃ 〜 40 ℃ まで 2 ℃ 間隔で音速 C [m/s] を計算して画面に表示するプログラムを作成しなさい。」

このときには,音速の計算には高校生のときに習った近似式を使いましたが,皆さんは音響の専門家ですので,それを厳密式によって計算するプログラムに改造してみてください。

プログラムが改造できたら,近似式と厳密式の計算値を,比較してみてごらんなさい。
(調べる温度の範囲を広げてみるとよい。温度がどのくらいになると,近似式が使えなくなるのか?)


教員からの解答例


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

/* macro definition of constants */
#define RRR 8.314 /* 気体定数[J/mol K] */
#define AIR 28.91 /* 空気の分子量 */
#define GANMA 1.41 /* 空気の比熱比 */
#define ATM 101325 /* 1気圧[N/m2] */
#define KEL 273.15 /* 絶対温度 */

int main(void)
{
    int t ;
    double c, T, row, extc ;

    for(t=-100; t<=100; t+=4){

        c = 331.45 + 0.607*t ;           /* 音速の近似式 */

        T = (double)t + KEL ;            /* 絶対温度 */
        row = ATM*AIR / (RRR*T) * 1e-3 ; /* 空気の密度 */
        extc = sqrt( GANMA*ATM / row ) ; /* 音速の厳密式 */

        printf("温度:%3d 度     音速(近似):%7.2f m/s     音速(厳密):%7.2f m/s     誤差:%7.2f m/s\n", t, c, extc, c-extc) ;

    }
    
    return 0;

}

学生からの解答例

音速を計算するマイ関数を作成している例(Excellent!!)

#include<math.h>

#include<stdio.h>

#define m 28.91 /* まず,物理定数をマクロ定義して... */

#define R 8.314

#define ganma 1.41

#define P 1013125

double c(double t) /* 音速の厳密値を計算する関数をここで定義している。 */
{
 double row;

 row =  0.001 * (P * m) / (R * t);

 return( sqrt((ganma * P) / row));
}

int main(void)
{
  short i;
  double C, t;

 for( i = 0; i <= 40; i += 2)
  { 
     t = 0;

     t = 273.15 + i;

     C = 0; /* ここで0を代入する必要なないか(直後にc(t)を代入することになるので) */

     C = c(t);

     printf("温度%d[℃]の音速は%f[m/s]。\n",i, C);
    }
 return(0);
}