晚起鸟儿 发表于 2016-4-17 07:16:58

谭浩强C程序设计学习辅导打错问题请教

本帖最后由 晚起鸟儿 于 2016-4-17 11:54 编辑

谭浩强C程序设计学习辅导13.3案例3:电订餐话信息处理我照着敲出错,请帮忙检查修改程序

隔壁老朱 发表于 2016-4-17 10:16:27

沙发

晚起鸟儿 发表于 2016-4-19 16:15:28

求高手解答呀~

mingcxx 发表于 2016-4-19 17:22:51

本帖最后由 mingcxx 于 2016-4-19 17:41 编辑

修改如下,我用的VS2013,所以输入函数是scanf_s(),如果你的不支持,就用我注释后的可以。
建议:这个程序在实际应用上还有问题,比如没有没有用户输入错误数据类型时的提示代码。只有用户输入正确的数据类型才能正常运行;还有客户编号,最好由程序自动编号,以免用户输入的编号不连续等等。
就是这样了:
#include <stdio.h>
#include <string.h>

#define MaxSize 20
#define NAME_SIZE 41                        //存放客户名,尺寸放大点,比如少数民族客户名
#define SIZE 10

struct guest_info{
        char name;
        int sum;
        char time;
        int number;
}GuestList;

void Insert(int *);
void Search(int);
void Update(int);
void Delete(int *);
void Show(int);

int main(void)
{
        int i;
        int count = 0;

        do
        {
                printf("\n");
                printf("1---插入(Insert)\n");
                printf("2---查询(Search)\n");
                printf("3---修改(Update)\n");
                printf("4---删除(Delete)\n");
                printf("5---显示(Show)\n");
                printf("6---退出(Exit)\n");
                scanf_s("%d", &i, SIZE);                                        //scanf_s("%d", &i);       
                switch (i)
                {
                case 1:Insert(&count);
                        break;
                case 2:Search(count);
                        break;
                case 3:Update(count);
                        break;
                case 4:Delete(&count);
                        break;
                case 5:Show(count);
                        break;
                case 6:
                        break;
                default:printf("错误!请重选");
                        break;
                }
               
        } while (i != 6);

        return 0;
}

void Insert(int * count)
{
        int i, in_number;

        if (*count == MaxSize)
        {
                printf("空间已满!");
                return;
        }
        printf("请输入编号:");
        scanf_s("%d", &in_number, SIZE);                                //scanf("%d", &in_number);
        for (i = 0; i < *count; i++)
        {
                if (GuestList.number == in_number)
                {
                        printf("已有相同的编号:");
                        return;
                }
               
        }
        GuestList.number = in_number;
        printf("请输入姓名:");
        scanf_s("%s", GuestList.name, NAME_SIZE);        //scanf("%s", GuestList.name);
        printf("请输入人数:");
        scanf_s("%d", &GuestList.sum, SIZE);                        //scanf("%d", &GuestList.sum);
        printf("请输入用餐时间:");
        scanf_s("%s", GuestList.time, SIZE);                        //scanf("%s", GuestList.time);
        (*count)++;

}

void Search(int count)
{
        int i, number, flag = 1;

        printf("请输入要查询的编号: ");
        scanf_s("%d", &number, 10);                                        //scanf("%d", &number);
        for (i = 0; i < count&&flag; i++)
        {
                if (GuestList.number == number)
                {
                        printf("姓名:%s\n", GuestList.name);
                        printf("人数:%d\n", GuestList.sum);
                        printf("用餐时间:%s\n", GuestList.time);
                        flag = 0;
                }
        }
        if (flag)
                        printf("没有查询到!!");

}
void Update(int count)
{
        int i, number, flag = 1;

        printf("请输入要修改数据的编号:");
        scanf_s("%d", &number, SIZE);                                        //scanf("%d", &number);
        for (i = 0; i < count&&flag; i++)
        {
                if (GuestList.number == number)
                {
                        printf("请输入人数:");
                        scanf_s("%d", &GuestList.sum, SIZE);        //scanf("%d", &GuestList.sum);
                        printf("请输入用餐时间:");
                        scanf_s("%s", GuestList.time, SIZE);        //scanf("%s", GuestList.time);
                        flag = 0;
                }
        }
        if (flag)
                printf("没有查询到可以修改的数据!!\n");
}
void Delete(int * count)
{
        int i, j, number, flag = 1;

        printf("请输入要删除数据的编号:");
        scanf_s("%d", &number, SIZE);                                        //scanf("%d", &number);
        for (i = 0; i<*count&&flag; i++)
        {
                if (GuestList.number == number)
                {
                        for (j = i; i<*count - 1; j++)
                                GuestList = GuestList;
                        flag = 0;
                        (*count)--;
                }
               
        }
        if (flag)
                printf("没有查询到可以删除的数据!!");
}
void Show(int count)
{
        int i;

        printf("\n");
        printf("      编号       姓名       人数      用餐时间\n");
        for (i = 0; i<count; i++)
        {
                printf("%10d", GuestList.number);
                printf("%12s", GuestList.name);
                printf("%10d", GuestList.sum);
                printf("%12s\n", GuestList.time);
        }
}

晚起鸟儿 发表于 2016-4-20 16:19:39

mingcxx 发表于 2016-4-19 17:22
修改如下,我用的VS2013,所以输入函数是scanf_s(),如果你的不支持,就用我注释后的可以。
建议:这个程 ...

谢谢高手耐心解答,除
35行应为//scanf("%d", &i); 改为您注释后的代码可以运行,虽然没能明白代码意思,比如case 1:Insert(&count);和case 1:Insert(count);有什么区别,
04.#define MaxSize 20
05.#define NAME_SIZE 41                  
06.#define SIZE 10
是定义预留空间字节大小吗……。

mingcxx 发表于 2016-4-20 21:10:28

本帖最后由 mingcxx 于 2016-4-20 21:24 编辑

声明:我也是新手,哈哈。帮忙之外,也是练习。
抱歉,注释还是没写好,幸亏发现了{:5_108:}
那个4、5、6、行的的确是预留空间字节大小,写成常量以后修改也方便,不用整个代码里找着修改了,搞不好还落下几个。
对于Insert(&count);遵照了原代码的编写。&是地址运算符,&count取count的地址,把地址作为参数传递。
代码中用main()里唯一的count作为订单数目(最大为MaxSize 20个)的计数器。
函数Insert(&count)在增加一条订单,所以通过传递来的main()函数内count的地址把count计数器增加1。
如果去掉“&”,那么Insert()就会去更新地址值等于count处的变量,而main()内的count依然没变,开开心心地。
同理,删除操作Delete(&count);也会在删除一条订单之后,让订单数计数器count减一,所以也传递了count的地址。其他两个查询修改函数并不涉及订单数的增减,只需要知道订单数进行查找修改记录,传一个计数器的值就可以了。{:5_108:}
。。。手残,回复变成了跟帖。。。抱歉抱歉。。。

Whitehat_K 发表于 2016-5-22 11:23:34

回帖是一种美德...

屁哥 发表于 2016-6-12 08:03:54

今天有么问个问题
麻烦师兄帮忙看看 悬赏问题 里有发布 有图片 这个 Vbox 增强工具箱安装失败问题
Stopping VirtualBox Additions这个鬼
3Q

弧矢七 发表于 2016-7-18 11:42:42

定一下

rayleigh_tong 发表于 2016-12-8 11:38:10

看看,学习了

AsmodeusBaal 发表于 2017-1-1 18:49:38

我帮你看一看

AsmodeusBaal 发表于 2017-1-1 18:51:39

#include "stdio.h"
#include "string.h"
#define MaxSize 20
struct guest_info{
char name;
int sum;
char time;
int number;
}GuestList;
void Insert(int *);
void Search(int);
void Update(int);
void Delete(int *);
void Show(int);
int main()
{
int i;
int count=0;
do
{
printf("\n");
printf("1---²åÈë(Insert)\n");
printf("2---²éѯ(Search)\n");
printf("3---ÐÞžÄ(Update)\n");
printf("4---ÉŸ³ý(Delete)\n");
printf("5---ÏÔÊŸ(Show)\n");
printf("6---Í˳ö(Exit)\n");
scanf("%d",&i);
switch(i)
{
case 1:Insert(&count);
       break;
case 2:Search(count);
    break;
case 3:Update(count);
    break;
case 4:Delete(&count);
    break;
case 5:Show(count);
    break;
case 6:break;
default:printf("ŽíÎó£¡ÇëÖØÑ¡");break;
}
}while(i!=6);
return 0;
}

void Insert(int * count)
{
   int i, in_number;
   if(*count==MaxSize)
   {
    printf("¿ÕŒäÒÑÂú£¡");return;
   }
   printf("ÇëÊäÈë±àºÅ£º");
   scanf("%d",&in_number);
   for(i=0;i<*count;i++)
   if(GuestList.number==in_number)

    {
    printf("ÒÑÓÐÏàͬµÄ±àºÅ£º");return;
    }
   GuestList.number=in_number;
   printf("ÇëÊäÈëÐÕÃû£º");
   scanf("%s",GuestList.name);
   printf("ÇëÊäÈëÈËÊý£º");
   scanf("%d",&GuestList.sum);
   printf("ÇëÊäÈëÓòÍʱŒä£º");
   scanf("%s",GuestList.time);
   (*count)++;

}
void search(int count){
          int i,number,flag=1;
          printf("ÇëÊäÈëÒª²éѯµÄ±àºÅ");
          scanf("%d",&number);
          for(i=0;i<count&&flag;i++)
          if(GuestList.number==number)
          {printf("ÐÕÃû£º%s,GuestList.name");
          printf("ÈËÊý£º%d",GuestList.sum);
      printf("ÓòÍʱŒä£º%s",GuestList.time);
          flag=0;
          }
          else
                  printf("ûÓвéѯµœ!!");
}
          void Update(int count)
          {int i,number, flag=1;
          printf("ÇëÊäÈëÒªÐÞžÄÊýŸÝµÄ±àºÅ:");
          scanf("%d",&number);
          for(i=0;i<count&&flag;i++)
          if(GuestList.number==number)
                  {
                          printf("ÇëÊäÈëÈËÊý£º");
                          scanf("%d",&GuestList.sum);
                          printf("ÇëÊäÈëÓòÍʱŒä£º");
                          scanf("%s,GuestList.time");
                          flag=0;
          }
                  else
                          printf("ûÓвéѯµœ¿ÉÒÔÐޞĵÄÊýŸÝ!!");
          }
          void delete(int*count)
          {int i,j,number,flag=1;
          printf("ÇëÊäÈëҪɟ³ýÊýŸÝµÄ±àºÅ£º");
          scanf("%d",&number);
          for(i=0;i<*count&&flag;i++)
          {if(GuestList.number==number)
          {for(j=i;i<*count-1;j++)
          GuestList=GuestList;
          flag=0;
          (*count)--;
          }
else
printf("ûÓвéѯµœ¿ÉÒÔÉŸ³ýµÄÊýŸÝ!!");
          }
          }
          void Show(int count)
          {int i;
          printf("\n");
          printf("±àºÅ ÐÕÃû ÈËÊý ÓòÍʱŒä\n");
          for(i=0;i<count;i++)
          {printf("%10d",GuestList.number);
          printf("%12s",GuestList.name);
          printf("%10d",GuestList.sum);
          printf("%12s\n",GuestList.time);
          }
          }
我下载打开全是乱码

AsmodeusBaal 发表于 2017-1-1 18:52:38

麻烦楼主自己复制一下然后回复在帖子上。谢谢!我用的系统是linux MINT18.1

geekerr 发表于 2017-2-8 12:38:12

老谭错误还是挺多的,但是讲的还不错
页: [1]
查看完整版本: 谭浩强C程序设计学习辅导打错问题请教