递归,数组,初识别JSON,XML

输入二进制数,输出与之对应的十进制

(思路:因为不能直接让计算机将我输入的数字当做二进制数,所以只能输入一个伪二进制的十进制数,比如10101,然后一位一位的拆解,同时给它们换座位(本来是乘十的就成2,乘100的就乘4,依次类推….最后再加起来。
整个的步骤可以总结为:除权拆解,加权重组。)

# include <stdio.h>
#include <math.h> 
void main(){
    int k = 1,m = 1,n = 1, i = 1,x = 1,y = 1,j = 1,sum = 0;
    printf("任意输入一位二进制数:   ");
    scanf("%d",&i);
    getchar();
    for( n = 0;i/k >0;n++){
        k *= 10;                    
    }
    printf("\n您输入的二进制数总共有:  %d位",n);
    for(j = n - 1;j >= 0;j--){
         x = pow(2,j);
         y = pow(10,j);      
         sum += (i/y)*x;
         i = i%y;       
    }
    printf("\n\n它对应的十进制数是:   %d",sum);
    getchar();
}

待优化的部分:
当输入的数字不是二进制类型时要求重新输入。
这都不是关键,关键是用递归做……算法知道,边界清楚,调用自身我也OK,难点在返回值的部分如何写。

———–懵与懂的分界线———–

首先感谢李涛同学的代码提示:

//输入一个数,输出它的十进制数,递归做法
#include <stdio.h>
#include <math.h> 
void main()
{
    int i = 1,n;
    int exchange(int n);
    printf("输入一个二进制数:\n");
    scanf("%d",&n);
    getchar();
    printf("\n它的十进制数是:   %d",exchange(n));
    getchar();
    exchange(n);
}

int exchange(int x)
{   
    if(x/10 == 0){
        return 1;
    }else{
        return exchange(x/10)*2+x%10;        
    }   
}

思路:二转十,就是要把二进制数的每一个数都乘以2的N次方,N代表它所在的位置顺序(低位往高位数,从0开始)

算法解释:
比如输入n = 1111
n/10= 111 //干掉最后一位,再作为传参调用。
因为末尾的数已经不能再继续乘2,换句话说末位的加权动作本来就是1*2^0,这一步中已经完成了,所以要把它分离出去,如下:
n%10= 1 //这样最后一位就拆解来了,并且已经完成十进制的转换。
然后返回的值是exchange(n/10)*2+x%10,我自己给这种情况起了一个名字叫“半返回状态”,因为返回值里面有一部分是需要继续实现功能的函数,所以此时数字部分要在这里等候,直到函数正式退出以后再一起返回。这样就可以实现二进制从低往高的每一位都乘以相应的2的幂后再加上被干掉的末尾数。这么说可能很绕。
大概是之前给别人培训做多了,哥最喜欢做的事,就是把复杂的问题讲的形象生动,下面是我的演示:

如果我以后这样讲学生还听不懂,我可能会把他打死!

        假设递归调用的函数时t:
         输入二进制数a:
         111111   //(对应的十进制应该是63)
         第一次进入函数:
          (a /10)去余 =11111   (作为传参调用)    
         (a%10)取余 = 1
         此时的返回值:t(11111)*2+1  为半返回状态,1不输出,在此等候。
         递归模式开启1:  
         第二次的返回值(a(1111)*2+1)*2+1=a(1111)*4  + 3   递归未结束,为半返回状态,3不输出,在此等候。
         第三次的返回值(a(111)*2+1)*4+2+1=a(111)*8  + 7   递归未结束,为半返回状态,7不输出在此等候。
         第四次的返回值(a(11)*2+1)*16+4+2+1=a(11)*16 +15     递归未结束,为半返回状态,15不输出,在此等候。
         第五次的返回值(a(1)*2+1)*32+16+4+2+1=a(1)*32 +31 = 1*32 + 31 = 63 递归结束,完全返回状态,输出63,走你☞

其实这道题还有别的算法,类似于我自己刚开始的循环算法,也是可以的,不过本人觉得这个算法比较叼,感觉脑洞被撬开了几个,再次感谢李涛。
.
.

今日内容:

1),数组
概念:同一类型的多个元素的集合——数组
结构: int array [5] = {0,1,2,3,4} //[]内数字代表数组的长度
类型 变量名 [大小] = 初始化
两种定义形式:int array[] = {1,2,3,4},int array[4] = {1,2,3,4}.

2),数组初始化,两种方式:
a,直接进行初始化
int array [5] = {0,1,2,3,4}
可以对全部元素赋值,此时可以不用指定数组的长度(还是写上的好,反正不费多大力气)。
上面的代码可以写成:int array[] = {0,1,2,3,4}

如果只给部分元素赋值,则其余元素都为当前类型的默认值:
0(int型) 0.000000(float型) 空(char型);

如果要全部赋值为零,可以写成:int array[] = {0}

b,生僻知识 –下标初始化

array[0] = 1
(前提是已经声明)
一维数组的声明 datatype arrayName [size]
类型说明符 标识符 大小

3),数组的取值
核心:下标取值(下标就是数组元素的顺序,参考JS)

数组是一大片连续的内存空间。

4)不合法定义

5)不能超过数组的边界,否则程序会崩溃。

—-穿插知识点 —
常量定义时define与const的区别:
http://blog.csdn.net/feng200950080206/article/details/7601988

C语言数组冒泡排序法:

好大一个坑,C语言的数组不能像JS那样直接打印整个数组(至少目前为止是这样),而是需要逐个数组循环打印。千万不能偷懒把打印的动作放在第一个循环里面(虽然它的循环次数正式我们要的),因为这时冒泡还没有结束,会出错,会出错,会出错。
一旦运气不好糊弄过去了,就掉的大。比如下面两个数组,用之前错误的方法进行冒泡排序,a可以糊弄过去,b就会发现问题。
a = [1,2,9,4,7,3,12,34,17,22]
b = [11,1,4,56,34,32,434,57,3,12]

#include<stdio.h>
void main(){
    int i = 0,j = 0;
    int a[10] = {11,1,4,56,34,32,434,57,3,12};
    printf("升序排列:\n");          
    for(i = 0;i <10;i++){
        for(j = 1;j<10;j++){
            if(a[j] < a[j-1]){
                a[j] = a[j] + a[j-1];
                a[j-1] = a[j] - a[j-1];
                a[j] = a[j] - a[j-1];
            }
        }       

    }
    for(i = 0;i <10;i++ ){
        printf("%d\t",a[i]);                
        getchar();
    }   
}

遗留问题:输入5个数,形成数组,再输入一个数,判断数组中是否有元素与之相同,利用函数,返回是或否。

JSON 与XML:

两者的共同优点是都是文本表示的数据格式,可以跨平台、跨系统交换数据。

可读性和可扩展性:,JSON和XML不相上下。

编码难度:JSON略比XML简单,要写好XML最好还是借助XML编辑器,标签的嵌套和配对手动输入来说容易出错。因此,从代码的可维护性角度而言,JSON优于XML。

内容解析:JSON在客户端只要使用eval()便可完成解析,在服务器端有包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等语言的解析支持,非常简单;而XML则相对复杂,不管在服务器端还是在客户端都需要花费大量的代码来实现解析。

数据表示和传输性能:JSON明显比XML简洁,格式简单,占用带宽少。

安全性:由于大部分Javascript库都是使用eval()来解析数据,存在执行恶意JSON数据的安全漏洞;当然可以使用专门的JSON解析器来避免这个问题。相比,XML更安全一些。

XML

优点:
1. 格式统一, 符合标准
2. 容易与其他系统进行远程交互, 数据共享比较方便
3.调用将 XML 用作传输的现有服务。
4.使用 XSLT 可以动态转换 XML。这是企业服务总线 (ESB) 方案中的理想功能。

缺点:
1. XML文件格式文件庞大, 格式复杂, 传输占用带宽
2. 服务器端和客户端都需要花费大量代码来解析XML, 不论服务器端和客户端代码变的异常复杂和不容易维护
3. 客户端不同浏览器之间解析XML的方式不一致, 需要重复编写很多代码 4. 服务器端和客户端解析XML花费资源和时间

JSON

优点:
1. 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小,浏览器解析快
2. 易于解析这种语言, 客户端JavaScript可以简单的通过eval()进行JSON数据的读取
3. 构造友好,支持多种语言, 包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等语言服务器端语言, 便于服务器端的解析
4. 在PHP世界, 已经有PHP-JSON和JSON-PHP出现了, 便于PHP序列化后的程序直接调用. PHP服务器端的对象、数组等能够直接生JSON格式, 便于客户端的访问提取.
5. 因为JSON格式能够直接为服务器端代码使用, 大大简化了服务器端和客户端的代码开发量, 但是完成的任务不变, 且易于维护 6.相当稳定。JSON 的附加内容将成为超集。

缺点:
1. 没有XML格式这么推广的深入人心和使用广泛, 没有XML
那么通用性
2. JSON格式目前在Web Service中推广还属于初级阶段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值