情報処理5レポート課題(1)の解答例

更新:2009年4月28日


  1. 以下のプログラムstruct.cのmain関数内で宣言されている配列info4の要素数を2つ以上増やして名前を設定し、 実行結果を確認してください。
    struct.c
    #include<stdio.h>
    
    /* 構造体Students型の定義の始まり */
    struct Students{
    	char *name;
    	double exam;
    	int absence;
    };
    /* 構造体Students型の定義の終わり */
    
    int main(void){
    	int StudentsNumber=3, i;
    /* 構造体Students型を3個要素に持つ配列info4の宣言↓ */
    	struct Students info4[3];	
    
    	/* 構造体Students型配列info4の各要素のメンバnameに代入の始まり */
    	info4[0].name="Meg Ryan";
    	info4[1].name="Julia Roberts";
    	info4[2].name="Gwyneth Partrow";
    	/* 構造体Students型配列info4の各要素のメンバnameに代入の終わり */
    
    	/* 構造体Students型配列info4の各要素のメンバexamに標準入力の始まり */
    	for(i=0;i<StudentsNumber;i++){
    		printf("Input the Examination Points(double) for %s\n",
    			info4[i].name);
    		scanf("%lf", &(info4[i].exam));
    	}
    	/* 構造体Students型配列info4の各要素のメンバexamに標準入力の終わり */
    
    	/* 構造体Students型配列info4の各要素のメンバabsenceに標準入力の始まり */
    	for(i=0;i<StudentsNumber;i++){
    		printf("Input the Absence Times(int) for %s\n", info4[i].name);
    		scanf("%d", &(info4[i].absence));
    	}
    	/* 構造体Students型配列info4の各要素のメンバabsenceに標準入力の終わり */
    
    	/* 構造体Students型配列info4の各要素の総合点を標準出力の始まり */
    	printf("Total Points are:\n");
    	for(i=0;i<StudentsNumber;i++){
    		printf("%s: %f\n", info4[i].name, info4[i].exam-10.0*(double)info4[i].absence);
    	}
    	/* 構造体Students型配列info4の各要素の総合点を標準出力の終わり */
    
    	return 0;
    }
    

    struct_add2obj.c
    #include<stdio.h>
    
    /* 構造体Students型の定義の始まり */
    struct Students{
    	char *name;
    	double exam;
    	int absence;
    };
    /* 構造体Students型の定義の終わり */
    
    int main(void){
    	int StudentsNumber=5, i;
    /* 構造体Students型を3個要素に持つ配列info4の宣言↓ */
    	struct Students info4[5];	
    
    	/* 構造体Students型配列info4の各要素のメンバnameに代入の始まり */
    	info4[0].name="Meg Ryan";
    	info4[1].name="Julia Roberts";
    	info4[2].name="Gwyneth Partrow";
    	info4[3].name="Yuchi Kanzawa";
    	info4[4].name="Gonbe Nanashino";
    	/* 構造体Students型配列info4の各要素のメンバnameに代入の終わり */
    
    	/* 構造体Students型配列info4の各要素のメンバexamに標準入力の始まり */
    	for(i=0;i<StudentsNumber;i++){
    		printf("Input the Examination Points(double) for %s\n",
    			info4[i].name);
    		scanf("%lf", &(info4[i].exam));
    	}
    	/* 構造体Students型配列info4の各要素のメンバexamに標準入力の終わり */
    
    	/* 構造体Students型配列info4の各要素のメンバabsenceに標準入力の始まり */
    	for(i=0;i<StudentsNumber;i++){
    		printf("Input the Absence Times(int) for %s\n", info4[i].name);
    		scanf("%d", &(info4[i].absence));
    	}
    	/* 構造体Students型配列info4の各要素のメンバabsenceに標準入力の終わり */
    
    	/* 構造体Students型配列info4の各要素の総合点を標準出力の始まり */
    	printf("Total Points are:\n");
    	for(i=0;i<StudentsNumber;i++){
    		printf("%s: %f\n", info4[i].name, info4[i].exam-10.0*(double)info4[i].absence);
    	}
    	/* 構造体Students型配列info4の各要素の総合点を標準出力の終わり */
    
    	return 0;
    }
    
  2. 上のプログラムstruct.cの構造体struct Students のデータメンバを2つ以上増やして、 それらのメンバをscanf入力するプログラムを追加して、 実行確認してください。
    struct_add2member.c
    #include<stdio.h>
    
    /* 構造体Students型の定義の始まり */
    struct Students{
    	char *name;
    	double exam;
    	double exam2;
    	double report;
    	int absence;
    };
    /* 構造体Students型の定義の終わり */
    
    int main(void){
    	int StudentsNumber=3, i;
    /* 構造体Students型を3個要素に持つ配列info4の宣言↓ */
    	struct Students info4[3];	
    
    	/* 構造体Students型配列info4の各要素のメンバnameに代入の始まり */
    	info4[0].name="Meg Ryan";
    	info4[1].name="Julia Roberts";
    	info4[2].name="Gwyneth Partrow";
    	/* 構造体Students型配列info4の各要素のメンバnameに代入の終わり */
    
    	/* 構造体Students型配列info4の各要素のメンバexamに標準入力の始まり */
    	for(i=0;i<StudentsNumber;i++){
    		printf("Input the Mid-Term Examination Points(double) for %s\n",
    			info4[i].name);
    		scanf("%lf", &(info4[i].exam));
    	}
    	/* 構造体Students型配列info4の各要素のメンバexamに標準入力の終わり */
    
    	/* 構造体Students型配列info4の各要素のメンバexam2に標準入力の始まり */
    	for(i=0;i<StudentsNumber;i++){
    		printf("Input the Final Examination Points(double) for %s\n",
    			info4[i].name);
    		scanf("%lf", &(info4[i].exam2));
    	}
    	/* 構造体Students型配列info4の各要素のメンバexam2に標準入力の終わり */
    
    	/* 構造体Students型配列info4の各要素のメンバreportに標準入力の始まり */
    	for(i=0;i<StudentsNumber;i++){
    		printf("Input the Report Points(double) for %s\n",
    			info4[i].name);
    		scanf("%lf", &(info4[i].report));
    	}
    	/* 構造体Students型配列info4の各要素のメンバexam2に標準入力の終わり */
    
    	/* 構造体Students型配列info4の各要素のメンバabsenceに標準入力の始まり */
    	for(i=0;i<StudentsNumber;i++){
    		printf("Input the Absence Times(int) for %s\n", info4[i].name);
    		scanf("%d", &(info4[i].absence));
    	}
    	/* 構造体Students型配列info4の各要素のメンバabsenceに標準入力の終わり */
    
    	/* 構造体Students型配列info4の各要素の総合点を標準出力の始まり */
    	printf("Total Points are:\n");
    	for(i=0;i<StudentsNumber;i++){
    		printf("%s: %f\n", info4[i].name, 0.4*info4[i].exam+0.4*info4[i].exam2+0.2*info4[i].report-10.0*(double)info4[i].absence);
    	}
    	/* 構造体Students型配列info4の各要素の総合点を標準出力の終わり */
    
    	return 0;
    }
    
  3. 鉛筆の硬度(整数)、メーカ(char型16個の要素を持つ配列)、 型番(char型16個の要素を持つ配列)、 単価を保持する構造体を定義して、 2,3種類の鉛筆の各情報をscanf入力して画面出力するプログラムを作成してください。 ただし、プログラム実行時にメーカ、型番の入力については14文字以内に抑えてください。)
    struct_pencil.c
    #include<stdio.h>
    
    /* 構造体Students型の定義の始まり */
    struct Pencil{
    	char Brand[16], Type[16];
    	double Price;
    	int Hardness;
    };
    /* 構造体Students型の定義の終わり */
    
    int main(void){
    	int PencilNumber=3, i;
    /* 構造体Students型を3個要素に持つ配列info4の宣言↓ */
    	struct Pencil in_myshop[3];	
    
    	/* 構造体Pencil型配列in_myshopの各要素の各メンバに標準入力の始まり */
    	for(i=0;i<PencilNumber;i++){
    		/***↓本当はfgets関数を用いた方が良い***/
    		printf("Brand:");
    		scanf("%s", in_myshop[i].Brand);
    		printf("Type:");
    		scanf("%s", in_myshop[i].Type);
    		printf("Price:");
    		scanf("%lf", &(in_myshop[i].Price));
    		printf("Hardness:");
    		scanf("%d", &(in_myshop[i].Hardness));
    	}
    	/* 構造体Pencil型配列in_myshopの各要素の各メンバに標準入力の終り */
    
    	/* 構造体Pencil型配列in_myshopの各要素の各メンバに標準出力の始まり */
    	for(i=0;i<PencilNumber;i++){
    		printf("Brand:%sType:%sPrice:%f\tHardness:%d\n",
    			in_myshop[i].Brand,
    			in_myshop[i].Type,
    			in_myshop[i].Price,
    			in_myshop[i].Hardness);
    	}
    
    	return 0;
    }
    
    本当はscanf関数でなくfgets関数やsscanf関数を用いた方がバッファオーバーフローの危険を回避できます。

na1/