第六周作业
这个作业属于哪个课程 | C语言程序设计II |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2824 |
我在该课程的目标是 | 学会真正玩转指针,利用指针在指定的时间复杂度及其空间复杂度内进行更高效的程序设计。同时还要学会与c语言相关的结构体运用 |
这个作业在那个具体方面帮助我实现目标 | 关注相关的指针博客以及查阅以上相关应用的资料,同时要提前学习一下c语言“结构体”篇内容 |
参考文献 | https://blog.csdn.net/rdgfdd/article/details/79323168与https://blog.csdn.net/ljwoainia/article/details/79957079 |
作业一:求两数的平方根之和: | |
一:试题 | |
函数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
二.分析:本题较简单(仅水),难度不大,一次性AC,所以直接附上执行代码
三.执行代码(即将后面空缺的代码补全):
double fun (double *a,double *b)
{
double y,t,q;
t= *a;
q= *b;
y=sqrt(t)+sqrt(q);
return y;
}
四.运行正确截图:
五.思维流程图:
六.总结:本题总结的必要性应不是太大,重点是在下面两题,参见下面博文!
作业二:利用指针返回多个函数值
一.试题:读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。
输入格式:
输入有两行: 第一行是n值; 第二行是n个数。
输出格式:
输出最大值和最小值。
输入样例:
在这里给出一组输入。例如:
5
8 9 12 0 3
输出样例:
在这里给出相应的输出。例如:
max = 12
min = 0
二.执行代码:
#include<stdio.h>
void max_min(int a[],int q,int* pmax,int* pmin);
int main(){
int n,i=0,max,min,q=0;
int *pmax,*pmin;//此处不多说,定义两个指针变量
int a[10000];
scanf("%d",&n);//n代表个数
for(i=0;i<n;i++){
scanf("%d",&a[i]);
q++;//中间变量,具有叠加作用
}
max_min(a,q,&max,&min);//此处对pritf输出的值传输数据
printf("max = %d\nmin = %d",max,min);
return 0;
}
void max_min(int a[],int q,int* pmax,int* pmin){ //此处开始写递归函数
*pmax=a[0];//默认首个数为最大值
*pmin=a[0];//或为最小值
for(int j=0;j<q;j++){
if(*pmax<a[j]) *pmax=a[j];//若后面的某个数大于默认的首个数,即将最大数赋给它
if(*pmin>a[j]) *pmin=a[j];//对于最小值,反之则反
}
}
三.运行正确截图:
四.流程图:
五.总结:本题有些难度,如果没有用到指针变量,难度会很低,但是题目要求要使用指针变量,不然看题目分值,分值竟有30分之高,但是万变不离其宗,对于入门级的指针来说就一句话,*号取值,&号取址,其他的操作还是一如既往进行!
作业三: 最小数放前最大数放后
一.试题:为一维数组输入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;
}
/* 请在这里填写答案 */
二.执行代码:
void input(int *arr,int n){ //此处根据题目要求是输入 n个元素存到指针arr所指向的一维数组中
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
}
void max_min(int *arr,int n){ //此处是求指针arr所指向的一维数组中的最大值和最小值,其中最小的数与第一个数对换,将最大的数与最后一个数对换
int min=arr[0],max=arr[0],b=0,c=0;
for(int i=0;i<n;i++)
{
if(arr[i]>max){max=arr[i];b=i;}//此处进行比较,确定出最大值
if(arr[i]<min){min=arr[i];c=i;}//此处进行比较,确定出最小值
}
arr[c]=arr[0];//此处将
arr[0]=min;//最小值置于一组数的首位
arr[b]=arr[n-1];
arr[n-1]=max;//最大值置于一组数中的末位
}
void output(int *arr,int n){ //在一行中输出数组元素,每个元素输出占3列
for(int i=0;i<n;i++){
printf("%3d",arr[i]);
}
}
三.流程图
四.运行正确截图:
五.总结:用于太久没有用到递归函数做题,所以很多用法我都忘记了,在看到题目的时候我有些“迷”,不过在借阅了一下同学所给出的提醒代码后,我还是有了些眉目,本题也就是将每个关键步骤利用递归函数分布执行,总体来说如果第二题能完美解决,在本题处,只需要将题目中给出的三个递归函数理解透其意义。那么我们利用对代码的操作还是同第二题相似,只不过是多了一个调换数值位置的步骤,本题也是第二题的变式
作业四.
学习进度统计:
学习感悟:1.先回答为什么要使用指针:指针有利于大型数据的管理,尽可能减少其程序的时间复杂度与空间复杂度,虽然稍复杂,但能节省较多的空间
2.相关资料表明:指针变量在内存中是由编程者所选择的编译位数决定的,若选择了64位数,则占据了8字节,32位则占据了4字节
3.本周初入指针,在应对指针的入门级问题时,发现对指针进行相关的操作时,难度并不是太大,但是节省了很多运行的空间,掌握了指针,c语言的学习就已经达到了入门的阶段,后续的指针进阶问题应该会更加地难,还需要好好研究,多动手操作,因为指针是c语言的一个特色,是其他编译器少有的一项内容
4.本周我学习了一下c语言struct结构体的内容,觉得在处理大数据的过程中,结构体能够发挥其作用,对数据进行更系统而又高效的处理,如果使用到了指针式的strut结构体,那处理起来会更加快。到现在为止,我还是不太理解struct结构体的语法内容,只知道按照书本给的固定格式使用。不过如果自己不多动手,不去多对struct进行变式,那掌握的struct理论知识只相当于一团废纸,后续还是需要多花点时间钻研一下并借用c primer plus书籍进行相关内容的拓展!
作业五.
结对编程感受
本次结对编程,由于第一题的难度比较小,所以我在教我搭档时,就没有告诉她如何进行操作。很好---她自己能把自己该解决的问题解决,并且本周我给她推荐了我自己在自学过程中所使用的书籍。其实有些题目多去思考,动一下手,慢慢修改就会发现题目难度不会像自己所想象的那样难,编程并不是一个人的工作,但有时候若有自己思维,便可以让问题更高效的去得到解决,同时自己还学会并巩固了许多东西。如果与他人进行交流,那么我们也可以从他人那学会到自己未学到的技巧。总之,单人编程与结对编程总会有不少的好处。单人编程的好处是我们能够巩固自己已学会的东西,结对编程能够让我们学会到更多我们未学过的知识,比如我在和班上的几位大佬交流的过程中,我就感受到了自己的知识储备量很不足,这样也促使了我去主动拓展更多的c语言新知识!我最兴奋的,就是莫过于学会很多他人不知道的解题算法:例如sort排序算法,strlen函数的运用等等,那样别人不明白而我明白得一清二楚的内心极致感,是无法用言语来形容的。后期我还要学习更多的解题技巧,同时我也会将会教给我搭档更多的东西!加油吧~~