1508-张晨曦总结《2016年-11月-2日》【连续12天总结】

标题:真 奥义 C++第八章终结

关键词:指针

内容

A. 一句话概括今日目标完成情况

a)复习前三节 0%

b)完成第八章的学习 100%

B.具体内容

指向一位数组的行指针:

#include<iostream>
using namespace std;
int main()
{
int a[3][4]={{1,3,5,7},{2,4,6,8},{1,2,3,4}},(*p)[4];
for(p=a;p<a+3;p++){
for(int j=0;j<4;j++){
cout<<*(*p+j)<<'\t';
}
}
cout<<endl;
return 0;
}

字符串常量可以看成是存放在一个一维的字符数组中,当指针指向字符串后,引用字符串中的字符可以使用的形式是这样的:

*(指针变量+下标) 或者是 指针变量[下标]。

 查找字符串中给定字符的函数

#include<iostream>
using namespace std;
char *strchr(char *str,char c)
{
while(*str!='\0')
{
if(*str==c)return str;
str++;
}
return NULL;
}
int main()
{
char s[]="abcdefghij";

        char *str="abcdefghij";
char *p;
p=strchr(str,'j');
if(p==NULL)cout<<"字符串中无该字符"<<endl;
else
cout<<"该字符在串中的位置是:"<<p-str<<endl;
return 0;
}

将输入的月份数字输出为对应的英文名:

#include<iostream>
using namespace std;
char *month_name(int n)
{
static char *month[]=   //静态数组 
{
"Illegal month",
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
};
return (n>=1&&n<=12)?month[n]:month[0];
}
int main()
{
int n;
cin>>n;
cout<<n<<"-"<<month_name(n)<<endl;
return 0;
}

这次是用指针数组做的。但是不懂为什么编译的时候给了我一大堆Warning,但是我还是可以运行程序的,而且是准确的运行。

使用结构指针来访问日期结构类型变量,这里用两种方法来表示。1 (*指针变量).成员名  2 指针变量—>成员名  这两种格式最后输出的类型是完全一样的。不过第二种看起来更好理解一些,更符合人类的逻辑。

#include<iostream>
using namespace std;
struct Date
{
int year;
int month;
int day;
};
int main()
{
Date d={2015,4,8},*p=&d;
cout<<(*p).year<<"-"<<(*p).month<<"-"<<(*p).day<<endl;
cout<<p->year<<"-"<<p->month<<"-"<<p->day<<endl;
return 0;
}

动态申请: new的使用  

int n,*p;
cout<<"Please input n:";
cin>>n;
p=new int[n];

if(p==NULL){
cout<<"空间申请失败!":return 0;
}
cout<<"请输入n个数:";
for(int i=0;i<n;i++){
cin>>p[i];
}

这样就可以将输入的n值作为数组的元素个数了

而delete是释放动态申请的内存空间。一定要使用的。释放单个动态变量直接 delete 指针变量 即可。而释放动态数组是要  delete []  指针变量.

★ 逆置数组元素

#include<iostream>
using namespace std;
void invert(double *x,int n)
{
double t,*i,*j;
i=x;
j=x+n-1;
while(i<j)
{
t=*i;*i=*j;*j=t;
i++;j--;
}
}
int main()
{
double a[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
cout<<"原数组:";
for(int i=0;i<15;i++){
cout<<a[i]<<" ";
}
cout<<endl;
invert(a,15);
cout<<"逆置后:";
for(int i=0;i<15;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}

经过这么多天,我深深的意识到了自定义函数的强大。先在头文件下面写上自定义函数,然后int main()主函数,几乎可以解决所有问题了吧。真是生猛。

而下面这个是使用new函数和rand随机取值函数搞出来的一大串。

#include<iostream>
#include<stdlib.h>
using namespace std;
void invert(double *x,int n)
{
double t,*i,*j;
i=x;
j=x+n-1;
while(i<j)
{
t=*i;*i=*j;*j=t;
i++;j--;
}
}
int main()
{
double *p=new double[15];
for(int i=0;i<15;i++){
p[i]=(double)rand()/RAND_MAX*(100-10)+10;
}
cout<<"原数组:"<<endl;
for(int i=0;i<15;i++){
cout<<p[i]<<'\t';
}
invert(p,15);
cout<<"逆置后:"<<endl;
for(int i=0;i<15;i++){
cout<<p[i]<<'\t';
}
return 0;
}

就是求了15个10-100的随机数,然后把他逆置输出。(我也不知道这个改动过后的主函数有什么意义可能就是这个老师想装个逼把)

这个字符串装逼是在太强了!

#include<iostream>
#include<cstring> 
using namespace std;
void sort(char(*p)[10],int n)
{
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(strcmp(p[i],p[j])>0)
{
char t[10];
strcpy(t,p[i]);
strcpy(p[i],p[j]);
strcpy(p[j],t);
}
}
}
}
int main()
{
char str[][10]={"Zhang","Wang","Wen","Xu","Li","Zhou"};
sort(str,6);
for(int i=0;i<6;i++){
cout<<str[i]<<'\t';
}
return 0;
}

哦不是……是字符串排序 第一个字母不行还可以用第二个字母排,没想到自己有朝一日也能写出这样的程序哈哈哈。至于后面的不想使用cstring的拷贝函数我也是醉了,为什么不用……非要去自定义一个拷贝函数呢……

IP地址变为点分十进制形式:(看起来就很高大上有没有啊!)

#include<iostream>
#include<cstring>
using namespace std;
bool check(char *str)   //检查有无除了0和1以外的数字 
{
int i;
for(i=0;i<32;i++)
if(str[i]!='1'&&str[i]!='0'){
return false;
}
return true;
}
int trans(char *str)   //二进制变十进制!要背过! 
{
int n=0,i;
for(i=0;i<8;i++){
if(str[i]=='1'){
n=n*2+1;
}
else n=n*2;
}
return n;
}
int main()
{
char IP[33];
cout<<"请输入32位二进制IP地址:"<<endl;
cin>>IP;
if(strlen(IP)!=32){
cout<<"IP地址的长度应该为32位"<<endl;

else{
if(!check(IP)){
cout<<"IP地址对应的点分十进制写法:"<<endl;
cout<<trans(IP)<<"."<<trans(IP+8)<<"."<<trans(IP+16)<<"."<<trans(IP+24)<<endl; 

}
return 0;
}

这个用了两个自定义函数,分别用来检查输入的32位里有没有除了1和0以外的数字以及将二进制转化为十进制。但是我这个主程序的else语句应该是有问题的。编译的时候没有error,但是运行的时候只能输入32位数字,敲了Enter之后没有任何回馈,调试了很久,这让我感到了些许的崩溃。这可能是我一个月来最沮丧的晚上了。

虽然很困,但是我还是把这些东西给敲完了。(因为昨天发了毒誓啊,不把第八章学完天打雷劈啊)。碰见好玩的事,刚才写程序的时候,辛辛苦苦打了大半年,结果刚编译好就让我的腾讯电脑管家给删除了,说我这是病毒。当时很欣喜:哇,我已经可以编写出病毒了!改天我也写个熊猫烧香。想了一会,发现:这什么垃圾电脑管家,老子敲了半天让你给我删了? 然后我就很生气的恢复了cpp文件并添加进了信任区。上图。这电脑管家可能是北半球最XX的了。

搞完了这个之后,我就敲那个IP地址转换的,两个自定义函数很新鲜,有种莫名的激动感。就好像你一直想要个孩子,盼了好久然后一下子有了个双胞胎。额,我觉得需要说明的一点是每天我的总结总是打这么多字,总给人一种不务正业的感觉,好像你这人一天不好好学C++,经他妈写日记了。但是,但是!我这个敲键盘的速度是非常快的,你们要知道,可能是东半球第四快的人了。所以别看我打了这么多字,但其实连十分钟都没有。而我学习的时间确实要比这个厂的。所以坦率地讲,我这并不算不务正业,而且实际上我也没什么正业。

最后的最后,我思考了很久,我明天到底是学习第九章呢?还是复习第八章呢?毕竟两天就走完有点仓促……

想了大概两分钟,我决定复习第六章第七章了。因为中国古代有位哲学家叫孔子你们可能听说过,他说了一句话叫 温故而知新,可以为师也。我觉得非常的对,虽然我不想当个老师,但也要以老师的标准来要求自己(某些方面)。再有就是今天早上C++的时候去机房,我竟然被一段简单的倒序输出难住了半小时!看来VC6.0和Dev还是有区别的。(上面那句纯粹放屁),其实这才是我要复习的真正原因。对了吐槽一句,於跃成你教的好烂哦……顺便推荐一首歌 Hit the Ground


C.明日计划

复习第六七章内容。

 

 

我的博客:http://blog.csdn.net/andr3zzzz

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值