C programming (c) while / for statement

東京魅力PRサークル会員募集中

http://svn.mki.biz/pukiwiki/index.php?u-tokyo

興味があれば、ぜひコメントください。

 

while文構文

条件式を前判定して反復制御を行います。

while (条件式) {
  繰り返す文;
}
  • 継続条件が真である間、文を繰り返し実行。
  • 継続条件式がはじめから偽の場合は一度も実行されない。

例題:

for文構文

定められた回数だけ反復制御を行います。

for (初期化式; 継続条件式; 後始末) {
  文;
}
  • 再初期化式の後に「;」は入れてはいけない。

例題:

#include <stdio.h>

int main(void)
{
  int i;
  for (i = 1;i <= 10;i++) {
    printf("%02d 回目\n",i);
  }
  return 0;
}

 

for文とwhile文の交換性

一般的にfor文は「指定した回数分だけ処理を繰り返す」、while文は「指定した条件を満たすまで処理を繰り返す」と言う意味で、for文とwhile文は似ているようで定義されている意味は違います。

while文は、for文の条件式だけと同じです。
逆に言えば、for文はwhile文を拡張した文だと言えるでしょう。

実は、この2つは、同じような使い方をすることが可能です。
while文をfor文のように使う場合、次のようにします。

初期化式;
while (継続条件式) {
  繰り返す文;
  後始末;
}

for文をwhile文のように使う場合、次のようにします。

for (;継続条件式;) {
  繰り返す文;
}

演習

  1.  演習4-12 (A, Bクラス) p89
    正の整数値を読み込んで、その桁数を表示するプログラムを作成せよ。
  2.  演習4-13 (C,Dクラス)p93
    1からnまでの和を求めるプログラムを作成せよ。nの値はキーボードから読み込むこと。

 

C exercises(b) Recursive call

東京魅力PRサークル会員募集中

http://svn.mki.biz/pukiwiki/index.php?u-tokyo

興味があれば、ぜひコメントください。

階乗の計算

皆さんは「階乗の計算」を覚えていますか? 5の階乗なら「5!」と表記し,

5! = 5 × 4 × 3 × 2 × 1

と計算します。つまり答えは120です。

0 の階乗:1
1 の階乗:1
2 の階乗:2 × 1
3 の階乗:3 × 2 × 1
– – – – – – –
n の階乗: n × (n – 1) × (n – 2) – – – 3 × 2 × 1
– – – – – – –

方法1)掛け算を続けることで階乗を求め

n! = n × (n-1) × (n-2) .. × 1

#include <stdio.h>

long Factorial1(int n) ;
long Factorial2(int n) ;
void main(void);

  /* 階乗を求める(非再帰版) */
long Factorial1(int n)
 {
    long p = 1L;

    if (n < 2)       /* nが0か1なら */
        return (1L); /* 1を返す */
    else if (n > 1) {
        for ( ; n > 0; n--)
            p = p * n;
            return (p);
    }
}	


void main(void)
{
    int n;
    long f;

    printf("整数を入力して下さい\t");
    scanf("%d", &n);

    f = Factorial1(n);
    printf("Factorial1(  ) = %ld\n", f);

}

 

方法2)関数の中から自分自身を呼び出す

再帰呼び出し (recursive call)とは,関数の中から自分自身を呼び出すプログラミングのテクニックです。再帰呼び出しで階乗の計算式を考えてみると,

n! = n × (n-1)!

と定義できることがわかるでしょうか。

#include <stdio.h>

long Factorial1(int n) ;
long Factorial2(int n) ;
void main(void);

  /* 階乗を求める(再帰版) */
long Factorial2(int n)
 {
    if (n < 2)        /* nが0か1なら */
        return (1L);  /* 1を返す */
    else              /* nに自分より1小さい自分を掛ける */
        return (n * Factorial2(n -1));
}

void main(void)
{
    int n;
    long f;

    printf("整数を入力して下さい\t");
    scanf("%d", &n);

    f = Factorial2(n);
    printf("Factorial2(  ) = %ld\n", f);
}

再帰呼び出しを使う上で、大切なポイントが2つあります。

 

 1.終着点があること

呼び出しが無限に繰り返されてはなりません。再帰とは再び帰ってくるということ。そのためには終着点が必要になります。nの階乗はn=1が終着点です。

 

 2.関数を抜けるときは元に戻す

グローバルな変数を用いて状態を把握している場合、関数を抜けるときは関数に入ったときの状態に必ず戻すようにして下さい。そうしないと探索の整合性が失われてしまいます。

 再帰は使うべきか

一般に次のことが言えます。

  • 再帰プログラムは計算機に負荷をかけるプログラムである。
  • 時によっては,膨大な負荷をかけることもある。
  • 簡単に非再帰プログラムとして書けるものは再帰プログラムを使うべきではない。

それでも,再帰プログラムが基本的であると言われるのは何故でしょうか。それは再帰プログラムが大きな力を秘めているからです。つまり

  • 再帰プログラムでは簡単に書けるが,非再帰プログラムはかなり複雑なプログラムになってしまうようなものがある。

ということです。

このような問題が意外とあるのです。再帰プログラム技法を,身につけたら,プログラミングを行う際,次のような視点で考えるのが良いかもしれません。

  • まずは,非再帰プログラムで問題を考えてみる。
  • 難しいと判断した場合,再帰プログラムで考えてみる。

再帰が有効な例

  • ハノイの塔
  • データの木構造, 入れ子構造
  • XML文書
  • ファイルシステム

演習

再帰呼び出しの方法で、整数を二進数で表示するプログラムを作成

/*
実行例

12345678
101111000110000101001110

*/

ヒント

void print_binary(unsigned int n)
{
    if (n >= 2) print_binary(n/2);
    printf("%d", n%2);
}

 

C# exercises (a) Web1 WebBrowser

Visual Studio community 2015 アカウントについて (学内専用)

今週から、4回分けてWebについて学習する

  1. WebBrowser (基本)
  2. WebBrowser (自動操作)
  3. HttpClient
  4. REST & JSON

WebBrowser コントロール

WebBrowser コントロールを利用した、シンプルなアプリケーションの作成手順を紹介します。

Visual Studioを起動し、新しいWindows Formプロジェクトを作成します。

WebBrowserコントロールの配置

ツールボックスから”WebBrowser”コントロールをクリックして選択します。選択後フォームデザイナにドラッグ&ドロップしフォームにWebBrowserコントロールを配置します。

フォームにWebBrowserコントロールを配置した直後の状態です。フォームいっぱいにコントロールが配置されます.

フォーム全体にコントロールが広がる原因は、”Dock”プロパティがデフォルトで”Fill”に設定されるためです。Dockプロパティを”None”に変更します。

Dockプロパティを”None”に変更するとコントロールのリサイズができるようになります。

コード

下記のコードを記述します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WebBrowserControl
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void FormMain_Load(object sender, EventArgs e)
    {
      webBrowser1.Navigate("http://lmspress.net");
    }
  }
}

 

 

解説

WebBrowerコントロールのNavigateメソッドを呼び出すことでページの取得と表示ができます。

実行結果

プロジェクトを実行します。下図のフォームが表示されます。Webサイトのページが読み込まれ表示されました。
webbrowser

ウィンドウをリサイズ対応

Dockプロパティ、またはAnchorプロパティを変更し、ウィンドウのリサイズに伴いWebBrowserコントロールのサイズが変化する設定に変えます。

実行し、ウィンドウをリサイズします。Webページが正しく表示されています。
webbrowser2

機能拡張

下記の機能を追加してください

  1. アドレスバー:URL入力
  2. 戻るボタン:前のページに戻る
  3. リロードボタン:ページ再読み込む

C programming (b) do statement

C言語には、全部で3つのループ文が用意されています。
while文、for文、そして、do(デュウ)~while文です。

do~while文構文

do~while文は、一般に、次のような書き方で使用します。

do {
  繰り返す文;
} while (条件式);

do~while文には、1つ大きな利点があります。それは、繰り返し文が、必ず1回は実行されるという点です。入力チェックの時に威力を発揮します。

  • 継続条件式の後の(;)を忘れないよう注意。

円の面積を計算するプログラム。半径入力値が間違っているならば、再入力させる

int main(void)
{

  int r;
  double s;

  do {
    printf("半径?:");
    scanf("%d",&r);
  } while (r < 0);
  
  s = r * r * 3.14;
  printf("面積は %f です。\n",s);
  
  return 0;
}

 演習

ミニクイズ

http://lmspress.net/ (登録は : 学籍番号 / 学校e-mailアドレス)

詳しくはLMS Pressとは参照してください。

入力チェックプログラム

下記のプログラムの入力チェックを追加して下さい。

入力値が間違って誤った月を入力された場合、再入力を行ってください。

#include <stdio.h>

int main(int argc, char* argv[])
{
    int month;
    printf("何月ですか:");
    scanf("%d", &month);

    switch (month)
    {
        case 3:
        case 4:
        case 5:
            puts("春です。");
            break;
        case 6:
        case 7:
        case 8:
            puts("夏です。");
            break;
        case 9:
        case 10:
        case 11:
            puts("秋です。");
            break;
        case 12:
        case 1:
        case 2:
            puts("冬です。");
            break;
        default:
            puts("そんな月はありませんよ!!");
    }
    return 0;
}

 

C exercises(a) Return Values

ある関数が別の関数を呼び出して、呼び出した関数に制御が戻って来た時に、関数によっては値が返ってくるものがあります。

関数から値を返すには、関数の戻り値の他に、ポインタを使って、関数から呼び出し側の領域を書き換えるも可能です。

値を関数戻り値で返す

関数の定義

戻り値の型 関数名(パラメータリスト) {
  文
  ...
}

関数の戻り値で返す。

この方法では、常に1つの情報しか返すことが出来ません。
2つ以上の情報を返したい時などは不便です。

値を引数の配列に返す

配列の先頭要素のアドレスを引数にして、上位関数側と下位関数側で配列を共有し、見かけ上、複数のデータを返したようにします。

#include <stdio.h>

void waru2(int *p);

int main(void)
{
  int i;
  int dt[] = { 20, 10, 4, 35, 66, 78, -1 };
  
  waru2(dt);		/* 配列の先頭要素のアドレスを渡す */
  
  for(i = 0; dt[i] != -1; i++) {
    printf("%d ", dt[i]);
  }
  printf("\n");
  
  return 0;
}

void waru2(int *p)		/* 配列dt のアドレスをポインタp に入れる */
{
  while(*p != -1) {
    *p = *p / 2;	/* ポインタの中身を 2 で割る */
    ++p;
  }
}

 

値を引数の変数に返す

複数の変数のアドレスを引数にして、上位関数側と下位関数側でデータを共有し、見かけ上、複数のデータを返したようにします。

#include <stdio.h>

void swap(int *x, int *y);

int main(void)
{
  int a = 123, b = 456;
  
  printf("呼出し前a = %d b = %d\n", a, b);
  swap(&a,&b);		/* 変数a と変数b のアドレスを渡す */
  printf("呼出し後a = %d b = %d\n", a, b);
  
  return 0;
}

/* 変数a のアドレスをポインタx に、変数b のアドレスをポインタy に入れる */
void swap(int *x, int *y)
{
  int wk;
  
  wk = *x;
  *x = *y;		/* ポインタを使って中身を入換える。*/
  *y = wk;
}

 

引数のconst型修飾子

ポインタを使って、関数から呼び出し側の領域を書き換えるも可能です。しかし、書き換えて困る場合もある。

関数の引数を const として宣言すると、その関数が引数の値を変更しないことを約束するということを意味する。

関数の引数が const 修飾されている場合、ポインタによって参照される値を変更しようとするとコンパイラが致命的エラーを出す。

void foo(const int *x) {
  if (x != NULL) {
    *x = 3; /* コンパイルエラーを出す */
  }
  /* ... */
}

 

演習

ミニクイズ

http://lmspress.net/ (登録は : 学籍番号 / 学校e-mailアドレス)

関数の作成演習

ABクラス:a-8-4-1-1 (p283) 文字列を大文字に変換する関数を作成してください。

CDクラス:a-8-4-2-2 (p287) 三つの整数の中身を入れ替える関数を作成してください。

 

C# exercises (9) Puzzle Game3

Visual Studio community 2015 アカウントについて (学内専用)

パズルゲームUIの改進

改進点:

ピースを順番でセットするではなく、あらかじめランダムにセットして、マウス移動できるようにする

  1. ピースをあらかじめランダムにセット
    1. initialData の改造
      // 変数関係の初期化処理
      private void initialData()
      {
          flg = new bool[9];
          data = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
          answer = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1 };
          Random r = new Random(Environment.TickCount);
          for (int i = 0; i < 100; i++)
          {
              int a = r.Next(9);
              int b = r.Next(9);
              int n = data[a];
              data[a] = data[b];
              data[b] = n;
          }
          current = 0;
          answer = data; // chen : ランダムデータを直接結果に
          playflg = true;
          clearflg = false;
      }

       

    2. PlayBox_Paint の改造
      // PlayBoxの表示
      private void PlayBox_Paint(object sender, PaintEventArgs e)
      {
          if (img == null) { return; }
          Graphics g = e.Graphics;
          for (int i = 0; i < 9; i++)
          {
              // if (flg[i] == false) { continue; }    // chen : flg 無視
              if (answer[i] == 8) { continue; } // chen : 9個目描画しない
              int x1 = i % 3;
              int y1 = i / 3;
              int x2 = answer[i] % 3;
              int y2 = answer[i] / 3;
              Rectangle r1 = new Rectangle(100 * x1, 100 * y1, 100, 100);
              Rectangle r2 = new Rectangle(100 * x2, 100 * y2, 100, 100);
              g.DrawImage(img, r1, r2, GraphicsUnit.Pixel);
          }
          if (playflg == false)
          {
              if (clearflg)
              {
                  g.DrawString("CLEAR!!",
                      new Font("Impact", 48, FontStyle.Bold),
                      new SolidBrush(Color.Red),
                      new Point(40, 100));
              }
              else
              {
                  g.DrawString("GAMEOVER...",
                      new Font("Impact", 36, FontStyle.Bold),
                      new SolidBrush(Color.Blue),
                      new Point(20, 200));
              }
          }
      }
      
  2. マウス移動できる (隣と交換可能なら交換)
    private void swap_answer(int n, int m)
    {
        int t;
        t = answer[m];
        answer[m] = answer[n];
        answer[n] = t;
    }
    
    // PlayBoxをクリックした時の処理
    private void PlayBox_MouseDown(object sender, MouseEventArgs e)
    {
        if (playflg == false) { return; }
        if (img == null) { return; }
        if (current > 8) { return; }
        int x = e.X / 100;
        int y = e.Y / 100;
        if (x < 0) { return; }
        if (y < 0) { return; }
        if (x >= 3) { return; }
        if (y >= 3) { return; }
    
    
        int n = x + y * 3;
        //flg[n] = true;
        //answer[n] = data[current];
        //current++;
        if ((x > 0) && answer[(x - 1) + y * 3] == 8) swap_answer(n, (x - 1) + y * 3);
        if ((x < 2) && answer[(x + 1) + y * 3] == 8) swap_answer(n, (x + 1) + y * 3);
        if ((y > 0) && answer[x + (y - 1) * 3] == 8) swap_answer(n, x + (y - 1) * 3);
        if ((y < 2) && answer[x + (y + 1) * 3] == 8) swap_answer(n, x + (y + 1) * 3);
    
        // this.checkGameEnd();
        this.Refresh();
    
    }
  3. 勝負判定
    private void PlayBox_MouseDown(object sender, MouseEventArgs e)
    {
        if (playflg == false) { return; }
        if (img == null) { return; }
        if (current > 8) { return; }
        int x = e.X / 100;
        int y = e.Y / 100;
        if (x < 0) { return; }
        if (y < 0) { return; }
        if (x >= 3) { return; }
        if (y >= 3) { return; }
    
    
        int n = x + y * 3;
        //flg[n] = true;
        //answer[n] = data[current];
        //current++;
        if ((x > 0) && answer[(x - 1) + y * 3] == 8) swap_answer(n, (x - 1) + y * 3);
        if ((x < 2) && answer[(x + 1) + y * 3] == 8) swap_answer(n, (x + 1) + y * 3);
        if ((y > 0) && answer[x + (y - 1) * 3] == 8) swap_answer(n, x + (y - 1) * 3);
        if ((y < 2) && answer[x + (y + 1) * 3] == 8) swap_answer(n, x + (y + 1) * 3);
    
        // this.checkGameEnd();
        this.checkClear();  // chen : clear check
        playflg = !clearflg; // chen :  clear なら、 not play
        this.Refresh();
    
    }

     

  4. 経過時間の表示

C programming (a) Switch statement

お知らせ

本日ABCDクラス合同避難訓練、第4時限目、本館141教室にて実施。

Switch文構文

条件式を判定して多方向分岐を行う。

switch (式) {
case 定数:
  ブロック文
default:
  デフォルト・ブロック文
}

Berak文構文

  1. switch文で、case句の処理を打ち切りブロックを脱出するときに用いる。 ⇒ 説明済み
  2. for文、while文などのループから脱出するときに、if文と併用して用いる。
break;

 

例題

毎月の末日の判断

#include <stdio.h>

int main()
{
  int n;
  
  printf("月を入力して下さい --> ");
  scanf("%d", &n);
  switch(n){
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
      printf("--31日--\n");
      break;
    case 4: 
    case 6: 
    case 9: 
    case 11: 
      printf("--30日--\n");
      break;
    case 2:
     	printf("--28日--\n");
      break;
    default: 
      printf("入力データの誤りです。\n");
    break;
  }
  getch();
  return 0;
}

 

演習

  1. 演習3-12 (A, B クラス)
  2. 演習3-13 (C, D クラス)
  3. 簡易電卓(自由選択)

実行例

加減乗除(+,-,*,/)ができます。指定例:2+5、終了時はq
ready : 6.5 * 3
--> 19.5

ヒント:

  • 演算記号の判定: switch 文
  • 計算式の入力: scanf( “%lf %c %lf”, &a, &op, &b );

(変換指定文字列で、期待していなかったデータを入力すると、 バッファのデータをそのまま残し、動作を終了してしまいます。)

  • アスキーコード表

ptech017

C exercises(9) Basics of Function

関数の基本

C言語において関数を使うことには、以下のような利点があります。

関数化しておくとそれを1つのブラックボックスとして扱うことができます。 つまり、使用する側が知っておくべきことは、以下の通りです。

  • 入力として、どのような引数を与えるか
  • 出力として、関数がどんな値を返すのか
  • 関数を使ったことによって、どんな副作用があるか
  • 一度、関数として作成しておけば、後で何度でも再利用することができる
  • 関数として各機能をまとめていくと、一般にプログラムが見やすく、デバッグの作業もしやすい

関数の呼び出し

#include <stdio.h>

void func();   //関数のプロトタイプ宣言

int main()
{
 func();    //関数呼び出し
 printf(" ここがメイン関数内\n");
 return 0;
}

void func()    //自作関数
{
 printf("ここは自作関数内\n");
 return;    //「return;」は省略可
}

 

関数定義

関数の定義

戻り値の型 関数名(パラメータリスト) {
  文
  ...
}

関数プロトタイプ宣言

戻り値型 関数名(パラメータリスト);

戻り値の型、関数名、引数のルールは関数を作る際とほとんど同じです。但し、プロトタイプ宣言する行の最後には「;」が必要。

Void Type関数

void型は、今までの数値型や文字型とは異なり、戻り値が無い関数のデータ型のことです。処理の結果を戻す必要が無い場合は、わざわざint型にして「return 0;」としなくても、void型で関数を定義すれば、最後にreturn文を書く必要はありません。

 

  1. 値を返さない return型に用いる
  2. 引数が無い場合に用いる

関数へ値を渡す

C言語では、関数へ情報を渡す場合、必ず元の変数の値のコピーを渡します。
この様な方法を値渡しと呼び、元の変数の値が変更されないことが特徴です。

「値渡し」, ex : printf()

#include <stdio.h>
 
void plus1(int x)
{
    x = x + 1;
}
 
int main(int argc, const char * argv[])
{
     
    // insert code here...
    int a;
     
    a = 1;
    plus1(a);
     
    printf("a = %d\n", a);
     
    return 0;
}

 

アドレス

「参照渡し」, ex : scanf()

ポインタ型の引数であっても、値のコピーが渡される原則に違いはありません。

それでもポインタ型を使うのは、ポインタ型はアドレスを受け取ることが出来るからです。

#include <stdio.h>
 
void plus1(int *x)
{
    *x = *x + 1;
}
 
int main(int argc, const char * argv[])
{
     
    // insert code here...
    int a;
     
    a = 1;
    plus1(&a);
     
    printf("a = %d\n", a);
     
    return 0;
}

配列

関数に配列を丸ごと渡すことができません。あたかも配列を丸ごと渡すように書くことができます。

#include <stdio.h>

void func(int [10]);

int main(void){
  
  int figure[10]={1,2,3,4,5,6,7,8,9,10};

  func(figure);

  return 0;

}

void func(int temp[10]){

  for(int i=0;i<10;++i){
    printf("%d\n",temp[i]);
  }
}

void func2(int temp[]){

  for(int i=0;i<10;++i){
    printf("%d\n",temp[i]);
  }
}

void func3(int *temp){

  for(int i=0;i<10;++i){
    printf("%d\n",*(temp+i));
  }
}

func, func2, func3は全く同じ機能する。

配列を丸ごと渡すように書くだが、実質参照渡しなので、下記のおかしな現象が発生する。

  1. 配列の要素数は無視される
  2. 関数内で配列の値を変えると呼び出し側まで変化する

演習

ABクラス

a-8-1-2 (p266)

曜日を求まる関数を作成してください。

CDクラス

a-8-3-2-1 (p276)

平均値を求まる関数を作成してください。

C# exercises (8) Puzzle Game2

先週できたパズルゲームUIの改進

参考

  • http://www18.big.or.jp/~neon2/bunkatu/tips9.shtml

改進点:

ピースを順番でセットするではなく、あらかじめランダムにセットして、マウス移動できるようにする

  1. ピースをあらかじめランダムにセット
    1. initialData の改造
    2. PlayBox_Paint の改造
  2. マウス移動できる
  3. 勝負判定
  4. 経過時間の表示

C programming (9) logical operators

C の推奨されるスタイル

C言語やJava言語は、中括弧 { } を使ってブロックを記述します。 中括弧だけでなく、ブロックの範囲を字下げ(インデント)して記述します。 ただ、中括弧をどの位置に記述するかによって、コーディング・スタイルの宗教論争が起きています。 主に中括弧の位置の違いなのですが、なぜか字下げスタイルと呼ばれています。

// 中括弧の開始を、文末に記述するスタイルを「K&R スタイル」といいます。
void FuncA()
{
  if ( ... ) {
  }
}

// 中括弧の開始を、文のない行に記述するスタイルを「BSD スタイル」といいます。
void FuncA()
{
  if ( ... )
  {
  }
}


// 関数の開始も、文末に記述するスタイルを「Java スタイル」といいます。
void FuncA() {
  if ( ... ) {
  }
}

 

複合文(ブロック)

文の並びを{ }で囲んだものを「複合文」といいます。ブロックとも言います。

複合文は複数の「宣言」と「」を扱うことができます。

関数の定義に使うブロック { } は「複合文」です。

main関数の定義に使われているブロック { }は「複合文」です。

実例: 二つの整数値を読み込んで、値の関係を表示するプログラムを作成

#include <stdio.h>

int main(void)
{
    int no1, no2, max, min;

    printf("二つの整数を入力してください。\n");
    printf("整数1:");    scanf("%d", &no1);
    printf("整数2:");    scanf("%d", &no2);

    if(no1 > no2){
        max = no1;
        min = no2;
        printf("大きい方の値は%dです。\n", max);
        printf("小さい方の値は%dです。\n", min);
    } else if(no2 > no1){
        max = no2;
        min = no1;
        printf("大きい方の値は%dです。\n", max);
        printf("小さい方の値は%dです。\n", min);
    } else 
        printf("その値は同じです。\n");


    return 0;
}

条件演算子(三項演算子)

/* 今日は、三項演算子(?:演算子)について学びます。条件が真なら処理1を、偽なら処理2を行います。

    条件? 処理1:処理2;

これは、

    if ( 条件 )
        処理1;
    else
        処理2;

と同じです。
しかし、三項演算子を使えばコンパクトなコードを書くことができます。

printf("%s", (x % 2)? "奇数" : "偶数");

 

論理演算子

/* 論理演算子には次の3種類があります。

  1. 式1 && 式2  // and
  2. 式1 || 式2           // or
  3. !式                          // not
#include <stdio.h>

void  main(void);

void main(void)
{
        char c = 'c';

        printf("c = '%c'\n", c);

        if (c >= 'a' && c <= 'z')        /* c が英小文字なら真 */
            printf("c は小文字です。\n");
        else
            printf("c は小文字ではありません。\n");

        if (c >= '0' && c <= '9')        /* c が数字なら真 */
            printf("c は数字です。\n");
        else
            printf("c は数字ではありません。\n");

        if (c == '+' || c == '-')        /* c が '+' か '-' なら真 */
            printf("c は符号です。\n");
        else
            printf("c は符号ではありません。\n");
}

 

演習

演習3-10 (教科書P62)

三つの整数値読み込んで、値の関係を表示するプログラムを作成せよ。

表示例:

  • 三つの値は等しいです。
  • 二つの値は等しいです。
  • 三つの値は異なります。

参考