第二周学习总结-创新互联

数组

三元运算符:

成都创新互联公司成立与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、终止条件

怎么用递归

  1. 定义一个明确功能的函数,问题和子问题之间的规律
  2. 递推公式
  3. 递推公式用代码表达出来
  4. 优化
数组与函数

数组元素可以作为函数实参,不能作为函数形参。

因为形参是在函数被调用时临时分配的存储单元,不可能作为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)。在用数组元素作为函数实参时,把实参的值传给形参,是“值传递”的方式。
例题:输入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