C语言家教记录(五)

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章内容,关键点:函数和程序结构

相关推荐
gu207 分钟前
c#编程:学习Linq,重几个简单示例开始
开发语言·学习·c#·linq
lly2024067 分钟前
SQLite 删除表
开发语言
wjs202413 分钟前
HTML 字符实体
开发语言
二十雨辰21 分钟前
[Java基础]网络编程
java·开发语言
MZWeiei25 分钟前
PTA:运用顺序表实现多项式相加
算法
GISer_Jing32 分钟前
Javascript排序算法(冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序)详解
javascript·算法·排序算法
cookies_s_s32 分钟前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
AC使者35 分钟前
介绍 TensorFlow 的基本概念和使用场景。
开发语言·自然语言处理·sqlite·github
不想编程小谭1 小时前
力扣LeetCode: 2506 统计相似字符串对的数目
c++·算法·leetcode
kiramario1 小时前
【结束】JS如何不通过input的onInputFileChange使用本地mp4文件并播放,nextjs下放入public文件的视频用video标签无法打开
开发语言·javascript·音视频