2019春第六周作业

这个作业属于那个课程 C语言程序设计II
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/2890
我在这个课程的目标是 学会如何使用自定义指针函数
这个作业在那个具体方面帮助我实现目标 在这个作业中学到了指针函数的应用
参考文献 C语言程序设计(第三版)第八章

基础作业

PTA:6-1 求两数平方根之和 (10 分)

函数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)
{
  return sqrt(*a)+sqrt(*b);
}

2)设计思路

3)本题调试过程中碰到的问题及其解决办法

发现函数名不对,还有很多错误。通过看书解决。

4)运行截图

7-1 利用指针返回多个函数值 (30 分)

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

输入格式:

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

输出格式:

输出最大值和最小值。

输入样例:

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

5
8 9 12 0 3

输出样例:

在这里给出相应的输出。例如:

max = 12
min = 0

1)实验代码

#include<stdio.h>
#include<string.h>
void max_min(int a[],int s,int* px,int* pn);
int main(){
  int n,i,max,min,s=0,*px,*pn,a[100000];
  scanf("%d",&n);
  for(i=0;i<n;i++){
    scanf("%d",&a[i]);
    s++;
  }
  max_min(a,s,&max,&min);
  printf("max = %d\nmin = %d",max,min);
  return 0;
}
void max_min(int a[],int s,int* px,int* pn){
  int i;
  *px=a[0];
  *pn=a[0];
  for(i=1;i<s;i++){
    if(*px<a[i]) *px=a[i];
    if(*pn>a[i]) *pn=a[i];
  }
}

2)设计思路

主函数

自定义函数

3)本题调试过程中碰到的问题及其解决办法

发现是编译错误后就在编译器中编译然后找出错误。

4)运行截图

思考题:(分值等同于编程题)

为什么要使用指针?它有什么用?

它把相同的事物归类,然后把事物做出标记,避免给相同的特点做变量。用来简单的标记一个地址引用。
指向变量地址,便于对变量操作。
就像桌面的快捷方式,它指向一个真实的文件。
就像给存储器的某个存储地址单元起了个名字,操作这个名字就等于操作的这个存储地址单元,比如,要给某个存储地址单元赋值,这时候就把值赋给,指向这个存储地址的名字。也就是说,使用指针表示地址单元比直接用内存地址号表示方式,更人性化,操作更灵活。

指针变量在内存中暂用多大的空间?它的大小由什么决定?

一个指针变量在内存中占四个字节,字长:在同一时间中处理二进制数的位数叫字长。通常称处理字长为8位数据的CPU叫8位CPU,32位CPU就是在同一时间内处理字长为32位的二进制数据。一般说来,计算机在同一时间内处理的一组二进制数称为一个计算机的“字”,而这组二进制数的位数就是“字长”。字长与计算机的功能和用途有很大的关系,是计算机的一个重要技术指标。字长直接反映了一台计算机的计算精度,为适应不同的要求及协调运算精度和硬件造价间的关系,大多数计算机均支持变字长运算,即机内可实现半字长、全字长(或单字长)和双倍字长运算。在其他指标相同时,字长越大计算机的处理数据的速度就越快。字长由微处理器(CPU)对外数据通路的数据总线条数决定。 最小可寻址单位:内存的最小可寻址单位通常都是字节。也就是说一个指针地址值可对应内存中一个字节的空间。 寻址空间:寻址空间一般指的是CPU对于内存寻址的能力。CPU最大能查找多大范围的地址叫做寻址能力,CPU的寻址能力以字节为单位 (字节是最小可寻址单位)一个指针的值就是一个32位的二进制数,32位对应4字节(Byte)所以指针大小是由当前CPU运行模式的寻址位数决定!

挑战作业

思路

我们先要要了解联通元素怎样判断,然后在输出。

预习作业 6-3 最小数放前最大数放后 (10 分)

为一维数组输入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 i,max,min,s=0;
  for(i=0;i<n;i++){
    if(arr[i]>arr[max])  max=i;
    if(arr[i]<arr[min])  min=i;
  }
  s=arr[0];
  arr[0]=arr[min];
  arr[min]=s;
  s=arr[n-1];
  arr[n-1]=arr[max];
  arr[max]=s;
}
void output(int *arr,int n)
{
  int i;
  for(i=0;i<n;i++){
    printf("%3d",arr[i]);
  }
}

2)设计思路

主函数

自定义函数




3)本题调试过程中碰到的问题及其解决办法


发现是运行超时,然后将代码复制在编译器编译,发现是算法问题。

4)运行截图

5)预习中存在的疑惑

指针函数到底该怎么使用,指针函数的里面的值怎么去定义。

结对编程

优点

1:碰见问题我们先讨论思路,能够更快解决。
2:如果代码不对,两个人可以一起寻找错误,这样效率更快。

缺点

1:两个人有时思路不同,就会发生争执,然后时间就过去了。

学习感悟

本周学习了指针函数的定义和运用,如何将指针作为函数的参数,指针与数组,地址之间的关系等。我对于指针函数的定义和运用还是不太懂,但上课老师说的时候又有一点懂。

学习进度

|日期|这周所花时间|代码行数|学到的知识点简介|问题|
|------|------------------|:----------😐-------------------------------|
|3/16~3/24|12h|150|一维数组与二维数组的应用|不太熟悉数组|
|3/25~3/31|7h|300|指针变量的定义|对于指针变量只是了解一点,不是太熟稔|
|3/31~4/5|10h|220|指针函数的定义与运用,指针,数组和地址的关系|课堂上感觉自己应该多会了,到了宿舍后发现还是自己想多了|

时间 博客字数 代码行数
第一周 0 60
第二周 120 100
第三周 220 160
第四周 260 200
第五周 300 360
第六周 600 580

折线图

posted @ 2019-04-05 20:40  代码不是我的菜  Views(287)  Comments(2)    收藏  举报