本講義では以下の 2 通のレポートで評価する。 レポートは A4 の紙を縦に使い、適宜表紙を付けて提出すること。 またプログラムは C 言語で作成しなさい。
レポート締切日: 2006年11月16日(木)20:00
提出先: 授業中に直接手渡し、またはレポートボックス
次の 3 つの課題を合わせて行い、報告しなさい。
なお、遅れレポートは教員に直接提出してください。 遅れた方が有利にならない範囲内で採点します。
次の条件を満たす関数 dispArray() を作りなさい。
例えば整数型の配列 a[] が 1 から 15 まで順に入っていて、最後に -1 が入っ ている時、dispArray(a) は次のような出力をする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
なお、実際に関数を作成したら、このデータを与えるテストプログラムを作り、 正常に動作することを確認し、報告すること。
次の条件を満たす関数 square() を作りなさい。
例えば 1, 2, 3, -1 という配列の先頭番地と 3 を square() に与えると 1, 1, 0, -1 となります。
課題 1-1, 1-2 で作成した dispArray(), square() に対して次のプログラム を結合して動かし、結果を報告しなさい。 また、なぜそのような出力が得られるのか、手計算で計算の要領を示すなどし て、説明しなさい。
#include <stdio.h>
void dispArray(int *p);
void square(int *p, int n);
#define N 64
int main(void){
int *a[5];
int b[]={-1};
int c[]={1,-1};
int d[]={1,2,3,-1};
int e[N+1];
int size[]={1,2,4,N+1};
int i,j;
for(i=0;i<N;i++){
e[i]=i;
}
e[N]=-1;
a[0]=b; a[1]=c; a[2]=d; a[3]=e; a[4]=NULL;
for(i=0;a[i]!=NULL;i++){
dispArray(a[i]);
for(j=0;j</* 学籍番号の下三桁 */; j++){
square(a[i],size[i]-1);
}
dispArray(a[i]);
}
return 0;
}
レポート締切日: 2007年1月11日(木)20:00 但し、 4 年生以上で卒業するため にどうしても単位が必要な人は、冬休み中にやりとり可能なメールアドレ スをレポート表紙に書いて 2006年12月21日(木)までに出して下さい。
提出先: レポートボックス
問題: 可変長文字列ライブラリ作成し、テストを行いたい。以下の課題に答えなさい。
以下の仕様を満たす strsize, addchararray,appendstr,fputstr を作成しなさい。
#include <stdio.h>
typedef struct slist {
char moji;
struct slist *next;
} SLIST;
typedef struct str {
SLIST *begin, *end;
int size;
} STR;
STR* newstr(void);
int strsize(STR *s);
int addchar(STR *s, char c);
int addchararray(STR *s,char *c);
void appendstr(STR *s, STR *t);
int fputstr(FILE *fh, STR *s);
#define putstr(s) fputstr(stdout,s)
#include <stdio.h>
#include <stdlib.h>
#include "str.h"
STR* newstr(void){
STR *newstr;
SLIST *newlist;
newlist=(SLIST*)malloc(sizeof(SLIST));
if(newlist==NULL){
return NULL;
}
newstr=(STR*)malloc(sizeof(STR));
if(newstr==NULL){
free(newlist);
return NULL;
}
newlist->next=NULL;
newstr->begin=newstr->end=newlist;
newstr->size=0;
return newstr;
}
int addchar(STR *s, char c){
SLIST *newlist;
newlist = (SLIST*) malloc(sizeof(SLIST));
if(newlist==NULL){return 0;}
s->size++;
newlist->moji=c;
newlist->next=NULL;
s->end->moji=c;
s->end->next=newlist;
s->end=newlist;
return 1;
}
int strsize(STR *s){
/*自分で作る*/
}
int addchararray(STR *s,char *c){
/* 自分で作る */
}
void appendstr(STR *s, STR *t){
/*自分で作る*/
free(t);
}
int fputstr(FILE *fh, STR *s){
/* 自分で作る */
}
作成したライブラリを使用した下記のサンプルプログラムを動かし、結果を報告しなさい。
#include <stdio.h>
#include "str.h"
#define nullcheck(a) if((a)==NULL){fprintf(stderr,"memory error\n");return 1;}
#define zerocheck(a) if(!(a)){fprintf(stderr,"memory error\n");return 1;}
int main(void){
STR *s1, *s2;
nullcheck(s1=newstr());
nullcheck(s2=newstr());
zerocheck(addchararray(s1,"abcdef"));
zerocheck(addchararray(s2,"ghijklmn"));
printf("文字列");
putstr(s1);
printf("(長さ %d)",strsize(s1));
printf("と文字列");
putstr(s2);
printf("(長さ %d)",strsize(s2));
printf("を接続したら、文字列");
appendstr(s1,s2);
putstr(s1);
printf("(長さ %d)になります。\n",strsize(s1));
return 0;
}
fprintf は出力した文字数を返します。