成为C系大神必需的技能!万能的函数应用

编写一个函数,分别统计字符串中各元音字母(即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;

}

成为C系大神必需的技能!万能的函数应用_第1张图片

该函数中,对传入的值进行了相互交换,但并未改变实际的值,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;

}

可在此函数中,我们通过指针来改变指向的值,从而改变其实参的值。

成为C系大神必需的技能!万能的函数应用_第2张图片

说完了这个我们来简单了解一下,函数指针和指针函数的用法

函数指针 指针函数

指针函数: 返回值为指针的函数

不能返回临时变量的地址

函数指针: 指向函数的指针

函数指针的规则:

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;

}

成为C系大神必需的技能!万能的函数应用_第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);

char*(*p)(char*a, char*b);

p = Mystrcpy;

p(s2, s1);

printf("s2=%s\n", s2);

getchar();

return 0;

}

我们将Mystrcpy函数注释,看看指针函数p的作用,p指向Mystrcpy,看看结果

成为C系大神必需的技能!万能的函数应用_第4张图片

一样的结果。

函数的用途实在是太多了,而且必须用到,因为可以帮助程序做很多事,

最后,我们来看看简单的排序函数和指针函数的应用

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;

}

成为C系大神必需的技能!万能的函数应用_第5张图片

数组啊排序后的结果

成为C系大神必需的技能!万能的函数应用_第6张图片

q群666295498 邀请码启明学c 欢迎来探讨学习

你可能感兴趣的:(成为C系大神必需的技能!万能的函数应用)