八、编写各种程序
1.函数式宏
函数和数据类型
平方和
#include<stdio.h>
int sqr_int(int x)
{
return x * x;
}
double sqr_double(double x)
{
return x * x;
}
int main()
{
int nx;
double dx;
printf("请输入一个整数:");
scanf("%d", &nx);
printf("该数的平方是%d\n", sqr_int(nx));
printf("请输入一个整数:");
scanf("%lf", &dx);
printf("该数的平方是%f\n", sqr_double(dx));
return 0;
}
版本一:名称功能相似的函数过多,程序显得复杂
#include<stdio.h>
#define sqr(x)((x)*(x))
int main()
{
int nx;
double dx;
printf("请输入一个整数:");
scanf("%d", &nx);
printf("该整数的平方是%d\n", sqr(nx));
printf("请输入一个整数:");
scanf("%lf", &dx);
printf("该整数的平方是%f\n", sqr(dx));
return 0;
}
版本二:运用了函数式宏,更简洁 #define命令给出指示如下: 若出现sqr(?)的表达式,就将其展开为((?)(?)) 函数式宏在使用上务必小心,例如sqr(a++)在展开后是((a++)(a++))会加两次,因此在定义和使用函数宏时,应该考虑是否会有副作用产生。
函数式宏和逗号运算符
响铃并显示的宏定义
#include<stdio.h>
#define putsa(str) (putchar('\a'),puts(str))
int main()
{
int na;
printf("请输入一个整数");
scanf("%d", &na);
if (na=0)
putsa("0");
else
putsa("不是0!");
return 0;
}
如果宏定义中要代换两个以上的表达式,使用逗号连接符连接,使其在语法上表示为一个表达式
2.枚举类型
枚举类型
显示所选小动物的叫声
#include<stdio.h>
enum animal {Dog,Cat,Monkey,Invalid};
void dog()
{
puts("汪汪!");
}void cat()
{
puts("喵!");
}void monkey()
{
puts("唧唧!");
}
enum animal select()
{
int tmp;
do
{
printf("0是狗,1是猫,2是猴子,3是结束");
scanf("%d", &tmp);
} while (tmp<Dog || tmp>Invalid);
return (tmp);
}
int main()
{
enum animal selected;
do
{
switch (selected = select())
{
case Dog:dog(); break;
case Cat:cat(); break;
case Monkey:monkey(); break;
}
} while (selected != Invalid);
return 0;
}
命名空间
枚举名和变量输入不同的命名空间,即使名称相同也能够区分。
3.输入和输出字符
getchar函数
gatchar函数的作用是读入字符并将其返回。 字符
C语言中的字符就是该字符中的字符编码。
计算标准输入流中的数字字符数
#include<stdio.h>
int main()
{
int i, ch;
int cnt[10] = { 0 };
while (1)
{
ch = getchar();
if (ch == EOF) break;
if (ch >= '0' && ch <= '9')
cnt[ch - '0']++;
}
puts("数字字符的出现次数");
for (i = 0; i < 10; i++)
printf("'%d':%d\n", i, cnt[i]);
return 0;
}
转义字符
复制
从标准输入流复制到标准输出流
#include<stdio.h>
int main()
{
int ch;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
数字字符计数程序会逐个读取输入字符。将输入的字符按原样输出。
|