C语言学习(二)——一维数组与二维数组

一、一维数组(续)

#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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值