回到课程主页,链接:C++程序设计课程主页-2012级
本次上机对应的教学内容:第5章 数组 - 字符数组,第六章 指针 指针的基本概念
第一部分 程序分析
阅读下面的程序,先写出其运行结果,再上机运行进行对比。必要时,单步执行程序,在监视(watch)窗口中观察变量的动态变化,从而掌握程序的运行机理。
(1)#include <iostream> using namespace std; void prt(int*, int*, int*); int a=10, b=40, c=20; int main(void) { 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(void) { 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 sub(int*); int main(void) { 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; }
(4)
#include <iostream> using namespace std; static int a[ ]={1,3,5,7,11,13}; main( ) { int *p; p=a+3; cout<<*p<<'\t'<<(*p++)<<endl; cout<<*(p-2)<<'\t'<<*(a+4)<<endl; }
第二部分 上机任务
【项目1-小心地放开玩字符串/字符数组】
(1)读程序,请分析其实现的功能
#include<iostream> using namespace std; int main() { char str[50]; int i=0,n=0; cout<<"输入字符串:"; gets(str); while(str[i]!='\0') { if(str[i]>='0'&&str[i]<='9') n++; i++; } cout<<"其中的数字个数是: "<<n<<endl; return 0; }请自选下面有关字符串中字符统计的任务,完成两个即可。
- 统计字母'A'(空格)出现的次数;
- 统计字符串中(大/小写)字母个数;
- 统计每一个数字字符出现的次数(提示:笨办法,设十个变量,例a0,a1,...,a9分别保存个数;显示学过数组的办法,设数组a[10],a[0]代表'0'出现的个数,当str[i]为'0'时,a[str[i]-48]++);
- 统计每一个字母出现的个数(提示:没有必要设26个或52个变量)
#include<iostream> using namespace std; int main() { char str1[50]="I am a happy boy\'s daddy.",str2[50]; int i=0,j=0; for(i=0;str1[i]!='\0';i++) { if(str1[i]!=' ') { str2[j]=str1[i]; j++; } } str2[j]='\0';//切记!! cout<<"整理后的字符串"<<str2<<endl; return 0; }请自选下面有关字符串中字符统计的任务,完成两个即可。
- 复制字符串str1,保存到str2中;
- 在字符串str2后面增加符号"//comment:"
- 将str1和str2接起来存放到str3中;
- 将str1中的空格去除,仍保存在str1中;
- 将str1和str2接起来,仍存放在str1中;
- 去除str1中的多余空格(即两个单词中间仅保留一个空格)。
- 在字符串前加5个符号"note:"
【项目2-带姓名的成绩单(字符数组版)】(参考15周项目3)设score数组中存储同学们的C++成绩,增加一个数组char name[][20]并赋初值,表示同学们的姓名(注意:本周不使用更方便的string类)。这两个数组中,同学的姓名与成绩的下标保持一致(例如name[1]和score[1]表示同一位同学的姓名和C++成绩)。请(1)输出按成绩排序后的同学的名单;(2)输出按同学姓名排序后的成绩单(排序对象是字符串)。提示:比较、复制等需要用到字符串函数。
【项目3-打入“内部”寻“内幕”】下面是一段使用了指针的程序。请利用“单步”执行的方式运行程序,深刻理解“指针变量存储的是地址值”、“通过指针变量间接访问”等概念。将在执行过程中留下深刻映像的界面截屏下来(不限一个),并加以点评。——学会单步调试,这件事不能再拖了!
#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; }下图是我在单步运行时截屏出来的一个图,供参考:
(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 *p1,*p2,a,b,t; cin>>a>>b; jiaohuan(&a,&b); cout<<"交换后:a="<<a<<" b="<<b<<endl; return 0; } //下面定义jiaohuan(&a,&b);
【项目5-填空学指针】采用指针访问方式从键盘给数组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; return 0; }