条件预编译/tyordef/结构体

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;
}




随堂笔记为个人学习笔记,若有错误,望指出,谢谢!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值