本講義では 2 通のレポートで評価します。 レポートは A4 縦の様式で PDF 形式で作成して下さい。 またプログラムは C 言語で作成しなさい。
p = find(item[i].day, item[i].period, list);
kadai20252.zip をダウンロードせず、上記の部分だけ訂正して使用しても構
いません。
解答法は課題1と同等である。 但し、課題1で作成したプログラムを使用、結合して良く、またその際には、 課題1のプログラムの詳細の説明は省いてよい。
問題の最後に、本課題で必要なヘッダファイル kadai2.h とテスト用のプログラム kadai2.c と Makefile を示す。 課題で作成する関数は「関数名.c」というファイルに入れられる前提としている。
本課題で使用するヘッダファイル kadai2.h (後述)には次の構造体が定義されてい る。
typedef struct kamokulist {
struct kamokulist * next;
Kamoku * kamoku;
} KamokuList;
これを使用した線形リストを処理するプログラムを作成する
KamokuList を用いて作成した線形リストについて、
順に各科目を表示して改行するのを繰り返す
void printkamokulist(KamokuList* k)
をprintkamokulist.cというファイルに作成せよ。
なお、空のリストを受け取った場合は、改行のみすることとする。
なお作成にあたって、課題1で作成した printkamoku などの関数を使用して良い。
これと、下記のテストプログラム, kadai1.h, kadai2.h, kadai1.c, kadai2.c を結合して実行し、出力結果を示せ。
#include "kadai2.h"
int main(void){
printkamokulist(&l0);
printkamokulist(&l1);
printkamokulist(&l2);
printkamokulist(&l3);
printkamokulist(&l4);
return 0;
}
thu 6 データ構造とアルゴリズム sat 3 マルチメディア表現技術の基礎および演習 thu 6 データ構造とアルゴリズム sat 4 コンピュータ基礎および演習III sat 3 マルチメディア表現技術の基礎および演習 thu 6 データ構造とアルゴリズム sat 5 微分方程式I sat 4 コンピュータ基礎および演習III sat 3 マルチメディア表現技術の基礎および演習 thu 6 データ構造とアルゴリズム
KamokuList を用いて作成した線形リストに対して、曜日と時限を指定して、
リスト内を検索し、該当の科目の入っている
KamokuList のポインターを返す
KamokuList* findlist(int day, int period, KamokuList* list)
を findlist.c というファイルに作成せよ。
なお、見つからなかった場合は NULL(stdlib.hに定義されている) を返すこ
ととする。
これと、下記のテストプログラム, kadai1.h, kadai2.h, kadai1.c, kadai2.c を結合して実行し、出力結果を示せ。
#include <stdio.h>
#include <stdlib.h>
#include "kadai2.h"
typedef struct pair {
int day;
int period;
} PAIR;
int main(void){
KamokuList *l;
PAIR p[]={{6,3},{4,6},{2,1},{6,5},{-1}};
PAIR *q;
for(q=p;q->day!=-1; q++){
l=findlist(q->day,q->period,&l4);
if(l!=NULL){
printkamoku(l->kamoku);
printf("\n");
}else{
printf("見つかりません\n");
}
}
return 0;
}
sat 3 マルチメディア表現技術の基礎および演習 thu 6 データ構造とアルゴリズム 見つかりません sat 5 微分方程式I
KadaiList の空のノードを作る関数
KadaiList*
をnewnode
newlist
(void)newnode
newlist
.cというファイルに作成せよ。
なお作れなかったときは NULL を返すこと。
これと、下記のテストプログラム, printkamokulist.c, (printkamoku.c), kadai1.h, kadai2.h, kadai1.c を結合して実行し、出力結果を示せ。
#include <stdio.h>
#include <stdlib.h>
#include "kadai2.h"
int main(void){
int i,j;
KamokuList * l[20];
l[0]=newlist();
for(i=1; list[i].day!=-1; i++){
l[i]=newlist();
l[i]->next=l[i-1];
l[i]->kamoku = list+i;
}
printkamokulist(l[i-1]);
for(j=i-1;j>=0;j--){
free(l[j]);
}
return 0;
}
fri 7 電磁気学の基礎および演習 thu 7 電磁気学の基礎および演習 wed 7 コンピュータ構成と機械語 tue 7 エレクトロニクスの基礎 mon 7 情報通信基礎実験I sat 6 微分方程式I fri 6 信号理論(NC) tue 6 基礎情報数学B(確率と情報) mon 6 情報通信基礎実験I sat 5 微分方程式I sat 4 コンピュータ基礎および演習III sat 3 マルチメディア表現技術の基礎および演習
Kamoku を指すポインター lを KamokuList で作成された線形リストの管理変
数 list の先頭に追加する
関数KamokuList* addkamoku(Kamoku* l, KamokuList* list)
をaddkamoku.cというファイルに作成せよ。
なお、戻り値として、新たな要素を追加した KamokuListのポインタを返すこと。
また追加が出来なかったときは NULL を返すこと。
これと、下記のテストプログラム, newnode
newlist
.c, printkamokulist.c, (printkamoku.c), kadai1.h, kadai2.h, kadai1.c を結合して実行し、出力結果を示せ。
#include <stdio.h>
#include <stdlib.h>
#include "kadai2.h"
void dellist(KamokuList*p){
if(p->next !=NULL){
dellist(p->next);
}
free(p);
}
int main(void){
KamokuList *l=newlist();
KamokuList *v;
Kamoku *q;
for(q=list;q->day!=-1; q++){
v=addkamoku(q,l);
if(v!=NULL){
printkamoku(v->kamoku);
printf("\n");
}else{
fprintf(stderr,"メモリエラー\n");
}
}
printkamokulist(l);
dellist(l);
return 0;
}
thu 6 データ構造とアルゴリズム sat 3 マルチメディア表現技術の基礎および演習 sat 4 コンピュータ基礎および演習III sat 5 微分方程式I mon 6 情報通信基礎実験I tue 6 基礎情報数学B(確率と情報) fri 6 信号理論(NC) sat 6 微分方程式I mon 7 情報通信基礎実験I tue 7 エレクトロニクスの基礎 wed 7 コンピュータ構成と機械語 thu 7 電磁気学の基礎および演習 fri 7 電磁気学の基礎および演習 fri 7 電磁気学の基礎および演習 thu 7 電磁気学の基礎および演習 wed 7 コンピュータ構成と機械語 tue 7 エレクトロニクスの基礎 mon 7 情報通信基礎実験I sat 6 微分方程式I fri 6 信号理論(NC) tue 6 基礎情報数学B(確率と情報) mon 6 情報通信基礎実験I sat 5 微分方程式I sat 4 コンピュータ基礎および演習III sat 3 マルチメディア表現技術の基礎および演習 thu 6 データ構造とアルゴリズム
#include "kadai1.h"
typedef struct kamokulist {
struct kamokulist * next;
Kamoku * kamoku;
} KamokuList;
extern KamokuList l0;
extern KamokuList l1;
extern KamokuList l2;
extern KamokuList l3;
extern KamokuList l4;
KamokuList* newlist(void);
void printkamokulist(KamokuList *k);
KamokuList* findlist(int day, int period, KamokuList* list);
KamokuList* addkamoku(Kamoku* l, KamokuList* list);
#include <stdlib.h>
#include "kadai2.h"
KamokuList l0={NULL};
KamokuList l1={&l0, list};
KamokuList l2={&l1, list+1};
KamokuList l3={&l2, list+2};
KamokuList l4={&l3, list+3};
$(CC) -o $@ $^
の $(CC) の前には TAB 記号が一つ
だけ入っていることに注意する。これが空白記号に置き換わっていると動作しない。
kadai24.exe: kadai24.o addkamoku.o printkamokulist.o newlist.o
$(CC) -o $@ $^
kadai23.exe: kadai23.o newlist.o printkamokulist.o
$(CC) -o $@ $^
kadai22.exe: kadai22.o findlist.o
$(CC) -o $@ $^
kadai21.exe: kadai21.o printkamokulist.o
$(CC) -o $@ $^
kadai24.exe: kadai1.o printkamoku.o
kadai23.exe: kadai1.o printkamoku.o
kadai22.exe: kadai1.o kadai2.o printkamoku.o
kadai21.exe: kadai1.o kadai2.o printkamoku.o
kadai24.o: kadai2.h
kadai23.o: kadai2.h
kadai22.o: kadai2.h
findlist.o: kadai2.h
kadai21.o: kadai2.h
printkamokulist.o: kadai2.h
newlist.o: kadai2.h
addkamoku.o: kadai2.h
kadai14.exe: kadai14.o kadai1.o printtable.o
$(CC) -o $@ $^
kadai13.exe: kadai13.o kadai1.o find.o printkamoku.o
$(CC) -o $@ $^
kadai12.exe: kadai12.o kadai1.o compkamoku.o printkamoku.o
$(CC) -o $@ $^
kadai11.exe: kadai11.o kadai1.o printkamoku.o
$(CC) -o $@ $^
kadai11.o: kadai1.h
kadai12.o: kadai1.h
kadai13.o: kadai1.h
kadai14.o: kadai1.h
printkamoku.o: kadai1.h
compkamoku.o: kadai1.h
find.o: kadai1.h
printtable.o: kadai1.h
なお、課題1でVisual Studio で開発した場合、次のような手順でプロジェ クトを追加し、課題2も開発できます。
解答法として、分割コンパイルによる別ファイルにプログラムを書く方 法と、下記のテストプログラムに関数を追記する方法の二通りがあるが、 どちらでも良い。 プログラムの解説は、自分で作成した関数について行うこと。 こちらで提供したテストプログラムの説明は基本的には不要である。 但し、自分で作成した関数を説明するのに必要な内容には言及すること。 また前問で作成した関数については自由に使用して良い。
問題とテストプログラムの改変は不合格である。 なお、こちらの提供したファイルやMakefile は使用してもしなくても良い。 また、プログラムを結合するためなどのやむを得ない必要な変更(include の代わりにプログラムを埋め込むなど)は許される。
問題の最後に、本課題で必要なヘッダファイル kadai1.h と Makefile を示す。また、 Visual Studio のソリューションを含む圧縮ファイルを置く。 課題で作成する関数は「関数名.c」というファイルに入れられる前提としている。
なお、課題1だけはレポートは締め切り後も提出できます。 同じファイル名で複数のバージョンが存在できます。 締め切り内に採点可能なレポートがある場合は、最も締切に近いものだけを採 点します。 締め切り内に有効なレポートがない場合、最も新しいレポートを遅れレポー トとして減点の上採点します。
kadai1.h には本課題に必要な宣言が含まれている。 まず、 構造体 Kamoku は次のように定義されている。
typedef struct kamoku {
int day;
int period;
char* name;
} Kamoku;
またグローバル変数として、 Kamoku の配列 list (番兵として最後に day=-1 となっている要素が含まれる) と 0→ sun, 1→ mon, ..., 6→ sat という、数から曜日を得る配列 youbi が次のように extern されている。
extern Kamoku list[];
extern char* youbi[];
この他、課題で必要な、関数のプロトタイプ宣言が含まれている。 また、kadai1.c には list, youbi の定義が含まれているため、 各問題で作成したプログラムを実行するには kadai1.c を結合する必要があ る。
Kamokuのポインターを受け取り、メンバーのうちの day については対応する
youbi 、 period はそのまま、 name は文字列として並べて表示する
void printkamoku(Kamoku *p)
を printkamoku.cというファイルに作成せよ。
これと、下記のテストプログラム, kadai1.h, kadai1.c を結合して実行し、出 力結果を示せ。
#include <stdio.h>
#include "kadai1.h"
int main(void){
Kamoku *p;
for(p=list; p->day!=-1; p++){
printkamoku(p);
printf("\n");
}
return 0;
}
thu 6 データ構造とアルゴリズム sat 3 マルチメディア表現技術の基礎および演習 sat 4 コンピュータ基礎および演習III sat 5 微分方程式I mon 6 情報通信基礎実験I tue 6 基礎情報数学B(確率と情報) fri 6 信号理論(NC) sat 6 微分方程式I mon 7 情報通信基礎実験I tue 7 エレクトロニクスの基礎 wed 7 コンピュータ構成と機械語 thu 7 電磁気学の基礎および演習 fri 7 電磁気学の基礎および演習
二つのKamokuを指すポインタを与えると、
日曜日を起点として、授業実施時間が順に並んでいる(曜日が早い、時限が
早い)時は負の整数、
逆順に並んでいる時は正の整数、
同じ時間であれば0を返す
int compkamoku(Kamoku *p, Kamoku *q)
関数を作成せよ。
この関数のファイル名を compkamoku.c とする。
これと、下記のテストプログラム, kadai1.h, kadai1.c, printkamoku.cを 結合して実行し、出力結果を示せ。
#include <stdio.h>
#include "kadai1.h"
int main(void) {
Kamoku* p;
Kamoku* q;
int result;
for (p = list; (q=p+1)->day != -1; p++) {
printkamoku(p);
printf("は");
printkamoku(q);
result = compkamoku(p, q);
if (result < 0) {
printf("の前");
}
else if (result == 0) {
printf("と同じ");
}
else {
printf("の後ろ");
}
printf("\n");
}
return 0;
}
thu 6 データ構造とアルゴリズムはsat 3 マルチメディア表現技術の基礎および演習の前 sat 3 マルチメディア表現技術の基礎および演習はsat 4 コンピュータ基礎および演習IIIの前 sat 4 コンピュータ基礎および演習IIIはsat 5 微分方程式Iの前 sat 5 微分方程式Iはmon 6 情報通信基礎実験Iの後ろ mon 6 情報通信基礎実験Iはtue 6 基礎情報数学B(確率と情報)の前 tue 6 基礎情報数学B(確率と情報)はfri 6 信号理論(NC)の前 fri 6 信号理論(NC)はsat 6 微分方程式Iの前 sat 6 微分方程式Iはmon 7 情報通信基礎実験Iの後ろ mon 7 情報通信基礎実験Iはtue 7 エレクトロニクスの基礎の前 tue 7 エレクトロニクスの基礎はwed 7 コンピュータ構成と機械語の前 wed 7 コンピュータ構成と機械語はthu 7 電磁気学の基礎および演習の前 thu 7 電磁気学の基礎および演習はfri 7 電磁気学の基礎および演習の前
Kamokuの配列 array の中から、曜日番号、時限を指定して、
それに適合した Kamoku のポインタを返す
Kamoku* find(int day, int period, Kamoku* array)
関数を作成せよ。
なお、 array のデータの終わりには、番兵として day に -1 が入ってい
るとし、見つからなかった場合は NULL を返すとする。
この関数のファイル名を find.c とする。
(NULL は stdlib.h に定義されているものとする)。
これと、下記のテストプログラム, kadai1.h, kadai1.c, printkamoku.cを 結合して実行し、出力結果を示せ。
#include <stdio.h>
#include "kadai1.h"
typedef struct jigen {
int day;
int period;
}Jigen;
int main(void) {
Jigen item[] = { {4,6},{2,7},{3,6}, { 6,3 },{-1} };
Kamoku* p;
int i;
for (i = 0; item[i].day!= -1; i++) {
p = find(item[i].day, item[i].period, list);
if (p == NULL) {
printf("無し");
}
else {
printkamoku(p);
}
printf("\n");
}
return 0;
}
thu 6 データ構造とアルゴリズム tue 7 エレクトロニクスの基礎 無し sat 3 マルチメディア表現技術の基礎および演習
番兵として day=-1 である Kamoku の配列を与えると、
下記の出力例のようなフォーマットの時間割表を表示する
void printtable(Kamoku* array)
関数を作成せよ。
sun mon tue wed thu fri sat 1 2 3 マルチメ 4 コンピュ 5 微分方程 6 情報通信 基礎情報 データ構 信号理論 微分方程 7 情報通信 エレクト コンピュ 電磁気学 電磁気学
最上部に曜日の文字列、左に時限(1-7)を表示する。 各科目名は printf("%.12s\t",p == NULL?" ":p->name) で表示すると良い
これと、下記のテストプログラム, kadai1.h, kadai1.c を 結合して実行し、出力結果を示せ。
#include "kadai1.h"
int main(void) {
Kamoku list2[]={
{6,3,"情報通信ネットワークの基礎および演習"},
{6,4,"情報システムの基礎および演習"},
{1,6,"情報通信基礎実験II"},
{2,6,"エレクトロニクスの応用"},
{4,6,"信号システム解析(NC)"},
{5,6,"論理回路および論理設計(NC)"},
{1,7,"情報通信基礎実験II"},
{2,7,"基礎情報数学C(代数と符号)"},
{3,7,"インターネットプログラミング"},
{4,7,"電磁気学の応用"},
{5,7,"通信工学の基礎"},
{-1}};
printtable(list);
printtable(list2);
return 0;
}
sun mon tue wed thu fri sat 1 2 3 マルチメ 4 コンピュ 5 微分方程 6 情報通信 基礎情報 データ構 信号理論 微分方程 7 情報通信 エレクト コンピュ 電磁気学 電磁気学 sun mon tue wed thu fri sat 1 2 3 情報通信 4 情報シス 5 6 情報通信 エレクト 信号シス 論理回路 7 情報通信 基礎情報 インター 電磁気学 通信工学
typedef struct kamoku {
int day;
int period;
char* name;
} Kamoku;
extern Kamoku list[];
extern char* youbi[];
void printkamoku(Kamoku *k);
int compkamoku(Kamoku* p, Kamoku* q);
Kamoku* find(int day, int period, Kamoku* list);
void printtable(Kamoku* l);
#include "kadai1.h"
char* youbi[]={"sun","mon","tue","wed","thu","fri","sat"};
Kamoku list[] = { {4,6,"データ構造とアルゴリズム"},
{6,3,"マルチメディア表現技術の基礎および演習"},
{6,4,"コンピュータ基礎および演習III"},
{6,5,"微分方程式I"},
{1,6,"情報通信基礎実験I"},
{2,6,"基礎情報数学B(確率と情報)"},
{5,6,"信号理論(NC)"},
{6,6,"微分方程式I"},
{1,7,"情報通信基礎実験I"},
{2,7,"エレクトロニクスの基礎"},
{3,7,"コンピュータ構成と機械語"},
{4,7,"電磁気学の基礎および演習"},
{5,7,"電磁気学の基礎および演習"},{-1} };
$(CC) -o $@ $^
の $(CC) の前には TAB 記号が一つ
だけ入っていることに注意する。これが空白記号に置き換わっていると動作しない。
kadai14.exe: kadai14.o kadai1.o printtable.o
$(CC) -o $@ $^
kadai13.exe: kadai13.o kadai1.o find.o printkamoku.o
$(CC) -o $@ $^
kadai12.exe: kadai12.o kadai1.o compkamoku.o printkamoku.o
$(CC) -o $@ $^
kadai11.exe: kadai11.o kadai1.o printkamoku.o
$(CC) -o $@ $^
kadai11.o: kadai1.h
kadai12.o: kadai1.h
kadai13.o: kadai1.h
kadai14.o: kadai1.h
printkamoku.o: kadai1.h
compkamoku.o: kadai1.h
find.o: kadai1.h
printtable.o: kadai1.h
下記の操作をしたものをkadai20252.zipとし てダウンロードできます。 ダウンロードしたzipファイルをすべて解凍して、中の sln ファイルをダブ ルクリックすると使用できます。
なお、写したと思われるほど酷似したレポートが複数提出された場合、原著が どれかの調査を行わず、抽選で一通のレポートのみを評価 の対象とし、他は提出済みの不合格レポートとして再提出は課しません。 自分で意図せずに他人にコピーされてしまった場合も同様ですので、レポート の取り扱いについては十分に注意して下さい。