《c语言从入门到精通第七章指针.ppt》由会员分享,可在线阅读,更多相关《c语言从入门到精通第七章指针.ppt(18页珍藏版)》请在金锄头文库上搜索。
1、指针指针韩都衣舍女装您值得拥有:http:/ 本例实现的是求1-100之间的素数,并以每6个数一行进行输出显示。#includeint prime (int n)/*定义函数prime*/ register int m;/*定义寄存器变量m*/ for (m=2;mn-1;m+) if (n%m=0) /*判断n是否能被m整除*/ return 0; return 1;void main() register int i; int n=1;/*定义寄存器变量i*/ for (i=3;i=100;i+=2) if (prime(i)/*调用函数*/ printf(%4d,i); if (n%6=
2、0)/*判断i是否能被6整除*/ printf(n); n+; 使用register定义局部变量 本实例中,定义的循环变量要对1-100之间的数据进行多次访问,因此可以设置为寄存器类型的变量,变量在程序运行中使用非常频繁,则存取该变量要消耗的时间就会很多,为了提高执行效率,C语言允许将局部变量的值存放在CPU中的寄存器中,寄存器变量占用CPU的高速寄存器,不占用内存单元。说明:如果某个变量被频繁访问,如执行循环或者函数调用等,可以将其定义为寄存器变量。小数分离 利用数学函数实现以下功能:从键盘中输入一个小数,将其分解成整数部分和小数部分并将其显示在屏幕上。#include #include m
3、ain() float number; double f, i; printf(input the number:); scanf(%f, &number); /*输入要分解的小数*/ f = modf(number, &i); /*调用modf函数进行分离*/ printf(%f=%f+%f, number, i, f); /*将分离后的结果按指定格式输出*/ getch(); return 0;小数分离 本程序中用到了modf()函数,具体使用说明如下:double modf(double num,double *i)该函数的作用是把num分解成整数部分和小数部分,该函数的返回值为小数部分
4、,把分解出的整数部分存放到由i所指的变量中。该函数的原型在math.h中。求任意数n次幂 利用数学函数实现以下功能:分别从键盘中输入底数及次幂,求出从该次幂开始的连续五个结果,要求每次次幂数加1。(范例位置:光盘(范例位置:光盘TMfl612TMfl612)#include #include main()float x, n;int i;printf(Please input the base:n);scanf(%f, &x); /*输入底数x*/printf(Please input the power:n);scanf(%f, &n); /*输入次幂数*/for (i = 1; i = 5
5、; i+)printf(%.1f%.1f is %.3fn, x, n, pow(x, n);/*将求出的结果输出*/n += 1;getch();求任意数n次幂本程序中用到了pow()函数,具体使用说明如下:double pow(double base,double exp)pow()函数的作用是计算以参数base为底的exp次幂baseexp。pow()函数的原型在math.h中。注意:如果参数base为零,或者exp小于零,则会出现定义域错误。如果参数base上溢,则会出现数出界错误。某日是该年的第几天 本实例要求编写一个计算天数的程序,即从键盘中输入年、月、日,在屏幕中输出此日期是该年
6、的第几天。(范例位置:光盘(范例位置:光盘TMfl613TMfl613)#includeint leap(int a)/*自定义函数leap用来指定年份是否为闰年*/ if (a % 4 = 0 & a % 100 != 0 | a % 400 = 0)/*闰年判定条件*/ return 1;/*是闰年返回1*/ else return 0;/*不是闰年返回0*/int number(int year, int m, int d)/*自定义函数number计算输入日期为该年第几天*/ int sum = 0, i, j, k, a12 = 31, 28, 31, 30, 31, 30, 31,
7、 31, 30, 31, 30, 31 ;/*数组a存放平年每月的天数*/ int b12 = 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ;/*数组b存放闰年每月的天数*/ 某日是该年的第几天 if (leap(year) = 1)/*判断是否为闰年*/ for (i = 0; i m - 1; i+) sum += bi;/*是闰年,累加数组b前m-1个月份天数*/ else for (i = 0; i m - 1; i+) sum += ai;/*不是闰年,累加数组a钱m-1个月份天数*/ sum += d;/*将前面累加的结果加上日期,
8、求出总天数*/ return sum;/*将计算的天数返回*/void main() int year, month, day, n;/*定义变量为基本整型*/ printf(请输入年月日n); scanf(%d%d%d, &year, &month, &day);/*输入年月日*/ n = number(year, month, day);/*调用函数number*/ printf(第%d天n, n);某日是该年的第几天 要实现本实例要求的功能主要有以下两个技术要点:1判断输入的年份是否是闰年,这里我们自定义函数leap来进行判断。该函数的核心内容就是闰年的判断条件即能被4整除但不能被100
9、整除,或能被400整除。2如何求此日期是该年的第几天。这里将12个月每月的天数存到数组中,因为闰年2月份的天数有别于平年,故采用两个数组a和b分别存储。当输入年份是平年,月份为m的时就累加存储着平年每月天数的数组的前m-1个元素,将累加的结果加上输入的日便求出了最终结果,闰年的算法类似。递归解决年龄问题 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第1个人大两岁。最后问第1个人,他说是10岁。编写程序当输入第几个人时求出其对应年龄。#includeint age(int n)/*自定义函数age
10、*/ int f; if(n=1) f=10;/*当n等于1时,f等于10*/ else f=age(n-1)+2;/*递归调用age函数*/ return f;/*将f值返回*/main() int i,j;/*定义变量i,j为基本整型*/ printf(你想知道第几个人的你年龄,请输入:n); scanf(%d,&i);/*输入i的值*/ j=age(i);/*调用函数age求年龄*/ printf(他的年龄是%d岁n,j);/*将求出的年龄输出*/递归解决年龄问题 要实现本实例要求的功能主要有以下两个技术要点:本实例中age函数被递归调用,这里详细分析下递归调用的过程,递归的过程分为两个
11、阶段:第一阶段是“回推”,由题可知,要想求第5个人的年龄必须知道第4个人的年龄,要想知道第4个人的年龄必须知道第3个人的年龄直到第1个人的年龄,这时age(1)的年龄已知,就不用再推。“回推”的过程可以用图递归解决年龄问题 本实例中age函数被递归调用,这里详细分析下递归调用的过程,递归的过程分为两个阶段:第一阶段是“回推”,由题可知,要想求第5个人的年龄必须知道第4个人的年龄,要想知道第4个人的年龄必须知道第3个人的年龄直到第1个人的年龄,这时age(1)的年龄已知,就不用再推。“回推”的过程可以用图 递归解决年龄问题 第二阶段是“递推”,从第2个人推出第3个人的年龄一直推到第5个人的年龄为
12、止。这里要注意必须要有一个结束递归过程的条件,本实例中就是当n=1时f=10也就是age(1)=10,否则递归过程会无限制进行下去。总之递归就是在调用一个函数的过程中又出现直接或间接第调用该函数本身。因此“回推”可以看成是个“下楼梯”的过程而“递推”则是个“上楼梯”的过程,将这两个结合起来就是递归。一数三平方 有这样一个六位数,它本身是一个整数的平方,其高三位和低三位也分别是一个整数的平方,例如225625=4752,225=152,625=252,求满足上述条件的所有六位数。(范例位置:光盘(范例位置:光盘TMfl615TMfl615)#include #include main() lon
13、g i, n, n1, n2, n3, n4, count = 0; /*定义变量为长整形*/ printf(The result is:n); for (i = 100000; i = 999999; i+)/*遍历所有的六位数*/ n = (long)sqrt(i); /*对i值开平方得到一个长整型数值n*/ if (i = n *n)/*判断n的平方是否等于i*/ n1 = i / 1000; /*求出高三位数*/ n2 = i % 1000; /*求出低三位数*/ n3 = (long)sqrt(n1); /*对n1值开平方得到一个长整型数值n3*/ n4 = (long)sqrt(n
14、2); /*对n2值开平方得到一个长整型数值n4*/ 一数三平方 if (n1 = n3 *n3 & n2 = n4 *n4) /*判断是否同时满足n1等于n3的平方,n2等于n4的平方*/ count+; /*count作为计数器,记录满足条件的个数*/ printf(%ld, i); /*将最终满足条件的i值输出*/ printf(nTotal is :%dn, count); /*输出满足条件的个数*/要实现本题目中的要求有许多方法,本实例也只是其中的一种,下面来介绍下具体的求解思路:程序中用到了sqrt函数,该函数的一般形式如下:double sqrt(double num);函数的作用是返回参数num的平方根,这里我们可以发现sqrt的返回值是一个double型,程序中我们将sqrt的返回值强制转换成长整形,这样会使开平方后得到的小数(小数点后不为0)失去其小数点后面的部分,那么再对这个强制转换后的数再平方所得的结果将不会等于原来开平方前的数。若开平方后得到的小数其小数点后的部分为0则将其强制转换为长整型也不会产生数据流失,那么再对这个强制转换后的数再平方所得的结果就将等于原来开平方前的数。我们利用这个方法就能很好的判断出一个数开平方后得到的数是否是整数。一数三平方 Thank you