实验4

实验结论

  • Part1

运行结果中每个地址之间差4个字节,似乎就可以下定论“数组中每个元素之间差4个字节”,然而事实真的是如此吗?

#include <stdio.h>
int main() {
double a[5] = {1.2, 2.3, 3.4, 4.5, 5.6}; // 定义一维数组a,包含5个浮点型数据,并对其初始化
int i;
// 以"地址:值"的形式打印数组a中每一个数据元素的地址,和数据元素值
for(i=0; i<5; i++)
printf("%d: %lf\n", &a[i], a[i]);
return 0;
}

不妨运行如上代码,看看每个地址之间的差值

  • Part2-4

数组作为函数参数时有很多写法,int a[],int *a等等,请注意:当二维数组a[][]作为参数时,a[][x]中的x必须填写,而第一个空则可不填。

正如pdf所说,形参的数组名代表的是一个地址变量,因此会有如下的区别。

#include<stdio.h>
 void   swap(int x,int y)
 {
     int z;
      z=x;         x=y;       y=z;
}
int main()
{
      int a,b;
      a=10;    b=20;
      swap(a,b);
      printf("a=%d\tb=%d\n",a,b);
      return 0;
}

此处就和数组的调用截然不同。

请另外注意:

(a+i)是整个第i行的地址 

*(a+i)就表示第i行首元素的地址

*(a+i) + j 就是 &a[i][j]

*( *(a+i) + j) 就是a[i][j]元素的值

对排序的整理如下:

①简单排序法

#include <stdio.h>
void sort(int a[ ],int n)       //简单选择排序法
{ int k;
  for(int i=0; i<n-1; i++)
  {k=i;
   for(int j=i+1;j<n;j++)
    if(a[k]>a[j])  k=j;//此处将a[k]和a[k+1],a[k+2],……a[n-1]进行比较找出最小的那个
   if(k!=i)
    {temp=a[i];  a[i]=a[k];  a[k]=temp;}}//此处将最小的放在了a[i]
  }

void print(int b[ ], int n)
{for( int i=0; i<n; i++)
     printf(“%6d”, b[i]);}
void main()
{int a[ ]={6,3,1,2,5,0,9,3,7,6};
  sort(a,10);
  print(a,10);
}

②冒泡排序法

#include <stdio.h>
void sort(int a[ ], int n)
{int temp;
  for( int i=0; i<n-1; i++)
  {for( int j=0; j<n-i-1; j++)
    {if(a[j]>a[j+1])
      {temp=a[j];  a[j]=a[j+1];  a[j+1]=temp;}}
  }}
void print(int b[ ], int n)
{for(int i=0; i<n ; i++)
  {printf("%6d", b[i]);}
}
int main()
{int a[10]={6,7,4,10,2,5,9,8,3,1};
 sort(a,10);
 print(a,10);
 return 0;
 }

③插入排序法

#include <stdio.h>
#include <conio.h>
void main()
{int i, n, x;
 void insert(int *, int , int *);
 int a[ ]={-3,2,6,9,14,19};
 n=6;
 scanf(“%d”,&x);
 insert(a,x,&n);
 for( i=0; i<n; i++)
    printf(“%d”, a[i]);}

void insert(int *b, int y, int *m)                   //插入排序法
{int i,j, k;
 for(i=*m-1; i>=0; i--)
  {if(y<*(b+i))
    *(b+i+1)=*(b+i);
else
    break;
   }
*(b+i+1)=y;  (*m)++;
}
  • Part5
// 功能描述:输入一组整数,输出最大值
#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);
// 利用循环输入N个整数给数组a
// 补足程序1
for(i=0;i<N;i++)
    scanf("%d",&a[i]);
// 调用子函数max求数组a的最大元素值,并赋值给max
// 补足程序2
max=findMax(a,N);
// 输出最大值
printf("数组a中最大元素值为: %d\n\n", max);
return 0;
}
// 函数定义
// 功能描述:找出整型数组a中元素的最大值,并返回次此最大值
// 补足函数findMax()的实现部分3
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;
}

运行结果如下所示:

#include <stdio.h>
const int N=4;
void output(char x[], int n); // 函数声明
// 排序函数声明
void px(char x[],int n);// 补足代码1
int main() {
char string[4] = {'2','0','1','9'};
int i;
printf("排序前: \n");
output(string, N);
// 调用排序函数对字符数组中的字符由大到小排序
px(string,N);// 补足代码2
printf("\n排序后: \n");
output(string, N);
printf("\n");
return 0;
}
// 函数定义
// 函数功能描述:输出包含有n个元素的字符数组元素
// 形参:字符数组,以及字符数组元素个数
void output(char x[], int n) {
int i;
for(i=0; i<N; i++)
printf("%c", x[i]);
}
// 函数定义
// 函数功能描述:对一组字符由大到小排序
// 形参:字符数组,以及字符数组元素个数
void px(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;
        }
    }
    }
}// 补足代码3

运行结果如下所示:

实验总结与体会

遗忘了很多基础知识,犯了很多错,也有些错误至今没有正面解决但是采用其他办法避开了,we need something brand new~

 

转载于:https://www.cnblogs.com/radius1/p/10755761.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值