数组
一维数组
1.1数组的排序
1.1.1冒泡排序
将较大或者较小的数据,经由交换后,慢慢“浮到”数组顶端,如同水中的气泡一样,故名冒泡排序 原理:不断进行相邻的两个数据进行比较,如果满足条件,则进行交换,每一轮都会将一个最值数据"浮到"对应位置 对于每一轮重复上述操作,直到所有数据排序结束
#include <stdio.h>
#define Max 10
int main(){
//数组的输入
int score[Max]={0};
for(int i=0;i<Max;i++){
printf("请输入第%d位成绩:",i+1);
scanf("%d",&score[i]);
}
//成绩排序-冒泡升序
for(int i=0;i<Max;i++){
for(int j=0;j<Max-i;j++){
if(score[j]>score[j+1]){
int score0=score[j];
score[j]=score[j+1];
score[j+1]=score0;
}
}
}
printf("成绩升序为");
for(int i=0;i<Max;i++){
printf("%d ",score[i]);
}
printf("\n");
}
1.1.2选择排序
将要排序的序列分为已排序序列和待排序序列 不断从待排序序列中找到最值,放入已排序序列的最后位置,随着待排序序列不断减少,已排序序列不断增长 直到待排序序列没有元素,排序结束
#include <stdio.h>
#define Max 10
int main(){
//数组的输入
int score[Max]={0};
for(int i=0;i<Max;i++){
printf("请输入第%d位成绩:",i+1);
scanf("%d",&score[i]);
}
//成绩排序-选择升序
for(int i=0;i<Max;i++){
int Mini=i;
for(int j=i+1;j<Max;j++){
if(score[Mini]>score[j]){
Mini=j;
}
}
int score0=score[i];
score[i]=score[Mini];
score[Mini]=score0;
}
printf("成绩升序为");
for(int i=0;i<Max;i++){
printf("%d ",score[i]);
}
printf("\n");
}
二维数组
2.1 引入目的
1.当写程序时,需要同时定义多个相同类型的一维数组时,可以选用二维数组来完成
2.所谓二维数组,就是多个一维数组的集合
3.二维数组也是变量的集合,是一个有行有列的容器
2.2 二位数组的概述
一维数组:数组名[行标]:表示下标为"行号"的那个一维数组的数组名
二维数组:数组名[行标][列标]:表示下标为 [行标][列标] 的一个变量
int arr[3][4];
arr[0][0]: 表示第一行第一列的一个变量
arr[0][0]、arr[0][1]、arr[0][2]、arr[0][3]
arr[1][0]、arr[1][1]、arr[1][2]、arr[1][3]
arr[2][0]、arr[2][1]、arr[2][2]、arr[2][3]
无论是行标还是列表,都是从0开始,到对应数据减1的位置
例如:int arr[M][N]; 行标范围:【0,M-1】 列标范围:【0,N-1】
2.3 二维数组初始化
1、按行初始化:定义数组时,每一个一维数组的值使用一个花括号括起来
int arr[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,9,9,9} };
2、按行部分初始化:每个一维数组中,可以不填满,没有初始化的部分用0补齐
int arr[3][4] = { {1,2}, {8}}; //1,2,0,0 8,0,0,0 0 ,0, 0, 0
3、按数组排列初始化:数组存储数据时,默认是按顺序存储,第一行存储满了,存第二行
int arr[3][4] = { 1,2,3,4,5,6,7,8, 9}; //1,2,3,4 5,6,7,8, 9,0,0,0
4、特殊初始化:定义二维数组并初始化时,可以不指定第一维的大小,由初始化总个数除以列数向上取整,得到行数
int arr[][4] = { 1,2,3,4,5,6}; // 1,2,3,4 5,6,0,0
5、注意:定义二维数组时,无论任何时候,第二维都不能省略
2.4二维数组的相关操作
2.4.1输入输出
#include<stdio.h>
int main(){
int arr[5][5]={0};
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
printf("请输入第%d行第%d列的元素",i,j);
scanf("%d",&arr[i][j]);
}
}
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
printf("%d\t",arr[i][j]);
}
printf("\n");
}
return 0;
}
2.4.2求和,均值,最值
1.整体求和就是将任意一个元素进行累加
2.求每一行的和:将每一行的数据进行累加,求出结果后,可以放入一个新数组
3.求整体最值:先将第一个当做最值,然后遍历所有的元素,进行比较,给定比较条件后,适当更新最值
4.
//练习使用二维数组生产输出杨辉三角
#include<stdio.h>
int main(){
int n=0;
printf("请输入杨辉三角的阶数");
scanf("%d",&n);
int arr[50][50]={0};
arr[0][0]=1;
for(int i=1;i<n;i++){
for(int j=0;j<n;j++){
if(j==0){
arr[i][j]=1;
}else{
arr[i][j]=arr[i-1][j]+arr[i-1][j-1];
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
printf("%d\t",arr[i][j]);
}
printf("\n");
}
return 0;
}
字符数组
3.1 一维字符数组
定义格式:char 数组名[常量]
3.2 字符数组的初始化
1、单字符处理字符数组 全部初始化:char arr[5] = {'h', 'e', 'l', 'l', 'o'};
部分初始化:char arr[5] = {'h', 'e', 'l'}; //没有初始化的部分用 0('\0') 补齐
特殊初始化:char arr[] = {'h', 'e', 'l', 'l', 'o'}; //此时字符数组的长度为 5
2、字符串的形式初始化 整体初始化:char arr[10] = {"hello"}; //或者 char arr[6] = "hello";
特殊字符串初始化: char arr[] = "ni hao"; //此时,数组的实际长度7 但是,字符串实际长度为6
3.3字符数组的输入输出
二维字符数组
作业
1.提示并输入一个字符串,统计该字符串中字母、数字、空格以及其他字符的个数
#include<stdio.h>
#include<string.h>
int main(){
char st1[20]="";
int spa=0,num=0,en=0;
printf("请输入一个字符串");
gets(st1);
for(int i=0;i<strlen(st1);i++){
if(st1[i] >= '0' && st1[i] <= '9'){
num++;
}else if((st1[i] >= 'a' && st1[i] <= 'z')||(st1[i] >= 'A' && st1[i] <= 'Z')){
en++;
}else if(st1[i] == ' '){
spa++;
}
}
printf("数字有%d个,字母有%d个,空格有%d个,其他字符有%d个\n",num,en,spa,strlen(st1)-num-en-spa);
return 0;
}
2、提示并输入一个字符串,求出该字符串中所有数字的总和
#include<stdio.h>
#include<string.h>
int main(){
char st1[20]="";
int spa=0,sum=0,en=0;
printf("请输入一个字符串");
gets(st1);
for(int i=0;i<strlen(st1);i++){
if(st1[i] >= '0' && st1[i] <= '9'){
sum+=st1[i]-48;
printf("%d\n",sum);
}
}
printf("数字有%d个,字母有个,空格有个,其他字符有个\n",sum);
return 0;
}
3、定义一个4*3的二维整形数组,完成对二维数组的输入、输出。并将该二维数组中每一行的最值放入到一个一维数组中,并对该一维数组进行升序排序后输出。
#include<stdio.h>
int main(){
int arr[4][3]={0};
int brr[6];
for(int i=0;i<4;i++){
for(int j=0;j<3;j++){
printf("请输入第%d行第%d列的数子",i+1,j+1);
scanf("%d",&arr[i][j]);
}
printf("\n");
}
//数组输出
for(int i=0;i<4;i++){
for(int j=0;j<3;j++){
printf("%d\t",arr[i][j]);
}
printf("\n");
}
//取最值
int n=0;
int max=0,min=0;
for(int i=0;i<4;i++){
max=arr[i][0];
min=arr[i][0];
for(int j=1;j<3;j++){
if(max<arr[i][j]){
max=arr[i][j];
}
if(min>arr[i][j]){
min=arr[i][j];
}
}
brr[n]=max;
n++;
brr[n]=min;
n++;
}
//排序
for(int i=0;i<7;i++){
for(int j=0;j<8-i;j++){
if(brr[j]>brr[j+1]){
int Max=brr[j];
brr[j]=brr[j+1];
brr[j+1]=Max;
}
}
}
//排序后输出
for(int i=0;i<8;i++){
printf("%d ",brr[i]);
}
}
4、提示并输入两个一维整形数组,求这两个数组的交集。
#include<stdio.h>
#include<string.h>
int main(){
char arr[20]="";
char brr[20]="";
char crr[20]="";
int k1=0,n=0;
printf("请输入两个数组\n");
scanf("%s %s",arr,brr);
for(int i=0;i<strlen(arr);i++){
for(int j=0;j<strlen(brr);j++){
if(arr[i]==brr[j]){
for(int k=0;k<strlen(crr)+1;k++){
k1=1;
if(arr[i]==crr[k]){
k1=0;
}
}
if(k1==1){
crr[n]=arr[i];
n++;
}
}
}
}
for(int i=0;i<n;i++){
printf("%d\t",crr[i]-48);
}
printf("\n");
return 0;
}
5、完成注册和登录功能:使用两个一维字符数组存储账户和密码
注册:完成对账号和密码的输入
登录:将登录账号
#include<stdio.h>
#include<string.h>
int main(){
char name[20]="";
char pastword[20]="";
while(1){
int n=0;
printf("注册请摁1,登录请摁2\n");
scanf("%d",&n);
getchar();
if(n==1){
printf("请输入注册账号和密码\n");
scanf("%s%s",name,pastword);
}else if(n==2){
char arr[20]="";
char brr[20]="";
printf("请输入账号和密码\n");
scanf("%s%s",arr,brr);
if(strcmp(name,arr)==0 && strcmp(pastword,brr)==0){
printf("登录成功\n");
return 0;
}else {
printf("登录失败\n");
}
}
}
}