C语言基础 for循环、goto、数组、二维数组 4.3

4.3

复习

控制语句


    if···else
    一般形式:
    if(表达式)
{
    语句块;
}
···
    else
    {
        语句块;
    }
执行过程:如果表达式为真则执行语块1,否则向下判断表达式2,如果为真则执行表达式2···如果都不满足以上所有表达式则执行else
    
switch···case
    一般形式:
    switch(表达式)
{
    case 常量表达式:
        break;
        ···
        default//和else相同
        break//最后一句的break可以不加
}
执行过程:
    表达式的结果和常量表达式从上往下匹配,结果相同则执行对应的语句块
    while(表达式)
    {
        循环体;
    }
执行过程先判断表达式是否为真,为真则执行一次循环体,为假则退出循环,每执行完一次表达式再再次判断循环体。
    死循环:
    while(1);
do
{
    循环体;
} while(表达式);
/* do-while语句:  1.while后面表达式的分号不能省略。
                  2.while后面的表达式一定要为假。

today

循环结构

for

一般形式:
    for(表达式1;表达式2;表达式3)
    {
        语句块;
    }
执行顺序:执行表达式1(只执行一次),判断表达式2是否进入循坏,如果满足,结果为真则执行循环体,执行完一次循坏体后执行表达式3,再次判断表达式2 结果···
    一些在模块里边定义的只能在模块内部使用
    练习:打印菱形
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{ 
    int i,k,n,m=0;
while(1)
{
    for(i=0;i<7;i++)
    {
        for(k=0;k<6-i+m;k++)
        {
            printf(" ");
        }
            for (n=0;n<2*i-1;n++)
            {
                printf("*");
            }
            puts(" ");
        
    }
    for(i=1;i<6;i++) 
    {
        for(k=0;k<i+m;k++)
        {
            printf(" ");
        }
        for(n=0;n<11-2*i;n++)
        {
            printf("*");
        }
        puts(" ");
    }
    m++;
    if(m>20)
    m=0;
    usleep(60000);
    system("clear");
}
    return 0;
} 

goto

while(1)
{
    while(1)
    {
        while(1)
        {
            break;
            goto A;
        }
        printf("1\n");
    }
}
A: printf("2\n");
跳转到对应符号位置

数组

数组的定义

数组:存储大量同类型数据,是一片连续的空间
存储类型 数据类型 数组名[元素个数]
存储类型:auto register extern static
    数据类型:char int float··
    数组名:遵循标识符的命名规则
    代表数组的首地址()
[]:数组运算符
    元素个数:数组能够存储的最大元素个数
    例:
    int a[5];

数组的赋值

使用数组中的某一个值:
    数组名[下标]:下标从0开始,最大能用到n-1.
    a[0]=6;  //代表给数组第一个元素赋值为6
只能一个元素进行使用,只有初始化时能整体赋值
完全初始化
int a[5]={5,4,3,6,7}; //只能在初始化时给每个数据赋值  
未完全初始化:
    int a[10]={346}//后面7个数据全是0
    int a[]={4,52,6,6}; //初始化时开辟四个空间(缺省初始化)
	int a[10]={0};     //所有内容全为0
只定义不初始化所有值是随机数
    
    两个数据异或等于就会交换数据:
      /*   a[j]^=a[j+1];
    	  a[j+1]^=a[j];
		  a[j]^=a[j+1]; */
冒泡排序:
#include <stdio.h>

int main(int argc, char *argv[])
{ 
    int a[10]={12,43,34,54,65,76,23,14,57,67};
    int i,j,m;
    for (i=0;i<10;i++)
    {
        for(j=0;j<9;j++)
        {
            if(a[j]>a[j+1])
                {
                   m=a[j+1];
                   a[j+1]=a[j];
                   a[j]=m;
                }
                
        }
    }
    
        for(i=0;i<10;i++)
        printf("%d\n",a[i]);
    return 0;
} 

/* int a[10];
 14     srand(NULL);
 15     for(i=0;i<10;i++)
 16     {
 17         a[i]=rand()%100; //0~99;
 18     }  */     随机数排序
     
    

二维数组

定义

内存中没有二维数组这种东西,只是抽象的想象成为二维,存储方式还是一维。

存储类型 数据类型 数组名[][]
int a[2][4] // 行优先:先存行,再存列
    最大存储个数:行*列
例:
    int a[2][3];

赋值

使用方式:
    数组名[行下标][列下标]
    例:
    int a[2][3];
a[0][1];

初始化

完全初始化:
    int a[2][3]={4,5,6,7,8,9};
    int a[2][3]={{4,5,6},{7,8,9}};
未完全初始化:
    int a[2][3]={6,4,8};//未赋值的全为0
int a[][4]={2,68,9,3,7,6}//只能缺行,不能缺列
int a[2][3]={{4,5},{}}

printf("%p\n",a);	//数组首地址
	printf("%p\n",&a[0][0]);//数组首地址
	printf("%p\n",a[1]);	//a[1][0]的地址
	printf("%p\n",&a[1][0]);
	printf("%d\n",a[0][0]); //0行0列的元素
	printf("%d\n",a[0][2]); //0行2列的元素,未完全初始化为0
	printf("%d\n",a[1][0]); //1行0列的元素
*************************************

练习:实现一个二维数组的转置a[i][j]-->b[j][i]
    #include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{ 
    int a[2][4],b[4][2];
    int i,j;
    srand(time(NULL));
    for(i=0;i<2;i++)
    {
        for(j=0;j<4;j++)
        {
            a[i][j]=rand()%51;
        }
    }
    for(i=0;i<2;i++)
    {
        for(j=0;j<4;j++)
        {
            printf("%-3d",a[i][j]);
        }
        puts(" ");
    }
    printf("**************************");
        puts(" ");
    for(i=0;i<2;i++)
    {
        for(j=0;j<4;j++)
        {
            b[j][i]=a[i][j];
        }
    }
    for(i=0;i<4;i++)
    {
        for(j=0;j<2;j++)
        {
            printf("%-3d",b[i][j]);
        }
        puts(" ");
    }

    return 0;
} 

hqyj@ubuntu:~/4.3$ gcc 一维数组求最大值.c
hqyj@ubuntu:~/4.3$ ./a.out
7  35 36 34  
11 31 35 16  
************************** 
7  11  
35 31  
36 35  
34 16 
    找出三行五列二维数组最大数以及下标
    #include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{ 
    int a[3][5];
    int i,j,max;
    srand(time(NULL));
    for(i=0;i<3;i++)
    {
        for(j=0;j<5;j++)
        {
            a[i][j]=rand()%51;
        }
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<5;j++)
        {
            printf("%d ",a[i][j]);
        }
        puts(" ");
    }
    for(i=0;i<3;i++)
    {
        for(j=0;j<5;j++)
        {
            if(a[i][j]>max)
                max=a[i][j];
        }
    }
    printf("最大值为%d ,位置a[%d][%d]",max,i,j);
    puts(" ");
return 0;
} 
hqyj@ubuntu:~/4.3$ ./a.out
32 27 45 40 3  
40 13 17 24 46  
6 6 35 15 27  
最大值为46 ,位置a[3][5] 

练习:

打印十行杨辉三角:

#include <stdio.h>

int main(int argc, char *argv[])
{ 
    int a[10][10]={0};
    int i,j;//i为行数,j为列数
    for(i=0;i<10;i++)
    {
        a[i][0]=1;//第一列全为1
       for(j=0;j<=i;j++)
       {
           if(i==j)
            {
           a[i][j]=1;//三角斜边全为1
            }
           else
           {
               a[i][j]=a[i-1][j-1]+a[i-1][j];//三角里面的内容
           }
       printf("%d  ",a[i][j]);
       }
       puts(" ");
    }

    return 0;
} 
hqyj@ubuntu:~/4.3$ gcc homework.c
hqyj@ubuntu:~/4.3$ ./a.out
1   
1  1   
1  2  1   
1  3  3  1   
1  4  6  4  1   
1  5  10  10  5  1   
1  6  15  20  15  6  1   
1  7  21  35  35  21  7  1   
1  8  28  56  70  56  28  8  1   
1  9  36  84  126  126  84  36  9  1 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独memories

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值