思维导图:
冒泡排序:
举例:
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的二维数组中最大值,及位置
分析:
- 先定义二维数组
- 循环遍历,获取每一个元素
- 定义int max=a[0][0]分别和a[i][j]进行比较,当遇到更大值,对max重新赋值,索引。
- 打印, 行下标+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]是加列
指针
本质:地址
一级指针
一级指针变量名:存储普通变量的地址
格式 | 存储类型 | 数据类型 | *指针变量名 |
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;
}
课后作业:
作业:
- 整理笔记
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的区别