2019春第六周作业
这个作业属于哪个课程 | C语言程序设计II |
这个作业要求在哪里 | 2019年春季学期第六周作业 |
我在这个课程的目标是 | 我希望能够通过学习C语言的知识,编写程序 |
这个作业在哪个具体方面帮助我实现目标 | 这个作业让我知道了怎样将指针作为参数传入自定义函数中使用 |
参考文献 | sqrt函数 |
一、本周完成的作业
题目1. 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)
{
double Y;
Y = sqrt(*a) + sqrt(*b);
return Y;
}
2). 设计思路
3).本题调试过程碰到问题及解决办法
遇到的问题:编译错误,在调用指针变量时把它当成了普通变量
解决的办法:查看错误信息,发现是指针a,b,在使用时漏了*
4).运行结果截图
题目2. 7-1 利用指针返回多个函数值 (30 分)
读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。
输入格式:
输入有两行: 第一行是n值; 第二行是n个数。
输出格式:
输出最大值和最小值。
输入样例:
在这里给出一组输入。例如:
5
8 9 12 0 3
输出样例:
在这里给出相应的输出。例如:
max = 12
min = 0
1).实验代码
#include<stdio.h>
void max_min(int n, int number[10000], int *max, int *min);
int main(void)
{
int i, n, max, min;
scanf("%d", &n);
int number[10000];
for(i = 0;i < n;i ++)
scanf("%d", &number[i]);
max_min(n, number, &max, &min);
printf("max = %d\nmin = %d", max, min);
return 0;
}
void max_min(int n, int number[10000], int *max, int *min)
{
*max = number[0];
*min = number[0];
for(int i = 0;i < n;i ++)
{
if(*max < number[i])
*max = number[i];
if(*min > number[i])
*min = number[i];
}
}
2). 设计思路
3).本题调试过程碰到问题及解决办法
遇到的问题:编译错误,函数声明头没有加分号
解决的办法:导致了后面的函数都不能被调用,加上分号
4).运行结果截图
题目3. 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)
{
for(int i = 0;i < n;i ++)
scanf("%d", arr+i);
}
void max_min(int *arr,int n)
{
int max, min, medium = 0, a, b, i;
max = arr[0];
min = arr[0];
for(i = 0;i < n;i ++)
{
if(max < arr[i])
{
max = arr[i];
a = i;
}
if(min > arr[i])
{
min = arr[i];
b = i;
}
}
medium = arr[a];
arr[a] = arr[n-1];
arr[n-1] = medium;
medium = arr[b];
arr[b] = arr[0];
arr[0] = medium;
}
void output(int *arr,int n)
{
for(int i = 0;i < n;i ++)
printf(" %d ", arr[i]);
}
2). 设计思路
3).本题调试过程碰到问题及解决办法
遇到的问题:答案格式错误,在最后输出时没有理解题意
解决的办法:发现是答案格式错误后,搭档一眼就看出了我的错误在输出的部分,我写的" %d ",搭档指出后修改"%3d"
4).运行结果截图
思考题:
1.为什么要使用指针?它有什么用?
答:在查阅资料后我得出:指针的作用类似于书本上的便签,方便了我们查找所需要的数据。
引用:作个比喻,假设将电脑存储器当成一本书,一张内容记录了某个页码加上行号的便利贴,可以被当成是一个指向特定页面的指针;根据便利粘贴面的页码与行号,翻到那个页面,把那个页面的那一行文字读出来,就相当于是对这个指针进行反参考的动作。
2.指针变量在内存中暂用多大的空间?它的大小由什么决定?
答:在查阅资料后发现大部分的意见都是,在通常情况下16位cpu上是16位 = 2字节,32位cpu上是32位 = 4字节,64位cpu上是64位 = 8字节,指针的大小实际上是由CPU的寻址位数决定,而不是字长参考资料1 参考资料2参考资料3
题目1. 挑战作业
接着上周的挑战作业继续,本周, 我们需要考虑如果 “子数组” 并不要求是一个矩形, 而是联通的元素即可 (上下或左右相邻即视为联通), 那解法会是怎么样呢?
具体要求请参看邹欣老师博客 现代程序设计作业
1).设计思路
第一步 输入二维数组
第二步 循环进行相邻(上下或左右)的元素的比较(难点)
第三步 循环比较大小的同时也不断将最大的元素的地址存储在另一个数组中
第四步 输出最大矩形子数组的和
二、学习进度条
周/日期 | 这周所花的时间 | 代码行数 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
3/2-3/8 | 20h | 300行 | 数组,指针的大致意义,文件入门 | 数组串的使用,指针 |
3/9-3/15 | 25h | 400行 | 二维数组,文件与数组的结合运用 | 双for循环的流程图(再不上课,光自学感觉太艰难了) |
3/16-3/22 | 22h | 450行 | 一维数组,二维数组,几种数组排序法 | 字符串使用 |
3/23-3/29 | 20h | 350行 | 字符串的定义及其使用 | 指针的具体使用 |
3/30-4/5 | 15h | 340行 | 指针变量的定义,使用,初始化及其基本运算,指针作为函数参数的作用;使用指针实现函数调用返回多个值 | 指针在运行时内存的变化 |