成为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;

}

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容