c语言第七章,函数

#define _CRT_SECURE_NO_WARNINGS//每一个代码都要加这个开头

图不粘了,没有时间了

函数与递归(递归不好做)

输入两个浮点数,返回两个数之和

#include<stdio.h>

void Add(double a, double b) {

double c;

c = a + b;

printf("%lf", c);

}

int main() {

double a, b;

scanf("%lf%lf", &a, &b);

Add(a, b);

return 0;

}

统计一个数字中1的个数

#include<stdio.h>

int Count(int n) {

int sum = 0;//计数

while (n != 0) {

if (n % 10 == 1) {//得个位

sum++;

}

n = n / 10;//丢个位

}

return sum;

}

int main() {

int m;

int n;

scanf("%d", &n);

m = Count(n);

printf("%d", m);

return 0;

}

五个人坐一起,问第五个人多少岁,5比4大2,4比3大2......,第一个人是10岁

#include<stdio.h>

//循环实现

int Age(int n) {

int sum = 10;//第一个人10岁

for (int i = 1; i < n; i++) {

sum = sum + 2;

}

return sum;

}

//递归实现

//递归三部分:1.边界条件2.前进段3.返回

int Age2(int n) {

if (n == 1) {

return 10;//第一个人10岁

}

else {

return Age2(n - 1)+2;

}

}

int main() {

int sum;

int n;

scanf("%d", &n);//输入第几个人

sum = Age2(n);

printf("%d\n", sum);

return 0;

}

用递归求n! n!=1 ;(n=0,1)

=n*(n-1)! ;(n>1)

#include<stdio.h>

int Fac(int n) {

if ((n == 0) || (n == 1)) {//出口

return 1;

}

else {

return n * Fac(n - 1);

}

}

int main() {

for (int i = 0; i < 10; i++) {

printf("%d!=%d\n", i,Fac(i));//输出0-9的阶乘

}

return 0;

}

递归,经典汉诺塔,超厉害

一次只能移动一个盘子;大的在下小的在上;借助B将A中的盘子移到C上

好理解,代码也好理解,但自己写不出来,道理我都懂啊

#include<stdio.h>

void Hanoi(int n, char a, char b, char c) {//a上一共的盘子数和abc三个盘子。

if (n == 1) {

printf("%c->%c\n", a, c);//如果是一个盘子直接移动就可以了

}

else {

Hanoi(n - 1, a, c, b);//把上面的n-1个盘子,从a通过c移到b上

printf("%c->%c\n", a, c);//把最下面的盘子移到c上

Hanoi(n - 1, b, a, c);//把b上面的盘子,通过a移到c上

}

}

int main() {

Hanoi(3, 'A', 'B', 'C');

return 0;

}

求一个数组的最大值

数组作为参数传递时,只传数组的起始地址,传参时要传入数组的长度

#include<stdio.h>

int Max(int str[], int len) {//str[]的括号里填数组长度无意义

int M = str[0];

for (int i = 0; i < len; i++) {

if (str[i] > M) {//找到最大数给M

M = str[i];

}

}

return M;

}

int main() {

int str[] = { 1,36,5,7,9 };

int len = sizeof(str) / sizeof(str[0]);//计算数组总长度;不能再Max函数中计算数组长度,因为str不能是形参

int n = Max(str, len);

printf("%d", n);//输出数组中的最大数

return 0;

}

求一个数组的平均数

#include<stdio.h>

double Ave(int str[], int len) {

int sum = 0;

for (int i = 0; i < len; i++) {

sum = sum + str[i];//求总和

}

double Ave_ave = (1.0 * sum) / len;//平均值

return Ave_ave;

}

int main() {

int str[] = { 75,65,98,69,88,97 };

int len = sizeof(str) / sizeof(str[0]);//求总长度

double Ave_ave=Ave(str, len);//接收平均值

printf("%lf", Ave_ave);

return 0;

}

用选择法对数组中的整数由小到大排序

选择法排序:每次都从待排序中找到最小值,和待排序的第一个值交换

#include<stdio.h>

void Pai(int str[], int len) {//从小到大排序

int k;//保存最小数的下标

int temp;//交换数据的中介

for (int i = 0; i < len- 1; i++) {//排序的趟数

k = i;//每次都让k在最左边,k很关键,一定要每次都重置

for (int j = i + 1; j < len; j++) {//找最小值

if (str[j] < str[k]) {

k = j;

}

if (i != k) {//自己不跟自己交换

temp = str[i];

str[i] = str[k];

str[k] = temp;

}

}

}

}

void Show(int str[], int len) {//展示排序后的结果

for (int i = 0; i < len; i++) {

printf("%d ", str[i]);

}

}

int main() {

int str[] = { 1,5,3,9,2 };

int len = sizeof(str) / sizeof(str[0]);

Pai(str, len);

Show(str, len);

return 0;

}

多维数组作为形参传递

打印一个二维数组,并求出最大值

#include<stdio.h>

int Show(int arr[3][4], int row, int col) {//传入数组,行数和列数,列数不能省略

int max = arr[0][0];

for (int i = 0; i < row; i++) {

for (int j = 0; j < col; j++) {

if (arr[i][j] > max) {

max = arr[i][j];

}

printf("%d ", arr[i][j]);

}

printf("\n");//输完一行就换行

}

return max;

}

int main() {

int arr[3][4] = { 1,2,3,4,5,6 };

int max=Show(arr, 3, 4);

printf("%d", max);

return 0;

}

全局变量:定义在函数外部,不销毁所有结束才销毁,默认0(尽量少用,不安全);局部变量:定义在内部

static:静态,修饰变量或函数

静态局部变量:从第一次进入函数创建(初始化只执行一次,函数第二次进后不走这句话),程序结束销毁,默认值0

输入两个整数,找到其中最大值

#include<stdio.h>

int Max(int a, int b) {

return a > b ? a : b;//写着简单我喜欢

}

int main() {

int a, b;

scanf("%d%d", &a, &b);

int m=Max(a, b);

printf("%d ", m);

return 0;

}

输入一个数组,求出他的最大值和他是第几个元素

#include<stdio.h>

int Max(int a[],int len) {

int max = a[0];

int index;

int i;

for ( i = 0; i < len; i++) {//传数组要传长度

if (a[i] > max) {

index = i;//只需要找到下标就可以了

}

}

return index;

}

int main() {

int a[10];

for (int i = 0; i < 10; i++) {

scanf("%d", &a[i]);

}

int index = Max(a,10);

printf("最大值是%d,是第%d个元素", a[index], index + 1);

return 0;

}

给定b的值,输入a和m,求a*b和a^m;

#include<stdio.h>

#include<math.h>

int Mul(int a, int b) {

int sum;

sum = a * b;

return sum;

}

int Mi(int a, int m) {

int sum = pow(a, m);//求幂的函数,头文件math.h

return sum;

}

int main() {

int b = 3;

int a, m;

scanf("%d%d", &a, &m);

int result1 = Mul(a, b);

int result2 = Mi(a, m);

printf("%d %d", result1, result2);

return 0;

}

有一个字符串,现输入一个字母,要求把他删掉

#include<stdio.h>//就是在函数里自己给自己,左右两边建不同下标

#include<string.h>//这可是个好题,解决了我两个困惑

void Delete(char str[], char c, int len) {

int i, j = 0;

for (int i = 0; i < len; i++) {

if (str[i] != c)//字符串不能这么比,字符可以

{

str[j] = str[i];//自己给自己也挺牛的思路

j++;

}

}

str[j] = '\0';//哪个绝世小天才想出来的好办法,结尾必须加结束符,要不然多了的会重复

}

void Show(char str[]) {

printf("%s", str);

}

int main() {

char c;

char str[20]="";

scanf("%s %c", str,&c);//!!!加空格输入,字符串后面的输入以这种形式就不会多输什么换行啥的

int len = strlen(str);

Delete(str, c, len);

Show(str);

return 0;

}

求两个整数的最大公约数和最小公倍数

#include<stdio.h>

int Max_ys(int a, int b) {

int min;

min = a < b ? a : b;

for (int i = min; i>1; i--) {//分母不能为0,1也不行!!!

if (a % i == 0 && b % i == 0) {

return i;//返回最大公约数,返回的都是i

}

}

return 0;

}

int Min_bs(int a, int b) {

int max;

max = a > b ? a : b;

int m = max;

for (int i = max; ; i++) {//分母不能为0

if (i%a == 0 && i%b == 0) {//用大数除以小的数

return i;//返回最小公倍数,返回i!!!

}

}

return 0;

}

int main() {//看似简单实则都是坑啊

int a, b;

scanf("%d%d", &a, &b);//输入两个整数

int max = Max_ys(a, b);

if (max == 0) {

printf("无最大公因数\n");

}

else {

printf("最大公因数为%d\n",max);

}

int min = Min_bs(a, b);

printf("最小公倍数为%d\n", min);

return 0;

}

求ax^2+bx+c=0的值,三个函数分别当b^2-4ac>0,=0,<0的情况

#include<stdio.h>

#include<math.h>

这里补充一个小知识点,if是满足条件就执行,else if是前面执行过了后面就不会在执行了

函数返回多值,可以用全局变量

double x1, x2;//全局变量可以使返回值不止一个

void Shuang(int a, int b, int c,int sum) {

x1 = (-b + sqrt(sum)) / 2.0 * a;

x2 = (-b - sqrt(sum)) / 2.0 * a;

}

void Dan(int a, int b, int c, int sum) {

double x3 = (-b + sqrt(sum)) / 2.0 * a;

printf("有两个相等实根\n");

printf("%.2lf %.2lf\n", x3, x3);

}

void No() {

printf("无实根");

}

int main() {

int a, b, c;

scanf("%d%d%d", &a, &b, &c);//输入三个数

int sum = b * b - 4 * a * c;

if (sum > 0) {

Shuang(a, b, c,sum);

printf("有两个不等实根\n");

printf("%.2lf %.2lf\n", x1, x2);

}

else if (sum == 0) {

Dan(a, b, c,sum);

}

else {

No();

}

return 0;

}

相关推荐
小刘|18 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
jjyangyou23 分钟前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
xinghuitunan37 分钟前
蓝桥杯顺子日期(填空题)
c语言·蓝桥杯
van叶~39 分钟前
算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝
c++·算法
Half-up40 分钟前
C语言心型代码解析
c语言·开发语言
简简单单做算法40 分钟前
基于Retinex算法的图像去雾matlab仿真
算法·matlab·图像去雾·retinex
knighthood20011 小时前
解决:ros进行gazebo仿真,rviz没有显示传感器数据
c++·ubuntu·ros
云卓SKYDROID1 小时前
除草机器人算法以及技术详解!
算法·机器人·科普·高科技·云卓科技·算法技术
懒大王就是我1 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
半盏茶香1 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏