//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();
}