如何使用n维数组【##19】--【##25】

我感觉数组有点像函数,需要自变量和因变量,且有一定的关系【靠赋值建立起来的】, 切记编程中算法的运算操作是字母外表下的数字在进行判断!!或者是数字外表下的数字所做判断!

内含(使用数组的)源程序:斐波那契数列,顺序查找法,

说一下我写代码过程中发现的return 1的情况:1.主函数没写全,int mai();然后报错了  2.终端显示器没有关。

1.使用一维数组编程:像之前的斐波那契数列,不用数组时就是用迭代覆盖的方法,有了数组后可以直接用for循环嵌套给每个数组里面的元素赋值。在通过让下角标的变化输出。

eg:用数组计算并存放斐波那契数列:由于数组里面的数字必须是常量,所以我们就写一个稍微大一点的数字。

/*用数组计算斐波那契数列##19*/
#include <stdio.h>

int main() {
	int fb[46] = {1, 1};//我这里的46挺多的,因为我的输出个数是n=10
	int n;
	for (int i = 2; i < 46; i++) {//别写错了,不是i=3!!
		fb[i] = fb[i - 1] + fb[i - 2];
	}
	printf("enter n(要输出n个数):");
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		printf("%d\t", fb[i]);
		if ((i + 1) % 5 == 0)
			printf("\n");//这里的满五换行计算机只能对具体数字处理。
	}
	return 0;
}

顺序查找法:n(1到10)为数组a中的元素。x为要找的整数。找出a【】中所有与x相等的元素的下标。

/*顺序查找法(输出index)##20*/
#include <stdio.h>

int main() {
	int n, x, flag = 0;
	printf("enter n and x:\n");
	scanf("%d %d", &n, &x);
	int a[n];//这个数组在n输入之后,好像是ok的
	printf("输入数组中的元素:\n");
	for (int i = 0; i < n; i++) {//这里的i只管这次的for循环,所以下一次的要重新定义
		scanf("%d", &a[i]);
	}
	for (int i = 0; i < n; i++) {
		if (a[i] == x) {
			printf("index is :%d\t", i);
			flag = 1;
		}
	}
	if (flag == 0)
		printf("not found.\n");
	return 0;
}

/*输出数组最小值和它最小值所对应的下标##21*/
#include <stdio.h>

int main() {
	int n, index = 0;
	printf("enter n(minimum):");
	scanf("%d", &n);
	int a[n];
	printf("enter a[i]:");
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	a[index] = a[0];
	for (int i = 0; i < n; i++) {
		if (a[i] < a[index]) {
			a[index] = a[i];//这一行没用,最后输出的是index,自动调整了
			index = i;
		}
	}
	printf("a[index]=%d\nindex=%d", a[index], index);
}

输出数组最小值并与第一个数交换:在第一个的基础上面改动一下就好了。 

/*输出数组最小值并与第一个数交换*/
#include <stdio.h>

int main() {
	int n, index = 0;
	printf("enter n(minimum):");
	scanf("%d", &n);
	int a[n];
	printf("enter a[i]:");
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	a[index] = a[0];
	for (int i = 0; i < n; i++) {
		if (a[i] < a[index]) {
			index = i;
		}
	}
	int temp;//此处改动
	temp = a[index];
	a[index] = a[0];
	a[0] = temp;
	printf("a[0]=%d\n", a[0]);
	return 0;
}

选择法排序:方法是流程图。你要知道自己定下来的变量是干什么的。

本题要求将给定的n个整数从大到小排序后输出。

1.分析:n是输入的整数,代表了数组长度        2.要排序来比较大小,所以要有找到最小值的算法,但是每一次找到最小值的时候,找到最小值的数据内容在减少。毕竟排序完成的不用在参与比较了。   

(一)描述算法步骤  1.先输入数组

2.最里面的循环是找出数据最小值的,用index代表对应下标。通过i的不断循环来找出对应最小数组值,在内循环结束后,在把下标赋值过去‘index=i’进行函数值的改变。

3.外层循环起到一个排序的作用,在内层循环找到最小值(相当于函数值)的基础上用k的0到n-1进行重排。

/*选择法排序##22*/
#include <stdio.h>

int main() {
	int n, index = 0, temp;
	printf("enter n(n是整数):");
	scanf("%d", &n);
	int a[n];
	printf("\n输入n的数组:");
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	for (int k = 0, i = 0; k < n - 1; k++) {
		index = k ;//这两行限制循环范围
		i = k + 1;
		for (; i < n; i++) {//找到最小的数字
			if (a[i] > a[index])//index表示最小元素的下标
				index = i;
		}
		temp = a[index];
		a[index] = a[k];
		a[k] = temp;
	}
	//printf("\n数组排序后为:");
	for (int i = 0; i < n - 1; i++) {
		printf("%d ", a[i]);
	}
	printf("%d", a[n - 1]);
}

求一批整数中出现最多的个位数字,算法描述:

1.输入数组a[n],由于switch{case :}    结构分类太多,为了确保代码的简洁性,我们在定义一个数组b[10],长度为10,元素为0到9            2.对数组a中的任意元素,我们进行%10的操作,同时/10;来取出每一位。对数组b,因为其中的元素确定,所以我们   b[a[n]%10]++;来保证0到9的计数。        3.定位输出,输出最大次数和对应数字,最大次数我们找b[10]中函数值最大的,赋值给max,在通过比较与max函数值相等的b[m],来输出对应下标。因为while结构里面没有=0这一项,所以我们专门列出来a[n]==0;b[0]++;

/* 求一批整数中出现最多的个位数字##23*/
#include <stdio.h>

int main() {
	int n = 0, b[10] = {0};
	scanf("%d", &n);
	int  a[n];
	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	for (int i = 0; i < n; i++) {
		if (a[i] == 0)
			b[0]++;
		while (a[i] > 0) {
			b[a[i] % 10]++;
			a[i] = a[i] / 10;
		}
	}
	int max = 0;
	for (int i = 0; i < 10; i++) {
		if (max < b[i])
			max = b[i];
	}
	printf("%d:", max);
	for (int i = 0; i < 10; i++) {
		if (max == b[i])
			printf(" %d", i);
	}
}

判断上三角矩阵(对角线下面的数字为0即是)

主要注意一下:1.输出放在算法都结束最后,因为有多次判断,每次一输出,所以要为其在添一个for循环        2.输入数组的时候二维数组本来就是行列排好了的,不用加换行符。        3.利用flag来决定是不是,(是不是上三角矩阵)

/*判断上三角矩阵(对角线下面的数字为0即可)##24*/
#include <stdio.h>

int main() {
	int n, i = 0, j = 0, x = 0, flag = 1;
	scanf("%d", &x);
	for (int i = 1; i <= x; i++) {
		scanf("%d", &n);
		int a[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				scanf("%d", &a[i][j]);
				//if ((i + 1) % n == 0)
					//printf("\n");
			}
		}
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				if (j < i && a[i - 1][j - 1] != 0)
					flag = 0;
			}
		}
		if (flag == 0)
			printf("NO\n");
		else
			printf("YES\n");
        flag=1;
	}
	return 0;
}

求矩阵各行元素之和 

/*求矩阵各行元素之和##25*/
#include <stdio.h>

int main() {
	int m, n, sum = 0;
	scanf("%d %d", &m, &n);
	int a[m][n];
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			scanf("%d", &a[i - 1][j - 1]);
		}
	}
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			sum = sum + a[i - 1][j - 1];
		}
		printf("%d\n", sum);
		sum = 0;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值