20140606更新

練習問題1

まずは基本的な形から


[next|prev|index]

1. 標準入出力の利用

以下の仕様を満たすプログラムを作ってみよう。仕様に無いことは行わない。

printf関数の使い方

エスケープシークエンス、書式指定子、

練習問題 1 

仕様:
以下の4行の文字列を標準出力へ書き出す。

0123456789
abcdefghij
klmnopqrst
uvwxyz

解答例

練習問題 2

仕様:
10進数の値123456789を16進数の文字列表現にして標準出力へ書き出す。

解答例

練習問題 3

仕様:
1/(k*(k+1))のkが1から5までの合計を実数で計算する。その値を「1から5までの合計は」の文字列の後に小数点以下8桁までの文字列として続けて書き出す。

解答例 

scanf関数の使い方

書式指定子、アドレス演算子& 

練習問題 1

スペースで区切られた整数値3個を表す文字列を標準入力から渡すと、その合計を標準出力に書き出す。

例えば「123 456 789」の様な入力文字列の場合、出力は「1368」

解答例

練習問題 2

「長方形の幅と高さを教えてください」と入力要求のメッセージを書き出し、幅と高さを標準入力から読み込んで面積の値を書き出す。計算はdouble型で行うこと。

例えば読み込む文字列が「1.23 4.56」の場合、出力は「5.608800」

注意:入力要求のメッセージ書き出しではフラッシュを忘れないでください

解答例

練習問題 3

スペースや改行で区切られた複数個の整数値を標準入力から受け取る。数値に変換できない文字列の入力を行うと、それまでに入力された値の合計を書き出す。

例えば「123 456 789 12 aa」の様な入力文字列の場合、出力は「1380」

ヒント:scanfの戻り値で数値列の終端を見つけよう。繰り返しの構文を使おう。

解答例

練習問題 4 文字列の読み取り

スペースで区切られた2個の文字列を標準入力から受け取る。読み込んだ文字列を+記号を挟んで書き出す。ただし、各文字列の最大長は40バイトまでとする。

例えば「水野 和生」の様な入力文字列の場合、出力は「水野+和生」。
全角のスペースでは文字列の区切りにならないので注意

ヒント:scanfの書式指定子は%sだが、バッファーのオーバーランを避ける為に%40sのように最大バイト数を制限しましょう。文字列を格納する文字配列は「\0」を格納する部分を含めて41バイト以上のものを用意しましょう。※スペースを含めて読み込む場合はfgetsなどの他の関数を利用しよう。

解答例

getcharとputchar

1バイトづつ処理するときに便利です。

練習問題 1

標準入力から渡たされた1バイトを読み込んで、バイト値を1つ増やして標準出力に書き出す。

例えば「A」の様な入力文字の場合、ASCIIコードが使われていれば出力は「B」となる

解答例

練習問題 2

標準入力から渡たされたバイト列を読み込んで、各バイト値を1つ増やして標準出力に書き出す。処理の終端は文字「E」の入力。ここで入力文字Eについては処理を行わない

例えば「ABCDEF」の様な入力文字列の場合、ASCIIコードが使われていれば出力は「BCDE」

解答例

練習問題 3

標準入力から渡たされたバイト列を読み込んで、各バイト値を1つ増やして標準出力に書き出す。処理の終端はEOF(end of file)。

例えば「ABCDEF」の様な入力文字列でEOFに到達した場合、ASCIIコードが使われていれば出力は「BCDEFG」

解答例 解答例2

2. 字下げ

以下の字下げされていないプログラムをきちんと字下げしてください。字下げできたら解答例と比較してみましょう。

最初のプログラム

次のプログラムはこのままではコンパイルエラーとなります。正しく動くように改行を入れ、さらに見やすく字下げしてください。

#include<stdio.h>int main(void){printf("hello\n");return 0;}

解答例

分岐に関係した字下げ

練習問題 1 if_else文

このままでも実行できますが、字下げして構造が解り易いプログラムにしてください

#include<stdio.h>
int main(void){int a=1;int b=2;printf("a=%d b=%d\n",a,b);
if(a<b)printf("a<b");else printf("a>=b");return 0;}

解答例 解答例2

練習問題 2 if_else文

少し変えてみました

#include<stdio.h>
int main(void){int a=200;int b=1;printf("a=%d b=%d\n",a,b);
if(a<b){printf("a<b");}else if(a==b){printf("a=b");}else{
printf("a>b");}return 0;}

解答例 解答例2

練習問題 3 switch文

#include<stdio.h>
int main(void){int c='A';switch(c){case '0':case '1':
printf("数字0または1");break;case 'A':case 'B':
printf("文字AまたはB");break;default:printf("その他");
}return 0;}

解答例

繰り返しに関係した字下げ

練習問題 1 for文

繰り返しの回数が明らかな場合に使われることが多い

#include<stdio.h>
int main(void){int i,j;for(i=1;i<10;i++){for(j=1;j<10;j++)
printf("%3d",i*j);printf("\n");}return 0;}

解答例

練習問題 2 while文

繰り返しの回数が不明の場合に使われることが多い

#include<stdio.h>
int main(void){int i,f;double df;i=1;f=1;df=1;
while(f==(int)df){printf("%d!=%d\n",i,f);i++;
f=f*i;df=df*i;}printf("%d!で桁あふれ\n",i);return 0;}

解答例 

練習問題 3 do_while文

同じ計算ですが少し変えてみました

#include<stdio.h>
int main(void){int i,f;double df;i=1;f=1;df=1;
do{printf("%d!=%d\n",i,f);i++;f=f*i;df=df*i;
}while(f==(int)df);printf("%d!で桁あふれ\n",i);
return 0;}

解答例