经过上次晚交作业导致没分以后

我再也不敢晚交作业了

今天就把这次作业先写了

 

homework Part 1

1. 理解C++变量的作用域和生命周期

a) 用少于10行代码演示你对局部变量的生命周期的理解

#include<stdio.h>
int fun()
{
    int a;
    a=3;
    printf("局部变量的a值%d\n",a);
    return a;
    }
int main()
{
    int a=4;
    fun();
    a++;
    printf("主函数的a值%d\n",a);
    }

写了这样一段函数

运行结果

在fun函数中定义了一个int a

但是他的生命周期仅限于fun函数中

在main中定义一个a以后

调用fun函数

由于离开了fun的生命周期

最后的printf输出main的a的值的时候是a=4,然后a++的运算即是5

fun中的函数也不受到main中a=4的影响

互不干涉

 

homework Part 2

2. 理解堆和栈,两种内存的申请和释放的方式

a) 用少于30行代码演示你对堆和栈两种内存申请方式的理解

我写下了这段代码

#include "iostream.h"
int main()
{
   int size;
   float sum1=0;
   float sum2=0;
   int *heapArray;
   int stackArray[100];
   cout <<"请输入元素个数:";
   cin >>size;
   heapArray=new int[size];//创建堆内存数组 
   cout <<"请输入各元素:" <<endl;
   for (int i=0;i<size;i++)
   {
      cin >>heapArray[i];
      stackArray[i]=heapArray[i];
      sum1=sum1+heapArray[i];
      sum2=sum2+stackArray[i];
   }
   cout <<"这些数的平均值为(堆内存)" <<sum1/size <<endl;
   cout <<"这些数的平均值为(栈内存)" <<sum2/size <<endl;
   delete [] heapArray;
   return 0;
}

 

运行结果

 

我对堆内存和栈内存的理解

堆内存是需要手动释放的

而栈内存是我们平时常用的方法

对于堆内存,程序员可以根据自己的需要来创建内存大小,并且由自己管理内存

缺点也显而易见,容易产生内存泄露

而栈内存需要事先定义好,由系统来控制他的释放,不自由

用百度上别人打的一个比喻

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

 

homework Part 3

理解unique_ptr和shared_ptr

 

在课上,我觉得老师已经讲的十分清楚了

不知道我理解的对不对

unique_ptr是一对一的指针模式

shared_ptr是多对一的指针模式

所谓unique_ptr就是一个指针对应一个地址

这个地址的数据不能由新的指针指向

相当于unique_ptr与对应的那个地址的数据绑定了

当unique_ptr失效的时候,对应绑定的数据也同时被释放

而shared_ptr就是多个指针对应一个地址

这个数据由多个指针指向

每多一个指针,系统内部计数器+1

当删除指针的时候,系统内部计数器-1

当系统内部计数器到达0时

最后一个shared_ptr对应的数据被删除

 

homework Part 4


#include <stdio.h>
#include <string.h>
#include <stdlib.h>


char ch;
char token[100]={0};


void retract(FILE *file)
{
 fseek(file,-1,SEEK_CUR);
}


void catToken()
{
 token[strlen(token)] = ch;
}


void clearToken(){                          
 memset(token,0,sizeof(token));
}


int isLetter()
{
 if((ch>='a' &&ch<='z')||(ch>='A'&&ch<='Z')||ch<0)
  return 1;
 else return 0;
}


int isDigit()
{
 if (ch>='0'&&ch<='9')
  return 1;
 else return 0;
}


int isColon()
{
 if (ch==':')
  return 1;
 else return 0;
}


int isDivi()
{
 if (ch=='/')
  return 1;
 else return 0;
}


int isPeriod()
{
    if (ch=='.')
        return 1;
    else return 0;
}
int isSpace()
{
 if (ch==' ')
  return 1;
 else return 0;
}
int isNewline()
{
 if (ch=='\n')
  return 1;
 else return 0;
}
int isTab()
{
 if (ch==' ')
  return 1;
 else return 0;
}
int is__()
{
 if (ch=='-')
  return 1;
 else return 0;
}
int is_()
{
 if (ch=='_')
  return 1;
 else return 0;
}


int getsym(FILE *file)


{
 clearToken();
 ch=fgetc(file);
 while(isSpace() || isNewline()|| isTab())  ch = fgetc(file);
 while(isColon() || isDivi()|| isPeriod())  ch = fgetc(file);
    while(isLetter()||is_()||is__()||isDigit())
  {catToken();
  ch=fgetc(file);
        if (ch==EOF) break; }
}


int main()
{
 FILE *read;
 FILE *write;
 int count=1;
 char fname[100] = {0}; 
 printf("请输入文件名\n");
 gets(fname);
 read =fopen(fname,"r");     
 write =fopen("cut.txt", "w" );
    if((read=fopen(fname,"r"))!=NULL)
    {
  getsym(read); 
  fprintf(write,"%s\n",token);
  while(!feof(read))
  { 
            getsym(read); 
   fprintf(write,"%s\n",token);    
    
  }
        
    }
 else
 {
  printf("error.\n");
 }
 return 0;


运行结果

HTTP

SITE

中文识别

 

这个程序是由我的编译作业词法分析程序改编过来的,算是代码重用啦~