数组
int a , b , c , d , e ,
数组:
什么是数组?
一组具有相同数据类型的 数组有序的集合
一维数组
二维数组
字符数组
数组属于构造类型 ,
什么是构造类型?
不能直接使用 , 需要我们自己定义
int , short char
char a;
这些是可以直接使用的
1、一维数组
定义语法:
类型说明符 数组名[整形表达式]
例如:
int a[10];
数组名:
a
数组名的命名规范:
int a rray[10]; 错
C语言的标识符的规定
数字、下划线、字母组成
数字不能开头
int a[10];
数据类型为 int , 数组容量为 10 一个数组名为a的数组
数组如何引用:
通过下标;
例如:
引用第一个元素:
a[0];
引用最后一个元素:
a[9];
数组为什么是一个有序的集合:
有序指的不是元素大小的有序
而是数组各个元素的存储地址的有序
一维数组的初始化特性:
int a[] = {1,2,3,4};
int a[10] = {1,2,3,4};
//初始化不完整的数据
//其余数据编译器默认为 0
练习:
手动输入一个容量为 6 的int 数据类型的数组
求出这个数字元素的最大值
并打印出来
//冒泡排序
#include<stdio.h>
int main(void )
{
int i,j,t;
int str[6] ;
for (int a = 0; a < 6; a++)
{
scanf("%d",&str[a]);
}
for(i=0;i<5;i++)
{
for(j=0;j<5-i;j++)
{
if(str[j]>str[j+1])
{
t=str[j];
str[j]=str[j+1];
str[j+1]=t;
}
}
}
printf("%d",str[5]);
}
int a[6] ;
int max = -(255255255*255) ; //int 占 4 个字节 , 一个字节 8 bit -255 ~ 255
for(int i = 0 ; i < 6 ; i++)
{
scanf("%d" , &a[i]);
}
for(int i = 0 ; i < 6; i++)
{
if(a[i] > max)
{
max = a[i];
}
}
printf(“max = %d\n” , max);
二维数组
假设
我要定义一个数组 int a[10];
保存一个同学十门科目的成绩
但是:
我们一个班有55为同学
如何去保存 55 位同学的10门科目的成绩
int a[10];
int b[10];
·········
很明显 , 效率很低
二维数组:
int a[55][10];
二维数组的定义语法:
数据类型 数组名[行大小][列大小]
例如:
int a[3][4];
按行进行保存的
int a[3][4] = {1 , 2 , 3, 4 ,5 ,6 ,7 ,8 ,9 , 10 ,11 , 12};
数学当中的矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
二维数组的引用:
例如:
引用第二行第二列的元素
是 a[2][2] 吗
并不是
应该是这样 a[1][1]; 才对
因为 数组下标是从 0 开始
a[3][3];//就会显示段错误
//非法访问
比较合适 ,容易能够分辨得出几行几列的初始化方法
int a[3][4] = { {1 , 2 , 3 , 4},{5 ,6 ,7 ,8},{9 , 10 , 11 ,12}};
练习:
初始化一个二维数组
手动输入二维数组的每一个元素
依次安装矩阵打印的方式打印出来
#include<stdio.h>
int main()
{
int i,j;
int a[3][3] = {
{
1,2,3,},{
4,5,6},{
7,8,9}};
// printf("输入六个数:");
for ( i = 0; i < 3; i++)
{
for ( j = 0; j < 3; j++)
{
printf("%2d",a[i][j]);
}
printf("\n");
}
}
字符数组(字符串)
字符数组和普通的数组有什么区别:
没什么区别,只是它保存的数据类型 是字符型 比如 ‘h’
定义:
例如:
char a[10];
定义并初始化:
例如:
char a[5] = {‘h’ , ‘e’ , ‘l’ , ‘l’ , ‘o’};
更方便的方式:
char a[] = “hello”;
---->>>>>> char a[5] = “hello”; 这是错误的初始化方式 , 因为它会不确定 ,
char * str = “hello”;
它保存我们的常量区 ,因为他就是一个常量
引用:
用下标
打印:
可以用循环
for()
{
}
但是::
我们都会用 “%s”
printf("%s" , 数组名 );
转义字符:
字符串在打印的过程中
是如何结束打印
‘\0’;
"%s"按照字符串的首地址依次进行向后打印
遇到‘\0’才结束打印
函数
问题的引入:
打印数组元素的循环
也会存在需要很多次去打印不同的不同容量的数组
意味着我们是不是要写很多个
for循环
for(int i = 0 ; i < n ; i ++)
{
打印数组
}
·················
················
···············
·················
上面的代码呢功能是一样的1 , 我们能不能只写一份
用的时候,再去 “调用”
#include <stdio.h>
int main()
{
printf(“hello world\n”);
}
函数
function 《- 功能
c语言中函数是指对完成某个特定功能的代码块的封装
封装 ???
把完成某个特定功能的代码 , 放在一个 {} 内
结构化程序设计者主张把一个大的任务分为多个函数去实现
比如:
我们实现一个项目
完成用户登录账号的大致分为以下几个功能
1、弹出界面
2、获取到用户输入的账号 , 密码
3、通过网络通信传输 后端服务端接受到 账号密码
4、对用户输入的信息进行查询 确认
5、对查询结果的处理
封装函数:
定义函数的语法:
函数返回值类型 函数名(形参的参数列表)
{
代码块;//完成该任务需要的代码
}
函数的返回值类型 , 只要是C语言中合法的类型即可
比如: int void float ·············
形参列表:
根据实际情况 , 形参列表可以为多个 , 也可以为 0 个
如果为多个 , 就用 , 进行隔开 ,
如果为0 个 , 就空着不写
(形参类型1 形参名1 , 形参类型2 形参名2 , ·············)
()
函数名:
符合C语言的标识符
见名思义
排序功能的函数 , sort --》 排序
打印数组功能的函数 , 函数名 : show_array 或者 printf_array
如何在定义函数中最后返回一个数据类型的值
return 表达式
函数的调用:
无返回值函数的调用:
函数名(实参(根据形参而定));
有返回值函数的调用:
函数返回值类型 变量名 = 函数名(实参(根据形参而定));
练习:
定义一个函数 , 通过形参的传入 , 实现两个整数之和 , 并返回
#include<stdio.h>
int main()
{
int i , j ,a;
scanf("%d%d",&i,&j);
a =sum(i,j);
printf("%d",a);
}
int sum(int a,int b){
return a + b;
}