课程主页在:http://blog.csdn.net/sxhelijian/article/details/11890759
第一部分 程序分析
阅读下面的程序,先写出其运行结果,再运行对比。
读不懂怎么办?支招1:按课堂上老师讲课的方式,将变量对应内存的“框子”画出来,用大脑当CPU,写出变量的变化过程;支招2:单步执行程序,在监视(watch)窗口中观察变量的动态变化,从而掌握程序的运行机理。(1)
#include <iostream> using namespace std; void prt(int*, int*, int*); int a=10, b=40, c=20; int main() { prt(&a, &b, &c); prt(&a, &b, &c); return 0; } void prt(int *x, int *y, int *z) { cout<<++*x<<','<<++*y<<','<<*(z++)<<'\n'; }
(2)
#include <iostream> using namespace std; int sub(int*); int main() { int i, k; for (i=0; i<4; i++) { k=sub(&i); cout<<"sum="<<k<<'\t'; } cout<<"\n"; return 0; } int sub(int *s) { static int t=0; t=*s + t; return t; }
(3)
#include <iostream> using namespace std; int *p; void pp(int a, int *b); int main() { int a=1, b=2, c=3; p=&b; pp(a+c, &b); cout<<"(2)"<<a<<','<<b<<','<<*p<<endl; return 0; } void pp(int a, int *b) { int c=4; *p=*b+c; a=*p-c; cout<<"(1)"<<a<<','<<*b<<','<<*p<<endl; }
(4)
#include <iostream> using namespace std; static int a[ ]= {1,3,5,7,11,13}; int main( ) { int *p; p=a+3; cout<<*p<<'\t'<<(*p++)<<endl; cout<<*(p-2)<<'\t'<<*(a+4)<<endl; return 0; }
第二部分 上机任务
【项目1-打入“内部”寻“内幕”】下面是一段使用了指针的程序。请利用“单步”执行的方式运行程序,深刻理解“指针变量存储的是地址值”、“通过指针变量间接访问”等概念。将在执行过程中留下深刻映像的界面截屏下来(不限一个),并加以点评。
#include<iostream> using namespace std; int main() { int a=2, b=3, c[5]= {1,2,3,4,5}; int *p1, *p2, *p3; p1=&a; p2=&b; p3=c; p3++; (*p3)+=10; cout<<a<<'\t'<<b<<'\t'<<c[1]<<endl; cout<<*p1<<'\t'<<*p2<<'\t'<<*p3<<endl; return 0; }通过这个项目,再次强调学会单步调试。挖掘机就在面前,却就要用铁锹一锹一锹挖,这怎么能让人说你勤奋?!单步调试这台挖掘机,只要上手,就能会开,遇到困难,有各种途径。
下面是单步运行中的一张图片,供参考:
【项目2-指来指去】设计一个程序,利用指针完成下面的工作
(1)下面的程序,输入10 100和100 10,均可以输出max=100 min=10,请补充完整程序
#include <iostream> using namespace std; int main( ) { int *p1,*p2,a,b,t; cin>>a>>b; p1=&a; p2=&b; //下面加入代码,只许用p1,p2和t,不许用a和b,t作为交换时的中间变量 cout<<"max="<<a<<" min="<<b<<endl; return 0; }
(2)下面的程序将调用函数进行变量的交换,请设计出交换的函数
#include <iostream> using namespace std; int main( ) { int a,b; cin>>a>>b; jiaohuan(&a,&b); cout<<"交换后:a="<<a<<" b="<<b<<endl; return 0; } //下面定义jiaohuan函数;
【项目3-填空学指针】采用指针访问方式从键盘给数组a[N]输入数据,然后对元素值重新按逆序存放并输出。请补充完整下面的程序。
#include <iostream> using namespace std; const int N=8; int main() { int a[N],*p,*q; for(p=a; p<a+N; p++) ___(1)___; p=a; q=a+N-1; while(p<q) { int r=*p; *p=*q; *q=r; ___(2)___; ___(3)___; } for(p=a; p<a+N; p++) cout<<*p<<' '; cout<<endl; }
【项目4-有相同数字?】编写程序,要判断两个有序数组中是否存在相同的数字
参考代码:
#include<iostream> using namespace std; int main() { int a[]={1,4,7,8}; int b[]={2,5,6,9,10}; int n1=sizeof(a)/sizeof(a[0]); int n2=sizeof(b)/sizeof(b[0]); bool flag=existthesame(a,n1,b,n2); if(flag==true) cout<<"两个有序数组中存在相同的数字!\n"; else cout<<"两个有序数组中不存在相同的数字!\n"; return 0; } bool existthesame(int *a,int n1, int *b,int n2) { }
【项目5-奇数因子】编写函数 int fun(int x, int *pp)。其功能是,求出x的所有奇数因子,并按照从小到大的顺序放在pp指向的内存中,函数返回值为这些整数的个数。若x的值为30,数组中的数为1,3,5,15,函数返回4。
下面是该程序main()函数的部分代码作为参考。
int main() { int a[50],x,n; ____________; n=fun(x,a); cout<<x<<”的奇因子共有”<<n<<”个,分别是:” for(int i=0;i<n;i++) _________________; cout<<endl; ______________; return 0; } //下面定义fun函数
==================== 迂者 贺利坚 CSDN博客专栏=================
|== IT学子成长指导专栏 专栏文章分类目录(不定期更新) ==|
|== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==|
======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======