编写一个函数,分别统计字符串中各元音字母(即A、E、I、O、U)出现的次数,要求在主函数中输入一个字符串,统计后的结果在主函数中输出。例如,输入“This is a student”,则应输出“1 0 2 0 1”。
算法分析:
本题的基本思路是,利用循环,对字符串中的字符逐个进行判别,分门别类进行计数,统计结果分别放入各自对应的数组元素中。程序中对元音字符的判别和计数,采用分支选择结构中的switch语句;使用长度为5的一维数组num存放统计结果。在主函数中用gets()函数输入字符串,调用自定义函数fun()进行统计,结果在主函数中以循环语句输出。
参考程序:
#include
void fun(char s1[],int num[])
{ int k,i=5,j;
for(k=0; k< i;k++)
num[k]=0;
for(j=0;s1[j]!='\0';j++)
{ i=-1;
switch(s1[j])
{ case 'a': case'A':i=0;break;
case 'e': case 'E':i=1;break;
case 'i': case 'I':i=2;break;
case 'o': case 'O':i=3;break;
case 'u': case 'U':i=4; break;
}
if(i >=0) num[i]++; }
}
int main(void)
{
char s1[81];
int num1[5], i;
printf("\nPlease enter a string: ");
gets(s1);
fun(s1, num1);
for(i=0;i< 5;i++)
printf("%d ",num1[i]);
return 0;
}
2
编写一个函数,用来删除字符串中的所有空格,要求在主函数中输入一个字符串,删除所有空格后的字符串在主函数中输出。例如,输入“asd af aa z67”,则输出为 “asdafaaz67”。
算法分析:
本题的基本思路是,通过循环及条件语句对字符串中的字符逐个判别是否为空格,若是空格,则将其后续数组元素均向前移动一位。重复上述移位操作,最终以字符串结束标志'\0'结束循环,考虑到连续多个空格,使用while循环判断。
参考程序:
#include
void fun(char str[])
{ int i,j;
for(i=0;str[i]!='\0';i++)
{
while(str[i]==' ')
{
for(j=i+1; str[j]!='\0';j++)
str[j-1]=str[j];
str[j-1]= '\0';
}
}
}
int main(void)
{
char s[80];
printf("Input a string:\n");
gets(s);
fun(s);
printf("The result is:\n");
puts(s);
return 0;
}
3
编写一个函数,将一个长整型的数中所包含的偶数数字依次取出,构成一个新数返回。要求在主函数中输入长整型的数,调用函数进行转换,在主函数中输出新的数。例如,当输入的数为8831421时,则返回的数为8842。
算法分析:
本题的基本思路是采用循环,将长整型的数从个位数开始逐个取出,然后判断此数字是否能被2整除。若此数字为偶数,则将其由低到高,按位排列,组合成新数。
注意:输入测试数据时不要超过长整型long的范围。
参考程序:
#include
long fun(long s)
{ long t,sl=1;
int d;
t=0;
while(s>0 )
{ d=s%10;
if(d%2==0)
{ t=d*sl+ t;
sl=sl*10;
}
s=s/10;
}
return(t);
}
int main(void)
{ long s,num;
printf("input a number\n");
scanf("%ld",&s);
num=fun(s);
printf("The result is:%ld\n",num);
return 0;
}
简单来说,函数是对代码的封装,通过形参来传递实参
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
printf("swap函数中:a=%d,b=%d\n", a, b);
}
int _tmain(int argc, _TCHAR* argv[])
{
int a = 6, b = 5;
swap(a, b);
printf("a=%d,b=%d\n", a, b);
getchar();
return 0;
}
该函数中,对传入的值进行了相互交换,但并未改变实际的值,a之前是6,b之前是5,在主函数里面他们还是没有改变实际的位置,可见函数并不一定能改变其主体的值。
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
printf("swap函数中:a=%d,b=%d\n", *a, *b);
}
int _tmain(int argc, _TCHAR* argv[])
{
int a = 6, b = 5;
swap(&a, &b);
printf("a=%d,b=%d\n", a, b);
getchar();
return 0;
}
可在此函数中,我们通过指针来改变指向的值,从而改变其实参的值。
说完了这个我们来简单了解一下,函数指针和指针函数的用法
函数指针 指针函数
指针函数: 返回值为指针的函数
不能返回临时变量的地址
函数指针: 指向函数的指针
函数指针的规则:
1.返回值类型 和 参数列表 共同决定了这个函数指针能指向的函数
只要返回值类型 和参数列表 和函数指针的一样 那么就可以被这个指针指向
2.(*p)
3.函数名前 (&) 可加可不加
函数指针的作用:
结构体 如果作为函数参数传递 的时候
需要拷贝整个结构体 浪费时间和空间 结构体指针作为参数传递
函数 如果作为函数参数传递 的时候
可以指向一系列 (返回值类型 参数列表)一致的函数
char * Mystrcpy(char *des, char *res)
{
char *temp = des;
while (*temp++ = *res++)
;
return des;
}
int main()
{
char str1[20] = "helloworld";
char str2[20];
char*s1 = str1;
char*s2 = str2;
Mystrcpy(s2, s1);
printf("%s", s2);
getchar();
return 0;
}
复制字符串函数的作用
char * Mystrcpy(char *des, char *res)
{
char *temp = des;
while (*temp++ = *res++)
;
return des;
}
int main()
{
char str1[20] = "helloworld";
char str2[20];
char*s1 = str1;
char*s2 = str2;
//Mystrcpy(s2, s1);
char*(*p)(char*a, char*b);
p = Mystrcpy;
p(s2, s1);
printf("s2=%s\n", s2);
getchar();
return 0;
}
我们将Mystrcpy函数注释,看看指针函数p的作用,p指向Mystrcpy,看看结果
一样的结果。
函数的用途实在是太多了,而且必须用到,因为可以帮助程序做很多事,
最后,我们来看看简单的排序函数和指针函数的应用
bool lessThan(int a, int b)
{
return a > b;
}
void sort(int a[], int len, bool(*p)(int x, int y))
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len -i- 1; j++)
{
if (p(a[j], a[j + 1]))
{
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
int main()
{
int a[10] = { 5, 7, 15, 9, 22, 36, 25, 3, 11, 20 };
sort(a, 10, lessThan);
for (int i = 0; i < 10; i++)
{
printf("%d\t", a[i]);
}
getchar();
return 0;
}
数组啊排序后的结果
q群666295498 邀请码启明学c 欢迎来探讨学习