プログラミング入門

Introduction to programming

概要 Abstract
簡単なプログラムを書きながら,C++の基礎を習得する.
Learn the basics of C++ while writing simple program.
注意 Attention
  • わかりやすくするために,あえて大雑把な書き方をしている.RoboticsTextやほかの書籍で知識を深めること. To make it easy to understand, this performs careless writing style positively. Please deepen knowledge by RoboticsText and other book.
  • 短く書いてあるので,丁寧に読み進めること.疑問があったらその都度RoboticsTextなどで調べ,わからない部分は教員・TA・先輩に聞くようにしよう. Because this is written briefly, go on reading carefully. Examine it in RoboticsText each time if there is a question, then let's ask teacher, TA, older student for a difficult part.
  • 記載されているプログラムを実行する場合は,コピー&ペーストせずに,必ず自分の手でキーボードで入力することWhen you execute listed program, do not copy & paste, but input from key-board by your hand definitely.
キーワード Keyword
コンパイル,ライブラリ,名前空間,関数,変数,クラス
Compilation, library, namespace, function, variable, class
NOTE
以下の演習は Linux で行うことを想定している.
The following practice is assuming that you perform in Linux.
目次 Table of contents

レベル0 Level 0

プログラミングを勉強する極意 The secret to study programming

プログラムを書くのが上手な人は,自分で問題を作って,いろいろ実験する. 疑問に思ったことは,調べて,試す

Person, who is good at writing program, create problem in person and carry out in various ways. Examine and try it for things in question.

プログラミングはゲームと似ていて,ルールブックを読んでいても面白くない. ゲームをしてみて(プログラムを書いてみて)始めて,なぜそのようなルールになっているかわかる.

Programming resembles game, as reading rulebook is not interesting. You can understand why it is such a rule if play a game (write program), and begin it.

とにかく手を動かして書くこと

Anyway, move hand, and write it.

レベル1 Level 1

(1) helloworld : とにかく書き始める Anyway, begin to write it

参考 Reference

演習 Practice

  1. 適当なディレクトリを作成し(例: prg/test/),helloworld.cpp という名前のテキストファイルを作成し,エディタで開け. Create suitable directory (e.g. prg/test/) and create in text file named helloworld.cpp, then open with editor.
  2. 以下のソースコードを入力せよ.~ Input the following source codes.
    コピー&ペーストせずに,キーボードで入力すること.
    Do not copy & paste, but Input from key-board.
    #include<iostream>
    using namespace std;
    int main()
    {
      cout << "Hello World!" << end;
      return 0;
    }
  3. 上記プログラムをコンパイルせよ. Compile the program mentioned above.
    • 正常にコンパイルできたら, a.out という実行ファイルが生成される. If compiled normally, execute file called a.out is created.
    • 正常にコンパイルできなかった場合は,間違いを探し,修正せよ. If not compiled normally, then trace mistake to revise it.
  4. a.out を実行せよ. Execute a.out.
    • 以下のような結果が表示されたらOK. It is OK if the following results are displayed.
       Hello World!

解説 Explanation

プログラムを順に解説する.理解できなかった部分は,テキストで復習すること.

We explain program sequentially. Review part, which you were not able to understand, with text.

#include<iostream>
  • iostream という「ライブラリ」を読み込む命令*1.これを書かないと, cout や endl が使えない. Command, called iostream, to read "library". cout and endl are not usable if you do not write this.
using namespace std;
  • 「名前空間 std を使う」という宣言. Declaration of "Use namespace std".
    • これを書かないと… When you do not write this ....
      #include<iostream>
      // using namespace std;
      int main()
      {
        cout << "Hello World!" << end;
        return 0;
      }
      このプログラムを試してみよう(//はコメントアウト).
      Let's try this program (// is comment out).
    • cout, endl あたりでコンパイルエラーとなる. Compile error occurs at around cout, endl.
    • std::cout, std::endl とすると,コンパイルが通るようになる. When assume std::cout, std: endl, compilation is passed.
int main()
  • main 関数.C++ で書いたプログラムを実行すると,main 関数が最初に実行される. Main function. When you execute program wrote by C++, main function is executed first.
cout << "Hello World!" << end;
  • "Hello World!" という文字列と改行 (endl) を出力する. Output character string of "Hello World!" and newline character (endl).
return 0;
  • main 関数で 0 を返すというのは,「プログラムを正常終了する」という意味. If main function returns 0, it means that "program finishes with Normal termination".

もっと演習 More practice

  1. 123+456=(計算結果) と出力するプログラムを作れ. Create program to output 123+456 = (computed result).
    • (計算結果) は式の計算結果を表し,プログラムに計算させること. (computed result) stands for computed result of expression, and let the program calculate it.

C++プログラミングの理解 Understanding of C++ programming

C++のプログラムは,ごく大雑把に言って,次のふたつの要素から構成される

To say extremely roughly, C++ program is comprised of two following elements:

変数 Variable
数値,文字列などのデータを格納する容れ物
Digit value, Container which stores data such as character strings.
関数 Function
データに対する操作
Operation for data.

最初に,これらふたつの概念をしっかり理解すること. At first, understand these two concepts well.

(2) 変数の理解 Understanding of variable

参考 Reference

以下を理解せよ.

Understand the following.

変数の構成要素は以下の3つ:

Component of variable is following three:

識別子(名前) Identifier (Name)
プログラムのソースコード上で各変数を区別するための名前.
A name to distinguish each variable on program source code.
Type
どんなデータか.整数,小数,文字列,真理値,あるいはこれらの複合型.
Kind of data. Short number, decimal fraction, character string, truth value or these compound type.
アドレス Address
データは計算機のメモリ上に物理的に格納される.メモリ上のどこに格納されているかを表すのがアドレス.
Data are stored on memory of computer physically. Address Indicate where to store in the memory.

演習 Practice

  1. 小数型の変数 x を宣言し,3.14 を代入し,画面に出力するプログラムを書け. Write program to declare variable x of decimal fraction type, assign 3.14, and output it to screen.
  2. 整数の変数 x を宣言して 3 を代入し,整数の変数 y を宣言して 2 を代入し,x/y の計算結果を出力するプログラムを書け. Write program to declare variable x of short number, and assign 3, declare variable y of short number, and assign 2, and output computed result of x/y.

(3) 関数の理解 (3) Understanding of function

参考 Reference

演習 Practice

  1. double型の変数3つを引数に持ち,これら3つの積を画面に出力する関数を作れ.戻り値はvoidでよい.その関数をmainから実行するようにプログラムせよ. Create function, which have three argument variables of double type, and output these three products to screen. Return value is void. Program it to execute the function from main.
  2. 上の問題で,計算結果(積)を戻り値として返すように関数を書け.mainで計算結果を変数に代入し,それを10倍した値を画面に出力するようにプログラムせよ. In problem below, write function to return computed result (product) as return value. Program it to assign computed result to variable in main, and output value, which is performed 10 times, to screen.

(4) ポインタ・参照の理解 (4) Understanding of pointer, reference

参考 Reference

演習 Practice

  1. int,doubleなどの変数,ポインタ型変数,参照型変数について以下の観点から説明せよ. About variables such as int,double, pointer variable, reference type variable, describe it from the following points of view.
    • 識別子,型,メモリ上の物理的なデータとアドレス. Identifier, type, physical data and address in memory.
    • 値,メモリアドレスの取得方法.ポインタ型変数・参照型変数の場合は,対象のデータの値・メモリアドレスの取得方法も. Value, acquisition method of memory address. In the case of pointer variable, reference type variable, then value of target data, acquisition method of memory address, too.
  2. 以下のプログラムを読み,関数 func1, func2, func3 の違いについて考察せよ.mainで実行した場合の挙動について予想せよ(なぜそう予想できるか,理由も書け).~ Read the following programs, and consider difference of function func1, func2, func3. Predict about behavior of case that you execute by main. (write reason why you can predict so)
    試す場合は,コピー&ペーストせずに,キーボードで入力すること.
    When trying it, input with key-board without copy & paste.
    #include <iostream>
    using namespace std;
    void func1(double x)
    {
      x=1.23;
      cout<<"(func1) x= "<<x<<endl;
    }
    void func2(double *x)
    {
      *x=2.34;
      cout<<"(func2) *x= "<<*x<<endl;
    }
    void func3(double &x)
    {
      x=3.45;
      cout<<"(func3) x= "<<x<<endl;
    }
    
    int main(int,char**)
    {
      double x(0.0);
      cout<<"(main-1) x= "<<x<<endl;
      func1(x);
      cout<<"(main-2) x= "<<x<<endl;
      func2(&x);
      cout<<"(main-3) x= "<<x<<endl;
      func3(x);
      cout<<"(main-4) x= "<<x<<endl;
      return 0;
    }
  3. 多くの場合,関数の引数には const 参照型が使われる.理由を考察せよ. In many cases, const reference type is used for argument of function. consider the reason.
  4. 関数の理解で作成した関数の効率を向上させよ. Improve efficiency of created function at understanding of function.

(5) ユーザインタフェース (5) User interface

プログラムのユーザ(自分も含めて)に何かデータを入力させる方法には,いくつかやり方があるが,ここでは以下の2つを学ぶ:

For method to let program user (including yourself) input some data, there are some ways, but learn following two here:

コマンドライン引数 Command line argument
プログラムを起動するとき,コマンドラインに引数を付ける.
When you start program, attach argument to command line.
標準入力 Standard input
プログラムの実行中に,端末からの入力を受け付ける.
Accept input from terminal during program execution.

両者の違いは,実行前か実行中か.

difference of both Is before execution or during execution.

参考 Reference
関数:コマンドライン引数
C++プログラミングの基礎:標準入力
Function:Command line argument
The basics of C++ programming:Standard input

演習 Practice

  1. コマンドライン引数:以下のプログラムを打ち込み,実験せよ. Command line argument: Program as follows and carry out.
    #include <iostream>
    #include <cstdlib>  // atof, atoi
    using namespace std;
    int main(int argc, char **argv)
    {
      cout<<"number of arguments: "<<argc<<endl;
      cout<<"0th argument: "<<argv[0]<<endl;  // name of executable
      cout<<"1st argument: "<<argv[1]<<endl;
      cout<<"2nd argument: "<<argv[2]<<endl;
      int arg1= atoi(argv[1]);
      double arg2= atof(argv[2]);
      cout<<"arg1: "<<arg1<<endl;
      cout<<"arg2: "<<arg2<<endl;
      return 0;
    }
    ただし,atoi は文字列を int 型整数に変換する関数,atof は文字列を double 型浮動小数点に変換する関数.
    But, atoi is function to convert character string into int type short number, and atof is function to convert character string into double type floating point.
    • このプログラムがどう動くか説明せよ.特に,コマンドライン引数の与え方と動きについて詳しく書け. Explain how this program works. In particular, write how to give command line arguments and behavior in detail.
    • コマンドライン引数の数,与え方(整数,実数,文字列を与えた場合など)をいろいろ変えて実験し,実験結果を書け.また,そうなった理由について考察せよ. Use various ways for the number of command line arguments and how to give it(short number, real number, character string), then carry out, and write experimental result. Also, consider reason why it behaves so.
  2. 標準入力:以下のプログラムを打ち込み,実験せよ. Standard input: Program as follows and carry out.
    #include <iostream>
    using namespace std;
    int main(int,char**)
    {
      cout<<"input int: ";
      int a;
      cin>>a;
      cout<<"a= "<<a<<endl;
      cout<<"a*10= "<<a*10<<endl;
      cout<<"input double: ";
      double b;
      cin>>b;
      cout<<"b= "<<b<<endl;
      cout<<"b/2.0= "<<b/2.0<<endl;
      return 0;
    }
    • このプログラムがどう動くか説明せよ. Explain how this program works.
    • 入力をいろいろ変えて実験し(整数,実数,文字列を与えた場合など),実験結果を書け.また,そうなった理由について考察せよ. Use various input(short number, real number, character string), then carry out and write experimental result. Also, consider reason why it behaves so.

(6) 制御文の理解 (6) Understanding of control statement

参考 Reference

演習 Practice

  1. ユーザに整数を入力させ,0からその数字まで加算した答えを返すようなプログラムを書け. Write program to let user input short number and return answer that is adding from 0 to that number.
  2. ユーザに1から5の整数を入力させ,入力に応じて異なるメッセージを出力するプログラムを作れ. Create program to let user input short number from 1 to 5, and output different message depending on input.
    • if を使ったバージョンと switch を使ったバージョンのそれぞれを作れ. Create each of version using if and version using switch.
  3. ユーザにまず正の整数を入力させ(Nとする),さらにユーザにN個の実数を入力させ,N個の実数のうち,正の実数のみを合計した結果と,負の実数のみを合計した結果を,それぞれ出力するようなプログラムを書け. Write program to let at first user input positive integer(N), furthermore, let user input real number of N unit, then, from real numbers of N unit, output both result that added up only positive real number and result that added up only negative real number.
    • 配列・ベクタは使わなくてよい. Do not need to use array, vector.
    • for を使ったバージョンと while を使ったバージョンのそれぞれを作れ. Create each of version using for and version using while.

自己チェック Self-checking

  1. 以下の点を確認せよ: Confirm the following points:
    • 整数:正の整数,と勝手に勘違いしていないか? Integer: Are you misunderstand it as positive integer without permission?
    • あるいは,正の整数のみを受け付けるプログラムなら,負の整数が入力された場合にはエラーが出るようになっているか? Or, if it is program to accept only positive integer, does error come out if negative integral exponent is input?

レベル2 Level 2

(1) 配列とベクタの理解 (1) Understanding of array and vector

参考 Reference

演習 Practice

  1. 配列とベクタの違いを説明せよ. Describe difference between array and vector.
  2. 配列とベクタを使ってそれぞれ適当なプログラムを書け. Write suitable program using array and vector.
    • ベクタの機能(サイズの取得,リサイズ,push_back など)を一通り使ってみよ. Try to use features of vector (including size acquisition, resize, push_back) generally.

(2) クラスの理解 (2) Understanding of class

参考 Reference

理解しよう:基本 Tyr to understand: Basics

クラスというのは,自分で作った型のことだ.この新しい型は,いくつかの型を組み合わせて作る複合型).例えば int を2つと,doubleを1つ組み合わせて型を作るには,

Class is type that you created in person. This new type is created from combination of some types (compound type). For example, to create type from combination of two int and one double,

class TTest1
{
  int x;  // 1つめのint
  int y;  // 2つめのint
  double z;  // double
};

のように書く.だから,クラスは変数の集合体と考えてもよい.クラス内の変数を,メンバ変数と呼ぶ.

Write as below. Therefore, you may regard class as aggregate of variable. Call intraclass variable as member variable.

クラスのもうひとつの要素は,メンバ変数を操作するためのメンバ関数だ.

Another element of class, is member function to operate member variable.

例:

E.g.:

class TTest2
{
  int x;
  void func()
    {
      cout<<x<<endl;
    }
};

まとめ:

Conclusion:

  • クラスとは自分で作った型で,メンバ変数メンバ関数から成る. Class is type that you created in person, and it is from member variable and member function.

理解しよう:インスタンス Understand: instance

クラスは自分で作った型だから,int型などのように,その型の変数を定義して使う.
例:

Because class is type that you created in person, define variable of the type, and, like int types, use it. E.g.:

class TTest3
{
...
};
int main()
{
  TTest3 test;
}

このとき作った変数(test)を,そのクラスのインスタンスという.

Variable (test) which you created at this time is called instance of the class.

理解しよう:アクセス制限 Understand: Access limit

クラスの外からアクセスさせたいメンバ変数・関数は public セクションに,クラスの外から隠したい場合は private セクションに書く.

For member variable, function that is accessed from the outside of class, write in public section, and when you want to hide it from the outside of class, write it in private section.

class TTest4
{
public:
  void func();
private:
  int x;
};

メンバ変数は,理由がない限りprivateメンバ変数にするのが普通.

It is common to make member variable, private member variable if there is no reason.

理解しよう:メンバ関数の実装 Understand: Implementation of member function

メンバ関数の実装方法は二つある.クラス内で実装する方法と,クラス外で実装する方法だ.
クラス内で実装する例:

There is two method of implementation of member function. These are method to implement in class, and methods to implement out of class. Example to implement in class:

class TTest5
{
public:
  void func()   // セミコロンを書かずに,関数を書き始める
    {
      cout<<"hogehoge"<<endl;
    }
};

クラス外で実装する例:

Example to implement in class:

class TTest6
{
public:
  void func();   // 宣言だけする.セミコロンを書く
};
void TTest6::func()   // TTest6:: はクラス TTest6 に属する,という意味
{
  cout<<"hogehoge"<<endl;
}

なお,メンバ関数からは,そのクラスのメンバ変数に自由にアクセスできる.

In addition, from member function, member variable of the class can be accessed freely.

演習 Practice

  1. 全方位移動ロボットをシミュレートするクラスを作れ. Create class simulating all direction mobile robots.
    • 状態は x,y で,型は double とせよ. Assume that state is x,y and type is double.
    • Move 関数を,ロボットを移動させるメンバ関数として定義せよ. Define Move function as member function to move robot.
      • 引数,移動量などは好きに定めてよい. You may set argument, movement as you like.
    • 移動後の座標を画面に出力せよ. Output coordinate after transfer on screen.
    • このクラスをテストするプログラムを書け. Write program to test this class.
  2. 上記プログラムを改良せよ. Improve the program mentioned above.
    • プログラムの外部から状態を取得できるように書き直せ. Rewrite it to acquire state from exterior of program.
    • 位置をリセットするメンバ関数を追加せよ. Add member function to reset position.
    • 移動できる範囲を設定できるように変更せよ. Change it to set movable range.

自己チェック Self-checking

  1. 状態を外部から取得できるようにする場合,publicメンバ変数にしていないか? When allowing to acquire state from the outside, do you make public member variable?
    • これだと,Move 関数を使用していないのに座標が変えられてしまう! If it is, coordinate is changed though not using Move function!

レベル3 Level 3

(1) ベクタとリストの理解 (1)Understanding of vector and list

参考 Reference

演習 Practice

  1. 以下の項目について,リストとベクタで比較せよ. About the following items, compare list and vectors.
    • データがメモリ空間上にどのように配置されているか. How data is placed on memory space?
    • 末尾や先頭にデータを挿入する場合に掛かる時間. Time to take when you insert data in the end and the head.
    • 途中にデータを挿入する場合に掛かる時間. Time to take when you insert data on the way.
    • n(整数)番目のデータにアクセスするのに掛かる時間. Time to take to access n th data( integer).
    • 全データをスキャンするのに掛かる時間. Time to take to scan all data.
  2. ベクタ,リストを作り,適当な数だけデータを挿入し,データを追加,削除,要素アクセス,全データを表示,全データの合計を求める,リサイズ(ベクタの場合),などを試せ. Create vector, list, inserts data for only suitable number, add data, deletes, element access, display all data, find total of all data, Try resizes (in the case of vector).

(2) ファイル入出力の理解 (2) Understanding of file I/O

参考 Reference

演習 Practice

  1. 適当にファイルからデータ(数値)を読み込み,ベクタかリストに格納するプログラムを書け. Write program to read data (digit value) from file properly, then store in vector or list.

*1 正確には「プリプロセッサディレクティブ」という.

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-05-15 (月) 19:26:33 (210d)