} else if (p1->right >= Max) { printf("\n不好意思,借书数目已满!不能借书!\n按任意键返回...."); goto END; } else if (strcmp(p1->borrow[0].borrow_book_num, "0") != 0) { //此读者若已经借书,再判断此读者是否要借两本一样的书 for (i = 0; i < Max; i++) { //遍历一次读者所借的书,如果发现有重复,则结束 if (strcmp(p1->borrow[i].borrow_book_num, bo_num) == 0) { printf("\n抱歉!同一个读者不能同借两本相同的书!\n"); goto END; } }
时间: 2024-04-20 13:26:47 浏览: 56
这段代码是用于检查读者借书数量、是否已借相同书籍的情况。下面是代码的说明:
1. 使用`else if`条件语句,首先判断当前节点的已借书籍数量是否达到最大限制(`p1->right >= Max`)。如果满足这个条件,表示读者已经借满书籍,输出相应的提示信息"不好意思,借书数目已满!不能借书!",并跳转到代码结尾的标签`END`。
2. 接下来是另一个`else if`条件语句,判断当前节点的第一个借书记录的图书编号是否为"0"。如果不为"0",说明读者已经借过书,并且需要进一步判断是否借了相同的书籍。
3. 使用`for`循环遍历读者已借书籍的记录数组。如果发现其中有与待借图书编号相同的记录(`strcmp(p1->borrow[i].borrow_book_num, bo_num) == 0`),则输出提示信息"抱歉!同一个读者不能同时借两本相同的书!",并跳转到代码结尾的标签`END`。
需要注意的是,同样建议避免使用`goto`语句来跳转到标签`END`,可以使用更合适的控制结构来处理错误情况。
相关问题
#include<stdio.h> int *Max(int x, int y) { int *p1,*p2; p1=&x; p2=&y; if (x>=y) return (p1); else return (p2); } int main() { int a, b, *max; printf("请输入a、b的值:\n"); scanf("%d%d",&a,&b); max = Max(a, b); printf("较大数的地址为%d", max); return 0; }解释这个代码
这段代码实现了找出两个数中的较大值,并返回其地址的功能。具体解释如下:
1. `int *Max(int x, int y)`:定义了一个函数 `Max`,参数为两个整数 `x` 和 `y`,返回值为整型指针。
2. `int *p1,*p2; p1=&x; p2=&y;`:定义了两个整型指针变量 `p1` 和 `p2`,并将它们分别指向 `x` 和 `y` 的地址。
3. `if (x>=y) return (p1); else return (p2);`:比较 `x` 和 `y` 的大小,如果 `x` 大于等于 `y`,则返回 `p1`(即 `x` 的地址),否则返回 `p2`(即 `y` 的地址)。
4. `max = Max(a, b);`:调用函数 `Max`,将返回值赋给 `max`,即将较大数的地址赋给 `max`。
5. `printf("较大数的地址为%d", max);`:输出较大数的地址。
注意,这段代码存在一个问题。在 `Max` 函数中,指针变量 `p1` 和 `p2` 分别指向了 `x` 和 `y` 的地址,但这两个变量在函数执行完毕后就被销毁了。因此,在 `main` 函数中输出 `max` 的值时,实际上是输出了一个已经被销毁的指针变量的地址,这是一种未定义的行为,可能会导致程序崩溃。正确的做法是在 `Max` 函数中使用 `static` 关键字定义静态指针变量,或者在 `main` 函数中使用动态内存分配函数 `malloc` 分配一个指针变量的内存空间并返回其地址。
运用c语言,基于三国人物关系数据,构建三国人物关系图。图的顶点为三国人物。边为人物关系(如儿子、义弟、主公)。本题需要实现在图结构上做的各种人物关系查询。人物的属性包括:人名、所属国。 如刘备(刘备,蜀国) 【功能】 1.基于邻接表构建三国人物关系图,并能输出展示邻接表。文件格式如下: 刘备-->张飞--->关羽--->赵云 注意:图的构建,应该先整理图中的顶点数据,即要整理所有三国人物数据作为图顶点。 2.统计人物关系数量最多的前10个三国人物及其所属国。 3.输入2个人物,查找2个人物之间所有关系。基于图的深度遍历,展示关系路径。并能说明最短路径是哪条。答辩时候展示:有关系的人物。无关系的人物。 4.智能问答。输入荀彧的主公的儿子是谁?能输出关系路径,并给出答案。
好的,这是一个较为复杂的问题,我会尽力回答。
首先,根据题目要求,我们需要使用邻接表来构建三国人物关系图。邻接表是由一个动态数组和若干个链表组成的数据结构,其中动态数组中存储的是图的顶点,每个顶点对应一个链表,链表中存储的是该顶点所连的所有边。
我们可以定义一个结构体表示三国人物:
```
typedef struct {
char name[20]; // 人名
char country[10]; // 所属国
} Person;
```
然后,我们可以定义一个链表节点表示边:
```
typedef struct EdgeNode {
int adjvex; // 邻接点下标
int relation; // 关系类型(如儿子、义弟、主公)
struct EdgeNode *next; // 指向下一个链表节点的指针
} EdgeNode;
```
最后,我们可以定义一个图结构体,包含一个动态数组和一个整数表示顶点数量:
```
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef struct {
Person vexs[MAX_VERTEX_NUM]; // 顶点数组
EdgeNode *adjlist[MAX_VERTEX_NUM]; // 邻接表
int vexnum; // 顶点数量
} Graph;
```
接下来,我们需要读入三国人物数据,并根据人物关系构建图。假设我们已经读入了三国人物数据,存储在一个数组 `persons` 中,数组长度为 `n`。那么构建图的代码如下:
```
void createGraph(Graph *G, Person *persons, int n) {
// 初始化图
G->vexnum = n;
for (int i = 0; i < n; i++) {
G->vexs[i] = persons[i];
G->adjlist[i] = NULL;
}
// 构建邻接表
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i != j && isRelationship(persons[i], persons[j])) {
// i 和 j 有关系,添加一条边
EdgeNode *edge = (EdgeNode *) malloc(sizeof(EdgeNode));
edge->adjvex = j;
edge->relation = getRelationship(persons[i], persons[j]);
edge->next = G->adjlist[i];
G->adjlist[i] = edge;
}
}
}
}
```
其中,`isRelationship` 函数用于判断两个人是否有关系,`getRelationship` 函数用于获取两个人的关系类型。
接下来,我们需要实现各种人物关系查询功能。
第一项功能要求输出展示邻接表。我们可以编写一个函数 `printGraph` 来实现:
```
void printGraph(Graph *G) {
for (int i = 0; i < G->vexnum; i++) {
printf("%s", G->vexs[i].name);
EdgeNode *edge = G->adjlist[i];
while (edge != NULL) {
printf("-->%s", G->vexs[edge->adjvex].name);
edge = edge->next;
}
printf("\n");
}
}
```
第二项功能要求统计人物关系数量最多的前10个三国人物及其所属国。我们可以编写一个函数 `getTop10` 来实现:
```
#define MAX_RELATION_NUM 100 // 最大关系数量
typedef struct {
char name[20]; // 人名
char country[10]; // 所属国
int relationNum; // 关系数量
} PersonWithRelationNum;
void getTop10(Graph *G, PersonWithRelationNum *result) {
// 统计每个人的关系数量
PersonWithRelationNum personsWithRelationNum[MAX_VERTEX_NUM];
for (int i = 0; i < G->vexnum; i++) {
personsWithRelationNum[i].relationNum = 0;
}
for (int i = 0; i < G->vexnum; i++) {
EdgeNode *edge = G->adjlist[i];
while (edge != NULL) {
personsWithRelationNum[i].relationNum++;
edge = edge->next;
}
}
// 获取关系数量最多的前10个人
for (int i = 0; i < 10; i++) {
int maxIndex = -1;
for (int j = 0; j < G->vexnum; j++) {
if (personsWithRelationNum[j].relationNum > 0 && (maxIndex == -1 || personsWithRelationNum[j].relationNum > personsWithRelationNum[maxIndex].relationNum)) {
maxIndex = j;
}
}
if (maxIndex != -1) {
result[i] = personsWithRelationNum[maxIndex];
personsWithRelationNum[maxIndex].relationNum = 0;
}
}
}
```
第三项功能要求输入2个人物,查找2个人物之间所有关系。我们可以先编写一个函数 `getPath` 来获取两个人之间的关系路径:
```
#define MAX_PATH_LENGTH 100 // 关系路径的最大长度
int visited[MAX_VERTEX_NUM]; // 用于记录顶点是否被访问过
char path[MAX_PATH_LENGTH][20]; // 用于记录关系路径
int pathLength; // 关系路径的长度
void dfs(Graph *G, int v, int w) {
visited[v] = 1;
if (v == w) {
// 找到了关系路径
for (int i = 0; i < pathLength; i++) {
printf("%s", path[i]);
if (i < pathLength - 1) {
printf("-->");
}
}
printf("\n");
} else {
// 继续深度遍历
EdgeNode *edge = G->adjlist[v];
while (edge != NULL) {
int u = edge->adjvex;
if (!visited[u]) {
path[pathLength++] = G->vexs[u].name;
dfs(G, u, w);
pathLength--;
}
edge = edge->next;
}
}
visited[v] = 0;
}
void getPath(Graph *G, Person p1, Person p2) {
// 初始化 visited 数组和 pathLength 变量
for (int i = 0; i < G->vexnum; i++) {
visited[i] = 0;
}
pathLength = 0;
// 找到 p1 和 p2 的下标
int v = -1, w = -1;
for (int i = 0; i < G->vexnum; i++) {
if (strcmp(G->vexs[i].name, p1.name) == 0 && strcmp(G->vexs[i].country, p1.country) == 0) {
v = i;
}
if (strcmp(G->vexs[i].name, p2.name) == 0 && strcmp(G->vexs[i].country, p2.country) == 0) {
w = i;
}
}
if (v == -1 || w == -1) {
// p1 或 p2 不存在于图中
printf("p1 或 p2 不存在于图中\n");
} else {
// 使用深度遍历查找关系路径
path[0] = p1.name;
dfs(G, v, w);
}
}
```
有了 `getPath` 函数,我们就可以编写第三项功能的函数 `findRelations` 了:
```
void findRelations(Graph *G, Person p1, Person p2) {
printf("关系路径:\n");
getPath(G, p1, p2);
printf("最短路径:\n");
// TODO: 输出最短路径
}
```
第四项功能要求实现智能问答。我们可以编写一个函数 `getRelationshipPath` 来获取两个人之间的关系路径,并返回答案:
```
char *getRelationshipPath(Graph *G, Person p1, Person p2) {
// 初始化 visited 数组和 pathLength 变量
for (int i = 0; i < G->vexnum; i++) {
visited[i] = 0;
}
pathLength = 0;
// 找到 p1 和 p2 的下标
int v = -1, w = -1;
for (int i = 0; i < G->vexnum; i++) {
if (strcmp(G->vexs[i].name, p1.name) == 0 && strcmp(G->vexs[i].country, p1.country) == 0) {
v = i;
}
if (strcmp(G->vexs[i].name, p2.name) == 0 && strcmp(G->vexs[i].country, p2.country) == 0) {
w = i;
}
}
if (v == -1 || w == -1) {
// p1 或 p2 不存在于图中
return "p1 或 p2 不存在于图中";
} else {
// 使用深度遍历查找关系路径
path[0] = p1.name;
dfs(G, v, w);
// 返回答案
char *answer = (char *) malloc(sizeof(char) * 100);
if (pathLength > 0) {
strcpy(answer, "关系路径:");
for (int i = 0; i < pathLength; i++) {
strcat(answer, path[i]);
if (i < pathLength - 1) {
strcat(answer, "-->");
}
}
strcat(answer, "。");
strcat(answer, p2.name);
strcat(answer, "是");
EdgeNode *edge = G->adjlist[v];
while (edge != NULL) {
if (edge->adjvex == w) {
switch (edge->relation) {
case 1:
strcat(answer, "他的儿子。");
break;
case 2:
strcat(answer, "他的义弟。");
break;
case 3:
strcat(answer, "他的主公。");
break;
}
}
edge = edge->next;
}
} else {
strcpy(answer, "p1 和 p2 之间没有关系。");
}
return answer;
}
}
```
有了 `getRelationshipPath` 函数,我们就可以编写第四项功能的函数 `answerQuestion` 了:
```
char *answerQuestion(Graph *G, char *question) {
// TODO: 解析问题,获取 p1 和 p2 的值
Person p1, p2;
// TODO: 查找 p1 的主公
Person lord;
// TODO: 获取 p1 主公的儿子
Person son;
char *answer;
if (/* question 是“荀彧的主公的儿子是谁?” */) {
p1 = /* 荀彧 */;
p2 = son;
answer = getRelationshipPath(G, p1, p2);
} else {
answer = "我不知道答案。";
}
return answer;
}
```
以上是基于题目要求的代码实现,但是还有很多细节需要处理,比如如何解析问题、如何判断两个人是否有关系、如何获取两个人的关系类型等。希望我的回答能对你有所帮助。
阅读全文