设为首页 加入收藏

TOP

C语言的一道数组题Plus
2019-03-26 22:08:26 】 浏览:79
Tags:语言 一道数 Plus

其实数组那部分当时学的东西挺简单的.

常见的题就是用一个数组装几个数字.

然后排序,找出大于n的数字有几个,有几个重复数字之类的.

去年想出来一个题.

因为以前写的代码太复杂,又有很多不足和bug.所以今天重新写了下.

小明想要记录多个数字(即装到数字中),最多有50个数字,(都是十进制数)

但他不知道输入多少个好,请你设计一段代码来满足他的需求.(数字范围在int内)

并输出这些数字.

不考虑输入文章未出现的情况.(例如输入一个封号 ';' )

********************************************************************************

Q:我们在int n[50]后如何记录数字?

    因为常用的记录数字往往是将数组全部装完

    或者是先输入一个数字来决定数组长度

若果只是用循环来记录数字就会陷入死循环(没有那么多的数字)

Think:用一个特殊的数字来结束 例如输入0来结束 if(n[i]==0)break;←这样

        但如果输入的数字里刚好有这个数字就会出现问题.

/***************************************************** 
*
*    思想:将每个数字改成获得单个字符再转换(1) 
*        获得空格或回车就将以获得的数字装进数组(2) 
*        *装满或获得两次回车就结束(3) 
* 
*        1.num用来装已获得的数字
*        2.js对数字计数 
*          flag表示能否计数 
*        3.flagn表示是否获得了一个回车 
******************************************************/
#include<stdio.h>
#include<stdlib.h>
#define N 50

int main(int argc,char** argv){
    int math[N],num,js = 0,flag = 0,flagn = 0;
    char ex;
    while(1){
        if(scanf("%[0-9]",&ex)){
            flag = 1;                        //可以计数 flag 
            flagn = 0;                        //不结束循环 
            num=num*10+ex-48;                //利用asc II码来计算num 
        }
        else if(scanf("%[ ]",&ex)){            //选择空格字符  
            if(flag){
                math[js++]=num;                //录入数字 数字数量+1 
                if(js == 51)break;            //达到上限
            }                
            num = flagn = 0;                //num归零 不结束循环 
            flag = 0;                        //不可计数 flag 
        }
        else if(scanf("%c",&ex) && ex == '\n'){    //选择回车符 
            if(flag)math[js++]=num;                //计数 数字+1 
            num = flag = 0;                        //num归零 不可计数 flag 
            if(flagn)break;                        //将会*以双回车结束 
            flagn = 1;
        }
        if(js==N)break;                    //达到上限
    }                                    //循环结束了 
    
    if(!js){                            //*无数字处理 
        printf("NULL.\nEnd.\nThere are %d numbers.\n",js);
        system("PAUSE");
        return 0;
    }
    num=0;
    printf("Have %d number.\n",js);
    while(js--){
        printf("%-5d",math[num++]);
        if(!(num%10))printf("\n");
    }
    system("PAUSE");
    return 0;
}

 

Way2:将数字以十六进制来读取将十六进制转换为十进制 添加要求:以十六进制数a作为结束语句(其实只要是大于十的进制都可以)

        代码如下:这个代码有误 最近会尽快更正!

#include<stdio.h>
#include<stdlib.h>
#define N 50

int main(int argc,char** argv){
    int math[N],num,shu=0,changdu=1,n=0;
    while(1){
        scanf("%x",&num);
        if(num<10){
            math[n++]=num;            //个位数直接赋值  
            if(n==N)break;            //达到上限 
            continue;
        }
        else if(num==10)break;        //输入十六进制数a 结束输入数字 
        shu=num;
        while(shu){
            changdu*=16;            //将该十进制的十六进制最高位所代表的数计算出来即changdu 
            shu/=16;
        }                            //shu==0
        
        changdu/=16;
        while(changdu){
            shu=shu*10+num/changdu; 
            changdu/=16;
            num/=16;
        }
        math[n++]=shu;
        if(n==N)break;                //达到上限 
    }
    printf("There are %d numbers.\n",n);
    shu=num=0;
    while(n--){
        printf("%-5d",math[shu++]);
        if(!(shu%10))printf("\n");
    }
    system("PAUSE");
    return 0;
}

通过比较, 第二种似乎更好.

但我觉得第一种比较好,它没有要求以十六进制数a作为结束语句

更加方便,更能使客户(小明)满意.

想了个Plus Plus的题:

在这个基础上要求输入的可能使算式,要求将数字计算出再存储到数组中(算式中可能会出现加减乘除符号,符号最多出现两个,每个参与计算的数不超过两位数)

(好吧...... 后面补充的是为了方便我写代码 嘻嘻)

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言学习推荐书籍 下一篇C语言 有关内存的思考题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目