2019年春季学期第六周作业
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.结对编程省时省力。
缺点:这种合作刚不是不习惯,结对编程远不如一个人编程自在,而且还相当于两人份题目难度和枯燥伴随。