アルゴリズム論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
© Copyright 2024 ExpyDoc