C语言-Struct
2015-08-10 20:05
218 查看
// main.m
//Student.h
//Student.m
#import <Foundation/Foundation.h> #import "Student.h" //声明结构体 /* struct 结构体名 { 类型修饰符 成员变量名; .......... 类型修饰符 成员变量名; }; */ // 点得数据类型 x y //struct mypoint 点的数据类型 // x y 就是新的数据类型的成员变量 struct mypoint{ float x; //横坐标 float y; //纵坐标 }; //大括号中的为成员变量,大括号之后必须要有分号 //矩形的数据类型 length wide struct myrect { float length; //长度 float wide; //宽度 }; int main(int argc, const char * argv[]) { // //整型 // int a = 0; // //点类型 // struct mypoint point_1 = {2.0,3.0}; //定义了一个数据类型为 struct mypoint ,变量名为 point_1 ,初值为2.0,3.0的一个变量 point_1; // //结构体内存的问题:以最大数据类型整数倍进进行分配 // // // printf("%lu %lu",sizeof(struct mypoint),sizeof(point_1)); // // //矩形类型 // struct myrect rect_1 = {1.0,9.0}; //定义了一个数据类型为 struct myrect ,变量名为 rect_1 ,初值为1.0,9.0 的一个变量rect_1; // struct myrect rect_2 = {0}; //若={0} 则意味着所有的成员变量初值为 0; // // //访问结构体成员变量 : 结构体变量名+"."+成员变量名 // printf("\n点横坐标%.2f,纵坐标%.2f ",point_1.x,point_1.y); //当 printf 中 前部的汉字多的话影响程序对变量名的搜索,以至于本式中的 x y 不变颜色 // //结构体的成员变量可以当变量使用 // point_1.x = 100.0f; //定义时数值后+f,表示此数是浮点型数值,可省略. // printf("\n点横坐标%.2f,纵坐标%.2f ",point_1.x,point_1.y); // // struct mypoint point_2 = {1.0,1.0}; // //结构体可以整体赋值 // point_1 = point_2; // printf("\n点横坐标%.2f,纵坐标%.2f ",point_1.x,point_1.y); // // // //定义学生结构体的变量 // // struct student dengken = {"dengken",'m',60,25,91}; // printf("name = %s,sex = %c,num = %d,age = %d,score = %.2f",dengken.name,dengken.sex,dengken.num,dengken.age,dengken.score); // // //匿名结构体 // struct { // char name[20]; // int age; // }stu1={"zhangsan",16}; //定义一个 数据类型为struct{char name[20];int age;},变量名为 stu1,初值为{"zhangsan",16}的一个变量 stu1 // //优点 可以不用声明 直接使用 // printf("\n%lu",sizeof(struct{char name[20];int age;})); // // //学生变量 // Student jinpeng = {"hanjinpeng",'m',04,16,19}; // // Student stu1 = {"zhangsan",'m',01,18,60}; // Student stu2 = {"lisi",'w',02,16,99}; // Student stu3 = {"wangwu",'m',03,20,80}; // // //调用分数最高的学生 // outputStuInfo(getMaxScoreOfStu(stu1, stu2, stu3)); // //找出年龄最小的 // outputStuInfo(maxAge(stu1, stu2, stu3)); // //找出性别是'm'的 // outputStuInfo(sexOfStu(stu1, stu2, stu3)); // // // //如果{0}那么结构体中的每一个成员变量即成员变量的子变量都为0 // Student stu = {0}; // Student stu_1 = {"zhangsan",'m',01,18,60,{1992,10,1}}; // // printf("year = %d",stu_1.birthday.year); // printf("month = %d",stu_1.birthday.month); Student aaa = {"aaa",'m',1101,23,95}; Student bbb = {"bbb",'m',1102,22,60}; Student ccc = {"ccc",'?',1103,18,99}; Student ddd = {"ddd",'m',1104,12,100}; Student eee ={"eee",'?',1105,44,69}; Student stu[5] ={aaa,bbb,ccc,ddd,eee}; //访问 stu[1] outputStuInfo(stu[1]); //循环遍历学生数组 打印每一个学生的信息 printStusInfo(stu, 5); //根据成绩 对学生进行升序排列打印 sortstubyscore(stu,5); //根据年龄进行升序排列打印 agearrange(stu,5); //根据用户输入的学号 打印对应学生信息 short num = 0; printf("\n请输入学号:\n"); scanf("%hd",&num); Student result = getstubynum(stu, 5, num); outputStuInfo(result); return 0; }
//Student.h
#import <Foundation/Foundation.h> typedef struct myDate{ int year; int month; int day; }MyDdte; //声明 学生结构体 // //struct student{ // char name[20]; //姓名 // char sex; //性别 // short num; //学号 // int age; //年龄 // float score; //分数 //}; // ////typedef 作用:给一个已知的数据类型起一个新的名字,用新的名字取代替之前的数据类型 //typedef struct student Student; typedef struct student{ char name[20]; //姓名 char sex; //性别 short num; //学号 int age; //年龄 float score; //分数 //前两步合并为一个过程,开头typedef, 结尾 Student; MyDdte birthday; //出生日期 }Student; //找出三个学生成绩最高者 Student getMaxScoreOfStu(Student stu1,Student stu2,Student stu3); //输出学生信息 void outputStuInfo(Student stu); //找出年龄最大的 Student maxAge(Student stu1,Student stu2,Student stu3); //找出性别是 m 的 Student sexOfStu(Student stu1, Student stu2,Student stu3); //循环遍历学生数组 打印每一个学生的信息 void printStusInfo(Student stu[],int count); //根据得分对学生进行升序排列打印 void sortstubyscore(Student stu[],int n); //根据根据得分年龄进行升序排列打印 void agearrange(Student stu[],int n); //根据用户输入的学号 打印对应学生信息 Student getstubynum(Student stu[],int n,short num);
//Student.m
#import "Student.h" //找出三个学生成绩最高者 Student getMaxScoreOfStu(Student stu1,Student stu2,Student stu3){ Student maxScore = {0}; maxScore = stu1.score > stu2.score ? (stu1.score > stu3.score ? stu1 : stu3):(stu2.score > stu3.score ? stu2 : stu3); return maxScore; } //输出学生信息 void outputStuInfo(Student stu){ printf("name = %s,sex = %c,num = %d,age = %d ,score = %.2f \n",stu.name,stu.sex,stu.num,stu.age,stu.score); } //找出年龄最小的 Student maxAge(Student stu1,Student stu2,Student stu3){ Student max = (stu1.age < stu2.age ? stu1 : stu2); max = max.age < stu3.age ? max : stu3; return max; } //找出性别是 m 的 Student sexOfStu(Student stu1, Student stu2,Student stu3){ Student a[3] = {stu1,stu2,stu3}; int c = 0; for (int i = 0; i < 3; i++) { if (a[i].sex == 'm') { int c = i; break; } } return a[c]; } //循环遍历学生数组 打印每一个学生的信息 void printStusInfo(Student stu[],int count){ for (int i = 0; i < count; i++) { outputStuInfo(stu[i]); } } //根据得分对学生进行升序排列打印 void sortstubyscore(Student stu[],int n){ for (int i = 0 ; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (stu[j].score > stu[j + 1].score) { Student temp = stu[j]; stu[j] = stu[j + 1]; //stu[j] 本质是一个元素,但是由于类型的原因,其实相当于一个数组,简化了程序操作 stu[j + 1] = temp; } } } printStusInfo(stu, 5); } //根据根据得分年龄进行升序排列打印 void agearrange(Student stu[],int n){ for (int i = 0 ; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (stu[j].age > stu[j + 1].age) { Student temp = stu[j]; stu[j] = stu[j + 1]; stu[j + 1] = temp; } } } } //根据用户输入的学号 打印对应学生信息 Student getstubynum(Student stu[],int n ,short num){ for (int i = 0; i < n - 1; i++) { if (stu[i].num == num) { return stu[i]; } } Student stu_1 ={0}; printf("没有查询到此学生\n"); return stu_1; }