最近要复习一下C和C++的基础知识,于是计划把之前学过的谭浩强的《C程序设计》和《C++程序设计》习题重新做一遍。
编译环境为:操作系统32位Win7,编译工具VC++6.0
第八章:预处理命令
9.1)定义一个带参数的宏,实现两参数的值互换
#include<stdio.h>
#define Swap(x,y) int temp = x; x = y; y = temp;
void main()
{
int x, y;
scanf("%d%d", &x, &y);
printf("交换前:");
printf("x=%d;y=%d\n", x, y);
Swap(x,y);
printf("交换后:");
printf("x=%d;y=%d\n", x, y);
}
9.2)输入两个整数,求它们相除的余数
#include<stdio.h>
#define Mod(x,y) x % y
void main()
{
int x, y;
scanf("%d%d", &x, &y);
//printf中用连续的两个百分号输出一个百分号
printf("x=%d;y=%d;x%%y=%d\n", x, y, Mod(x,y));
}
9.3)定义一个带参数的宏,通过海伦公式计算三角形面积
#include<stdio.h>
#include<math.h>
#define p(a,b,c) (a+b+c)/2.0
#define area(a,b,c) sqrt(p(a,b,c)*(p(a,b,c)-a)*(p(a,b,c)-b)*(p(a,b,c)-c))
void main()
{
double a, b, c;
scanf("%lf%lf%lf", &a, &b, &c);
printf("三边边长:%lf %lf %lf\n", a, b, c);
printf("面积:%lf\n", area(a,b,c));
}
9.4)定义宏LEAP_YEAR(year),判断某年year是否为闰年
#include<stdio.h>
#define LEAP_YEAR(year) (year%400)?((year%100)?((year%4)?0:1):0):1
void main()
{
int year;
scanf("%d", &year);
if(LEAP_YEAR(year))
{
printf("year %d is a leap year\n", year);
}
else
{
printf("year %d is a not leap year\n", year);
}
}
9.6)设计实数输出格式,实数用 %6.2f 格式输出
#include<stdio.h>
#define _N_ "\n"
#define _F_ "%6.2f"
#define _F1_ _F_ _N_
#define _F2_ _F_ _F_ _N_
#define _F3_ _F_ _F_ _F_ _N_
void main()
{
float x = 1, y = 2, z = 3;
printf(_F1_, x);
printf(_F2_, x, y);
printf(_F3_, x, y, z);
}
9.7)设计所需的各种输出格式,放到format.h中
format.h中代码
#define NL "\n"
#define D "%d"
#define D2 "%d %d"
#define D3 "%d %d %d"
#define D4 "%d %d %d %d"
#define D5 "%d %d %d %d %d"
#define O "%o"
#define X "%x"
#define U "%u"
#define C "%c"
#define S "%s"
#define F "%f"
#define F2 "%f %f"
#define F3 "%f %f %f"
#define F4 "%f %f %f %f"
#define F5 "%f %f %f %f %f"
#define E "%e"
#define G "%g"
#define LF "%lf"
#define LF2 "%lf %lf"
#define LF3 "%lf %lf %lf"
#define LF4 "%lf %lf %lf %lf"
#define LF5 "%lf %lf %lf %lf %lf"
程序代码
#include<stdio.h>
#include"format.h"
void main()
{
int x = 1, y = 2, z = 3;
printf("输出3个整数");
printf(D3 NL, x, y, z);
float a = 1.0, b = 2.0, c = 3.0, d = 4.0;
printf("输出4个浮点数");
printf(F4 NL, a, b, c,d);
}
9.8)分别用函数和带参数的宏,从3个数中找出最大的数
#include<stdio.h>
//通过宏比较大小
#define max1(x,y,z) x>y?(x>z?x:z):(y>z?y:z)
//通过函数比较大小
int max2(int x, int y, int z)
{
return x > y ? (x > z ? x : z) : (y > z ? y : z);
}
void main()
{
int a = 3, b = 4, c = 5;
printf("max:%d\n", max1(a,b,c));
printf("max:%d\n", max2(a,b,c));
}
9.10)输入一段字符串。使用条件编译,如果之前定义的宏CHANGE为1,则将字符串中所有英文字母顺序后移一位,如果是z则变成a;如果之前定义的宏CHANGE为0,则输出原字符串
#include<stdio.h>
#define CHANGE 1
void main()
{
char s[100];
gets(s);
#if CHANGE
int counter = 0;
while(s[counter] != '\0')
{
if(s[counter] == 'z')
{
s[counter] = 'a';
}
else if(s[counter] == 'Z')
{
s[counter] = 'A';
}
else if((s[counter] >= 'a' && s[counter] < 'z') ||
(s[counter] >= 'A' && s[counter] < 'Z'))
{
s[counter]++;
}
counter++;
}
printf("加密后字符串为:%s\n", s);
#else
printf("输入的字符串为:%s\n", s);
#endif
}
END