2019年春季学期第六周作业

A Q
这个作业属于那个课程 C语言程序设计II
这个作业要求在哪里 2019春第六周作业
我在这个课程的目标是 尽可能了解并且应用指针及文件和数组的知识
这个作业在那个具体方面帮助我实现目标 大致掌握了数组的简单编程及应用,了了解了文件和指针的基础知识和简单应用
参考文献 C语言chap11C语言chap10

一、本周完成的作业

题目1.6-1 求两数平方根之和

函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。**

函数定义接口

double fun (double *a, double *b); 

其中 ab是用户传入的参数。函数求 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);

三个函数中的 arrn 都是用户传入的参数。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.结对编程省时省力。
缺点:这种合作刚不是不习惯,结对编程远不如一个人编程自在,而且还相当于两人份题目难度和枯燥伴随。

posted @ 2019-04-05 14:22  反语ooo  阅读(253)  评论(1编辑  收藏  举报