和小石头一起学C(C语言之结构体 三)

因为最近比较忙.呵呵  (主要是带新人做Flex项目。一下带了5个人,一个人一个项目,真是累死我了。)

大家好,欢迎再次来到小石头的博客。

接着上一篇的内容我们继续学习。

/*
文件名称 :noname0.c
作者:小石头
编写日期:20100527
说明:1.学习C语言中结构的一个例子。
       2.这个程序主要是给看这篇文章的人使用。。
测试要点:  
修正履歴:
    小石头 20100527 程序中增加输出A这个学生的年龄和性别信息
    小石头 20100528 程序中性别以字符的形式显示
    小石头 20100528 显示信息中的年龄和性别之间添加换行功能。


*/
#include "stdio.h"
struct Stu //定义学生信息结构
{
 int age;//年龄
 //int Sex;//性别 小石头 20100528 程序中性别以字符的形式显示
 char* Sex;
 
};
void main()
{
    struct Stu A ;
    A.age=25;
    A.Sex="男";
    printf("A的年龄是%d\n",A.age);
    printf("A的性别是%s\n",A.Sex);

}

上回我们说到。这个代码和c的结构化设计原则相违背。

怎么办呢?这一节中我们就要在次进行改进。

(题外话开始)

 结构化设计原则

    1.自顶向下:程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开始就过多追求众多的细节,先从最上层总目标开始设计,逐步使问题具体化。

    2.逐步求精:对复杂问题,应设计一些子目标作为过渡,逐步细化。

    3.模块化:一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解为子目标,再进一步分解为具体的小目标,把每一个小目标称为一个模块。

    4.限制使用goto语句

  

  第4点。我上大学的时候老师讲过。我从此就没有在c中使用过goto语句。我上中学的时候学习的Basic语言时。goto语句我是用得最多的,好处是方便。为什么c中限制使用呢?

老师也没有讲明白。我记得上回去面试一个新毕业的本科生的时候,我问了他这个问题。他的回答是老师说的,C语言中不能使用。所以我就不用了。我又问他,那为什么它又是关键字呢?

参见红色的字体。他没有回答出来。他可能回去会和他的朋友,同学说。这个面试官真是变态。出的什么破题。水平太差了。故意难为他。现在找工作太难了。老天对他不公平。

呵呵。因为他始终不明白。想学习好计算机编程技术就是要有打破砂锅问到底的精神。什么是经验?我个人认为就是你对解决问题的能力。因为在项目开发中,不论是新手还是老手都会遇到很多问题。

客户会提出很多需求。你的上级也会提出很多需求。比如那些很炫的界面。他们都会要求你去实现。等等。所以说解决问题的能力才是关键。有的人需要一周时间。有的人只需要一个小时。

需要一个小时的人。当初解决这个问题可能花了一个月。但是人家记下来了。把解决问题的方法记下来了。而那个同样的人用了一周时间,他没有打破砂锅问到底的精神,只是以解决问题为目的。以后呢?同样的问题他还是一周时间。而那个只用一个小时的人,后来解决问题的时间越来越短。我就是那个曾经花一周解决问题的人。我想我的想法告诉那个来面试的新毕业学生,可是没有机会了。

auto

break

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

int

long

register

return

short

signed

sizeof

static

struct

switch

typedef

union

unsigned

void

volatile

while

 

最近我才明白原因。以下是个人想法。欢迎扔砖

刚开始使用goto,是因为程序中的逻辑关系掌握不明白。所以才用GOTO

当需要用GOTO来解决我程序中复杂的逻辑关系。当我用明白的时候。发现

它已经和if,else,break没有任何区别了。

第三点,模块化,说白了就是按功能分类。把每一个功能用函数代替。有的人会说。现在都是面向对象编程。面向结构已经过时。

呵呵。你没有使用过面向结构化编程,如果能知道面向对象的好处。

这种感觉只能去亲身体验。

(题外话结束)

/*
文件名称 :noname0.c
作者:小石头
编写日期:20100527
说明:1.学习C语言中结构的一个例子。
       2.这个程序主要是给看这篇文章的人使用。。
测试要点:  
修正履歴:
    小石头 20100527 程序中增加输出A这个学生的年龄和性别信息
    小石头 20100528 程序中性别以字符的形式显示
    小石头 20100528 显示信息中的年龄和性别之间添加换行功能。


*/
#include "stdio.h"
struct Stu //定义学生信息结构
{
 int age;//年龄
 //int Sex;//性别 小石头 20100528 程序中性别以字符的形式显示
 char* Sex;
 
};
void main()
{
    struct Stu A ;
    A.age=25;
    A.Sex="男";
    printf("A的年龄是%d\n",A.age);
    printf("A的性别是%s\n",A.Sex);

}

现在我们做一个函数。把显示的内容以函数的方式来处理。这个main 函数中只有一条语句。

呵呵

c中的函数模型如下

返回类型  函数名称(参数类型 参数)

{

  函数体;

     返回类型;

}

铛铛

/*
文件名称 :noname0.c
作者:小石头
编写日期:20100527
说明:1.学习C语言中结构的一个例子。
       2.这个程序主要是给看这篇文章的人使用。。
测试要点:  
修正履歴:
    小石头 20100527 程序中增加输出A这个学生的年龄和性别信息
    小石头 20100528 程序中性别以字符的形式显示
    小石头 20100528 显示信息中的年龄和性别之间添加换行功能。
    小石头 20100612 程序结构采用模块化设计


*/
#include "stdio.h"
struct Stu //定义学生信息结构
{
 int age;//年龄
 //int Sex;//性别 小石头 20100528 程序中性别以字符的形式显示
 char* Sex;
 
};
void DisplayStu();
void main()
{
    DisplayStu();
}
void DisplayStu()
{
  struct Stu A ;
    A.age=25;
    A.Sex="男";
    printf("A的年龄是%d\n",A.age);
    printf("A的性别是%s\n",A.Sex);
}

红色是我这回新加的代码

呵呵。初学者在第一次写函数的时候。容易忘记蓝色的那句。

图例为,忘记蓝色那句后运行的结果。

从提示可以看来。是说 DisplayStu 没有定义。

一般写项目的时候。把函数的定义全放到一个 .h文件中。

 

以上是我用vc++做的一个例子。呵呵。VC++呵呵我以后会讲到。

上面说到。函数是有返回值的。void 是无返回值类型。但是一般情况下,都要加一句。

return 0;

但是我建议不要写 void 类型的函数。因为函数都是要有返回值的。你看一下微软的SDK API 函数几本是返回 int 类型的。

因为通过返回值能知道该函数是否执行成功。因为我们写的程序不一定都是运行成功的。

而用布尔值呢?(c# VB JAVA 语言中有。但是我个人认为布尔值返回的只能是二种错误状态 真 假 对于三种以上的状态就不行了。)

/*
文件名称 :noname0.c
作者:小石头
编写日期:20100527
说明:1.学习C语言中结构的一个例子。
       2.这个程序主要是给看这篇文章的人使用。。
测试要点:  
修正履歴:
    小石头 20100527 程序中增加输出A这个学生的年龄和性别信息
    小石头 20100528 程序中性别以字符的形式显示
    小石头 20100528 显示信息中的年龄和性别之间添加换行功能。
    小石头 20100612 程序结构采用模块化设计


*/
#include "stdio.h"
struct Stu //定义学生信息结构
{
 int age;//年龄
 //int Sex;//性别 小石头 20100528 程序中性别以字符的形式显示
 char* Sex;
 
};
int DisplayStu();
void main()
{
    int Temp=0;
    Temp=DisplayStu();
   
    if(Temp!=0)
    {
     printf("程序运行异常 A-0-5");
    }
}
int DisplayStu()//A-0-5
{
 struct Stu A ;
    A.age=25;
    A.Sex="男";
    printf("A的年龄是%d\n",A.age);
    printf("A的性别是%s\n",A.Sex);
    return 0;
}

这样的好处是将来查找错误方便。

至于为什么 return 0;
便于以后功能扩展。

现在代码看起来,冷爽多了。

现在我们还需要做的是。函数的参数。

int DisplayStu();

我们定义了一个无参函数。这个习惯很不好。因为这样不利用通用性。

现在我们定义一个带参数的函数。(要仔细分析。下面可是本节的重点)

/*
文件名称 :noname0.c
作者:小石头
编写日期:20100527
说明:1.学习C语言中结构的一个例子。
       2.这个程序主要是给看这篇文章的人使用。。
测试要点:  
修正履歴:
    小石头 20100527 程序中增加输出A这个学生的年龄和性别信息
    小石头 20100528 程序中性别以字符的形式显示
    小石头 20100528 显示信息中的年龄和性别之间添加换行功能。
    小石头 20100612 程序结构采用模块化设计


*/
#include "stdio.h"
struct Stu //定义学生信息结构
{
 int age;//年龄
 //int Sex;//性别 小石头 20100528 程序中性别以字符的形式显示
 char* Sex;
 
};
int DisplayStu(struct Stu A);
void main()
{
    int Temp=0;
    struct Stu A ;
    Temp=DisplayStu(A);
   
    if(Temp!=0)
    {
     printf("程序运行异常 A-0-5");
    }
}
int DisplayStu(struct Stu A)//A-0-5
{
 
    A.age=25;
    A.Sex="男";
    printf("A的年龄是%d\n",A.age);
    printf("A的性别是%s\n",A.Sex);
    return 0;
}

初学者可能会写成这样

int DisplayStu(struct  A);

你不是说。(参数类型 参数名称)

但是对于结构来说。参数类型是

struct Stu //定义学生信息结构

看一下运行结果。

呵呵。此次学习到此结束。下课了。

原文地址:https://www.cnblogs.com/littlestone/p/1749844.html