函数练习题(参数为数组类型)
Part 1
Step 1: 运行以下程序,分析程序功能。冒泡法
#include<stdio.h>
#define N 10
void sort(int x[],int n)
{
int i,j,temp;
for (i=0; i<n-1; i++)
for (j=0; j<n-1-i;j++)
if (x[j]>x[j+1])
{
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
}
return ;
}
int main()
{
int a[N]={5,3,8,7,9,2,1,6,4,0};
int i;
printf("before sorted:");
for (i=0; i<N; i++)
printf("%d ",a[i]);
printf("\n");
sort(a,10);
printf("after sorted:");
for (i=0; i<N; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
Step 2:
将主函数中第一行改为:int a[N]; 不进行数组初始化,使用srand函数产生100之内随机数对数组中的数据赋值,并将数组容量扩大至100,即使用#define N 100
再运行程序。
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#define N 100
int main()
{
int a[N];
int i;
srand(time(0));//设置当前时间为种子
for(i=0;i<N;i++)
{
a[i]=rand()%100+1;//产生1~100的随机数
}
printf("before sorted:");
for (i=0; i<N; i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
Step 3:
将主函数中输出一维数组中各个数据这个功能,(即红色代码部分),用一个函数实现,并修改主函数,完成相应的功能。请大家自己考虑输出功能的函数如何设计,从以下四个方面分析:函数名,返回值,参数,函数体。(如果有不会写的,可以问我)
void get_array(int a[10])
{
int i;
for(i=0;i<N;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
Step 4:
函数sort实现的是对数组的升序排列,将函数功能扩展,能够实现降序排列。可以采用以下两种方法实现:
方法一:
在函数sort的基础上,增加一个整型参数flag,flag的值为1时,对数组进行升序排列,flag的值为0时,对数组进行降序排列。相应的函数首部为:冒泡法
void sort(int x[],int n,int flag)
{
int i,j,temp;
if(flag==1)
{
for (i=0; i<n-1; i++)
for (j=0; j<n-1-i;j++)
if (x[j]>x[j+1])
{
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
}
}
if(flag==0)
{
for (i=0;i<n-1; i++)
for (j=0;j<n-1-i;j++)
if (x[j]<x[j+1])
{
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
}
}
return 0;
}
请大家将函数体补充完整。
方法二:
另外写一个函数,实现降序排列的功能,函数首部为void sort_d(int x[],int n)
请大家将函数体补充完整。选择法
void sort_d(int x[],int n)
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)//第一个数与后面的数逐个比较
if(a[i]>a[j])
t=a[i];a[i]=a[j];a[j]=t;
}
return 0;
}
主函数修改如下:
int main()
{
void sort_d(int x[],int n);
int a[N],int b[N];
for(i=0;i<N;i++)
scanf("%d\n"&a[i]);
scanf("%d\n",&b[i]);
void sort_d(a,10);//升序另外写,改上面的
void sort_d(b,10);
return 0;
}
将主函数补充完整,数组a,b 中各个数据的值,可以从键盘输入,也可以用随机数产生,调用相应的函数,对a数组进行升序排列,对b数组进行降序排列。
Step 5:
分析Step 4中的两种方法,你觉得哪种方法更好,为什么?
第二种方法,步骤简单
Part 2
Step 1:运行以下程序,分析程序功能。
#include <stdio.h>
#define N 50
int main()
{
char data[N] ;
int length;
scanf("%s",data);
length=strlen(data);
printf("length=%d\n",length);
return 0;
}
(*大家注意紫色代码,这个输入语句中,%s表示什么意思,data之前为什么没有加&符号)%s取的是字符串的首地址,不需要加地址符
%s对应的是输入一个字符串,需要提供一个字符数组来存储,数组名是一个地址,不用加&取地址的。
Step 2:
以上程序的功能是调用标准函数strlen,求出一个字符串的实际长度。请自己写一个函数,实现相同的功能,并且在主函数中调用。函数首部如下:
1.int slengthf(char x[])
{
int i,length=0;//i是循环计数器,len记录长度.
for (i=0;i<N;i++)//字符数组我设置的长度是100,最多循环100次退出
{
if (x[i] == '\0')// 从x[0]开始判断,'\0'是字符串的结束标记,只要ArrS[n]为\0就break,跳回for括号里的length++
break;
else
length++;//要是不等于\0,长度就+1
}
return length;//返回最终长度.
}
2.int slengthf(char x[])
{
int i,length=0;//i是循环计数器,len记录长度.
for (i=0;x[i]!='\0';i++)// {
}
length=i;
return length;//返回最终长度.
}
大家思考,为什么函数首部是这样写的,在这个基础上,把函数体补充完整,并且写一个主函数,调用函数slengthf。
#include <stdio.h>
#define N 50
int main()
{
char data[N] ;
int length;
scanf("%s",data);
length=strlen(data);
printf("length=%d\n",length);
return 0;
}
int slengthf(char x[])
{
int i,length=0;//i是循环计数器,len记录长度.
for (i=0;i<N;i++)//字符数组我设置的长度是100,最多循环100次退出
{
if (x[i] == '\0')// 从x[0]开始判断,'\0'是字符串的结束标记,只要ArrS[n]为\0就break,跳回for括号里的length++
break;
else
length++;//要是不等于\0,长度就+1
}
return length;//返回最终长度.
}
Step 3: 运行以下程序,分析程序功能。
#include <stdio.h>
#define N 50
int main()
{
char x[N],y[N] ;
scanf("%s",x);
strcpy(y,x);
printf("x=%s\ny=%s\n",x,y);
return 0;
}
Step 4:
以上程序的功能是调用标准函数strcpy,实现字符串的复制,请注意两个参数的含义,是将第二个参数对应字符串的内容复制到第一个参数对应的字符串中。请大家自己写一个函数,实现字符串复制的功能。从以下四个方面分析:函数名,返回值,参数,函数体。并且写一个主函数,调用该函数。
1.char strcpy(char a[],char b[]) //定义复制的字符串
{
int i; //计数
for(i=0;b[i]!='\0';i++) //复制a[i]='\0';表示字符串结束,也可以用a[i]=0;
a[i] = b[i];
a[i]='\0';
}
2.char *strcpy(char *dest,char *src)
{
char*temp;
temp=dest;
while(*dest++=*src++);
return temp;
}
Step 5:
了解标准函数strcat的功能,在此基础上,自己写一个函数实现相同的功能。
#include <stdio.h>
#define N 50
int main()
{
void fun (char pA[],char pB[]);
char x[N],y[N] ;
scanf("%s %s",x,y);
fun(x,y);
printf("%s\n",x);
return 0;
}
void fun (char pA[],char pB[])
{
int i,j;
for (i=0;pA [i]!='\0'; i++); /*求出的i为pA字符的总长度,包括结束标记位*/
for (j=0;pB [j]!='\0'; j++)
pA [i++]=pB [j]; /*将pB字符串连在pA字符串的后面*/
pA[i]='\0'; /*在字符串最后加上结束标记符*/
}