2019春第六周作业Compile Summarize
这个作业属于那个课程 | 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 | 一天 | 指针初步 | 行参与实参如何相互影响 |
写在最后:这次的编程总结确实赶了点,因为刚好碰见清明节,开了一上午高速,扫墓到四点,简单整理了一下就吃晚饭,可以说是时间紧迫了,但是呢,即便如此紧迫,作业还是要写要交的,我在尽量保证质量的情况下,勉强完成了作业,突然觉得我好屌
2019春第六周作业Compile Summarize的更多相关文章
- 2019春第五周作业Compile Summarize
这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 在这里 我在这个课程的目标是 能够精通关于数组内部运作原理 这个作业在哪个具体方面帮助我实现目标 如何输出一行的连续字符 参考文献与网址 ...
- 2019春第十周作业Compile Summarize
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 在这里 我在这个课程的目标是 能够对C语言的编写更加得心应手 这个作业在那个具体方面帮助我实现目标 结构体更进一步 参考文献与网址 C语言 ...
- 2019春第八周作业Compile Summarize
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 在这里 我在这个课程的目标是 能更加进一步的够熟练掌握指针的用法 这个作业在那个具体方面帮助我实现目标 指针对于高阶题目的做法 参考文献与 ...
- 2019春第七周作业Compile Summarize
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 在这里 我在这个课程的目标是 能更加进一步的够熟练掌握指针的用法 这个作业在那个具体方面帮助我实现目标 指针对于基础题目的做法 参考文献与 ...
- 2019春第十一周作业Compile Summarize
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 这里 我在这个课程的目标是 能按自己的想法解出题目 这个作业在那个具体方面帮助我实现目标 能朝着软件工程师方向发展 参考文献与网址 C语言 ...
- 2019春第十二周作业Compile Summarize
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 这里 我在这个课程的目标是 能按自己的想法解出题目 这个作业在那个具体方面帮助我实现目标 能朝着软件工程师方向发展 参考文献与网址 C语言 ...
- 2019春第九周作业Compile Summarize
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 这里 我在这个课程的目标是 能更加进一步的够熟练掌握指针的用法 这个作业在那个具体方面帮助我实现目标 能解更多的题 参考文献与网址 C语言 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第六周作业
<Linux内核原理与分析>第六周作业 一.本周内容概述: 学习系统调用的相关理论知识,并使用库函数API和C代码中嵌入汇编代码两种方式使用getpid()系统调用 学习系统调用syste ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第六周作业
2018-2019-1 20189221 <Linux内核原理与分析>第六周作业 实验五 实验过程 将Fork函数移植到Linux的MenuOS fork()函数通过系统调用创建一个与原来 ...
随机推荐
- 《剑指offer》连续子数组的最大和
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 酷痞运行于openwrt路由系统
欢迎你进入酷痞的物联网世界.这里有着自由的空气和自然的气息.接下来我将告诉你如果一步步建立一个自己专属的物联网平台. 酷痞官网地址:http://icoolpy.com 由于openwrt系统复杂 ...
- Redis数据结构之intset
本文及后续文章,Redis版本均是v3.2.8 上篇文章<Redis数据结构之robj>,我们说到redis object数据结构,其有5中数据类型:OBJ_STRING,OBJ_LIST ...
- %E6%9D%8E%E9%9B%B7是什么编码
在这个网站上可以进行解码http://tool.chinaz.com/Tools/URLEncode.aspx
- docker - 容器lxc
容器:是在用户空间进行隔离的组件叫做容器 常用的容器有lxc ----libcontainer---runc 需要隔离的资源有: Rootfs:每个容器对应的一个目录做为根目录 User: Hostn ...
- Linux下IPC中的信号量PV操作
代码如下所示,两边对照查看程序!(左图为先运行进程 右图为后运行进程) 运行的效果就是:当左边的进程检测到EOF,释放资源V操作之后,右边的进程会迅速的执行对应的printf的操作! 所有代码文 ...
- SpringCloud使用Nacos服务发现实现远程调用
本文使用SpringCloud结合Nacos服务发现,Feign远程调用做一个简单的Demo. 1 Nacos 关于Nacos之前写了两篇文章关于SpringBoot对它的使用,感兴趣可以查看一下. ...
- Urozero Autumn 2016. BAPC 2016
A. Airport Logistics 根据光路最快原理以及斯涅尔定律,可以得到从定点$P$进入某条直线的最佳入射角. 求出每个端点到每条线段的最佳点,建图求最短路即可. 时间复杂度$O(n^2\l ...
- d4-01
一.字典 1.1 var dict = {"name":"zhangsan"} 定义字典 1.2 dict.name 取得name的值 1.3 del ...
- UIdynamic系列认知
1.刚上来就遇到的大坑 按照前辈们的代码码上了一段重力效果,结果不管怎么折腾都没有任何效果,不由心塞. 开始怀疑是不是模拟器不支持呀?是不是必须拖动到视图上的空间才可以呀? 结果试了各种方法还是没效果 ...