-
预科第十二天
今天讲的内容有点多,老师先给我们讲了函数,然后讲了函数指针和函数的应用,中间还给我们穿插讲了部分宏基础。这部分内容够我消化几天了,再加上前几天还没消化完的,真担心后面会跟不上。
1>函数:就是存放代码的包
2>函数需要的基本元素:函数名称,信息参数(形参),函数执行完成的结果
3>怎么定义函数?
数据类型 函数名(数据类型 变量名)
{
}
数据类型:void,int,char,float,double,int *,float *,
....自定义的结构体,
void:空类型,可以没有return ,也可以有return;有return不能在后面返回变量;
int,float..:必须要有return,而且return后面必须要有值,而且值的数据类型要和函数的数据类型保持一致
4>函数的调用
函数名(实参);
5>
形参:形式参数,没有实际意义,形参只存在于函数定义,
实参:实际上的参数,有实际意义的,实参只存在于函数的调用
6>函数的注意点
(1)函数运行会从上往下找,不会逆行
(2)形式参数列表,不能省略数据类型,即使变量的数据类型一致,中间用,隔开
7>函数的声明
数据类型 函数名(数据类型 变量名);
变量名可以省略,数据类型不可以省略
8>return的作用
(1)结束当前函数的运行
(2)将return后面的值返回给函数调用者
9>函数的递归:函数自己调用自己
10>函数特点
(1)模块性比较强
//求5的阶乘
#include<stdio.h>
#include<string.h>
int jc(int a);
int main()
{
int res = jc(5);
printf("res = %d\n",res);
return 0;
}
int jc(int a)
{
if(a == 1)
{
return a;
}
else
{
a = a * jc(a - 1);
return a;
}
}
//求a和b的和
#include<stdio.h>
#include<string.h>
int sum(int a,int b);
int main()
{
int a = sum(2,3);
printf("a = %d\n",a);
return 0;
}
int sum(int a,int b)
{
int c = a + b;
return c;
}
函数的应用
//自己编写myStrlen函数求字符串长度
#include<stdio.h>
#include<string.h>
int myStrlen(const char *str)//const代表不能通过str修改str所指向的存储单元里面的内容
{
int count=0;
while (*str!='\0')
{
count++;
str++;
}
return count;
}
int main()
{
char string[10] = "hello";
int size = MyStrlen(string);
printf("size = %d\n",size);
return 0;
}
//自己编写MyStrcat函数拼接字符串
#include <stdio.h>
#include<string.h>
char MyStrcat(char *s1,const char *s2) //Strcat拼接字符串
{
s1 = s1 + MyStrlen(s1);
while(*s2 != 0)
{
*s1 = *s2;
s1++;
s2++;
}
*s1 = '\0';
}
int main()
{
char dst[20] = "hello ";
char source[10] = "world";
MyStrcat(dst,source);
printf("dst = %s\n",dst);
return 0;
}
宏
1> 宏常量
#define N 7
2> 宏函数
(1)不带参数的宏
#define OUTPUT printf("======\n");
(2)带参数的宏
#define MAX(a,b) a>b?a:b;
3>高级用法
(1)#与#define连用,代表将宏体转换成字符串
#define string(x) #x
(2)\与#define连用
printf("====\n");```
(3)##与#define连用,代表拼接
include <stdio.h>
define N 7
define OUTPUT printf("======\n");
define MAX(a,b) a>b?a:b
define test(a,b) ((a)+(b))
define string(x) #x
define OUT printf("====\n");\
printf("====\n");
define getMax(type,functionName) \
type get##functionName(type a,type b)
{
return a>b?a:b;
}
getMax(int, IntMax)
getMax(float, FloatMax)
int main()
{
int max=getIntMax(1,3);
float max1=getFloatMax(1.5, 3.5);
printf("max=%d\nmax1=%f\n",max,max1);
return 0;
}
void test1()
{
OUT
int res=test(1,2)*test(2,3);//1+2*2+3
printf("%d\n",res);
char string1[10]=string(123); //char string1[10]="123"
printf("string1=%s\n",string1);
}
函数指针:先算‘*’,代表这个变量是一个指针变量,再算(),代表将来这个指针指向的是一个函数;
函数名就是函数的入口地址
include<stdio.h>
include<string.h>
void test2(int a,int b)
{
printf("====\n");
}
int main()
{
void (p)(int,int);
p=test2;
//通过函数指针调用函数
p(3,4);
(p)(4,6);
return 0;
}
写一个函数实现变量值的交换int a=4,b=8;
include<stdio.h>
include<string.h>
void swap(int *pa,int pb)
{
int temp=pa;
pa=pb;
*pb=temp;
}
int main()
{
int a=4,b=8;
//调用交换函数
swap(&a,&b);
printf("a=%d\nb=%d\n",a,b);
return 0;
}
定义一个大小为5一维整型数组,使用函数遍历所有元素进行打印
include<stdio.h>
include<string.h>
//int arr[5]===>int arr[]===>int *arr;
void printArr(int p,int size)
{
int i;
for (i=0; i<size; i++)
{
printf("arr[%d]=%d\n",i,(p+i));
}
}
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9};
int size=sizeof(arr)/sizeof(int);
printArr(arr,size);
return 0;
}
求所有元素的个数
int arr[] = {1,2,3,4,5,6,7,8,9};
int size = sizeof(arr)/sizeof(int);
printf("size = %d\n",size);
//arr[2]的结果是多少
include<stdio.h>
include<string.h>
void changeValue(int p[])
{
p[2]=8;
}
int main()
{
int arr[5]={1,2,3,4,5};
changeValue(arr);
printf("arr[2]=%d\n",arr[2]);
return 0;
}
自定义一个大小为6的整型数组,写一个函数,对其从小到大排序,写一个函数对其遍历打印
include<stdio.h>
include<string.h>
void blueSort(int *p,int size)
{
int i,j;
for (i=0; i<size-1; i++)
{
for (j=0; j<size-i-1; j++)
{
if(p[j]>p[j+1])
{
int temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
}
int main()
{
int arr[6]={9,1,5,10,34,2};
blueSort(arr, 6);
printArr(arr, 6);
return 0;
}
>今天老师留了2道作业,对我来说还是很有难度的:
1.实现mystrcpy:
2.截取信息,遇到';'截取 xx1;xx2;xxx