Luca琐记 Icoding实验五

函数改造

这一部分内容是真的无语

修改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.函数在定义时参数要写全(类型 名称),调用函数时只需说名字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值