因为最近比较忙.呵呵 (主要是带新人做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 //定义学生信息结构
看一下运行结果。
呵呵。此次学习到此结束。下课了。