PowerPoint プレゼンテーション

アルゴリズム論1 第2回
授業の目的
「配列」の使い方をマスターする
 課題の提出法に習熟する
ファイルのバックアップ法を知る
配列を使った「名簿」の作成法と表示法を
学ぶ。「クラス」を使いこなす
Itsuo Umebu
配列に対する基本操作
課題1 下記のプログラムを作れ。
・ 配列の各要素に 0~200 までの偶数を順に1個づつ入れる。
・ その後、全要素を表示する
・ キーボードから 0~200 の間の偶数を入力する
・ それが何番目の要素かを表示する
(入力した数字と配列要素がもっている数を比較して、
一致したらその要素の添え字を表示すること)
提出先ディレクトリ: algo1
“プログラムの先頭に、学生番号を必ず入れること !!”
提出の仕方は先の図のとおりとする
Itsuo Umebu
配列に対する基本操作 1
配列に偶数を詰める
開始
ループ 1
n : 0, 1, 100
2*n→a[n]
ループ 1
/*学生番号*/
#include <iostream>
using namespace std;
// exercise 1
main( )
{
int x, a[101],n,m,i;
for (n = 0; n <= 100; n++ ){
a[n] = 2 * n;
}
Itsuo Umebu
配列に対する基本操作 2
配列要素を全て表示
ループ 2
m : 0, 1, 100
a [ m ] 出力
for( m = 0; m <= 100; m++ ){
cout << a[m] << endl;
}
ループ 2
Itsuo Umebu
配列に対する基本操作 3
入力した数に一致する配列の添字を出力
x 入力
ループ 3
i : 0, 1, 100
cin >> x;
for( i = 0; i < = 100; i ++ ){
if ( x == a[i] ){
cout << i << endl;
}
}
return 0;
yes
x = a [ i ]?
i 出力
no
ループ 3
}
終了
Itsuo Umebu
配列に対する基本操作 解答例
開始
配列に偶数挿入・表示
x 入力
ループ
i :0, 1, 100
yes
x = a [ i ]?
/*学生番号*/
#include <iostream>
using namespace std;
// exercise 1
main( )
{
int x, a[101],n,m,i;
for(n=0;n<=100;n++){
a[n]=2*n;
}
for(m=0;m<=100;m++){
cout<<a[m]<<endl;
}
i 出力
no
cin>>x;
for(i=0;i<=100;i++){
if(x==a[i]){
cout << i <<endl;
}
}
return 0;
ループ
終了
}
Itsuo Umebu
課題の提出方法
ノートPC
大学のサーバ
ftp
/*a60..
プログ
ラム
学生番号は小文字の
a から初めてください
% ftp 大学のサーバ名
IDとPWD入力
% cd ~iu-ed/指定ディレクトリ
% put ファイル名 学生番号
% bye
大学のサーバ:iis1, iis2, iis3, peace1, peace2, ..., peace8
Itsuo Umebu
バックアップのとりかた
ノートPC
大学のサーバ
ftp
/*a60..
プログ
ラム
% ftp 大学のサーバ名
IDとPWD入力
% put ファイル名 (新ファイル名)
% bye
大学のサーバ:iis1, iis2, iis3, peace1, peace2, ..., peace8
Itsuo Umebu
線形リスト(配列)とその操作 名簿を作る
目標
1. 表を作成する(データの入力、表示、ファイル
に保存、ファイルから読み出し)
2. キーから、必要なデータを探索する
3. 表からデータを削除する
4. 表をソートする
5. 新たなデータを表の適切な位置に挿入する
学生番号
氏 名
アルゴリズム
システムB
a602200
楳生逸雄
80
85
・
・
・
Itsuo Umebu
表を作成する
表全体を「テーブル クラス」とする
学生番号
氏 名
アルゴリズム
システムB
a602200
楳生逸雄
80
85
1行分のデータを「レコード クラス」とする。
今回は番号と氏名のみとする
Itsuo Umebu
クラスの仕様 (メンバー変数)
- はprivate (このクラスの
レコードクラス
学番
Record
- int key
- string data
氏名
外からアクセスできない)
テーブルクラス
Table
- Record list[100]
- int n
最大100人
分のレコード
用意
100個の内、n個
+ Table ( ); constructor
データが入って
+ setData (int Key, string
Data); void
いる
+ showData ( ); void
+ saveData (char *filename); void
+ readData (char *filename); void
Itsuo Umebu
Record list[100]の構造
Record
- int key
- string data
list[0]の
key
list[0]の
data
list[0].key
list[0].data
list[1].key
list[1].data
list[2].key
list[2].data
list[99].key
list[99].data
Table
- Record list[100]
- int n
Itsuo Umebu
クラスの仕様 (メンバー関数)
テーブルクラス
Table
- Record list[100]
- int n
テーブルクラス
 Table( )
n=0 に初期化する
 setData( int Key, string Data )
KeyとDataをlist に納める
 showData( )
Tableの中身を表示する
saveData( char *filename )
ファイルに名簿を保存
readData( char *filename )
ファイルから名簿読み出し
+ Table ( ); constructor
+ setData (int Key, string Data);void
+ showData ( ); void
+ saveData (char *filename); void
+ readData (char *filename); void
+ はpublic (このク
ラスの外からアク
セスできる)
Itsuo Umebu
レコードクラスをプログラミングしよう
レコードクラス
Record
- int key
- string data
 key: 学生番号(数字のみとする)
 data: 名前
今回はローマ字で入力する
途中に空白を入れない
 key, data共にprivate変数とする
 Recordクラス:
Tableクラスに対して friend class
であるとする
注:string を使うときは、
#include <string>
が必要
Itsuo Umebu
レコードクラスのプログラム(定義部)
レコードクラス
Record
- int key
- string data
class Record{
friend class Table;
private:
int key;
string data;
};
Table クラスにだ
けはみんな使わ
せてあげる
Itsuo Umebu
テーブルクラスをプログラミングしよう
Table
- Record list[100]
- int n
class Table{
private:
public:
+ Table ( ); constructor
+ setData (int Key, string Data);
void
+ showData ( ); void
+ saveData (char *filename); void
+ readData (char *filename ); void
};
Itsuo Umebu
テーブルクラスのプログラム (定義部)
class Table{
private:
Record list[100];
Table
int n;
- Record list[100]public:
Table( ){n=0;}
- int n
void setData(int Key, string Data);
void showData( );
+ Table ( ); constructor void saveData (char *filename );
+ setData (int Key, stringvoid
Data);
readData (char *filename );
void
};
+ showData ( ); void
+ saveData (char *filename ); void
+ readData (char *filename ); void
Itsuo Umebu
メンバー関数の定義 1
void Table::setData(int Key, string Data)
{
list[n].key=Key;
list[n].data=Data;
n++;
}
void Table::showData( )
{
for(int i=0;i<n;i++){
cout << “Name for number”
<<list[i].key<< “=“ <<list[i].data<<endl;
}
}
Itsuo Umebu
メンバー関数の定義 2
void Table::saveData(char *filename )
{
ofstream f ( filename );
for(int i=0; i<n; i++){
f << list[i].key << endl;
f << list[i].data << endl;
}
f << 0 << endl;
}
Itsuo Umebu
メンバー関数の定義 3
void Table::readData(char *filename )
{
ifstream f ( filename );
int ikey;
string idata;
while (1){
f >> ikey;
if ( ikey == 0 ) break;
f >> idata;
setData ( ikey, idata);
}
}
Itsuo Umebu
メインプログラム
メインプログラムの仕事の内容
1.
2.
3.
4.
キーボードから10人の番号と名前を入力
入力終了後、番号と名前を一括して表示
入力したデータをファイル meibo.txt に保存
ファイル meibo.txtからデータを読み出し表示
Itsuo Umebu
メイン関数の定義
main( )
{
Table Meibo;
int j,number,m=10;
string name;
for (j=0; j<m; j++)
{
cout << “Input number and name please” << endl;
cin >> number >> name;
Meibo.setData(number, name);
}
Meibo.showData( );
Meibo.saveData( “meibo.txt” );
// 保存したデータを読み出そう
Table myMeibo;
myMeibo.readData( “meibo.txt” );
myMeibo.showData( );
return 0;
}
Itsuo Umebu
課題 2
「名簿」のクラス定義部、メンバー関数定義部、
メイン関数からなるプログラムを作成せよ
提出先:algo2
先頭にこれ
が必要です
/* 学生番号 */
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
Itsuo Umebu