1..已有一个排好序的数组(共10个数,从键盘读入),再输入一个数,要求按次序规律将它插入到数组中并输出结果。(需要注意的是b所属不同位置的特殊情况的考量)
要求:严禁采用捷径编程方法
运行结果示例:
#include <stdio.h>
int main()
{
int i,j,b,temp;
int a[10];
printf("输入数组10个元素的值:") ;
for(i = 0;i < 10;i++)
scanf("%d",&a[i]);
printf("输入要插入数据的值:");
scanf("%d",&b);
for(i = 0;i <= 10;i++){
if(b <= a[i]){
for(j = 10;j > i;j--){
a[j] = a[j-1];//先最后一个元素开始顺次后移
}
a[i] = b;//把指定元素b进行插入
break;
}
if(b == a[9])//如果最后一个元素和b相等
a[10] = b;//b放在最后一个元素
if(b>a[9])
a[10] = b;//这种情况同上
}
printf("结果是:");
for(i = 0;i <= 10;i++)
printf("%d ",a[i]);
return 0;
}
2..从键盘输入5名学生3门课程的成绩,然后将每门成绩的最高分和最低分输出。
要求:此题应使用二维数组
运行结果示例:
#include<stdio.h>
int main()
{
int a[5][3],max,min,i,j;//五个学生三门课
printf("输入学生成绩:");
for(i=0;i<5;i++)
{
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);//读入学生的成绩
}
printf("成绩汇总输出:\n");
printf(" 最高分 最低分\n");
for(j=0;j<3;j++)
{
max=a[j][0];
min=a[j][0];//给三门课的最大值和最小值依次赋初值,外循环三次,一次一门课
for(i=0;i<5;i++)//对于每门课进行选择法排序
{
if(a[i][j]>max)
{
max=a[i][j];
}
if(a[i][j]<min)
{
min=a[i][j];
}
}
printf("课程%d %d %d",j+1,max,min);//由于j的起始值是1所以j+1
printf("\n");
}
return 0;
}
3、随机产生包含10个数据的一位整型数组,用选择排序法对其进行排序后输出。
选择排序的算法分析:
⑴ 从所有n个待排序元素中选择最小的值,将它与a[0]交换;
⑵ 从剩下的n-1个元素中选择最小的值,将它与a[1]交换;
⑶ 重复上述操作直到剩下两个元素时,选择其中最小的与a[n-1]交换。
#include <iostream.h>
#include <iomanip.h>
#include <time.h>
#include <stdlib.h>
void main()
{
int a[10],i,j,t;
srand(time(NULL));//生成随机数防止重复的套路操作
for(i=0;i<10;i++)
a[i]=rand()%100;//生成10个1~100的随机数
for(i=0;i<10;i++)
cout<<setw(5)<<a[i];//输出已经建立完成的数组
cout<<endl;
for(i=0;i<10;i++)//外循环从第一个数开始
for(j=i+1;j<10;j++)//内循环从第二个数开始
if(a[j]<a[i])
{ t=a[i];
a[i]=a[j];
a[j]=t;
}//选择法(一瓶酱油一瓶醋)
for(i=0;i<10;i++)
cout<<setw(5)<<a[i];//输出排序完成的数组
cout<<endl;
}
4.已有两个数组a和b都是按由小到大顺序排列的有序数组(其中数组a有M个数,数组b有N个数),编写程序,将a、b两个数组合并后送入数组c,并使c也按由小到大排列。
要求:将数组元素的个数值定义为符号常量,例如:# define M 7
运行结果示例:
作业3
#include <stdio.h>
#define M 7
#define N 5
int main()
{
int i = 0, j = 0, arra[M]={0}, arrb[N]={0}, arrc[M+N]={0}, k = 0, t = 0;
printf("Input array a<%d个元素>: ",M);
for (i = 0; i < M; i++)
{
scanf("%d", &arra[i]);
}
printf("Input array b<%d个元素>:",N);
for (i = 0; i < N; i++)
{
scanf("%d", &arrb[i]);
}//先向数组a和数组b依次读入元素
i=0;
j=0;
for (k = 0; k < M+N; k++)//外循环是M+N次,目的是创建一个新的数组
{
if (arra[i] == 0)//如果a数组中的数据是0,说明这个数组没用啦,只需要把b数组的元素拷给空的数组
{
for (t = j + i; t < M + N; t++)
{
arrc[t] = arrb[j];
j++;
}
}
else if (arrb[j] == 0)//这个同理可证
{
for (t = j + i ; t < M + M; t++)
{
arrc[t] = arra[i];
i++;
}
}
else
{
if (arrb[j] <= arra[i])
{
arrc[k] = arrb[j];每次都对a和b数组中的对应值进行判断,把较小的值,暂时拷给c
j++;//b数组执行下一个元素
}
else
{
arrc[k] = arra[i];
i++;
}
}
}
for (i = 0; i < M + N; i++)
{
printf("%d ", arrc[i]);
}
return 0;
}