C语言日记 21 数组简介

 例 5-1

 

一维数组元素引用示例。

源程序:

#include <iostream>
using namespace std;
void main()
{
    int i, a[6];//定义循环变量 i 和数组 a
    for (i = 0; i < 6; i++)
        a[i] = i * 2;
    //为每个数组元素赋值
    for (i = 5; i >= 0; i--)
        cout << a[i] << ",";//倒序输出a数组的元素
}

#include <iostream>
using namespace std;
void main()
{
	int i, a[6];//定义循环变量 i 和数组 a
	for (i = 0; i < 6; i++)
		a[i] = i * 2;
	//为每个数组元素赋值
	for (i = 5; i >= 0; i--)
		cout << a[i] << ",";//倒序输出a数组的元素
}

运行流程:
 

结果:

例5-2用数组来处理求 Fibonacci数列问题。

可以用20个元素代表数列中的20个数,从第3个数开始,可以直接用表达式

f[i]=f[i-2]+f[i-1]求出各数。

源程序:

#include <iostream>
using namespace std;
#include <iomanip>//别忘了
int main()
{
    int i;
    int f[20] = { 1,1 };    //f[0]=1,f[1]=1
    for (i = 2; i < 20; i++)
        f[i] = f[i - 2] + f[i - 1];
    //在i的值为2时,f[2]=f[0]+f[1],依此类推
    for (i = 0; i < 20; i++)
        //此循环的作用是输出20个数
    {
        if (i % 5 == 0) cout << endl;
        //控制换行,每行输出5个数据
        cout << setw(8) << f[i];
        //每个数据输出时占8列宽度
    }
    cout << endl;
//最后执行一次换行
    return 0;
}

#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
	int i;
	int f[20] = { 1,1 };	//f[0]=1,f[1]=1
	for (i = 2; i < 20; i++)
		f[i] = f[i - 2] + f[i - 1];
	//在i的值为2时,f[2]=f[0]+f[1],依此类推
	for (i = 0; i < 20; i++)
		//此循环的作用是输出20个数
	{
		if (i % 5 == 0) cout << endl;
		//控制换行,每行输出5个数据
		cout << setw(8) << f[i];
		//每个数据输出时占8列宽度
	}
	cout << endl;
//最后执行一次换行
	return 0;
}

结果:

如果不要求输出的格式那么美观好看,最后面直接按顺序输出 f[i]即可:

#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
    int i;
    int f[20] = { 1,1 };    //f[0]=1,f[1]=1
    for (i = 2; i < 20; i++)
        f[i] = f[i - 2] + f[i - 1];
    //在i的值为2时,f[2]=f[0]+f[1],依此类推
    for (i = 0; i < 20; i++)
    cout << f[i] << endl;
    //最后执行一次换行
    return 0;
}

#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
	int i;
	int f[20] = { 1,1 };	//f[0]=1,f[1]=1
	for (i = 2; i < 20; i++)
		f[i] = f[i - 2] + f[i - 1];
	//在i的值为2时,f[2]=f[0]+f[1],依此类推
	for (i = 0; i < 20; i++)
	cout << f[i] << endl;
	//最后执行一次换行
	return 0;
}

例5-3 编写程序,用起泡法对10个数排序(按由小到大顺序)。

起泡法的思路:将相邻两个数比较,将小的调到前面。然后进行第2趟比较,对

余下的数按上法进行比较。

可以推知,如果有n个数,则要进行n-1趟比较(和交换)。在第1趟中要进行

n-1次两两比较,在第j趟中要进行n-j次两两比较。

具体详细学习收获和出现问题的过程以及扩展知识,详见:

书P85 例5-3 冒泡算法问题_宇 -Yu的博客-CSDN博客

源程序:

#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
    int a[11];
    int i, j, t;
    cout << "input 10 numbers :" << endl;
    for (i = 1; i < 11; i++) //输入a[1]~a[10]
        cin >> a[i];
    cout << endl;
    for (j = 1; j <= 9; j++)//共进行9趟比较
        for (i = 1; i <= 10 - j; i++)
            //在每趟中要进行(10-j)次两两比较
            if (a[i] > a[i + 1])//如果前面的数大于后面的数
            {
                t = a[i];
                a[i] = a[i + 1];
                a[i + 1] = t;
            }    //交换两个数的位置,使小数上浮
    cout << "the sorted numbers :" << endl;
    for (i = 1; i < 11; i++)//输出10个数
        cout << a[i] << " ";
    cout << endl;
    return 0;
}

#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
	int a[11];
	int i, j, t;
	cout << "input 10 numbers :" << endl;
	for (i = 1; i < 11; i++) //输入a[1]~a[10]
		cin >> a[i];
	cout << endl;
	for (j = 1; j <= 9; j++)//共进行9趟比较
		for (i = 1; i <= 10 - j; i++)
			//在每趟中要进行(10-j)次两两比较
			if (a[i] > a[i + 1])//如果前面的数大于后面的数
			{
				t = a[i];
				a[i] = a[i + 1];
				a[i + 1] = t;
			}	//交换两个数的位置,使小数上浮
	cout << "the sorted numbers :" << endl;
	for (i = 1; i < 11; i++)//输出10个数
		cout << a[i] << " ";
	cout << endl;
	return 0;
}

例5-4 有一个3x4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。

分析:开始时把a[0][0]的值赋给变量max,然后让下一个元素与其比较,将二者中值大者保存在max中,再让下一个元素与新的max比,直到最后一个元素比完为止。max最后的值就是数组所有元素中的最大值。

源程序:

#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
    int i, j, row = 0, colum = 0, max;
    int a[3][4] = { { 5,12,23,56 }, { 19,28,37,46 }, { -12,-34,6,8 } };
    max = a[0][0];//使max开始时取a[0][0]的值
    for (i = 0; i <= 2; i++)//从第0行~第2行
        for (j = 0; j <= 3; j++)//从第0列~第3列
            if (a[i][j] > max)//如果某元素大于 max
            {
                max = a[i][j];//max将取该元素的值
                row = i;//记下该元素的行号 i
                colum = j;//记下该元素的列号j
            }
cout << "max=" << max << ",row=" << row << ",colum=" << colum << endl;
}

#include <iostream>
using namespace std;
#include <iomanip>
int main()
{
	int i, j, row = 0, colum = 0, max;
	int a[3][4] = { { 5,12,23,56 }, { 19,28,37,46 }, { -12,-34,6,8 } };
	max = a[0][0];//使max开始时取a[0][0]的值
	for (i = 0; i <= 2; i++)//从第0行~第2行
		for (j = 0; j <= 3; j++)//从第0列~第3列
			if (a[i][j] > max)//如果某元素大于 max
			{
				max = a[i][j];//max将取该元素的值
				row = i;//记下该元素的行号 i
				colum = j;//记下该元素的列号j
			}
cout << "max=" << max << ",row=" << row << ",colum=" << colum << endl;
}

结果:

我写的:

#include <iostream>
using namespace std;
int main()
{
	int i, j, k,m,n;
	int a[3][4] = { { 5,12,23,56 }, { 19,28,37,46 }, { -12,-34,6,8 } };
	for (n= 0; n < 4; n++)
		for (m = 0; m < 3; m++)
			if (a[m][n] < a[m][n+1])
			{
				i = a[m][n];
				j = m;
				k = n+1;
			}
	cout << "max=" << i << ",行" << j << ",列" << k << endl;
}

结果自然是错的离谱:

如果根据这样的程序运行逻辑,只要后面的数字比前面的大我就输出后面的数字

那其实不就相当于不管之前比较过的数有过多大的数字了吗?

例如:5 3 1 2 3     如果根据这样的算法算下来最后输出的结果肯定是3。

换而言之换句话说我们就应该拿后面新出现的数值区和之前所有出现过的数值里面的最大值去比较,而不是只去和前一个数比较:

#include <iostream>
using namespace std;
int main()
{
    int i=0, j, k, m, n;
    int a[3][4] = { { 5,12,23,56 }, { 19,28,37,46 }, { -12,-34,6,8 } };
    for (n = 0; n < 4; n++)
        for (m = 0; m < 3; m++)
            if (a[m][n] > i)
            {
                i = a[m][n];
                j = m;
                k = n;
            }
    cout << "max=" << i << ",行" << j << ",列" << k << endl;
}

#include <iostream>
using namespace std;
int main()
{
	int i=0, j, k, m, n;
	int a[3][4] = { { 5,12,23,56 }, { 19,28,37,46 }, { -12,-34,6,8 } };
	for (n = 0; n < 4; n++)
		for (m = 0; m < 3; m++)
			if (a[m][n] > i)
			{
				i = a[m][n];
				j = m;
				k = n;
			}
	cout << "max=" << i << ",行" << j << ",列" << k << endl;
}

这样就行咯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值