Ex11Ans

From Prog0

Jump to: navigation, search

演習第11回

Contents

解答例

A問題

A-1 関数の基礎

ファイル名: ex11a1.txt

  • 関数を使用することによる利点とは?
    • プログラムが理解しやすくなる。
    • 同じ部品を繰り返して使える。
    • 異なるプログラムにも、部品の再利用が可能。
    • 修正や改良がしやすい。
  • 実引数と仮引数の違いは何か?
    • 実引数は関数を呼び出す側で使われる関数に渡す変数であり、仮引数は関数内で用いられる呼び出し側の変数に対応する変数である。
  • ローカル変数とは何か?
    • ローカル変数とは通常使用している変数で、関数の呼び出しにより生成され、関数の実行終了とともに消滅する。
    • 複数の関数内で同じ変数名を使用していても、それぞれ通用範囲が異なる変数になるため、変数名の重複使用による誤動作を防ぐことができ、変数管理が楽になる。

A-2 関数の呼び出し

ファイル名: ex11a2.c

#include <stdio.h>
void print_function1(void);
void print_function2(int);
void print_function3(void);
void print_function4(void);

int main()
{
  print_function1();
  print_function2(2000);
  print_function3();

  return 0;
}

void print_function1(void)
{
  printf("Hey guys!\n");
}

void print_function2(int num)
{
  printf("I just hit %d followers on Twitter!\n", num);
}

void print_function3(void)
{
  printf("Thank you so much!\n");
  print_function4();
}

void print_function4(void)
{
  printf("See you!\n");
}

A-3 関数の使い方

#include <stdio.h>

int square(int);
double recipro(int); 

int main() {
  int m, n;
  double res; 
  printf("nの値を入力してください:");
  scanf("%d", &n);
  m = square(n);
  res = recipro(m);

  printf("n:%d  2乗値:%d  逆数:%f\n", n, m, res);
  return 0;
}

int square(int x) {
  return x*x;
}

double recipro(int x) {
  return 1/(double)x;
}


A-4 円錐の体積の計算

ファイル名: ex11a4.c

#include <stdio.h>
#define PI 3.14

double nijou(double);
double circle(double);
double cylinder(double, double);
double cone(double, double);
 
int main()
{
  double r, h, cv;
  printf("円錐の底面の円の半径と高さをcmで入力してください\n");
  printf("半径 高さ:");
  scanf("%lf%lf",&r, &h);
 
  cv=cone(r,h);

  printf("円錐の体積は %f cm3\n",cv);
  return 0;
}

double nijou(double r)
{
  double r2;
  r2 = r*r;
  return r2;
}

double circle(double r)
{
  double area;
  area=PI*nijou(r);
  return area;
}

double cylinder(double r, double h)
{
  double volume;	
  volume = circle(r)*h;
  return volume;
}
 
double cone(double r, double h)
{
  double volume2;
  volume2 = cylinder(r,h)/3;
  return volume2; 
}

B問題

B-1 温度変換

ファイル名: ex11b1.c

#include <stdio.h>
 
double c2f(double);
 
int main() {
  int c;
  double f;

  printf("摂氏(°C)\t華氏(°F)\n");
  for (c = 0; c <= 150; c += 5) {
    f = c2f((double)c);
    printf("%3d \t%6.2f\n", c, f);
  }

  return 0;
}
 
double c2f(double c) {
   return 9*c/5+32;
}

B-2 時間差

ファイル名: ex11b2.c

#include <stdio.h>
int sectime(int, int, int);

int main() {
  int h1, m1, s1, h2, m2, s2;
  int sec1, sec2, secd;
  int hrd, mnd, scd;
  
  printf("時刻1の時、分、秒を整数で入力してください: ");
  scanf( "%d%d%d", &h1, &m1, &s1 );

  printf("時刻2の時、分、秒を整数で入力してください: ");
  scanf( "%d%d%d", &h2, &m2, &s2 );

  sec1 = sectime( h1, m1, s1 );
  sec2 = sectime( h2, m2, s2 );
  secd = sec2 - sec1;
  hrd = secd/3600;
  mnd = secd%3600/60;
  scd = secd%60;

  printf("\n");
  printf("時刻1は0:00:00から数えて %d 秒\n", sec1);
  printf("時刻2は0:00:00から数えて %d 秒\n", sec2);
  
  printf("\n"); 
  printf("時刻1から時刻2までの経過時間は %d時間 %d分 %d秒です。\n", hrd, mnd, scd);

  return 0;
}

int sectime(int hr, int mn, int sc) { 
  return 3600*hr + 60*mn + sc;
}

B-3 自然対数の底

#include <stdio.h>
#define ORDER 10
int kaijo(int);

int main() {
  int i;
  double e = 1.0;

  for (i = 1; i < ORDER; i++) {
    e += 1.0/(double)kaijo(i);
  }
  printf("e = %f\n", e);
  return 0;
}


int kaijo(int n) {
  int i, prod = 1;

  for(i=1; i<=n; i++){
      prod *= i;
  }
  return prod;
}

Extra問題

E-1 時差の計算

ファイル名: ex11e1.c

/* 日本時間からアメリカの時間を計算するプログラム */

#include <stdio.h>
#define PST 1  /* 太平洋標準時 */
#define MST 2  /* 山岳標準時 */
#define CST 3  /* 中央標準時 */
#define EST 4  /* 東部標準時 */
#define PSTDIFF 17  /* 太平洋標準時の時間差 */
#define MSTDIFF 16  /* 山岳標準時の時間差 */  
#define CSTDIFF 15  /* 中央標準時の時間差 */
#define ESTDIFF 14  /* 東部標準時の時間差 */

#define JAN 1
#define FEB 2
#define MAR 3
#define APR 4
#define MAY 5
#define JUN 6
#define JUL 7
#define AUG 8
#define SEP 9
#define OCT 10
#define NOV 11
#define DEC 12

int CalcHour( int, int );
int CalcDay( int, int );
int CalcMonth( int, int );
int ChangeDay( int, int );

int main() {
 int jmonth, jday, jhour, min;
 int usmonth, usday, ushour;
 int tz; /* 標準時の番号 */

 printf( "現在日本時間を月・日・時・分で入力してください: " );
 scanf( "%d %d %d %d", &jmonth, &jday, &jhour, &min );

 printf( "計算したい米国の時間帯を入力してください\n" );
 printf( "1: 太平洋標準時, 2: 山岳標準時, 3: 中央標準時, 4: 東部標準時: " );
 scanf( "%d", &tz );
 
 /* 米国時間の計算 */
 ushour = CalcHour( tz, jhour );
 usday = CalcDay( ushour, jday );
 usmonth = CalcMonth( usday, jmonth );

 if( ushour < 0 ) {
   ushour += 24;
   }
 
 if( usmonth != jmonth ) {
  usday = ChangeDay( jmonth, usday );
  }

 printf( "日本時間: %2d月%2d日 %2d時%2d分 \n", jmonth, jday, jhour, min );
 if (tz == PST){
	printf("太平洋標準時:%2d月 %2d日 %2d時 %2d分\n",usmonth, usday, ushour,min);
 }else if(tz == MST){
	printf("山岳標準時:%2d月 %2d日 %2d時 %2d分\n",usmonth, usday, ushour,min);
 }else if(tz == CST){
	printf("中央標準時:%2d月 %2d日 %2d時 %2d分\n",usmonth, usday, ushour,min);
 }else if(tz == EST){
	printf("東部標準時:%2d月 %2d日 %2d時 %2d分\n",usmonth, usday, ushour,min);
 } 
 
 return 0;
 }

int CalcHour( int tz, int jhour ) {
 int ushour;

 if( tz == PST ) {
   ushour = jhour - PSTDIFF;
   }
 else if( tz == MST ) {
   ushour = jhour - MSTDIFF;
   }
 else if( tz == CST ) {
   ushour = jhour - CSTDIFF;
   }
 else if( tz == EST ) {
   ushour = jhour - ESTDIFF;
   }

 return ushour;
 }

int CalcDay( int ushour, int jday ) {

 if( ushour < 0 ) {
   return jday - 1;
   }
 else {
   return jday;
   }
 }
 
int CalcMonth( int usday, int jmonth ) {

 if( jmonth == JAN && usday == 0 ) {
   return 12;
   }
 else if( jmonth == FEB && usday == 0 ) {
   return jmonth - 1;
   }
 else if( jmonth == MAR && usday == 0 ) {
   return jmonth - 1;
   }
 else if( jmonth == APR && usday == 0 ) {
   return jmonth - 1;
   }
 else if( jmonth == MAY && usday == 0 ) {
   return jmonth - 1;
   }
 else if( jmonth == JUN && usday == 0 ) {
   return jmonth - 1;
   }
 else if( jmonth == JUL && usday == 0 ) {
   return jmonth - 1;
   }
 else if( jmonth == AUG && usday == 0 ) {
   return jmonth - 1;
   }
 else if( jmonth == SEP && usday == 0 ) {
   return jmonth - 1;
   }
 else if( jmonth == OCT && usday == 0 ) {
   return jmonth - 1;
   }
 else if( jmonth == NOV && usday == 0 ) {
   return jmonth - 1;
   }
 else if( jmonth == DEC && usday == 0 ) {
   return jmonth -1;
   }
 else {
   return jmonth;
   }
 }

int ChangeDay( int jmonth, int usday ) {
  
 if( jmonth == JAN && usday == 0 ) {
   return 31;
   }
 else if( jmonth == FEB && usday == 0 ) {
   return 31;
   }
 else if( jmonth == MAR && usday == 0 ) {
   return 28;
   }
 else if( jmonth == APR && usday == 0 ) {
   return 31;
   }
 else if( jmonth == MAY && usday == 0 ) {
   return 30;
   }
 else if( jmonth == JUN && usday == 0 ) {
   return 31;
   }
 else if( jmonth == JUL && usday == 0 ) {
   return 30;
   }
 else if( jmonth == AUG && usday == 0 ) {
   return 31;
   }
 else if( jmonth == SEP && usday == 0 ) {
   return 31;
   }
 else if( jmonth == OCT && usday == 0 ) {
   return 30;
   }
 else if( jmonth == NOV && usday == 0 ) {
   return 31;
   }
 else if( jmonth == DEC && usday == 0 ) {
   return 30;
   }
 else {
   return usday;
   }
 }
Personal tools