【例1】 用C语言编程输入10个整数,要求逆序打印其中的自然数,例如,输入12,-23,5,0,45,-81,72,56,90,28,程序输出的结果为28,90,56,72,45,5,12
分析: 根据题意,需要定义一个能存放 10 个整数的数组 num 和用于控制下标变化的计数器 i,利用循环,让计数器 i递增,依次输入各个初值,然后再利用计数器 i 递减逆序访问每个数组元素,最后打印其中的非零正数。
// Description: 输入10 个整数,要求逆序打印其中的自然数。
#include
void main( void )
{
short num[10], i ;
printf("请输入10个整数:");
for(i=0; i<10; i++) // 顺序输入10个数据
scanf("%d,",&num[i]);
printf("逆序打印其中的自然数:");
for(i=9; i>=0; i--) //逆序访问各数组元素
if(num[i]>0)
printf("%d,", num[i]); //打印正数
}
【例】 用C语言编程输入10个整数存入数组num,找出其中的最大数和它所在的位置。 排序过程: 【例】 用C语言编程实现对10个整数按从小到大顺序进行选择法排序,最后输出排序结果。 排序过程: (2)对前n-1个数进行第二趟扫描,结果使次最大的数被安置在第n-1个元素位置。 (3)重复上述过程,最多经过n-1趟扫描后,排序结束 【例 】 用 C 语言编程实现在按从大到小顺序排好序的 15 个整数中查找输入的数 x,如果找到 x,打印其位置,否则输出“未找到 x! ”的提示。 1)Mid代表当前查找区间的中间点位置: 注意:二分查找的查找对象是已经排好序的数据。 我们经常要插入一个新数到排好序的数据序列中,要求新的序列仍然保持原有顺序。常见的操作还有删除、逆序、合并等。 循环访问N个元素的数组是指从头依次访问数组的每一个元素到队尾后,在从头开始访问数组。可以设计一个计数器从0递增到N-1依次访问数组的每一个元素,当计数器的值为N时将计数器重新置为0从头开始访问。 经典例题:约瑟夫问题 【例1】 编程实现指定二维数组的转置。 【例2】 编程求指定二维数组中最小元素的值及其位置(行列号)。 【例1】 不用strcmp函数编程实现对输入两个字符串的比较。 【例2】 不用itoa函数,编程实现将一个输入的整数转换为字符串。(字符转换) 【例 3】 编程实现将一个输入的口令字符串加密。 字符串加密是指按照一定的规律将代表秘密的字符串,如口令,变换成没有意义的内容。加密过的文字,即使被别有用心的人得到,也无从得知里面的内容。合法用户则可以根据对应的规律将密文还原成原文使用。 【例4】 已知10 名同学的姓名和考试成绩,编程实现按姓名的字典顺序将其递增排序。
分析: 根据题意,必须先定义一个能存放输入的 10 个整数的数组 num、计数器 i,利用循环,让计数器 i从 0 递增到9,依次输入 10 个整数存到 num[i]中。当然,还要定义一个存放最大数的变量 Max、一个存放最大数所在位置的变量 MaxPos。对于查找极值的问题,初值的选取是非常重要的,不能随便定,如果选 0 作为最小值,就无法发现输入数据中比 0 更小的负数。查找极值的算法通常选取数组的起始元素和起始位置作为初值。然后利用计数器 i 从 1到 9,依次用 num[i]和 Max 比较,若 Max#include
3. 排序
1 选择法
(1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一
个数交换—第一趟选择排序,结果最小的数被安置在第一
个元素位置上
(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的
记录,将它与第二个数交换—第二趟选择排序
(3)重复上述过程,共经过n-1趟排序后,排序结束
分析: 根据题意,必须先初始化一个存放了 10 个整数的数组 Num,定义两个计数器 i、j,利用两重循环,让计数器 i 负责扫描 n−1 趟,让计数器 j 在内循环中进行 n−i 次比较。在 i 次循环时, 把第 i 个元素的位置 i 赋予变量 pos。 内循环从 Num[i+1]起一直比到最后一个元素,逐个与位置 pos 对应元素 Num[pos]作比较,将更小元素的位置记录到 pos 中。内循环结束后, pos 对应了最小元素, 如果 i=pos 表示 Num[i]就是最小的, 否则交换 Num[i]和 Num[pos]之值。排好 Num[i]后转入下一轮外循环。对 i+1 以后各个元素排序。最后将排序结果打印出来。 // Description: 对10个整数按从小到大顺序进行选择法排序
#include
2 冒泡法(bubble sort)--相邻元素比较交换法
(1)第一趟扫描:从i=1开始,依次比较A[i]与A[i+1] ,若为逆序(A[i]>A[i+1]),则交换其值;依次类推,直至第n-1个数和第n个数比较为止——第一趟扫描使最大的数被安置在第n个元素位置上。// Description: 对10个浮点数按从小到大顺序进行冒泡法排序。
#include
4. 二分查找(Binary Search,又称折半查找)
分析: 设数组Num存放按从大到小顺序排好序的SIZE个数,Begin代表查找区间的起点(初值为0)、End代表终点(初值为SIZE-1)
Mid=( Begin + End )/2。
2)若x >Num[Mid] ,则x必定在区间[0,Mid-1]中,
需要将End修正为Mid-1。
3)若x
4)重复这一过程直至找到x为止。
如果当前查找区间为空(End// Description: 按从大到小顺序排好序的15个整数中查找输入的数x。
#include
5. 插入
【例 】 用 C 语言编程实现在按从小到大顺序排好序的 9 个浮点数中插入一个输入的数,要求新的序列仍然保持原有顺序。
分析: 由于要插入一个新数到原数据序列中,我们在初始化一个存放按从小到大顺序排好序的浮点数数组 Num时,数组 SIZE 长度至少要设置成 9+1=10个,这是插入问题的关键所在。最后一个数据元素在初始化时不要赋值。可以将要插入的数存到这个位置上。将它和前面的SIZE−1 个数据依次比较,如果发现Num[i]>Num[SIZE-1],违背了从小到大排列的规律,互换其值。如果比较到最后都没有发现比 Num[SIZE-1]大的数,那就将插入的新数放在最后。// Description: 在按从小到大顺序排好序的9个浮点数中插入输入的数
#include
6.循环访问数组
// Description: 打印约瑟夫(Joseph)环的出圈顺序表。
#include
二、 二维数组程序举例
解题思路: 二维数组的转置是指将一个二维数组行和列的元素互换,存到另一个二维数组中去。// Description: 将指定二维数组转置。
#include
解题思路: 这是二维数组的求极值问题。参照一维数组的分析,先初始化一个二维数组Matrix、计数器i、j,还要定义一个存放最小数的变量Min、一个存放最小数所在位置的变量MaxPosi、
MaxPosj。选取数组的起始元素和起始位置作为上述变量的初值。然后利用循环依次用Matrix[i][j]和Min比较,若Min>Matrix[i][j],令Min= Matrix[i][j]。最后打印最小元素的值及其位置。// Description: 求指定二维数组中最小元素的值及其位置。
#include
三、字符串应用举例
(字符串处理)
分析: 首先要根据题意定义两个一维字符数组,接受输入的两个字符串。然后借助计数器 i 从左向右对两个字符串第 i 个字符逐个比较其 ASCII 码值,直到存在差异或遇到字符串结束符NULL 为止,并由两个字符 ASCII码值差的三种情况显示相应比较结果。 // Description: 不用strcmp函数,实现对输入两个字符串的比较。
#include
分析: 库函数 atoi可以把一个数字字符串转换成对应整数,而 itoa 可以将一个输入的整数转换为字符串。根据题意定义一个整型变量 Num存放输入的整数,一个一维字符数组 Str,借助计数器 i从右向左求 Num逐位数字, 并将其转换成 ASCII字符, 直到处理完符号位为止,将所得字符串逆序并显示即可。 // Description: 不用库函数,将一个输入的整数转换为字符串。
#include
(基于字符的加密、解密)
字符串加密、解密的方法有很多,简单一点的是直接对字符加上或减去一个数,从而将字符变成另一个数。更进一步是将这个数换成一串复杂的密文(密钥) ,或干脆使用一张字符变换对照表……// Description: 将一个输入的口令字符串加密。
#include
本题首先要根据题意初始化一个二维字符数组Names[10][10]存放10 名同学的姓名、一个一维数组Scores[10]存放10名同学的考试成绩,然后借助冒泡法、选择法排序算法的思想对其排序,需要注意的是:
首先,字符串不能直接比较大小,需要调用strcmp 函数,交换顺序时要调用strcpy函数,为此需要嵌入string.h。
其次,在交换姓名的同时,必须将对应的成绩也要进行交换。
将上述思路转换成C源程序:// Description: 编程将10名同学的姓名和考试成绩按姓名递增排序。
#include