1.三个数从小到大排序
#include <stdio.h>
int main()
{
int data1;
int data2;
int data3;
int datatmp;
printf("请输入三个整数:\n");
scanf("%d%d%d",&data1,&data2,&data3);
if(data1 > data2)
{
datatmp = data1;
data1 = data2;
data2 = datatmp;
}
if(data1 > data3)
{
datatmp = data1;
data1 = data3;
data3 = datatmp;
}
if(data2 > data3)
{
datatmp = data2;
data2 = data3;
data3 = datatmp;
}
printf("三数从小到大排序:%d,%d,%d",data1,data2,data3);
return 0;
}
2.输入两个正整数m和n,求其最大公约数和最小公倍数
#include <stdio.h>
int main()
{
//方法1,根据定义求两数的最大公约数和最小公倍数
/*
int m;
int n;
int max;
int min;
printf("请输入两个数:\n");
scanf("%d%d",&m,&n);
//求最大公约数
for(int i=1;i<=m;i++)
{
if(m%i == 0 && n%i == 0)
{
if(max < i)
max = i;
}
}
for(min=m;;min++)
{
if(min%m == 0 && min%n == 0)
{
break;
}
}
printf("最大公约数为:%d,最小公倍数为:%d",max,min);
*/
//方法2,辗转相除法
//用较大数除以较小数,再用出现的余数(第一余数)去除除数,
//再用出现的余数(第二余数)去除第一余数,
//如此反复,直到最后余数是0为止。
//如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数
//已知a,b最大公约数为i,最小公倍数为j,则有公式为a*b=最大公约数i * 最小公倍数j
int m = 0;
int n = 0;
int tmp = 0;
printf("请输入两个数:\n");
scanf("%d%d",&m,&n);
//将输入的m和n保存在i和j中
int i = m;
int j = n;
while(n)
{
tmp = m%n;
m = n;
n = tmp;
}
printf("最大公约数为:%d\n",m);
printf("最小公倍数为:%d\n",(i*j)/m);
return 0;
}
3.冒泡排序法
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复进行直到没有再需要交换的元素,这意味着数列已经排序完成。
//实现从小到大排序
int arr[] = {78,54,76,12,46};
int size = sizeof(arr) / sizeof(arr[0]);
int i;
int j;
int tmp;
for (i = 0; i < size - 1; i++)
{
for (j = 0; j < size - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
4.简单选择排序法
for (i = 0; i < size - 1; i++)
{
for (j = i + 1; j < size; j++)
{
if (arr[i] > arr[j])
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
for (i = 0; i < size; i++)
{
printf("%d ", arr[i]);
}
5.用递归法求n!
函数递归就是函数嵌套了自己,但要有终止条件
#include <stdio.h>
#include <stdlib.h>
int factorial(int num)
{
int result;
if(num >= 17)
{
printf("越界\n");
exit(-1);//提前结束程序
}
if(num == 1)
{
result = 1;
}else{
result = factorial(num - 1)*num;
}
return result;
}
int main()
{
int num;
printf("要求的阶乘数:\n");
scanf("%d",&num);
int ret = factorial(num);
printf("求得的%d阶乘为:%d",num,ret);
return 0;
}
6.数组名当作函数实参
实参数组首元素的地址传给形参数组名
#include <stdio.h>
void initArr(int arr[],int len)//
{
int i;
for(i = 0; i < len; i++)
{
arr[i] = i + 100;
}
}
//形参中不存在数组的概念,即使中括号约定了数组的大小,也无效
//传递是一个地址,是数组的首地址
void printArr(int arr[],int len)
{
int i;
printf("printArr:array的大小是:%d\n",sizeof(arr));//在os用8个字节表示一个地址
for(i = 0; i < len; i++)
{
printf("%d ",arr[i]);
}
putchar('\n');
}
int main()
{
int array[10];
initArr(array,10);
printArr(array,10); //数组名代表整个数组的首地址
printArr(&array[0],10);//第一个元素的地址也是数组的首地址
int size = sizeof(array);
printf("%p %p\n",&array[0],array);
printf("main:array的大小是:%d",size);
return 0;
}
7.变量和内存空间的值传递
形参数组名获得了实参数组的首元素的地址,形参数组首元素(array[0])和实参数组首元素(arr[0])具有同一地址,它们共占同一存储单元,形参(arr[n])和 实参(array[n])指的是同一单元。s(arr[n])和 实参(array[n])具有相同的值。
8.二维数组作为函数的参数
合法写法:int arr[2][3]
int arr[][3]
第一维的大小可以不用写,但必须指定第二维的大小
例:有3x4矩阵,初始化它并输出,然后求最大值并输出
#include <stdio.h>
//初始化数组
void initDoubleArr(int arr[][4],int row,int column)
{
int i;
int j;
for(i = 0; i < row; i++)
{
for(j = 0; j < column; j++)
{
printf("请输入第%d行第%d列的值:\n",i+1,j+1);
scanf("%d",&arr[i][j]);
}
}
}
//输出数组的值
void printDoubleArr(int arr[][4],int row,int column)
{
int i;
int j;
for(i = 0; i < row; i++)
{
for(j = 0; j < column; j++)
{
printf("%d ",arr[i][j]);
}
putchar('\n');
}
}
//从row行column列的二维数组中得出最大值
int getMaxForDoubleArr(int arr[][4],int row,int column)
{
int i;
int j;
int max;
max = arr[0][0];
for(i = 0; i < row; i++)
{
for(j = 0; j < column; j++)
{
if(max < arr[i][j]){
max = arr[i][j];
}
}
}
return max;
}
int main()
{
int array[3][4];
int max;
initDoubleArr(array,3,4);
printDoubleArr(array,3,4);
max = getMaxForDoubleArr(array,3,4);
printf("矩阵最大值为:%d\n",max);
return 0;
}