这个作业属于那个课程 | C语言程序设计II |
---|---|
这个作业要求在哪里 | 在这里 |
我在这个课程的目标是 | 能够熟练掌握指针的用法 |
这个作业在那个具体方面帮助我实现目标 | 对指针的使用更加得心应手 |
参考文献与网址 | C语言程序设计II(第三版) 菜鸟教程中关于指针的教学 |
编程题一
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
我的代码
double fun (double *a, double *b)
{
double y;
y=sqrt(*a)+sqrt(*b);
return y;
}
编程流程图
解决此题遇见的困难与解决办法
问题截图:
问题原因:我一直想怎么用结构体写出此题,却忘记了题目要求是将尾巴写出来,不是将整个代码全写出来,类似于一种填空题。
问了我的邻居后,他提示我注意看题目要求,遂改之,他的博客:在这,所以说审题还是很重要的
运行结果截图
编程题二
读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。
输入格式:
输入有两行: 第一行是n值; 第二行是n个数。
输出格式:
输出最大值和最小值。
输入样例:
在这里给出一组输入。例如:
5
8 9 12 0 3
输出样例:
在这里给出相应的输出。例如:
max = 12
min = 0
我的代码
#include<stdio.h>
#include<string.h>
void max_min(int a[],int len,int* pmax,int* pmin);
int main ()
{
int n,i,max,min,len;
int *pmax,*pmin;
int a[10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
len++;
}
max_min(a,len,&max,&min);
printf("max = %d\nmin = %d",max,min);
return 0;
}
void max_min(int a[],int len,int* pmax,int* pmin)
{
int i;
*pmax=a[0];
*pmin=a[0];
for(i=1;i<len;i++)
{
if(*pmax<a[i]) *pmax=a[i];
if(*pmin>a[i]) *pmin=a[i];
}
}
编程流程图
解决此题遇见的困难与解决办法
问题编程截图
问题原因:忘记给两个最大最小指针赋初值了,小的错误不应再犯。
运行结果截图
编程题三
为一维数组输入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 < n;i++){
scanf("%d",& *(arr + i));
}
}
void max_min(int *arr,int n){
int idx=0,i,t;
for ( i = 0; i < n; i++ ) {
if ( arr[i] < arr[idx] ){
idx=i; }
}
if(idx!=0){
t=arr[0];arr[0]=arr[idx];arr[idx]=t;
}
idx=0;
for ( i = 0; i < n; i++ ) {
if ( arr[i] > arr[idx] ){
idx=i;}
}
if(idx!=(n-1)){
t=arr[n-1];
arr[n-1]=arr[idx];
arr[idx]=t;}
}
void output(int *arr,int n){
int i;
for(i = 0;i < n;i++){
printf("%3d",*(arr + i));
}
}
编程流程图
解决此题遇见的困难与解决办法
问题截图
问题原因:忘记看题目要求了,它要求输出每个之间空三格。
我是怎么发现这个错误的?
因为它的报错老是格式错误,所以我就把找错的主要目标放在输入与输出上,结果输出的格式不对,遂改之。
运行结果截图
思考题一:为什么要使用指针?它究竟有什么用处?
为了解决这个问题,我们首先要知道指针是用来干嘛的,也就是:
1.它能干什么?
指针实际上就是一个内存地址,比如一个函数指针,就是一个函数的入口地址,通过这个地址,系统就可以找到这个函数的位置并调用它。简单地说指针就是指向变量和对象的地址。指针的用途非常广泛,比如如果你想通过函数改变一个变量的值,就得用指针而不能用值传递。还有在很多时候变量,特别是对象的数据量实在太大,程序员就会用指针来做形参,只需要传递一个地址就行。
其次,当我在选择工具编码时,我完全可以用最简单的,最易理解的工具,所以:
2.我为什么不用其他工具而使用指针?
原因在于:
1.指针允许你以更简洁的方式引用大的数据结构
2.指针使程序的不同部分能够共享数据 **
3.利用指针,能在程序执行过程中预留新的内存空间 **
3.指针可以用来记录数据项之间的关系
综上,我可以浅显的解释,使用指针,可以便捷的传递值,也可以高效,迅速的实现储存空间的动态分配。作为“C语言之眼”的指针,她能做的,不仅仅是对复杂数据的处理,不仅仅是对计算机内存分配进行控制,在未来,也许会出现比她更加强大的工具,但是,指针的原理与奥妙,在C语言史上,具有划时代的影响力,我相信,这种影响力会一直持续到永远。
思考题二:指针变量在内存中占用多大的空间?它的大小由什么决定?
要解决这个问题,我们要首先去理解“字节”的概念,她就是:
字长:在同一时间中处理二进制数的位数叫字长。通常称处理字长为8位数据的CPU叫8位CPU,32位CPU就是在同一时间内处理字长为32位的二进制数据。二进制的每一个0或1是组成二进制的最小单位,称为一个比特(bit)。
一般说来,计算机在同一时间内处理的一组二进制数称为一个计算机的“字”,而这组二进制数的位数就是“字长”。字长与计算机的功能和用途有很大的关系,是计算机的一个重要技术指标。字长直接反映了一台计算机的计算精度,为适应不同的要求及协调运算精度和硬件造价间的关系,大多数计算机均支持变字长运算,即机内可实现半字长、全字长(或单字长)和双倍字长运算。在其他指标相同时,字长越大计算机的处理数据的速度就越快。早期的微机字长一般是8位和16 位,386以及更高的处理器大多是32位。目前市面上的计算机的处理器大部分已达到64位。
字长由微处理器(CPU)对外数据通路的数据总线条数决定。
最小可寻址单位:内存的最小可寻址单位通常都是字节。也就是说一个指针地址值可对应内存中一个字节的空间。
寻址空间:寻址空间一般指的是CPU对于内存寻址的能力。CPU最大能查找多大范围的地址叫做寻址能力,CPU的寻址能力以字节为单位 (字节是最小可寻址单位),如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是为什么32位寻址的CPU最大能搭配4G内存的原因,再多的话CPU就找不到了。
这里CPU的寻址位数是由地址总线的位数决定,32位CPU的寻址位数不一定是32位,因为32位CPU中32的意义为字长。
有关寻址范围计算解释,对于32位寻址的CPU,其地址值为32位的二进制数,所以可以表示的最大地址为2的32次方(即4G,最大内存空间为4GB,这里G表示数量、GB表示容量)。同时我们不难看出,一个指针的值就是一个32位的二进制数,32位对应4字节(Byte)。所以,指针的大小实际上是由CPU的寻址位数决定,而不是字长。
指针的大小与处理器和操作系统关系如下图所示:
处理器与操作系统 | 指针占用 |
---|---|
32位处理器上32位操作系统的32位编译器 | 指针大小4字节 |
32位处理器上32位操作系统的16位编译器 | 指针大小2字节 |
32位处理器上16位操作系统的16位编译器 | 指针大小2字节 |
16位处理器上16位操作系统的16位编译器 | 指针大小2字节 |
以上内容和来自百度百科并由本人整理排版
所以,我们所讲的指针占用空间,就是将占用字节的数量,而具体限制她占用空间的具体因素,在计算机界仍然存在争议,大多数人认为指针大小是由当前CPU运行模式的寻址位数决定,另一部分则认为与之无关,具体要看系统方面对于指针的自适应。
个人学习感悟
写在前面:这周还是蛮忙的,当然学到的东西也是不在少,每一周我们的课就一节,所以大部分知识只能自己学,我总不能自己编出一些我学的什么东西吧,手动滑稽,我对我目前的学习状况来看,还是比较不满意的,具体在于:
1.知识储备太少。脑子里一顿骚操作,问题是脑子里装的东西不允许
2.学艺不精。做作业和高中的完成任务差不多,自己所能学到的,少之又少
3.不思考。学到什么东西,就单单是学到,完全不在思考一下,做题目也是,必须思考
4.动手。干我们这行,一天不打代码就会一秒变小白,正是应了那句:“学如逆水行舟,不进则退”
结对编程感悟
这次的结对编程,总体而言比上一次也就是第一次要好得多,体现在:
1.我是充分理解了再教我的搭档,避免上次的情况。
2.突出重点,上次讲了太多废话
这次的问题与矛盾也依然存在,体现于:
1.硬本领不足
2.敷衍了事
3.学习的态度还没有端正过来
4.自己定制的计划没有充分实行
基于上述问题与毛病,将尽全力去改正,多做事,少空想,华为设计师不是靠想就可以当的上的学艺尚未成精,同志们仍需努力
学习进度表
| 时间|代码行数|这周所花的时间|学到的知识点简介|目前比较疑惑的问题|
| ------------: | ------------: | ------------: | ------------: |
| 3/2-3/19 |35|两天|通过代码读取文件里的数据,并且在屏幕上打印|为什么文件的使用还要进行关闭
|3/9-3/19 |65|三十分钟|没有学到任何知识点|想知道指针与数组之间的内在联系|
|3/19-3/22|186|五个小时|二维数组的用法加上二分法找元素|需要多打代码多多练习|
| 3/22-3/28 | 31 | 一天 | 字符串的使用 | 数组排序的内部原理 |
|3/28-4/5| 108 | 一天 | 指针初步 | 行参与实参如何相互影响 |