本文参考C Primer Plus进行C语言学习
-
- #include<stdio.h>
- void pound(int n); //ASC函数原型声明
- int main()
- {
- int times=5;
- char ch='!'; //ASCⅡ码是33
- float f=6.0f;
-
- pound(times); //int类型的参数
- pound(ch);
- pound(f);
- return 0;
- }
-
- void pound(int n)
- {
- while(n-->0)
- printf("#");
- printf("\n");
- }

如果函数不接受任何参数,函数头的圆括号应该写上关键字void。由于该函数接受一个int类型的参数,所以圆括号中包含一个int类型n的声明。
声明参数就创建了被称为形式参数 的变量。该例中,形式参数是int类型的变量n。像pound(10)这样的函数调用会把10赋给n。在程序中,pound(times)就是把times的值(5)赋给n。我们称函数调用传递的值为实际参数。所以,函数调用pound(10)把实际参数10传递给函数,然后该函数把10赋值给形式参数(变量n)。也就是说,main()中变量的值被拷贝给pound()中的新变量。
变量名是函数私有的,即在函数中定义的变量名不会和别处的相同名称发生冲突。如果在pound()中用times()代替n,那么这个times和main()中的times不同。也就是说,程序中出现了两个相同的变量名,但是函数可以区分它们。
现在,我们来学习函数调用。第一个函数调用是pound(times),times的值5被赋给n。因此,printf()函数打印了5个#和一个换行符。第二个函数调用是pound(ch),!在ASCⅡ中值为33.但是pound()函数的参数类型是int,与char不匹配。函数开头的函数原型在这里发挥了作用。原型即是函数的声明,描述了函数的返回值和参数。pound()函数的原型说明了两点:
该例中,函数原型告诉编译器pound()需要一个int类型的参数。相应地,当编译器执行到pound(ch)表达式时,会把参数ch 自动转换成int类型。在我们的系统中,该参数从1字节的33变成4字节的33,所以现在33的类型满足函数的要求。与此类似,最后一次调用是pound(f),使得float类型的变量被转换成合适的类型。
在ANSI C之前,C使用的是函数声明,而不是函数原型。函数声明只指明了函数名和返回类型,没有指明参数类型。为了向下兼容,C现在仍然允许这样的形式:
void pound(); /*ANSI C之前的函数声明*/
如果用这条函数声明代替pound.c程序中的函数原型会怎样?第1次函数调用,pound(times)没问题,因为times 是int 类型。第2次函数调用,pound(ch)也没问题,因为即使缺少函数原型,C也会把char和short 类型自动升级为int 类型。第3次函数调用,pound(f)会失败,因为缺少函数原型,float会被自动升级为double。在函数调用中使用强制类型转换,可以修复这个问题:
pound((int)f); //把f强制转换为正确类型
注意,如果f的值太大,超过了int类型表示的范围,这样做也不行。
1.编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时间。使用#define或const创建一个表示60的符号常量或const 变量。通过while循环让用户重复输入值,直到用户输入小于或等于0的值才停止循环。
- #include<stdio.h>
- #define TIME 60;
- int main()
- {
- int min,hour;
- printf("请输入分钟数:\n");
- scanf("%d",&min);
- while(min>0) //不可写成<=
- {
-
- hour=min/TIME;
- min=min%TIME;
- printf("转换为%d小时,%d分钟\n",hour,min);
- printf("请输入分钟数:\n");
- scanf("%d",&min);
- }
-
- }

2.编写一个程序,提示用户输入一个整数,然后打印从该数到比该数大10的所有整数(例如,用户输入5,则打印 5~15的所有整数,包括5和15)。要求打印的各值之间用一个空格、制表符或换行符分开。
- #include<stdio.h>
- int main()
- {
- int num,sum;
- scanf("%d",&num);
- sum=num+11;
- while(num<sum)
- {
- printf("%d ",num++);
- }
- return 0;
- }

3.编写一个程序,提示用户输入天数,然后将其转换成周数和天数。例如,用户输入18,则转换成2周4天。以下面的格式显示结果:
18 days are 2 weeks, 4 days.
通过while循环让用户重复输入天数,当用户输入一个非正值时(如0或-20),循环结束。
- #include<stdio.h>
- #define DAY 7;
- int main()
- {
- int day,week,days;
- printf("请输入天数:");
- scanf("%d",&day);
- while(day>0)
- {
- week=day/DAY;
- days=day%DAY;
- printf("%d days are %d weeks,%d days\n",day,week,days);
- printf("请输入天数:");
- scanf("%d",&day);
- }
- return 0;
- }

4.编写一个程序,提示用户输入一个身高(单位:厘米),并分别以厘米和英寸为单位显示该值,允许有小数部分。程序应该能让用户重复输入身高,直到用户输入一个非正值。其输出示例如下:Enter a height in centimeters: 182
182.0 cm = 5 feet,11.7 inches
Enter a height in centimeters (<=0 to quit):168.7
168.0 cm = 5 feet, 6.4 inches
Enter a height in centimeters (<=0 to quit):0
bye
-
- #include <stdio.h>
- #define CM_to_INCH 2.54
- #define CM_to_FEET 30.48
- int main(void)
- {
- float height, inch;
- int feet;
-
- printf("请输入一个身高(厘米):");
- scanf("%f", &height);
- while (height > 0){
- feet = height / CM_to_FEET;
- inch = (height - feet * CM_to_FEET) / CM_to_INCH;
- printf("%.2f cm = %d feet, %.2f inches\n", height, feet, inch);
- printf("请输入一个身高(厘米):");
- scanf("%f", &height);
- }
- return 0;
- }

5.修改程序 addemup.c(程序清单 5.13),你可以认为 addemup.c是计算20天里赚多少钱的程序(假设第1天赚S1、第2天赚$2、第3天赚$3,以此类推)。修改程序,使其可以与用户交互,根据用户输入的数进行计算(即,用读入的一个变量来代替20)。
- #include <stdio.h>
- int main(void)
- {
- int i = 1, count = 0, sum = 0;
-
- while (i<21)
- {
- printf("请输入您第 %d 天的收入:", i);
- scanf("%d", &count);
- sum = sum + count;
- i++;
- }
- printf("这20天的总收入为:%d元\n", sum);
-
- return 0;
- }

6.修改编程练习5的程序,使其能计算整数的平方和(可以认为第1天赚$1、第2天赚$4、第3天赚$9,以此类推,这看起来很不错)。C没有平方函数,但是可以用n*n来表示n的平方。
- #include <stdio.h>
- int main(void)
- {
- int i = 1, count = 0, sum = 0;
-
- while (i<21)
- {
- count=i*i;
- printf("请输入您第 %d 天的收入:%d元\n", i,count);
- sum = sum + count;
- i++;
- }
- printf("这20天的总收入为:%d元\n", sum);
-
- return 0;
- }

7.编写一个程序,提示用户输入一个double类型的数,并打印该数的立方值。自己设计一个函数计算并打印立方值。main()函数要把用户输入的值传递给该函数。
- #include
- void lifang(double n);
- int main(void)
- {
- double num;
- scanf("%lf",&num);
- lifang(num);
- return 0;
- }
- void lifang(double n)
- {
- double lifang_n;
- lifang_n=n*n*n;
- printf("该数的立方值为:%lf",lifang_n);
- }

8.编写一个程序,显示求模运算的结果。把用户输入的第1个整数作为求模运算符的第2个运算对象,该数在运算过程中保持不变。用户后面输入的数是第1个运算对象。当用户输入一个非正值时,
- #include <stdio.h>
- int main(void)
- {
- int n1, n2, n3;
-
- printf("请输入两个整数:");
- scanf("%d %d", &n1, &n2);
- while (n1 > 0 & n2 > 0)
- {
- n3 = n2 % n1;
- printf("求模运算结果为:%d %% %d = %d\n", n2, n1, n3);
- printf("请输入两个整数:");
- scanf("%d %d", &n1, &n2);
- }
- printf("Error!");
-
- return 0;
- }
-
9. 编写一个程序,要求用户输入一个华氏温度。程序应读取double类型的值作为温度值,并把该值
作为参数传递给一个用户自定义的函数Temperatures()。该函数计算摄氏温度和开氏温度,并以小数点后面两位数字的精度显示3种温度。要使用不同的温标来表示这3个温度值。下面是华氏温度转摄氏温度的公式:
摄氏温度=5.0/9.0*(华氏温度-32.0)
开氏温标常用于科学研究,0 表示绝对零,代表最低的温度。下面是摄氏温度转开氏温度的公式:
开氏温度=摄氏温度+273.16
Temperatures()函数中用const 创建温度转换中使用的变量。在main()函数中使用一个循环让用户重复输入温度,当用户输入q或其他非数字时,循环结束。scanf()函数返回读取数据的数量,所以如果读取数字则返回1,如果读取q则不返回1。可以使用—运算符将scanf()的返回值和1作比较,测试两值是否相等。
- #include
- void Temperatures(double fahrenheit);
- int main(void)
- {
- double temp_fahrenheit;
-
- printf("请输入一个华氏温度:");
- while (scanf("%lf", &temp_fahrenheit) == 1)
- {
- Temperatures(temp_fahrenheit);
- printf("请输入一个华氏温度:");
- }
- printf("Done!");
- getchar();
- getchar();
- return 0;
- }
- void Temperatures(double fahrenheit)
- {
- const double a = 1.8, b = 32.0, c = 273.16;
- double centigrade, kelvin;
- centigrade = a * (fahrenheit - b);
- kelvin = centigrade + c;
- printf("华氏温度为:%.2lf, 对应的摄氏温度为:%.2lf, 开氏温度:%.2lf\n", fahrenheit, centigrade, kelvin);
- }
