1、将复杂问题分解为简单问题的程序设计方法称为结构化程序设计,其特点为自顶向下、逐步细化、模块化;
2、定义常量的方法:#define 和const
#define PI 3.1415926(无分号,无常量类型)
const float PI = 3.14159;
3、函数定义(原型)
在ANSI C标准中,所有函数调用之前必须要有函数定义或原型说明,函数原型用以说明函数的返回值类型、函数参数类型、个数及次序。函数原型说明有两种形式:
直接使用函数的头部(函数头部后加分号)。
如, double tri_area(double a, double b, double c);
在原型说明中仅给出类型、个数及次序,无形参变量名。
如, double tri_area(double , double , double );
注意:函数原型说明的类型、参数类型、个数及次序必须与函数定义时一致,否则会产生错误。
4、传值调用
C函数的参数传递全部采用传值。传值调用实际上重新拷贝了一个副本给形参;传值的好处是传值调用不会改变调用函数实参变量的内容,因此,可避免不必要的副作用。
5、局部变量
局部变量(local variable),又称自动变量:在函数(或块结构)中定义的变量;
使用范围:只在定义它的函数或块结构内有效;
定义时可加auto关键字,也可省略:
auto int index; 等同于: int index;
编译程序不对局部(自动)变量给予隐含的初值,故其初值不确定。因此,每次使用前,必须明确地置初值;
局部(自动)变量随函数的调用而存在,函数返回后将消失,由一次调用到下一次调用之间不保持值,每次调用函数时都重新初始化;
形参是自动变量,使用范围仅限于相应函数内;
6、switch语句注意事项
常量表达式必须是整型(if_else if可能根据任意条件来进行多路选择);
在同一个switch中不应出现两个具有同样的常量;
default语句如果有,只允许出现一次,default可出现在switch中的任何位置,通常放在最后;
case和default本身不改变控制流(这与pascal中的case语句不同),中断离开switch要用break;
case后的语句可以是单个语句,也可以是复合语句(但不带开头和结尾的花括号)
7、数组相关
数组是变量的有序集合,数组的所有成员(数组元素)都具有相同的数据类型。
数组定义一般采用如下格式:
类型 数组名[长度]; --长度为常量表达式
C语言不支持动态数组,即数组的长度必须在编译时确定下来,而不是在运行中根据需要临时决定。但C语言提供了动态分配存贮函数,利用它可实现动态申请空间。
下面是一些数组初始化实例:
double sales[5] = {12.25, 32.50, 16.90, 23, 45.68};
double sales[ ] = {12.25, 32.50, 16.90, 23, 45.68}; //以实际元素的个数决定数组的大小
int list[5] = { 6, 5, 12 }; //相当于 int list[5] = {6,5,12,0,0}
//用字符串常量初始化一个字符数组时,其长度应至少比字符个数多1。
char string[10] = {'h', 'e', 'l', 'l', 'o', '\0'}
char string[10] = "hello";
char string[ ] = "hello";
不允许对数组整体操作,只能单个元素处理;
数组做函数参数时,数组长度一般不写在形参内,因为编译器不做检查,应该如下处理:
void print( int a[ ] , int length)
{
int i;
for(i=0; i<length; i++)
printf( "%d\n", a[i]);
}
数组作为实参,只写数组名,如下:
print(digit, 10);
数组作函数参数是可以将数组中的值传递回来的;(因为数组名即为数组的首地址)
8、字符数组
数组元素的类型是char。
char mes[ ] = "C Language";
char line[100] = "Programming";
字符数组有如下特点:
数组元素跟一般变量一样可赋值、比较、计算等;
数组下标也是从0 ~ N-1(N为数组长度);
字符数组长度可以显式给出,也可以隐式得到;
由双引号括起来的的字符串常量具有静态字符串数组类型!!!!!!!
对数组初始化时,编译程序以 \0 作为结束符添加到字符串最后。因此,数组长度要比字符串长度多1;(所以字符数组作为函数参数传递时,不需要同时传递数组长度。因为字符数组中字符串是以 \0 结束的。)
9、文件相关
头文件为 #include <stdio.h>
文件使用的基本流程如下:
10、打开文件
FILE * fp; //文件指针:与打开的文件绑定在一起,以后将使用该指针实现对文件的所有操作
fp = fopen("文件名","文件使用方式");
FILE 是<stdio.h>文件中定义的结构数据类型,包含文件有关信息:读或写工作方式;当前读/写位置等等。一般用户不必关心。
若成功打开指定文件,则fopen返回指向该文件的FILE类型指针;
若打开文件失败,则返回 NULL。
文件名: 字符串,可以只写文件名,也可以包含路径。(“c:\\temp\\text.txt”)
只写文件名时,表示文件在当前目录下,当前目录是指:
- 从VC运行时,工程文件和源程序所在目录;
- 双击*.exe程序运行时,该*.exe程序所在目录;
使用方式也是字符串,表示打开文件的方式,字符流方式包括:
- “r”: 表示读;
- “w”: 表示写;
- “a”: 表示添加;
- “r+”: 表示读写已有文件;
- “w+”: 表示读写新文件;
“a+” : 表示读及添加;
注意:
- 用“w”或“a”方式调用fopen打开一个不存在的文件,系统会首先自动创建该文件。然后再把它打开。
- 用“w”方式打一个已存在的文件,则该文件原有内容全部消失。
- 用“a”方式打开一个已存在的文件,则原文件内容保留不变,新添加的内容将加到它的后面去。
- 用“r”方式打开一个已存在的文件是正常的使用文件,若用“r”方式而打开一个尚未存在的文件,则会出错,此时返回NULL。
- “r+”是对一个已存在的文件进行读和写操作。
- “w+”同样对一个已存在的文件打开时,原数据消失,因此,修改一个已有文件的内容时,必须以“r+”方式打开。
- “a+”写入的数据均在文件最后,而数据却可由文件任何位置上读取。
因此,一个好的程序设计风格,应判断打开文件的返回值,并进行处理,如下:
//一个打开文件的典型用法:
…
if ( ( fp = fopen(filename, “r”) ) == NULL )
{
printf(“Can’t open file %s!\n”,filename);
return -1;
}
11、读写文件
字符输入函数:
int fgetc (FILE * fp );
从fp所指向的文件中读取一个字符并返回。若文件结束或调用失败,返回EOF
字符输出函数:
int fputc ( int ch, FILE * fp );
将字符ch写入fp所指向的文件。若成功,则返回写入的字符;若失败,返回EOF
12、关闭文件
关闭文件函数:
int fclose (FILE* fp );
关闭fp文件指针所指向的文件,并释放fp文件指针。若成功关闭,返回0,否则返回EOF
一个完整的文件续写代码如下:
#include <stdio.h>
//将文件in.txt拷贝至新文件out.txt中
int main()
{
char ch;
FILE * in, * out;
if((in=fopen("in.txt","r"))==NULL)
{
printf("Can't open in.txt!");
return -1;
}
if((out=fopen("out.txt","w"))==NULL)
{
printf("Can't open out.txt!");
return -1;
}
while( (ch = fgetc(in)) !=EOF )
fputc(ch,out);
fclose(in);
fclose(out);
return 0;
}