大话结构体之一: 从女孩怎么选男朋友开始...Struct是为了解决什么问题?

By Long Luo

“关关雎鸠,在河之洲。窈窕淑女,君子好逑”,《诗经》三百篇,开篇就是男女之间的恋情,可见几千年的古人也十分重视爱情。这也难怪,毕竟男女的婚姻是人伦之始,而且含有成家立业的意思。引用生物学的观点来解释,就是“求食求偶是关系到人类生存繁衍的大事”,能不重视么?

在我们的老祖宗还住在山洞里的那个时代,野外看到一个漂亮的女野人,一棍子敲晕,拖进洞里…不过那个年代已经一去不复返了。随着人类的进步,具体到现在这个社会,现代的女人都要求男方高富帅,有车有房…当然按照进化心理学的观点来看,这些东西都代表着男性获取资源的能力,而智人(人类)的后代是很脆弱的,为了繁衍,所以女性是将男性所获取的资源和获取资源的能力置于第一位的。

不过,由于拜国内的房地产所赐,身为一名D丝的话,想要追到一个女孩,也变得异常困难,一方面是硬件上的劣势,比如外表、车、房子、一份体面的工作灯;另外一方面又有软件上的劣势,比如幽默感,人品如何、性格等。付出的服务项目也越来越多,既要送花,要帮女孩做这个做那个表决心,还要送这个送那个表付出。

据说20年后国内将有3000w男性光棍,女孩也就成了卖方市场,眼前这么多追求者,高富帅各方面程度都不一样,应该把哪个放在第一位呢?该怎么选呢?

比如一位美女,就有3位男性追求者,比较来比较去,某天决定先按照“帅”的程度排个序,选一个最“帅”的:

/************************************************************************************
** File: - Z:\work\code\c\Struct\WhyUsingStuct.c
** 
** Copyright (C) Long.Luo, All Rights Reserved!
** 
** Description: 
**      WhyUsingStruct.c ---
** 
** Version: 1.1
** Date created: 22:25:44,20/12/2012
** Author: Long.Luo
** 
** --------------------------- Revision History: --------------------------------
**  <author>    <data>          <desc>
** 
************************************************************************************/

#include <stdio.h>

/* Number of the boys */    
#define BOYS_NUM    (3)

void main()
{
    int i, j;

    /* Name */      
    char name[BOYS_NUM][10];

    /* height */
    int height[BOYS_NUM];

    /* rich */
    int money[BOYS_NUM];

    /* handsome */
    int handsome[BOYS_NUM];

    /* pointer array of the boys' name */
    char *pName[BOYS_NUM];

    /* the temporary */
    int heightTemp, moneyTemp, handsomeTemp;
    char *nameTemp;

    for (i = 0; i < BOYS_NUM; i++)
    {
        pName[i] = name[i];
    }

    for(i = 0; i < BOYS_NUM; i++)
    {
        printf("Pls input the Name of the No. %d Boys:", i + 1);
        gets(pName[i]);
        if (*pName[i] == '\0')
        {
            gets(pName[i]);
        }

        printf("Pls input the Height of %s :", pName[i]);
        scanf("%d", &height[i]);
        printf("Pls input the Money of %s :", pName[i]);
        scanf("%d", &money[i]);
        printf("Pls input the Handsome of %s :", pName[i]);
        scanf("%d", &handsome[i]);
    }

    /* sort by Height */
    /* Only write one item. */ 
    for (i = 0; i < BOYS_NUM - 1; i++)
    {
        for (j = i + 1; j < BOYS_NUM; j++)
        {
            if (handsome[i] < handsome[j])
            {
                nameTemp = pName[i];
                pName[i] = pName[j];
                pName[j] = nameTemp;

                handsomeTemp = handsome[i];
                handsome[i] = handsome[j];
                handsome[j] = handsomeTemp;
            }
        }
    }

    for (i = 0; i < BOYS_NUM; i++)
    {
        printf("\nThe Boys's info: %s\t, height: %d\t, money: %d\t, handsome: %d\t");
    }

    getchar();
}   

但是上面的代码有很明显缺点:

  1. 变量过多,同一追求者的各个数据无联系,没有整体概念,不便管理;

  2. 操作不便,假如某天想把“”作为第一考虑呢?或者根据不同面采取不同的加权来选择呢?

男人,不止一面!(七匹狼广告)

一个事物往往有很多的特征,但是人们往往去表达事物的时候,不是说特征,而是讲整体。零碎的信息、有时候很难替代一个整体信息结构。

显然,选用一种能把一个追求者的数据构造成一个整体的构造型数据结构更合适,但不能是数组。对于这种情况,可以将一个追求者的数据定义为一个ExpectedBoyFriend结构体类型:

struct ExpectedBoyFriend
{
    char name[10];
    int height;
    int money;
    int handsome;
};

有时需要将不同类型的数据组合成一个有机的整体,以供用户方便地使用,而这些组合在一个整体中的数据是互相联系的。

C和C++允许用户自己指定这样一种数据类型,它称为结构体,在一个组合项中包含若干个类型不同(当然也可以相同)的数据项。

类似上例,我们就声明了一个新的结构体类型ExpectedBoyFriend,它向编译系统声明: 这是一种结构体类型,它包括name, height, money, handsome等不同类型的数据项。ExpectedBoyFriend是一个类型名,它和系统提供的标准类型(如int、char、float、double等)一样,都可以用来定义变量,只不过结构体类型需要事先由用户自己声明而已。

声明一个结构体类型的一般形式为:

struct tag
{
    member-list
}
varible-list

结构体类型名用来作结构体类型的标志。上面的声明中ExpectedBoyFriend就是结构体类型名。大括号内是该结构体中的全部成员(member),由它们组成一个特定的结构体。上例中的name, height, money, handsome等都是结构体中的成员。

在声明一个结构体类型时必须对各成员都进行类型声明:

即类型名  成员名;

每一个成员也称为结构体中的一个域(field)。成员表列又称为域表。成员名的定名规则与变量名的定名规则相同。

我们再看看使用Struct之后的代码:

/************************************************************************************
** File: - Z:\work\code\c\Struct\UsingStruct.c
** 
** Copyright (C) Long.Luo, All Rights Reserved!
** 
** Description: 
**      UsingStruct.c ---
** 
** Version: 1.2
** Date created: 22:52:29,20/12/2012
** Author: Long.Luo
** 
** --------------------------- Revision History: --------------------------------
**  <author>    <data>          <desc>
** 
************************************************************************************/

#include <stdio.h>

/* Number of the boys */    
#define BOYS_NUM    (3)


struct ExpectedBoyFriend
{
    char name[10];
    int height;
    int money;
    int handsome;
};


void main()
{
    struct ExpectedBoyFriend ebf[BOYS_NUM];
    struct ExpectedBoyFriend ebfTemp;
    int i, j;

    for (i = 0; i < BOYS_NUM; i++)
    {
        printf("Pls input the Name of the No. %d Boys:", i + 1);
        gets(ebf[i].name);
        if (ebf[i].name[0] == '\0')
        {
            gets(ebf[i].name);
        }

        printf("Pls input the Height of %s :", ebf[i].name);
        scanf("%d", &ebf[i].height);
        printf("Pls input the Money of %s :", ebf[i].name);
        scanf("%d", &ebf[i].money);
        printf("Pls input the Handsome of %s :", ebf[i].name);
        scanf("%d", &ebf[i].handsome);
    }

    /* Sort by Height */
    /* Only write one item. */ 
    for (i = 0; i < BOYS_NUM - 1; i++)
    {
        for (j = i + 1; j < BOYS_NUM; j++)
        {
            if (ebf[i].height < ebf[j].height)
            {
                ebfTemp = ebf[i];
                ebf[i] = ebf[j];
                ebf[j] = ebfTemp;
            }
        }
    }

    for (i = 0; i < BOYS_NUM; i++)
    {
        printf("%s: \tHeight:%d, \tMoney: %d, \tHandsome:%d\n", 
            ebf[i].name, ebf[i].height, ebf[i].money, ebf[i].handsome);
    }

    getchar();
}       

代码是不是变得简洁多了呢

在这一篇里我们引入了结构体,了解了为什么需要结构体,在实际问题中作用及带来的好处。下一篇我们会对结构体的声明,定义及初始化进行详细讲解,不要走开,下节更精彩!

原文链接:大话结构体之一: 从女孩怎么选男朋友开始...Struct是为了解决什么问题?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容