数组练习
1、选择题
1.1、若有定义语句:int a[3][6]; ,按在内存中的存放顺序,a 数组的第10个元素是B
A)a[0][4] B) a[1][3] C)a[0][3] D)a[1][4]
1.2、有数组 int a[5] = {10,20,30,40,50}, 以下表达式编译错误是_____ _B______。
A) a ++ ;
B) a[5] = 20 ;
C) a + 20 ;
D) (a-3, a[3]) ;
1.3、以下错误的定义语句是 ___A____
A)int x[][3] = {{0},{1},{1,2,3}};
B)int x[4][3] = {{1,2,3},{1,2,3},{1,2,3},{1,2,3}};
C)int x[4][] = {{1,2,3},{1,2,3},{1,2,3},{1,2,3}};
D)int x[][3] = {1,2,3,4};
1.4、设int i,x[3][3]={1,2,3,4,5,6,7,8,9};则下面语句
for(i=0;i<3;i++)
printf(″%d, ″,x[i][2-i]);
的输出结果是 D
A)1, 4, 7 B)1, 5, 9 C)3, 6, 9 D)3, 5, 7
1.5、表达式“sizeof(int [1][2])/sizeof(int)”的值为__A___。
A) 2 B) 3 C) 4 D) 5
1.6有以下程序
#include main()
{ char s[]="012xy\07s34f4w2";
int i,n=0;
for(i=0;s[i]!=0;i++)
if(s[i]>='0'&&s[i]<='9')
n++;
printf("%d\n",n);
}
程序运行后的输出结果是______A______
A)0 B)3 C)7 D)8
1.7、有以下程序
#include
main( )
{ char s[ ]=”wstuv”; printf(“%c\n”,*s+2);
}
程序运行后的输出结果是A
A)t B) tuv C)y D)出错
1.8 数组 int a[5] = {10, 20, 30, 40,50}, 有以下语句,其输出___D____
printf(“%d\n”, *(&a +1) );
A) 20 B) 30 C) 随机值 D)编译报错
1.9 有以下程序A
# include
int main()
{ int s[12]={1,2,3,4,4,3,2,1,1,1,2,3}, c[5]={0,0,0,0,0}, i ;
for(i=0;i<12;i++) c[s[i]]++ ;
for(i=1;i<5;i++) printf(“%d,”,c[i]); printf(“\n”);
}
A) 4 ,3, 3, 2 B) 2 , 3, 4, 4
C) 1, 2, 3 ,4 D ) 4, 4, 2 ,3
1.10 有数组 int a[3][4] = {10,20,30,40,50,60,70,80,90,100,110,120},执行以下语句输出的是_____C__________
printf(“%d\n”, *(*a+2) + 3 );
A) 语句有错 B) 120 C) 30 D) 33
2、填空题
2.1、有以下程序
#include
main( )
{ int i,n[ ]={0,0,0,0,0};
for(i=1;i<=4;i++)
{n[i]=n[i-1]*3+1;
printf(“%d”,n[i]);}
}
程序运行后输出结果是 _40_________
2.2、执行以下程序的输出结果是_ .
#include
int main()
{ int i,n[4]={1,0,0,0};
for(i=1;i<=3;i++)
{ n[i]=n[i-1]*2+1; printf("%d",n[i]); }
}
3715
2.3、下面程序运行的结果为_________。
main()
{
int x[5],i;
x[0] = 1;x[1] = 2;
for(i = 2;i<5;i++) x[i] = x[i-1] + x[i-2];
for(i = 2;i<5;i++) printf(“%d”,x[i]);
}
358
2.4、有以下程序
#include <sthio.h>
int main()
{
int arr[] = {1,3,5,7,2,4,6,8}, i, start ;
scanf(“%d”, &start);
for(i=0,i<7,i+=2) 0 2 4 6
printf(“%d”,arr[(start+i)%5]);
}
若在程序运行时输入整数 10 <回车>,则输出结果为_______
1523
2.5下面程序运行的结果为_________。
#include "stdio.h"
main()
{ int i,j,a[]={0,2,8,4,5};
printf("\n");
for(i=1;i<=5;i++)
{ j=5-i;
printf("%2d",a[j]);
}
}
5 4 8 2 0
2.6有以下程序
#include
int main()
{ int n[2],i,j;
for(i=0;i<2;i++) n[i]=0; for(i=0;i<2;i++)
for(j=0;j<2;j++) n[j]=n[i]+1;
printf(“%d\n”,n[1]);
}
程序运行后的输出结果是 【2】
3、编程题
3.1、 一个班10个学生的成绩,存放在一个一维数组中,要求找出其中成绩最高的学生的成绩和该生的序号。试编程。(试着用下标法和地址法两种方法表示数组)
使用下标法表示数组:
#include
#define SIZE 10
int main() {
int scores[SIZE] = {85, 90, 76, 92, 88, 95, 82, 89, 91, 87};
int maxScore = scores[0];
int maxIndex = 0;
for (int i = 1; i < SIZE; i++) {
if (scores[i] > maxScore) {
maxScore = scores[i];
maxIndex = i;
}
}
printf("最高分数:%d\n", maxScore);
printf("最高分数学生的序号:%d\n", maxIndex);
return 0;
}
使用地址法表示数组:
#include
#define SIZE 10
int main() {
int scores[SIZE] = {85, 90, 76, 92, 88, 95, 82, 89, 91, 87};
int maxScore = *scores;
int maxIndex = 0;
for (int i = 1; i < SIZE; i++) {
if (*(scores + i) > maxScore) {
maxScore = *(scores + i);
maxIndex = i;
}
}
printf("最高分数:%d\n", maxScore);
printf("最高分数学生的序号:%d\n", maxIndex);
return 0;
}
这两种方法的实现逻辑是相同的,只是数组元素的访问方式不同。使用下标法可以通过 scores[i] 的方式直接访问数组元素,而使用地址法可以通过 *(scores + i) 的方式来访问数组元素。
3.2、有5个学生上4门课程,要求输入全部学生的各门课程成绩,然后输出各门课程的平均成绩,并按照各个学生的平均成绩排序(成绩最高的学生排在数组最前面,最低学生排在数组最后面的行) (试着用下标法和地址法两种方法表示数组)。
使用下标法表示数组:
#include
#define STUDENTS 5#define COURSES 4
void inputGrades(int grades[STUDENTS][COURSES]) {
printf("请输入各个学生的成绩:\n");
for (int i = 0; i < STUDENTS; i++) {
printf("学生 %d 的成绩:\n", i + 1);
for (int j = 0; j < COURSES; j++) {
scanf("%d", &grades[i][j]);
}
}
}
void calculateAverages(int grades[STUDENTS][COURSES], float averages[COURSES]) {
for (int j = 0; j < COURSES; j++) {
float sum = 0;
for (int i = 0; i < STUDENTS; i++) {
sum += grades[i][j];
}
averages[j] = sum / STUDENTS;
}
}
void sortByAverage(int grades[STUDENTS][COURSES], float averages[STUDENTS]) {
for (int i = 0; i < STUDENTS - 1; i++) {
for (int j = 0; j < STUDENTS - i - 1; j++) {
if (averages[j] < averages[j + 1]) {
float temp = averages[j];
averages[j] = averages[j + 1];
averages[j + 1] = temp;
for (int k = 0; k < COURSES; k++) {
int tempGrade = grades[j][k];
grades[j][k] = grades[j + 1][k];
grades[j + 1][k] = tempGrade;
}
}
}
}
}
void printAverages(float averages[COURSES]) {
printf("各门课程的平均成绩:\n");
for (int j = 0; j < COURSES; j++) {
printf("课程 %d 平均成绩:%.2f\n", j + 1, averages[j]);
}
}
void printGrades(int grades[STUDENTS][COURSES]) {
printf("按平均成绩排序后的学生成绩:\n");
for (int i = 0; i < STUDENTS; i++) {
printf("学生 %d 的成绩:", i + 1);
for (int j = 0; j < COURSES; j++) {
printf("%d ", grades[i][j]);
}
printf("\n");
}
}
int main() {
int grades[STUDENTS][COURSES];
float averages[COURSES];
inputGrades(grades);
calculateAverages(grades, averages);
sortByAverage(grades, averages);
printAverages(averages);
printGrades(grades);
return 0;
}
使用地址法表示数组:
#include
#define STUDENTS 5#define COURSES 4
void inputGrades(int *grades) {
printf("请输入各个学生的成绩:\n");
for (int i = 0; i < STUDENTS; i++) {
printf("学生 %d 的成绩:\n", i + 1);
for (int j = 0; j < COURSES; j++) {
scanf("%d", (grades + i * COURSES + j));
}
}
}
void calculateAverages(int *grades, float *averages) {
for (int j = 0; j < COURSES; j++) {
float sum = 0;
for (int i = 0; i < STUDENTS; i++) {
sum += *(grades + i * COURSES + j);
}
*(averages + j) = sum / STUDENTS;
}
}
void sortByAverage(int *grades, float *averages) {
for (int i = 0; i < STUDENTS - 1; i++) {
for (int j = 0; j < STUDENTS - i - 1; j++) {
if (*(averages + j) < *(averages + j + 1)) {
float temp = *(averages + j);
*(averages + j) = *(averages + j + 1);
*(averages + j + 1) = temp;
for (int k = 0; k < COURSES; k++) {
int tempGrade = *(grades + j * COURSES + k);
*(grades + j * COURSES + k) = *(grades + (j + 1) * COURSES + k);
*(grades + (j + 1) * COURSES + k) = tempGrade;
}
}
}
}
}
void printAverages(float *averages) {
printf("各门课程的平均成绩:\n");
for (int j = 0; j < COURSES; j++) {
printf("课程 %d 平均成绩:%.2f\n", j + 1, *(averages + j));
}
}
void printGrades(int *grades) {
printf("按平均成绩排序后的学生成绩:\n");
for (int i = 0; i < STUDENTS; i++) {
printf("学生 %d 的成绩:", i + 1);
for (int j = 0; j < COURSES; j++) {
printf("%d ", *(grades + i * COURSES + j));
}
printf("\n");
}
}
int main() {
int grades[STUDENTS][COURSES];
float averages[COURSES];
inputGrades(&grades[0][0]);
calculateAverages(&grades[0][0], &averages[0]);
sortByAverage(&grades[0][0], &averages[0]);
printAverages(&averages[0]);
printGrades(&grades[0][0]);
return 0;
}
这两种方法的实现逻辑是相同的,只是数组元素的访问方式不同。使用下标法可以通过 grades[i][j] 的方式直接访问数组元素,而使用地址法可以通过 *(grades + i * COURSES + j) 的方式来访问数组元素。