笔记目录
第六章 数组
是一种数据类型
数组的概念
- 数组是一组有序数据的集合。
- 用数组的名称和下标来表示数组。例如:a[4],a就是数组名称,4表示数组的下标。
- 同一数组中的每一个元素数据类型必须相同。
定义和引用一维数组
定义:数据类型 数组名称[常量表达式];
// 2020/11/08
// C
#include <stdio.h>
int main() {
//定义一个10个空间的数组,每个数组元素为int类型
int a[10];
// int--->表示数组中的每一个元素都是int类型。
// a--->数组名称(表示数组首元素的内存地址)。
// 10--->表示数组中一共有10个元素。
// 会在内存中开辟连续的10个内存空间,来存放int类型的元素值,每个元素占4个字节。
// 引用数组
a[0] = 100;
// 数组的下标是从0开始的,9结束。
// 0表示下标。标号
a[1] = 10;
for (int i = 0; i <= 9; i++) {
printf("%d\t", a[i]);
}
printf("\n");
printf("%d\n",a);
printf("%d\n",a+1);
printf("%d\n",a+2);
return 0;
}
一维数组的初始化
// 2020/11/08
// C
#include <stdio.h>
int main() {
int a[10]={1,2,3,4,5,6,7,8,9,10};
for(int i=0;i<=9;i++){
printf("%d\t",a[i]);
}
printf("\n");
int b[10]={1,2,3};
//如果给数组的部分元素进行赋值,没有赋值的元素系统会自动赋值为0
for(int i=0;i<=9;i++){
printf("%d\t",b[i]);
}
printf("\n");
int c[10]={0};
//全0数组
for(int i=0;i<=9;i++){
printf("%d\t",c[i]);
}
printf("\n");
int d[]={1,2,3,4,5,6,7};
for(int i=0;i<=6;i++){
printf("%d\t",d[i]);
}
return 0;
}
例题:使用数组输出斐波那契数列前20项。
// 2020/11/08
// C
#include <math.h>
#include <stdio.h>
int main() {
//斐波那契数列数组输出20项
int a[20] = {1, 1};
int i;
for (i = 2; i <= 19; i++) {
a[i] = a[i - 1] + a[i - 2];
}
for (i = 0; i <= 19; i++) {
if (i % 5 == 0) {
printf("\n");
}
printf("%d\t", a[i]);
}
return 0;
}
二维数组
一般形式
数据类型 数组名称[常量][常量]
// 2020/11/08
// C
#include <stdio.h>
int main() {
int a[3][4];
// a--->表示二维数组的名称,首行元素的地址
// 3--->表示3行。
// 4--->表示4列。
// 行和列的下标都是从0开始的。
// 数组的每一个元素在内存中都是连续存放的。
// 按行存放。
printf("%d\n", a); //首行地址
printf("%d\n", a + 1); //第二行地址
printf("%d\n", &a[0][0]); //首个元素的地址
return 0;
}
二维数组赋初值
// 2020/11/08
// C
#include <stdio.h>
int main() {
// 1.
int a[3][4] = {{1, 2, 3, 4}, {4, 3, 2, 1}, {5, 6, 7, 8}};
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 3; j++) {
if (j % 4 == 0) {
printf("\n");
}
printf("%5d", a[i][j]);
}
}
printf("\n");
// 2.
int b[3][4] = {1, 2, 3, 4, 4, 3, 2, 1, 5, 6, 7, 8};
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 3; j++) {
if (j % 4 == 0) {
printf("\n");
}
printf("%5d", b[i][j]);
}
}
printf("\n");
// 3.
int c[3][4] = {{1, 2}, {4}, {5, 6, 7}};
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 3; j++) {
if (j % 4 == 0) {
printf("\n");
}
printf("%5d", c[i][j]);
}
}
printf("\n");
// 4.全0的二维数组
int d[3][4] = {0};
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 3; j++) {
if (j % 4 == 0) {
printf("\n");
}
printf("%5d", d[i][j]);
}
}
printf("\n");
// 5.省略行值,但不能省略行值
int e[][4] = {1, 2, 3, 4, 4, 3, 2, 1, 5, 6, 7, 8};
// int e[3][] = {1,2,3,4,4,3,2,1,5,6,7,8};错误!!!!
// int e[][] = {1,2,3,4,4,3,2,1,5,6,7,8};错误!!!!
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 3; j++) {
if (j % 4 == 0) {
printf("\n");
}
printf("%5d", e[i][j]);
}
}
printf("\n");
return 0;
}
字符数组
由于C语言中,没有定义字符串类型,所以通过字符数组定义字符串。
// 2020/11/08
// C
#include <stdio.h>
int main() {
char a[10] = {'h', 'e', 'l', 'l', 'o'};
// int中没有赋值的元素为0;char中没有赋值的元素为'\0'
for (int i = 0; i <= 9; i++) {
printf("%c", a[i]);
}
// printf("%s", a);
printf("\n");
char b[] = {"hello2"};
for (int i = 0; i <= 5; i++) {
printf("%c", b[i]);
}
printf("\n");
char c[] = "hello3";
for (int i = 0; i <= 5; i++) {
printf("%c", c[i]);
}
printf("\n");
printf("%s", c);
return 0;
}
字符串的结束标志
C语言中规定,字符串中的结束标志为’\0’。 在定义字符串的时候,系统会自动的在字符串后加上’\0’,表示字符串的结束。
// 2020/11/08
// C
#include <stdio.h>
int main() {
char str[] = "helloworld";
str[5]='\0';
//printf("%d",sizeof(str));--->11个字节,末尾自动增加'\0'表示字符串的结束。
printf("%s\n",str);
// 从数组第一个元素开始打印,直到碰到'\0'结束。
for(int i=0;str[i]!='\0';i++){
printf("%c",str[i]);
}
return 0;
}
字符串的输入
#include <stdio.h>
int main() {
char str1[5], str2[5], str3[5];
scanf("%s%s%s", str1, str2, str3);// 其本身就是地址,不需要加地址符&
printf("str1=%s,str2=%s,str3=%s\n", str1, str2, str3);
return 0;
}
使用字符串处理函数
// 2020/11/08
// C
#include <stdio.h>
#include <string.h>
int main() {
// 1.输出字符串的函数puts(字符数组)
char str1[] = "made in china";
puts(str1);
// 2.输入字符串的函数gets(字符数组)
char str2[10];
gets(str2);
puts(str2);
// 3.字符串链接函数strcat(字符数组1,字符数组2)
//功能:连接字符数组2连接到字符数组1中
char str3[] = "hello";
char str4[] = "world";
strcat(str3, str4);
puts(str3);
// 4.字符串的复制函数strcpy(字符数组1,字符数组2)
//功能:将字符数组2复制到字符数组1中。
char str5[10];
char str6 = "abcdef";
strcpy(str5, str6);
puts(str5);
// 5.字符串的比较函数strcmp(字符数组1,字符数组2)
//功能:比较两个字符串的大小
//如果返回0:两个字符串相等
//如果返回1:字符串1>字符串2
//如果返回-1:字符串1<字符串2
//规则:小写字母>大写字母,按照字典顺序,越往后越大
//从字符串第一个不同的字母开始比较大小
char str7[] = "BbBA";
char str8[] = "BbBAB";
printf("%d\n", strcmp(str7, str8));
// 6.检查字符串的实际长度strlen(字符数组)
char str9[] = "BbBAR"; // 6Byte
printf("%d\n", strlen(str9));
printf("%d\n", sizeof(str9));
// 7.将字符串转换为小写strlwr(字符数组)Lowercase Uppercase
char str10[] = "BBADF";
strlwr(str10);
puts(str10);
//小写字母转大写
strupr(str10);
puts(str10);
return 0;
}
数组循环时的最后一个值
// 2020/11/16
// C
#include <stdio.h>
int main() {
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 16};
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
for (int i = 0; i < sizeof(a) / sizeof(int); i++) {
printf("%3d", a[i]);
}
return 0;
}
⭐️例题:输入10个学生的成绩(整数),统计出成绩低于平均分的人数。
// 2020/11/08
// C
#include <stdio.h>
int main() {
int stu[10]; //存放学生成绩
for (int i = 0; i <= 9; i++) {
// scanf("%d", &stu[i]);
scanf("%d", stu + i);
}
//求平均分
int sum = 0;
for (int i = 0; i <= 9; i++) {
// printf("%d\n", a[i]);
sum += stu[i];
}
double avg = sum / 10.0;
int num = 0;
for (int i = 0; i <= 9; i++) {
if (stu[i] < avg) {
num++;
}
}
printf("%d", num);
return 0;
}
例题:求二维数组中的最大值及其行标和列标
// 2020/11/08
// C
#include <stdio.h>
int main() {
int a[4][4] = {
{23, 44, 12, 77}, {13, 2, 33, 12}, {23, 45, 12, 65}, {11, 9, 15, 78}};
//打擂台
int max = a[0][0];
int x = 0;
int y = 0;
for (int i = 0; i <= 3; i++) {
for (int j = 0; j <= 3; j++) {
if (max < a[i][j]) {
max = a[i][j];
x = i;
y = j;
}
}
}
printf("%d\n坐标:(%d,%d)", max, x, y);
return 0;
}
// 2020/11/08
// C
#include <stdio.h>
int main() {
float a[20] = {2, 3};
float b[20] = {1, 2};
for (int i = 2; i <= 19; i++) {
a[i] = a[i - 1] + a[i - 2];
}
for (int i = 2; i <= 19; i++) {
b[i] = b[i - 1] + b[i - 2];
}
double sum = 0;
for (int i = 0; i <= 19; i++) {
sum += a[i] / b[i];
}
printf("%f\n", sum);
return 0;
}
例题:杨辉三角形(输出10行)
// 2020/11/08
// C
#include <stdio.h>
int main() {
int a[10][10] = {0};
for (int i = 0; i <= 9; i++) {
a[i][0] = 1;
a[i][i] = 1;
}
for(int i=2;i<=9;i++){
for(int j=1;j<=9;j++){
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
for (int i = 0; i <= 9; i++) {
for (int j = 0; j <= i; j++) {
printf("%5d", a[i][j]);
}
printf("\n");
}
return 0;
}
例题:求数列中的最小值
// 2020/11/09
// C
#include <stdio.h>
int main() {
int a[3][4]= {{1, 2, 3, 4}, {9, 8, 7, 6}, {-10, 10, -5, 2}};
int b = 0, x = 0, y = 0;
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 3; j++) {
if (b > a[i][j]) {
b = a[i][j];
x = i;
y = j;
}
}
}
printf("min=%d,x=%d,y=%d\n", b, x, y);
return 0;
}
例题:成绩总分、平均分、最高分、最低分
// 2020/11/09
// C
#include <stdio.h>
int main() {
double grade[4];
double sum = 0;
for (int i = 0; i <= 3; i++) {
scanf("%lf", &grade[i]);
}
double max=0;
double min = grade[0];
for (int i = 0; i <= 3; i++) {
sum += grade[i];
}
for (int i = 0; i <= 3; i++) {
if (min >= grade[i]) {
min = grade[i];
}
}
for (int i = 0; i <= 3; i++) {
if (max < grade[i]) {
max = grade[i];
}
}
printf("sum=%.2f,avg=%.2f,max=%.2f,min=%.2f\n", sum, sum / 4, max, min);
return 0;
}
例题:1~200之间,既能被5整除又能被7整除的数
// 2020/11/09
// C
// 1~200之间,既能被5整除又能被7整除的数
#include <stdio.h>
int main() {
for (int i = 1; i <= 200; i++) {
if (i % 5 == 0 && i % 7 == 0) {
printf("%5d", i);
}
}
return 0;
}
例题:键盘输入10个学生的成绩,统计最高分、最低分、平均分
// 2020/11/09
// C
//键盘输入10个学生的成绩,统计最高分、最低分、平均分
#include <stdio.h>
int main() {
double grade[10];
for (int i = 0; i <= 9; i++) {
scanf("%lf", &grade[i]);
}
double sum = 0;
for (int i = 0; i <= 9; i++) {
sum += grade[i];
}
double max = 0;
for (int i = 0; i <= 9; i++) {
if (max < grade[i]) {
max = grade[i];
}
}
double min = grade[0];
for (int i = 0; i <= 9; i++) {
if (min >= grade[i]) {
min = grade[i];
}
}
printf("avg=%.2f,max=%.2f,min=%.2f\n", sum / 10, max, min);
return 0;
}
例题:由数字1,2,3,4组成,互不相同且无重复数字的三位数
// 2020/11/09
// C
#include <stdio.h>
int main() {
int a[4] = {1, 2, 3, 4};
for (int i = 0; i <= 3; i++) {
for (int j = 0; j <= 3; j++) {
if (i == j) {
continue;
}
for (int z = 0; z <= 3; z++) {
if (i == z || j == z) {
continue;
}
printf("%5d", a[i] * 100 + a[j] * 10 + a[z]);
}
}
}
return 0;
}