C programming (4) puts and scanf

puts関数:表示を行う関数

書式化の必要がなく、改行もしたいの場合

puts(“ABC”);
printf(“ABC\n”);

 

scanf関数:読込みを行う関数

scanf関数は、処理の途中でキーボードから文字の入力を求め、入力されたものを処理に利用するというものです。

実例:

#include <stdio.h>
 
int main(int argc, const char * argv[])
{
     
    // insert code here...
    int input;
     
    printf("数字を入力して下さい。\n");
     
    scanf("%d", &input);
     
    printf("入力された数字は、%dです。\n", input);
    
    getch(); 
    return 0;
}

 

実行例:

数字を入力して下さい。
3
入力された数字は、3です。

  1.  テキストが出力され
  2. キーボードからの入力待ちの状態。入力してエンターキーを押しますと処理が再開
  3. 書式付き出力

scanfの2番目の引数に変数を指定する際は、「&(変数名)」というように「&」をつけてポインタとして扱って下さい。そういうルールだと思っていただいて構いません。

実践レベルの問題を考えれば、実は scanf() 関数が使われることは滅多にありません。理由はエラーチェックが十分にできないからです。十分なエラーチェックを行う必要がある入力は(商用のプログラムは十分なエラーチェックが必要であり、結果として本格的なプログラムには scanf() をあまり使わない)変換作業を行わずに、他の標準入力関数を用いて文字列として入力された情報を受け取り、入力された文字列を調べて適切な値に変換するというような作業を行います。もちろんこれらの作業は複雑になります。

Nim game

Nim game

ニム (nim) は、2人で行うレクリエーション数学ゲームの1つである。ルーツは古代中国からあるとされ、16世紀初めの西欧で基本ルールが完成したが、名前については、一般的に1901年ハーバード大学のチャールズ・L.バウトン (Charles L. Bouton) によって名付けられたとされる。

ゲームルール:

一人1個か2個か3個か4個だけ取れて、交互にやっていって、
最後の1個の石を取った人が負けとなります。

#include <stdio.h>

int main(void)
{
  int i, stone, n=0, turn=0;
  char name[2][256];

  printf("Input players' names\n");

  printf("player 1:");
  gets(name[0]);
  printf("player 2:");
  gets(name[1]);

  printf("\nnumber of stones:");
  scanf("%d", &stone);

  while (stone > 0){
    printf("\nThere are %d stones.\n", stone);
    printf("%s's turn! Take some stones:", name[turn]);
    while (n < 1 || n > 4) scanf("%d", &n); //取る石の数を制限1..4
    stone -= n;
    turn = 1 - turn;
    n = 0;
  }

  printf("\nNow winner is %s!!\n", name[turn]);

  // getch();
  // return 0;
}

課題

勝者の名前、対戦記録をファイルに記録するように改造してください。記録ファイル名は、nim.scrとする。
例:
====================================
Input players’ names
player 1:tom
player 2:mary

Now winner is mary!!
====================================
nim.c、nim.scr と実行画面のコピーを提出してください。

C exercises (3) string and ctype

標準ライブラリ関数 : 文字列操作関数

string.hのヘッダファイルをincludeする

主なもの:

strcpy(ss,st):文字列(文字型の配列)ssに文字列stをコピーする
strlen(st):文字列stの長さを求める
strcat(ss,st):文字列ssの後ろに文字列stを連結する
strncpy(ss,st,n):文字列ssに文字列stの先頭n文字をコピーする
strncat(ss,st,n)文字列ssの後ろに文字列stの先頭n文字を連結する

サンプル:

#include <stdio.h>
#include <string.h>       //string.hのインクルードを忘れずに
 
int main(int argc, const char * argv[])
{
     
    // insert code here...
    char str[40];
    char alpha1[] = "ABCDE";
    char alpha2[] = "VWXYZ";
    int length;
     
    printf("alpha1 : %s\n", alpha1);
    printf("alpha2 : %s\n", alpha2);
     
    strcpy(str, alpha1);
    strcat(str, alpha2);
    printf("str : %s\n", str);
     
    length = (int)strlen(str);
    printf("str's length : %d\n", length);
         
    return 0;
}

実行結果:

alpha1 : ABCDE
alpha2 : VWXYZ
str : ABCDEVWXYZ
str’s length : 10

練習問題:
========
(1)文字列に自分の名前を代入して表示してみよう。
(2)(1)で自分の名前の長さの文字列の長さを表示してみよう。
実行例:
自分の名前を半角英数字で入力してください
[Daiichi Koudai]
私の名前はDaiichi Koudaiです
文字数は14です

ヒント:

  1. printf
  2. gets, scanf

標準ライブラリ関数 : 文字操作関数

ctype.hのヘッダファイルをinclude

主なもの:

isalnum(c):文字cが英数字(A-Z, a-z, 0-9)なら真を返す
isalpha(c):文字cが英文字(A-Z, a-z)なら真を返す
isdigit(c):文字cが数字(0-9)なら真を返す
islower(c):文字cが小文字(a-z)なら真を返す
isupper(c):文字cが大文字(A-Z)なら真を返す
tolower(c):文字cが大文字だった場合に小文字に変換して返す
toupper(c):文字cが小文字だった場合に大文字に変換して返す

サンプル:

#include <stdio.h>
#include <ctype.h>        //ctype.hのインクルードを忘れずに
 
int main(int argc, const char * argv[])
{
     
    // insert code here...
    char lo = 'a';
    char up = 'A';
     
    if(islower(lo)) {
        printf("%c を大文字変換 -> %c\n", lo, toupper(lo));
    }
     
    if(isupper(up)) {
        printf("%c を小文字変換 -> %c\n", up, tolower(up));
    }
     
    return 0;
}

実行結果:

a を大文字変換 -> A
A を小文字変換 -> a

練習問題:
(3)(1)で自分の名前を大文字で表示してみよう。
実行例:
自分の名前を半角英数字で入力してください
Daiichi Koudai
私の名前はDAIICHI KOUDAIです
文字数は14です

ヒント:

  1. http://chenlab.net/2016/04/18/c-exercises-2-stdio/

回答:

#include <stdio.h>
#include <ctype.h>        //ctype.hのインクルードを忘れずに
#include <string.h>       //string.hのインクルードを忘れずに
 
int main(int argc, const char * argv[])
{
     
    // insert code here...

  char name[128];
  int i;
  
  printf("自分の名前を半角英数字で入力してください");
  gets(name);
  
    for (i = 0; name[i] != '\0'; i++) 
    {
        name[i] = toupper(name[i]); 
    }
  
    printf("私の名前は%sです\n", name);
    printf("文字数は%dです\n", (int)strlen(name));
    
  getch();
    return 0;
}

 

C programming (3) Veriables

変数と宣言 代入

int a, b;
a = 19;
b = -20;

変数初期化

int a = 1;
int b = 10;
int c = 4;

image

変数の演算

a = b + c;

image

(練習1)変数と宣言のサンプル

#include <stdio.h>
 
int main(int argc, const char * argv[])
{
     
    // insert code here...
    int a;
    int b;
    int result;
     
    a = 4;
    b = 2;
     
    result = 4 + 2;
    printf("4と2の和は %d\n", result);
     
    result = 4 - 2;
    printf("4と2の差は %d\n", result);
     
    result = 4 * 2;
    printf("4と2の積は %d\n", result);
     
    result = 4 / 2;
    printf("4と2の商は %d\n", result);
     
    result = 4 % 2;
    printf("4と2の余りは%d\n", result);
     
    return 0;
}

(練習2)printf関数:書式化して表示を行う関数

// test4.c 
#include <stdio.h>
int main(void ) 
{ 
 int a,b,c;
 /* これは加算のプログラム コメント
   名前:stdio.h
  C:\borland\bcc55\Include */
   a=3;   b=4;
   c=a+b;
   					
   printf("c= %d\n",c); /* Cの値を書式化して表示 */
   
   getchar( );
   return 0;
}

書式指定文字列:

「””」で囲まれた文字列のことを指します。

変換指定文字列:

  • %d 10進数で出力
  • %s 文字列として出力

拡張表記:

一般的にはエスケープシーケンスと呼ばれています。

エスケープシーケンス 意味
\n 改行
\t タブ
\0 文字列の終了を表す

C exercises (2) stdio

標準ライブラリ関数 : 標準入出力関数

標準入出力関数には(C言語プログラミング)で説明した printf() や scanf() の他にも 下のように 1文字専用の入出力関数と 1行専用の入出力関数が用意されている。

標準入力から文字入力 getchar 関数
標準出力から文字出力 putchar 関数
標準入力から文字列入力 gets 関数
標準出力から文字列出力 puts 関数
標準入力から書式付き入力 scanf 関数
標準出力から書式付き出力 printf 関数

標準入力関数(参考)

getchar() int getchar(void); 標準入力(キーボード)からの入力値を「EOF」まで1文字づつ取得します。エラー時は「EOF」を返します。
gets() char *gets(char *str); 標準入力(キーボード)からの入力値を「EOF」※1まで1行づつ取得して、その文字列の先頭アドレスを引数のchar型ポインタ(*str)に渡すと共に戻り値としても返します。エラー時は「EOF」を返します。
但し現在では読み込む長さを指定できる「fgets()」の使用が推奨されています。
fgets() char *fgets(const char *str, int n, FILE *stream); 「*stream」で示されるストリーム※2から「n-1」文字を取得し「\0」を付加して、その文字列の先頭アドレスを引数のchar型ポインタ(*str)に渡すと共に戻り値としても返します。
scanf() int scanf(char *format,…) ; 標準入力(キーボード)からの入力値を書式指定した文字列として取得します。
第2引数以降は書式指定文字列※3の変換指定子の数だけ変数を指定します。
戻り値は成功時には入力データの数を返し、失敗時はEOFを返します。

標準出力関数(参考)

fputc() int fputc(int c, FILE *stream); キャラクタ(ASCIIコード)c をストリーム※2に出力します。
putc() int putc(int c, FILE *stream); 「fputc」と同機能のマクロです。
putchar() int putchar(int c); キャラクタ(ASCIIコード)c を標準出力(画面出力)します。
fputs() int fputs(const char *str, FILE *stream); 文字列 s をストリーム※1に出力します。
puts() int puts(const char *str); 文字列 s を標準出力(画面出力)します。
fprintf() int fprintf(FILE *stream, const char *format,…); 書式指定文字列※2をストリームに出力します。
第2引数以降は出力元となる変数を変換指定子の数だけ指定します。
printf() int printf(const char *format,…); 書式指定文字列を標準出力(画面出力)します。
第2引数以降は出力元となる変数を変換指定子の数だけ指定します。

例題1:

キーボードから「Ctrl+Z」を入力することによりループを終了させることができます。

入力した数値を加算、「Ctrl+Z」を入力すると、集計を出力

#include <stdio.h>

void main(void)
{
  int n;
  int sum = 0;
  
  printf("整数を入力して下さい\t");
  while (scanf("%d", &n) != EOF) {	// …「Ctrl+Z が入力されるまで」という意味
  
    sum = sum + n;
  }
  printf("sum = %d\n", sum);

  fflush(stdin); 
  getchar(); 
}

例題2:

「Ctrl+Z」を押されるまで、文字列を入力し、入力した文字列のスペースの箇所で、改行して表示する。

/* a6-1-3.c */
#include <stdio.h>

int main(void)
{
  char str[256];
  int i;
                    // 
  puts("文字列を入力してください。(終了条件:Ctrl+Z)");
  while (gets(str) != NULL) 
  //gets(str);
  {	puts("入力文字列をスペースで改行して表示します。");
    for (i = 0; str[i] != '\0'; i++) 
    {	/* スペースで改行 */
      if (str[i] == ' ') 
        putchar('\n');
      /* スペース以外はそのまま表示 */ 
      else {
        putchar(str[i]);
      }
    }
    putchar('\n');
  }

  return 0;
}

C# exercises (2) Event-driven

イベントドリブンとは

「キーボードのボタンが押された」とか「マウスが移動した」等の、 コンピュータ上で発生するなんらかの事象のことをイベント(event)といい、 イベントが発生したときに行う処理のことをイベント ハンドラー(event handler)と呼びます。 このように、イベントとそれに対する処理により動作するようなプログラムのことをイベント駆動型(event drive)プログラムと呼びます。

課題:ボタンクリックでメッセージボックス に表示

デザインの作成

ツールボックスの中から、Buttonを選択して、Form1に貼り付ける
スクリーンショット 2016-04-14 16.57.10

ボタン名の変更

スクリーンショット 2016-04-14 16.57.57
プログラムの作成
ボタンをダブルクリック(ダブルクリック: マウスの左ボタンを2回連続で押す)

少しずつ入力すると命令が表示されるので、Mesまで入力して、MessageBoxを選択しましょう。

スクリーンショット 2016-04-14 17.00.14
MessageBoxのあとは、「.」 (ドット)を入力、関数「Show」を選択して、(” “); を入力
 スクリーンショット 2016-04-14 17.01.00

完成したコード

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 test1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello world");
        }
    }
}
*注意:( ” “) ; は全角(漢字)にしてはいけません。全角(漢字)の文章を入れた場合、かならず半角に戻して入力しましょう。
実行してみる
 スクリーンショット 2016-04-14 17.06.18
フォームの表示

ボタンをクリックすると、あいさつメッセージが表示

プロジェクトのパス

c:\Users\chen\documents\visual studio 2015\Projects\test1

C# exercises (1) Guidance

Windowsアプリを作る

C#について

  • 開発しやすく,高機能なプログラミング言語
  • 様々なプログラミング言語の良いところを組合せて作った.
  • プログラムのミス(バグ)が出にくい
  • 学習しやすい
  • 比較的簡単に自分が作成したいWindowsアプリを作れる
  • Windowsアプリの開発ではC#を使うことが標準になってきている。

c472feec-9f9a-a24f-6fe5-8fa1d3d227f6

この課程について

  • Microsoft Visual C# 2015利用
  • とても難しいWindowsアプリの開発をできるだけ簡単にして、いろいろな高度な機能を教えたい。
  • 少しでもプログラミングの楽しさが伝わるように工夫したい。
  • 演習中心:できるだけ見やすく工夫します。
  • 簡単ながら、応用しやすく、かつ、興味がもてるような題材を考えてきます。
  • 試験:レポート
  • 評価:出席+演習+レポート

***

プログラムの作り方

–Microsoft Visual C# 2015 Express Editionを起動
–画面の左下の「スタート」メニュー ⇒ プログラム

⇒ Microsoft Visual C# 2010 Express Edition

•左上のメニューから「ファイル」⇒「新しいプロジェクト」を選択
•「Windowsフォームアプリケーション」が選択された状態で、プロジェクト名に好きな名前を入力する
プロジェクトの初期状況
ツールボックスを固定

 

C programming (2) Create C Programs

C言語の特徴(1)

関数型言語

コンピュータに実行してもらう命令はすべて関数の中に記述されている。関数がプログラムの実行単位。いくつかの関数を組み合わせ、コンピュータへ命令をする。最初にコンピュータが実行する関数はmain()に決まっている。

戻り値の型 関数名(引数リスト)
{
	命令文;
}

コンパクトな言語仕様

予約語(キーワード)は各種の指示を行う命令。全部で32個。このなかには「画面に文字を表示する」とか「ディスクにデータを書き込む」などという「入出力」の機能はない。すべて「関数」として実現されている。このような基本的な関数がないとコンピュータとやり取りできないので、必ず標準ライブラリ関数として予め用意されている。

#include <stdio.h>

Cプログラムの作成

C プログラムの作成手順

文字の並びとして作成したソースプログラムを、コンピュータが理解できる形式に変換する

compile

C プログラミングを書くための約束事

  1. 基本は半角英数字で書く
  2. 大文字と小文字は別の文字
  3. 文はセミコロンで区切る
  4. 余計なことは書かない
  5. 余計なことは「コメント」で

Cpadの使い方

BCPAD

(練習1)文字列の表示

  • C言語はmain()関数ではじまる
  • C言語の標準関数はヘッダファイルに記述されている
  • ヘッダファイルをインクルードするにはプリプロセッサ命令 #include をソースの先頭で使う
// test1.c 
// 全角と半角の入力に注意
// { {  (((   \\\\\\n
//これがさいしょのぷろぐらむ
#include <stdio.h>
int main( )
{
   printf("おはよう  \n");
   printf("こんにちわ\n");
   printf("こんばんわ\n");
   getchar( );
   return 0;
}

日本語環境では、バックスラッシュ(\)の表示は円マーク(¥)になる。

スクリーンショット 2016-04-15 10.43.20

演習環境

  • ソースコードの作成 CPad
  • ソースコードの名前Test1.c で保存. (ファイルは英数字は無難)
  • ソースコード必ず.cの拡張子つける.
    (つけないと.cppになり、思わぬエラーに見舞われる)
  • ソースコードの置場 C:\Users\Student\Documents\C

画面が一瞬で消えてしまい、実行結果がわかりません。

次の命令をプログラムの最後に入れると実行画面を一時停止できます。

int main(void)
{
  /* 他の処理 */

  fflush(stdin); 
  getchar(); 

  return 0;
}

 

C exercises (1) guidance

C言語プログラミングⅡの試験解説

C言語検定試験について

試験名

C言語プログラミング能力認定試験
(C-Language Programming Skills Qualification Test)

試験目的

C言語を駆使して応用プログラム(言語処理系、ユーティリティなど)を作成する能力を認定します。

認定基準

一級 C言語を駆使し、応用プログラム(言語処理系、ユーティリティなど)が作成できる能力を有する。

また使用しているOSについて理解をしている。

二級 小規模のプログラム(500行程度)が適切に(理路整然、簡潔、正しく、速く)書ける。

また各種基本アルゴリズムを理解している。

三級 C言語の概念を理解し、簡単なプログラムが書ける。

 

付録

プログラミング関連の資格

  1. Oracle Certified Java Programmer
  2. C言語プログラミング能力認定試験
  3. Ruby技術者認定試験制度
  4. ORACLE MASTER Silver Oracle PL/SQL Developer
  5. IPA基本情報処理技術者試験
  6. IPA応用情報処理技術者試験
  7. マイクロソフト認定ソリューション デベロッパー (MCSD)
  8. CIW Web Development Professional Certification
  9. 情報検定(J検)
  10. JSTQBテスト技術者資格認定

参考サイト:

  • http://techacademy.jp/magazine/894

2015年の人気プログラム言語比較

言語の特徴を表にまとめてみました。

用途 学習難易度 年収 求人数 将来性
C 制御系、組込み系 ★★★★★ 普通 少ない
Java 汎用的だがWeb系
の開発が多い
★★★ 普通 多い ★★
PHP Web系 ★★ 普通 多い ★★
Ruby 汎用的だがWeb系
の開発が多い
★★★ 少ない ★★★
Python 汎用的 ★★★ 少ない ★★★★
Swift iPhoneアプリ ★★★★ 多い ★★★★★

参考サイト:

  • https://toiroha.jp/article/detail/32380
  • https://blog.codecamp.jp/programming_language_2015

WEBシステムの開発会社でもC言語が見直されている!?

OSやメモリを強く意識したC言語は高速、省資源。

ある程度の規模までのWEBシステムの場合は、
もちろんPHPやJavaといった言語が使用されますが、
大人数が同時に使用する、巨大なデータベースの場合、
核となる部分はC言語の方が適している場合もあるそうなのです。

なぜ、JavaではなくC言語なのでしょうか。

Javaの特徴でもあるガーベジコレクション(自動でメモリを開放してくれる機能)が原因で不具合が発生したことがあるそうです。

メモリを潤沢に使い、使用後も特に意識することを必要としないJavaという言語。
それに対してC言語は、メモリの管理は自分で行うことが前提の言語なのでメモリの取得と解放の手順は自分で記述しなければなりませんが、自分で記述した通りに動作させることができます。

参考サイト:

  • http://shinjuku.kenschool.tv/2013/03/15/web%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E9%96%8B%E7%99%BA%E4%BC%9A%E7%A4%BE%E3%81%A7%E3%82%82c%E8%A8%80%E8%AA%9E%E3%81%8C%E8%A6%8B%E7%9B%B4%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B/

[BCC32]Error on JP programming

Hello World例

正しいhello.c。カーソルは位置を注意してください。Pは5:5の位置にある。

image

コンパイルと実行する様子

典型的なエラー

初めてCのプログラミングは なかなかうまく行かないかも知れない。
ここではHello World プログラムの典型的な間違い例をいくつか紹介する。

 

半角引用符「”」ではなく全角引用符「”」に

右の引用符は全角引用符「”」になっている

image

 

全角スペースが用いられ

全角スペースが用いられている、これはなかなか探しにくい。

カーソルは位置を注意してください。Pは5:3の位置にある。

(半角のスペースなら、Pは5:5の位置にある。)

image

セミコロン「;」の付け忘れ

 

セミコロン「;」の付け忘れである。

image