一、学习总结
本周主要进行了c语言的函数设计与训练。函数定义的基本格式为:
返回值类型 函数名(类型 形参1, 类型 形参2……) // 函数头部
{
声明语句序列;
可执行语句序列;
}
如:
int Fact(int n)
{
}
有以下几点需要注意:
- 函数定义时的参数:形参
- 函数调用时的参数:实参
形参、实参的名字可以一致,但即使名字相同,它们也是不同参数,修改形参的值不影响实参。
- 每个函数内不能再定义其他函数,因此定义的函数必须放在主函数int main()前
- 返回值类型可定义为void,即无返回值,若函数不需要入口参数,则需用void代替形参表中的内容。如:
void getMax(void)
{
// return后无任何参数,或无return
}
函数调用的基本格式为:
函数名([参数]);
若函数为无参函数可省略掉[ ]中内容。如:
函数名();
二、题目练习
1.比较大小
要求:
输入三个数a,b,c,比较输出其中的最大值。
分析:
本题只要求输出最大值而不用进行排序,因此可先行比较其中两个数的大小,将较大数赋给max,再令max与剩下的数进行比较。
知识点:
- 先比较两个数,再将结果与第三个数进行比较
代码如下:
#include<stdio.h>
int main ()
{
printf("请输入三个整数:");
int a, b, c, max;
scanf("%d %d %d", &a, &b, &c);
if (a >= b) {
max = a;
}
else if (a < b) {
max = b;
}
if (c >= max) {
max = c;
}
printf("%d", max);
}
2.数的倒置
要求:
输入一个数(12345678),输出这个数的倒置(87654321)。
分析:
将一个数对10取模可得到该数的最后一位,而将该数除以10可舍掉最后一位数。输出该数的倒置,即不断提出最后一位数,并将其乘以10后再加上下一位数(用res来储存这个值),可用while循环来实现这个过程,最后打印出倒置后的结果res即可。且此种方法可舍弃掉倒置后首位是0的情况,对于负数也能处理。
知识点:
- 取最后一位数:对该数取模
- 去掉最后一位数:该数 / 10
- while循环
- 储存结果
代码如下:
#include <stdio.h>
#include <math.h>
int main()
{
int number;
scanf("%d", &number);
if (number < 0) {
printf("-");
}
number = abs(number); // 输入值是负数时的处理
int res = 0;
while (number > 0) {
int t = number % 10;
res = res * 10 + t; // 储存的方法
number /= 10; // 关键
}
printf("%d", res);
}
3.最大公约数
要求:
写一个函数,完成输入两个整数,输出最大公约数的功能。
分析:
两数的最大公约数最大不会超过其中一个数,因此可使用for循环让两数除以较小数,看能否整除,若是能则该数为最大公约数,不能则将被除数减一,循环下去,直至被除数为1。long long int 类型可防止数据溢出。此处还多编写了求最大公倍数的函数,求最大公倍数则将原来的两数相乘后除以最大公约数即可。
知识点:
- for循环从两数中较小的数开始,令两数共同除以该数,每进行一次循环将被除数减一。
- 最小公倍数 = 两数相乘 / 最大公约数
代码如下:
#include<stdio.h>
// 编写最大公约数GCD函数
long long int getGCD(long long int a, long long int b) {
int min, gcd;
if (a <= b) {
min = a;
}
else {
min = b;
}
for (int i = min; i >= 1; i--) {
if (a % i == 0 && b % i == 0) {
gcd = i;
break;
}
}
return gcd;
}
// 编写最小公倍数LCM函数
long long int getLCM(long long int a, long long int b) {
long long int gcd, lcm;
gcd = getGCD(a, b);
lcm = (a * b) / gcd;
return lcm;
}
int main(void)
{
long long int a, b;
scanf("%lld %lld", &a, &b);
if (a < 0 || b < 0) {
printf("Input Error");
}
else {
printf("%lld %lld", getGCD(a, b), getLCM(a, b));
}
return 0;
}
4.冒泡排序与选择排序
要求:
首先输入一个数组的大小,如何输入数组的数据,接下来对数组排序后输出。
分析:
向数组输入数据:利用for循环完成。循环次数为输入的长度lenth。
冒泡排序:比较一个数组中相邻的两个元素的大小,如果后者更大则将两者交换,将数组中的元素这样两两比较一次可找到数组中最大的元素并将其排到末尾。一共执行lenth - 1个大循环,大循环中嵌套一个小循环。
选择排序:先找出该数组中最小的元素,放在该序列的起始位置,再从剩下的元素中选出最小的放在第二的位置,依次执行下去,直到排序完毕。依旧使用大循环内嵌套小循环的策略。
代码如下:
冒泡排序:
知识点:
- for循环输入多个数组数据
- 循环嵌套
- 小循环中将相邻两数两两比较找出最大元素
- for循环数组元素的依次输出
#include <stdio.h>
int main()
{
// 输入数组长度
int lenth;
scanf("%d", &lenth);
int n[lenth];
// 输入数组数据
int i;
for (i = 0; i < lenth; i++) {
scanf("%d", &n[i]);
}
// 开始排序
int t;
for (int j = 1; j <= lenth - 1; j++) {
for (int k = 0; k <= lenth - 1 - j; k++) {
if (n[k] > n[k + 1]) {
int t = n[k];
n[k] = n[k + 1];
n[k + 1] = t;
}
}
}
// 打印结果
for (i = 0; i < lenth; i++) {
printf("%d ", n[i]);
}
}
选择排序:
知识点:
- for循环输入多个数组数据
- 循环嵌套
- 每一个小循环中从第一个数开始,将该数与它之后的每一个数进行比较
- for循环进行数组元素的依次输出
#include<stdio.h>
int main()
{
// 输入数组长度
int lenth, t;
scanf("%d", &lenth);
int n[lenth];
//输入数组数据
for(int i = 0; i < lenth; i++)
{
scanf("%d", &n[i]);
}
// 开始排序
int begin = 0,end = lenth-1;
while (begin < end) // 每一个数值与它之后的数值进行逐个比较
{
int min = n[begin];// 将数值赋值于最小值,此后数值与此比较
int t = begin;
for(int i = begin; i <= end; i++)//每个数值与它之后的数值进行比较
{
if (min > n[i])//如果最小值大于它之后的数,将其赋值给最小值,两者位置交换
{
min = n[i];
t = i;
}
}
n[t] = n[begin];//将改变之后的数值放置在被换数的位置上
n[begin] = min;//将其变为剩余数值中的最小值
begin++;
}
int i = 0;
while(i < lenth)
{
printf("%d ",n[i]);
i++;
}
printf("\n");
}