实验6 数组和字符串
【实验目的】
①掌握一维数组和二维数组的基本操作(定义、初始化、输入、赋值、输出)。
②掌握字符数组和字符串函数的使用。
③掌握与数组有关的常用算法(排序、查找、数组元素的插入和删除)。
【实验6.1】从键盘输入10个整数存入数组a中,然后输出该数组各个元素,并求其中的最大值、最小值和平均值。
【提示】
(1) 通过循环输入10个整数并存入数组a.。
(2)以a[0]作为最大值、最小值及累加和的初始值,用数组的下标和循环相结合,求出
数组的最大值、最小值和平均值。
(3)输出数组各元素,并输出最大值、最小值和平均值。
注意:平均值是通过除法完成的,应选用适当的数据类型。
答案:#include<stdio.h>
void main()
{int a[10],max,min,sum,i;
float aver;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("%d",a[i]);
sum=0;
for(i=0;i<10;i++)
sum=sum+a[i];
aver=sum/10.0;
max=a[0];min=a[0];
for(i=0;i<10;i++)
{ if(max<a[i])
max=a[i];
if(min>a[i])
min=a[i];
}
printf("max=%d,min=%d,aver=%f",max,min,aver);
}
【实验6.2】实行学分制,学生的平均绩点是衡量学生学习的重要依据。
成绩等级与绩点的关系如下表所示:
平均绩点=∑∑⨯所学各课程的学分点绩所学各课程学分
编一程序利用两个一维数组分别输入某学生20门课程的学分xf[20]和对应成绩score[20],计算其平均绩点aver 。
【指导】本题是一个求数组元素累加和的问题。
(1)定义数组及相关的变量:20门课程的成绩用数组score[20]表示,20门课程的学分用数组xf[20]表示。
(2)输入20门课程的成绩及其对应学分保存在数组中。
(3)计算20门课程的学分之和sumxf ,并根据成绩的档次分别取不同的绩点计算所有课程的学分与绩点的乘积之和sumscore 。
(4)平均绩点aver=sumscore/sumxf 。
【参考程序】
#include <stdio.h>
void main()
{ float score[20],sumscore=0.0F,sumxf=0.0F,aver;
int i,jd,xf[20];
for (i=0; i<20; i++)
scanf("%f%d",&score[i],&xf[i]);
for (i=0; i<20; i++)
{ sumxf=sumxf+xf[i]; //计算学分和
if (score[i]>=90) //由成绩确定绩点
jd=4;
else if (score[i]>=80)
jd=3;
else if (score[i]>=70)
jd=2;
else if (score[i]>=60)
jd=1;
else
jd=0;
sumscore=sumscore+xf[i]*jd; //计算学分与绩点的乘积和
}
aver=sumscore/sumxf; //计算平均绩点
printf("%.2f\n",aver);
}
【实验6.3】请编写程序,它的功能是: 将M 行N 列的二维数组中的数据, 按列的顺序依次放到一维数组中。
例如, 二维数组中的数据为:
33 33 33 33
44 44 44 44
55 55 55 55
则一维数组中的内容应是:
33 44 55 33 44 55 33 44 55 33 44 55。
【提示】
(1)定义int 型数组a[M][N]及b[M*N](M 、N 用符号常数定义)。
(2)输入二维数组的实际行数和列数,以及二位数组的所有元素。
(3)通过二重循环将二维数组a 中各列的元素依次赋值到一维数组b 中(b 的下标要逐次增加)。
(4)按矩阵的形式输出二维数组a 及一维数组的各个元素。
【实验6.4】编制程序,从num 个(num 的值通过键盘输入来指定)字符串中找出最长的一个字符串,并将输出该最长的字符串及其在数组中的位置。
例如,输入的字符串为:
Pascal
Fortran
Cobol
Lisp
Ada
则应输出:
最长的字符串是:Fortran,它位于数组的第2行。
【提示】
(1)定义符号常数M 为10、整型变量num 、字符型数组str[M][80]。
(2)输入num 的值,它代表要实际输入的字符串的个数
(3)依次输入num 个字符串存放在 str 中。
(4)依次计算str 中每个字符串的长度,并从中找出最长的字符串,记下它在数组中的下标。
(5)输出结果。
【实验6.5】编制程序自动生成如下N ×N 矩阵,然后将数组的第一行与倒数第一行的元素对调,将第二行元素与倒数第二行元素对调,并输出对调后的矩阵。
⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎣⎡=16151413121110987654321A 【指导】
(1) 可以用a[i][j]=i*4+j+1自动生成上述矩阵。
(2) 为了实现第i 行元素与倒数第i 行元素交换,令i 从1变化到N/2,使a[i][j]与a[N-1-i][j]交换。
【参考程序】
#include <stdlib.h>
#define N 4
void main()
{ int a[N][N],i,j,k;
for (i=0; i<N; i++)
for (j=0; j<N; j++)
a[i][j]= i*4+j+1; //自动生成矩阵
for (i=0; i<N/2; i++)
for (j=0; j<N; j++)
{ k= a[i][j]; a[i][j]=a[N-i-1][j]; a[N-i-1][j]=k; } //行交换
for (i=0; i<N; i++) //输出交换后的矩阵
{ for (j=0; j<N; j++)
printf("%4d ", a[i][j]);
printf("\n");
}
}
【实验6.6】在字符串str 中删除变量c 中的字符,有几个删几个,并返回所删字符的个数。
例如,若输入到str 中字符串为"ab abc bcdef ",输入到ch 中的字符为'b',则应输出字符串"a ac cdef "和 3(表示删了3个字符' b')。
【提示】
(1)定义char 型数组str[80]、str1[80]和char 型变量ch ,其中,str 用来存放输入的原始字符串,str1用来存放结果,ch 用来存放输入的要被删除的字符。
(2)依次输入str 和ch 。
(3)从第一个字符开始顺序巡视str 中的各个字符,凡是与ch 不同的字符就存放到str1中(与ch 相同的字符则跳过)。
(4)当str 中的所有字符均被巡视完,将str1的末尾增加一个0字符。
str1即为所求的结果。
【实验6.7】编制程序利用初始化的方法生成如下4×4矩阵,然后将该矩阵的上三角形(不含主对角线元素)所有元素置0。
A=⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎣⎡7654654354324321 【提示】
该矩阵的特点是对称矩阵:上三角部分与下三角部分是对称的,对称轴为主对角线。
生成该对称矩阵的方法是:先生成上三角部分的各个元素,a[i][j]=i+j+1。
下三角部分元素的值通过对称关系确定。