#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;
}