目录
每日练习:一、数组逆序
每日练习:二、用递归求N的阶乘
每日练习:三、用条件循环求阶乘
每日练习:四、求阶乘的加和
每日练习:五、数组冒泡排序
每日练习:六、选择排序法
每日练习:七、二维数组每行中交换最大的元素
每日练习:八、二维数组以以一维数组形式输出
每日练习:一、数组逆序
键盘中输入五个数,写一个函数实现一维数组中的逆序重新存放,要求输入输出军在主函数中。
#include
int main()
{
int arr[5];
int i,j,tmp;
//模块一:赋值数组
for(i=0;i<5;i++)
{
scanf("%d",&arr[i]);
}
//模块二:数组逆排序
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(arr[i]>arr[j])
{
tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
}
//模块三:打印输出
for(i=0;i<5;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
每日练习:二、用递归求N的阶乘
键盘中输入一个数,写一个程序揪出这个数的阶乘,要求使用递归法。
//用递归求N的阶乘
#include
int fun(int a)
{
if(a>0)
{
if(a==1||a==0)
{
return 1;
}
else
return a*fun(a-1);
}
}
int main()
{
int n=0;
scanf("%d",&n);
int a=fun(n);
printf("%d",a);
return 0;
}
注意事项:负数没有阶乘,0的阶乘是1
int fun(int a)
{
if(a>0)
{
if(a==1)
{
return a;
}
else
return a*fun(a-1);
}
}
看这个自定义函数,其实是有其实是有BUG,没有考虑0的情况,与其再写一个if函数进行限定,不如使用&& ,返回只用a改为1(因为0的阶乘刚好是1),修改后的代码件上面完整代码。
每日练习:三、用条件循环求阶乘
从键盘输入一个数,写一个程序,计算这个数的阶乘,要求使用循环。
#include
int fun(int n)
{
int a=1;
int ret=1;
for(a=1;a<=n;a++)
{
ret=ret*a;
}
return ret;
}
int main()
{
int a=0;
scanf("%d",&a);
int ret=fun(a);
printf("%d",ret);
return 0;
}
每日练习:四、求阶乘的加和
编程求1!+2!+3!+4!+5!
#include
int fun(int a)
{
int i,j;
int ret=1;
int sum=0;
for(i=1;i<=a;i++)
{
for(j=1;j<=i;j++)
{
ret=ret*j;
}
sum=sum+ret;
}
return sum;
}
int main()
{
int a=0;
scanf("%d",&a);
int sum=fun(a);
printf("%d",sum);
return 0;
}
这是个错误代码,具体原因:
1.ret=1*1=1
2.ret=1*1*1*2=2
3.ret=1*1*1*2*1*2*3=12
所以解决办法为在第一个和第二个for循环之间, 重置ret=1,如下
#include
int fun(int a)
{
int i,j;
int ret=1;
int sum=0;
for(i=1;i<=a;i++)
{
ret=1;
for(j=1;j<=i;j++)
{
ret=ret*j;
}
sum=sum+ret;
}
return sum;
}
int main()
{
int a=0;
scanf("%d",&a);
int sum=fun(a);
printf("%d",sum);
return 0;
}
- 当然,我们通过调整算法,得到更优,更简单的算法
#include
int main()
{
int i,n;
int ret=1;
int sum=0;
scanf("%d",&n);
if(n==0)
printf("sum=1");
else
{
for(i=1;i<=n;i++)
{
ret=ret*i;
sum=sum+ret;
}
printf("sum=%d",sum);
}
return 0;
}
每日练习:五、数组冒泡排序
用冒泡排序将十个整数按照从小到大的顺序排序
#include
int main()
{
int i,j;
int arr[10]={9,8,7,5,6,4,3,2,0,1};
int sz=sizeof(arr)/sizeof(arr[0]);//求数组长度
for(i=0;iarr[j+1])//相邻两个数比较
{
int tmp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tmp;
}
}
}
//输出排好的数组
for(i=0;i
难点:为什么第一个for循环截止到sz-1,第二个for循环截止到sz-1-i?(和下面👇🏻“冒泡排序和选择排序的区别”配合理解)
原因:第一个外层决定循环的趟数,例如四个数只用循环三趟。第二个内层循环决定每趟循环比较的次数,例如第一趟循环中4个数比较3次后,把最大的数放到最后,那么第二趟循环中最后一位就不用参与比较,同理第三趟循环最后两位就不用参与比较了
每日练习:六、选择排序法
用选择排序法将十个数按从小到大的顺序排列
#include
int main()
{
int i,j;
int arr[10]={9,8,7,5,6,4,3,2,0,1};
int sz=sizeof(arr)/sizeof(arr[0]);
for(i=0;iarr[j])
{
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
}
//输出排好的数组
for(i=0;i
⭐选择排序与冒泡排序的区别:
拿升序举例⭐
- 选择排序的原理是:(一个数和后面所有的数比较)第一趟循环中,第一个数和后面的所有数进行比较,能使最小的数排在前面。第二趟循环中,第二个数和第二个数后面所有的数进行比较,能使第二小的数排在第二个位置上,以此类推。
例如:
第一趟 第二趟 第三趟
4 3 2 1 1 4 3 2 1 2 4 3
3 4 2 1 1 3 4 2 1 2 3 4
2 4 3 1 1 2 4 3
1 4 3 2
- 冒泡排序的原理是:(相邻两个数进行比较)第一趟循环中,第一和第二个数比较,然后第二个和第三个数比较,以此类推,直至最后两个数比较,能使最大的一个数排在最后。第二趟循环中,从第二个和第三个数比较,以此类推,直至最后两个数。
例如:
第一趟 第二趟 第三趟
4 3 2 1 3 2 1 4 2 1 3 4
3 4 2 1 2 3 1 4 1 2 3 4
3 2 4 1 2 1 3 4
3 2 1 4
每日练习:七、二维数组每行中交换最大的元素
有一个3*4矩阵,找出每行中最大的元素并与第1列元素交换。具体要求如下:
1. 使用二维数组存放该3*4矩阵
2. 为二维数组输入数据。
3. 输出原矩阵并和处理后的矩阵进行比较。
测试输入:
3 4
1 2 3 4
5 6 7 8
9 10 11 12
预期输出:
原矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
处理后:
4 2 3 1
8 6 7 5
12 10 11 9
调试小技巧⭐
由于代码量较多,输入的数比较多,调试起来比较麻烦,可以先屏蔽输入模块(最好把scanf以及数组大小都指定完成,原因如下),直接赋值进去。
易错提示⭐
int M,N;//二维数组的行和列
scanf("%d%d",&M,&N);
char arr1[M][N];//={'S','S','S','S'};//定义二维数组
这样的代码是错误的,原因,定义数组的时候使用变量来定义数组长度。如下代码:
int a = 10;
char arr[a]; //编译不报错
//char [a] = "abc"; //报错,使用变量定义长度时,不可在定义时同时进行初始化赋值,需要在之后进行赋值
int arr[10][10]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int i,j,n,max;
/* for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
scanf("%d",arr[i][j]);
}
}
*/
调试后,完整代码如下:
#include
int main()
{
//模块一:初始化及输入
int arr[10][10]={0};//={{4,2,3,1},{5,6,7,8},{9,10,11,12}};
int i,j,k,max;
int m,n;
scanf("%d%d",&m,&n);
for(i=0;i
每日练习:八、二维数组以以一维数组形式输出
编写程序,功能是将
M
行N
列的二维数组中的字符数据按列的顺序依次放到一个字符串(一维数组)中。 例如,二维数组中的数据为:SSSS
YYYY
XXXX
YYYY
则字符串中的内容应是:SYXYSYXYSYXYSYXY
#include
int main()
{
int M,N;
scanf("%d%d",&M,&N);
char arr1[M][N];//创建二维数组
char arr2[M*N];//创建一维数组
int i,j;
int k=0;
//输入元素
for(i=0;i
程序解释:首先是输入元素部分,观察题目可知以四个一组的字符串进行一次输入,因此输入字符串数组时只用定义横行。其次是将二维数组赋给一维数组部分,由于要按列输出,第一层for循环就不应以 行 做终止循环的条件,而应以 列 作为终止循环的条件。
创作不易,还希望各位支持!
👍🏻点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
💛评论,你的意见是我努力的方向!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)