第六周作业

基础题一:求两数平方根之和
函数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 ", y );
return 0;
}

/* 请在这里填写答案 */
输入样例:
12 20
输出样例:
y=7.94

实验代码:
double fun (double a, double b)
{
double sum=0;
sum=sqrt(
a)+sqrt(
b);
return sum;
}

流程图

本题应解决的问题:

运行结果截图

题目二:利用指针返回多个函数值

读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。

输入格式:
输入有两行: 第一行是n值; 第二行是n个数。

输出格式:
输出最大值和最小值。

输入样例:
在这里给出一组输入。例如:

5
8 9 12 0 3
输出样例:
在这里给出相应的输出。例如:

max = 12
min = 0

实验代码

include<stdio.h>

void max_min(int *str,int n,int *max,int *min);
int main()
{
int i,n,max,min;
scanf("%d ",&n);
int str[n];
for(i=0;i<n;i++)
scanf("%d",&str[i]);
max_min(str,n,&max,&min);
printf("max = %d min = %d",max,min);
return 0;
}
void max_min(int *str,int n,int max,int min)
{
int i;
max=str[0];
min=str[0];
for(i=0;i<n;i++)
{
if(
(str+i)>
max)
max=(str+i);
if(
(str+i)<
min)
min=(str+i);
}
return 0;
}

流程图及设计思路

遇到的问题及解决思路

问题1:为什么有些在dev-c++上面是错的,而在pta上面而是对的。
解决办法:多次在dev-c++上面编译运行及在pta上面提交,发现其问题由于编译器不同导致。
问题2:对新函数的不熟悉,不会灵活运用
解决办法:多查找资料,在网上咨询。

运行结果截图

题目三预习题:
为一维数组输入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

实验代码:
void input(int *arr,int n)
{
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
}
void max_min(int *arr,int n)
{
int i,max,min,temp;
for(i=1;i<n;i++)
{
if(arr[i]>arr[max])
max=i;
if(arr[i]<arr[min])
min=i;
}
temp=arr[max];
arr[max]=arr[9];
arr[9]=temp;
temp=arr[0];
arr[0]=arr[min];
arr[min]=temp;
}
void output(int *arr,int n)
{
for(int i=0;i<n;i++)
{
printf("%3d",arr[i]);
}
}
流程图及其设计思路

遇到的问题及解决办法:

问题:最大的问题是对于新函数的运用不熟练,for循环语句的使用错误。
解决办法:多次在dev-c++上面运行编译。
运行结果截图:

题目四:思考题
一:为什么要使用指针?指针的好处在哪里
答:链接https://wenwen.sogou.com/z/q873261172.htm
由于c/c++开发先与java和c#,c/c++为了给程序员以控制内存的目的而提出了指针。
一个简单的例子就是垃圾回收机制。在c/c++中,你可以使用delete(free)来释放内存,在c#和java里面就只能靠其自己的内存回收机制来回收了。有些时候,内存吃紧的话是必须要立马释放的。那么这种情况c#和java就做不到了。
所以说c#和java里面不是不要指针,而是处处是“指针”,只是它给你封装了,不在让你头疼c/c++中指针带来的一些问题了。
好处:连接https://wenwen.sogou.com/z/q712208116.htm
1.在数据传递时,如果数据块较大(比如说数据缓冲区或比较大的结构),这时就可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存。
2.数据转换,利用指针的灵活的类型转换,可以用来做数据类型转换,比较常用于通讯缓冲区的填充,比如说,一个数据缓冲区char buf[100],如果其中buf[0,1]为命令号,buf[2,3]为类型,buf[4~7]为某一数值,类型为int,就可以使用如下语句进行赋值:
(short)&buf[0]=cmdID;
(short)&buf[2]=type;
(int)&buf[4]=value;
3.字符串指针,是使用最方便,且常用的。
4.函数指针,形如:#define PMYFUN (void*)(int,int),可以用在大量分支处理的实例当中,如某通讯根据不同的命令号执行不同类型的命令,则可以建立一个函数指针数组,进行散转。
5.在数据结构中,链表、树、图等大量的应用都离不开指针。
二:指针变量在内存中暂用多大空间?
链接:https://www.sogou.com/sogou
答:32位编译器:4个字节;64位编译器:8个字节。
它的大小由什么决定?
答:编译器的版本决定

学习体会:学习了相关的指针函数及其数组之间的关系。
难点:多组函数的混合使用就不知道灵活使用,同时对于指针的熟练度也不太高。
解决方法:上网查寻,询问结对同学及听老师讲解
对于结对编程
优点:1.有利于相互借鉴、资源的互用。
2.能更好的发现问题,解决问题。
3.有利于同伴默契的提高,以便以后参加工作提前适应。
缺点:各自都有事情,时间不好统一。
学习心得:对于提高逻辑能力有待加强。多去学习网上优秀博客的解题思路和经验,充实自己。再者加强for语句的灵活运用。继续撸起袖子加油干!!!

原文地址:https://www.cnblogs.com/huanglexing/p/10658653.html