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

来源:互联网 发布:淘宝家居椅子 编辑:程序博客网 时间:2024/05/22 04:51

- - - - - - - - - - - - - - - 触控未来的日子–Day 34- - - - - - - - - - - - - -

昨天没有交作业,因为我不会用递归,只会用循环(其实用循环也费了老大的功夫)。知之为知之,不知为不知!我不想交一个与题目要求不符的答案上去,尽管这样说有解释之嫌。不过话说回来,相比其他同学,我这班长当的很惭愧!
听说几次不及格就要延迟就业,我觉得这样其实很合理,基础不扎实就上岗也是对用人单位的不负责。我不怕被延迟,我只是不能接受落后于人,毕竟我从来都没有觉得自己比别人智商低。

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

(思路:因为暂时找不到直接让计算机将我输入的数字当做二进制数,所以只能输入一个伪二进制的十进制数,比如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();}

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

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

首先感谢李涛同学的代码提示,让我对递归的疑惑瞬间解开,先附上昨晚家庭作作业第一题的递归做法

//输入一个数,输出它的十进制数,递归做法#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