2019春第六周作业
作业:
这个作业属于那个课程 | C语言程序设计II |
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888 |
我在这个课程的目标是 | 理解变量、内存单元和地址之间的关系;掌握如何定义指针变量,怎样使用指针变量,怎样进行指针变量的初始化;掌握指针变量的基本运算;理解指针作为函数参数的作用;掌握如何使用指针实现函数调用返回多个值。 |
这个作业在那个具体方面帮助我实现目标 | 使用指针返回多个函数值;如何定义指针以及指针变量的基本运算 |
参考文献 | 书上指针章节以及函数章节,角色互换章节 |
6-1 求两数平方根之和 (10 分)
函数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\n", y );
return 0;
}
/* 请在这里填写答案 */
输入样例:
12 20
输出样例:
y=7.94
1)实验代码
double fun (double *a, double *b) //定义计算值的函数
{
double t;
t=sqrt(*a)+sqrt(*b); //计算结果
return t; //返回t
}
2)设计思路
函数的调用写的是计算过程
3)本题调试中遇到的问题及解决办法
本题没有出现问题。
4)运行截图
7-1 利用指针返回多个函数值 (30 分)
读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。
输入格式:
*输入有两行: 第一行是n值; 第二行是n个数。
输出格式:
*输出最大值和最小值。
输入样例:
*在这里给出一组输入。例如:
5
8 9 12 0 3
输出样例:
*在这里给出相应的输出。例如:
max = 12
min = 0
1)实验代码
#include<stdio.h>
void max_min(int a[],int n,int *max,int *min); /*函数声名*/
int main (void)
{
int n, min=0, max=0; /*定义变量*/
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){ /*输入数组*/
scanf("%d",&a[i]);
}
max_min(a, n, &max, &min); /*调用函数*/
printf("max = %d\nmin = %d",max,min);
return 0;
}
void max_min(int a[],int n,int *max,int *min) /*定义计算大小的函数*/
{
*max=*min=a[0];
for(int i=0;i<n;i++){ /*计算比较大小并赋值*/
if(*max<a[i])
*max=a[i];
if(*min>a[i])
*min=a[i];
}
}
2)设计思路
第一步:开始,函数声名;
第二步:定义变量,输入数组;
第三步:调用函数,写出计算大小的过程;
第四步:输出结果。
3)本题调试中遇到的问题及解决办法
>编译错误是由于注释符号错误,参考书上已改正;还有一个错误是由于在函数声明没有声明max,min这两个数,
是直接定义在主函数内的,所以我在调用函数写过程调用了错误,后参考书上函数章节已知晓改正。
4)运行截图
思考题:(分值等同于编程题)
1.为什么要使用指针?它有什么用?
答:1)在函数A调用函数B时,把一个内存块的地址传递过去,这样可以避免按值传递时开辟一个栈空间并逐一拷贝内存块里的值的开销(C++里的拷贝构造函数在做这件事),并且A,B函数操作的都是同一个内存块里的东西,如果这就是目的,那么传指针就是很有效率的做法(如果不用指针就可能要用一个全局的变量了). 用一个指针(函数指针)存放一系列同类型的函数名(入口地址),方便函数调用. 如果不用指针,传送速度慢,如果通过指针,只要传递一个地址。指针就是地址,另外还有指针变量,也就是存放地址的变量.平时使用的别的变量(指的指针变量以外的变量),就是用变量名字代表了它所在的空间,本质还是到这个地址去访问;而用指针变量访问,就是直接访问这个空间了,因此更高效.
2)利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序.
2.指针变量在内存中暂用多大的空间?它的大小由什么决定?
答:1)一般是四个字节。
2)指针大小是由当前CPU运行模式的寻址位数决定!
6-3 最小数放前最大数放后 (10 分)
为一维数组输入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=0; \*输入数组*\
for(i=0;i<n;i++)
{
scanf("%d",arr+i);
}
}
void max_min(int *arr,int n) \*调用第二个函数*\
{
int i=0,max=*arr,min=*arr,t=0,indexmax=0,indexmin=0; \*定义且赋值*\
for(i = 0;i < n;i++) \*计算找出最大值*\
{
if(*(arr+i)>max)
{
max=*(arr+i);
indexmax=i;
}
}
t=*(arr+n-1); \*交换值*\
*(arr+n-1)=max;
*(arr+indexmax)=t;
for(i=0;i<n;i++) \*计算找出最小值*\
{
if(*(arr+i)<min){
min=*(arr+i);
indexmin=i;
}
}
t=*arr; \*交换值*\
*arr=min;
*(arr+indexmin)=t;
}
void output(int *arr,int n) \*调用第三个函数*\
{
int i;
for(i=0;i<n;i++) \*输出结果*\
{
printf("%3d",*(arr+i));
}
}
2)设计思路
3)本题调试中遇到的问题及解决办法
本题开始写时是将其过程写在一起的,并不是将运算过程分别写入,所以编译错误,后参考了书中的角色互换章节不能这样写,后改正。
4)运行截图
三、学习进度条
周/日期 | 这周所花时间 | 代码行 | 学到的知识简介 | 目前比较迷惑的问题 |
3/4-3/9 | 4个半小时 | 37 | 1、建立文件,读取文件数据并储存;2、用户信息的加密和校验;3、FILE文件类型的运用 | 1、不会用加密算法以及FILE文件类型的运用 |
3/10-3/17 | 10个小时 | 90 | 1、二维数组的运用 | 1、有关数组的一些运用还不怎么明白 |
3/18-3/22 | 10个小时 | 91 | 1、冒泡排序法和选择排序法;2、二分法查找;3、二维数据:定义、引用、初始化,二维数组与矩阵。 | 1、冒泡排序法和选择排序法有点混淆。 |
3/25-3/29 | 12小时 | 84 | 1、字符串与字符的区别。 | 指针的运算不知道怎么算,弄不清 |
4/1-4/5 | 15小时 | 79 | 1、什么是指针;2、指针的基本运算;3指针变量的初始化。 | 不太懂得如何运用指针数组 |
四、学习感悟
在预习指针的时候以为只有指针的运算搞不清楚,听课时才发现指针变量的定义以及初始化有一部分也理解错误,通过本次学习知道了*以及&符号的意思和指针变量所指向的是内存地址,且指针变量的定义必须与它所只向的地址的值所定义的的类型要一样;还有本次的作业都需要用到调用函数,之前学这一章节的时候还不太懂,不过现在看书看懂了,知道如何的运用以及函数调用的意思,总的来说这次收获还是很大的,但学无止境,我的知识量还远远不足,需要我多花时间看书扩充知识,并多在电脑上操作。
五、结对编程感悟
本次结对编程感觉还好,虽然在做编程的过程中两个人出现的问题也挺多的但大部分还是解决了,其次我们也有不同意见的是时候,各执一词,说出了各自的想法,只有一些问题y我们是通过其他渠道解决的,这次结对编程总体来说是从不同观点到同一观点的过程,对于解决作业问题还是有效的。
六、表格和折线图
时间 | 代码行数 | 博客字数 |
第一周 | 0 | 0 |
第二周 | 37 | 400 |
第三周 | 90 | 694 |
第四周 | 91 | 1613 |
第五周 | 84 | 1410 |
第六周 | 79 | 2608 |