C Primer Plus 第9章——第一篇

你该逆袭了

文章目录

  • 一、复习函数
    • 1、定义带形式参数的函数
    • 2、声明带形式参数函数的原型
    • 3、使用 return 从函数中返回值
      • (1)、返回值不仅可以赋给变量,也可以被用作表达式的一部分。
      • (2)、返回值不一定是变量的值,也可以是任意表达式的值。
      • (3)、如果函数返回值的类型与函数声明的类型不匹配怎样?
      • (4)、return 用来终止函数并把控制返回给主调函数的下一条语句。
        • return; 的作用
    • 4、函数类型
      • (1)函数声明既可以在主调函数外面,也可以放在主调函数里面。
  • 二、ANSI C 函数原型
    • 1、无参数和未指定参数
    • 2、函数原型的优点
  • 三、递归
    • 1、演示递归
    • 2、递归的基本原理
    • 3、尾递归
    • 4、递归和倒序计算
    • 5、递归的优缺点
  • 四、编译多源代码文件的程序
    • 1、使用头文件
      • (1)示例程序的注意点
      • (2)示例程序
      • (3)示例程序的运行结果截图
  • 五、查找地址:&运算符


一、复习函数

1、定义带形式参数的函数

void dibs(x, y, z)
char x, y, z;void dibss(x, y)  //这里,圆括号中只有参数列表,而参数的类型在后面声明。
int x;
char y;//这是 ANSI C 之前的形式,现在已经将其废弃不用

在这里插入图片描述

2、声明带形式参数函数的原型

在这里插入图片描述

3、使用 return 从函数中返回值

#include <stdio.h>int imin(int, int);int main()
{int num1 = 0; int num2 = 0;printf("enter a pair of integers (q to quit):\n");while (scanf("%d %d", &num1, &num2) == 2){printf("the lesser of %d and %d is %d.\n",num1, num2, imin(num1, num2));printf("enter a pair of integers (q to quit):\n");}printf("bye\n");return 0;
}int imin(int n, int m)
{int min = 0;if (n < m)min = n;elsemin = m;return min;
}

(1)、返回值不仅可以赋给变量,也可以被用作表达式的一部分。

answer = 2 * imin(z, zstar) + 25;
printf("%d\n", imin(-32 + answer, LIMIT));

(2)、返回值不一定是变量的值,也可以是任意表达式的值。

imin(int n, int m)
{return (n < m) ? n : m;
}

(3)、如果函数返回值的类型与函数声明的类型不匹配怎样?

在这里插入图片描述

(4)、return 用来终止函数并把控制返回给主调函数的下一条语句。

在这里插入图片描述

return; 的作用

在这里插入图片描述

4、函数类型

声明函数时必须声明函数的类型。带返回值的函数类型应该与其返回值类型相同,而没有返回值的函数应声明为 void。

在这里插入图片描述

(1)函数声明既可以在主调函数外面,也可以放在主调函数里面。

在这里插入图片描述

二、ANSI C 函数原型

1、无参数和未指定参数

在这里插入图片描述
在这里插入图片描述

2、函数原型的优点

在这里插入图片描述

三、递归

结束递归 是使用递归的难点,因为如果递归代码中没有终止递归的条件测试部分,一个调用自己的函数会无限递归。

1、演示递归

如果函数使用%p转换说明打印地址,如果你的系统不支持这种格式,请使用 %u 或者 %lu 代替 %p。

#include <stdio.h>void digui(int n);int main()
{digui(1);return 0;
}void digui(int m)
{printf("%d 的地址是 %p\n", m, &m);  // #1if (m < 4)       //使递归停止的条件{digui(m + 1);}printf("%d 的地址是 %p\n", m, &m);  // #2return 0;
}

在这里插入图片描述

2、递归的基本原理

在这里插入图片描述

(1)每级函数调用都有自己的变量。
在这里插入图片描述

(2)每次函数调用都会返回一次。当函数执行完毕后,控制权将被传回上一级递归。且程序必须按顺序逐级返回递归。
在这里插入图片描述

(3)递归函数中位于 递归调用之前 的语句,均按被调函数的顺序执行。
在这里插入图片描述

(4)递归函数中位于 递归调用之后 的语句,均按被调函数相反的顺序执行。
在这里插入图片描述

(5)虽然每级递归都有自己的变量,但是并没有拷贝函数的代码。
在这里插入图片描述

(6)递归函数必须包含能让递归调用停止的语句。
在这里插入图片描述

3、尾递归

最简单的递归形式是把递归调用置于函数的末尾,即正好在 return 语句之前。这种形式的递归被称为 尾递归,因为递归调用在函数的末尾。

分别用 循环 和 递归 计算阶乘:


#include <stdio.h>long recur(int x);  //阶乘
long xunhuan(int x);  //循环int main()
{int input = 0;printf("请输入 12 以内的正整数(q to exit)\n");while ((scanf("%d", &input) == 1)){if (input > 12){printf("请输入12以内的整数,你输入的数据太大。\n");}else if (input < 0){printf("你输入的数据是负数,请重新输入数据。\n");}else{printf("递归:%d 的阶乘是 %d\n", input, recur(input));printf("循环:%d 的阶乘是 %d\n", input, xunhuan(input));}}printf("bye\n");return 0;
}long recur(int x)
{long sum = 0;if (x > 0){sum = x * recur(x - 1);}elsesum = 1;  // 0 的阶乘 是 1  // 0!= 1return sum;
}long xunhuan(int x)
{long sum = 1;for (sum = 1; x >= 1; x--){sum *= x;}return sum;
}

代码的关键点:
虽然递归调用不是函数的最后一行,但是当 x > 0 时,它是该函数执行的最后一条语句,因此它也是 尾递归。

long recur(int x)
{long sum = 0;if (x > 0){sum = x * recur(x - 1);}elsesum = 1;  // 0 的阶乘 是 1  // 0!= 1return sum;
}

在这里插入图片描述
在这里插入图片描述

4、递归和倒序计算

用二进制形式打印整数

#include <stdio.h>                       void binary(int n);int main()
{int input = 0;printf("请输入一个整数:\n");while (scanf("%d", &input) == 1){printf("以二进制的形式输出:");binary(input);putchar('\n');printf("请继续输入整数,q to exit\n");}printf("bye\n");return 0;
}void binary(int n)
{int r = 0;r = n % 2;if (n >= 2){binary(n / 2);}putchar(r == 0 ? '0' : '1');  //此处注意,输出 字符‘1’ 和 字符‘0’return;  //什么也不返回
}

注意点:

putchar(r == 0 ? '0' : '1');  
//此处注意,输出 字符‘1’ 和 字符‘0’return;  //什么也不返回

5、递归的优缺点

优点:
递归为编程问题提供了最简单的解决方案。

缺点:
一些递归算法会快速消耗计算机的内存资源。
(举例:Fibonacci函数)

#include <stdio.h>int fibonacci(int);int main()
{int input = 0;printf("请输入整数:");scanf("%d", &input);fibonacci(input);printf("%d\n", fibonacci(input));return 0;
}int fibonacci(int n)
{if (n > 2)return fibonacci(n - 1) + fibonacci(n - 2);elsereturn 1;
}

在这里插入图片描述
在这里插入图片描述

四、编译多源代码文件的程序

1、使用头文件

(1)示例程序的注意点

以下程序注意点:

scanf("%*s");

处理非数值输入,跳至下一个空白字符。

(2)示例程序

usehotel.c ————房间费率程序

#include <stdio.h>
#include "hotel.h"    //定义符号常量,声明函数int main()
{int nights;double hotel_rate;int code;while ((code = menu()) != QUIT){switch (code){case 1: hotel_rate = HOTEL1;break;case 2: hotel_rate = HOTEL2;break;case 3: hotel_rate = HOTEL3;break;case 4: hotel_rate = HOTEL4;break;default:hotel_rate = 0.0;printf("oops!\n");break;}nights = getnights();showprice(hotel_rate, nights);}printf("thank you and goodbye.\n");return 0;
}

hotel.c ————酒店管理函数

#include <stdio.h>
#include "hotel.h"int menu(void)
{int code, status;printf("\n%s%s\n", STARS, STARS);printf("enter the number of the desired hotel:\n");printf("1) Fairfield Arms     2) Hotel olympic\n");printf("2) chertworthy plaza  4) the stockton\n");printf("5) quit\n");printf("%s%s\n", STARS, STARS);while ((status = scanf("%d", &code)) != 1 ||(code < 1 || code>5)){if (status != 1){scanf("%*s");    //处理非整数输入}printf("enter an integer from 1 to 5,please.\n");}return code;
}int getnights(void)
{int nights;printf("how many nights are needed? ");while (scanf("%d", &nights) != 1){scanf("%*s");     //处理非整数输入printf("please enter an integer ,such as 2.\n");}return nights;
}void showprice(double rate, int nights)
{int n;double total = 0.0;double factor = 1.0;for (n = 1; n < nights; n++, factor *= DISCOUNT)total += rate * factor;printf("the total cost will be $%0.0f.\n", total);
}

hotel.h ————符号常量 和 hotel.c 中所有函数的原型

//符号常量 和 hotel.c 中所有函数的原型#define QUIT 5
#define HOTEL1 180.00
#define HOTEL2 225.00
#define HOTEL3 255.00
#define HOTEL4 355.00
#define DISCOUNT 0.95
#define STARS "***********************************"//显示选择列表
int menu(void);//返回预定天数
int getnights(void);//根据费率,入住天数计算费用
//并显示结果
void showprice(double rate, int nights);

(3)示例程序的运行结果截图

在这里插入图片描述

五、查找地址:&运算符

主调函数不使用 return 返回的值,则必须通过地址才能修改主调函数中的值。

#include <stdio.h>int main()
{int a = 0;int b = 9;printf("a=%d &a=%p\n", a, &a);printf("a=%d &a=%p\n", b, &b);acc(a);return 0;
}int acc(int a)
{int b = 10;printf("a=%d &a=%p\n", a, &a);printf("a=%d &a=%p\n", b, &b);
}

在这里插入图片描述

总结:
从所得地址可以看出,这是 4 个不同的独立变量。
仅仅只是实现了值传递。

在这里插入图片描述
其余是指针的概念,在我的“C语言小知识点”专栏中,有详细总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/451619.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程池

目录 进程池 进程池的概念&#xff1a; 手搓进程池&#xff1a; 1、创建信道和子进程 2、通过channel控制子进程 3、回收管道和子进程 进程池 进程池的概念&#xff1a; 定义一个池子&#xff0c;在里面放上固定数量的进程&#xff0c;有需求来了&#xff0c;就拿一个池中…

微信小程序考试系统(lw+演示+源码+运行)

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序考试系统的开发全过程。通过分析微信小程序考试系统管理的不足&#xff0c;创建了一个计算机管理微信小程序考试系统的方案。文章介绍了微信小程序考…

Leetcode 二叉搜索树的第 K 个元素

复习一下二叉搜索树 二叉搜索树 (Binary Search Tree, 简称 BST) 是一种特殊的二叉树(可以为空)&#xff0c;其中每个节点都有一个值&#xff0c;并且满足以下特点&#xff1a; 定义&#xff1a; 左子树节点的值小于根节点的值&#xff1a;对于每个节点&#xff0c;左子树中所…

力扣66~70题

题66&#xff08;简单&#xff09;&#xff1a; python代码&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:s_str.join([str(i) for i in digits])nstr(int(s_str)1)n_strlist(n)res[int(i) for i in n_str]return res题67&#xff08;简…

Vscode的远程开发之VScode优势(一)

一、VSCode 优势 时代的弄潮儿 vscode是微软开源的基于electron的编辑器&#xff0c;通过各种各样的插件&#xff0c;它能够变成你最花里胡哨的IDE。 vscode 最大的特点与优势就是它将Server与Client解耦&#xff1a; 作为Client的vscode&#xff0c;他只负责作为文本编辑器…

kali的学习

一、Namp的使用 首次使用时&#xff0c;要确保Metasploitable已经启动并正在运行 nmap扫描原理&#xff1a; 首先判断nmap传输的命令行中是否包含域名&#xff0c;如果包含需要利用DNS服务器进行域名分析&#xff0c;然后发送ICMP Echo Request 来探测主机存活性。 nmap默认扫描…

判断在子集

今天晚上练习赛的A没写括号&#xff0c;搞了好久&#xff0c;真的是醉了。。。 #include<bits/stdc.h> using namespace std; typedef long long ll; int t; int main() {cin>>t;while(t--){ll x,y;cin>>x>>y;if(x<y)swap(x,y);if(xy)cout<<0…

构建现代化车辆管理系统:SpringBoot实践

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理车辆管理系统的相关信息成为必然。开发合适…

理解VSCODE基于配置的设置,避免臃肿

这节课我们讲两点&#xff1a; &#xff08;一&#xff09;下载、安装、汉化及美化 VSCODE&#xff1b; &#xff08;二&#xff09;理解VSCODE中基于配置&#xff08;Profiles&#xff09;的设置&#xff08;Settings&#xff09;&#xff0c;让 VSCODE 保持清爽。 &#xff0…

基于SpringBoot+Vue+uniapp的电影信息推荐APP的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

CTFHUB技能树之SQL——Refer注入

开启靶场&#xff0c;打开链接&#xff1a; 直接挑明是Refer注入 用burp抓包发送到repeater&#xff1a; 发现缺少referer报文头&#xff0c;添加一下&#xff0c;判断是整数型注入还是字符型注入&#xff1a; Referer: 1 and 11# 正常回显 1 and 12# 回显错误&#xff0c;说…

外星人木乃伊---我的收藏

我收藏了一个与我们星球上任何已知物种无关的非人类标本的明显例子&#xff0c;这具木乃伊遗骸作为地球上存在「非人类」外星人证据。测试证实这些遗骸含有「不来自任何已知物种」的DNA。7%的遗骸DNA“不来自任何已知物种”。这标本不属于我们的陆地进化。它们不是不明飞行物坠…

【android开发】android端部署yolov11-pose实现体测计数

android端部署yolov11-pose实现体测计数 系统概述一、自制关键点数据集预览二、Android Studio项目结构预览三、平板端运行效果预览 系统概述 自制引体、俯卧撑、仰卧起坐数据集&#xff0c;使用自制数据集训练yolo11-pose模型&#xff0c;通过ncnn进行模型转换&#xff0c;得…

【GAMES101笔记速查——Lecture 17 Materials and Appearances】

目录 1 材质和外观 1.1 自然界中&#xff0c;外观是光线和材质共同作用的结果 1.2 图形学中&#xff0c;什么是材质&#xff1f; 1.2.1 渲染方程严格正确&#xff0c;其中BRDF项决定了物体的材质 1.2.2 漫反射材质 &#xff08;1&#xff09;如何定义漫反射系数&#xff1…

数字图像处理:频率域滤波

数字图像处理&#xff1a;频率域滤波 笔者相关内容笔记&#xff1a; 1.傅里叶变换与图像处理 2.傅利叶变换在图像处理的应用 1.1 频率域滤波总体流程 1.2 DFT/IDFT DFT的例子 1.3 常见频率域滤波器 过滤高频信息&#xff0c;保留低频信息&#xff0c;则图像模糊 过滤…

特步引入IPD管理,钉钉项目 Teambition 助力高效产品研发管理

中国是全球第二大消费市场&#xff0c;运动鞋服行业拥有着巨大的发展潜力。在过去五年时间里&#xff0c;随着中国产品品牌和质量的提升&#xff0c;体育市场的占有率格局发生了显著变化&#xff0c;不同于部分国际品牌巨头营收持续减弱&#xff0c;国产领军体育运动品牌「特步…

RK平台 GPIO序号转换软件

RK平台 GPIO序号转换软件 下载地址 https://download.csdn.net/download/ruidongren/89900151 链接: link

大数据毕业设计选题推荐-电影数据分析系统-电影推荐系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

VSCode中的TypeScript教程

TypeScript 是JavaScript的类型化超集&#xff0c;可编译为纯JavaScript。它提供了类、模块和接口来帮助您构建健壮的组件。 安装 TypeScript 编译器 Visual Studio Code 包括 TypeScript 语言支持&#xff0c;但不包括 TypeScript 编译器tsc。您需要在全局或工作区中安装Typ…

空间解析几何 4:空间中线段到圆的距离【附MATLAB代码】

目录 理论公式 matlab代码 理论公式 对于解一元4次方程&#xff0c;请详见我的博客 一元四次方程求解 -【附MATLAB代码】-CSDN博客文章浏览阅读1.4k次&#xff0c;点赞41次&#xff0c;收藏4次。最近在研究机器人的干涉&#xff08;碰撞&#xff09;检测&#xff0c;遇到了一…