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;

}

相关推荐
Ajiang282473530430 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
盼海34 分钟前
排序算法(五)--归并排序
数据结构·算法·排序算法
网易独家音乐人Mike Zhou4 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
‘’林花谢了春红‘’5 小时前
C++ list (链表)容器
c++·链表·list
搬砖的小码农_Sky7 小时前
C语言:数组
c语言·数据结构
机器视觉知识推荐、就业指导7 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
Swift社区8 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman8 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年9 小时前
数据结构 (1)基本概念和术语
数据结构·算法