プログラム設計様式試験二
11223 ワード
2回目の試験の主な内容は汎用アルゴリズムの設計で、問題量は前回の試験より少し大きい.
1、あるアルゴリズムは異なるデータ構造に適用することができて、これらの比較的に通用するアルゴリズムをデータ構造の中から独立して、予め定義した操作を異なるタイプのデータに作用させることができて、これによってタイプの安全性とプログラムの再利用性を高めることができて、これは?
答え:汎用技術
2、2つの変数の値を交換するには、汎用コードを設計するには、データを交換する関数のプロトタイプは?
答え:
3、2つの変数の値を交換するには、汎用アルゴリズム(任意のデータ型のデータを交換する)を実現するには、交換する2つのメモリ空間の値をメモリ管理関数でコピーすることができます.例えば、利用できますか?
答え:memcpy
4、
呼び出し文は?
答え:
5、指定されたデータ型の配列について、各要素のデータ型が既知であるため、各要素の値が占めるメモリ空間が既知であり、コンパイラは配列のヘッダアドレスと下付きスケールに基づいてある要素の実際のアドレスを計算することができる.
6、汎用探索関数
答え:検索するデータのデータ型が占めるバイト数
7、
答え:loc=(char*)a+i*m
8、ある値を検索するとき、データ型が分からない場合は、2つのメモリアドレスのビットモードでしか比較できません.例えばmemcmpを使用します.memcmpの呼び出しフォーマット:memcmp(メモリアドレス1、メモリアドレス2、比較するバイト数).この関数は2つのメモリブロックを比較し、ビットモードが同じ場合に戻りますか?
答え:0
9.汎用探索関数
正しい呼び出し文は?
答え:
10、異なるデータ型は同じmemcmpで実現され、簡単なデータ型に対しては問題なく、配列、構造体などの複雑なデータ構造に対して汎用性を失う.したがって、汎用検索関数の解決策の1つは、特定のデータ型の比較関数を転送するためのパラメータを追加することである.このような関数のプロトタイプは、
答え:比較関数へのポインタ
11.汎用探索関数
cmpは比較関数ですが、正しい呼び出し文は?
答え:
12、汎用スタックを実現するには、stackを設計し、タイプを以下のように定義する.
ここで、dは要素を指すポインタであり、nは要素個数、mはスタック容量、bは要素が占めるバイト数である.インスタック関数は?
答え:
13、汎用キューを実現するには、queueを設計し、タイプを以下のように定義する.
ここで、bufはキューのヘッダアドレスであり、frontはキューヘッダを指し、rearは対尾を指し、maxはキュー容量であり、sizeはキュー要素が占めるバイト数である.要素がキューから出る関数
答え:
1、あるアルゴリズムは異なるデータ構造に適用することができて、これらの比較的に通用するアルゴリズムをデータ構造の中から独立して、予め定義した操作を異なるタイプのデータに作用させることができて、これによってタイプの安全性とプログラムの再利用性を高めることができて、これは?
答え:汎用技術
2、2つの変数の値を交換するには、汎用コードを設計するには、データを交換する関数のプロトタイプは?
答え:
void swap(void *a, void *b, int size);
3、2つの変数の値を交換するには、汎用アルゴリズム(任意のデータ型のデータを交換する)を実現するには、交換する2つのメモリ空間の値をメモリ管理関数でコピーすることができます.例えば、利用できますか?
答え:memcpy
4、
void swap(void *a, void *b, int size)
関数を呼び出して2つの文字列を交換するchar *s1 = strdup("hello");
char *s2 = strdup("world");
呼び出し文は?
答え:
swap(&s1, &s2, sizeof(char *));
5、指定されたデータ型の配列について、各要素のデータ型が既知であるため、各要素の値が占めるメモリ空間が既知であり、コンパイラは配列のヘッダアドレスと下付きスケールに基づいてある要素の実際のアドレスを計算することができる.
6、汎用探索関数
void *search(void *a, void *k, int n, int m)
について、パラメータnは要素の個数を表し、mは何を表すのか.答え:検索するデータのデータ型が占めるバイト数
7、
void *search(void *a, void *k, int n, int m)
について、具体的な実装の際、1つの要素を検索するごとに、その要素のアドレスを先に計算する.i番目の要素のアドレス計算式は?答え:loc=(char*)a+i*m
8、ある値を検索するとき、データ型が分からない場合は、2つのメモリアドレスのビットモードでしか比較できません.例えばmemcmpを使用します.memcmpの呼び出しフォーマット:memcmp(メモリアドレス1、メモリアドレス2、比較するバイト数).この関数は2つのメモリブロックを比較し、ビットモードが同じ場合に戻りますか?
答え:0
9.汎用探索関数
void *search(void *a, void *k, int n, int m)
について、char *osl = {"dos", "win", "centos", "ubuntu", "mac"};
char *k = "linux";
正しい呼び出し文は?
答え:
int *r = NULL;
for (int j = 0; j < 5; j++) {
r = search(os[j], k, 5, sizeof(char));
if (r != NULL)
break;
}
10、異なるデータ型は同じmemcmpで実現され、簡単なデータ型に対しては問題なく、配列、構造体などの複雑なデータ構造に対して汎用性を失う.したがって、汎用検索関数の解決策の1つは、特定のデータ型の比較関数を転送するためのパラメータを追加することである.このような関数のプロトタイプは、
void *search(void *a, void *k, int n, int m, int (*compare)(void *, void *));
であり、compareは1つである.答え:比較関数へのポインタ
11.汎用探索関数
void *search(void *a, void *k, int n, int m, int (*compare)(void *, void *))
について、char *osl = {“dos", "win", "centos", "ubuntu", "mac"};
char *k = "linux";
cmpは比較関数ですが、正しい呼び出し文は?
答え:
search(os, &k, 5, sizeof(char *), cmp);
12、汎用スタックを実現するには、stackを設計し、タイプを以下のように定義する.
typedef struct {
int *d;
int n;
int m;
int b;
} stack;
ここで、dは要素を指すポインタであり、nは要素個数、mはスタック容量、bは要素が占めるバイト数である.インスタック関数は?
void push(stack *s, void *v) {
____;
____;
s->n++;
}
答え:
void *a = (char *)s->d + s->n * s->b;
memcpy(a, v, s->b);
13、汎用キューを実現するには、queueを設計し、タイプを以下のように定義する.
typedef struct {
void *buf;
int front, rear;
int max;
int size;
} queue;
ここで、bufはキューのヘッダアドレスであり、frontはキューヘッダを指し、rearは対尾を指し、maxはキュー容量であり、sizeはキュー要素が占めるバイト数である.要素がキューから出る関数
void out(queue *q, void *val)
のコードは?答え:
void *addr = (char *)q->buf + q->rear * q->size;
memcpy(val, addr, q->size);
q->rear++;