学习目标:
- 掌握 C 入门知识
- 学习自律+1 +1 +1 +1…+1
学习内容:
1.goto语句
2.函数:(1) 函数的参数(2) 函数的调用
一.goto语句
goto语句:终止程序在某些深度嵌套的结构的处理过程(可以跳转)
1.代码示例:
#include<stdio.h> int main() { again: printf("hello\n"); printf("hello\n"); printf("hihi\n"); goto again; return 0; }
2.用goto语句实现一个关机程序
程序运行起来后,倒计时60秒关机,如果输入好好学习就可以取消关机。
使用命令行关机
shutdown -s -t 关机
shutdown -a 取消关机
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char arr[20] = { 0 }; system("shutdown - s - t 60"); again: printf("请注意,你的电脑将在一分钟内关机,如果输入:好好学习,就取消关机\n"); scanf("%s", arr); if (strcmp(arr, "好好学习")==0) { system("shutdown - a"); } else { goto again; } return 0; }
所以可以写成strcmp(arr, “好好学习”) == 0
二.掌握函数基本语法
1.函数是什么
(1).函数就是 C 语言的模块,一块一块的,有较强的独立性,可以相互调用,换句话说,C 语言中,一个函数里面可以调用 n 个函数,即大函数调用小函数,小函数又调用“小小”函数。这就是结构化程序设计,所以面向过程的语言又叫结构化语言。
(2).函数就是一系列 C 语句的集合,能完成某个特定的功能。需要该功能的时候直接调用该函数即可,不用每次都堆叠代码。需要修改该功能时,也只需要修改和维护这一个函数即可。
2. 函数的分类
(1).库函数:库函数(Library function)是把函数放到库里,供别人使用的一种方式。一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是编译器特定的库函数。
(2).自定义函数:自定义函数是程序员自己声明和定义的,是程序员补充的工具,不管是现成工具的还是补充的工具,都是工具,对使用者来说都一样,没有区别。在C语言中,函数的调用非常灵活,可以独占一行语句,也可以当成常量赋值给变量,也可以当成函数的参数。
3.库函数
(1)strcpy函数:C 库函数char *strcpy(char *dest, const char *src) 把src 所指向的字符串复制到dest(\0也可以拷贝)。 需要注意的是如果目标数组dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
#include<stdio.h> #include<stdio.h> #include<string.h> int main() { char str1[] = "Sample string"; char str2[40]; char str3[40]; strcpy(str2, str1); strcpy(str3, "copy successful"); printf("str1:%s\nstr2:%s\nstr3:%s\n", str1, str2, str3); return 0; }
(2)memset函数:memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的。 其原型是:void memset(void _Dst, int _Val, size_t _Size)
_Dst是目标起始地址,_Val是要赋的值,_Size是要赋值的字节数。
#include<stdio.h> #include<string.h> int main() { char str[] = "hello world"; memset(str, 'x', 5); printf("%s\n", str); return 0; }
4.自定义函数(有函数名 返回值类型和函数参数)
(1).找出两个整数之间的最大值
#include<stdio.h> int get_max(int x,int y) if (x > y) return x; else return y; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int m = get_max(a, b);//自定义函数 printf("%d\n", m); return 0; }
并不是说函数都有返回,有的不用返回可以写成void get_max()
以上get_max就是一个自定义函数
5.函数的参数
(1).函数的实参:
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
实参可以是变量 常量 表达式 函数等;
#include<stdio.h> get_max(int x,int y) { if (x > y) return x; else return y; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); //int m = get_max(a, b);//变量 //int m = get_max(a, 3);//常量 //int m = get_max(a, 2+3);//表达式 int m = get_max(a, get_max(4, 5));//函数 printf("%d\n", m); return 0; }
(2).函数的形参:
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
形式参数当函数调用完之后就自动销毁了
(3):示例:写一个函数可以交换两个整形的变量内容
由图片可知,最后a和b的值并没有交换,这是为什么呢?
a,b是实参;x,y是形参形参是实参的一份临时拷贝,对形参的修改是不会影响实参的
通过调试可以知道,当a,b传参过去给x,y但是x,y的地址和a,b并不相同,所以交换后交换的只是x,y的值对a,b并无影响
所以可以采用指针的方式
6. 函数的调用
(1).传值调用:
传值调用: 函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参
#include<stdio.h> void Swap1(int x, int y) { int tmp = x; x = y; y = tmp; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); printf("交换前:a=%d,b=%d\n", a, b); Swap1(a, b); printf("交换后:a=%d,b=%d\n", a, b); return 0; }
(2).传址调用:
将实参的地址传递给函数,在函数内对形参进行操作等同于对实参进行相同的操作,在函数调用结束返回后,形参被释放,实参的内容是对形参进行操作后的结果。
#include<stdio.h> void Swap2(int* pa, int* pb) { int tmp = *pa; *pa = *pb; *pb = tmp; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); printf("交换前:a=%d,b=%d\n", a, b); Swap2(&a, &b); printf("交换后:a=%d,b=%d\n", a, b); return 0; }
(3).注意
下图这种方式也是一种传值方式,虽然地址传过去是对的但是px,py交换的只是地址,a,b的值并无影响。