一道C语言编程题

发布于 2022-09-02 15:54:08 字数 3305 浏览 11 评论 0

描述
编写这样一个程序:
接收来自标准输入的n条指令,指令有如下三种:

  1. a 后面跟一个整数,表示向集合插入一个数

  2. d 后面跟一个整数,表示从集合删除一个数,集合中有多个指定数时,删除一个即可

  3. p 从小到大打印出集合中的数
    输入

每行输入一条指令,注意指令可能不符合规范,整数可能超出C语言长整形范围,可能带符号,但长度不会超过100

输出
当输入指令为p时,从小到大输出集合中的数,当指令不合法时,输出“Invalid Command”
输入样例
a -2
a 31415926535897932
c
a 1
a 4
a 4
d 4
p

输出样例
Invalid Command
-2 1 4 31415926535897932

由于最开始没看到加粗内容部分,我简单写了如下代码:

    /*
        Name:set.c     
        Copyright: 
        Author: HeHe.wang
        Date: 18/05/16 17:14
        Description: 数组实现----->链表实现 
        C课程设计练习题1/5
    */
    # include <stdio.h>
    # include <limits.h>
    /*
    //检查输入数据合法性 
    int checkvalid(long long int n)
    {
        if(n>=LONG_MIN&&n<=LONG_MAX) 
            return 1;
        else
            return 0;

    }
//删除数据前检查是否存在该数据 
int checkexist(long long int a[],long long int value,int cnt)
{
    int i;
    for(i=0;i<cnt;i++)
    {
        if(value==a[i])
          return i;
    }
    return -1;
} 
*/
//插入数据

int insert (int a[],int value,int cnt) 
{
    int i=0;
    int j;
    if(cnt==1)
    {
        a[0]=value;    
    } 
    else
    {
        while(a[i]<value)
        {
            if(i==cnt-1)
               a[cnt-1]=value;
            else
                i++; 
        }
        for(j=cnt-2;j>=i;j--)
        {
            a[j+1]=a[j];
        }
        a[i]=value;
        
    }
    
    return 0;
}

//删除集合中的数据,如果数据存在
void delete(long long int a[],long long int value,int cnt) 
{
    int i;
    int j;
    
    for(i=0;i<cnt;i++)
    {
        if(a[i]==value)
          break;
    }
    
    for(j=i+1;j<cnt;j++)
    {
        a[j-1]=a[j];
    }    
    
}

//对应指令p 
void printarr(long long int a[],int cnt)
{
    int i=0;
    for(;i<cnt;i++)
    {
        printf("%lld ",a[i]);
        //输出数据每10个一行 
        if(i%9==0)
        {
            printf("\n");
        }
    }        
        
}
int main()
{
    char c;
    long long int i;
    long long int a[100]={0};
    int cnt=0;
    int value;
    while(value=scanf("%c %lld",&c,&i))
    {
        if(value==1)
        {
            if(c=='p')
                printarr(a,cnt);
            else
                printf("Invalid Command");
        }
        else
        {
            if(c=='a')
            {
                cnt++;
                insert(a,i,cnt);
            }
            else if(c=='d')
            {
                delete(a,i,cnt);
                cnt--;
            }
            else
            {
                printf("Invalid Command");
            }
        }
        
    } 
    
    return 0;
}

上面程序中插入数据 删除数据 打印数据功能都正常,在主函数这块如果不考虑超出long long int表示范围,上面这段程序仍是错误的。
原因估计跟scanf()有关,还没研究。关于scanf()的返回值是读取成功的数据个数,上面程序中输入完a 2回车正确,但继续执行指令就出现错误了,不知道是不是跟scanf有关系。
写完再一读题,发现完了long long int 肯定处理不了如下指令:
a 21393827493740230482324082432454

所以我开始想用链表来实现,我设计的数据结构如下:

struct SetNode
{
     struct SetNode *pNext;
     char code[105];
}

转换为字符串来存储对应数据,这又涉及到字符串对应整形大小比较问题,不知道我这个思路对不对,是否有更好的思路,原本以为这次的课程设计要简单一点,第一道一晚上就没写出来。
跪求各路大神不吝赐教。(思路及伪代码请基于C语言,不要使用任何C++等高级语言里特有的,原因很简单,我们没学,我也不会)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

我喜欢麦丽素 2022-09-09 15:54:08

第一个问题:每次用scanf前使用fflush(stdin)清空缓冲区,因为你的输入不光是字符,还有一个回车键,字符处理了,但回车还是留着的(准确说是剩了一个换行)
第二个问题:scanf读到字符串里后,自己写一个判断大小函数,先比较字符串长度,长的更大,如果长度相同,就调strcpy比较即可

高速公鹿 2022-09-09 15:54:08

关于内存的问题:
首先自己建立一个缓冲区

char  temp[ 110];  //题目说明长度不会超过100
char  *str;
gets( temp);
int  length = strlen(temp);//获得字符串实际长度
str =  malloc( length + 1);//一定要加一

strcpy(str , temp );

缓冲区每次读入数据时使用,只需分配一次

关于比较的问题
第一 正负 符号和数值部分最好分开存存储

struct  string
{
        int   flag;//表示正负数
        char  *str ;// 数值部分
        int  length;//字符串长度
}

比较函数
首先比较符号,
如果符号一样,length 不等 ,length长的大,负数取反
如果length相等 ,在比较数值部分, 使用strcmp

染火枫林 2022-09-09 15:54:08

提个建议,可以使用命令行数组,就不用scanf去接收命令了,仿照linux 命令写法。

绅士风度i 2022-09-09 15:54:08

题主解决问题了么?求告知

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文