C语言家教记录(五)
导语
本次授课内容如下:函数、程序结构
辅助教材为 《C语言程序设计现代方法(第2版)》
函数
定义和调用
定义
函数不能返回数组,其他的类型均可以返回,void是说没有返回值,返回类型为void的函数,函数体可以为空
调用,需要用到函数名和实际参数列表,实际参数和形式参数的关系联想假面舞会,返回值不一定要有变量接受
c
返回类型 函数名(形式参数)
{
声明;
语句;
}
//例子
double average(double a,double b)//返回类型,函数名,参数
{
return (a+b)/2;//执行的语句,返回一个平均值
}
int main()
{
double a,b;
scanf("%lf",&a,&b);
printf("%lf\n",average(a,b));//多次调用
printf("%lf\n",average(1,0.5));
double ave=average(0.2,32);
printf("%lf",ave);
return 0;
}
示例程序
c
#include <stdio.h>
void print_count(int n)
{
printf("T minus %d and counting\n", n);
}
int main(void)
{
int i;
for (i = 10; i > 0; --i)
print_count(i);
return 0;
}
#include <stdio.h>
void print_count(int);//函数原型,只需要写名字就行
int main(void)
{
int i;
for (i = 10; i > 0; --i)
print_count(i);
return 0;
}
void print_count(int n)
{
printf("T minus %d and counting\n", n);
}
#include <stdbool.h> /* c99 only */
#include <stdio.h>
bool is_prime(int n)
{
int divisor;
if (n <= 1)
return false;
for (divisor = 2; divisor * divisor <= n; divisor++)
if (n % divisor == 0)
return false;
return true;
}
int main(void)
{
int n;
printf("Enter a number: ");
scanf("%d", &n);
if (is_prime(n))
printf("Prime\n");
else
printf("Not prime\n");
return 0;
}
声明
函数的定义和实现总是放在调用点上方,放在下方需要先声明,如果不声明,编译器默认函数的返回值为int,为函数创造了隐式声明,如果发现不是就会报错
参数
解释一下形式参数和实际参数的区别
实际参数通过值传递,对函数形式参数的修改不会影响到实际参数
c
void decompose(double x, long int_part, double frac_part)
{
int_part = (long) x; /* drops the fractional part of x */
frac_part = x - int_part;
}
decompose(3.14159, i, d);
解释一下调用是否遇到原型时的情况
c
#include <stdio.h>
int main(void)
{
double x = 3.0;
printf("Square: %d\n", square(x));
return 0;
}
int square(int n)
{
return n * n;
}
数组也可以用作实际参数
c
int sum(int [],int);
int sum(int a[],n)
{
int s=0;
for(int i=0;i<n;i++)
s+=a[i];
return s;
}
int sum_double(int a[],int n,int m)
{
int s=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
s+=a[i][j];
return s;
}
int main()
{
int a[]={1,2,3,4,5};
printf("%d",sum(a,5));
return 0;
}
终止和return
return可以返回数值,变量,常量,表达式,返回值为空也可以
c
return 0;
return a;
return a>=0?a:0;
return ;
void print_int(int i)
{
if(i<0)
return ;
printf("%d",i);
}
main中的return 表达式等价于exit 表达式
exit(0)和exit(EXIT_FAILURE)效果相同
递归和快速排序
函数调用它本身
c
int fact(int n)
{
if(n<=1)
return 1;
else
return n*fact(n-1);
}
int power(int x,int n)
{
if(n==0);
return 1;
else
return x*power(x,n-1);
}
书上的快速排序算法,讲解参考啊哈算法
c
void quicksort(int a[], int low, int high)
{
int middle;
if (low >= high) return;
middle = split(a, low, high);
quicksort(a, low, middle - 1);
quicksort(a, middle + 1, high);
}
int split(int a[], int low, int high)
{
int part_element = a[low];
for (;;) {
while (low < high && part_element <= a[high])
high--;
if (low >= high) break;
a[low++] = a[high];
while (low < high && a[low] <= part_element)
low++;
if (low >= high) break;
a[high--] = a[low];
}
a[high] = part_element;
return high;
}
程序结构
局部变量
函数体内部声明的变量是局部变量
拥有自动存储期限,局部变量存储单元由函数调用时自动分配,函数返回时收回分配
拥有块作用域,有效时限和大括号有关,c99循环为例
外部变量
main函数体外声明的变量
静态存储期限,存的值永久保存
文件作用域,整个程序都可以访问和修改
示例程序
c
#include <stdbool.h> /* C99 only */
#define STACK_SIZE 100
/* external variables */
int contents[STACK_SIZE];
int top = 0;
void make_empty(void)
{
top = 0;
}
bool is_empty(void)
{
return top == 0;
}
bool is_full(void)
{
return top == STACK_SIZE;
}
void push(int i)
{
if (is_full())
stack_overflow();
else
contents[top++] = i;
}
int pop(void)
{
if (is_empty())
stack_underflow();
else
return contents [--top];
}
作用域
作用域和程序块有关,程序块和大括号有关
示例
c
int i;
void f(int i)
{ i=1;}
void g(void)
{
int i=2;
if(i>0){int i; i=3}
i=4;
}
void h(void)
{
i=5;
}
如何构建C程序
#include 指令;
#define 指令;
类型定义;
外部变量的声明;
除main 函数之外的函数的原型;
main 函数的定义;
其他函数的定义;
总结和复习
本次授课讲述第9章和第10章内容,关键点:函数和程序结构