本任务通过学习几个字符串应用的例子,加深大家对字符串应用的理解。
【例6-24】输入一个正整数,请求出该整数的位数,并将每一位上的数字输出。
此程序中由于不知道是多少位的整数,如果直接求解比较麻烦,尤其在学习数组以前。学习完数组后,可以用循环从个位数开始将此整数分解,并将分解后得到的每一位上的数字存储在一个整型数组中,最后倒叙输出此数组即可,源程序如下:
借助于一个整型数组,比单纯用分支和循环语句解决此问题要方便得多。在学习完字符串后,如果将输入的整数作为字符串看待,此问题更容易解决,源程序如下:
程序运行结果如下:
请输入一个正整数:123456
是一个6位的正整数,其各位数字是:1 2 3 4 5 6
程序中将整数作为字符串输入字符数组ch,省略了分解过程,只需从前到后依次将数组每一个单元中的字符输出即可。所以请注意,数据输入或输出的形式和该数据在程序中的处理过程并没有直接的关系,使用这一思想,可能更方便问题的解决。
【例6-25】请输入一个二进制数,编程序计算该二进制数对应的十进制数并输出。将一个二进制转换成对应的十进制数,以(1101)2为例,其转换方法为:
其本质是一个累加求和的过程,求2的次幂的运算可以通过循环乘2实现,过程如下:
算法问题解决,程序中最关键的问题就是如何存储一个二进制数。C语言中一个int型数据占4个字节(32个位),也就是说最多应允许输入一个32位的二进制数。可以考虑用一个字符数组存储一个二进制数,即将输入的二进制数作为字符串存储,在运算过程中只要将每一个单元中的字符1或字符0转换成数字1或数字0即可。源程序如下:
【例6-26】输入一行字符,统计其中单词的个数,单词之间用一个或多个空格分隔。注意第一个单词之前或最后一个单词之后也可能存在空格。
如输入:
Little Tom and the sailors spent two months aboard.
则其中单词为9。
判断其中单词个数,可以用如下方法:
从左到右判断每一个单元,如果某单元为空格但其后单元不为空格,则意味着一个新单词的出现,计数器加1。注意第一个单词,按此方法,若第1个单词前边没有空格,则该单词不会被统计,因此字符串处理完后,应再单独处理第一个单词。源程序如下:
也可以采取另外一种思路:如果当前单元不为空格,但其后单元为空格,则意味一个单词的结束,计数器加1。使用此方法时,若最后一个单词后没有空格则不会被统计,因此在循环结束后应对最后一个单词单独处理。源程序留给同学们自己实现。
【例6-27】输入n(n<=10)个字符串并按照从小到大的顺序对这n个字符串排序,输出排序结果。
要完成n个字符串的排序,排序方法仍然可以使用前边学习过的任意一种排序方法,只是在做字符串的比较和交换时,使用函数完成即可,问题的关键是如何存储这n个字符串。一个字符串对应一个一维字符数组,要保存n个字符串,当然需要n个一维字符数组,结合前边所学,二维数组就是一维集合,所以可以用一个n行的二维字符数组来保存这n个字符串。源程序如下:
在程序中输入n的值后,即执行了一个getchar操作,这是因为在输入n的值以后,我们一定会敲回车,而回车也是作为字符串输入结束标记的,如果没有此getchar操作,在输入字符串时会将第一个字符串输入为空串,这样在循环输入时只能输入4个字符串。由于回车既可以作为一个字符,也可以作为一个字符串输入结束的标记,因此在处理字符或字符串类型的数据时,要注意处理多余的回车符,避免对程序产生影响。
综合实训
1.输入n个整数并按照从小到大的顺序输出,n不超过20,排序方法任选。
2.有两个M×N的矩阵,请编程完成矩阵相加的运算。M和N均不大于10,两个矩阵相加是指将两个矩阵对应位置的值逐个相加。
3.编程求出第n个斐波那契数。注意n值可能比较大,此时第n个斐波那契数可能超出int型数据的表示范围。对于超范围的整数,可以定义一个整型数组,用此数组的每一个单元保存整数的每一位,此时将整数相加的运算转换成将两个数组相加即可。
课后习题
一、单项选择题
1.以下对一维数组定义中正确的是( )。
A.int a(10)B.int a[0..10]C.int a[10]D.int n=10;int a[n];
2.以下对二维数组定义形式中正确的是( )。
A.int a(5)(10)B.int a(5,10)C.int a[5,10]D.int a[5][10];
3.以下对二维数组定义形式中正确的是( )。
A.int a[][]={1,2,3,4,5,6,7}B.int a[][3]={{1,2},{3},{4,5,6,7}}
C.int a[3][]={1,2,3,4,5,6,7}D.int a[][3]={1,2,3,4,5,6,7}(www.xing528.com)
4.假设一个int型内存单元占4个字节,若有定义:int a[5]={1,2,3};则数组a在内存中共占用( )个字节。
A.5 B.3 C.20 D.12
5.引用数组元素时,数组单元的下标可以是( )。
A.整型常量 B.整型表达式
C.整型常量或整型表达式 D.任何类型的表达式
6.若有说明:int a[10];则正确的数组元素引用形式是( )。
A.a(10)B.a[10]C.a[3+4]D.a[3-4]
7.以下能对一维数组正确初始化的语句是( )。
A.int a[5]=0 B.int a[5]={0}
C.int a[5] D.int a[5]
a={1,2,3,4,5} a[5]={1,2,3,4,5}
8.以下不能对二维数组正确初始化的语句是( )。
A.int a[2][3]={0} B.int a[][3]={{1,2},{3},{4,5,6}}
C.int a[][3]={1,2,3,4,5,6}D.int a[3][]={1,2,3,4,5,6}
二、请写出以下程序的运行结果
1.以下程序的输出结果是________。
2.以下程序的输出结果是_________。
3.以下程序的输出结果是________。
4.以下程序的输出结果是_________。
5.以下程序的输出结果是________。
6.以下程序的输出结果是_________。
三、程序设计题
1.输入10个整数,并将第一个最后一个交换位置,第二个和倒数第二个交换,以此类推,输出交换后的结果。
2.输入10个整数,再输入一个正整数k,然后将这10个整数循环左移k个位置,并输出移位后的结果。如输入1、2、3、4、5、6、7、8、9、10,循环左移4位的结果应是:5、6、7、8、9、10、1、2、3、4。
3.自己定义函数实现字符串比较运算(不能使用strcmp函数)。
4.一个对称的二维数组可以用一个一维数组来存储,如:
则在存储时仅仅存储主对角线以下的三角区域即可,其存储形式为:
现有一个一维数组,请编程输出其对应的二维数组。
5.有一个二维数组,请编程求出每一行中的最大值,并求出这些最大值的和。
6.有一个二维数组,请编程将每一列的最小值放在该列的最开头(行下标为0),然后输出此二维数组。
7.找出一个二维数组中的所有的马鞍点,即该位置上的元素在该行上最大、在该列上最小,若没有马鞍点,则输出Not Found。
8.一维数组中存放了10个小于100的整数,请编程对所有的数据按照个位从大到小的顺序进行排序,若个位相等,则按照十位从小到大的顺序排序,输出排序后的结果。
9.请输入一个字符串,并对字符串中的偶数位置的字符按从小到大的顺序排序,奇数位置的字符不动,输出排序后的结果(这里的位置指的是数组的下标,即将0、2、4…单元的字符排序)。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。