C语言学习(5)
一、C语言中的二维数组
1. 一维数组
int a[10]; 一维数组
int a[5][6]; 二维数组
肤浅的认识: 当成数学中的矩阵理解,行和列
char b[5][20]; 二维数组
2. 二维数组在计算机中的存储
跟一维数组一样,也是线性存放的,一个元素挨着一个元素(没有行列说法)
3. 二维数组的初始化和使用
认真理解并记住例子程序中所有的写法
举例: int的二维数组和char类型的二维数组
#include <stdio.h> int main() { int i, j; //新的初始化数组的写法 //int a[]={45,56,79}; //正确,这种写法仅限于定义数组的时候立马初始化 /* int a[]; 错误 a[0]=78; a[1]=96; */ //定义二维数组 int n = 88; //第一种:定义数组并立马部分初始化(定义数组立马赋值) //a[0][0]--a[0][1] --------a[3][2] //int a[4][3]={15,12,96}; //这个二维数组最多存放12个int //第二种:花括号嵌套花括号。里面的花括号代表一行数据 //int a[4][3]={{15,12},96}; //第0行 15 12 */ //语法错误,花括号的嵌套,花括号只能从左到右连续 //还要求从第一组数据开始全部都要有花括号 /* int a[4][3]={{3,15},12,96}; //a[0][0] -->3 //int a[4][3]={{3,15},{12},96}; //int a[4][3]={{3,15},12,{96}}; //错误,花括号不连续 //int a[4][3]={3,15,{12},{96}}; //错误,最前面的没有加花括号 for(i=0; i<4; i++) { for(j=0; j<3; j++) printf("a[%d][%d] is:%d\n",i,j,a[i][j]); } */ //第三种: //int a[][]={45,96,854}; //错误,编译器无法确定行和列的数量 //int a[4][]={55,956,855}; //错误 //int a[][3]={852,98546,5512}; //正确 //第四种:考察一下逗号表达式的用法 //int a[4][3]={(45,96,n),96,78}; //{88,96,78} //第五种:通过两个下标去访问二维数组成员赋值 /*int a[4][3]; //没有初始化,里面放的是随机数 a[1][2] = 85; a[0][2] = 96;*/ //第六种:键盘输入数据依次赋值 int a[4][3]; for (i = 0; i < 4; i++) { for (j = 0; j < 3; j++) scanf("%d", &a[i][j]); } }
char类型的二维数组主要用于存放多个字符串
#include <stdio.h> #include <string.h> int main() { int i; //定义char类型的二维数组 //5--》最多存放5个字符串 //10 --》每个字符串实际长度最多不能超过10个字节 /* char a[5][10]={"hello","world","gec"}; //char b[10]; 只能存放一个字符串 //第一个字符串越界了 char a[5][10]={"helloworldgechaha","world","gec"}; char a[5][10]={'h','e','k'}; char a[5][10]={{'h','e'},{'p'},98}; char a[][10]={"hello","中国"}; char a[5][10]; a[0][1]='@'; */ /* char a[5][10]; //int a[5][10] strcpy(a[0],"world1"); strcpy(a[1],"world2"); strcpy(a[2],"world3"); strcpy(a[3],"world4"); strcpy(a[4],"world5"); */ char a[5][10]; for (i = 0; i < 5; i++) scanf("%s", a[i]); //a[i]就是指针 /* for(i=0; i<5; i++) { for(j=0; j<10; j++) scanf("%c",&a[i][j]); } */ for (i = 0; i < 5; i++) printf("%s\n", a[i]); }
练习:
1. 定义int a[4][4]的数组,从键盘输入数据初始化这个数组,将这个数组中的数据以斜线作为对称轴互换
#include <stdio.h> int main() { int i, j; int temp; //定义二维数组 int a[4][4]; printf("请输入16个整数!\n"); for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) scanf("%d", &a[i][j]); } //打印一下原本的数据 printf("===================\n"); for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) printf("%-5d", a[i][j]); //换行 printf("\n"); } //对称的位置互换 for (i = 0; i < 4; i++) { for (j = i; j < 4; j++) { //a[i][j]和a[j][i]互换 temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } } printf("===================\n"); //打印一下交换之后的数据 for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) printf("%-5d", a[i][j]); //换行 printf("\n"); } }
2. 用char类型二维数组存放, 从键盘中任意输入5个字符串,要求统计每个字符串中小写
字母的个数,并且按照小写字母的个数从小到大排序(中等难度)
a[0] heAJFD 2
a[1] helllo 6 strcpy()
a[2] HEHhhfd 4
#include <stdio.h> #include <string.h> int main() { int i, j; //定义二维数组存放5个字符串 char buf[5][20] = {0}; char buf1[20] = {0}; //定义int数组统计五个字符串中小写字母个数 int count[5] = {0}; int temp; printf("请输入五个字符串!\n"); for (i = 0; i < 5; i++) scanf("%s", buf[i]); //统计一下每个字符串中小写字母的个数 for (j = 0; j < 5; j++) { for (i = 0; i < strlen(buf[j]); i++) { //统计小写字母 if (buf[j][i] >= 'a' && buf[j][i] <= 'z') count[j] = count[j] + 1; } } printf("=======================\n"); //根据字符串小写字母的个数依次排序 for (i = 0; i < 4; i++) //0-1234 1-234 2-34 3-4 { for (j = i + 1; j < 5; j++) { if (count[i] > count[j]) { //交换小写字母个数的排序 temp = count[i]; count[i] = count[j]; count[j] = temp; //交换字符串 strcpy(buf1, buf[i]); strcpy(buf[i], buf[j]); strcpy(buf[j], buf1); } //清空数组 memset(buf1, 0, sizeof(buf1)); } } //依据小写字母个数排序 for (j = 0; j < 5; j++) { printf("count[%d] is:%d ", j, count[j]); printf("%s\n", buf[j]); } //对count数组排序--》很简单 }
3. char类型的二维数组,保存5个字符串,要求把每个字符串中的小写字母转换成大写字母保存
#include <stdio.h> #include <string.h> int main() { int i, j; //定义二维数组存放5个字符串 char buf[5][20] = {0}; printf("请输入五个字符串!\n"); for (i = 0; i < 5; i++) scanf("%s", buf[i]); //将每个字符串中小写字母转换为大写字母 for (j = 0; j < 5; j++) { for (i = 0; i < strlen(buf[j]); i++) { //统计小写字母 if (buf[j][i] >= 'a' && buf[j][i] <= 'z') buf[j][i] = buf[j][i] - 32; //小写字母与大写字母相差32 } //例如a为97而A为65,以此类推 } printf("=======================\n"); //分界线 for (j = 0; j < 5; j++) { printf("%s\n", buf[j]); } }
作业:
1. 简单
写一个程序将一个字符串循环右移n位
例如:字符串abcdef 循环右移2位是 efabcd
#include <stdio.h> #include <string.h> /* *写一个程序将一个字符串循环右移n位 *例如:字符串abcdef 循环右移2位是 efabc */ int main() { int a, k; char input[100] = {0}; char String[100] = {0}; printf("请输入一个字符串:\n"); scanf("%s", input); printf("请问想将字符串循环右移几位:\n"); scanf("%d", &a); while (a > strlen(input)) { printf("你输入的数字大于该字符\n"); printf("请重新输入\n"); scanf("%d", &a); } strncpy(String, input, strlen(input) - a); //先将剩余部分取出来 for (k = 0; k <= a; k++) //将字符串右移位数 { input[k] = input[strlen(input) - a + k]; //将结束符移至右移字符后面 } //例如:abcdef //右移2位 //ef\0-->最终input[100]={"ef\0def"} //但是打印以结束符为标准 strcat(input, String); //再拼接在一起 printf("The String is:%s\n", input); return 0; }
2. 动脑筋
计算字符串中最大连续相同的字符个数。例如,若为"aaabbbb",打印最大连续字符是b,个数是4 ;若字符串为 "abcde"
打印最大连续字符是1
"aaabccdccccfdddddddd"
#include <stdio.h> #include <string.h> /* * 计算字符串中最大连续相同的字符个数。 * 例如,若为"aaabbbb",打印最大连续字符是b,个数是4 ; * 若字符串为 "abcde",打印最大连续字符是1 * "aaabccdccccfdddddddd" */ int main() { int i, count = 0, cup = 0; char String = {0}; char input[100] = {0}; printf("请输入一段带有连续字符的字符串:\n"); scanf("%s", input); for (i = 0; i < strlen(input); i++) { if (input[i] == input[i + 1]) //判断前后字符是否相同 { count++; //计数器 } else //不相同 { count++; //以上个字符与下个字符不相同,但需要加上这个字符 if (cup <= count) { cup = count; //保存到这个最大的值 String = input[i]; //保存这个字符 } count = 0; //清空这个计数器 } } printf("THE Max Num is %d! This %c\n", cup, String); return 0; }
3.输入字符串,分别统计出其中英文字母、空格、数字和其它字符的个数。
#include <stdio.h> #include <string.h> int main() { int i; int letter = 0, space = 0, num = 0, other = 0; char input[50] = {0}; printf("Please enter 1 string:\n"); gets(input); //输入带空格符的字符串 //之所以不用scanf();是因为输入带空格的字符串时,遇到空格则就结束输入 for (i = 0; i < strlen(input); i++) //逐个判断进行划分 { if (input[i] >= 'A' && input[i] <= 'z') //判断字母 { letter++; continue; //使用continue是因为这个已经判断完成了,不用再往下逐个判断,加快速度 } else if (input[i] == 32) //判断空格 { space++; continue; } else if (input[i] >= '0' && input[i] <= '9') //判断数字 { num++; continue; } else //其他字符 { other++; continue; } } printf("Letter: %d,Space: %d,Num: %d,Other: %d", letter, space, num, other); return 0; }