爱喝的三明治 发表于 2022-11-10 23:36:40

陷入循环,无法输出数据

本帖最后由 爱喝的三明治 于 2022-11-11 00:02 编辑

printf不输出数据
问题出在133和138行之间无线循环
无法输出
在查询这个功能里没办法输出数据
实在是找不到问题在哪里,没有一点头绪{:9_225:}

#include <stdio.h>
#include<string.h>
#include <stdlib.h>

struct Goods
{
        int id;//产品编号
        char kudan1;//入库单号
        char kudan2;//出库单号
        char name;//名称
        int num;//数量
        float cost;//成本
        float price;//售价
        float profit;//利润
               
}goods,rk,ck,cx;


void input();      
void output();
void search();
void menu();

int main(){

        int command = 0;//command用于存储管理员命令对应的菜单数字
        int a = 1;      //用于判断是否退出系统
        while(a){       //利用while循环实现对管理系统进行多种操作
          printf("1.入库2.出库3.查询\n");
            printf("请输入操作对应的数字!\n\n");
          scanf("%d", &command);
                switch(command){
                  case(1):      //进库
                          input();
                          break;
                  case(2):      //出库
                          output();
                    break;
                  case(3):      //查询库存
                          search();
                        break;
          
                  default:
                          printf("请输入正确的数字!\n\n");   //提示管理员重新输入正确的菜单数字
                             break;
          }
        }
        printf("您已退出可口可乐广东分公司仓库管理系统!");   //提示管理员成功退出系统
        return 0;
}


int S=0;//产品种类
void input()//入库
{
        int a,i=0,j=0;
        printf("请输入入库产品种类:\n");
        scanf("%d",&a);
        for(j=0;j<a;j++)
        {        printf("请输入第%d个产品信息\n",(j+1));
          printf("产品名称:");
      scanf("%s",&goods.name);               
          printf("产品编号:");
          scanf("%d",&goods.id);
          printf("例:2022年1月填为202201\n");
                printf("入库单号:\n");
                scanf("%s",&goods.kudan1);
                printf("数量:");
                scanf("%d",&goods.num);
                printf("请再输入一次\n");
                scanf("%d",&rk.num);

                int flag = 0;
      for(i = 0; i <S; i++)
                {
              if(rk.id==goods.id)
                        {flag = 1;
                        goods.num =rk.num+goods.num;
                        break;
                  }
                }
                  if (flag == 0)
                        {
              S++;
                }
      }               
}

void output()//出库
{
        int b,j=0,i=0;
    printf("请输入本次出库产品种类数:\n");
    scanf("%d", &b);
    for(j=0;j<b;j++)
        {
                printf("请输入出库单号\n");
                scanf("%s",&goods.kudan2);
      printf("\n请输入第%d个产品编号:\n",(j+1));
      scanf("%d",&ck.id);
      printf("请输入出库数量:\n");
      scanf("%d",&ck.num);
      int flag=0;
      for(i=0;i<S;i++)
                {
              int t=0;
              if(ck.id==goods.id)
                        {
                          flag=1;
                          if(goods.num==ck.num)
                                {
                                        printf("库存清零\n");
                            S--;
                      }
                      else if((goods.num-ck.num)<0)
                      printf("库存不足,出库失败\n");
                      else
                      {
                              goods.num=(goods.num-ck.num);
                              printf("出库成功\n");
                                }
                                break;
                  }
      }
        }
}

void search()
{
        int i,s,flag;
        printf("1.查询入库单\n");
        printf("2.查询出库单\n");
        printf("3.退出菜单\n");
        while(1){
        printf("请选择编号:");
    scanf("%d",&s);
    flag=0;
    switch(s){
        case 1:
        printf("请输入要查询的入库单号:\n");
    scanf("%d",&cx.kudan2);
    for(i=0;i<S;i++)
        if(goods.kudan1==cx.kudan1){
        flag=1;
        printf("出库单号编号名称数量成本\n");
        printf("%d%d%s%d%f\n",goods.kudan1,goods.id ,goods.name ,goods.num ,goods.cost);}
    if(flag=0)
        printf("该单号不存在!\n");
    break;
        case 2:
        printf("请输入要查询出库单号:\n");
    scanf("%d",&cx.kudan2);
    for(i=0;i<S;i++)
        if(goods.kudan2==cx.kudan2){
        flag=1;
        printf("出库单号编号名称数量利润\n");
        goods.profit=(goods.price-goods.cost)*ck.num;
        printf("%d%d%s%d%f\n",goods.kudan2,goods.id ,goods.name ,goods.num ,goods.profit);}
    if(flag=0)
        printf("该单号不存在!\n");
    break;
    case 3:
    return;
        default:
                printf("ddd");
                break;
        }
}
}


jackz007 发表于 2022-11-10 23:55:43

本帖最后由 jackz007 于 2022-11-11 00:05 编辑

struct Goods
{
      int id;//产品编号
      char kudan1 ; //【修改】:字符串是需要很多字符空间的
      char kudan2 ; //【修改】:字符串是需要很多字符空间的
      char name ; //【修改】:字符串是需要很多字符空间的
      int num;//数量
      float cost;//成本
      float price;//售价
      float profit;//利润
}goods,rk,ck,cx;
      你的定义 kudan1、kudan2、name 只能存储 1 个字符,真的够用吗???

      你的代码逻辑非常的混乱,不知道数据、功能是如何组织和规划的,比如,goods,rk,ck,cx; 这些都是干什么用的,彼此之间什么关系?有没有可能根本不需要这么多账本???账本可是结构数组,搞一个不够使,一定要搞那么多,真的有必要吗,要知道,账本多了容易混乱!!!

爱喝的三明治 发表于 2022-11-11 00:11:41

jackz007 发表于 2022-11-10 23:55
你的定义 kudan1、kudan2、name 只能存储 1 个字符,真的够用吗???

      你的代码逻辑 ...

rk,ck这些是为了让if(goods.kudan1==cx.kudan1)这种运行,我也想不到其他办法了

爱喝的三明治 发表于 2022-11-11 00:14:09

jackz007 发表于 2022-11-10 23:55
你的定义 kudan1、kudan2、name 只能存储 1 个字符,真的够用吗???

      你的代码逻辑 ...

所以功能3中为什么有问题啊?

jackz007 发表于 2022-11-11 00:34:01

本帖最后由 jackz007 于 2022-11-11 00:46 编辑

爱喝的三明治 发表于 2022-11-11 00:14
所以功能3中为什么有问题啊?

    你的数据结构模型都是错的,功能怎么能正确?比如,kudan1、kudan2 有何用?为什么一定要用字符串?用整型数就不行吗,既然是库存信息,用一个唯一性的库存编号还不能解决问题?
   search() 函数判断 kudan1、kudan2 与需要查询的库单号是否相同用的是== ,那样做不可以,它们是字符串,判断相等得用 strcmp() 函数。

jackz007 发表于 2022-11-11 09:52:20

本帖最后由 jackz007 于 2022-11-11 09:53 编辑

      只是排除了逻辑障碍,不能保证业务逻辑正确
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Goods
{
      int id         ; //产品编号
      char kudan1 ; //入库单号
      char kudan2 ; //出库单号
      char name   ; //名称
      int num          ; //数量
      float cost       ; //成本
      float price      ; //售价
      float profit   ; //利润
} goods , rk , ck , cx ;

int S = 0 ; //产品种类

void input()//入库
{
      int a , i = 0 , j = 0                                       ;
      printf("请输入入库产品种类数:")                              ;
      scanf("%d" , & a)                                             ;
      for(i = 0 ; i < a ; i ++) {
                printf("请输入第 %d 个产品信息\n" , i + 1)            ;
                printf("产品名称:")                                  ;
                scanf("%s" , goods . name)                         ;
                printf("产品编号:")                                  ;
                scanf("%d", & goods . id)                        ;
                printf("入库单号 (例:2022年1月填为202201) :")       ;
                scanf("%s", goods . kudan1)                        ;
                printf("数量:")                                    ;
                scanf("%d" , & goods . num)                        ;
                rk.num = goods . num                            ;
      }
      int flag = 0                                                ;
      for(i = 0 ; i < S ; i ++) {
                if(rk . id == goods . id) {
                        flag = 1                                    ;
                        goods . num = rk . num + goods . num ;
                        break                                       ;
                }
      }
      if (flag == 0) S ++                                           ;
}

void output()//出库
{
      int b , j = 0 , i = 0 , t , flag                     ;
      printf("请输入本次出库产品种类数:")               ;
      scanf("%d" , & b)                                    ;
      for(i = 0 ; i < b ; i ++) {
                printf("请输入出库单号:")                   ;
                scanf("%s" ,goods . kudan2)             ;
                printf("\n")                                 ;
                printf("请输入第 %d 个产品编号:" , (i + 1)) ;
                scanf("%d" , & ck . id)                   ;
                printf("请输入出库数量:")                   ;
                scanf("%d", & ck . num)                   ;
      }
      flag = 0                                             ;
      for(i = 0 ; i < S ; i ++) {
                t = 0                                        ;
                if(ck . id == goods . id) {
                        flag = 1                           ;
                        if(goods . num == ck . num) {
                              printf("库存清零\n")         ;
                              S --                         ;
                        } else if((goods . num - ck . num) < 0) {
                              printf("库存不足,出库失败\n") ;
                        } else {
                              goods . num = (goods . num - ck . num) ;
                              printf("出库成功\n")                            ;
                        }
                        break                                                   ;
                }
      }
}

void search()
{
      int i , s , flag                                           ;
      char kudan1 , kudan2                           ;
      while(1) {
                for(;;) {
                        printf("\n")                               ;
                        printf("\t    * [信息查询] * \n\n")      ;
                        printf("\t    1.查询入库单\n")             ;
                        printf("\t    2.查询出库单\n")             ;
                        printf("\t    0.退出菜单\n\n")             ;
                        printf("\t请选择:")                        ;
                        scanf("%d" , & s)                        ;
                        if(s >= 0 && s <= 3) break               ;
                        else printf("*无效选择*\n")                ;
                }                        
                flag = 0                                           ;
                printf("\n")                                       ;
                switch(s) {
                        case 1 : printf("请输入要查询入库单号 :") ;
                                 scanf("%s" , kudan1)            ;
                                 for(i = 0 ; i < S ; i ++) {
                                       if(! strcmp(goods . kudan1 , kudan1)) {
                                                 flag = 1                                                                                                   ;
                                                 printf("入库单号编号名称入库数量成本\n")                                                             ;
                                                 printf("%3s %3d %3s %3d %3f\n" , kudan1 , goods . id , goods . name , rk . num , goods. cost)    ;
                                       }
                                 }
                                 if(flag == 0) printf("该单号不存在!\n")                                                                                     ;
                                 break                                                                                                                        ;
                        case 2: printf("请输入要查询出库单号 :") ;
                              scanf("%s", kudan2)               ;
                              for(i = 0 ; i < S ; i ++) {
                                        if(! strcmp(goods . kudan2 , kudan2)) {
                                                flag = 1                                                                                                      ;
                                                printf("出库单号编号名称数量利润\n")                                                                  ;
                                                goods.profit=goods.price-goods.cost;
                                                printf("%3s %3d %3s %3d %3f\n" , kudan2 , goods . id , goods . name , ck . num, goods . profit) ;
                                        }
                              }
                              if(flag == 0) printf("该单号不存在!\n")                                                                                    ;
                              break                                                                                                                         ;
                        default: return                                                                                                                     ;
                }
      }
}

void menu()
{
      int um                                       ;
      for(;;) {
                for(;;) {
                        printf("\n")                           ;
                        printf("\t * [库存信息系统] *\n\n")    ;
                        printf("\t   1. 商品入库\n")         ;
                        printf("\t   2. 商品出库\n")         ;
                        printf("\t   3. 信息查询\n")         ;
                        printf("\t   0. 退出\n\n")             ;
                        printf("\t请选择 :")                ;
                        scanf("%d" , & um)                     ;
                        if(um >= 0 && um <= 3) break         ;
                        else printf("*无效选择*\n")            ;
                }
                printf("\n")                                 ;
                switch(um) {
                        case 1:
                              input()                        ;
                              break                        ;
                        case 2:
                              output()                     ;
                              break                        ;
                        case 3:
                              search()                     ;
                              break                        ;
                        default: return                        ;
                }
      }
}

int main()
{
      menu()                                                 ;
      system("pause")                                        ;
      return 0                                             ;
}
页: [1]
查看完整版本: 陷入循环,无法输出数据