导例
问题描述:如何存储和操作某班的c语言考试成绩?
#include <stdio.h>
int main()
{
int score[10] = {82,76,69,92,53,78,80,88,65,72};
int i, t;
for(i = 0; i < 9; i++) //输出数组中的所有元素
{
printf("%d ", score[i]);
}
printf("\n");
score[4] = 60; //更改数组中第五项的乘积
t = score[1]; //交换数组中的第二项和第七项
score[1] = score[6];
score[6] = t;
for(i = 0; i< 9; i++) //重新输出数组中的元素
{
printf("%d ", score[i]);
}
printf("\n");
return 0;
}
练习
问题:某电视台要进行一次对该台8个栏目(设相应栏目编号为1~8)的受欢迎情况,共调查了1000位观众。现要求编写程序,输入每一位观众的投票,每位观众只能选择一个最喜欢的栏目投票,统计输出各栏目的得票情况。
#include <stdio.h>
int main()
{
int prog[9];
int i, j, n;
for(i = 1; i <= 8; i++)
{
prog[i] = 0;
}
for(j = 1; j <= 5; j++)
{
printf("请输入最喜欢的栏目编号:");
scanf("%d", &n);
prog[n]++;
}
for(i = 1; i <= 8; i++)
{
printf("%d %d\n", i, prog[i]);
}
return 0;
}
将数组当作一个计数器,数组中数字增加的时候可以直接prog[n]++,n对应着需要增加的序号
使用一维数组编程
练习1
问题:定义一个长度是10的数组,输入一个正整数n (1<n≤10),再输入n个整数存入数组,输出平均值(保留2位小数)。
#include <stdio.h>
int main()
{
int a[10];
int n, m, i, j;
float sum = 0, ave;
scanf("%d", &n);
for(i = 1; i <= 10; i++)
{
a[i] = 0;
}
for(j = 1; j <= n; j++)
{
scanf("%d", &m);
a[j] = m;
sum = sum + a[j];
}
ave = sum / n;
printf("ave=%.2f\n", ave);
return 0;
}
练习2
问题:用数组计算fibonacci数列的前10个数,并按每行打印5个数的格式输出。
#include <stdio.h>
int main()
{
int fib[10];
int i;
for(i = 0; i < 10; i++)
{
fib[i] = 0;
}
fib[0] = 1;
fib[1] = 1;
for(i = 2; i < 10; i++)
{
fib[i] = fib[i-1] + fib[i-2];
}
for(i = 0; i < 10; i++)
{
printf("%6d ", fib[i]);
if((i + 1) % 5 == 0)
{
printf("\n");
}
}
return 0;
}
在上述代码中对数组的初始化可以进行简化,在定义的时候直接将Fibonacci数列的前两项输入进去,剩下的项就默认为0。
#include <stdio.h>
int main()
{
int fib[10] = {1,1};
int i;
for(i = 2; i < 10; i++)
{
fib[i] = fib[i-1] + fib[i-2];
}
for(i = 0; i < 10; i++)
{
printf("%6d ", fib[i]);
if((i + 1) % 5 == 0)
{
printf("\n");
}
}
return 0;
}
同时要注意在判断每行的个数时要把下角标加1
练习3
问题:输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。
#include <stdio.h>
int main()
{
int a[5];
int n, x, i, flag;
printf("请输入5个整数:");
for(i = 0; i < 5; i++)
{
scanf("%d", &n);
a[i] = n;
}
printf("请输入一个数:");
scanf("%d", &x);
for(i = 0; i < 5; i++)
{
if(x == a[i])
{
printf("%d\n", i);
flag = 1;
}
}
if(flag != 1)
{
printf("Not Found\n");
}
return 0;
}
flag用于记录循环中满足条件的数
练习4
问题:输入n(n<10),再输入n个数。(1) 输出最小值和它所对应的下标 (2) 将最小值与第一个数交换,输出交换后的n个数。
#include <stdio.h>
int main()
{
int a[9] = {0};
int n, min, i, t, x;
printf("请输入一个小于十的数:");
scanf("%d", &n);
min = a[0];
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
if(min > a[i])
{
min = a[i];
x = i;
printf("最小值为%d, 下标为%d\n", min, x);
}
}
t = a[x];
a[x] = a[0];
a[0] = t;
for(i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
练习5
问题:输入一个正整数n(1<n<=10),再输入n个整数,将它们存入数组a中,再输入一个整数x,然后在数组a中查找与x相同的元素。如果找到,输出x在数组a中对应元素的最小下标,如果没有找到,输出相应信息。
#include <stdio.h>
int main()
{
int a[10] = {0};
int n, x, i, flag;
printf("请输入一个在2-10之间的正整数:");
scanf("%d", &n);
printf("请输入%d个数:", n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
printf("请输入一个数:");
scanf("%d", &x);
flag = 0;
for(i = 0; i < n; i++)
{
if(x == a[i])
{
flag = 1;
break;
}
else
{
flag = 0;
}
}
if(flag == 1)
{
printf("%d:a[%d]\n", x, i);
}
else
{
printf("%d:not found\n", x);
}
return 0;
}
练习6
问题:输入一个正整数n (1<n<=10),再输入n个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。
#include <stdio.h>
int main()
{
int a[10] = {0};
int n, min, max, t, u, i, x, y;
printf("请输入一个在2-10之间的整数:");
scanf("%d", &n);
printf("请输入%d个整数:", n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
min = a[0]; //(1)
max = a[n-1]; //(1)
x = 0; //(2)
y = n-1; //(2)
for(i = 0; i < n; i++)
{
if(min > a[i])
{
min = a[i];
x = i;
}
if(max < a[i])
{
max = a[i];
y = i;
}
}
t = a[0];
a[0] = a[x];
a[x] = t;
u = a[n-1]; //(3)
a[n-1] = a[y];
a[y] = u;
for(i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
注:
- 在(1)的两行要放在给数组输入数据之后,因此跟第一段循环和第二段循环只能分开编写
- 在(2)的两行要注意事先对索引进行定义,否则如果出现最小值在第一位或者最大值在最后一位的情况的时候,程序跳过内部的if循环,则x与y便没有了定义。
- 在(3)的位置要注意数组的最后一位是输入的数组个数-1,即数组若有n位,则最后一位应为a[n-1]
选择排序法
利用数组给一串数进行从小到大的排序可以利用选择排序法。
选择排序法:
因此,n个数需要选择排序n-1次
流程图:
代码:
#include <stdio.h>
int main()
{
int a[1000] = {0};
int n, k, i, index, t;
printf("请输入需要排序的数量:");
scanf("%d", &n);
printf("请输入需要排序的数组:");
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for(k = 0; k < n - 1; k++)
{
index = k;
for(i = k + 1; i < n; i++) //(1)
{
if(a[i] < a[index])
{
index = i;
}
}
if(index != k)
{
t = a[index];
a[index] = a[k];
a[k] = t;
}
}
for(i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
整个代码的逻辑分为两步。首先外循环是选择排序法整体需要进行的次数,即n-1次。其次内循环是找到最小值所在的角标,内循环找最小值角标的代码值得注意。