首页 > 其他 > 详细

实验四

时间:2019-04-26 00:23:54      阅读:134      评论:0      收藏:0      [点我收藏+]

Part 1:数组数据结构

 

源代码 运行结果 数据类型 内存空间
#include <stdio.h>
const int N=5;
int main() {
int a[N] = {1, 2, 3, 4, 5}; 
int i;
for(i=0; i<N; i++)
printf("%d: %d\n", &a[i], a[i]);
return 0;
}

 

技术分享图片 int 4字节
#include <stdio.h>
const int N=5;
int main() {
char a[5] = {h,e,l,l,o};
int i;
for(i=0; i<N; i++)
printf("%d: %c\n", &a[i], a[i]);
return 0;
}

 

技术分享图片 char 1字节
#include <stdio.h>
const int N=5;
int main() {
double a[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
int i;
for(i=0; i<N; i++)
printf("%d: %.2f\n", &a[i], a[i]);
return 0;
}

 

技术分享图片 double 8字节

由上述对比我们可以发现:虽然类型不同数组所占内存大小不同,但是它们的存放顺序总是连续的。

Part 2:一维数组的定义、初始化以及数组元素的引用方法

Ⅰ. 一维数组的声明形式法:数组元素的类型说明符+数组名称+[数组的大小]。

    p.s.大小为n的一维数组,下标为0~n-1

Ⅱ.一维数组全体元素初始化的方式:各元素的值(也可以是表达式)顺序排在一对花括号里,用逗号分隔。

    此外,利用数组下标的变化特性,使用for循环,可以使得输出数组元素的代码更简洁。

    p.s.数组在初始化时也可以不写数组的大小。但只有当对所有数组元素初始化的时候,才可以省略数组大小。

Ⅲ.在对数组初始化时,如果只初始化一部分元素,那么剩余没有被初始化的元素值系统自动设为0。

Part 3:数组作为函数参数

// 示例:数组名作为函数实参
#include <stdio.h>
const int N=5;
void init(int a[],int n, int value); // 函数声明
int main() {
int b[N],i;
init(b,N,-1); // 函数调用
for(i=0;i<N;i++)
printf("%3d",b[i]);
return 0;
}
// 函数定义
// 函数功能描述: 把一个含有n个元素的整型数组的元素值全都设为value
void init(int a[], int n, int value) {
int i;
for(i=0;i<n;i++)
a[i] = value;
}

技术分享图片

结合程序可知,函数调用时,参数传递过程如下:

       在main()函数中调用init(b,N,-1)之前,设内存空间示意图如左侧图所示,系统为整型数组b分配了一组连续内存空间,用于存放5个整型元素。假设,起始地址编号是0。在c语言中,数组名代表的是数组所占用的这段连续空间的首地址,这里,即b是0。

        当发生函数调用时,即init(b,N,-1);被执行时,将发生函数调用,转入子函数init()去执行。结合右侧示意图,此时,编译系统为形式参数a,n,value分配空间,同时,把实际参数b,N,-1的值拷贝给形式参数a,n,value.由此,形式参数a,n,value分别获得了值0,5,-1。

(p.s.形参里出现的数组名,实际上是代表的是一个地址变量,用来存放地址。换句话说,实参数组b和形参数组a对应的是同一组内存空间)

技术分享图片

p.s.注意:函数名作为参数时,实参和形参的书写形式

      1、函数声明和函数定义中,函数名init后面括号里出现的是形式参数,数组名后面要加[ ]。

      2、函数调用中,函数名init后面括号里出现的是实际参数,直接写数组名。

Part 4:用冒泡法对一组数据由小到大排序

假设要对n个数由小到大排序,使用冒泡法具体排序过程如下:

第1遍: 对n个数进行第1遍扫描

           比较第1个数与第2个数,若a1>a2,则交换;此时,a2中存放a1和a2两个数当中的最大值。

           比较第2个数与第3个数,若a2>a3,则交换;此时,a3中存放a2和a3两个数当中的最大值。

           依次类推…

           比较第n-1个数和第n个数,若an-1>an ,则交换;此时,an中存放an-1和an当中的最大值。

           经过(n-1)次比较后,最大的数被放在an

第2遍: 前面n-1个数进行第2遍扫描:

           …

           经过(n-2)次比较后,第2大的数被放在an-1

           … …

第n-1遍: 对前面2个数进行第n-1遍扫描

            …

           经过1次比较后,第2小的数被放a2

           至此,排序过程结束。

           总结: 用冒泡法对n个数小→大排序,

           共需扫描(n-1)遍,第i遍扫描时需要比较(n-i)次

(中心思想:把一组数据中相邻的两个数进行比较,较大的数放到后面。)

示例:

// 对一组整型数据由小到大排序(采用冒泡排序算法)
#include <stdio.h>
const int N=5;
void bubbleSort( int [], int); // 函数声明
int main() {
   int i,a[N];
   printf("请输入%d个整型数据: \n", N);
   for(i=0; i<N; i++)
      scanf("%d",&a[i]);
   printf("排序前的数据: \n");
   for(i=0; i<N; i++)
      printf("%d ",a[i]);
   printf("\n");
   bubbleSort(a,N); // 调用函数bubbleSort()对数组a中的N个元素排序
      printf("排序后的数据: \n");
   for(i=0; i<N; i++)
      printf("%d ",a[i]);
   printf("\n");
   return 0;
}
// 函数定义
// 函数功能描述:对一组整型数据由小到大排序
// 形参描述:x是待排序的数组名,n是数组中元素个数
// 排序算法:冒泡法
void bubbleSort( int x[], int n) {
int i,j,t;
   for (i=0; i<n-1; i++) {
      for(j=0; j<n-1-i; j++) {
         if( x[j] > x[j+1] ) {
            t = x[j];
            x[j] = x[j+1];
            x[j+1] = t;
         }
      }
   }
}
// 注意内外层循环i和j开始和结束的边界条件

技术分享图片

Part 5:编程练习

  • 练习1:补全程序,查找一组整型数据的最大值。

源代码:

#include <stdio.h>
int findMax(int a[], int n); 
const int N=5;
int main() {
    int a[N];
    int max, i;
    printf("输入%d个整数: \n", N);    
    for(i=0;i<N;i++)
        scanf("%d",&a[i]);
    max=findMax(a,N);
    printf("数组a中最大元素值为: %d\n\n", max);     
    return 0;
} 
int findMax(int a[],int n){
    int i,max;
    max=a[0];
    for(i=0;i<N;i++){
        if(a[i]>max)
            max=a[i];
    }
    return max;
}

运行结果:

技术分享图片

  • 练习2:补全程序,使用冒泡法对字符数组由大到小排序。

源代码:

#include <stdio.h>
const int N=4;
void output(char x[], int n); 
void rank(char x[],int n);
int main() {
    char string[N] = {2,0,1,9};
    int i;
    printf("排序前: \n");
    output(string, N);
    rank(string,N);
    printf("\排序后: \n"); 
    output(string, N);
    printf("\n");
    return 0;    
}
void output(char x[], int n) {
    int i;
    for(i=0; i<N; i++)
        printf("%c", x[i]);
} 
void rank(char x[],int n){
    int i,j;
    char temp;
    for(i=0;i<N;i++){
        for(j=0;j<N-i-1;j++){
            if(x[j]<x[j+1]){
                temp=x[j];
                x[j]=x[j+1];
                x[j+1]=temp;
            }
        }
    }
}

运行结果:

技术分享图片

实验总结与体会

        主要还是数组的下标范围时不时注意不到,还有就是对冒泡法的边界条件的认识不清。总之只有多练习才是一切的根本。

技术分享图片

实验四

原文:https://www.cnblogs.com/jiyuan201088/p/10770693.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!