《C程序设计》数组的定义与使用实验报告
一、实验目的:
1、掌握一维数组和二维数组的定义、初始化;
2、掌握一维数组和二维数组元素的赋值及输入/输出的基本方法;
3、掌握字符数组和字符串函数的使用。
二、实验内容:
(一)程序填空
1.下列给定程序中,函数fun的功能是:把形参a所指数组中的奇数按原顺序依次存放到a[0]a[1]a[2]……中,把偶数从数组中删除,奇数个数通过函数值返回。
例如:若a所指数组中的数据最初排列为:914236587,删除偶数后a所指数组中的数据为:91357,返回值为5
请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include  <stdio.h>
#define  N  9
int fun(int  a[], int  n)
{  int  i,j;
  j = 0;
  for (i=0; i<n; i++)
/**********found**********/
      if (a[i]%2==1)
      {
/**********found**********/
        a[j] = a[i]; j++;
      }
/**********found**********/
  return  j;
}
main()
{  int  b[N]={9,1,4,2,3,6,5,8,7}, i, n;
  printf("\nThe original data  :\n");
  for (i=0; i<N; i++)  printf("%4d ", b[i]);
  printf("\n");
  n = fun(b, N);
  printf("\nThe number of odd  : %d \n", n);
  printf("\nThe odd number  :\n");
  for (i=0; i<n; i++)  printf("%4d ", b[i]);
  printf("\n");
}
2.下列给定程序中,函数fun的功能是:把形参a所指数组中的最小值放在元素a[0]中,接着把a所指数组中的最大值放在a[1]元素中;再把数组全部赋值为1a所指数组元素中的次小值放在a[2]中,把a所指数组元素中的次大值放在a[3],以此类推。
例如,若a所指数组中的数据最初排列为:914236587;则按规则移动后,数据排列为:192837465。形参n中存放a所指数组中数据的个数。
规定fun函数中的max存放当前所的最大值,px存放当前所最大值的下标。
请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include<stdio.h>
#define N 9
void fun(int  a[], int  n)
{  int  i,j, max, min, px, pn, t;
  for (i=0; i<n-1; i+=2)
  {
/**********found**********/
      max = min = __a[i]___;
      px = pn = i;
      for (j=i+1; j<n; j++) {
/**********found**********/
        if (max<___a[j]__)
        {  max = a[j]; px = j;  }
/**********found**********/
        if (min>___a[j]__)
        {  min = a[j]; pn = j;  }
      }
      if (pn != i)
      {  t = a[i]; a[i] = min; a[pn] = t;
        if (px == i) px =pn;
      }
      if (px != i+1)
      {  t = a[i+1]; a[i+1] = max; a[px] = t; }
  }
}
main()
{  int  b[N]={9,1,4,2,3,6,5,8,7}, i;
  printf("\nThe original data  :\n");
  for (i=0; i<N; i++)  printf("%4d ", b[i]);
  printf("\n");
  fun(b, N);
  printf("\nThe data after moving  :\n");
  for (i=0; i<N; i++)  printf("%4d ", b[i]);
  printf("\n");
}
3.下列给定程序中,函数fun的功能是:将形参a所指数组中的前半部分元素中的值与后半部分元素中的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。
例如:若a所指数组中的数据为:123456789,则调换后为:678951234
请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include<stdio.h>
#define  N  9
void fun(int  a[], int  n)
{  int  i, t, p;
/**********found**********/
  p = (n%2==0)?n/2:n/2+  1  ;
  for (i=0; i<n/2; i++)
  {
      t=a[i];
/**********found**********/
      a[i] = a[p+__i___];
/**********found**********/
      ___a[p+i]__ = t;
  }
}
main()
{  int  b[N]={1,2,3,4,5,6,7,8,9}, i;
  printf("\nThe original data  :\n");
  for (i=0; i<N; i++)  printf("%4d ", b[i]);
  printf("\n");
  fun(b, N);
  printf("\nThe data after moving  :\n");
  for (i=0; i<N; i++)  printf("%4d ", b[i]);
  printf("\n");
}
4.下列给定程序中,函数fun的功能是:逆置数组元素中的值。例如:若a所指数组中的数据为:123456789,则逆置后依次为:987654321。形参n给出数组中数据的个数。
请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include  <stdio.h>
void fun(int  a[], int  n)
{  int  i,t;
/**********found**********/
  for (i=0; i<n/2___; i++)
  {
      t=a[i];
/**********found**********/
      a[i] = a[n-1-__i__];
/**********found**********/
      ___a[n-1-i]__ = t;
  }
}
main()
{  int  b[9]={1,2,3,4,5,6,7,8,9}, i;
  printf("\nThe original data  :\n");
  for (i=0; i<9; i++)
      printf("%4d ", b[i]);
  printf("\n");
  fun(b, 9);
  printf("\nThe data after invert  :\n");
  for (i=0; i<9; i++)
      printf("%4d ", b[i]);
  printf("\n");
}
(二)程序修改题
1.下列给定程序中函数fun的功能是:将tt所指字符串中的小写字母全部改为对应的大写字母,其它字符不变。
例如,若输入"AbcD",则输出"ABCD"
请改正程序中的错误,使它能得出正确的结果。
注意:部分源程序在文件MODI1.C,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
char* fun( char tt[] )
{
  int i;
  for( i = 0; tt[i]; i++ )
/**********found***********/
    if(( 'a' <= tt[i] )&&( tt[i] <= 'z' ) )
/**********found***********/
      tt[i] -= 32;
  return( tt );
}
main( )
{
  char tt[81];
  printf( "\nPlease enter a string: " );
  gets( tt );
  printf( "\nThe result string is:\n%s", fun( tt ) );
}
2.N个有序整数组成的数列已放在一维数组中,下列给定程序中函数fun的功能是:利用折半查法查整数m在数组中的位置。若到,返回其下标值;否则,返回-1
折半查的基本算法是:每次查前先确定数组中待查的范围lowhigh(low<high),然后用m与中间位置(mid)上元素的值进行比较。如果m的值大于中间位置元素的值,则下一次的查范围落在中间位置之后的元素中;反之,下一次的查范围落在中间位置之前的元素中。直到low>high,查结束。
请改正程序中的错误,使它能得出正确的结果。
注意:部分源程序在文件MODI1.C,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#define  N  10
/************found************/
int fun(int  a[], int  m )
{  int  low=0,high=N-1,mid;
  while(low<=high)
  {  mid=(low+high)/2;
      if(m<a[mid])
        high=mid-1;
/************found************/
      else if(m > a[mid])
        low=mid+1;
      else  return(mid);
  }
  return(-1);
}
main()
{  int  i,a[N]={-3,4,7,9,13,45,67,89,100,180 },k,m;
 
  printf("a数组中的数据如下:");
  for(i=0;i<N;i++) printf("%d ", a[i]);
  printf("Enter m: ");  scanf("%d",&m);
  k=fun(a,m);
  if(k>=0) printf("m=%d,index=%d\n",m,k);
  else  printf("Not be found!\n");
}
3.下列给定程序中函数fun的功能是:用选择法对数组中的n个元素进行升序排列。
请修改程序中的错误,使它能得出正确的结果。
注意:部分源程序在文件MODI1.C,不得增行和删行,也不得更改程序的结构!
#include <stdio.h>
#define  N  20
void  fun(int a[], int n)
{ int i, j, t, p;
  for (j = 0 ;j < n-1 ;j++) {
/************found************/
    p = j;
    for (i = j;i < n; i++)
      if(a[i] < a[p])
/************found************/
        p = i;
    t = a[p] ; a[p] = a[j] ; a[j] = t;
  }
}
main()
{
  int a[N]={9,6,8,3,-1},i, m = 5;
  printf("排序前的数据:") ;
  for(i = 0;i < m;i++) printf("%d ",a[i]); printf("\n");
  fun(a,m);
  printf("排序后的数据:") ;
  for(i = 0;i < m;i++) printf("%d ",a[i]); printf("\n");
}
(三)编程题
1、在含有10个元素的数组中,出最小值和最大值。
2、输出以下的杨辉三角形(要求输出10行)。
1
1  1
1  2  1
1  3  3  1
1  4  6  4  1
1  5  10 10 5  1
3、编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。不要用strcmp函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符相应的ASCII码的差值。
三、实验过程与结论:(经调试正确的源程序(核心部分)和程序的运行结果)
(三)编程题
1
2.
3.
四、实验总结:(实验中遇到的问题及解决方法,心得体会等)
字符含义不够熟悉,有时候因为不懂字符含义而出错,导致代码无法运行,然后是不能熟练敲出相应代码。对数组的知识掌握不太全面,不能较好的应用,对不会做的题要积极问同学及老师。在今后学习中要更多的动脑,对于一些特殊字符要熟记,综合运用所学习的东西,让敲出来代码能够顺利运行。  

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。