1.文件包含
使用#include进行文件包含{#include <xxx.h>
一般是库函数的头文件;#include “xxx.h”
一般是程序员自己的头文件}
eg.设计所需的各种各样的输出格式(包括整数、实数、字符串等)做成宏定义,用一个文件“format.h”,把这些信息都放到此文件中,编写程序,用#include “format.h”命令以确保能使用这些格式。
------format.h-----------
#ifndef C___________format_h
#define C___________format_h
#define INT_FM1(a) printf("%d\n",a)
#define DOUBLE_FM2(a) printf("%lf\n",a)
#define CHAR_FM3(a) printf("%c\n",a)
#endif
int main(int argc, const char * argv[]) {
int a=12;
double b=12.5;
char c='a';
INT_FM1(a);
DOUBLE_FM2(b);
CHAR_FM3(c);
printf("------------------------\n");
return 0;
}
2.条件预编译
1)
#if 常量表达式
程序段1 #else 程序段2 #endif
2)
#ifdef 标识符---如果定义过,执行
程序段1 #else 程序段2 #endif
3)#ifndef 标识符----没被定义过,执行 程序段1 #else 程序段2 #endif
eg. 用条件编译方法实现以下功能:
输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一个字母(如‘a’变成‘b’,……‘z’变成‘a’。其它字符不变)。用#define命令来控制是否要译成密码。例如:
#define CHANGE 1
则输出密码。若
#define CHANGE 0
则不译成密码,按原码输出。
int main(int argc, const char * argv[]){
char str[20];
printf("请输入密码\n");
gets(str);
int i=0;
#if CHANGE
while (str[i]!='\0') {
if (str[i]>='a'&&str[i]<'z') {
str[i]+=1;
}else if(str[i]=='z'){
str[i]='a';
}
i++;
}
#endif
printf("%s",str);
return 0;
}
3.typedef关键字 自定义类型说明符
声明: typedef 原类型名 新类型名;
eg:typedef int INTEGER;
INTEGER a,b;
typedef char NAME[20];
NAME a1,a2,s1,s2;
4.结构体
结构体定义并不预留内存。
结构体定义放置在程序的开始部分,位于头文件声明之后或者定义在单独的头文件内。
结构体定义仅描述了一个结构体的形式。如果要在程序里使用结构体,需要声明结构体变量。
定义结构体:
struct structurename
{
datatype variable1;
datatype variable2;
...
};
另一种形式:
typedef struct
{
datatype variable1;
datatype variable2;
...
} structurename;
结构体开辟空间:
struct student{ //结构体开辟空间时
char name[10];//原10字节,现按(结构体中)‘最大类型字符’长度的倍数开辟空间
//eg:结构体中,最大的类型字符是‘double’,此时char name[20]开辟空间长度为16;
char sex; //原1字节,现按(结构体中)’最大类型字符‘长度开辟空间
float score; //原4字节,现按(结构体中)’最大类型字符‘长度开辟空间
int num; //原4字节,现按(结构体中)’最大类型字符‘长度开辟空间
double a; //原8字节,现按(结构体中)’最大类型字符‘长度开辟空间
};
嵌套结构体:
typedef struct
{
int month;
int day;
int year;
} Date;
typedef struct{
int num;
char name[20];
char sex;
Date birthday;
float score;
} Student;
声明、赋值:
stu s2={55,"lisi",'f',97.5};//声明并初始化
//赋值
s1.num=12;
strcpy(s1.name, "zhangsan");//地址/整型,不能用“=”/(数组)
s1.sex='f';
s1.score=98.5;
//输入赋值
printf("请输入学生信息(学生学号,学生姓名,学生性别,学生成绩)\n");
scanf("%d%s %c%f",&s1.num,s1.name,&s1.sex,&s1.score);//%s %c空格间隔,避免‘幻影回车符’
//输出
printf("学生学号:%d,学生姓名:%s,学生性别:%c,学生成绩%f\n",s1.num,s1.name,s1.sex,s1.score);
printf("学生学号:%d,学生姓名:%s,学生性别:%c,学生成绩%f\n",s2.num,s2.name,s2.sex,s2.score);
5.结构体数组:
sc stu[2];//typedef 自定义类型
for循环——>
scanf("%s%f%f%f",stu[i].name,&stu[i].java,&stu[i].C,&stu[i].oc);//数组输入
printf("%s,%f,%f,%f,%.2f\n",stu[i].name,stu[i].java,stu[i].C,stu[i].oc,ave);//数组输出
或
stu stu1={1,"zhangsan",'m',95.5};
stu stu2={2,"lisi",'f',88.5};
stu stu3={3,"wangwu",'m',55.5};
stu sss[3]={stu1,stu2,stu3};//typedef 自定义类型 数组 并赋值
6.结构体指针
结构体指针变量声明的一般形式为:
结构体类型名 *结构体指针变量名
Student *pstu;
访问形式:
-(*结构体指针变量).成员名 -(*pstu).num
-结构体指针变量->成员名 -pstu->num
例:
student stu;//声明学生变量类型
student *pstu=&stu;//声明结构体指针指向stu变量
pstu->name ="wangw";//使用结构体指针操作结构体成员
printf("%d",(*pstu).num);
7.结构体作为函数参数
可以将结构体作为参数传递给函数,也可以定义返回结构体值的函数。
结构体作为函数参数有三种不同方法:
-将结构体成员的值传递给函数处理。
double func3_1(double n1,double n2){ //传入参数值
return n1>n2?n1:n2;
}
-将整个结构体作为参数值传递给函数。
typedef struct{
int real;
int xu;
} complex;
void func2(){ //程序开始
complex num1={10,3},num2={5,4};
complex reslt=addCom(num1,num2);
printf("运算结果:%d+%di\n",reslt.real,reslt.xu);
}
complex addCom(complex n1,complex n2){
complex result;
result.real=n1.real+n2.real;
result.xu=n1.xu+n2.xu;
return result;
}
-将结构体指针变量做函数的参数。
void func3_2(student *ps){ //结构体指针作为参数,传入地址
ps->score=100;
}
随堂笔记为个人学习笔记,若有错误,望指出,谢谢!!