本文参考C Primer Plus进行C语言学习
文章目录
- 带参数的函数
- C Primer Plus第五章编程题
一.带参数的函数
#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()函数的原型说明了两点:
- 该函数没有返回值
- 该函数有一个int类型的参数
该例中,函数原型告诉编译器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类型表示的范围,这样做也不行。
2.C Primer Plus第五章编程题
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 <stdio.h>
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;
}
- 编写一个程序,要求用户输入一个华氏温度。程序应读取double类型的值作为温度值,并把该值
作为参数传递给一个用户自定义的函数Temperatures()。该函数计算摄氏温度和开氏温度,并以小数点后面两位数字的精度显示3种温度。要使用不同的温标来表示这3个温度值。下面是华氏温度转摄氏温度的公式:
摄氏温度=5.0/9.0*(华氏温度-32.0)
开氏温标常用于科学研究,0 表示绝对零,代表最低的温度。下面是摄氏温度转开氏温度的公式:
开氏温度=摄氏温度+273.16
Temperatures()函数中用const 创建温度转换中使用的变量。在main()函数中使用一个循环让用户重复输入温度,当用户输入q或其他非数字时,循环结束。scanf()函数返回读取数据的数量,所以如果读取数字则返回1,如果读取q则不返回1。可以使用---运算符将scanf()的返回值和1作比较,测试两值是否相等。
#include <stdio.h>
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);
}