作业——7
这个作业属于哪个课程 | C语言程序设计Ⅱ |
这个作业的要求在哪里 | C语言作业评价标准 |
我在这个课程的目标是 | 学会运用指针并复习数组的使用 |
这个作业在哪个具体方面帮助我实现目标 | 用指针和数组 |
参考文献 | 指针的作用 |
第六周作业
一 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
实验代码
double fun (double * a, double * b)
{
double c;
c=sqrt (* a) + sqrt (* b);
return c;
}
设计思路
本题调试过程碰到问题及解决方法
无。
运行结果截图
2 、利用指针返回多个函数值
读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。
输入格式:
输入有两行: 第一行是n值; 第二行是n个数。
输出格式:
输出最大值和最小值。
输入样例:
在这里给出一组输入。例如:
5
8 9 12 0 3
输出样例:
在这里给出相应的输出。例如:
max = 12
min = 0
实验代码
#include<stdio.h>
void max_min(int a[], int n, int *max, int *min);
int main(void)
{
int n, i, max, min, a[100];
scanf("%d" ,&n);
for(i = 0; i<n; i++){
scanf("%d", &a[i]);
}
max = min = a[0];
max_min(a, n, &max ,&min);
printf("max = %d\nmin = %d", max, min);
return 0;
}
void max_min(int a[],int n,int *max,int *min){
int i;
*max = *min = a[0];
for(i = 1; i < n; i++){
if(*max < a[i]){
*max = a[i];
}
if(*min > a[i]){
*min = a[i];
}
}
}
设计思路
本题调试过程碰到问题及解决方法
愚蠢的问题,我在输出结果的等于号前后打了空格,然后一直格式错误,放进devc++运行结束后发现的......
运行结果截图
3 、第六周预习作业:最小数放前最大数放后
为一维数组输入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){
int i;
for(i=0;i<10;i++){
scanf("%d",arr+i);
}
}
void max_min(int *arr, int n)
{
int i = 0, max = *arr, min = *arr, t = 0, indexmax = 0, indexmin = 0;
for(i = 0;i < n; i++)
{
if(*(arr+i) > max)
{
max = *(arr+i);
indexmax = i;
}
}
t = *(arr + n - 1);
*(arr+n-1) = max;
*(arr+indexmax) = t;
for(i = 0; i < n; i++)
{
if(*(arr+i) < min){
min = *(arr+i);
indexmin = i;
}
}
t = *arr;
*arr = min;
*(arr + indexmin) = t;
}
void output(int *arr, int n)
{
int i;
for(i = 0; i < n; i++)
{
printf("%3d", *(arr+i));
}
}
设计思路
本题调试过程碰到问题及解决方法
无。
运行结果截图
预习的主要内容
●变量、内存单元和地址之间的关系;定义指针变量,使用指针变量,进行指针变量的初始化;指针变量的基本运算;指针作为函数参数的作用;如何使用指针实现函数调用返回多个值。
思考题
1.为什么要使用指针?它有什么用?
● 指针只是一个变量,它存储一个内存地址。如果传入一个地址,比传入一个struct效率要高,因为少了一个拷贝过程。
● 指针能够有效的表示数据结构,能动态分配内存,能较方便的使用字符串,有效的使用数组。
● 值传递不如地址传递高效,因为值传递先从实参的地址中提出值,再赋值给形参带入函数计算;而指针则把形参的地址直接指向实参地址,使用时直接提出数据,使效率提高,特别在频繁赋值等情况下。
2.指针变量在内存中暂用多大的空间?它的大小由什么决定?
● 指针变量是保存一个变量地址的变量,它里面保存的是一个特殊的东西:地址,即内存单元。一个内存单元要用32个状态来表示,(32个0和1),一个0或1占用1个位,8个位是一个字节,所以当然要占用32/8=4个字节的空间。
● 因机器不同所占的字节数也有所不同。在32位的机器上,一个指针变量占4个字节,在64位的机器上,一个指针变量占8个字节。
二、学习进度条
周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
第二周 | 4 hours | 35 | 用c语言程序读取电脑中的文本文件并对其进行基础操作 | ... |
第三周 | 4 hours | 69 | 初步使用二维数组,如何写入一个矩阵 | ... |
第四周 | 5 hours | 102 | 认识了选择排序法、二分查找法和冒泡排序法以及在二维数组的定义、引用、初始化和其矩阵。 | ... |
第五周 | 5 hours | 98 | 用到二维数组,初用头文件<string.h>中的strlen函数和strcpy函数 | ... |
第六周 | 5 hours | 96 | 了解了变量、内存单元和地址之间的关系;了解了如何定义指针变量,怎样使用指针变量,怎样进行指针变量的初始化;了解了指针变量的基本运算;了解了指针作为函数参数的作用;了解了如何使用指针实现函数调用返回多个值。 | ... |
... |
三、学习折线图
四、学习感悟&结对编程
- 由于在上课时因为自身原因困意太深在课后完成作业时有些吃力,但大多书上的题目还是有流程和大纲的,给出的题目就是会有一些条件限制,这些是要注意的点。然后本周的结对编程又没有如期完成,因为个人有事,无法同同学一起结对编程,结对编程优劣参半吧,看个人情况了。