C语言学习——数组

若有:
int *p,s[10],i;
p=s;

则s[i]的地址可以表示为:
(1)&s[i]
(2)s+i
(3)p+i


数组元素s[i]的三种表达方式:
(1)*&s[i]
(2)*(s+i)
(3)*(p+i)
(4)p[i]

 

一、例题:

例9.1 定义一个含有30个元素的int类型数组,依次给数组元素赋奇数,然后按每行10个数顺序输出,再按每行10个数逆序输出。

/*例9.1*/
#include <stdio.h>
#define M 30
int main(void)
{
	int i,j=1,a[M];
	for(i=0;i<M;i++)
	{	
		a[i]=j;
		j+=2;              
	}
	for(i=0;i<M;i++)
	{
		printf("%3d",a[i]);
		if((i+1)%10==0)
			printf("\n");
	}
	for(i=M-1;i>=0;i--)
		printf("%3d%c",a[i],(i%10==0)?'\n':' ');//利用条件表达式决定输出换行符还是输出空格
}

 例9.2  编写程序,通过一个函数给主函数中定义的数组输入若干大于或等于0的整数,用负数作为输入结束标志;调用另一个函数输出该数组中的数据。

#include <stdio.h>
#define M 100
void arrout ( int *, int ); int arrin ( int * ); 
main ( )
{  int s [M], k ;
  k =arrin ( s );   arrout ( s , k );
}
int arrin (int *a )
{  int i=0 , x ; scanf ("% d", &x);
  while ( x >=0 )
  { *( a+i ) = x;    i++;
    scanf ("% d", &x );
  }
  return i;
}
void arrout ( int *a, int n )//或者void arrout ( int a[], int n )
{  int i ;
   for ( i =0; i <n ; i++)
      printf ( (( i+1)%5==0) ? "%4 d\n": "%4d",*( a+i ) );//这里*(a+i)可以用a[i]代替
   printf ("\n");
}


对于程序中的函数调用arrin (s);对应的函数首部可以写成以下三种形式:
1) arrin ( int *a )
2) arrin ( int a[ ] )
3) arrin ( int a[M] )

 例9.3  编写函数,对具有10个元素的char类型数组,从下标为4的元素开始,全部设置星号“*”,保持前4个元素中的内容不变

#include <stdio.h>
#define M 10
#define B 4
void setstar ( char  *, int );
void arrout ( char *, int );
main ( )
{char c[ M] ={ 'A','B','C','D','E','F','G','H','I','J' };
  setstar ( &c[4], M-B );
  arrout ( c, M );
}
void setstar ( char *a, int n )
{int i;
   for ( i =0; i <n; i++) *( a+i ) ='*';
}
void arrout ( char *a, int n )
{int i;
  for ( i =0; i <n; i++) printf ( "% c", a[ i] );
  printf ("\n");
}



ABCD ******
setstar函数的首部还可写成以下形式:
setstar ( int a[ ], int n )   或   setstar ( int a[ M-B], int n )

 例9.4  编写程序,定义一个含有15个元素的数组,并编写函数分别完成以下操作:

(1)调用C库函数中的随机函数给所有元素赋以0 ~49的随机数;

(2)输出数组元素中的值;

(3)按顺序对每隔三个数求一个和数,并传回主函数;

(4)最后输出所有求出的和值。

#include <stdio.h>
#include "stdlib.h"
#define SIZE 15
#define N 3
void getrand ( int *, int );         
void getave ( int *, int *, int );
void priarr ( int *, int);
main ( )
{  int x[ SIZE] , w[ SIZE/N] ={ 0 }; 
  getrand ( x, SIZE);  
  printf ("Output %d random numbers:\n", SIZE);
  priarr ( x, SIZE );  
  getave ( x, w, SIZE );  
  printf ("Output 5 sum numbers:\n");
  priarr ( w, SIZE/N );  
}


void getrand ( int *a, int n )
{  int i;
  for ( i =0; i <n; i++) a[ i ] = rand( )%50;
}


void getave ( int *a, int *b, int n )
{  int i, j, sum;
  for ( sum =0, i =0, j =0; i <=n; i ++)
  { sum+=a[ i];  
   if ( ( i+1) %3 ==0 )  
    {  b[ j] = sum;  
      sum =0; 
      j++; 
    }
  }
}


void priarr ( int *a, int n )
{  int i;
  for ( i =0; i <n; i++)
  {  printf ("%5 d", a[ i] );
   if ( ( i+1)%5 ==0 ) printf ("\n");
  }
  printf("\n");
}


结果:
Output 15 random numbers:
46  30  32  40  6
17  45  15  48  26
4   8  21  29  42
Output 5 sum numbers:
108  63  108  38  92


调用随机函数的方法如下(在程序开头应该包含头文件stdlib.h)
  n=rand ()% x;
n将得到一个0到x -1的随机整数。因此,可用rand()% 50产生0 ~49的随机数。

 例9.5  将数组中的数按颠倒的顺序重新存放。在操作时,只能借助一个临时存储单元而不得另外开辟数组。

#include <stdio.h>
#define NUM 8
void output(int *,int);
void daoxu(int *,int);
int main(void)
{
	int a[NUM]={10,20,30,40,50,60,70,80};
	printf("Output primary data : ");       /*输出原始数据*/
	output(a, NUM);
	daoxu(a, NUM);
	printf("Output the inverse data : ");   /*输出颠倒后的数据*/
	output(a, NUM);
}


void output(int s[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%4d",s[i]);
	printf("\n");
}


void daoxu(int *a,int n)
{
  int i, j, t;
  i =0;j =n-1;      /*i 是最前元素的下标,j是最后元素的下标*/
  while(i <j)       /*当i 大于或等于j 时,对调完成*/
  { t =a[i]; a[i] =a[j]; a[j] =t;     /*下标为i 和j 的两个元素中的值对调*/
    i++;j--;                          /*i 向后移一个位置,j向前移一个位置*/
  }
}

 例9.6  已知整型数组中的值在0至9的范围内,统计每个整数的个数。

#include <stdio.h>
#include <stdlib.h>
#define M 50
#define N 10
void getdata ( int *s)
{  int i;
  for ( i =0; i <M; i++) s[ i] = rand()%10;
}
void stat ( int *a, int *c )
{  int i;
  for ( i =0; i <N; i++) c[ i] =0;    
  for ( i =0; i <M; i++) c[ a[ i] ] ++;  
}
void outdata ( int *c )
{  int i;
   for ( i =0; i <N; i++) printf ("% d : %d\n", i, c[ i] );
}

main( )
{  int a[ M], c[ N];
  getdata ( a );
  stat ( a, c );
  printf ("Output the result:\n");
  outdata ( c );
}

 例9.7  已知存放在a数组中的数不相重,在a数组中查找和x值相同的元素的位置。若找到,输出该值和该值在a数组中的位置;若没找到,输出相应的信息。

#include <stdio.h>
#define  NUM 30
int arrin( int *a )
{  int i, n;
  do             
  {  printf ("Enter number of elements,0 <=n <&d: ", NUM );
     scanf ("% d", &n );
  } while( ( n <1 ) ||( n >=NUM ) );
  printf ("Enter %d integer numbers :\n", n );
  for( i=0; i <n; i++) scanf ("% d", a+i );
  return n;
}
int search ( int *a, int x, int n )
{int i, p; 
  i=0;  
  a[ n] =x; 
  while( x! =a[ i] ) i ++;
  if ( i==n) p =-1;  
  else p =i; 
  return p;
}


main( )
{  int a[ NUM], x, n, p; 
  n =arrin ( a );
  printf ("Enter the number to search: x =");
  scanf ("% d", &x);
  p =search ( a, x, n );
  if ( p ! =-1 ) printf ("% d index is: %d\n", x, p);           
  else printf ("% d is not found ! \n", x);           
}

 例9.8  w数组中存放n个数据,编写函数删除下标为k的元素中的值。

#include <stdio.h>
#define NUM 10            
int arrdel ( int *, int , int );  
void arrout ( int *, int );  
int getindex( int n );
main( )  
{  int n, d, 
  int a[ NUM] ={21,22,23,24,25,26,27,28,29,30};
  n =NUM;
  printf ("Output primary data :\n");  
  arrout ( a, n );
  d =getindex( n );
  n =arrdel ( a, n, d );
  printf ("Output the data :\n");  
  arrout( a, n );
}


void arrout ( int w[ ], int m )
{  int k;
  for ( k =0; k <m; k++) printf ("% d ", w[ k]);
  printf ("\n");
}
int arrdel ( int *w, int n, int k )
{  int i;
  for ( i =k; i <n-1; i++) w[ i] = w[ i+1];
  n--; 
  return n;
}
getindex( int n )
{  int i;
  do   
  { printf("\nEnter the index [ 0<= i<%d ]: ", n );  
   scanf ("% d", &i );
  } while( i <0 ||i >n-1 );
  return i;
}

 例9.9  用选择法对数组中的数进行排序(按由小到大顺序)。

#include <stdio.h>
#define NUM 6
void arrsort( int [], int );
void arrout( int *, int );
main( )
{  int a[ NUM] ={5,7,4,2,8,6};
  arrout ( a, NUM );         
  arrsort ( a, NUM );  
  arrout ( a, NUM ); 
}


void arrsort( int *a, int n )
{  int i, j, p, t;
  for ( j =0; j <n-1; j ++)  
  {  p =j; 
      for ( i =j +1; i <n; i++) 
          if ( a[ p] > a[ i] ) p =i; 
              if ( p ! = j )  
                 {  t =a[ j]; a[ j] = a[ p]; a[ p] = t;} 
  } 
}
void arrout( int a[ ], int n )
{  int i;
  for( i =0; i <n; i++) printf ("% d ", a[ i]);
  putchar( \n );
}


二、习题:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crow_jing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值