做外贸必须用的社交网站,设计图纸用什么软件,传统营销和网络营销的区别,凌风wordpressP 151 结构体定义三种形式 2023/3/15
一、创建结构体和结构体变量
方式1-先定义结构体#xff0c;然后再创建结构体变量。
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
struct Stu stu1, stu2;
//…P 151 结构体定义三种形式 2023/3/15
一、创建结构体和结构体变量
方式1-先定义结构体然后再创建结构体变量。
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};
struct Stu stu1, stu2;
//定义了两个变量 stu1 和 stu2它们都是 Stu 类型都由 5 个成员组成
//注意关键字struct不能少方式2-在定义结构体的同时定义结构体变量。
struct Stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
//在定义结构体Stu 的同时创建了两个结构体变量 stu1 和 stu2方式3-如果只需要 stu1、stu2 两个变量后面不需要再使用结构体数据类型定义其他变量在定义时也可以不给出结构体名。
struct { //没有写 Stu
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
stu1.name tom; stu1.num 100;.... // 使用直接赋值
//1. 该结构体数据类型没有名, 匿名结构体
//2. stu1 和 stu2 就是 该结构体的两个变量二、成员的获取和赋值
基本说明结构体和数组类似也是一组数据的集合整体使用没有太大的意义。数组使用下标[ ]获取单个元素结构体使用点号.获取单个成员。获取结构体成员的一般格式为结构体变量名.成员名;
案例一赋值1
struct{char *name; //姓名int num; //学号int age; //年龄char group; //所在小组float score; //成绩
} stu1;
stu1.name jack; // 上面使用的方法
printf(%s, stu1.name) 案例二赋值2
#includestdio.h
void main(){struct Student{char *name; //姓名int num; //学号int age; //年龄char group; //所在小组float score; //成绩} stu1 {贾宝玉, 11, 18, B, 90.50}, stu2 { 林黛玉, 12, 16, A, 100 };// 也可以在定义的时候直接赋值按顺序依次来就可以了struct Student stu3 {林黛玉3, 12, 16, A, 100};// 这样再次赋值也是可以的但是每个元素的对应关系需要一一对应struct Student stu4;// stu4 {林黛玉3, 12, 16, A, 100}; 这样是不允许的只允许在定义的时候赋值因为后面是一个整体printf(\n stu3.name%s,stu3.name); printf(\n stu1.name%s,stu1.name); // 输出也是同上输出getchar();
}P 152 结构体应用实例 2023/3/17
一、基本步骤
声明(定义)结构体确定结构体名编写结构体的成员编写处理结构体的函数
二、应用实例 案例一 编写一个Dog结构体包含name(char[10])、age(int)、weight(double)属性。 编写一个say函数返回字符串信息中包含所有成员值。 在main方法中创建Dog结构体变量调用say函数将调用结果打印输出。
#includestdio.h/*编写一个Dog结构体包含name(char[10])、age(int)、weight(double)属性编写一个say函数返回字符串信息中包含所有成员值。在main方法中创建Dog结构体变量调用say函数将调用结果打印输出*/// 定义一个Dog结构体struct Dog {char * name;int age;double weight;};//say函数 返回字符串信息中包含所有成员值char * say (struct Dog dog){// 将这个信息放入到一个字符串字符数组static char info[50]; // 最后返回的就是它是局部静态变量sprintf(info,name%s age%d weight%.2f,dog.name,dog.age,dog.weight);// spintf 将值打印到字符串中return info;}void main(){struct Dog dog;char * info NULL;dog.name 小黄;dog.age 1;dog.weight 3.4;info say(dog); // 结构体默认是值传递// 函数中修改不会影响到函数外的值printf(\n 小狗的信息%s,info);getchar();
}案例二 编程创建一个Box结构体在其中定义三个成员表示一个立方体的长、宽和高长宽高可以通过控制台输入。 定义一个函数获取立方体的体积(volume)。 创建一个结构体打印给定尺寸的立方体的体积。 思路 struct Box { double len; double width; double height; double volumn;//体积 }
#includestdio.hstruct Box {int length;int width;int height;
};int total(struct Box box){static int volume;return volumebox.height * box.length * box.width;
}void main(){struct Box box;int volume;// 输入长printf(\n请输入box的长);scanf(%d,box.length);// 输入宽printf(\n请输入box的宽);scanf(%d,box.width);// 输入高printf(\n请输入box的高);scanf(%d,box.height);volume total(box);printf(\nbox的体积为%d,volume);getchar();getchar();
}案例三景区门票案例 一个景区根据游人的年龄收取不同价格的门票。请编写游人结构体(Visitor)根据年龄段决定能够购买的门票价格并输出。规则年龄18 , 门票为20元其它情况免费。可以循环从控制台输入名字和年龄打印门票收费情况, 如果名字输入 n ,则退出程序。
#includestdio.h
#includestring.h/*
1)一个景区根据游人的年龄收取不同价格的门票。
2) 请编写游人结构体(Visitor)根据年龄段决定能够购买的门票价格并输出
3) 规则年龄18 , 门票为20元其它情况免费。
4) 可以循环从控制台输入名字和年龄打印门票收费情况, 如果名字输入 n ,则退出程序*/// 定义个结构体
struct Visitor{char name[10];int age;double pay; // 应付门票
};// 编写函数处理业务
//说明 因为结构体默认是值传递会拷贝一份完整的数据效率就低
// 因此为了提高效率我们直接接收一个地址指针
void ticket(struct Visitor * visitor){// 判断if((*visitor).age 18){ // 这里我们用的指针需要使用取值符*(*visitor).pay 20;}else{(*visitor).pay 0;}
}void main(){// 测试// 创建结构体变量创建一个游客struct Visitor visitor;// 循环的输入名字和年龄while(1){printf(\n 请输入游客名字);scanf(%s,visitor.name); // 数组不需要加地址符// 如果名字输入 n ,则退出程序if(!strcmp(n,visitor.name)){ // 这里可以取反非0为真就进入if执行break也可以strcmp(n,visitor.name)0break;}printf(\n 请输入游客年龄);scanf(%d,visitor.age);// 调用函数ticket获取应付的票价ticket(visitor); // 因为形参是指针这里需要传一个地址// 这样在函数里面操作visitor就是操作的main函数里面的visitorprintf(\n 该游客应付票价%.2f,visitor.pay);} printf(退出程序);getchar();getchar();
}P 153 共用体介绍和快速入门 2023/3/17
一、需求引入
引入现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数教师的信息包括姓名、编号、性别、职业、教学科目。请看下面的表格 传统方式解决 定义结构体根据人员的职业使用对应的成员变量。
struct Person{
char name[20];
int num;
char sex;
char profession;
float score; // 学生使用 score
char course[20]; // 老师使用course
} ;传统方式的问题分析 会造成 空间的浪费 , 比如学生只使用 score ,但是 也占用了course 成员的20个字节。做 struct Stu 和 struct Teacher [但如果职业很多就会对应多个结构体类型, 不利于管理]。使用共用体。
二、基本介绍
共用体Union属于 构造类型它可以包含多个类型不同的成员。和结构体非常类似, 但是也有不同的地方。共用体有时也被称为联合或者联合体, 定义格式为
union 共用体名{
成员列表
};结构体和共用体的区别在于结构体的各个成员会占用不同的内存互相之间没有影响而共用体的所有成员占用同一段内存修改一个成员会影响其余所有成员。
三、快速入门
定义共用体类型和共用体变量的三种方式(和结构体一样)。 案例演示
#includestdio.hunion data{ // data就是一个共用体包含三个成员共用数据空间该空间的大小以占用最大的成员变量为准int n; // 4字节char ch; // 1字节short m; // 2字节 };void main(){union data a; // 定义了一个共用体变量 aprintf(%d, %d\n, sizeof(a), sizeof(union data) ); // 44 a.n 0x40; // 十六进制printf(%d, %c, %d\n, a.n, a.ch, a.m); // 修改了一个成员的值发现其他成员也有一个值a.ch 9;printf(%d, %c, %d\n, a.n, a.ch, a.m);a.m 0x2059;printf(%d, %c, %d\n, a.n, a.ch, a.m);a.n 0x3E25AD54;printf(%d, %c, %d\n, a.n, a.ch, a.m);getchar();}P 154 共用体的内存布局 2023/3/17
一、内存布局
案例同上一节
#includestdio.hunion data{ // data就是一个共用体包含三个成员共用数据空间该空间的大小以占用最大的成员变量为准int n; // 4字节char ch; // 1字节short m; // 2字节 };void main(){union data a; // 定义了一个共用体变量 aprintf(%d, %d\n, sizeof(a), sizeof(union data) ); // 44 a.n 0x40; // 十六进制 // int 4 字节char 1字节short 2字节// 根据内存图判断 最低位到最高位是从右到左printf(%d, %c, %d\n, a.n, a.ch, a.m); // 这里第一位输出0x40的十进制64第二位输出64对应的ASCII码符第三位同样64a.ch 9;printf(%d, %c, %d\n, a.n, a.ch, a.m);// 第一位 字符9对应的ACSII码十进制为57第二位对应字符为9第三位为57a.m 0x2059;printf(%d, %c, %d\n, a.n, a.ch, a.m);// 以下与上面同理a.n 0x3E25AD54;printf(%d, %c, %d\n, a.n, a.ch, a.m);getchar();}二、布局图 P 155 共用体的最佳实践 2023/3/18
一、解决实践问题
#includestdio.h
#define TOTAL 2 //人员总数
// 定义了一个结构体person// 1.共用体使用方法一
union Myunion { // 在下面定义名称float score; char course[20];
};
struct Person{char name[20]; // 姓名int num; // 编号char sex; // 性别char profession; // 职业 s学生 t老师union Myunion sc;// 2.共用体使用方法二//union{ // 共用体所有成员 公用一段空间所以不会浪费空间// float score; // char course[20]; //} sc; // sc是一个共用体变量
};
void main(){int i;struct Person persons[TOTAL]; // 定义一个结构体数组// 之前定义了TOTAL等于2相当于两个人两种信息//输入人员信息for(i0; iTOTAL; i){printf(Input info: );scanf(%s %d %c %c, persons[i].name, (persons[i].num), (persons[i].sex), (persons[i].profession));if(persons[i].profession s){ //如果是学生printf(请输入该学生成绩);scanf(%f, persons[i].sc.score);}else{ //如果是老师printf(请输入该老师课程);scanf(%s, persons[i].sc.course);}fflush(stdin); // 刷新输入保证数据都写入到结构体里面去了}//输出人员信息//输出人员信息printf(\nName\t\tNum\tSex\tProfession\tScore / Course\n); // 想按一个表格输出所以我们使用制表符\tfor(i0; iTOTAL; i){if(persons[i].profession s){ //如果是学生printf(%s\t\t%d\t%c\t%c\t\t%f\n, persons[i].name, persons[i].num, persons[i].sex, persons[i].profession, persons[i].sc.score);}else{ //如果是老师printf(%s\t\t%d\t%c\t%c\t\t%s\n, persons[i].name, persons[i].num, persons[i].sex, persons[i].profession, persons[i].sc.course);}}getchar();getchar();
}P156 项目-家庭收支软件(1) 2023/3/18
一、需求说明 二、需求实现1
#includestdio.h
#includestring.hvoid main(){// 完成1显示菜单// 分析// 1.使用do-while来显示菜单如果用户输入4表示程序退出 // 完成2登记收入// 分析// 1. 需要一个字符串记录收支入情况// 定义相关变量char key ; // 表示用户输入了哪个菜单int loop 1; // 控制是否退出菜单char details [3000] -----------------当前收支明细记录-----------------\n收支\t收支金额\t账户金额\t说 明; // 记录所有的收入和支出情况char note[20] ; // 对收入或者支出的说明char temp[100] ; // 是用于格式化每次的收入或者支出然后拼接到details中去double money 0.0;double balance 1000.0; // 账号余额do{printf(\n\n-------家庭收支记账软件-----------);printf(\n 1收支明细);printf(\n 2登记收入); printf(\n 3登记支出); printf(\n 4退出); printf(\n选择(1-4)); scanf(%c,key); getchar(); // 过滤回车switch(key) {case 1:printf(%s,details);break;case 2:printf(\n 本次收入金额);scanf(%lf,money);getchar(); // 过滤回车balance money; // 更新余额printf(\n 本次收入说明);scanf(%s,note);getchar(); // 过滤回车// 将信息拼接到detailssprintf(temp,\n收入\t%.2f\t\t%.2f\t\t%s,money,balance,note);strcat(details,temp);break; case 3:printf(登记支出);break;case 4:loop 0;} }while(loop);printf(退出菜单);getchar();
}P157 项目-家庭收支软件(2) 2023/3/19
一、需求实现2
项目代码实现改进 用户输入4退出时给出提示你确定要退出吗? y/n必须输入正确的y/n 否则循环输入指令直到输入y 或者 n。当没有任何收支明细时提示 “当前没有收支明细… 来一笔吧!”在支出时判断余额是否够并给出相应的提示。
#includestdio.h
#includestring.h
void main(){// 完成1显示菜单// 分析// 1.使用do-while来显示菜单如果用户输入4表示程序退出 // 完成2登记收入// 分析// 1. 需要一个字符串记录收支入情况// 完成3等级支出// 1. 同收入// 完成4/*用户输入4退出时给出提示你确定要退出吗? y/n必须输入正确的y/n 否则循环输入指令直到输入y 或者 n。*/// 完成5// 当没有任何收支明细时提示 当前没有收支明细... 来一笔吧!// 完成6// 在支出时要判断余额是否够并给出相应提示// 定义相关变量char key ; // 表示用户输入了哪个菜单int loop 1; // 控制是否退出菜单char details [3000] -----------------当前收支明细记录-----------------\n收支\t收支金额\t账户金额\t说 明; // 记录所有的收入和支出情况char note[20] ; // 对收入或者支出的说明char temp[100] ; // 是用于格式化每次的收入或者支出然后拼接到details中去double money 0.0;double balance 1000.0; // 账号余额char choice ; // 表示用户选择选择是y/nint flag 0; // 表示是否有一笔支出或者收入do{printf(\n\n-------家庭收支记账软件-----------);printf(\n 1收支明细);printf(\n 2登记收入); printf(\n 3登记支出); printf(\n 4退出); printf(\n选择(1-4)); scanf(%c,key); getchar(); // 过滤回车switch(key) {case 1:if(flag){printf(%s,details);}else{printf(\n当前没有收支明细……来一笔吧!);}break;case 2:printf(\n 本次收入金额);scanf(%lf,money);getchar(); // 过滤回车balance money; // 更新余额printf(\n 本次收入说明);scanf(%s,note);getchar(); // 过滤回车// 将信息拼接到detailssprintf(temp,\n收入\t%.2f\t\t%.2f\t\t%s,money,balance,note);strcat(details,temp);flag 1;break; case 3:printf(\n 本次支出金额);scanf(%lf,money);getchar(); // 过滤回车//判断是否足够支出if(money balance){ // 不够printf(余额不足……); break;}balance - money; // 更新余额printf(\n 本次支出说明);scanf(%s,note);getchar(); // 过滤回车// 将信息拼接到detailssprintf(temp,\n支出\t%.2f\t\t%.2f\t\t%s,money,balance,note);strcat(details,temp);flag 1;break; case 4:printf(\n你确定要退出吗y/n);do{scanf(%c,choice);getchar();if(choice y || choice n){break;}printf(\n你的输入有误,请重新输入y/n);}while(1);if(choice y){ // 输出的为y就将loop赋值为0loop 0; }} }while(loop);printf(退出菜单);getchar();
}P158 项目-家庭收支软件(3) 2023/3/19
一、需求实现3
改成使用结构体完成 并且使用函数来提高项目的模块化编程, 利用今后项目的维护和扩展。这样更容易维护当需要增加功能的时候只需要找到对应的函数进行更改。
#includestdio.h
#includestring.h// 定义一个结构体
struct MyFamilyAccount {int flag; // 表示是否有一笔收入或者支出char details[3000]; // 明细double balance; // 余额
} myFamilyAccount;// 下面为全局变量
char key ; // 表示用户输入了哪个菜单
int loop 1; // 控制是否退出菜单
char note[20] ; // 对收入或者支出的说明
char temp[100] ; // 是用于格式化每次的收入或者支出然后拼接到details中去
double money 0.0;
char choice ; // 表示用户选择选择是y/n// 使用函数显示明细
void showDetails(struct MyFamilyAccount * myFamilyAccount){if((* myFamilyAccount).flag){printf(%s,(* myFamilyAccount).details);}else{printf(\n当前没有收支明细……来一笔吧!);}
}//使用函数完成一个登记收入
void income(struct MyFamilyAccount * myFamilyAccount){printf(\n 本次收入金额);scanf(%lf,money);getchar(); // 过滤回车(* myFamilyAccount).balance money; // 更新余额printf(\n 本次收入说明);scanf(%s,note);getchar(); // 过滤回车// 将信息拼接到detailssprintf(temp,\n收入\t%.2f\t\t%.2f\t\t%s,money,(* myFamilyAccount).balance,note);strcat((* myFamilyAccount).details,temp);(* myFamilyAccount).flag 1;
}// 使用函数完成一个登记支出
void pay(struct MyFamilyAccount * myFamilyAccount){printf(\n 本次支出金额);scanf(%lf,money);getchar(); // 过滤回车//判断是否足够支出// 这里account是在结构体中了需要取出来if(money (*myFamilyAccount).balance){ // 不够printf(余额不足……); // break; // 这里是break了不能在函数中使用函数中自然使用return语句return;}(*myFamilyAccount).balance - money; // 更新余额printf(\n 本次支出说明);scanf(%s,note);getchar(); // 过滤回车// 将信息拼接到detailssprintf(temp,\n支出\t%.2f\t\t%.2f\t\t%s,money,(*myFamilyAccount).balance,note);strcat((*myFamilyAccount).details,temp);(*myFamilyAccount).flag 1;
}//使用一个函数完成退出
void myexit(){ // 这里没有使用到结构体不需要传入printf(\n你确定要退出吗y/n);do{scanf(%c,choice);getchar();if(choice y || choice n){break;}printf(\n你的输入有误,请重新输入y/n);}while(1);if(choice y){ // 输出的为y就将loop赋值为0loop 0; }
} // 该函数专门用于显示菜单
void mainMenu(struct MyFamilyAccount * myFamilyAccount ){do{printf(\n\n-------家庭收支记账软件-----------);printf(\n 1收支明细);printf(\n 2登记收入); printf(\n 3登记支出); printf(\n 4退出); printf(\n选择(1-4)); scanf(%c,key); getchar(); // 过滤回车switch(key) {case 1:showDetails(myFamilyAccount);break;case 2:income(myFamilyAccount);break;case 3:pay(myFamilyAccount);break;case 4:myexit();}}while(loop);
}void main(){// 创建一个结构体变量struct MyFamilyAccount myFamilyAccount;// 初始化myFamilyAccount.flag 0;myFamilyAccount.balance 1000.0;// 使用拷贝的方式赋值memset(myFamilyAccount.details,3000,0); // 先要清零strcpy(myFamilyAccount.details,-----------------当前收支明细记录-----------------\n收支\t收支金额\t账户金额\t说 明);// 调用mainMenu显示菜单mainMenu(myFamilyAccount);getchar();
}二、结构示意图 P 159 项目-CRM(1)-程序框架图 2023/3/23
一、项目需求说明
说明模拟实现基于文本界面的《客户信息管理软件》。该软件能够实现对客户对象的插入、修改和删除用数组实现并能够打印客户明细表。 二、程序框架图
作用描述该项目包含多少个文件明确文件与文件之间的调用关系。 P 160 项目-CRM(2)-客户结构体 2023/3/23
一、完成Customer结构体
思路 Customer结构体含有的成员应该从给出的界面来分析分析出有6个成员数据类型也可以分析出来编写一个函数输出的给出的某个Customer变量的信息
#includestdio.h// 定义结构体数据类型
struct Customer{int id; // 编号int age; // 年龄char name[10]; // 名字char gender; // f 表示女m表示男char phone[16]; // 电话号码char email[20]; // 邮箱
};// 显示一个Customer变量的信息
// 这里我们接收的是结构体指针目的是提高效率
void getCustomerInfo(struct Customer * customer){printf(\n%d\t%s\t%s\t%d\t%c\t%s\t%s,(* customer).id,(* customer).gender,(* customer).name,(* customer).age,(* customer).phone,(* customer).email);
}