スライド 1

高度プログラミング演習
(06)
演習問題
•
2次方程式 a*x*x + b*x + c =0 を解くプロ
グラムを作成せよ。ただし、x が虚数となる
場合は、解がない旨表示するようにせよ。
#include <stdio.h>
#include <math.h>
main()
{
double a,b,c,d;
printf("a * x^2 + b * x + c =0 の方程式を解きます。");
printf("係数 a, b, c をそれぞれ入力して下さい : ");
scanf("%lf %lf %lf",&a,&b,&c);
if(a==0){
if(b==0)
printf("解はありません。\n");
else
printf("x = %f\n",-c/b);
} else {
d = pow(b,2)-4*a*c;
if(d<0)
printf(" x は 虚数 です。\n");
else if(d==0){
printf("x= %8.3f\n",(-b+sqrt(d))/(2*a));
}else{
printf("x= %8.3f, %8.3f\n",(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a));
}
}
}
演習問題
•
入力した文字列に アルファベットの各文字
がそれぞれいくつあるか表示するプログラ
ムを作成せよ。(if文、case文両方使ったも
のをそれぞれ作成すること。)
#include <stdio.h>
void main()
{
char data[128];
int n=0,i=0,j=0;
int cnt[52];
char ii;
while(n<128){
data[n]=getchar();
if(data[n]=='.'){
if(n<127)
n++;
break;
}
n++;
}
for(i=0;i<52;i++)
cnt[i]=0;
for(i=0;i<n;i++){
for(ii='a';ii<='z';ii++){
if (data[i]==ii)
cnt[ii-'a']++;
}
for(ii='A';ii<='Z';ii++){
if (data[i]==ii)
cnt[26+ii-'A']++;
}
}
for(ii='a';ii<='z';ii++)
printf(" %c : %d\n",ii,cnt[ii-'a']);
for(ii='A';ii<='Z';ii++)
printf(" %c : %d\n",ii,cnt[26+ii-'A']);
}
ii
for(i=0;i<n;i++){
for(ii='a';ii<='z';ii++){
if (data[i]==ii)
cnt[ii-'a']++;
}
for(ii='A';ii<='Z';ii++){
if (data[i]==ii)
cnt[26+ii-'A']++;
}
}
cnt
0
‘a’-’a’
cnt
1
‘b’-’a’
cnt
2
‘c’-’a’
cnt
26
26+‘A’-’A’
cnt
27
26+‘B’-’A’
cnt
28
26+‘C’-’A’
#include <stdio.h>
void main()
{
char data[128];
int n=0,i=0,j=0;
int cnt[52];
char ii;
for(i=0;i<n;i++){
if(data[i]>='a'&& data[i]<='z')
cnt[data[i]-'a']++;
while(n<128){
data[n]=getchar();
if(data[n]=='.'){
if(n<127)
n++;
break;
}
n++;
}
for(i=0;i<52;i++)
cnt[i]=0;
if(data[i]>='A'&& data[i]<='Z')
cnt[26+data[i]-'A']++;
}
for(ii='a';ii<='z';ii++)
printf(" %c : %d\n",ii,cnt[ii-'a']);
for(ii='A';ii<='Z';ii++)
printf(" %c : %d\n",ii,cnt[26+ii-'A']);
}
data[i]
for(i=0;i<n;i++){
if(data[i]>='a'&& data[i]<='z')
cnt[data[i]-'a']++;
if(data[i]>='A'&& data[i]<='Z')
cnt[26+data[i]-'A']++;
}
cnt
0
‘a’-’a’
cnt
1
‘b’-’a’
cnt
2
‘c’-’a’
cnt
26
26+‘A’-’A’
cnt
27
26+‘B’-’A’
cnt
28
26+‘C’-’A’
関数
// 二つの行列を表示するプログラム
#include <stdio.h>
void main()
{
int matrxA[2][2],matrixB[2][2];
int i,j;
for(i=0;i<2;i++){
for(i=0;j<2;j++)
printf(“%3d “,matrixA[i][j]);
printf(“\n”);
}
for(i=0;i<2;i++){
for(i=0;j<2;j++)
printf(“%3d “,matrixB[i][j]);
printf(“\n”);
}
}
関数
// 二つの行列を表示するプログラム
#include <stdio.h>
void main()
{
int matrxA[2][2],matrixB[2][2];
int i,j;
for(i=0;i<2;i++){
for(i=0;j<2;j++)
printf(“%3d “,matrixA[i][j]);
printf(“\n”);
}
for(i=0;i<2;i++){
for(i=0;j<2;j++)
printf(“%3d “,matrixB[i][j]);
printf(“\n”);
}
}
ほぼ共通
関数
// 二つの行列を表示するプログラム
#include <stdio.h>
void print_matrix(int matrix[2][2])
{
int i,j;
for(i=0;i<2;i++){
for(i=0;j<2;j++)
printf(“%3d “,matrixA[i][j]);
printf(“\n”);
}
}
void main()
{
int matrxA[2][2],matrixB[2][2];
int i,j;
print_matrix(matrixA);
print_matrix(matrixB):
}
関数
// 二つの行列を表示するプログラム
#include <stdio.h>
void print_matrix(int matrix[2][2])
{
int i,j;
for(i=0;i<2;i++){
for(i=0;j<2;j++)
printf(“%3d “,matrixA[i][j]);
printf(“\n”);
}
}
void main()
{
int matrxA[2][2],matrixB[2][2];
int i,j;
print_matrix(matrixA);
print_matrix(matrixB):
}
関数の基本
戻り値 foo (引数)
{
}
int foo1()
{
int x;
return x;
}
void foo2()
{
int foo3(int x, int y)
{
}
void main()
{
int a;
a=foo1();
foo2();
}
}
例題問題
1. 0から15までの十進数を16進数表記するプ
ログラムを作成せよ。
2. ある十進数を16進表記するプログラムを作
成せよ。
例題
• 0から15までの十進数を16進数表記するプロ
グラムを作成せよ。
#include <stdio.h>
void main()
{
int num;
scanf("%d",&num);
if(0<=num&&num<10)
printf("%d",num);
else if(9<num<16)
printf("%c",'a'+(num-10));
else
printf("X");
printf("\n");
}
例題問題
•
ある十進数を16進表記するプログラムを作
成せよ。
#include <stdio.h>
void d2h(int num)
{
if(0<=num&&num<10)
printf("%d",num);
else if(9<num<16)
printf("%c",'a'+(num-10));
else
printf("X");
}
void main()
{
int num,i,c=0;
int k[32];
scanf("%d",&num);
while(num > 15){
k[c]=num % 16;
num = num/16;
c++;
}
k[c]=num;
for(i=c;i>=0;i--)
d2h(k[i]);
printf("\n");
}
練習問題
1. 4 × 4 の行列の各要素を10進法と16進法
で、それぞれ表示するプログラムを作成せ
よ。ただし、各要素は 65535 以下、0以上
の乱数で決めること。
例題問題
• 一桁の16進数を10進数で表示するプログラ
ムを作成せよ。
• 8桁以下の16進数を10進数で表示するプロ
グラムを作成せよ。
例題問題
• 一桁の16進数を10進数で表示するプログラ
ムを作成せよ。
#include <stdio.h>
if(num == -1)
printf("X\n");
else
printf("%d\n",num);
void main()
{
char h;
int num=0;
}
h=getchar();
if('0'<=h&&h<='9')
num = 0 + (h-'0');
else if('a'<=h&&h<='f')
num = 10 + (h-'a');
else
num = -1;
例題問題
• 8桁以下の16進数を10進数で表示するプロ
グラムを作成せよ。
#include <stdio.h>
#include <math.h>
int h2d(char h)
{
int num=0;
if('0'<=h&&h<='9')
num = 0 + (h-'0');
else if('a'<=h&&h<='f')
num = 10 + (h-'a');
else
num = -1;
return num;
}
void main()
{
char h[8];
int i,n=0,d=0,k;
for(i=0;i<n;i++){
k = h2d(h[i]);
if(k == -1){
printf("Invalid \n");
return;
}
d = d + k * pow(16,n-1-i);
}
while(n<8){
h[n]=getchar();
if(h[n]=='\n')
break;
n++;
}
printf("%d\n",d);
}
練習問題
• 2つの数字を16進法で入力して、その和を16
進法で表示するプログラムを作成せよ。
演習問題
• 月と日を入力して、それが1月1日から何一目
であるか表示するプログラムを作成せよ。(た
だし閏年は考慮しないこととする。)
• 入力された2つの月日を求めるプログラムを
作成せよ。(ただし、閏年は考慮しないことと
する。)