预处理指令、构建大型程序

练习:编写程序从键盘得到一个包含多个考试成绩的字符串,字符串格式如下

10,20,30,40,50

计算所有考试成绩的和并把结果显示在屏幕上

练习:编写一个模拟登录练习,一共给用户三次登录机会,每次要求用户输入用户名和密码如果输入的用户名是admin密码是123456就是正确的。登陆三次之后要给出提示。

指针数组

指针数组里每个存储区的类型都是指针,字符指针数组里包含多个字符类型的指针,每个指针可以代表一个字符串。字符指针数组可以用来表示多个相关字符串,二维数组也可以用来表示多个相关字符串,通常使用字符指针数组来记录多个字符串防止存储区浪费。

主函数参数

主函数的第二个参数是一个字符指针数组,其中每个指针代表一个字符串。所有这些字符串的内容都来自用户输入命令。主函数第一个参数是一个整数,表示第二个参数里的指针个数。

练习:编写程序解决鸡兔同笼问题

头和脚的数量应该从命令中获得

./a.out 40 100

预处理指令

#define”预处理指令可以用来定义宏,宏可以用来给数字起名字,定义宏的时候要把宏名称写在前面,把它所代表的数字写在后面。宏名称通常由全英文大写字符构成,宏名称里不包含空格。

#define 		PI		3.14f

用宏给数字起名字的时候不可以用赋值操作符,编译器会把程序里的所有宏名称替换成它所代表的数字,可以在编译命令里使用-D选项决定宏名称代表的数字。

编写程序的时候有些数字只能在编译的时候才能知道具体数值,程序中应该用宏名称代表这种数字。宏还可以用来给计算公式起名字,计算公式里包含未知数字,宏的参数用来表示计算公式里的未知数字。

编译器采用二次替换的方式处理带参数的宏,宏的参数不一定代表数字所以没有类型名称。如果宏有多个参数也应该用逗号把相邻的参数名称分隔开。

宏与函数区别

宏不能使用自己的存储区和函数之间进行数据交换,宏没有形式参数也没有用来存放返回值的存储区,能当作数字使用的宏必须编写为表达式(因为宏没有用来存放返回值的存储区),宏的参数可以直接代表函数的存储区,对宏参数内容的修改就是对函数存储区内容的修改。

练习:编写一个宏用来计算两个整数之间的差

因为宏没有用来记录返回值的存储区,所以不能保证优先计算宏里面的操作符。所有能当作数字使用的宏必须编写在一对小括号中间,宏没有形式参数所以不能保证优先计算参数里面的操作符。编写宏的时候所有能当作数字使用的参数也必须写在小括号里。不要把自增自减的结果作为宏的参数使用

编写宏的时候可以使用一些特殊的符号,他们叫做宏操作符。

#是一个宏操作符,它可以把宏的一个参数转换成字符串字面值

##也是一个宏操作符,它可以把一个代表标识符的参数连接其他内容得到一个新的标识符

练习:编写宏实现字符的大小写转换

点击查看代码
#if 0
/*
 *字符串练习
 *
 * */
#include<stdio.h>
#include<string.h>
int main() {
	char buf[30] = {0},tmp[10] = {0};
	int grade = 0;
	while(1) {
		printf("请输入一个考试成绩:");
		scanf("%d",&grade);
		if(grade >= 0 && grade <= 100) {
			sprintf(tmp,"%d,",grade);
			strcat(buf,tmp);
		}
		else {
			break;
		}
	}
	buf[strlen(buf) - 1] = 0; 		//最后一个成绩后的逗号删除
	printf("%s\n",buf);
	return 0;
}
#elif 0
/*
 *
 *字符串练习
 *
 * */
#include<stdio.h>
int main() {
	char buf[50] = {0};
	char *p_ch = buf;
	int sum = 0,tmp = 0;
	printf("请输入字符串:");
	fgets(buf,50,stdin);
	while(*p_ch) {
		if(*p_ch >= '0' && *p_ch <= '9') {
			tmp = (10 * tmp + *p_ch - '0');

		}
		else {
			sum += tmp;
			tmp = 0;
		}
		p_ch++;
	}
	printf("%d\n",sum);
	return 0;
}

#elif 0
/*
 *
 *字符串函数练习
 *
 * */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
	char buf[50] = {0};
	char *p_ch= buf;
	int sum = 0;
	printf("请输入字符串:");
	fgets(buf,50,stdin);
	while(1) {
		sum += atoi(p_ch);
		p_ch = strstr(p_ch,",");
		if(!p_ch) {
			break;
		}
		else {
			p_ch++;
		}

	}
	printf("sum = %d\n",sum);
	return 0;
}

#elif 0
/*
 *
 *模拟登录
 *
 * */
#include<stdio.h>
#include<string.h>
int main() {
	char buf[10] = {0};
	int num = 0;
	for(num = 1;num <= 3;num++) {
		printf("请输入用户名:");
		fgets(buf,10,stdin);
		if(strlen(buf) == 9 && buf[8] != '\n') {
		scanf("%*[^\n]");
		scanf("%*c");
		}
		if (strcmp(buf,"admin\n")) {
			continue;
		}
		printf("请输入密码:");
		fgets(buf,10,stdin);
		if(strlen(buf) == 9 && buf[8] != '\n') {
			scanf("%*[\n]");
			scanf("%*c");
		}
		if(strcmp(buf,"123456\n")) {
			continue;
		}
		break;
	}
	if(num <= 3) {
		printf("登录成功\n");
	}
	else {
		printf("登录失败\n");
	}
	return 0;
}

#elif 0
/*
 *
 *字符指针数组演示
 *
 * */
#include<stdio.h>
int main (){
	/*char *strs[] = {"abc","def","xyz","iop","vbn"}; 		//字符指针数组   */
	char strs[][10] = {"abc","ded","vbn","zxh","sfd"};
	int num = 0;
	for (num = 0;num <=  4;num++){
		printf("%s\n",strs[num]);
	}
	return 0;
}
#elif 0
/*
 *
 *主函数参数
 *
 * */
#include<stdio.h>
int main (int argc,char *argv[]){
	int num = 0;
	for (num = 0;num <= argc - 1;num++){
		printf("%s\n",argv[num]);
	}
	return 0;
}

#elif 0
/*
 *
 *鸡兔同笼
 *
 * */
#include<stdio.h>
#include<stdlib.h>
int main (int argc,char *argv[]){
	int heads = 0,legs = 0,num = 0;
	if (argc < 3){
		printf("命令错误\n");
		return 0;
	}
	heads = atoi(argv[1]);
	legs = atoi(argv[2]);
	for (num = 0;num <= heads;num++){
		if (4 * num +2 * (heads - num) == legs){
			printf("兔子有%d鸡有%d\n",num,heads - num);
			break;
		}
	}
	return 0;
}
#elif 0
/*
 *
 *宏定义
 *
 *
 * */
#include<stdio.h>
#define 	PI 			3.14f
#define 	CIRCLE(r) 	2 * PI *r
int main (){
	float radius = 0.0f;
	printf("请输入半径:");
	scanf("%g",&radius);
	printf("周长是%g\n",CIRCLE(radius));
	return 0;
}
#elif 0
/*
 *
 *宏演示
 * 
 * */

#include<stdio.h>
#include<stdlib.h>
#include<time.h>	
int main (){
	int arr[SIZE] = {0};
	int num = 0;
	srand(time(0));
	for (num = 0;num <= SIZE - 1;num++){
		arr[num] = rand() % MAX +1;
	}
	for (num = 0;num <= SIZE -1;num++){
		printf(" %d ",arr[num]);
	}
	printf("\n");
	return 0;
}
#elif 0
/*
 *
 *宏演示
 *
 * */
#include<stdio.h>
#define 	ABS(n) 		n >= 0 ? n : 0 - n		
#define 	NEG(n) 		n = 0 - n
int abs (int num){
	if (num >= 0){
		return num;
	}
	else{
		return (0 - num);
	}
	
}
void neg (int *p_num){
	*p_num = 0 - *p_num;
}
int main (){
	int num = 0;
	printf("请输入一个数字:");
	scanf("%d",&num);
	printf("%d\n",abs(num));
	printf("%d\n",ABS(num));
	neg(&num);
	printf("%d\n",num);
	NEG(num);
	printf("%d\n",num);
	return 0;
}
#elif 0
/*
 *宏练习
 *
 * */
#include<stdio.h>
#define 	SUB(x,y) 			((x) -(y))
int main (){
	printf("%d\n",SUB(10,5));
	printf("%d\n",20 - SUB(10,5));
	printf("%d\n",20 - SUB(10,5));
	printf("%d\n",SUB(20,10 -5));
	return 0;
}

#elif 0
/*
 *
 *计算整数平方
 *
 * */
#include<stdio.h>
#define 	SQUARE(n) 		(n) * (n)
int main (){
	int num = 5;
	printf("%d\n",SQUARE(num));
	printf("%d\n",SQUARE(++num));
	return 0;
}
#elif 0
/*
 *
 *宏操作符演示
 *
 * */
#include<stdio.h>
#define 	STR(n) 		#n
#define 	PTR(n)      p_##n
int main (){
	STR(2+3);
	int num = 0;
	int *PTR(num) = &num;
	return 0;
}
#elif 1
/*
 *
 *宏转换大小写
 *
 * */
#include<stdio.h>
#define 	CASE(ch) 	((ch) >= 'a' && (ch) <= 'z' ? (ch) - 'a' + 'A' : (ch) - 'A' + 'a')
int main (){
	char ch = 0;
	printf("请输入一个英文:");
	scanf("%c",&ch);
	printf("%c\n",CASE(ch));
	return 0;
}
#endif 


posted @ 2024-10-28 15:07  GQH1000  阅读(11)  评论(0编辑  收藏  举报