プログラ演習レポート1
はじめに
プログラミング演習2、第1週〜第4週のレポートです。
- 動作確認には Borland C++ を使用しました。
- ソースコードは併記した URL に保管してあります。文字コードは Shift-JIS です。
課題1-3:構造体配列・ファイル入出力
概要
商品データファイル gifts を読み込んで、構造体 gift に格納したのち、画面に表示するプログラム。
while(1) ループでレコードを一行ずつ読み込んで表示し、行の一文字目に EOF が来るとファイルをクローズして終了する。なお便宜のため、値段も含めた全てのデータを文字列として読み込んでいる。
プログラムの起動方法
商品ファイル gifts を同じディレクトリに置き、プログラムを実行する。
実行結果
商品コード : JZK-30 商品名 : Jizake_tsumeawase 値段 : 4500 商品コード : BSP-15 商品名 : Body_soap_set 値段 : 3000 商品コード : BT-200 商品名 : Bath_towel_set 値段 : 2500 商品コード : TEA-20 商品名 : Koutya_tsumeawase 値段 : 5000 商品コード : THY-55 商品名 : Koutya_hachimitsu_tsumeawase 値段 : 3000 商品コード : SPO-22 商品名 : Tyoumiryo_variety_set 値段 : 4000
ソースコード
http://www.ritsumei.ac.jp/~cm011045/task2/kadai1-3.c
#include <stdio.h> int c; /* 文字バッファ */ int line; /* 何行目か (0 origin) */ int pos; /* (要素の最初から数えて)何文字目か (0 origin) */ FILE *fp; /* 読み込みファイル */ struct gift{ /* 商品データ */ char name[40], code[10], price[5]; }; int main(void) { struct gift gifts[100]; fp = fopen("gifts", "r"); while(1) { /* 行の一文字目を読み込み、それがEOFであれば終了 そうでなければ通常の処理 */ c = getc(fp); if(c == EOF) { break; } gifts[line].code[0] = c; pos = 1; while((c = getc(fp)) != ' ') { gifts[line].code[pos] = c; pos++; } gifts[line].code[pos] = '\0'; pos = 0; while((c = getc(fp)) != ' ') { gifts[line].name[pos] = c; pos++; } gifts[line].name[pos] = '\0'; pos = 0; while((c = getc(fp)) != '\n') { gifts[line].price[pos] = c; pos++; } gifts[line].price[pos] = '\0'; /* 出力 */ printf(" 商品コード : %s\n", gifts[line].code); printf(" 商品名 : %s\n", gifts[line].name); printf(" 値段 : %s\n\n", gifts[line].price); pos++; }; close(fp); return(0); }
課題3-2:ポインタと文字列 (2)
概要
標準入力から入力された英文を読み込み、部分文字列「th」および「Th」がいくつマッチするかを数え、それらをすべて「++」に置き換えて出力するスクリプト。
英文を一文字ずつ(二文字ずつ?)読み込み、それを strcmp 関数でチェックしている。
プログラムの起動方法
(原因不明のバグがあります。実行できません)
実行結果
Input english sentence<< That's right. ^D セグメントエラー
ソースコード
http://www.ritsumei.ac.jp/~cm011045/task2/kadai3-2.c
#include <stdio.h> #include <string.h> int pos; /* textの何文字目を読み込んでいるか */ int count; /* 検索ヒット数 */ char text[2000]; /* 入力された英文 */ char scope[2]; /* 比較対象 */ char pattern1[2], pattern2[2]; pattern1[0] = 'T'; pattern1[1] = 'h'; pattern2[0] = 't'; pattern2[1] = 'h'; int main(void) { printf("Input english sentence <<\n"); scanf("%s", &text); count = 0; for(pos = 0; text[pos] != EOF; pos++) { scope[0] = text[pos]; scope[1] = text[pos+1]; /* scopeに比較対象となる2文字を代入 */ if((strcmp(scope, pattern1) == 0) || (strcmp(scope, pattern2) == 0)) { text[pos] = '+'; text[pos+1] = '+'; count++; } } /* 出力 */ printf("\nOutput>>%s\n", text); printf("\n Letters: %d\n \"th\" matches: %d\n\n", pos, count); }
課題4-2:字句解析 (1)
概要
特定の型式に従った二項演算式を、各項と演算子に分けて出力するプログラム。与えられた式を文字列として取得し、それを一文字ずつチェックしている。
一応、間にスペース等が入っていても正常に動作する。
プログラムの起動方法
プログラムを実行する。
実行結果
Input expr << 30*27 Operand 1: 30 Operator: * Operand 2: 27
ソースコード
http://www.ritsumei.ac.jp/~cm011045/task2/kadai4-2.c
#include <stdio.h> int i; /* ループカウンタ */ int pos = 0; /* exprの何文字目を読み込んでいるか(0 origin) */ char expr[20]; /* 入力された式 */ char opr1[10]; /* 左側の数字列 */ char opr2; /* 演算子 */ char opr3[10]; /* 右側の数字列 */ int isoperator(char c) { /* 文字cが演算子であるかどうかを判定する */ switch(c) { case '+': case '-': case '*': case '/': return(1); default: return(0); } } int main(void) { printf("Input expr << "); scanf("%s", &expr); for(i = 0; !isoperator(expr[pos]); i++) { opr1[i] = expr[pos]; pos++; } opr2 = expr[pos]; pos++; for(i = 0; expr[pos] != '\0'; i++) { opr3[i] = expr[pos]; pos++; } /* 出力 */ printf(" Operand 1: %s\n Operator: %c\n Operand 2: %s\n\n", opr1, opr2, opr3); return(0); }
2630040115-4 一回生 西山大輔
penis extender devices penis extender http://www.cheappenisextenders.com