第2次作业
作业要求:https://edu.cnblogs.com/campus/hljkj/Cprogramming_2018Autumn_CST2018_4/homework/2502
PTA作业
函数6-4 判断奇偶性
1.实验代码
1 int even(int n) 2 { 3 if(n<0){n=abs(n);//将输入的数转为自然数 4 } 5 if((n%2)==0){return 1;//若能被2整除,说明是偶数,返回1 6 }else{return 0;//若不能被2整除,说明是奇数,返回0 7 } 8 }
2.解题思路
(1)
第一步:将要判断的数n转换为自然数,即n<0时,将abs(n)赋给n。
第二步:判断n的绝对值%2的值,若余0,说明是偶数,返回1;若不余0,说明是奇数,返回0。
(2)
3.本题调试过程碰到问题及解决办法
遇到问题:当输入的n为正数时,函数的判断结果有时候正确有时候错误。
解决办法:在原程序中,使用变量a来储存输入的n的值,当n<0时便把n的绝对值赋给a,但是a>0时a的值未定义,所以a%2的值是不正确的。于是不使用变量a,而是直接使用n的绝对值来判断n的奇偶性,便解决了该问题。
7-4 求一组数中的最大值和次最大值
1.实验代码
1 #include<stdio.h> 2 int main(){ 3 int i,max,cmax,t,j;//定义变量 4 int a[10];//定义数组,存放输入的数 5 for(i=0;i<10;i++) 6 {scanf("%d",&a[i]);//输入数存放到数组中 7 } 8 9 for(i=0;i<10;i++) 10 { 11 for(j=i+1;j<=9;j++) 12 {if(a[j]<a[i]){t=a[i];a[i]=a[j];a[j]=t;//按升序进行排序 13 } 14 } 15 } 16 printf("max=%d,cmax=%d",a[9],a[8]);//输出最大值及次大值 17 18 return 0; 19 }
2.解题思路
(1)
第一步:定义数组,通关循环将输入的十个数放入数组中。
第二步:按升序对数组进行排序。进行9轮排序,外层循环变量为i,内层循环变量为j,当a[j]<a[i]时,交换a[i]、a[j]的位置,保证一轮排序后最小值在a[i]。
第三步:输出数组的最后两个数,分别为最大值和次大值。
(2)
3.本题调试过程碰到问题及解决办法
遇到问题:无
解决方法:先将数组降序排序,排序之后最大值和次大值的位置在最后两个,即a[9],a[8]。要注意的是排序的轮数是数的个数-1,在第i轮排序结束后,本次排序中的最小值就被放在了第i个位置。
7-4 选择法排序
1.实验代码
1 #include<stdio.h> 2 int main(){ 3 int i,j,t,c=0,min=0; 4 int a[10]; 5 for(i=0;i<10;i++){ 6 scanf("%d",&a[i]);//输入10个数,存入数组 7 } 8 for(i=0;i<3;i++){//选择排序 9 min=i; 10 for(j=i;j<10;j++){ 11 if(a[j]<a[min]){min=j;//按升序进行选择排序 12 } 13 } 14 t=a[i];a[i]=a[min];a[min]=t;//交换数的位置 15 } 16 for(i=0;i<10;i++){ 17 t=a[i]; 18 c=0;//输出的空格数 19 while(t>0){t=t/10;c=c+1;//判断输出数的位数 20 } 21 for(j=0;j<5-c;j++){ 22 printf(" ");//输出空格 23 } 24 printf("%d",a[i]);//输出数 25 } 26 return 0; 27 }
2.解题思路
(1)
第一步:通过循环输入十个数存入数组。
第二步:按升序对数组进行三轮选择排序。外层循环进行三次,用min标记本轮排序中最小值的位置,内层循环进行10-i次比较,将较小值的位置给min。内层循环结束后,交换a[i]和a[min]
的位置,进入下次外层循环。
第三步:设置两层循环,外层i进行10c次循环,将a[i]的值赋给t,用c来标记输出的数的位数,在通过一个循环将t每次整除以10,每次将c的值+1,直到t<0,以此来判断每个输出的位数c,输出5-c个空格,后输出数。
(2)
3.本题调试过程碰到问题及解决办法
遇到问题:格式错误
解决方法:因为输出的空格数量不对,所以导致格式错误,经过反思,应将循环条件改为(j=0;j<5-c;j++),这样便能输出5-c个空格。c为输出的数的位数,这样便能做到输出的数占五列。
个人总结
(1)在课上,这几周学习了函数,一维数组的冒泡排序,选择排序,以及二维数组、矩阵。
1.学会了函数的设置及调用,以及在函数中需要注意的内部变量的问题,考虑内部变量或者全局变量。
2.学会了数组的定义,输入,以及调用,可以通过循环输入或者在定义时直接输入数组中数的值。
3.学会了通过冒泡排序及选择排序对数组进行排序,冒泡排序需要进行n-1(n为数的个数)轮排序在每轮排序中可能多次交换,确定该轮排序中的极值。选择排序在每轮排序中最多交换一次。
4.二维数组a[i][j],i代表列数j代表行数,矩阵是i=j的二维数组。矩阵中的元素可以进行交换。
(2)
1.我认为难点在函数及数组的应用上。
2.通过做pta上的题目并反复思考,调试,自己解决遇到的问题。看老师上课讲的关于数组的排序以及二维数组的程序,做有关二维数组的题目来强化自己对知识的掌握,做了一些课外相关的练习。
点评
学习进度
周数 | 此周代码行数 | 编写代码时间 | 博客字数 | 写博客时间 |
第14周 | 800 | 9小时 | 0 | 0 |
第15周 | 900 | 10小时 | 0 | 0 |
第16周 | 900 | 10小时 | 500 | 1小时 |
第17周 | 850 | 9小时 | 600 | 2小时 |