第二周学习总结-创新互联
三元运算符:
成都创新互联公司成立与2013年,先为鸡东等服务建站,鸡东等地企业,进行企业商务咨询服务。为鸡东企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。max=(a>b)?a:b;
例题:输入两个数,输出大的
1 #include2 int main()
3 {
4 int a,b,max;
5 printf("输入两个数:");
6 scanf("%d%d",&a,&b);
7 max=(a>b)?a:b;
8 printf("大的数为%d\n",max);
9 return 0;
10 }
进阶:利用条件运算符的嵌套完成此题,学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下用C表示。
1 #include2 int main()
3 {
4 int score;
5 char grade;
6 printf("输入成绩:");
7 scanf("%d",&score);
8 if(score<0||score>100){
9 printf("输入错误\n");
10 }else{
11 grade=(score>=90)?'A':((score<60)?'C':'B');
12 printf("等第为:%c\n",grade);}
13 return 0;
14 }
全局变量:
全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部都能访问全局变量,全局变量在声明后整个程序中都是可用的。
局部变量:
在某个函数或块中内部声明的变量叫做局部变量,在函数外部不可知。
定义一维数组:
宏定义只代不运算
例题:
以下程序的执行结果为8 。
#inlcude
#define N 2 2
#define M N+1 2+1
#define NUM (M+1)*M/2 (2+1+1)*2+1/2=8+0=8
main()
{pirntf("%d",NUM);}
数组下标从0开始:
例如定义a[10],是从a[0]到a[9]。
冒泡排序:
例题:定义一维数组的10个元素,将它们从小到大输出
1 #include2 int main()
3 {
4 int a[10]={12,43,9,13,67,98,101,89,3,35};
5 int i,j,t;
6 for(i=0;i<9;i++){
7 for(j=0;j<9-i;j++){
8 if(a[j]>a[j+1]){
9 t=a[j+1];
10 a[j+1]=a[j];
11 a[j]=t;
12 }
13 }
14 }
15 for(i=0;i<10;i++){
16 printf("%d \n",a[i]);
17 }
18 return 0;
19 }
10个数的数列总共扫描10-1次,每一趟扫描到a[10-i-2]与a[10-i-1]比较为止结束,后一位数比前一位数小的话,就交换两个数的位置(升序)。
定义二维数组:
二维数组定义方法和一维数组类似,其一般形式为:
类型说明符 数组名[常量表达式][常量表达式]。
二维数组的初始化:
int a[3][4]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
可以对部分元素赋初值:
int a[3][4]={{1},{3},{5}};
1 0 0 0
3 0 0 0
5 0 0 0
只给各行的第0列元素赋初值,其它列都是0
例题:有一个3*4的矩阵,输出大值和它所在的行和列:
1 #include2 int main()
3 {
4 int a[3][4]={{1,2,3,4},
5 {5,6,7,8},
6 {9,10,11,12}};
7 int i,j,h,k;
8 int max=a[0][0];
9 for(i=0;i<3;i++){
10 for(j=0;j<4;j++){
11 if(a[i][j]>max){
12 max=a[i][j];
13 h=i+1;
14 k=j+1;
15 }
16 }
17 }
18 printf("大值:%d\n行号:%d\n列号:%d\n",max,h,k);
19 return 0;
20 }
打擂台方法,让max=a[0][0]做擂主,拿a[i][j]跟a[0][0]作比较,比max大了就替代max,因为数组下标是从0开始的,所以输出行号列号的时候要加1。
字符数组
字符数组的定义:
字符数组的定义方法与数值型数组定义方法类似
char c[10];
定义c[10]为字符数组,其中有10个元素
例题:输出一个正方形
1 #include2 int main()
3 {
4 char c[3][3]={{'*','*','*'},
5 {'*',' ','*'},
6 {'*','*','*'}};
7 for(int i=0;i<3;i++){
8 for(int j=0;j<3;j++){
9 printf("%c ",c[i][j]);
10 }
11 printf("\n");
12 }
13 return 0;
14 }
字符串的头文件 #include
函数
字符数组的输入输出:
逐个字符用“%c”,整个字符串用“%s”
也可以用puts和gets函数,一般形式为:
puts(字符数组):将一个字符串输出到终端
gets(字符数组):从终端输入一个字符串到字符数组
strcat 函数-字符串连接函数
strcat(字符数组1,字符数组2)
将两个数组中的字符串相连,数组2的字符串放到数组1中
1 #include2 #include3 int main()
4 {
5 char str1[30]="china";
6 char str2[]="NJ";
7 printf("%s\n",strcat(str1,str2));
8 return 0;
9 }
注意:
1、连接前两个字符串后面都有'\0',连接时将数组1中的'\0'取消,只保留新连接的数组2的'\0';
2、字符串1必须足够大,可以容纳字符串2。
strlen 函数-测字符串长度的函数
strlen(字符数组)
它是测量字符串长度的函数。函数的值为字符串中的实际长度。
1 #include2 #include3 int main()
4 {
5 char str1[30]="china";
6 printf("%d\n",strlen(str1));
7 return 0;
8 }
注意:
1、strlen)返回的值比实际占用的长度要小,因为不包含'\0'
strcpy 字符串复制函数
strcpy(字符串1,字符串2)
作用是将字符串2复制到字符串1中。
1 #include2 #include3 int main()
4 {
5 char str1[30];
6 char str2[30]="china";
7 strcpy(str1,str2);
8 printf("%s\n",str1);
9 return 0;
10 }
注意:
1、字符数组1必须定义的足够大,以便容纳被复制的字符串2;
2、字符数组1必须写成数组名形式(如str1),字符串2可以使字符数组名,也可以是一个字符串常量。例如: strcpy(str1, "china");作用与前面的相同;
3、不能用赋值语句将一个字符串常量直接给一个字符数组。如下面两行是错误的:
str1="shiyanlou";
str1=str2;
strcmp 字符串比较函数
strcmp(字符串1,字符串2)
比较字符串1和字符串2
比较规则:
将两个字符串自左向右逐个字符比较(按照ASCIl码值大小比较),直到出现不同的字符或者遇到'\0'为止。
1 #include2 #include3 int main()
4 {
5 char str1[30]="Be";
6 char str2[30]="Be";
7 printf("%d\n",strcmp(str1,str2));
8 return 0;
9 }
注意:
1、如果全部字符相同,则认为两个字符串相同;
2、若出现不同的字符,则以第1对不相同的字符的比较结果为准。例如:"A"<"D","e">"E","these">"that","computer">"compare";
3、比较结果由函数值带回
字符串1=字符串2,则函数值为0
字符串1>字符串2,则函数值为一个正整数
字符串1<字符串2,则函数值为一个负整数
例题:任意键入3个字符串,编程找出最小的一个
1 #include2 #include3 int main()
4 {
5 char string[30];
6 char ch[3][30];
7 int i;
8 for(i=0;i<3;i++){
9 gets(ch[i]);
10 }
11 strcpy(string,ch[0]);
12 for(i=1;i<3;i++){
13 if(strcmp(ch[i],string)<0)
14 strcpy(string,ch[i]);
15 }
16 printf("%s\n",string);
17 return 0;
18 }
这里要注意的是,我们定义的ch[1]、ch[2]、ch[3]都只有30个字符大小, gets()函数还会自动补'\0',因此我们每行的输入不要超过29个字符。
模块化程序设计
函数的定义
c语言要求,在程序中用到的所有函数,必须"先定义,后使用"。例如想用max求两个数的大值。必须先按规范对它进行定义,指定他的名字、函数返回类型、函数实现的功能以及参数的个数和类型,将这些信息通知给编译系统。这样程序执行max函数的时,编译系统就会按照定义时所指定的功能去执行。如果事先不定义,编译系统是无从知晓max是什么,要实现什么功能的。
定义无参函数:
一般形式为:
定义有参函数:
一般形式为:
例题:求两个数大值
1 #include2 int main()
3 {
4 int max(int x,int y);
5 int a,b;
6 scanf("%d%d",&a,&b);
7 printf("%d\n",max(a,b));
8 return 0;
9 }
10 int max(int a,int b){
11 int z;
12 z=(a>b)?a:b;
13 return z;
14 }
在C语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type是关键字void。
函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
函数主体:函数主体包含一组定义函数执行任务的语句。
函数声明
在函数声明中,参数的名称并不重要,只有参数的类型是必需的
int max(int a,int a);
当在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,您应该在调用函数的文件顶部声明函数。
调用函数
创建C函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。
一、函数的嵌套调用
C语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能定义另一个函数,也就是不能嵌套定义,但是可以嵌套调用函数,也就是说,在调用一个函数的过程中,又可以调用另一个函数。
例题:输入四个整数,找出其中大的整数。
1 #include2 int main()
3 {
4 int max4(int a,int b,int c,int d);
5 int a,b,c,d;
6 int max;
7 scanf("%d%d%d%d",&a,&b,&c,&d);
8 max=max4(a,b,c,d);
9 printf("%d\n",max);
10 return 0;
11 }
12 int max4(int a,int b,int c,int d){
13 int max2(int a,int b);
14 int m;
15 m=max2(a,b);
16 m=max2(m,c);
17 m=max2(m,d);
18 return m;
19 }
20 int max2(int a,int b){
21 if(a>=b){
22 return a;
23 }else{
24 return b;
25 }
26 }
本题目我们就是使用函数嵌套的方法来处理。在main函数中调用max4函数,max4函数的作用是找出4个数中的大值。在max4中调用max2函数,max2是用来找出两个数中的大值,max4多次调用max2函数来达到找出4个数中大值的目的。
二、函数的递归调用
递归调用:在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。
例题:用递归方法求n的阶乘
1 #include2 int fun(int n){
3 if(n<=1){
4 return 1;
5 }
6 return n*fun(n-1);
7 }
8 int main()
9 {
10 int n;
11 scanf("%d",&n);
12 int ret;
13 ret=fun(n);
14 printf("%d!=%d\n",n,ret);
15 return 0;
16 }
斐波那契数列F (0)=0,F (1)=1, F (n)=F (n - 1)+F (n - 2)(n ≥ 2,n ∈ N*)
1、1、2、3、5、8、13、21、34、、、、、、、、、、
F(3)
F(2)+F(1)=1
F(1)+F(0)=1+0
1+0+1=3=F(3)
1 #include2 int fi(int i){
3 if(i==0){
4 return 0;
5 }
6 if(i==1){
7 return 1;
8 }
9 return fi(i-1)+fi(i-2);
10 }
11 int main()
12 {
13 int i;
14 scanf("%d",&i);
15 printf("%d\n",fi(i));
16 return 0;
17 }
汉诺塔问题1 #include2 char move(char a,char b){
3 printf("%c->%c\n",a,b);
4 }
5 void han(int n,char a,char b,char c){
6 if(n<=0){
7 return;
8 }
9 han(n-1,a,c,b);
10 move(a,c);
11 han(n-1,b,a,c);
12 }
13 int main()
14 {
15 int n;
16 char a,b,c;
17 scanf("%d",&n);
18 han(n,'a','b','c');
19 return 0;
20 }
什么时候用递归
1、一个问题可以分解成相同解决思路的子问题,即调用同一个函数
2、终止条件
怎么用递归
- 定义一个明确功能的函数,问题和子问题之间的规律
- 递推公式
- 递推公式用代码表达出来
- 优化
数组元素可以作为函数实参,不能作为函数形参。
因为形参是在函数被调用时临时分配的存储单元,不可能作为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)。在用数组元素作为函数实参时,把实参的值传给形参,是“值传递”的方式。
例题:输入10个数,要求输出其中值大的元素和该数是第几个数。
1 #include2 int max(int a[],int x){
3 int m=0,n,i;
4 for(i=1,m=a[0];i<10;i++){
5 if(m
除了可以用数组元素作为函数的参数外,还可以用数组名做函数参数(包括实参和形参)。
应当注意的是:用数组元素作为实参时,向形参变量传递的是数组所对应数组元素的值,而用数组名做函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址
例题:输入4位数字,要求输出这4个数字字符,每两个数字间空一个空格。
1 #include2 #include3 void insert(char str[]){
4 for(int i=strlen(str);i>0;i--){
5 str[2*i]=str[i];
6 str[2*i-1]=' ';
7 }
8 printf("%s\n",str);
9 }
10 int main()
11 {
12 char str[40];
13 scanf("%s",str);
14 insert(str);
15 return 0;
16 }
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页标题:第二周学习总结-创新互联
网页路径:http://cdiso.cn/article/cdgpgi.html