第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上的题目并反复思考,调试,自己解决遇到的问题。看老师上课讲的关于数组的排序以及二维数组的程序,做有关二维数组的题目来强化自己对知识的掌握,做了一些课外相关的练习。 

 点评

1.徐凤隆的作业

2.张学健的作业

3.夏雯钰的作业

学习进度

周数 此周代码行数 编写代码时间 博客字数 写博客时间
第14周 800 9小时 0 0
第15周 900 10小时 0 0
第16周 900 10小时 500 1小时
第17周 850 9小时 600 2小时

 

 

 

 

 

 

posted @ 2018-12-22 00:30  许振豪  阅读(182)  评论(3编辑  收藏  举报