c编程入门day05

思维导图:

冒泡排序:

举例:

int a[5]={5,4,3,2,1};

5个数,比较4轮

第一轮:

        45321

        43521

        43251

        43215

第二轮

        34215

        32415

        32145

 第三轮

        23145

        21345

第四轮

        12345

冒泡排序代码:

#include<stdio.h>

// 定义常量N为5
#define N 5

int main(){   
    // 声明并初始化长度为N的整型数组a,初始值全部为0
    int a[N]={};
    
    // 提示用户输入数字
    printf("输入数字(空格隔开数字):");
    
    // 循环读取用户输入的数字存入数组a中
    for(int i=0;i<N;i++){
        scanf("%d",&a[i]);
    }
    
    // 冒泡排序算法     
    for(int i=0;i<N-1;i++){
        for(int j=0;j<N-1-i;j++){
            // 如果前一个元素大于后一个元素,则交换它们的位置
            if(a[j]>a[j+1]){
                int t=0;
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    
    // 输出排序后的数字
    printf("输出数字:");
    for(int i=0;i<N;i++){
        printf("%d ",a[i]);
    }  
    
    // 输出换行符并结束程序
    printf("\n");
    return 0;
}   

选择排序:

选择排序代码:

#include<stdio.h>

// 定义常量N为数组长度
#define N 5

int main(){   
    // 声明并初始化长度为N的整型数组a
    int a[N]={};
    
    // 提示用户输入数字
    printf("输入数字(空格隔开数字):");
    
    // 循环读取用户输入的数字存入数组a中
    for(int i=0;i<N;i++){
        scanf("%d",&a[i]);
    }
    
    // 选择排序算法
    int min;    
    for(int i=0;i<N-1;i++){
        min=i;
        // 找出未排序部分中的最小值的索引
        for(int j=i+1;j<N;j++){
            if(a[min]>a[j]){
                min=j;
            }
        }
        // 如果最小值的索引不等于当前索引i,则交换两个位置的值
        if(i!=min){
            int t=a[i];
            a[i]=a[min];
            a[min]=t;
        }
    }
    
    // 输出排序后的数字
    printf("输出数字:");
    for(int i=0;i<N;i++){
        printf("%d ",a[i]);
    }  
    
    printf("\n");
    return 0;
}   

二维数组:

格式
存储类型
数据类型
数组名[行数][列数]
int
a[ 2 ] [ 3 ] ;

访问

#include<stdio.h>
int main(){
int a[2][3]={1,2,3,4,5,6};
printf("%d %d\n",a[0][0],a[1][2]);
//索引从0开始
    return 0;
}

元素:

a[0][0]

a[0][1]

a[0][2]

a[1][0]

a[1][1]

a[1][2]

int a[2][3]={{1,2,3},{4,5,6}}; //进行赋值

int a[][3]={1,2,3,4,5,6}; //可以省略行数

int a[2][]={1,2,3,4,5,6}; //错误

练习:

D越界了

行数*列数=元素个数

行数*列数*sizeof(数据类型)=空间大小

数组名也是二维数组首行地址

#include<stdio.h>
int main(){
int a[2][3]={1,2,3,4,5,6};
printf("%p %p\n",a,&a[0][0]);
printf("%p %p\n",a+1,&a[1][0]);
    return 0;
}

a:第一行首地址

a+1:第二行首地址

初始化

  • 全部初始化

int a[2][3]={1,2,3,4,5,6};

int a[2][3]={{1,2,3},{4,5,6}};

  • 部分初始化 未初始化部分0

int a[2][3]={1,2};

int a[2][3]={{1,2},{4}}; //赋值 1 2 0 4 0 0

int a[2][3]={};

  • 初始化 随机值

int a[2][3]

a[0][0]=9;

a[0][1]=5;

循环遍历

int a[2][3]={1,2,3,4,5,6};
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
        {
            printf("%d\n",a[i][j]);
        }
    }

练习:求一个3*4的二维数组中最大值,及位置

分析

  1. 定义二维数组
  2. 循环遍历获取每一个元素
  3. 定义int max=a[0][0]分别a[i][j]进行比较遇到更大值max重新赋值索引
  4. 打印 下标+1下标+1
    #include<stdio.h>
    #define N 3
    #define M 4
    int main(){
        int a[N][M]={};
        //输入
        printf("输入数字(空格隔开数字):\n");
        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                scanf("%d",&a[i][j]);
            }      
        }
        //找最大值
         int max=a[0][0];
         int maxi=0,maxj=0;
         for(int i=0;i<N;i++){
            for(int j=0;j<M;j++){
                if(a[i][j]>max){
                    max=a[i][j];
                    maxi=i;
                    maxj=j;
                }
            }                         
        }
        printf("最大值a[%d] [%d]= %d",maxi,maxj,max);
        return 0;
    }
    

练习:

1、若有以下说明语句:int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};char c=’a’,d,g;则数值为4的表达式是()。

A)a[g-c] B)a[4] C)a[‘d’-‘c’] D)a[‘d’-c]

d和g的值没有给出,'a'的ASCII码值为97,a[100-97]=a[3]=4,C选项a[1]=2

2、假设int型变量占两个字节的存储单元,若有定义:int x[10]={0,2,4};则数组x在内存中所占字节数为()。

A)40 B)6 C)12 D)20

int=2字节,10个元素,10*2=20

3、下列合法的数组定义是()。

A)int a[]=”string”; B)int a[5]={0,1,2,3,4,5};

C)char a=”string”; D)char a[]={0,1,2,3,4,5};

A是字符串,不能用int定义,B越界,Cchar a是单个字符,D0,1......可以以字符ASCII的形式在char a[] 输出

4、若给出定义:char x[]=”abcdefg”;char y[]={‘a’,’b’,’c’,’d’,’e’,’f’,’g’};则正确的叙述为()。

A)数组x和数组y等价 B)数组x和数组y的长度相同

C)数组x的长度大于数组y的长度    D)数组y的长度大于数组x的长度

字符串多一个结束符号'\0'

5、下列程序运行后的输出结果是()。

#include<stdio.h>

int main()

{

int n[3],t,j,k;

for(t=0;t<3;t++)

n[t]=0;

    k=2;

    for(t=0;t<k;t++)

for(j=0;j<3;j++)

n[j]=n[t]+1;

printf("%d\n",n[1]);

}

A)2  B)1 C)0 D)3

1. 数组n初始化为{0, 0, 0}。
2. 变量k初始化为2。
3. 进入第一个for循环,t=0:
   - 进入第二个for循环,t=0:
     - 进入第三个for循环,j=0:n[0] = n[0]+1 = 0+1 = 1
     - 进入第三个for循环,j=1:n[1] = n[0]+1 = 1+1 = 2
     - 进入第三个for循环,j=2:n[2] = n[0]+1 = 1+1 = 2
   - 结束第二个for循环。
4. 进入第一个for循环,t=1:
   - 进入第二个for循环,t=1:
     - 进入第三个for循环,j=0:n[0] = n[1]+1 = 2+1 = 3
     - 进入第三个for循环,j=1:n[1] = n[1]+1 = 2+1 = 3
     - 进入第三个for循环,j=2:n[2] = n[1]+1 = 2+1 = 3
   - 结束第二个for循环。
5. 输出n[1]的值,即3。

因此,最终输出的结果为3。

内存分配

int a[2][3]={1,2,3,4,5,6};

地址

元素

a[0]

a

&a[0][0]

1

a[0][0]

a[0]+1

&a[0][1]

2

a[0][1]

a[0]+2

3

a[1]

a+1

4

a[1]+1

5

6

#include<stdio.h>
int main(){
int a[2][3]={1,2,3,4,5,6};
printf("%p %p\n",a,a[0]);
printf("%p %p\n",a+1,a[0]+1);
    return 0;
}
//a和a[0]打印的值一样,本质不一样
//a+1是加行,a[0]是加列
地址是16进制加减

指针

本质:地址

一级指针

一级指针变量名:存储普通变量的地址

格式存储类型数据类型*指针变量名
int*p

int a=5;

int *p=&a;

char b='q';

char *p1=&b;

访问

 

#include<stdio.h>
int main(){
int a=5;
int *p=&a;
printf("%d %d\n",a,*p);
printf("%p %p\n",p,&a);
return 0;
}

指针操作符:

*地址里边内容

&取地址:变量地址

*&a:===a

&*a:错误

初始化

指针使用前先定义同时初始化初始化指针变量不能随便使用产生指针

 1)int a=5;

  int *p=&a; //定义指针同时直接初始化

2)int *p=NULL; //定义一个指针后边可以重新赋值

指针p指向变量a,*p可以访问a

可以通过*p间接修改变量a

 
#include<stdio.h>
int main(){
int a=5;
int *p=&a;
*p=99;//修改*p修改变量a的值
printf("%d %d\n",a,*p);
printf("%p %p\n",p,&a);
return 0;
}
  • 数组首地址赋值给指针变量
#include<stdio.h>
int main(){
int a[5]={2,3,4,5,6};
int *p=a;
printf("%d",*p);
return 0;
}

 

#include<stdio.h>
int main(){
char c[]="hello";
char *p=c;
printf("%c\n",*p);
return 0;
}

课后作业:

作业

  1. 整理笔记

6、有以下程序,执行后输出结果是()。

#include<stdio.h>

int main()

int p[7]={11,13,14,15,16,17,18}, i=0,k=0;

while(i<7 && p[i]%2) 

k =k+ p[i];                    

i++; 

}

printf("%d\n", k); 

}

A)58 B)56 C)45 D)24

7、有以下程序,执行后输出结果是()。

#include<stdio.h>

int main()

int m[][3]={1,4,7,2,5,8,3,6,9};

int i,j,k=2;

for(i=0; i<3; i++)

printf("%d ",m[k][i]); 

}

}

A)4 5 6 B)2 5 8 C)3 6 9         D)7 8 9

8、以下能正确定义一维数组的选项是()。

A)int num[];                 B) #define N 100 

int num[N];

C)int num[0..100];            D) int N=100;

int num[N];

9、有以下程序,执行后输出结果是()。

#include<stdio.h>

int main( )

{  

char a[]="abcdefg",b[10]="abcdefg";

    printf("%d  %d\n",sizeof(a),sizeof(b));

A)7  10 B)8 8 C)8 10 D)10 10

10、若有以下定义语句:char s[10];s=”abcd”;printf(“%s\n”,s);则运行结果是()。

A)输出abcd        B)输出a           C)输出ab cd        D)编译不通过

11、不能把字符串“Hello!”赋给数组b的语句是()。

A)char b[10]={‘H’,’e’,’l’,’l’,’o’,’!’};

B)char b[10];b=”Hello!”;

C)char b[10]; strcpy(b,”Hello!”);            

D)char b[10]=”Hello!”;

12、若有以下程序段,该程序段的输出结果是()。

char str[]=“ab\n\012\\\””;

printf(“%d”,strlen(str));

A)3               B)4               C)6              D)12

13、下列程序的输出结果是()。

 #include <stdio.h> 

main()

{

char ch[7]={"65ab21"};

int j,s=0;

for(j=0;ch[j]>='0'&&ch[j]<='9';j+=2)

s=10*s+ch[j]-'0';

printf("%d\n",s);

}

A)12ba56         B)66521       C)6         D)62

14、设已定义char a[10]和 int j,则下面输入函数调用中错误的是()。

A)scanf(“%s”,a);                B)for(j=0;j<9;j++) scanf(“%c”,a[j]);

C)gets(a);                       D)for(j=0;j<9;j++) scanf(“%c”,&a[j]);

15、设已定义char x[8]和int j,为了给该数组赋值,下面语句中正确的是()。

A)x[8]=”Turbo C”;               B)x=” Turbo C”;

C)x[]=”Turbo C”;                D)for(j=0;j<7;j++) x[j]=getchar();

16、有如下程序,该程序的输出结果是()。

#include <stdio.h> 

main()

{

int n[5]={0,0,0},j,k=2;

for(j=0;j<k;j++) 

n[j]=n[j]+1;

printf("%d\n",n[k]);

}

A)不确定的值 B)2 C)1 D)0

17.写出下列成绩的输出结果:————————

#include <stdio.h>

void main()

{

    int m[] = {1,2,3,4,5,6,7,8,9},i,j,k;

    for(i=0;i<4;i++)

    {

        k=m[i];

        m[i]=m[8-i];

        m[8-i]=k;

        for(j=o;j<9;j++)

            printf("%d", m[j]);

        putchar('\n');

    }

}

18.有数组定义 int niNumberA[100]; 以下叙述不正确的是  )(山大华天)

A. 数组 niNumberA 有100个元素

B. 数组 niNumberA 的最后一个元素是 niNumberA[100]

C. 数组 niNumberA 的第一个元素 *niNumberA

D. 数组 niNumberA 的字节数是 sizeof(int)*100

19.以下不能对二维数组 a 进行正确初始化的语句是 ( )。请在正确的下面写出数组和值。(山大华天)

A. int A[2][3] = {0};

B. int B[][3] = {{0, 1}, {0}};

C. int C[2][3] = {{0, 1}, {2, 3}, {4, 5}};

D int D[][3] = {0, 1, 2, 3, 4, 5};

如果有时间可以思考一下

int a[5]={2,3,4,5,6};

int *p=a;      // p++ p+1区别

答案跳转:day05课后练习-CSDN博客

  • 30
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值