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

相关推荐
焦耳加热1 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
CodeCraft Studio1 小时前
PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 Base64
开发语言·python·pdf·base64·aspose·aspose.pdf
零点零一1 小时前
VS+QT的编程开发工作:关于QT VS tools的使用 qt的官方帮助
开发语言·qt
wan5555cn1 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6061 小时前
常用排序算法核心知识点梳理
算法·排序
lingchen19063 小时前
MATLAB的数值计算(三)曲线拟合与插值
开发语言·matlab
索迪迈科技3 小时前
基于野火F407开发板实现电源管理-停止模式
c语言·stm32·单片机·嵌入式硬件·mcu
gb42152873 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
一朵梨花压海棠go3 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript
蒋星熠4 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程