LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1149|回复: 12

大家帮我看看这个题目(有关数据结构中的插入)

[复制链接]
发表于 2003-3-1 11:27:23 | 显示全部楼层 |阅读模式
原题是这样的:
  设线形表存放在向量A[arrsize]的前elenum个分量中,且递增有序.试写一算法,将x插入到线形表的适当位置上,以保持线形表的有序性.
  
我在具体的作题过程中对其稍加修改,就是:
a.先定义一个结构体(其中包含一个数组)然后让用户输入若干整数到这个结构体的成员数组中,
b.然后系统对这些整数进行排序,再按排序后的顺序输出.
c.再然后用户从键盘输入的一个整数插入到这个数组的适当位置(保持有序性).

以下是我写的程序,但是结果显示a部分(至少是a部分)并不像我想象的那样.先输入几个数然后一回车就ok,而是好象并不响应回车,我靠.
我想问问各位高人:
(1)怎么让程序响应回车结束呢?
(2)怎么判断用户输入的是不是整型数并过滤掉?
(3)请大家帮我检查一下程序是不是还有我看不出来的错误.
(4)最后,好象在mian()函数中定义变量一定要在为结构体成员变量赋值之前,要不然就报错.这里就是sl.last=0一定要在int count,a,b等;之前.请问这是为什么?

#include <stdio.h>

struct
{ int A[20];
  int last;
}sl;   //定义一个结构体

int main(void)
{
  int count = 0;
  int a;
  int b;
  int c;
  int temp;   
  sl.last = 0;    //初始化变量
  
  printf("lease input some numbers:\n");

  while(getch() != '\n')    //给结构体成员数组赋值
  {
    if(sl.last>=20)
      {
        printf("OVERFLOW\n");
        break;
      }
    scanf("%d,",&(sl.A[count]));
    sl.last = count++;
  }

  for(a=0; a<sl.last; a++)         //给结构体数组排序
  {
    for(count=0; count<sl.last; count++)
      {
        if(sl.A[count] > sl.A[count+1])
         {
           b = sl.A[count];
           sl.A[count] = sl.A[count+1];
           sl.A[count+1] = b;
         }
      }
  }

  for(count=0; count<sl.last; count++)         //输出排序后的数组
    {
      printf("%d,",sl.A[count]);
    }
  printf("\n");

  while(sl.last < 20)               //用户输入一个整型变量插入数组适当位置
   {
      printf("lease input a integer to insert:\n");
      printf("ress '/x'/ to exit.\n");

      if( getch()=='x' )
        { break; }

      scanf("%d",&temp);
      for(count=0; count<sl.last; count++)
        {
          if( (temp>sl.A[count]) && (temp<sl.A[count+1]) )
           {
             for(c=0; c<(sl.last+1-count); c++)
               {
                 sl.A[sl.last+1-c] = sl.A[sl.last-c];
               }
           }
        }
      sl.last++;

      for(count=0; count<sl.last; count++)
        {
          printf("%d,",sl.A[count]);
        }
  }

  return (1);

}
 楼主| 发表于 2003-3-1 11:29:12 | 显示全部楼层
说个题外话.为什么粘贴并发出帖子后,原来程序中的缩进格式都没有了??
 楼主| 发表于 2003-3-1 18:59:20 | 显示全部楼层
我疏忽没有加上#include <stdio.h>
可是运行还是一样的问题
(顺便顶一下)
发表于 2003-3-1 19:35:06 | 显示全部楼层
编译出错(红色部分通不过),这样引用结构中的元素不对吧,真的是这段程序吗?

  1. scanf("%d",&temp);
  2.       for(count=0; count<sl.last; count++)
  3.         {
  4.           if( (temp>sl.A[count]) && (temp<sl.A[count+1]) )
  5.            {
  6.              for(c=0; c<(sl.last+1-count); c++)
  7.                {
  8.                  [color=red]A[sl.last+1-c] = A[sl.last-c];[/color]
  9.                }
  10.            }
  11.         }
  12.       sl.last++;
复制代码
 楼主| 发表于 2003-3-1 20:13:19 | 显示全部楼层
哦。谢谢提醒。对不起。是我疏忽了
应该把你提到的红色部分改成
sl.A[sl.last+1-c] = sl.A[sl.last-c];
这个问题我已经注意到了,只是没有更新帖子
谢谢kj
不过问题还是存在
发表于 2003-3-1 21:25:11 | 显示全部楼层
还是有问题,找不到getch()函数。你是在turbo c下编译的吧,linux下的对应函数应该是getchar()。我把两个getch()函数改成getchar()之后,编译通过。但是运行时出现了你所认为的怪问题。
[kj501@c4 programs]$ ./a.out
Please input some numbers:
1
2

Please input a integer to insert:
Press '/x'/ to exit.
3
4
2,Please input a integer to insert:
Press '/x'/ to exit.
5
2,0,Please input a integer to insert:
Press '/x'/ to exit.
x
2,0,0,Please input a integer to insert:
Press '/x'/ to exit.
[kj501@c4 programs]$
在第输入第二个数字后,程序反应不正常。这是由于终端的特性造成的。linux/unix的终端在缺省配置情况下,终端输入只有在用户按下回车键后才会传递给程序使用。这在一般情况下是有好处的,比如在输入命令时,如果有错误,可以用Backspace或者Del键对打字错误进行修改,然后再按下回车键,向系统传送正确的命令。由于从键盘输入的Backspace和Del键也是特殊字符,此时,终端会把命令中的特殊字符和其它的字符一起进行处理,再把处理后的输入送给程序。如要在终端上输入date命令,却输入了datee,这时就要用Backspace来删除多余的e。如果用#代表Backspace的话,则实际的输入就是datee#,终端会把最后的e#处理掉,实际传达给系统的是date命令。
你编写的这个程序之所以发生这样的问题,在于终端在按下回车键之前先把输入的字符保存起来,然后再把用户选中的字符和紧随其后的回车字符一起送给程序。你在键盘上输入1,回车,2,回车,。。。时,传送给程序的也是1,回车,2,回车。。。,这样,由于第2个字符(也就是回车符号)不是数字,使程序发生异常。
发表于 2003-3-1 22:47:10 | 显示全部楼层
程序的问题是由于输入处理不当造成的。你自己有gdb跟踪一下就知道了。即使我把所有的数据在一行上输入也是如此。
gdb的用法可以在网上搜索一下。
 楼主| 发表于 2003-3-2 13:29:38 | 显示全部楼层
多谢kj兄
就我提到的输入问题,我重新用了一种办法(可能是个偷懒的办法或是一个笨办法)。而且程序中最重要的插入部分我之前的程序中由于我的疏忽(怎么又疏忽?做事一定要认真!!),犯了一个大错误,竟然没有把插入的数放到数组中。经过我的更改,现在程序运行之后基本达到了我的预期效果。再次谢谢kj。
只是还有一个小问题(至少现在我认为是个小问题),就是在让用户输入要插入整数时,好象按的第一次键没有反应??
还有一些不足的地方,就是不能判断输入的是不是数字,是不是整数,而且没有考虑对数组赋值时要是输入相等的数的情况(目前就想到这么多)。
另外还是对本贴开头的几个问题心存疑惑,谁能帮忙解答,谢谢。
 楼主| 发表于 2003-3-2 13:32:10 | 显示全部楼层
这是更改后的代码:
(目前在turboc下运行成功。我想在linux下可能只要改一下getch(),问题不大吧)

#include <stdio.h>

struct
{ int A[20];
  int last;
}sl;

int main(void)
{

  int count = 0;
  int a;
  int b;
  int c;
  int temp;
  sl.last = 0;

  printf("lease input some numbers into the array.");//这部分就是更改过后的数组接受赋值
  printf("(Press 'q' to finish input.)");               
  for(count=0; count<20; count++)                        
    {
      printf("\nNow the number %d:",count+1);
      scanf("%d",&(sl.A[count]));
      sl.last = count;
      if(getch()=='q')
        break;
    }

  for(a=0; a<sl.last; a++)
   {
     for(count=0; count<sl.last; count++)
       {
         if(sl.A[count] > sl.A[count+1])
          {
            b = sl.A[count];
            sl.A[count] = sl.A[count+1];
            sl.A[count+1] = b;
          }
       }
   }

  printf("\n");
  printf("\n");
  printf("what you've input are:\n");

  for(count=0; count<=sl.last; count++)
    {
      printf("%d,",sl.A[count]);
    }

  printf("\n");
  printf("\n");
  printf("\n");

  while(sl.last < 20)
   {
      printf("lease input a integer to insert:\n");
      printf("ress 'x' to exit.\n");

      if( getch()=='x' )
        { break; }

      scanf("%d",&temp);
      for(count=0; count<sl.last; count++)
        {
          if( (temp>sl.A[count]) && (temp<sl.A[count+1]) )
           {
             for(c=0; c<(sl.last+1-count); c++)
               {
                 sl.A[sl.last+1-c] = sl.A[sl.last-c];
               }
             sl.A[count+1] = temp;                      //原来的程序少了这句,不可饶恕
           }
        }
      sl.last++;

      for(count=0; count <= sl.last; count++)
        {
          printf("%d,",sl.A[count]);
        }
  }

  return (1);

}
发表于 2003-3-2 14:32:18 | 显示全部楼层
最初由 scream 发布

只是还有一个小问题(至少现在我认为是个小问题),就是在让用户输入要插入整数时,好象按的第一次键没有反应??
还有一些不足的地方,就是不能判断输入的是不是数字,是不是整数,而且没有考虑对数组赋值时要是输入相等的数的情况(目前就想到这么多)。
另外还是对本贴开头的几个问题心存疑惑,谁能帮忙解答,谢谢。

在让用户插入整数时,第一次按键没反应。问题出在这一段代码上:

  1. if (getchar() == 'x') {
  2.             break;
  3.         }

  4.         scanf("%d", &temp);
复制代码

输入的第一个字符被getchar()从缓冲区中读取后,第二个字符才能由scanf()函数读取。如果把这部分注释掉,第一次就会有反应。

  1. //if (getchar() == 'x') {
  2.         //    break;
  3.         //}

  4.         scanf("%d", &temp);
  5.         for (count = 0; count < sl.last; count++) {
  6.             if ((temp > sl.A[count]) && (temp < sl.A[count + 1])) {
  7.                 for (c = 0; c < (sl.last + 1 - count); c++) {
  8.                     sl.A[sl.last + 1 - c] = sl.A[sl.last - c];
  9.                 }
  10.                 sl.A[count + 1] = temp;        //原来的程序少了这句,不可饶恕
  11.             }
  12.         }
复制代码

我猜想你的意思是要在这个地方判断输入的字符是不是数字。可以采用isdigit()函数判断,但要加上头文件<ctype.h>:

  1. #include<ctype.h>
  2. 。。。。。。
  3. while( temp = getchar()) ! = EOF) {
  4.       if(isdigit(temp)) { 。。。。。。}
  5.       。。。。。。
  6. }
复制代码

只是不知道在TC中有没有这个函数。如果要判断输入的是小数还是整数,可以先把输入的数字用强制类型转换成整数,然后再把这个整数与原来输入的数字进行比较,如果相等,则是整数,反之,则是小数。由于C语言不可能提供所有的字符处理函数,这种方法就是一个经常采用的技巧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表