这个作业属于哪个课程 | c语言程序设计 |
---|---|
这个作业要求在哪 | 2019年春第六周作业 |
我在这个课程的目标是 | 掌握指针的相关知识 |
这个作业在哪个具体方面帮助我实现目标 | 通过PTA作业学习指针使用方法并对代码进行检测 |
参考文献 | C语言程序设计 |
基础作业
1.函数题:求两数平方根之和
函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。
函数接口定义:
double fun (double *a, double *b);
其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。
裁判测试程序样例:
#include<stdio.h>
#include <math.h>
double fun (double *a, double *b);
int main ( )
{ double a, b, y;
scanf ("%lf%lf", &a, &b );
y=fun(&a, &b); printf ("y=%.2f
", y );
return 0;
}
/* 请在这里填写答案 */
输入样例:
12 20
输出样例:
y=7.94
1).实验代码
double fun (double *a, double *b)
{
double z;
z=sqrt(*a)+sqrt(*b);
return z;
}
2).设计思路
第一步:用double定义一个双精度浮点型变量z。
第二步:用sqrt函数计算输入值的平方根,把两个结果相加并赋入z。
第三步:将结果返回z。
3).本题调试过程碰到的问题以及解决办法
第一行最后面不需要分号。
4).运行结果截图
2.编程题:利用指针返回多个函数值
读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。
输入格式:
输入有两行: 第一行是n值; 第二行是n个数。
输出格式:
输出最大值和最小值。
输入样例:
在这里给出一组输入。例如:
5
8 9 12 0 3
输出样例:
在这里给出相应的输出。例如:
max = 12
min = 0
1).实验代码
#include<stdio.h>
int max_min(int *n,int*max,int*min);
int main()
{
int i,m,n,a,max,min;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a);
if(i==0){
max=a;min=a;
}
max_min(&a,&max,&min);
m++;
}
printf("max = %d
min = %d",max,min);
}
int max_min(int *n,int*max,int*min)
{
if(*max<=*n){
*max=*n;
}
if(*min>=*n){
*min=*n;
}
}
2).设计思路
第一步:用scanf输入n的值表示需要输入的整数的个数。
第二步:用for循环逐个输入整数,调用自定义函数返回多个值。
第三步:定义函数:当输入值大于或等于指针max的值赋入指针max返回到变量max中,当输入值小于或等于指针min的值赋入指针min返回到变量min中。
第四步:输出max,min的值。
3).本题调试过程碰到的问题以及解决办法
定义函数中用到的指针没有定义,把所有max_min(int n);改为max_min(int n,intmax,intmin)后error:0。
检查后发现指针初始值为0,造成第一次判别错误,所以要先将第一次输入的值赋给max和min,在第8行后加上if(i==0){max=a;min=a;}即可实现。
4).运行结果截图
思考题:(分值等同于编程题)
1.为什么要使用指针?它有什么用?
使编程更容易实现数据的读取和计算和赋值,指针可以对复杂数据进行处理,能对计算机的内存分配进行控制,在函数中使用指针还可以返回多个值。
2.指针变量在内存中暂用多大的空间?它的大小由什么决定?
在不同的操作系统及编译环境下,指针类型所占用的字节数是不同的。
预习作业:6-3 最小数放前最大数放后
为一维数组输入10个整数;将其中最小的数与第一个数对换,将最大的数与最后一个数对换;输出数组元素。。
函数接口定义:
void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);
三个函数中的 arr和n 都是用户传入的参数。n 是元素个数。
input函数的功能是输入 n个元素存到指针arr所指向的一维数组中。
max_min函数的功能是求指针arr所指向的一维数组中的最大值和最小值,其中最小的数与第一个数对换,将最大的数与最后一个数对换。
output函数的功能是在一行中输出数组元素,每个元素输出占3列。
裁判测试程序样例:
#include<stdio.h>
void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);
int main()
{ int a[10];
input(a,10);
max_min(a,10);
output(a,10);
return 0;
}
/* 请在这里填写答案 */
输入样例:
5 1 4 8 2 3 9 5 12 7
输出样例:
1 5 4 8 2 3 9 5 7 12
1).实验代码
void input(int *arr,int n)
{
int i;
for(i=0;i<n;i++,arr++){
scanf("%d",arr);
}
}
void max_min(int *arr,int n)
{
int i,min,max,m,h;
for(i=0;i<n;i++,arr++){
if(i==0){
max=*arr;min=*arr;
}
if(max<=*arr){
max=*arr; m=i;
}
if(min>=*arr){
min=*arr; h=i;
}
}
arr=arr-10;
*(arr+h)=*arr;*arr=min;
*(arr+m)=*(arr+9);*(arr+9)=max;
}
void output(int *arr,int n)
{
int i;
for(i=0;i<n;i++,arr++){
printf("%3d",*arr);
}
}
2).设计思路
第一步:定义函数void input(int *arr,int n):定义整型变量i,用for循环逐个改变指针位置并逐个赋值,实现逐个把值返回到一维数组中。
第二步:定义函数void max_min(int *arr,int n):定义整型变量i、min、max、m、h,分别用来控制循环次数、记录最小值、记录最大值、记录取到最大值时数组下标、记录取到最小值时数组下标。通过算法将最大值与最后一个数交换,将最小值与第一个数交换。
第三步:定义函数void output(int *arr,int n):定义整型变量i,用for循环控制指针依次输出一维数组中的数。
3).本题调试过程碰到的问题以及解决办法
从运行结果可以看出应该是指针指的地址有错误,检查代码发现循环结束时指针指到了最后一个数据的后一个地址,所以要重新把指针指向第一个数据应该时arr=arr-10而不是arr=arr-9。
4).运行结果截图
二、学习进度统计
周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
3/2-3/8 | 2h | 23行 | 数组 | 无 |
3/9-3/11 | 3h | 29行 | 读取文件数据 | 无 |
3/12-3/18 | 5h | 70行 | 用数组输出矩阵 | 无 |
3/19-3/25 | 8h | 140行 | 多种排序方法 | 无 |
3/26-4/1 | 5h | 82行 | 字符(串)数组的相关知识 | 无 |
三、学习感悟
这周学习了指针的相关知识,新知识的学习提升了我的能力,以后可以更有效率的解决问题了。
四、结对编程过程和结对编程的优缺点
照片忘拍了,你信我。
队员优点:1.对不懂的问题善于寻求帮助2.有灵性3.冷静不浮躁
缺点:不主动和队友交流
结对编程的优点:(1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
(2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
(3)在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
(4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
总之,如果运用得当,结对编程能得到更高的投入产出比(Return of Investment)。
不适合结对编程的情况:
并不是所有的项目都适合结对编程,下面是一些不适合使用的例子。
1)处于探索阶段的项目,需要深入地研究,在这种情况下,一个人长时间的独立钻研是有必要的。
2)在做后期维护的时候,如果维护的技术含量不高,只需要做有效的复审即可,不必拘泥于形式,硬拉一个人来结对唱二人转。
3)如果验证测试需要运行很长时间,那么两个人在那里等待结果是有点浪费时间。