从 入 门 到 入 土 , 从 出 征 到 出 殡 , 冰 块 萌 兔 带 你 学 习 C + +(10)

今天我们来学习c++入门到入土第十节课——不花钱


上一节课,我们讲到了指针,这节课我们来讲函数


我们先来解答一下问题:
1.问题已在帖子中解决


您如有问题的话,可以回复我哦!
我会取前三个问题回答哦


函数

函数的声明

编程中的函数(function)一般是若干语句的集合。我们也可以将其称作「子过程(subroutine)」。在编程中,如果有一些重复的过程,我们可以将其提取出来,形成一个函数。函数可以接收若干值,这叫做函数的参数。函数也可以返回某个值,这叫做函数的返回值。
声明一个函数,我们需要返回值类型、函数的名称,以及参数列表。

// 返回值类型 int 
// 函数的名称 work
// 参数列表 int, int
int work(int, int);

如上图,我们声明了一个名为 work 的函数,它需要接收两个 int 类型的参数,返回值类型也为 int。可以认为,这个函数将会对传入的两个整数进行一些操作,并且返回一个同样类型的结果。

实现函数:编写函数的定义

只有函数的声明(declaration)还不够,他只能让我们在调用时能够得知函数的 接口 类型(即接收什么数据、返回什么数据),但其缺乏具体的内部实现,也就是函数的 定义(definition)。我们可以在 声明之后的其他地方 编写代码 实现(implement)这个函数(也可以在另外的文件中实现,但是需要将分别编译后的文件在链接时一并给出)。
如果函数有返回值,则需要通过 return 语句,将值返回给调用方。函数一旦执行到 return 语句,则直接结束当前函数,不再执行后续的语句。

int work(int, int); // 声明 
{
	/* some other code here... */
}
int sum(int x, int y) // 定义
{
	int result = 2 * x + y;
	return result;
	result = 3; // 这条语句不会被执行
}

在定义时,我们给函数的参数列表的变量起了名字。这样,我们便可以在函数定义中使用这些变量了。
如果是同一个文件中,我们也可以直接将 声明和定义合并在一起,换句话说,也就是在声明时就完成定义。

int work(int x, int y)
{
	return 2 * x + y;
}

如果函数不需要有返回值,则将函数的返回值类型标为 void;如果函数不需要参数,则可以将参数列表置空。同样,无返回值的函数执行到 return; 语句也会结束执行。

void work()
{
	cout << "hello!\n";
	cout << "hello!\n";
	cout << "hello!\n";
	return;
	cout << "hello!\n";  // 这条语句不会被执行
}

函数的调用

和变量一样,函数需要先被声明,才能使用。使用函数的行为,叫做「调用(call)」。我们可以在任何函数内部调用其他函数,包括这个函数自身。函数调用自身的行为,称为 递归(recursion)。
在大多数语言中,调用函数的写法,是 函数名称加上一对括号 (),如 foo()。如果函数需要参数,则我们将其需要的参数按顺序填写在括号中,以逗号间隔,如 foo(1, 2)。函数的调用也是一个表达式,函数的返回值 就是 表达式的值
函数声明时候写出的参数,可以理解为在函数 当前次调用的内部 可以使用的变量,这些变量的值由调用处传入的值初始化。看下面这个例子:

void foo(int, int);
/* ... */
void foo(int x, int y)
{
	x = x * 2;
	y = y + 3;
}
/* ... */
a = 1;
b = 1;
// 调用前:a = 1, b = 1 
foo(a, b); // 调用 foo
           // 调用后:a = 1, b = 1

在上面的例子中,foo(a, b) 是一次对 foo 的调用。调用时,foo 中的 xy 变量,分别由调用处 ab 的值初始化。因此,在 foo 中对变量 xy 的修改,并不会影响到调用处的变量的值
如果我们需要在函数(子过程)中修改变量的值,则需要采用「传引用」的方式。

void foo(int& x, int& y)
{
	x = x * 2;
	y = y + 3;
}
/* ... */
a = 1;
b = 1;
// 调用前:a = 1, b = 1
foo(a, b);  // 调用 foo
            // 调用后:a = 2, b = 4

上述代码中,我们看到函数参数列表中的「int」后面添加了一个「&(and 符号)」,这表示对于 int 类型的 引用(reference)。在调用 foo 时,调用处 ab 变量分别初始化了 foo 中两个对 int 类型的引用 xy。在 foo 中的 xy,可以理解为调用处 ab 变量的「别名」,即 foo 中对 xy 的操作,就是对调用处 ab 的操作。

main 函数

特别的,每个 C/C++ 程序都需要有一个名为 main 的函数。任何程序都将从 main 函数开始运行。

main 函数也可以有参数,通过 main 函数的参数,我们可以获得外界传给这个程序的指令(也就是「命令行参数」),以便做出不同的反应。

下面是一段调用了函数(子过程)的代码:

#include <bits/stdc++.h>
using namespace std;
void say_hello()
{
	cout << "hello!\n";
	cout << "hello!\n";
	cout << "hello!\n";
}
int main()
{
	say_hello();
	say_hello();
	return 0;
}

作业:

1. P1001 A+B Problem

难度:入门
题目描述:输入两个整数 aa 和 bb,输出它们的和。
思路:直接定义一个函数,接收两个整数参数并返回它们的和。
代码

#include <bits/stdc++.h>
using namespace std;
int add(int a, int b)
{
	return a + b;
}
int main()
{
	int a, b;
	cin >> a >> b;
	cout << add(a, b) << endl;
	return 0;
}

2. P1421 小玉买文具

难度:普及-
题目描述:小玉有 aa 元 bb 角,她想买 cc 元 dd 角的文具,问她是否买得起。
思路:将金额统一转换为角,然后比较。
代码

#include <bits/stdc++.h>
using namespace std;

bool canBuy(int a, int b, int c, int d)
{
	int totalMoney = a * 10 + b; // 转换为角
	int totalCost = c * 10 + d;  // 转换为角
	return totalMoney >= totalCost;
}

int main()
{
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	if (canBuy(a, b, c, d))
	{
		cout << "Yes" << endl;
	}
	else
	{
		cout << "No" << endl;
	}
	return 0;
}

3. P1307 数字反转

难度:普及-
题目描述:给定一个整数,将其反转后输出。
思路:通过循环取余和除法操作反转数字。
代码

#include <bits/stdc++.h>
using namespace std;

int reverseNumber(int n)
{
	int reversed = 0;
	while (n != 0)
	{
		reversed = reversed * 10 + n % 10;
		n /= 10;
	}
	return reversed;
}

int main()
{
	int n;
	cin >> n;
	cout << reverseNumber(n) << endl;
	return 0;
}

4. P1046 陶陶摘苹果

难度:普及-
题目描述:陶陶有 hh 的身高,苹果树上有 1010 个苹果,每个苹果的高度为 aiai​,陶陶能摘到多高的苹果?
思路:遍历苹果高度,统计陶陶能摘到的苹果数量。
代码

#include <bits/stdc++.h>
using namespace std;

int countApples(int h, int apples[])
{
	int count = 0;
	for (int i = 0; i < 10; i++)
	{
		if (h >= apples[i])
		{
			count++;
		}
	}
	return count;
}

int main()
{
	int h, apples[10];
	for (int i = 0; i < 10; i++)
	{
		cin >> apples[i];
	}
	cin >> h;
	cout << countApples(h + 30, apples) << endl; // 陶陶站在30cm的凳子上
	return 0;
}

5. P1085 不高兴的津津

难度:普及-
题目描述:津津每天有学习和上课的时间,如果某天总时间超过 88 小时,她会不高兴。输出她最不高兴的那一天。
思路:遍历每天的安排,记录最不高兴的那一天。
代码

#include <bits/stdc++.h>
using namespace std;

int findUnhappyDay(int schedule[][2])
{
	int maxUnhappy = 0, day = 0;
	for (int i = 0; i < 7; i++)
	{
		int total = schedule[i][0] + schedule[i][1];
		if (total > 8 && total > maxUnhappy)
		{
			maxUnhappy = total;
			day = i + 1;
		}
	}
	return day;
}

int main()
{
	int schedule[7][2];
	for (int i = 0; i < 7; i++)
	{
		cin >> schedule[i][0] >> schedule[i][1];
	}
	cout << findUnhappyDay(schedule) << endl;
	return 0;
}

6. P1424 小鱼的航程

难度:普及-
题目描述:小鱼每天游泳 xx 公里,周末休息。给定起始日期和总天数,计算小鱼游的总距离。
思路:模拟每一天,判断是否为工作日,累加游泳距离。
代码

#include <bits/stdc++.h>
using namespace std;

int calculateDistance(int x, int startDay, int days)
{
	int total = 0;
	for (int i = 0; i < days; i++)
	{
		int currentDay = (startDay + i) % 7;
		if (currentDay != 0 && currentDay != 6)   // 0和6是周末
		{
			total += x;
		}
	}
	return total;
}

int main()
{
	int x, startDay, days;
	cin >> x >> startDay >> days;
	cout << calculateDistance(x, startDay - 1, days) << endl; // 转换为0-based
	return 0;
}

以上c++代码为deepseek生成,请勿抄袭,请勿抄袭,请勿抄袭!!!以免成为洛谷的作弊者!!!

下一节课—— 文件操作
点赞,点赞,点赞!!!!!!!
球球了!!!!
求求了!!!!

:slight_smile:
QwQ QwQ

2 个赞

下一节课文件操作没有作业

Deepseek 带 你 学 习 C + +

捉萌兔

??

@栗子酱 @稻叶昙 主要是那些题目我没时间写,所以用了deepseek来生成的

如果违反了论坛某条规定,立即删除有关的那一部分

难度总算正常了

不过好像所有题目都可以用函数解决:

#include<bits/stdc++.h>
using namespace std;
void function(){
    ...
}int main(){
    solution();
    return 0;
}

嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯嗯

是的没错

木有呢

函数这东西最重要的用途是递归和重复调用代码块时省代码吧,你这样拿它写 A+B 做例题显然看起来有种不是很认真在写的感觉吧…

感觉用函数马蜂好点。
你写dijkstar,应该是用函数吧