トップ 新規 編集 差分 一覧 Farm ソース 置換 検索 ヘルプ RSS ログイン

プログラ演習レポート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