The C++ Programming Language 第五章 作业


//The C++ programming language 作业 5.9.1

//写出声明:到字符的指针,包含10个整数的数组,包含10个整数数组的引
//用,到字符串数组的指针,到字符的指针的指针,常量整数,常量整数的
//指针,到整数的常量指针。

#include<iostream.h>

void main()
{
 char* a="i love bb!!";
 cout<<a<<endl;
 int b[10]={1,2,3,4,5,6,7,8,9,10};
 for(int i=0;i<10;i++)cout<<b[i]<<" ";
 cout<<endl;
 int *c=b;
 for(i=0;i<10;i++)cout<<*c++<<" ";
 cout<<endl;
 char d[]="i love bb!!";
 char *e=d;
 for(i=0;*e!=0;i++)cout<<*e++;
 cout<<endl;
 char** f=&a;    //和int**有点不一样
 cout<<*f<<endl;
 char*** g=&f;
 cout<<**g<<endl;
 const int h=321;
 cout<<h<<endl;
 int const* j=&h;
 cout<<*j<<endl;
 j=&i;
 cout<<*j<<endl;
 int *const k=&i;
 cout<<*k<<endl;
 *k=13;
 cout<<*k<<endl;
}




//The C++ Programming Language 作业 5.9.3

//用typedef定义:
 //unsigned char,const unsigned char
 //到整数的指针
 //到字符的指针的指针
 //到字符的数组的指针
 //7个整数的指针的数组
 //到包含7个整数的指针的数组的指针
 //包含8个数组的数组,其中每个数组包含7个到整数的指针

#include<iostream.h>
void main()
{
 //typedef unsigned char or const unsigned char
 typedef unsigned char uc;
 typedef const unsigned char cuc;
 uc a;
 a='g';
 cout<<a<<endl;
 cuc b=a;    //必须初始化
 cout<<b<<endl;
 //b='f';    //错误,const型

 //到整数的指针
 int* c=new int(123);
 cout<<*c<<endl;
 
 //到字符的指针的指针
 char *d="hahaha";
 char **e=&d;
 cout<<d<<endl;
 cout<<*e<<endl;
 
 //到字符的数组的指针
 char f[10]="aaabbbccc";
 char *f1=f;
 cout<<f<<endl;
 cout<<f1<<endl;

 //7个到整数的指针的数组
 int* g[7];
 for(int i=0;i<7;i++)
  g[i]=new int(i*100);  //申请7个整数,并把地址送给g[i]
 for(i=0;i<7;i++)
  cout<<g[i]<<endl;   //显示每个元素中的指针地址
 for(i=0;i<7;i++)
  cout<<*g[i]<<endl;   //显示每个元素中的指针所指对象的值

 //到包含7个整数的指针的数组的指针
 int** h=g;
 for(i=0;i<7;i++)
  cout<<*h++<<endl;   //显示每个元素中的指针地址
         //也可以用cout<<h[i]<<endl;
 h-=7;       //还原指针地址
 for(i=0;i<7;i++)
  cout<<**h++<<endl;   //显示每个元素中的指针所指对象的值

 //包含8个数组的数组,每个数组包含7个到整数的指针
 int **j[8]={g,g,g,g,g,g,g,g};
 int k=0;
 for(i=0;i<8;i++)
 {
  cout<<"j["<<i<<"]:  ";
  for(k=0;k<7;k++)
   cout<<*j[i][k]<<" ";
  cout<<endl;
 }
 //如果一个数组的元素是数组,也就是说这个数组的元素是另一数组的首地址,
 //是一个指针,那么这个数组也是一个指针,本例的j就是一个指向8个数组的
 //指针的指针。
}




//The C++ Programming Language 作业 5.9.4

//写一个函数,它交换两个整数(交换它们的值)。用int*作形参。再写
//另一个交换函数,用int&作形参。


#include<iostream.h>
void swap1(int* a,int* b)
{
 int t=*a;
 *a=*b;
 *b=t;
}
void swap2(int& a,int& b)
{
 int t=a;
 a=b;
 b=t;
}
void main()
{
 int a=11,b=22;
 swap1(&a,&b);   //指针必传地址
 cout<<"a:"<<a<<",b:"<<b<<endl;
 swap2(a,b);    //引用直接传变量就可以了
 cout<<"a:"<<a<<",b:"<<b<<endl;
}


//The C++ Programming Language 作业 5.9.6

//定义函数f(char),g(char&),h(const char&)之后,用参数'c',49,3300,c,uc,sc
//作为参数调用它们,其中c是char,uc是unsigned char,sc是signed char。哪些调
//用是合法的?哪些调用将导致编译器引起临时变量

#include<iostream.h>
void f(char a)
{cout<<a<<endl;}
void g(char &a)
{cout<<a<<endl;}
void h(const char &a)
{cout<<a<<endl;}
void main()
{
 char c='d';
 unsigned char uc='e';
 signed char sc='f';
 int i=77;
 f(i); 
 f('c');     
 f(49);
 f(127);
 f(3300);    //引起警告,将const int赋值给char,无意义
 f(c);
 f(uc);
 f(sc); 
 cout<<endl;
 //g('c');    //错,不能将const char转为char&
 //g(49);    //错,不能将const int转为char&
 //g(3300);    //错,不能将const int转为char&
 g(c);     //OK,可以将char转为char&
 //g(i);     //错,不能将int转为char&
 //g(uc);    //错,不能将unsigned char 转为char&
 //g(sc);    //错,不能将signed char 转为char&
 cout<<endl;
 h('c'); 
 h(49);
 h(3300);    //引起警告,将const int赋值给char,无意义
 h(c);
 h(uc);
 h(sc); 
 char p=0;
 cout<<endl;
 cout<<p<<endl;
 //实参为'c',49,3300时,调用函数均会使编译器引进临时变量。
}

//结论:

//char的范围是-128至127,超出界限则进行隐式转换,编译器会警告,如3300。

//1,以char作为函数形参:
  //可以接受char,int,const int,signed char,unsigned char等类型
  //是因为传入实参只在函数体中使用,不会影响函数外的实际变量,所以接受。
//2,以char&作为函数形参:
  //只能接受char类型。
  //是因为传入实参是引用外部变量,会间接修改外部值,存在一些不安全
  //的隐式转换,所以除char外的类型都不接受。
//3,以const char&作函数形参:
  //可以接受char,int,const int,signed char,unsigned char等类型
  //主要是因为是const,所以在函数体中不会修改实参,所以接受。




//The C++ Programming Language 作业 5.9.10

//定义一个字符串的数组,其中的字符串保存的是月份的名字。打印出这些字符串
//将这些字符串传递给一个函数并打印出来。


#include<iostream.h>
void printm(char** a)
{
  for(int i=0;i<12;i++)
  cout<<a[i]<<endl;
}
void printm1(char* a)
{cout<<a<<endl;}
void main()
{
 char* month[12];
 month[0]="一月";
 month[1]="二月";
 month[2]="三月";
 month[3]="四月";
 month[4]="五月";
 month[5]="六月";
 month[6]="七月";
 month[7]="八月";
 month[8]="九月";
 month[9]="十月";
 month[10]="十一月";
 month[11]="十二月";
 
 for(int i=0;i<12;i++)
  cout<<month[i]<<endl;

 cout<<endl;
 printm(month);
 cout<<endl;
 printm1(month[0]);
}

//传递存有字符串的数组,类型应为指针char指针的指针




//The C++ Programming Language 作业 5.9.11:

//从输入读一系列的单词,使用Quit作为输入的结束单词。按照读入的顺序打印出这些单词,
//但同一个词不要打印两次,打印前对单词排序。

//用char做的,一个字,烦.....

#include<iostream.h>
bool hehe(char* a,char *b)
{
 while(*a!=0)
  if(*a++!=*b++)return 0;
 if(*b!=0)
  return 0;
 else
  return 1;
}
bool findchar(char *s[],char *d,int n)
{
 for(int i=0;i<n;i++)
  if(hehe(s[i],d))return 1;
 return 0;
}
char *nchar(char* a)
{
 char *b=new char;
 char *t=b;
 while(*a!=0)
  *t++=*a++;
  *t='/0';
 return b;
}
void main()
{
 char* cxbb[100];
 int i=0;
 cxbb[99]=new char;
 while(++i)
 {
  if(i>99)break;
  cin>>cxbb[99];
  if(hehe(cxbb[99],"quit"))break;
  cxbb[i-1]=nchar(cxbb[99]);
 }
 i-=1;
 cout<<"共输入了"<<i<<"个单词!!"<<endl;
 
 //新建数组,并去除重复
 char* czbb[100];
 for(int j=0,o=0;j<i;j++)
 {
  if(j==0)czbb[o++]=cxbb[j];
   else
   if(!findchar(cxbb,cxbb[j],j))
    czbb[o++]=cxbb[j];
 }
 cout<<"去除重复后单词个数为:"<<o<<"个!"<<endl;
 for(i=0;i<o;i++)cout<<czbb[i]<<endl;
 
 //输出去除重复后之新单词数组,以首字符排序输出
 //这里只考虑了大小写英文字符
 cout<<"排序后输出:"<<endl;
 int x=0,y=0,z=0,p=0;
 for(i=0;i<26;i++)
 {
  x=65+i;y=97+i;
  for(j=0;j<o;j++)
  {
   z=int(*czbb[j]);
   if(z==x||z==y)
    {cout<<czbb[j]<<endl;p++;}
  }
  if(p==o)break;
 }
}


//用string做的,精简了很多....

#include<iostream>
#include<string>
using namespace std;
void main()
{
 string cxbb[100],temp;
 int n=100,len=0;
 while(n--)
 {
  cin>>temp;
  if(temp=="quit")break;
  cxbb[len++]=temp;  
 }
 //去除重复生成新数组
 string czbb[100];
 czbb[0]=cxbb[0];
 int k=1,i=1,j=0;
 for(i=0;i<len;i++)
  for(j=0;j<k;j++)
  {
   if(cxbb[i]==czbb[j])
    break;
   else
    if(j==k-1)
     czbb[k++]=cxbb[i];
  }

 //排序输出
 int key=0;
 for(j=0;j<26;j++)
  for(i=0;i<k;i++)
  {
   key=int(czbb[i][0]);
   if(key==65+j||key==97+j)cout<<czbb[i]<<endl;
  }
}

//The C++ Programming Language 作业 5.9.12

//统计一对字母在一字符串中出现的次数
//用char实现

#include<iostream.h>
int charlen(char *a)
{
 int i=0;
 while(*a++!=0)i++;
 return i;
}
bool hehe(char *s,char *d)
{
 int l=charlen(d);
 while(l--)
 if(*s++!=*d++)
  return 0;
 return 1; 
}
int haha(char *s,char *d)
{
 int l=charlen(s);
 int j=0;
 for(int i=0;i<l;i++)
  if(hehe(&s[i],d))j++;
 return j;
}
void main()
{
 char *c="kdksllkdkwockdjkd d dkdsd d";
 cout<<"jsabd在"<<c<<"出现了"<<haha(c,"kd")<<"次"<<endl;
}



//The C++ Programming Language 作业 5.9.13

//定义一个struct Date以保存日期的轨迹。提供一些函数,从输入读Date,向
//输出写Date,以及用一个日期去初始化Date;

#include<iostream.h>
struct Date
{
 int year;
 int month;
 int day;
 void init(int y=1900,int m=1,int d=1)
 {
  year=y,month=m,day=d;
 }
 void input()
 {
  cout<<"请输入年份:";
  cin>>year;
  cout<<"请输入月份:";
  cin>>month;
  cout<<"请输入天:";
  cin>>day;
 }
 void show()
 {
  cout<<"日期是:"<<year<<"年"<<month<<"月"<<day<<"日!/n";
 }
};
void main()
{
Date cxbb;
cxbb.init(1978,11,9);
cxbb.show();
cxbb.input();
cxbb.show(); 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xchenbb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值