黑马程序员——2、C语言(流程控制和函数)

时间:2022-08-27 11:07:56

---------------------- Java培训、Android培训、iOS培训、.Net培训期待与您交流! ---------------------


一、流程控制

流程控制分为以下三种:

顺序结构:默认的流程结构,按照书写的顺序执行每一条语句。

选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码。

循环结构:在给定条件成立的情况下,反复执行某一段代码。

  1. 选择结构

(1)if

if(表达式) 语句1;

if(表达式) 语句1; else 语句2;

if(表达式)  {  }

if(表达式) { } else { }

if(表达式1) { }  else if(表达式2) { }  else { }

(2)switch

switch(表达式) { case 数值1: break; … default: break;}

注意:不能忘了break;语句。

  2. 循环结构

(1)while

while(表达式) { }

注意:只有条件成立才会执行循环体。

(2)do-while

do{ } while(表达式)

注意:循环体一定会执行一次,再进行表达式判断。

(3)for

for(初始化语句; 条件表达式; 渐变语句) { }

注意:for循环体内部变量的作用域。

  3. break和continue

(1)break

使用场合:switch、循环结构

(2)continue

使用场合:循环结构



二、函数

函数可以把不需要了解的具体操作细节隐藏起来,从而使整个程序结果更加清晰,并降低修改程序的难度。

  1. 定义函数

定义的目的:将一个常用的功能封装起来,方便以后调用。

定义形式:

返回值类型  函数名(参数声明列表)

{

        声明和语句

}

  2. 函数调用

函数调用前,得先声明函数。

不能重复定义函数,但可以重复声明函数。

只有函数声明、没有定义,编译警告、链接报错。

  3. 函数的参数

形参和实参的参数个数一致;参数的传递时值传递。

  4. 函数的返回

函数的返回类型可以是任何类型。

函数的弱语法:

1》如果没有写返回值类型,则默认是int

2》如果写了返回值类型,也可以直接return;

3》void,不返回任何值

4》return (表达式);,表达式的值返回之前将转换为函数的类型

  5. 头文件

一般我们把.h文件都称为头文件。别的源文件只要包含了头文件,就可以使用头文件里面声明的函数了,但是编译的时候还是要把引用的函数定义的文件一起编译。

  6. static和extern关键字

(1)对函数

外部函数:定义的函数能被本文件和其他文件访问。

1》默认情况下,所有的函数都是外部函数。

2》不允许有同名的外部函数。

内部函数:定义的函数只能被本文件访问。

1》允许不同文件中有同名的内部函数。


static对函数的作用:

1》定义一个内部函数

2》声明一个内部函数

extern对函数的作用:

1》完整地定义一个外部函数

2》完整地声明一个外部函数

(默认情况下,声明和定义的函数都是外部函数,所以extern可以省略)

(2)对变量

全局变量分2种:

外部变量:定义的变量能被本文件和其他文件访问

1》默认情况下,所有的全局变量都是外部变量

2》不同文件中的同名外部变量,都代表同一个变量

内部变量:定义的变量只能被本文件访问

1》不同文件中的同名内部变量,互不影响。


static对变量的作用:

定义一个内部变量

extern对变量的作用:

声明一个外部变量

(3)static修饰局部变量

1》延长局部变量的生命周期:程序结束的时候,局部变量才会被销毁

2》并没有改变局部变量的作用域

3》所有的test()函数都共享一个变量b

static修饰局部变量的使用场合:

一个函数被调用很多次,且某个变量值固定不变

  7. 函数的补充

(1)递归

函数的递归调用,就是说函数可以直接或间接调用自身。

递归并不节省存储器的开销,因为递归调用过程中国必须在某个地方维护一个存储处理值的栈。递归的执行速度并不快,但递归代码比较紧凑,并且比响应的非递归代码更易于编写且好理解。在描述树、图等数据结构方面,使用递归很是方便的。

(2)标准输入/输出函数

标准输入/输出函数在头文件<stdio.h>中有定义。

int getchar(void) :在每次调用时返回下一个输入字符。若遇到文件结尾,则返回EOF。

int putchar(int) :将字符送到标准输出上,默认情况标准输出为屏幕显示。如果没有发生错误,则函数putchar将返回输出的字符;如果发生错误,则返回EOF。

(3)格式化输入/输出

1》格式化输出 ——printf函数

输出函数printf将内部数值转换为字符的形式。

int printf(char *format, arg1, arg2, ...);

函数printf在输出格式format的控制下,将其参数进行格式化转化,并在标准输出设备上打印出来。它的返回值为打印的字符数。

黑马程序员——2、C语言(流程控制和函数)

黑马程序员——2、C语言(流程控制和函数)

2》格式化输入 ——scanf函数

int scanf(char *format, arg1, arg2, ..);

scanf函数从标准输入中读取字符序列,按照format中的格式说明对字符序列进行解释,并把结果保存到其余的参数中。

当scanf函数扫描完格式串或遇到无法与格式说明匹配的输入时,scanf函数将会终止,同时,返回成功匹配并赋值的输入项的个数作为函数的返回;如果到达文件结尾,scanf将返回EOF。

注:空格、制表符、换行符、回车符和换页符在格式串处理过程中将被忽略。

(4)文件访问函数

<stdio.h>中定义了一个包含文件信息的结构FILE。

FILE *fp = fopen(char *name, char *mode);

fp是一个指向结构FILE的指针,fopen函数返回一个指向结构FILE的指针。

fopen的第一个参数是一个字符串,它包含文件名。第二个参数是访问模式,也是一个字符串,用于指定文件的使用方式,模式包括:读("r")、写("w")、追加("a")。

int fclose(FILE *fp);

执行与fopen相反的操作,它断开由fopen函数建立的文件指针和外部名之间的连接,并释放文件指针以供其他文件使用。

注意:有fopen,就有fclose。

(5)字符串操作函数

函数在头文件<string.h>中定义:

strcat(char *s, char *t);

将t指向的字符串连接到s指向的字符串的末尾。

strncat(char *s, char *t, int n);

将t指向的字符串中前n个字符连接到s指向的字符串的末尾。

strcmp(char *s, char *t);

根据s指向的字符串小于(s<t)、等于(s==t)或大于(s>t)t指向的字符串的不同情况,分别返回负整数、0、或正整数。

strncmp(char *s, char *t, int n);

同strcmp,单只在前n个字符中比较。

strcpy(char *s, char *t);

将t指向的字符串复制到s指向的字符串的位置。

strncpy(char *s, char *t, int n);

将t指向的字符串中的前n个字符复制到s指向的位置。

strlen(char *s);

返回s指向的字符串的长度。

strchr(char *s, char c);

在s指向的字符串中查找c,若找到。则返回指向它第一次出现的位置的指针,否则返回NULL。

strrchr(char *s, char c);

在s指向的字符串中查找c,若找到。则返回指向它最后一次出现的位置的指针,否则返回NULL。

(6)字符类别测试和转换函数

在头文件<ctype.h>中定义:其中c为unsigned char类型

isalpha(c);

若c是字母,则返回一个非0值,否则返回0。

isupper(c);

若c是大写字母,则返回一个非0值,否则返回0。

islower(c);

若c是小写字母,则返回一个非0值,否则返回0。

isdigit(c);

若c是数字,则返回一个非0值,否则返回0。

isalnum(c);

若isalpha(c)(是字母)或isdigit(c)(是数字),则返回一个非0值,否则返回0。

isspase(c);

若c是空格、制表符、换行符、回车符或换页符,则返回一个非0值,否则返回0。

toupper(c);

返回c的大写形式。

tolower(c);

返回c的小写形式。

(7)命令执行函数

system(char *s);

执行包含在字符串s中的命令。然后继续执行当前程序。s很大程度上与所用的操作系统有关。

system("date");

system("pause");

(8)存储管理函数

函数malloc和calloc用于动态地分配存储块。

void *malloc(size_t n);

当分配成功时,返回一个指针,指针指向n字节长度的未初始化的存储空间,否则返回NULL。

void *calloc(size_t n, size_t size);

当分配成功时,返回一个指针,指针指向的存储空间足以容纳n个指定长度size的对象组成的数组,否则返回NULL。该空间被初始化为0。

free(p);

释放指针p指向的存储空间,p是之前malloc或calloc过的指针。

(9)数学函数

头文件<math.h>中声明:

double sin(double x);

x的正弦函数,其中x用弧度表示。

double cos(double x);

x的余弦函数,其中x用弧度表示。

double atan2(double y, double x);

y/x的反正切函数,其中x和y都用弧度表示。

double exp(double x);

指数函数e的x次方。

double log(double x);

x的自然对数(以e为底),其中x>0。

double log10(double x);

x的常用对数(以10为底),其中x>0。

double pow(double x, double y);

计算x的y次方的值。

double sqrt(double x);

x的平方根(x>=0)。

double fabs(double x);

x的绝对值。

(10)随机数发生器函数

函数rand()生成介于0和RAND_MAX之间的伪随机整数序列。其中RAND_MAX是在头文件<stdlib.h>中定义的符号常量。

#define frand() ((double) rand() / (RAND_MAX+1.0));

生成大于等于0但小于1的随机浮点数。