今天学习的内容是数组之中最为简单的一维数组以及数组排序之中最为简单的冒泡排序。
1.数组
所谓数组,其实就是相同数据类型的元素按一定顺序排列的集合,这些元素可以是整型,可以是浮点型,也可以是字符型,只要是数据类型,就可以组成数组。
//数组:相同数据类型的 成员 组成的一组数据,即可以存储多个相同类型的变量
//缺点:只能存储同种类型
//数组是一种构造类型,相同的数据类型组成的新数据类型,数组的每一个元素成为一个数组元素
//最简单的数组是一维数组
//一维数组: 类型说明符 数组名[常量表达式(即元素个数)] = {值1,值2,值3...值n};
//数组所占的内存:数组元素个数 * 单个元素所占的内存
int a[5] = {1,2,3,4,5};//定义一个数组a,里面有5个元素
int b[5] = {1,2,3};//表明数组b有5个元素,分别为1,2,3,0,0,后面不写的话默认为零
int c[] = {1,2,3,4};//表明数组有4个元素,分别为1,2,3,4,若不写明元素个数,则数组会根据元素的个数值来判断元素个数
int d[5] = {0};//表明此时d中默认的5个元素都为0,这是以后创建数组最常用的
// //通过下标来访问数组中的元素,下表从0开始数,下标的范围 0---元素个数-1
// //系统不会检测下标越界,所以,使用元素的时候要注意
float x[5] = {1.2,2.3,4.8};
char y[5] = {'a','b','c','d'};
//输出数组中的元素
for (int i = 0; i < 5; i++) {
printf("%d \n",a[i]);
}
//如何修改数组中的元素
a[4] = 60;
for (int i = 0; i < 5; i++) {
printf("%d ",a[i]);
}
//随机给出20个 30---70 的数字,并给出这些数字的总和,最大值和最小值
int b[20] = {0},sum = 0,max = 30,min = 70;
for (int i = 0; i < 20; i++) {
b[i] = arc4random() % (70 - 30 + 1) + 30;
printf("%d ",b[i]);
sum = sum + b[i];
//如果随机给出的b[i] > max,则把b[i]的值给max
if (max < b[i]) {
max = b[i];
}
//如果随机给出的b[i] < min,则把b[i]的值给min
if (min > b[i]) {
min = b[i];
}
}
printf("\n");
printf("sum = %d max = %d min = %d\n",sum,max,min);
//生成两个数组,每个数组10个元素,[20 40],两个数组元素相对应的值相加赋给另外一个数组
int a[10] = {0},b[10] = {0},c[10] = {10};;
printf("随机出数组a里的10个元素为:");
for (int i = 0; i < 10; i++) {
a[i] = arc4random() % (40 - 20 + 1) + 20;
printf("%d ",a[i]);
}
printf("\n");
printf("随机出数组b里的10个元素为:");
for (int i = 0; i < 10; i++) {
b[i] = arc4random() % (40 - 20 + 1) + 20;
printf("%d ",b[i]);
}
printf("\n");
//计算数组c里的元素的值
printf("数组c里的10个元素为:");
for (int i = 0; i < 10; i++) {
c[i] = a[i] + b[i];
printf("%d ",c[i]);
}
//冒泡排序思想:每趟排序都将最大的数值放在最后面,右边是有序区左边是无序区
//随机出十个数 [10 60],同时进行升序排列
int array [10] = {0};
printf("随机出的10个元素为:");
for (int i = 0; i < 10; i++) {
array[i] = arc4random() % (60 - 10 + 1) + 10;
printf("%d ",array[i]);
}
//冒泡排序:外层循环控制趟数,如果数组中有n个元素,则循环 n - 1趟
for (int i = 0; i < 10 - 1; i++) {
//内层循环控制每趟比较的次数
for (int j = 0; j < 10 - 1 - i; j++) {
//当前元素和后一个元素做比较,如果前一个元素的值比后一个的大,则交换位置(升序,从小到大排列)反之则排序相反
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
printf("\n排序完成的数组为:");
for (int i = 0; i < 10; i++) {
printf("%d ",array[i]);
}
//字符串:用于存放字符变量的数组成为字符数组
//字符数组属于一堆数组,定义方式与普通一维数组相似,只是类型是char
char symbol[] = "iPhone";
//sizeof 计算字符串所占的空间大小,同时包括\0
printf("%lu",sizeof(symbol));
// %s 的工作原理,会依次输出我们的字符串里面的字符,直到碰到\0结束
printf("%s",symbol);
//如何打印我们字符串中的某个字符
printf("%c",symbol[3]);
//strlen 计算字符串的长度,不包括\0
printf("%lu",strlen(symbol));
//strcpy (字符串1,字符串2); 用于拷贝字符串
//把字符串2 拷贝到字符串1里面
char copysymbol[] = "HTC";
strcpy(symbol, copysymbol);
printf("%s\n",symbol);
//strcat (字符串1,字符串2); 用于拼接字符串
//工作原理:把字符串2往字符串1上拼接,原理是:从字符串1的第一个\0位置开始进行拼接,直到拷贝到字符串2的\0结束
strcat(symbol, copysymbol);
printf("%s\n",symbol);
//strcmp (字符串1,字符串2); 字符串比较函数
//工作原理:从字符串2和字符串2的第一个字符开始做减法运算,一旦发现运算结果不为0(即字符串不相等时),则后面的字符串就不判断了
//结果如果相等,则表示两个字符串相等,结果的差值是字符串1当中的这个字符减去字符串2中的相应的字符的差值(ASCII码值相减)
char s1[] = "abc",s2[] = "acd";
int result = strcmp(s1, s2);
printf("result = %d\n",result);
// 字符串 "Tonight, I feel so close to you!" 将其中的"o"变成"A",同时打印出字符串
//如果想公变字符串炸的字符,则需要循环判断每个字符,循环条件可以写为,当循环遇到'\0'时,则结束循环( 因为字符串中'\0'是作为结束标志的)
char love[] = "Tonight, I feel so close to you!";
int i = 0;
while (love[i] != '\0') {
if (love[i] == 'o') {
love[i] = 'A';
}
i++;
}
//
//
附上今天的练习题:
//1.(**)随机产生20个10~50的正整数存放到数组中,并求数组中的所有元素最大值、最小值、平均值及各元素之和。
int a[20] = {0},max = 10,min = 50,sum = 0,avg = 0;
printf("数组中的各元素为:");
for (int i = 0; i < 20; i++) {
a[i] = arc4random() % (50 - 10 + 1) + 10;
printf("%d ",a[i]);
sum += a[i];
if (max < a[i]) {
max = a[i];
}
if (min > a[i]) {
min = a[i];
}
}
avg = sum / 20;
printf("\n");
printf("最大值为:%d 最小值为:%d 平均值为:%d 各元素之和为:%d \n",max,min,avg,sum);
//2.编写一个程序,随机出两个包含10个元素的数组,范围[30 70],先将两个数组升序排序,然后将这两个数组合并成一个升序数组。
int b[10] = {0},c[10] = {0},f[20] = {0};
printf("随机出数组b里的10个元素为:");
for (int i = 0,k = 0; i < 10; i++,k++) {
b[i] = arc4random() % (70 - 30 + 1) + 30;
f[k] = b[i];
printf("%d ",b[i]);
}
//
for (int i = 0; i < 10 - 1; i++) {
for (int j = 0; j < 10 - 1 - i; j++) {
if (b[j] > b[j + 1]) {
int temp = b[j];
b[j] = b[j + 1];
b[j + 1] = temp;
}
}
}
printf("\n排序完成的b数组为:");
for (int i = 0; i < 10; i++) {
printf("%d ",b[i]);
}
printf("\n");
//
//
printf("随机出数组c里的10个元素为:");
for (int i = 0,k = 10; i < 10; i++,k++) {
c[i] = arc4random() % (70 - 30 + 1) + 30;
f[k] = c[i];
printf("%d ",c[i]);
}
//
for (int i = 0; i < 10 - 1; i++) {
for (int j = 0; j < 10 - 1 - i; j++) {
if (c[j] > c[j + 1]) {
int temp = c[j];
c[j] = c[j + 1];
c[j + 1] = temp;
}
}
}
printf("\n排序完成的c数组为:");
for (int i = 0; i < 10; i++) {
printf("%d ",c[i]);
}
//
//
printf("\n合并后的数组为:");
for (int i = 0; i < 20; i++) {
printf("%d ",f[i]);
}
for (int i = 0; i < 20 - 1; i++) {
for (int j = 0; j < 20 - 1 - i; j++) {
if (f[j] > f[j + 1]) {
int temp = f[j];
f[j] = f[j + 1];
f[j + 1] = temp;
}
}
}
printf("\n合并后并排序完成的c数组为:");
for (int i = 0; i < 20; i++) {
printf("%d ",f[i]);
}
//3.(***)输入某年某月某日,输出其为这一年的第几天。
int y,m,d,days,Feb;
printf("亲,请输入年月日:");
scanf("%d%d%d",&y,&m,&d);
if (y % 400 == 0 || ( y % 4 == 0 && y % 100 != 0)) {
Feb = 29;
}else{
Feb = 28;
}
switch (m) {
case 1:
days = 0;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
case 2:
days = 31;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
case 3:
days = Feb + 31;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
case 4:
days = Feb + 62;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
case 5:
days = Feb + 92;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
case 6:
days = Feb + 123;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
case 7:
days = Feb + 153;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
case 8:
days = Feb + 184;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
case 9:
days = Feb + 215;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
case 10:
days = Feb + 245;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
case 11:
days = Feb + 276;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
case 12:
days = Feb + 306;
printf("您输入的%d年%d月%d日是这一年的第%d天",y,m,d,days + d);
break;
default:
printf("您输入的日期有误!");
break;
}