为此在概念的时候先自定义10个标签,定义了一个新的数据类型Stu

作业地址:http://www.cnblogs.com/easteast/p/7604534.html

一结构体

一)笔者和本人的队友

  1. 结构体

– 031502142 (张鹏)[进去她的博客]

假定急需保留学生的年龄、战绩、姓名等多个字段时索要用到结构体,将在三个相关的多寡封装在一同。

– 031502216 (江郑)[进去她的博客]

 
-

struct Stu{

2)我的Github地址:Github

char name[20];

三)生成的数额:input_data.txt

int age;

一对数据截图:

图片 1

 

float score;

数据变动规律以及思量的成分:

  数据首借使生成标签和学员的悠闲时间段,学生和单位的数码取值是逐一递增的,所以在概念的时候先自定义11个标签,部门的移动时间和学习者的悠闲时间也是自定义一天中的4个日子段,然后搭配上七日一周的时日开始展览自由相称。

图片 2

 定义:

  • 概念七个结构体学生和机关
  • 单位中含有小编的数码、招生人数、标签以及移动时间
  • 学员中富含学生编号、空闲时间、本人兴趣标签、意愿部门等等。

实现:

  • 号码都得以根据一定的相继递增
  • 机构招收人数通过自由函数能够定义在10-1七人里面
  • 在标签方面,选取二进制的办法来储存信息,随机生成四-六个部门标签
  • 部门活动时间利用与标签类似的不二等秘书技,定义贰个贰维数组,第2个代表当天是或不是有空,第一个是意味着当天闲暇的时间段在多个时辰段中是哪3个
  • 在学员音信定制进度中,意愿部门是随机生成1-五个
  • 在方方面面音讯定制进程中,rand()函数用的百般频仍,也是生成音信的基本部分。

拍卖数据:

  •    在成就基本的定制数据后,便是将数据处理成json格式,json数据本人处理起来并不是很劳顿,不过用c语言却是第1遍,在未曾怎么线索的意况下,参考了有的博客,最后采纳引用图片 3的秘诀,引用头文件,调用里面包车型大巴函数生成对象图片 4以及数组图片 5 一步步嵌套输出,最终达成要求的数据。

设想的要素:

  • 数量客观:学生的兴趣标签来自部门的兴味标签;学生的悠闲时间①天会有多少个日子段,而机关的移动时间1天只好一回。

};

4)多少建立模型及卓绝程序的笔触及落到实处格局

概念了一个新的数据类型Stu,能够由此Stu定义变量。

模型和笔触:

  图片 6

struct Stu s1, s2;

 实现:

  • 读取文件中的数据并分析,将总体文件保留成字符串,从中抽出有用的数量存起来。
  • 在合营中利用时间和标签初叶筛选对应的合乎学生,时间合营是运用字符串函数截取有效的时间,将学员的时刻和机构的时日比较是不是存在包罗关系,就能够判定是还是不是爆发时间争论。标签的相配和新闻的贮存主倘使由队友达成,用的是结构体指针,大概的笔触就是各自定义部门和学习者的结构体,部门的内部有部门编号,纳新人数,已收人数和针对性学生结构体的指针,学生的中间有上学的儿童在遍历时出现的各样以及和单位壹律的价签个数。开个20尺寸的部门组织体数组,遍历学生的时候能够纳入就malloc3个学生结构体,起先化有关消息,接到相应部门后边。
  • 用三个数组flag[300]存取是不是学生被录用消息,要是选取就存为壹,不然正是0,最后输出未被收音和录音的flag=0的unlucky-sudent也很好领会。

s1.age = 18;

5)服从的代码规范

s1.score = 90;

代码规范:

  1. 变量命名
  2. 代码段对齐
  3. 拉长适量的笺注
  4. 写上1段代码后得以利用print来输出结果测试,以便为了早先时期优化和改良

s2.age = 20;

扭转最终Json字符串的代码:

for(i = 0; i < 20; i++)
{
    sp1 = department[i].next;
    /*生成unlucky_department*/
    if(sp1 == NULL)
    {
        cJSON_AddItemToArray(unluckyD, cJSON_CreateString(department[i].d_no));
    }
    else
    {
        /*生成admitted*/ 
        cJSON *admittedDno, *admittedS;
        admittedDno = cJSON_CreateObject();
        admittedS = cJSON_CreateArray();
        cJSON_AddItemToObject(admittedDno, "member", admittedS);
        while(sp1 != NULL)
        {
            cJSON_AddItemToArray(admittedS, cJSON_CreateString(student[sp1->order]));
            flg[sp1->order] = 1;
            sp1 = sp1->next;
        }
        cJSON_AddStringToObject(admittedDno, "department_no", department[i].d_no);
        cJSON_AddItemToArray(admitted, admittedDno);
    }
}
for(i = 0; i < 300; i++)
{
    if(!flg[i])
    {
        /*生成unlucky_student*/
        cJSON_AddItemToArray(unluckyS, cJSON_CreateString(student[i]));
    }
}
/*生成输出json字符串*/ 
char *out = cJSON_Print(rootOut);

 

 

s2.score =99;

六)结果评估

利用学业上提供的input_data.txt用自个儿的次第相配结果输出结果如下图:

图片 7

 通过教授给出的输入测试样例来测试的话有180多个未被选定的上学的小孩子,再看看输出的测试样例好像也是180多少个,那多数是能够的,通过自个儿生成的数据测试,学生录取的会比这几个高不少,可是全部上不影响最终的结果,差不多的同盟结果对上了就行。

Stu是数据类型,不是变量,
s一和s二是变量,s一有多个分子age和score

柒)结对感受

  结对作业已经进展了几次了,从第3遍的不熟悉到稳步磨合,已经有了一定的默契。那二回的任务跟第一回不1致,须求先河编码,考验自个儿的代码水平,个人感到本次作业的难点是介于同盟程序和拍卖json数据。然则纵然本次作业可供完毕的小时周期非常短,有三个多礼拜的时间,不过恰逢国庆和拜月节七个节日,合营上只怕未有很好,一大半都以透过线上交换,可是线上沟通有非常大的弊端,不是很领会的发挥友好的情致和精晓队友的情趣,唯有后两日技能在宿舍面对面一同谈论还尚无消除的一些细节,进程不可见很好把握,辛亏结尾依旧商量出来了最终的结果,但是大概在部分程序优化上从不做的很非凡。此番算是比第三遍有点提升,下次还要再持续加油啊。

 

  1. 结构体变量的赋值与初叶化

    struct XYPoint {

    int x;

    int y;

    };

    struct XYPoint  point = {3,4}; //初始化

    struct XYPoint point2;

    point2 = point; //赋值

    //成员分头赋值

    point2.x = 10;

    point2.y = 20;

练习:定义一个代表学生的结构体

struct Person{

char name[20];

int age;

int height;

};

struct Person p;

p = (struct Person) {“zhangsan”, 1八,
172};
//强制调换后赋值是不利的

也能够那样初叶化,钦点属性的称号:

struct Person p = {.name = “zhangsan”,
.age = 15, .height = 173};

  1. 在iOS中的应用

    struct Rect{

    XYPoint  origin;

    XYSize   size;

    };

  2. 协会体取别称

    typedef  struct Stu Student;

    Student s1;
    //用外号定义变量

    typedef  unsigned long   size_t;

    size_t  xx;

    也足以在表明的时候定义外号:

    typedef struct {

    int width;

    int height;

    }  Size;

    Size正是以此结构体的外号

五.赶回结构体的函数

如依照给定的数值创设一个函数重返该结构体

Rect  rectMake( int x, int y, int width,
int height){

Rect rect = {{x,y } , {width, height}
};

return rect;

}

 

Rect rect1 =
rectMake(10,20,100,30);

6.结构体大小

结构体对齐

7.结构体指针

Rect  rect1 =
rectMake(12,23,34,45);

Rect *p = &rect1;

(*p).origin.x = 100;

p-> origin.x = 100; 
//箭头实际上正是先取*再取.操作

 

二、枚举

  1. 枚举的定义

    季度、
    星期几、 颜色、
    型号等数码在储存时,能够行使枚举类型

    enum  Color {

    Red,

    Green,

    Blue,

    Yellow,

    Brown

    };

概念了1个数据类型Color,能够经过Color来定义变量,其变量的取值只好是定义Color类型时内定的取值,如:Red,格林,Blue,Yellow,Brown。如:

enum Color myColor = Red;

二.枚举变量的输出

printf(“%d\n”, myColor);

枚举能够按%d的花样出口,输出结果是3个整形数字,定义枚举类型时,暗中同意就是从0开首的壹组整形数字

在给枚举变量赋值时,也能够那样实现:

enum Color myColor2 = 2;

跟 

enum Color myColor2 = Blue;

这两条效益是平等的,枚举本质上正是1个整型,使用枚举便是为着便利阅读或回忆。

3.注意

在定义枚举时,其变量的取值壹般是以类小名发轫,如:

enum Week {

WeekSunday,

WeekMonday,

WeekTuesday,

WeekWednsday,

WeekThursday,

WeekFriday,

WeekSaturday

};

那样在经过枚举类型定义变量时,

enum Week  day1= Week…

给变量赋值时,就以项目名初阶,系统会活动提醒该品种的或许取值。不至于与其余的枚举类型取值弄混。

在此后学iOS开采时,会选用到系统提供的豁达的枚举类型

3、动态内部存款和储蓄器分配与宏

  1. 静态内部存款和储蓄器分配

先后在编写翻译时就早已规定所要分配内部存款和储蓄器空间的大小,如常用的变量、常量等。

  1. 动态内存分配 

在运行时,程序员可以在堆空间中动态分配存款和储蓄空间。

可以透过 malloc(十0);
函数在堆中开垦九20个字节大小的上空,再次回到该空间的首地址。须求通过指针访问该空间。

char *p = (char *) malloc(100); 

因为malloc()函数的再次回到值是void *,
在有些编写翻译器中必要展开强制类型调换,如上一行代码。

动态分配存款和储蓄空间不必然成功,所以需求开始展览表达,如:

if ( !p ) {

perror (“malloc error”);

}

perror打字与印刷标准报错,在指令行中,标准输出和正规报错都是极端。有时须求将行业内部部报纸错设置为有些文件。

亟需小心的是,堆空间本人并未有数据类型,用p指向这一个空间,将这几个空间作为是
char *[] 数组。

能够通过指针变量p赋值如下:

p[0] = ‘A’;

p[30] = ‘Z’;

再如:

int * q = malloc(100);

if (!q)
{

perror(“malloc”);

}

如果用int
*指南针指向那九十六个字节的堆空间,则该空间能够储存二多少个int类型的多寡, q[0]是前4个字节,
q[1]是第伍到第7个字节。能够如此赋值

q[0] = 110;

q[1] = 250;

3.保释存款和储蓄空间

堆空间应用到位后,须求手动释放,

free(p);

free(q);

开垦空间其实就是在系统中登记这壹段空间,作者用了;释放空间正是报告系统,笔者不要了。

  1. 听大人讲字符串大小动态开垦存款和储蓄空间保存字符串

    int i = 0;

    while ( i++ < 100 ){

    int n = 0;

    scanf(“%d”, &n);

    char *p = malloc( n+1 );

    scanf(“%s”, p);

    printf(“%p的职责,存款和储蓄的是:%s”, p,
    s);

    free(p);

    }

每回循环都会动态在堆中开采1块存款和储蓄空间,空间的大小由用户输入,然后再输入字符串保存到该空间中,输出该字符串。用完后,释放该空间

  1. 静态分配与动态分配的界别

    积存地方区别:栈和堆;

静态分配在编写翻译时调整,动态分配是在程序运维时间调控制大小;

静态分配空间的高低由编写翻译器决定,动态分配由程序员决定

静态分配的空中活动释放,动态分配的空间必要手动释放。因而供给专注的是:假诺未有手工释放动态分配的长空,堆空间的储存空间不会随着函数的调用截止而自由,在程序的运作时期会直接占领那块空间,直到程序结束。

 

四、宏

  1. 宏正是在预处理阶段的简要的字符串替换,预处理是在编译前进展。

    C语言程序编译由四步:

预处理:依照预处理指令修改源文件,宏是字符串替换,#include是把头文件复制到源文件中

gcc -o test.i  test.c  -E

编写翻译,将代码翻译成人中学间语言或汇编代码

gcc -o test.s  test.i  -S

汇编,将汇编代码翻译成指标机器指令

gcc -o test.o  test.s  -c

链接,将关于的对象文件、库文件链接在一块儿。

gcc -o test   test.o

实践正是

./test

  1. 定义宏

    #define  PI  3.14159

    int main(){

    printf( “%f\n”, PI *10*10);

    }

在编译前,将先后中的PI字符串用三.1415玖代表

 

诚如情形下,将或然会被改换的常量定义为宏。如定义数组时,假若数组的长度可能会爆发变化,能够将数组的尺寸用宏来替代。

在iOS开辟中时常选取宏来保存url地址,在类型支付时,常常使用测试系统,上传APPStore时要求利用标准U酷威L

如让NSLog仅在调节和测试阶段选取,在公布时不须要,可以那样定义

  • #ifdef  DEBUG*

  • #define  CuiLog(…) 
    NSLog(__VA_ARGS__)*

  • #else*

  • #define CuiLog(…)  *

  • #endif*

  • 或者:*

#ifdef DEBUG

#define CuiLog(format,…) 
printf(format,##__VA_ARGS__)

#else

#define CuiLog(format, …)

#endif 

 

叁.带参数的宏

#define  PI 3.14159

#define  A(r)  PI*r*r

#define
Area(r)  (PI*(r)*(r))

//带参数的宏建议变量和结果都拉长小括弧

int main(){

printf(“%f\n”,  A(10));

printf(“%f\n”,  A(5+5) );

printf(“%f\n”,  Area(10) );

printf(“%f\n”,  Area(5+5));

return 0;

}

勤学苦练:把求七个数的和,多少个数的积定义为宏

写八个宏求多个数的最大值

 

 

 

 

作业

一.
创立一个同盟社的职工的结构体,存款和储蓄职员和工人的真名、工作年限和年龄。在main函数中开创由5名职工结合的数组。必要编辑函数实现:

1)从终端读入5名职工信息

二)按年龄排序

三)按工作年限排序

四)遵照方今各种,打字与印刷每名职员和工人的音讯。

*)革新,尝试把按年龄排序,按工作年龄排序用3个函数来兑现(排序函数要求一个针对函数的参数),函数原型:

void sort( Employee *employees, int
count,  int (*p) (Employee, Employee))

定义一个比较年龄的函数,如

compareByAge( Employee e1, Employee
e2){

if ( e1. age < e2.age ){

return 1;

}else {

return 0

}

}

或直接写成

compareByYears( Eimployee e1, Employee e2
){

return e1.years < e2.years;

}

假诺还有职员和工人编号的话,还足以两次三番按职工编号排序,继续张开扩大,可是sort排序函数不改变,只要求扩大2个按职工编号相比的函数就能够了。

 

相关文章