欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言的一道数组题Plus

程序员文章站 2022-07-05 17:37:53
其实数组那部分当时学的东西挺简单的. 常见的题就是用一个数组装几个数字. 然后排序,找出大于n的数字有几个,有几个重复数字之类的. 去年想出来一个题. 因为以前写的代码太复杂,又有很多不足和bug.所以今天重新写了下. 小明想要记录多个数字(即装到数字中),最多有50个数字,(都是十进制数) 但他不 ......

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

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

然后排序,找出大于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的题:

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

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