一、一维数组(续)
#include<stdio.h>
#include<string.h>
#include<iostream>
//数据在内存中如何存储
//启动一个程序,系统会给这个程序分配一块内存空间
//内存的最小单位时1个字节
//内存中的每一个字节都会有编号,这个编号就称为内存的地址
//数据在内存中的地址就是他在内存中的 起始地址(首地址)
//数组名代表数组首首地址,也就是数组中第0个元素的地址
// a==&a[0]代表数组的首地址
//所以,数组名是一个常量!!!不能被赋值!!!
//&a 代表整个数组的地址 也是首地址
//在数值上, &a,a,&a[0] 相等
// 例:数组首地址为01;int a[5]
//&a[0]+1 元素的地址加一,跨过一个元素 地址为05 (地址增量为每个元素所占的内存空间大小)
//a+1 元素的地址加1,跨过一个元素 地址为05 (地址增量为每个元素所占的内存空间大小)
//&a+1 整个数组的地址加1,跨过整个数组 地址为21 (地址增量为整个数组所占的内存空间大小)
int main10()
{
using namespace std;
int a[5];
//cout << a << endl;
printf("%u\n", &a[0]);
printf("%u\n", a);
printf("%u\n", &a);
printf("%u\n", &a[0]+1);
printf("%u\n", a+1);
printf("%u\n", &a+1);
system("pause");
return (0);
}
//求数组中最大值
int main11()
{
using namespace std;
int arr[10] = { 15,25,13,84,51,68,27,81,79,10 };
int i, max;
max = arr[0];
for (i = 1; i < 10; i++)
{
if (max < arr[i])
{
max = arr[i];
}
}
cout << "最大值为:" << max << endl;
system("pause");
return (0);
}
//数组逆置
int main12()
{
using namespace std;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int m, n, temp;
for (n = 0, m = 9; n <= 4 && m >= 5; n++, m--)//元素个数可以用sizeof(a)/sizeof(a[0])表示
{
temp = arr[m];
arr[m] = arr[n];
arr[n] = temp;
}
for (n = 0; n <= 9; n++)
{
cout << arr[n] << " ";
}
system("pause");
return (0);
}
//冒泡排序的原理
//冒泡:相邻两个元素比较,前面的比后面的打,两个元素交换(大的放到后面,先确定最大值,放到最后面)
int main13()
{
using namespace std;
int arr[10], temp;
int i, j,n;
n = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i <= n-1; i++)
{
cin >> arr[i];
}
for (i = 0; i < n-1; i++)//比较的轮数
{
//因为每次比较的次数都要减1,刚好i每次加1,所以每一轮比较的次数时n-i-1
for (j = 0; j < n-1-i; j++)//每一轮需要比较的次数
{
if (arr[j] > arr[j + 1])//如果前面的元素比后面的相邻的元素大,则两个元素交换位置
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (i = 0; i <= 9; i++)
{
cout << arr[i] << " ";
}
cout<<
system("pause");
return (0);
}
二、一维数组&条件语句&循环语句练习
#include<stdio.h>
#include<string.h>
#include<iostream>
//题目:
//从屏幕上输入一个学生的成绩(0-100)
//<60为E 60-69之间为D 70-79之间为C 80-89之间为B 90以上为A 小于0或者大于100时提示输入成绩出错
//用if else if实现
int main01()
{
using namespace std;
char ch;
int score = 0;
cout << "请输入学生成绩" << endl;
cin >> score;
if (score > 100 || score < 0)
{
cout<<"您输入的成绩有错"<<endl;
}
else if (score < 60)
{
ch = 'E';
}
else if (score >= 60 && score <= 69)
{
ch = 'D';
}
else if (score >= 70 && score <= 79)
{
ch = 'C';
}
else if (score >= 80 && score <= 89)
{
ch = 'B';
}
else
{
ch = 'A';
}
switch (ch)//可用可不用,直接在if else if中输出就可以,用作训练
{
case 'E':
cout << "学生成绩为E" << endl;
break;
case 'D':
cout << "学生成绩为D" << endl;
break;
case 'C':
cout << "学生成绩为C" << endl;
break;
case 'B':
cout << "学生成绩为B" << endl;
break;
case 'A':
cout << "学生成绩为A" << endl;
break;
}
system("pause");
return (0);
}
//题目:从键盘输入1到7的数字,分别提示 Monday、Tuesday、Wednesday、Thursday、friday、saturday、sunday、
//输入其他,提示出错。
int main02()
{
using namespace std;
int num;
cout << "请输入:"<< endl;
cin >> num;//获取数字
switch (num)//跳转语句进行选择
{
case 1:
cout << "Today is Monday" << endl;
break;
case 2:
cout << "Today is Tuesday" << endl;
break;
case 3:
cout << "Today is Wednesday" << endl;
break;
case 4:
cout << "Today is Thursday" << endl;
break;
case 5:
cout << "Today is friday" << endl;
break;
case 6:
cout << "Today is saturday" << endl;
break;
case 7:
cout << "Today is sunday" << endl;
break;
default:// 输入有误的情况,除去1到7的数字以外,都输出错误
cout << "您的输入有误,请重新输入" << endl;
break;
}
system("pause");
return (0);
}
//题目:输出0到100中可以被7整除的数
int main03()
{
using namespace std;
int i;
cout << "0到100中可以被7整除的数有: " << endl;
for (i = 0; i <= 100; i++)
{
if (i % 7 == 0)
{
cout << i << " ";
}
}
system("pause");
return (0);
}
int main04()
{
using namespace std;
int i = 0;
cout << "0到100中可以被7整除的数有: " << endl;
while (i <= 100) //while()中的条件是程序进入循环时需要满足的条件!!!
{
if (i % 7 == 0)
{
cout << i << " ";
}
i++;
}
system("pause");
return (0);
}
//题目:输出100-1000以内的水仙花数
//水仙花数算法:一个数=它各位的立方和,例如:153=1*1*1 + 5*5*5 + 3*3*3
int main05()
{
using namespace std;
int i = 100;
int num_1, num_2, num_3; //代表每个数的个位、十位、百位
cout << "100到1000中水仙花数为:" << endl;
for (i = 100; i >= 100 && i < 1000; i++)
{
num_1 = i % 10; //求出数的个位
num_2 = (i / 10) % 10; //求出数的十位
num_3 = i / 100 % 10;
if (i == (num_1 * num_1 * num_1 + num_2 * num_2 * num_2 + num_3 * num_3 * num_3))
{
cout << i << " ";
}
}
cout << endl;
system("pause");
return (0);
}
//题目:求1-2+3-4+5-6+...+99-100
int main06()
{
using namespace std;
int sum = 0;
int i = 0;
int single;
for (i = 1; i <= 100; i++)
{
if (i % 2 == 0)//判断是否为偶数
{
single = (-1) * i;//偶数为负
}
else
{
single = i;//奇数为正
}
sum = sum + single;//求和
}
cout << sum << endl;//打印结果
system("pause");
return (0);
}
int sum()//答案中的编法
{
using namespace std;
int sum = 0;
for (int i = 1; i < 100; ++i)
{
if (i % 2 == 0)//偶数
{
sum += i;
}
else //奇数
{
sum -= i;
}
cout << sum << endl;
}
system("pause");
return (0);
}
//求[m,n]之间既不能被7整除也不能被5整除的整数之和,m和n的值由键盘输入
int main07()
{
using namespace std;
int m, n, i;
int sum = 0;
cout << "请输入区间值m和n"<<endl;
cin >> m; //输入区间左侧的m值
cin >> n; //输入区间右侧的n值
if (m > n) //区间中m值不能大于n值
{
cout << "输入有误,请重新输入"<<endl;
}
else //输入数值符合要求则继续
{
for (i = m; i <= n; i++)
{
if ((i % 7 != 0) && (i % 5 != 0))
{
sum = sum + i;
}
}
cout << "在" << m << "和" << n << "之间,既不能被7整除,也不能被5整除的所有数之和为:" << sum << endl;
}
system("pause");
return (0);
}
//爱因斯坦问题:
//有一个长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;
//若每步跨6阶,最后剩下5阶;只有每步跨7阶,最后正好一阶不剩,求 这条阶梯共有多少阶?
int main08()
{
using namespace std;
int stage;
int n = 0;//用于循环停止的变量
for (stage = 0; n==0 ; stage++)
{
if ((stage % 2 == 1) && (stage % 3 == 2) && (stage % 5 == 4) && (stage % 6 == 5) && (stage % 7 == 0))
{
cout << stage << endl;
n = 1;//n变为1时,循环停止
}
}
system("pause");
return (0);
}
//参考答案代码
int main09()
{
using namespace std;
int i = 0;
while (1)
{
if ((i % 2 == 1) && (i % 3 == 2) && (i % 5 == 4) && (i % 6 == 5) && (i % 7 == 0))
{
break;
}
i++;
}
cout << i << endl;
system("pause");
return (0);
}
三、二维数组
#include<stdio.h>
#include<string.h>
#include<iostream>
//二维数组可以看成多个一维数组组成
//定义二维数组:
//数据类型 数组名[行号][列号]
//设有一个二维数组为a[2][4] 这个二维数组有2个一维,每个一维数组中有4个元素
// 其中a[i]代表第i行
//二维数组每一个元素也是一个变量
//二维数组在内存中是连续线性存储的
int main14()
{
using namespace std;
int arr[3][4];//定义一个3行4列的二维数组
int i,j;
//从键盘中读入二维数组各个元素的值
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
cin >> arr[i][j];
}
}
//打印二维数组各个元素的值 (数组的打印要用循环,不能直接打印数组名,数组名代表的是数组首元素的地址)
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
cout << arr[i][j]<<" ";
}
cout << endl;
}
cout << endl;
cout << sizeof(int[3][4]) << endl;//输出二维数组的长度
//sizeof()中可以写变量名或者数组名,也可以写变量和数组的数据类型
//其中一维数组的数据类型是:
//数据类型 []
//二维数组的数据类型是:
//数据类型 [][]
cout << sizeof(arr) << endl;//输出二维数组的长度
system("pause");
return (0);
}
//二维数组的初始化(几种方法)
int main15()
{
using namespace std;
//第一种初始化方法:
int arr_1[3][2] = { {1,2},{3,4},{5,6} };//行数为3,列数为2;
int arr_2[3][2] = { 1,2,3,4, };//等价于=={{1,2},{3,4},{0,0},{0,0}};
//系统会按照列的大小来自动分配数组中的元素,没有定义的部分用0补全
int arr_3[][2] = { 1,2,3,4 };//等价于 == a[2][2]={{1,2},{3,4}};
//系统会自动按照列号进行对元素的分配,得到的行数就是该二维数组的行号
//以上几种都是对二维数组的有效初始化
//int arr_4[3][]={ 1,2,3,4 }; 和 int arr_4[][]={ 1,2,3,4 }; 都是不可以的
//注意!!行号可以省略 但是列号一定不要省略!!!
//列号可以省略
system("pause");
return (0);
}
//求二维数组的行和列
int main16()
{
using namespace std;
int arr[3][4] = { 1,2,3,4 };
int n = sizeof(arr) / sizeof(arr[0][0]);
//二维数组中元素的个数 = 二维数组在内存中的总长度 / 二维数组每个元素所占内存的长度
int line = sizeof(arr) / sizeof(arr[0]);
//二维数组中行的个数 = 二维数组在内存中的总长度 / 二维数组每行元素在内存中的长度
int m = sizeof(arr[0]) / sizeof(arr[0][0]);
//二维数组中列的个数 = 二维数组每行元素在内存中的长度 / 二维数组中每个元素所占内存的长度0
cout << n << endl;
cout << line << endl;
cout << m << endl;
system("pause");
return (0);
}
//二维数组数组名
int main17()
{
using namespace std;
//##########################################################
//a[i][j] 代表二维数组中的元素a[i][j]
//&a[i][j] 代表二维数组元素a[i][j]的地址 它的增量是每个数组元素的长度
// a[i] 第i行一维数组名,代表二维数组第i行的地址 a[i]=&a[i][0] 它的增量是每行元素的长度
// &a[0] 代表二维数组第0行的地址 它的增量是每行元素的长度
// a 二维数组数组名,代表二维数组的首行地址 a==&a[0] 它的增量是
// 每行元素的长度
// &a 代表二维数组的地址(首地址,但指向的是整个二维数组) 它的增量是整个二维数组的长度
//&a[i][j]+1 元素地址加1,跨过一个元素
//a[i]+1 元素地址加1,跨过一个元素
//&a[i]+1 行地址加1, 跨过一行
//a+1 行地址加1, 跨过一行
//&a+1 二维数组地址加1,跨过整个数组
//###########################################################
int a[3][4];
printf("%u\n", &a);
printf("%u\n", &a[0][0] + 1);
printf("%u\n", a[0] + 1);
printf("%u\n", &a[0] + 1);
printf("%u\n", a + 1);
printf("%u\n", &a + 1);
system("pause");
return (0);
}
四、二维数组练习
#include<stdio.h>
#include<string.h>
#include<iostream>
//练习1:
//二维数组:5行3列
//行代表人:老大到老五
//列代表科目:语、数、外 求各科成绩的平均值和每人最低成绩,并按平均值的大小,从小到大排序输出
int main()
{
using namespace std;
float Aver(float);
int min(int [], int );
int arr_goal[5][3] = { {80,75,56},{59,65,71},{59,63,70},{85,45,90},{76,77,45} };
int i, j;
float goal_aver[5] = { 0.0 };//五个人的平均成绩
float goal_sum[5] = { 0 }; //一个人每科成绩的和
int goal_low[5] = { 0,0,0,0,0 };//五个人各自得最低成绩
int goal_num[3] = { 0 ,0,0 };//一个人得各科成绩
float temp=0;
//求五个人得平均成绩
cout << "每个人的平均成绩为:"<<endl;
for (i = 0; i < sizeof(arr_goal) / sizeof(arr_goal[0]); i++)
{
for (j = 0; j < sizeof(arr_goal[0]) / sizeof(arr_goal[0][0]);j++)
{
goal_sum[i] += arr_goal[i][j];//将一个人得三科成绩求和
}
goal_aver[i]=Aver(goal_sum[i]);//求每个人得平均成绩
cout << goal_aver[i] << " ";
}
cout << endl;
//求五个人每课成绩最小值
cout << "每个人的最低分:" << endl;
for (i = 0; i < sizeof(arr_goal) / sizeof(arr_goal[0]); i++)
{
for (j = 0; j < sizeof(arr_goal[0]) / sizeof(arr_goal[0][0]); j++)
{
goal_num[j] = arr_goal[i][j];//将每个人的三科成绩放到一个一维数组里
}
goal_low[i] = min(goal_num, 3);
cout << goal_low[i] << " ";
}
cout << endl;
//冒泡排序
cout << "每个人平均成绩从小到大排序:" << endl;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 5 - i - 1; j++)
{
if (goal_aver[j] > goal_aver[j + 1]) {
temp = goal_aver[j];
goal_aver[j] = goal_aver[j + 1];
goal_aver[j + 1] = temp;
}
}
}
//输出小到大顺序的平均值
for (i = 0; i < 5; i++)
{
cout << goal_aver[i] << " ";
}
cout << endl;
system("pause");
return (0);
}
//求平均值函数,返回值为平均值
float Aver(float a)
{
float average;
average = a / 3;
return average;
}
int min(int a[],int b)
{
int i;
int min=0;
for (i = 0; i < b-1; i++)
{
if (a[i] < a[i + 1])
{
min = a[i];
}
else
{
min = a[i + 1];
}
}
return min;
}