Programming Place Plus トップページ – C言語編 – 第27章
問題① 次のプログラムを、できるだけ短く書き直してください。
#include <stdio.h>
int main(void)
{
int num1 = 10;
int num2 = 20;
int num3 = 30;
( "%d %d %d\n", num1, num2, num3 );
printf
= num3;
num1 = num3;
num2
( "%d %d %d\n", num1, num2, num3 );
printf}
たとえば次のような感じになります。
#include <stdio.h>
int main(void)
{
int num1 = 10, num2 = 20, num3 = 30;
( "%d %d %d\n", num1, num2, num3 );
printf
= num2 = num3;
num1
( "%d %d %d\n", num1, num2, num3 );
printf}
実行結果:
10 20 30
30 30 30
同じ型の変数はまとめて宣言できますし、同時にそれぞれに初期値を与えることも可能です。また、同じ値を複数の変数に代入する際には、=演算子を繰り返し使用できます。
問題② 次のプログラムを、条件演算子を使って書き直してください。
#include <stdio.h>
int main(void)
{
int num = 90;
if( num < 100 ){
( "100未満\n" );
printf}
else{
( "100以上\n" );
printf}
}
条件演算子(?:) を使えば、printf関数の実引数のところで、直接条件分岐できます。
#include <stdio.h>
int main(void)
{
int num = 90;
( "100%s\n", (num < 100) ? ("未満") : ("以上") );
printf}
実行結果:
100未満
問題③ 10文字の文字列 “abcdefghij” があり、先頭と末尾の両方から
1文字ずつを取り出して出力するプログラムを書いてください。
ただし、カンマ演算子をうまく使ってください。
例として、“abcde”
と入力された場合、次のように出力されるようにしてください。
a e
b d
c c
d b e a
#include <stdio.h>
int main(void)
{
char str[] = "abcdefghij";
// 先頭と末尾の両方から 1文字ずつ出力する
for( int i = 0, j = sizeof(str)-2; j >= 0; ++i, --j ){
( "%c %c\n", str[i], str[j] );
printf}
}
実行結果:
a j
b i
c h
d g
e f
f e
g d
h c
i b
j a
末尾の添字が分かりづらいですが、sizeof(str)-2 で求めています。10文字だと分かっているので、そういう記号定数を作ってもいいのですが、どちらかというと、
char str[] = "abcdefghij";
のように初期化して、コンパイラに文字数を数えさせる(=配列の要素数を決定させる)方が柔軟で、安全です。
この場合、全体の大きさを sizeof(str) で求められますが、これには末尾の
‘\0’ の分まで含まれています。 また、添字は 0 から始まるので、sizeof
で取得できる値では 1 大きいことになります。
末尾の ‘\0’ と、0開始というルールから、末尾の添字は sizeof(str) - 2
となる訳です。
return 0;
を削除(C言語編全体でのコードの統一)’2018/3/2 全面的に文章を見直し、修正を行った。
章のタイトルを「簡略記法」から「いろいろな式」に変更。
’2010/9/3 問題④の表示例が、問題の解答そのものになってしまっていたのを修正。
’2009/9/2 新規作成。
Programming Place Plus のトップページへ