函数改造
这一部分内容是真的无语
修改inventory.c (点击下载)程序,使 inventory 和 num_parts 为 main 函数的局部变量。
#define NAME_LEN 25
#define MAX_PARTS 100
struct part {
int number;
char name[NAME_LEN+1];
int on_hand;
};
int read_line(char str[], int n);
int find_part(int number, const struct part inv[], int np);
void insert(struct part inv[], int *np);
void search(const struct part inv[], int np);
void update(struct part inv[], int np);
void print(const struct part inv[], int np);
该部分声明已包含在 “lab51.h”中。
给出了一个简易库存管理程序,可以搜索,添加等等,要把定义的结构体和一个num_parts变量改成局部变量
改造main函数
1.定义struct
struct part {
int number;
char name[NAME_LEN + 1];
int on_hand;
}inventory[MAX_PARTS];//以形式为part的结构体定义一个inventory
2.改switchcase中函数的传递参数,如
case 'i': insert(inventory,num_parts);
根据题目中有声明函数需要的参数(struct part inv[], int *np),故可以写出向他传递的参数
最终
int main()
{
char code;
struct part {
int number;
char name[NAME_LEN + 1];
int on_hand;
}inventory[MAX_PARTS];
int num_parts = 0;
for (;;) {
printf("Enter operation code: ");
scanf(" %c", &code);
while (getchar() != '\n') /* skips to end of line */
;
switch (code) {
case 'i': insert(inventory,num_parts);
break;
case 's': search(inventory,num_parts);
break;
case 'u': update(inventory,num_parts);
break;
case 'p': print(inventory,num_parts);
break;
case 'q': return 0;
default: printf("Illegal code\n");
}
printf("\n");
}
}
改造insert函数
1.在声明函数时,这句话
void insert(struct part inv[],int *np)
struct part是个名字,在函数中会使用inv[]提取需要的结构体中的东西。
用一个指针向num_parts传值,故用到num_parts的时候都是*np
2.注意此处find_part也会由于两个值不再是全局变量而需要通过参数来传值
~~~
写为find_part(part_number,inv,*np),且此时find_part应该为
int find_part(number,const struct part inv[], int *np)
//np传值为指针还是int须看每个函数中给出的参数是指针还是int??
{
int i;
for (i = 0; i < *np; i++)
if (inv[i].number == number)
return i;
return -1;
}
最终
void insert(struct part inv[],int *np)
{
int part_number;
if (*np == MAX_PARTS) {
printf("Database is full; can't add more parts.\n");
return;
}
printf("Enter part number: ");
scanf("%d", &part_number);
if (find_part(part_number,inv,*np) >= 0) {
printf("Part already exists.\n");
return;
}
inv[*np].number = part_number;
printf("Enter part name: ");
read_line(inv[*np].name, NAME_LEN);
printf("Enter quantity on hand: ");
scanf("%d", &inv[*np].on_hand);
(*np)++;
}
改造search函数
void search(const struct part inv[], int np)
{
int i, number;
printf("Enter part number: ");
scanf("%d", &number);
i = find_part(number,inv,np);
if (i >= 0) {
printf("Part name: %s\n", inv[i].name);
printf("Quantity on hand: %d\n", inv[i].on_hand);
} else
printf("Part not found.\n");
}
改造update函数
void update(struct part inv[], int np)
{
int i, number, change;
printf("Enter part number: ");
scanf("%d", &number);
i = find_part(number,inv,np);
if (i >= 0) {
printf("Enter change in quantity on hand: ");
scanf("%d", &change);
inv[i].on_hand += change;
} else
printf("Part not found.\n");
}
改造print函数
void print(const struct part inv[], int np)
{
int i;
printf("Part Number Part Name "
"Quantity on Hand\n");
for (i = 0; i < np; i++)
printf("%7d %-25s%11d\n", inv[i].number,
inv[i].name, inv[i].on_hand);
}
思路
1.既然将struct和num_parts改为局部变量,就不可在定义函数时使用,要对函数传输参数
2.函数在定义时参数要写全(类型 名称),调用函数时只需说名字