A | Q |
---|---|
这个作业属于那个课程 | C语言程序设计II |
这个作业要求在哪里 | 2019春第六周作业 |
我在这个课程的目标是 | 尽可能了解并且应用指针及文件和数组的知识 |
这个作业在那个具体方面帮助我实现目标 | 大致掌握了数组的简单编程及应用,了了解了文件和指针的基础知识和简单应用 |
参考文献 | C语言chap11和C语言chap10 |
一、本周完成的作业
题目1.6-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\n", y ); return 0; } / 请在这里填写答案 */
输入样例:
12 20
输出样例:
y=7.94
1).实验代码
double fun (double *a, double *b){ double y; y=sqrt(*a)+sqrt(*b); return y; }
2) .设计思路
mermaid flowchat st=>start: 定义函数声明和头文件,定义变量 io=>inputoutput: 输入a,b sub=>subroutine: 利用自定义函数计算两数平方根之和 io1=>inputoutput: 输出y e=>end: return 0; st->io->sub->io1->e
子程序:
mermaid flowchat st=>start: 定义y op=>operation: 调用sqrt直接计算 e=>end: return y; st->op->e
3).本题调试过程碰到问题及解决办法
问题:本以为很简单的题目,没想到提交之后竟然编译错误。
解决方法:仔细阅读了书本和参考文献之后发现原来是a,b前面少了指针标志*
4).运行结果截图
题目2.7-1 利用指针返回多个函数值
读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。
输入格式:
输入有两行: 第一行是n值; 第二行是n个数。
输出格式:
输出最大值和最小值。
输入样例:
在这里给出一组输入。例如:
5 8 9 12 0 3
输出样例:
在这里给出相应的输出。例如:
max = 12 min = 0
1).实验代码
#include<stdio.h> void max_min(int *arr,int n,int* pmax,int* pmin); int main(){ int i,max,min,n; int *pmax,*pmin; int a[1000]; scanf("%d\n",&n); for(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 *arr,int n,int* pmax,int* pmin){ int i; *pmax=arr[0]; *pmin=arr[0]; for(i=1;i<n;i++){ if(*pmax<arr[i]) { *pmax=arr[i]; } if(*pmin>arr[i]) { *pmin=arr[i]; } } }
2) 设计思路
mermaid flowchat st=>start: 定义头文件小恒名自定义函数,定义变量 io=>inputoutput: 输入n,并且利用for输入数组 sub=>subroutine: 利用max_min函数进行寻找最大值最小值 io1=>inputoutput: 分两行输出max和min e=>end: return 0; st->io->sub->io1->e
子程序:
mermaid flowchat st=>start: 申明自定义函数,定义i op=>operation: *pmax=arr[0];和*pmin=arr[0]; cond=>condition: i<n cond1=>condition: *pmax<arr[i] cond2=>condition: *pmin>arr[i] op1=>operation: *pmax=arr[i]; op2=>operation: *pmin=arr[i]; e=>end: 结束函数 st->op->cond cond(no,left)->e cond(yes)->cond1 cond1(yes,)->op1->cond2 cond1(no,)->cond cond2(yes,)->op2(left)->e cond2(no,)->cond
3).本题调试过程碰到问题及解决办法
问题:第一次提交碰到答案错误,软件上运行也不如意,多次调试。
解决方法:在反复调试中和查看书后发现原来是没有给pmax和pmin赋初始值。
4).运行结果截图
题目3.挑战作业
接着上周的挑战作业继续,本周, 我们需要考虑如果 “子数组” 并不要求是一个矩形, 而是联通的元素即可 (上下或左右相邻即视为联通), 那解法会是怎么样呢?
具体要求请参看邹欣老师博客 现代程序设计作业
1) 设计思路
1.我会尝试按点来进行拓展成面的计算 2.一数组中一个数为基点,计算上下左右和本身之和,逐个累加,,然后再以联通的其中一个元素为基点在计算 3连续增加则继续,连续减少则停止,直指最大和
题目4.预习作业:最小数放前最大数放后
为一维数组输入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++) { scanf("%d",&arr[i]); } } void max_min(int *arr,int n) { int temp1=0,temp2=0,b,s,i; int max,min; min=max = arr[0]; for (i=0;i<n;i++) { if (max<arr[i]) { max = arr[i]; b= i; } } temp2=arr[9]; arr[9]=arr[b]; arr[b]=temp2; for (i=0;i<n;i++) { if(min>arr[i]){ min= arr[i]; s= i; } } temp1=arr[0]; arr[0]=arr[s]; arr[s]=temp1; } void output(int *arr,int n) { for (n=0;n<10;n++) { printf("%3d",arr[n]); } printf("\n"); }
2) 设计思路
第一函数:
mermaid flowchat st=>start: 申明自定义函数,定义i io=>inputoutput: 利用for循环输入数组 e=>end: 结束函数 st->io->e
第二函数:
mermaid flowchat st=>start: 申明自定义函数,定义相关变量 op=>operation: 初始赋值min=max=arr[o]; cond=>condition: i<n cond2=>condition: min>arr[i] cond1=>condition: max<arr[i] op2=>operation: temp1=arr[0];arr[0]=arr[s]; arr[s]=temp1; op1=>operation: temp2=arr[9];arr[9]=arr[b];arr[b]=temp2; e=>end: 结束函数 st->op->cond cond(no)->e cond(yes,left)->cond1 cond1(yes)->op1->cond cond1(no)->cond2 cond2(yes,Right)->op2(right)->cond
第三函数:
mermaid flowchat st=>start: 申明自定义函数 op=>operation: 利用printf输出数组 cond=>condition: n<10? e=>end: 结束函数 st->cond cond(no)->e cond(yes)->op->cond
3) 本题调试过程中碰到问题及解决办法
问题:由于对指针的定义数组不熟悉导致了很多错误的出现,预习作业是出挑战作业里面最有难度的题目了。
解决方法:仔细阅读题目,加上重新浏览书本,重新编写了一套代码
4) 运行结果截图
题目5.思考题
1.为什么要使用指针?它有什么用?
指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; 能很方便地使用数组和字符串; 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。 学习指针是学习C语言中最重要的一环, 能否正确理解和使用指针是我们是否掌握C语言的一个标志。同时, 指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试。
2.指针变量在内存中暂用多大的空间?它的大小由什么决定?
教科书上说指针大小和机器字长相同,即32位机指针长度为4字节!那么只是唯一回答吗?在网上浏览了下,我怕发现答案不一!在查看了众多关于指针变量的回答之后,我从其中最全面的分析中得出结论(参考自指针变量占用内存大小):指针大小是由当前CPU运行模式的寻址位数决定!
1).学习进度统计
2).学习感悟
(1)本周你学习哪些内容?有哪些收获?
本周学习了数组的进阶和自定义函数的简单应用,我觉得这些对我来说都是很有难度的,我只能从书本中不过和网络上多多汲取知识。我再这次可中收获了许多编程的小技巧。
(2)本周所学内容中你觉得哪些地方是难点?对此你做了哪些措施去客服这些难点?
第六周的预习和挑战作业很难,基础作业加强版在观看书本文件类似案例之后,难度也还行,挑战作业是真的只是有点思路呀!克服这些困难,我觉得只有多多向大佬们和网络讨教学习啦。
三、结对编程的过程及优缺点
关于结对编程
本次结对编程地点在教室,本次结对与熟人搭档,过程还是很愉快的,结对编程中我们讨论了第六周预习作业中的代码修改问题,双方讨论的气氛不错,题目的思路各有不同,难以统一。两个人编程果然还是远不如一个人自在。
结对编程的优缺点
优点:1.结对编程可以提高动手合作;2.结对编程有利于吐纳对的友好合作能力,搭档合作可以提升做题的效率;3.结对编程省时省力。
缺点:这种合作刚不是不习惯,结对编程远不如一个人编程自在,而且还相当于两人份题目难度和枯燥伴随。
来源:https://www.cnblogs.com/LfanWyuXooo/p/10658636.html