实验四 一维数组、二维数组一、实验目的与要求1、熟练掌握一维数组、二维数组的定义、赋值和输入输出的方法。 2、掌握与数组有关的算法。二、实验内容1、(1)输入N个整数,使用冒泡排序,将数据由大到小输出。#include "stdafx.h"#include<stdio.h>void swap2(int*,int*)void bubble(int a[],int n)int main(void){ int n,a[8] int i printf("Enter n(n<=8):") scanf("%d",&n) printf("Enter a[%d]:", n) for(i=0i<ni++) scanf("%d", &a[i]) bubble(a,n)printf("After sorted,a[%d]=", n)for(i=0i<ni++) printf("%3d",a[i])return 0}void bubble(int a[],int n) /*n是数组a中待排序元素的数量*/{ int i,j for(i=1i<ni++) /*外部循环---请问这个嵌套循环怎么理解??*/ for(j=0j<n-ij++) /*内部循环---请问这个嵌套循环怎么理解??*/ if(a[j]>a[j+1]) swap2(&a[j],&a[j+1]) /*交换*/}void swap2(int *px,int *py) { int tt=*px*px=*py*py=t}单向冒泡排序法:
//输入10个整数,按从大到小输出//
#include<stdio.h>
void main()
{
int i,j,t,a[10]
printf("请输入10个整数\n")
for(i=0i<10i++)
scanf("%d",&a[i])
for(j=1j<10j++) //10个数要来回做(10-1)趟次//
for(i=1i<11-ji++) //第j趟要做(10-j)次比较//
if(a[i]>a[i-1]) //每做完一趟,就会将数组中较小的一个数沉淀下来,较大的数不断往上冒//
{t=a[i]a[i]=a[i-1]a[i-1]=t}printf("按从大到小排序输出结果是:\n")
for(i=0i<10i++)
printf("%-3d",a[i])
printf("\n")
}
双向冒泡排序法:
//输入10个整数,按从大到小输出//
#include<stdio.h>
void main()
{
int i,j,t,k,a[10]
printf("请输入10个整数\n")
for(i=0i<10i++)
scanf("%d",&a[i])
for(j=1j<10j++) //10个数要来回做(10-1)趟次//
{for(i=1i<11-ji++) //第j趟要做(10-j)次比较,双向冒泡法,是先从上至下两两比较一次//
if(a[i]>a[i-1]) //每做完一趟,就会将数组中较小的一个数沉淀下来,较大的数不断往上冒//
{t=a[i]a[i]=a[i-1]a[i-1]=t}
for(k=i-1k>0k--) //与单向冒泡不同的是,这是双向冒泡的关键,每一次从顶至下比较完一次后,同时再从下// if(a[k]>a[k-1]) //至上比较一次,也就是说每一趟数组中的元素两两比较了两次,这就是双向冒泡排序了//
{t=a[k]a[k]=a[k-1]a[k-1]=t}
}printf("按从大到小排序输出结果是:\n")
for(i=0i<10i++)
printf("%-3d",a[i])
printf("\n")
}
$(2)输入N个整数,使用改进的冒泡排序,将数据由大到小输出。#include "stdafx.h"#include<stdio.h>void swap2(int*,int*)void bubble(int a[],int n)int main(void){ int n,a[8] int i printf("Enter n(n<=8):") scanf("%d",&n) printf("Enter a[%d]:", n) for(i=0i<ni++) scanf("%d", &a[i]) bubble(a,n)printf("After sorted,a[%d]=", n)for(i=0i<ni++) printf("%3d",a[i])return 0}void bubble(int a[],int n) /*n是数组a中待排序元素的数量*/{ int i,j for(i=1i<ni++) /*外部循环---请问这个嵌套循环怎么理解??*/ for(j=0j<n-ij++) /*内部循环---请问这个嵌套循环怎么理解??*/ if(a[j]>a[j+1]) swap2(&a[j],&a[j+1]) /*交换*/}void swap2(int *px,int *py) { int tt=*px*px=*py*py=t}2、*******输入N-1个整数组成一数列,再输入某数x,先将数列排序,根据x的值插入到有序数列中。#include<stdio.h> main () { void Rank(int N,int n[]) int i,j,k int n[11] printf("请输入10个整数:") for(i=0i<10i++) scanf("%d",&n[i]) Rank(10,n) //调用函数对输入的数组排序printf("\n请输入需要插入的整数:") scanf("%d",&k) if(k>n[9]) n[10]=k else { for(i=0n[i]<=ki++) for(j=9j>=ij--) n[j+1]=n[j] //腾出位置,用以插入所输入的数n[i]=k } printf("\n排序后此数列按升序排列为:") for(i=0i<=10i++) printf("%-4d",n[i]) } void Rank(int N,int n[]) { int i,k,iTemp for(k=1k<=N-1k++) for(i=N-1i>=ki--) if(n[i-1]>n[i]) { iTemp=n[i] n[i]=n[i-1] n[i-1]=iTemp } printf("排序后此数列按升序排列为:") for(i=0i<=N-1i++) printf("%-4d",n[i]) printf("\n") }3、输入行数n,打印出杨辉三角。#include <stdio.h>
int main()
{
int yh[101][101]={{},{0,1}},i,n,m
scanf("%d",&m) /*输入要打印的行数,,,不能太大。。我水平不高。。*/
for(i=2i<=mi++)
{
yh[i][1]=yh[i][i]=1
for(n=2n<in++)
{
yh[i][n]=yh[i-1][n-1]+yh[i-1][n]
}
}
for(i=1i<=mi++)
{
for(n=1n<=in++)
{
printf("%d ",yh[i][n])
}
printf("\n")
}
return 0
}
#include<stdio.h>#include<math.h>main(){ int a[8][8],i,j for(i=0i<8i++){for(j=0j<8j++) if(j==0) a[i][j]=1else if(i==j) a[i][j]=1else if(i>j&&j>=1)a[i][j]=a[i-1][j]+a[i-1][j-1]else a[i][j]=0} for(i=0i<8i++) {for(j=0j<=ij++) printf("%3d",a[i][j]) printf("\n") }}4、青年歌手参加歌曲大奖赛计分系统(1)有N个评委进行打分,求这位选手的平均得分(去掉一个最高分和一个最低分)。#include <stdio.h>#include <stdlib.h>#include <time.h>void bubble_sort(int a[],int n){ int i,j, itmp for (i =0 i<ni++) { for(j=i+1 j<nj++) { if( a[i] >= a[j]) { itmp = a[j] a[j] = a[i] a[i] = itmp } } } }int main( int argc, char **argv){ int iguide[10] = {0} srand((unsigned )time(NULL)) for (int i = 0 i< 8i++) { int isum = 0 for (int j = 0 j< 10 j++) { iguide[j] = rand()%10 +1 } bubble_sort(iguide,10) for (int l = 1l<=8 l++) { isum += iguide[l] } printf("The avg score the %d singer get is %d \n" ,i+1,isum/8) } return 0}$(2)有N个评委进行打分,求M个选手每个人的平均得分(去掉一个最高分和一个最低分),并按平均得分由高到低排序输出。#5、输入N个整数,使用选择排序,将数据由大到小输出。#include <stdio.h>//冒泡法(指针)main(){ int a[10] int i,j,temp int *p=a printf("input:") for(i=0i<10i++) scanf("%d",p+i) for(i=1i<10i++) for(j=0j<10-ij++) if(*(p+j)>*(p+j+1)) {temp=*(p+j)*(p+j)=*(p+j+1)*(p+j+1)=temp} for(i=0i<10i++) printf("%4d",*(p+i)) printf("\n")}补充作业实验题:1.输入10个数,按小到大排序。#include<stdio.h>main(){ int i,j,temp,a[10],n for(i=0i<10i++) scanf("%d",&a[i]) for(i=0i<=8i++){ for(j=i+1j<10j++) if(a[i]>a[j]){ temp=a[i] a[i]=a[j] a[j]=temp} } for(i=0i<10i++) printf("%5d",a[i])printf("\n")scanf("%d",&n) if(n>a[9]) a[10]=n else { for(i=0i<9i++) if(a[i]>n) {for(j=9j>=ij--) a[j+1]=a[j] a[i]=n break } }printf("11shu\n") for(i=0i<=10i++) printf("%4d",a[i])}2.求10个数中大于平均值的数的个数#include <stdio.h>void main(){float a[10],sum,averageint isum=0.0printf("请输入十位数:\n")for(i=0i<10i++)scanf("%f",&a[i])for(i=0i<10i++)sum=sum+a[i]average=sum/10sum=0.0for(i=0i<10i++)if(a[i]>=average)sum=sum+a[i]printf("%.5f",sum)}3.求出大于m并且紧随m的n个素数,并存入数组中,输出,m和n从键盘输入。4.将一个数组中的值按逆序重新存放。#include<stdio.h>main(){ int a[5], i, temp /*定义数组及变量为基本整型*/ printf("please input array a:\n") for (i = 0 i < 5 i++) /*逐个输入数组元素*/ scanf("%d", &a[i]) printf("array a:\n") for (i = 0 i < 5 i++) /*将数组中的元素逐个输出*/ printf("%d ", a[i]) printf("\n") for (i = 0 i < 2 i++) /*将数组中元素的前后位置互换*/ { temp = a[i] /*元素位置互换的过程借助中间变量temp*/ a[i] = a[4-i] a[4-i] = temp } printf("Now array a:\n") for (i = 0 i < 5 i++) /*将转换后的数组再次输出*/ printf("%d ", a[i])}三、源程序四、程序结果五、总结中国物联网校企联盟技术部
一般有四种数组定义方式,以一维数组为例://定义指定维数的数组int arr[10]//定义不指定维数的数组,数组维数有初化列表元素个数决定。 int arr[] = {1,2,4}//定义指定维数的数组,初始化不完全时,系统将未初始化元素初始化为0int arr[10] = {1,2}//动态分配一个数组。
数组实例:
# include <stdio.h>
int main(void)
{
int i,a[8] = {1,2,3,4,5,6,7,8}
for(i = 0i <8i++)
printf("数组元素a[%d] = %d \n",i ,a[i])
return 0
}