多的不吹,少的不唠,开头还得是我的校园生活,今天是10月29周六,周末就是美好的,早上直接10点起床(一起床就看见我们宿舍少了个人,是谁呢?不用猜都知道是那个赌王),但是我隐约好像记得8点时某些人就出发去了图书、馆,然后我就睡过去啦,还是睡觉香,然后下午干了啥,哦,对,我看了一部电影(神秘海域),荷兰弟的作品,感觉就是还行吧(应该是资金有限,本来这种题材可以拍的很好的,估计是另一个演员钱拿多了),然后看完就睡着了,睡到了下午5点,所以等于睡了一天。
//比大小正常版
#include
int main()
{
int a, b, c;//定义变量,使我可以输入三个数
scanf("%d%d%d", &a, &b, &c);//输入三个数
if (a < b)//判断,因为我要让a里面放的是三个变量里面的最大值,b里面放的是第二大,c中放最小
{
int tmp = a;//所以为了达到上面那个小目的,我就要进行三次的判断,然后进行三次的数字交换
a = b;
b = tmp;
}
if (a < c)//为了使a最大
{
int tmp = a;
a = c;
c = tmp;
}
if (b < c)//为了使b第二大
{
int tmp = b;
b = c;
c = tmp;
}
printf("%d %d %d\n",a,b,c);//按从小到大的顺序打印
return 0;
}
int my_get_max(int x, int y, int m) 这个就是我自定义的函数
{
int max; 这下面的就是为了实现找到最大值,我们应该写的基础代码
if (x > y)
max = x;
else
max = y;
if (m > max)
max = m;
return max;
}
#include
int main()
{
int a, b, c;
scanf("%d%d%d",&a,&b,&c);
int max = my_get_max(a, b, c);这个就是函数的调用
printf("max=%d\n",max);
return 0;
}
#include
my_get_max(int x, int y)
{
return x > y ? x : y;这个就是一个三目操作符的使用而已,看不懂不怕
}
int main()
{
int a, b, c;
scanf("%d%d%d",&a,&b,&c);
int max = my_get_max(my_get_max(a, b),c);这个只是一个函数的嵌套使用而已,意思就是比完一对数的大小后,再拿那个数与第三个数比大小,这样就可以得到3个数的最大数
printf("max=%d ",max);
return 0;
}
//.冒泡排序课上练习,函数进阶版
#include
void maopaohanshu_wu(int arr[], int sz)//这个就是我函数的名字,和参数的接收,和函数的返回类型(void)的函数
{
int m = 0;
for (m = 0; m < sz-1; m++)//这步的意思就是我想要进行冒泡排序,我就要进行数字交换(但是是数字个数-1次交换),因为当我进行最后一次交换的时候(此时是同时交换了两个数字的位置,所以可以少一次交换)
{
int n = 0;
for (n = 0; n < sz - 1 - m; n++)//这个for循环的意思就是我每次循环的数字的个数,(n < sz - 1 - m),所以这步就有点关键了,就代表冒泡排序的终极奥义:
//就是每进行一次循环,我所要交换的数字就会少一个,例:第一次我需要进行9个数字的交换(也就是我要交换9次,第二次我就需要交换8次,以此类推)
{
int tmp = 0;
if (arr[n]<arr[n+1])//这个判断语句就是为了交换我的数字(配合上上面那个for循环,我此时就可以进行我需要的次数次交换)
{
tmp = arr[n];
arr[n] = arr[n +1];
arr[n + 1] = tmp;
}
}
}
}
void dayinhanshu_wu(int arr[], int sz)//这个就是arr数组的打印(切记只要你想要打印数组,你就一定要使用循环),所以这边就非常抽象的把一个打印函数给重新包装出来,自己成为一个调用函数,而不是库函数
{
int i = 0;
for (i = 0; i < sz; i++)//这个训话就是为了打印我arr数组中的每一个元素(但是注意是通过下标来获取元素)
{
printf("%d ",arr[i]);
}
}
int main()
{
int i = 0;
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr) / sizeof(arr[0]);
maopaohanshu_wu(arr, sz);//这边就是两个函数的调用(这样的写法使得main函数内部就非常的干净的感觉)
dayinhanshu_wu(arr, sz);
return 0;
}
#include
#include
double fact(int n)//这个就是为了实现n的阶乘效果的函数,阶乘就是那样,没什么好讲的了
{
int i = 0;
double ret = 1;//但是切记算阶乘累乘的时候一定要把ret赋值为1.
for (i = 1; i <= n; i++)//这个就是为了获得(1到n的数字)的累乘,为什么会有这个效果呢?(重点就是因为我的i每次都是从 1 开始的,这点尤为的重要)
{
ret *= i;//这个就是一个累乘而已
}
return ret;
}
int main()
{
int n = 1;//这个n从1开始就非常的细节了,可以让第一个数字x为1次方,保留其本身,而不是0次方改变其本身
double x = 0;
double item = 0;
double s = 0;
printf("请输入x的值:");
scanf("%lf", &x);
item = x;//这步有两个意思(1.是为了把x给保护起来,防止在使用过程中发生改变;2.是为了实现第一个数字x可以加到s之中)
while (fabs(item) >= 0.00001)//这个是题目要求,并且fabs是一个求绝对值的函数(此时就是想求item的绝对值)
{ //且这个循环的意思是只要item的绝对值大于0.00001这个循环就可以执行,题目要求
s += item;//这步就是累加的意思,把每次循环过来的item都给加在一起
n++; //这步也是关键,只有这样才能改变n的值(从而实行x的n次方,从1到n的各个次方的数字)
item = pow(x, n) / fact(n);//这步就是整个代码的核心,就是为了算x的n次方除于n的阶乘,然后把每一次循环的item都加在一起
}
printf("s = %lf\n", s);
return 0;
}
//最大公约数求解
#include
int gcd(int x, int y)
{
int g = 0;
g = x % y;
while (g)//这个循环要注意,下面的交换也要注意一下(目的就是为了一直%,然后得到最大公约数,具体原理小学课本上有)
{
x = y;
y = g;
g = x % y;//这边千万不敢傻傻的打印g,因为此时g还不等于0,循环还会继续,所以g的值最后的赋给了y,所以要打印y;
}
return y;
}
int main()
{
int a, b, c;
printf("请输入两个你想求数:");
scanf("%d%d",&a,&b);
c = gcd(a, b);
printf("整数%d和整数%d的最大公约数是:%d\n",a,b,c);
return 0;
}
//n的阶乘递归版
#include
int Fac1(int n)
{
if(n<=1)
return 1;
else
return n*Fac1(n-1);
}
int main()
{
int n = 0;
int ret =0;
scanf("%d",&n);
ret = Fac1(n); //循环的方式
printf("ret=%d\n",ret);
return 0;
}
//函数递归 练习1,接受一个整形值,按照顺序打印它的每一位
#include // 例:输入:1234,输出1 2 3 4 *主要是用好% 和 /
void print(int n)
{
if(n>=10) //这个就是递归的限制条件
{ //这个叫print函数中直接调用print函数
print(n/10); //有点像循环,就是一直调用的感觉
}
printf("%d ",n%10);//当输入123经过两次调用之后,就会剩下一个1,然后进行1%10这个,然后就于1,最后打印出1
}
int main()
{
unsigned int num = 0;
scanf("%d",&num);
print(num);
return 0;
}
#include //有关二分查找法
int erfenzhazhaofa_wu(int num,int arr[], int sz)
{
int left = 0;
int right = sz - 1;
int mid = (left + right) / 2;
if (arr[mid] > num)
{
left++;
}
else if (arr[mid] < num)
{
right--;
}
else
{
return mid;//不符合上面两个条件就只剩下正确答案了
}
return 10; // 结束标志
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int num = 5;
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = erfenzhazhaofa_wu(num,arr,sz);//每次定义完函数一定要考虑,要不要赋一个变量;
if (ret == 10)
{
printf("找不到该数字\n");
}
else
{
printf("找到了,该数字是:%d\n",ret);
}
return 0;
}
//9.这个题目是关于(杨氏矩阵)的代码题(就是去寻找右上角或左下角的数然后去将它和我要找的数进行比较)通用就是(当我以后搞不定返回值时,我就可以利用这种返回型的参数,参考下面)
#include
int FindNum(int arr[][3], int k, int* px, int* py)
{
int x = 0;
int y = *py - 1;//x,y的坐标就搞定了
while (x <= *px - 1 && y >= 0)//这个循环的意思就是不能出去我的二维数组的范围
{
if (arr[x][y] > k)//在进行比较的时候用的就一定是那个数的坐标,不然拿不到我要的那个数字(左上角,右下角)
{
y--;
}
else if (arr[x][y] < k)
{
x++;
}
else
{
*px = x;
*py = y;
//printf("该数下标是:(%d,%d)",x,y);虽然可以在这里写,但是在函数内写,就不是很好
return 1;
}
}
//找不到的话这边也可以给一定的参数例:
*px = -1;
*py = -1;
return 0;
}
int main()
{
int arr[4][4] = { {1,2,3,4,} ,{5,6,7,8,}, {9,10,11,12,}, {13,14,15,16} };
int k = 11;
int x = 4;//这个数组的元素一定要传进去(就看是用什么样子传,可以用常数4,4;也可以用地址(&x,&y的形式,但是默认此时的x,y就是4,4))
int y = 4;
int ret = FindNum(arr,k, &x, &y);//这样子就可以具有传入和传出两种作用了,(传入时传4,4)(传出时就是传改变后的值(让我在函数外面也可以使用改变后了的值,这就可以让我在外面打印))
if (ret == 1)
{
printf("找到了\n");
printf("该数的下标是:(%d,%d)\n",x,y);
}
else
{
printf("找不到该数\n");
}
return 0;
}
1.我们学过的传值和传址的区别
2.就是在传二维数组的时候一定要把二维数组的(行和列)给传过去给函数内使用,不然就有大问题
3.并且二维数组的使用还是是依赖于下标
4.当我们想找某个二维数组中的元素的时候,用的方法还是去寻找它的坐标(arr [x] [y]),且是下标的坐标,切记!切记!
//这个就是一个奇数偶数的交换,且交换后奇数在一边,偶数在一边
#include
void jioujiaohuanhanshu_wu(int arr[],int sz)
{
int i = 0;
int left = 0;
int right = sz - 1;//这个区分一下字符串交换时的那个strlen-1;
while(left<right)
{
while ((left < right) && (arr[left] % 2 == 1))//这个意思就是从左开始找奇数
{
left++;
}
while ((left < right) && (arr[right] % 2 == 0))//从右开始找偶数
{
right--;
}
if(left<right)//这个判断和底下的交换的意思就是:我找到了左边的所有奇数,找到了右边的所有偶数,现在我就需要交换这些数字之后,我就得到了,奇数在一边,偶数在一边了
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}
int main()
{
int arr[10] = { 21,34,224,25,367,41,736,37,42,456 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//这边可以一眼就看书元素个数,所以这步可以直接省略,然后循环就直觉写小于10也行
for (i = 0; i < sz; i++)//如果想练习怎么使用函数,你尽管可以把这个打印数组拿到外面去重新包装一个函数出来
{
printf("%d ", arr[i]);
}
printf("\n");
jioujiaohuanhanshu_wu(arr,sz);//这个位置写函数主要为了区别一下原数组和改变之后的数组,使我的程序效果更加明显
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}