我感觉数组有点像函数,需要自变量和因变量,且有一定的关系【靠赋值建立起来的】, 切记编程中算法的运算操作是字母外表下的数字在进行判断!!或者是数字外表下的数字所做判断!
内含(使用数组的)源程序:斐波那契数列,顺序查找法,
说一下我写代码过程中发现的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;
}