黑马程序员---c 语言 与 c++ 几点区别 (第五章--------第七章)

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

五、循环和关系表达式(几个简单语句的说明:)

(1)通常用const 值来表示数组中的元素个数,是个不错的选择,在声明数组和引用数组长度时(如:for循环中),可以用const 值

如:const int Arsize = 10 ;   //const 定义数组大小

double  name[ Arsize ] ;

for( int i = name.size() - 1 ; i >= 0 ;i--)  //for循环中对其直接引用。

(2)副作用 与 顺序点。

  副作用:计算表达式时对某些东西(如存储变量的值)进行了修改。

  顺序点:执行过程的一个点,进行下一步之前确保所有的副作用都进行了评估。

 如:y = ( 4 + x++) + ( 6 + x++ ) ;  其中 ( 4 + x++) 不是一个完整的表达式,c++不能保证计算子表达式 ( 4 + x++) 后立刻增加 1 。

说明:整条语句是一个表达式,分号表示了顺序点,因此只能保证程序执行到下一个语句前,x的值被增加两次,没有规定每个子表达式后x的值递增。避免这样使用。

(3)区别递增递减操作符:

 double arr[ 5 ] = { 21,32,23, 45,37 };

double * pt = arr ;

(分析指针的表达意思 : ++ pt ;  *++pt ;  ++*pt ;  *pt++ ) 前缀递增,前缀递减,解除引用操作符优先级相同,以从右到左的方式进行结合性。

(4)逗号赋值

int cats = 17, 240 ;   cats = 17 (优先级)

cats = (17, 240) ;  cats = 240 ; (结合性)

(5)clock 函数的应用

#include <iostream>
#include <ctime>//clock()时间函数库

int main()
{
using namespace std;
cout << "enter the delay time , in seconds !" << endl;
float secs ;
cin >>secs; //输出程序所进行的时间(以秒为单位)
clock_t delay = clock_t (secs * CLOCKS_PER_SEC) ;
//CLOCKS_PER_SEC:该常量等于每秒包含的系统时间单位数。将系统时间除以这个值,得到秒。
//或者 将秒乘以此常量得到系统单位时间。
cout << "starting\a\n";
clock_t start = clock();
//ctime 以 clock_t 作为clock()的返回值类型的别名,自动转换为long,unsigned int 或合适类型。
while (clock() - start <delay)//结束时间与开始时间差值,小于规定时间,否则结束循环
{


}
cout << "done !"<<endl;
return 0 ;
}

(6)类型别名

 #define def_name def_value //宏定义,无逗号

typedef typename aliasName ;  // 语句,有逗号

(7)循环和文本输入

A.cin.get() 的输入说明:

int main()
{
char ch ;
int  count = 0 ;
cout << "enter  the characters ; enter # to quit : \n" << endl;
cin.get(ch);
while( ch != '#' )
{
cout << ch ;
count ++ ;
cin.get(ch);
}
cout << endl<<count<<" characters read !" << endl ;
system("pause ");
return 0 ;
}
//enter : see ken run # really fast !   程序在#后仍然可以继续输入的原因是只有按下回车键后才会将整个字符序列发给缓存,程序遇到#字符后结束对输入的处理
// show : see ken run       cin.get()可以回显输入的所有字符包括空格,但是如果换做cin>>ch  则省略空格和换行符,cin没有回显,不会计数
//cin.get(ch)   c语言中要修改变量的值必须传递地址,但是c++只要声明函数将参数引用既可以传递变量来改变其值。


B.对cin.get()使用哪一个的说明:

   在c++中支持函数重载的oop 特性,允许创建多个同名函数,条件是他们的参数列表不同。

如:a cin.get( name, Arsize ) 则编译器将找到使用 char* 和 int 作为参数的cin.get() 版本。

b.如果使用 char ch ;  cin.get( ch ) ;则编译器会接受一个 char 参数的版本 。

c. 如果没有提供参数,将使用 cin,get() 的版本 。 如:cin,get( name ,Arsize ) .get() ;

d.cin.get()  与 c语言中 getchar() 相似,将字符编码作为 int 值返回,而cin.get( ch ) 返回一个对象而不是读取的字符。同样 cout.put() == cout.put() 

f.put( typename )  typename : char , signed char , unsignede char .  为了统一 使用显式的强制转换 cin.put ( char( ch ) );

g.对于 cin.get(ch)  返回值的判断: cin.fail() == false   或者 ch != EOF ;


六、分支语句和逻辑操作符

(1)条件操作符和错误防范

a.if( mynumber == value )   转换为  if(  value == mynumber )

b.if ( 17<age<35 ) 即: if((17<age)<35)其中 (17<age)不论真假(0或者1)都小于35 因而出错。应当使用 if( age > 17 && age <35) is ok !

(2)字符函数库 :(头文件 #inlude<cctype>)

//<cctype>
#if <TRADITIONAL C HEADERS>
   #include <ctype.h>
namespace std {
   using ::isalnum; //是否字母或数字
   using ::isalpha; //是否字母
   using ::iscntrl; //是否控制符
   using ::isdigit; //是否是数字
   using ::isgraph; //是否字母、数字或标点
   using ::islower; //是否小写
   using ::isprint; //是否可打印字符
   using ::ispunct; //是否标点
   using ::isspace; //是否空格
   using ::isupper; //是否大写
   using ::isxdigit; //是否十六进制数字
   using ::tolower; //转为小写
   using ::toupper; //转为大写
}
#endif

(3)读取数字的循环

A . 例:int n ; cin >> n ; 如果输入是单词,而不是数字,情况如何:

a n 的值保持不变。

b 不匹配的输入将被保留在输入队列中。

c cin中的一个错误标记被设置。  即:意味着必须重置该标记,程序才能读取输入,clear() 方法既重置错误输入标记,又重置文件尾(EOF)。

d 对cin方法的调用将返回false (如果被转化为bool类型)。即:可以用非数字输入来结束读取数字的循环。

B. 当程序发生错误时,应进行如下修改:

a 重置cin 以接受新的输入 。

b 删除错误输入。

c 提示用户再输入 。

while(! (cin >> fish[i]) )
{
cin.clear();  //reset input 
while( cin.get() != '\n')
continue; // get rid of bad input 
cout<< "please enter a number  !";
}
   

(4)简单的文件输入输出

A 试用cin进行输入时,程序将输入视为一系列的字符,其中每个字节都被解释为字符编码,不管目标数据类型是什么,输入一开始都是字符数据,然后cin负责将文本转化为其      他类型。

B  写入到文本文件中(分为4个步骤)

a 头文件包含 <fstream >   处理输出的 ofstream 类 

b 创建一个 ofstream 的类

c 将该ofstream 对象同一个文件关联起来

d 就像cout 那样使用ofstream 对象

例题:

#include <iostream>
#include <fstream>                                  //1,包含头文件

using namespace std;  //应用名称空间

int main()
{
char automobile[20];
int year ;
double a_price , b_price ;


ofstream outFile ;                               //2,创建一个ofstream 的对象

char filename[20] = "car info.txt";     //3,将该ofstream对象同一个文件名相互关联起来
outFile.open(filename);   (如果该文件夹不存在,则新建;如果存在,截断该文件,其长度为0,丢弃原有的内容,再将新内容添加进去)


cout<< "enter the make and model of automobile : " ;
cin.get(automobile,50)  ;
cout << "enter the model year : ";
cin>> year ;
cout << "enter the original asking price : ";
cin>>a_price;
b_price = a_price * 0.913 ;


//控制台的处理程序
//cout << fixed;
//cout.precision(2);
//cout.setf(ios_base :: showpoint);
//cout << "make and model : "<<automobile<< endl;
//cout << "year : "<<year <<endl;
//cout<<"was asking : "<<a_price << endl;
//cout << "now asking : "<<b_price<<endl;


//方法一:
//outFile << fixed;
//outFile.precision(2);   保留精度的位数
//outFile.setf(ios_base :: showpoint);
    //方法二:
outFile.setf(ios_base::fixed,ios_base::floatfield);
outFile.precision(3);


                                                                        //4.就像处理cout那样处理ofstream 对象


//文件处理程序(唯一的区别是把控制台的输出改为文件输出,即:cout 为 outFile)

outFile << "make and model : "<<automobile<< endl;
outFile << "year : "<<year <<endl;
outFile<<"was asking : "<<a_price << endl;
outFile << "now asking : "<<b_price<<endl;


outFile.close();//5.关闭文件


cin.get();
cin.get();
system("pase");
return 0 ;
}

C.读取文本文件(分为)

a 包含头文件<fstream>, 输入类 ifstream 

b 声明一个或者多个 ifstream 对象 ,

c ifstream  对象 与文件关联起来,open() 函数。

d 文件结束 colse()

f 可以结合使用 ifstream 和 eof() fail() 等方法来判断输入是否成功。


#include<iostream>
#include <fstream>                                         // 1.文件的输入输出
#include <cstdlib>                                            // exit()


const int Arrsize = 60 ;
 
int main()
{
using namespace std ;
char filename[Arrsize] = "D:\\svn\\inflie.txt";            // 文件名路径
ifstream inFile ;                                                            //2.定义一个ifstream 类 对象
inFile.open(filename);                                                // 3.关联一个文件名
if (! inFile.is_open())                                                //4.判断是否正确打开  或者是  inFile.good()
{
cout << "could not open the file !"<< filename << endl;
cout << "program teminating !"<< endl;
exit(EXIT_FAILURE);                                      // 退出程序,结束运行
}
double value ;
double sum = 0.0 ;
double average = 0.0 ;
int count = 0 ;


inFile >> value ;
while(inFile.good())                           //??当读取最后一个数据时报错,没有进行循环运算
{
++count ;
sum += value ;
inFile >> value ;
}
                                                             //5.读取文件完毕后进行结束判断,
if (inFile.eof())                                  //正确读完文件
{
cout<< "end of file reached : \n";
}
else if (inFile.fail())                         //读到非法数据或者文件结束
{
cout << "input terminate by mistake data : \n";            // 如果刚好是最后一个数据不正确,那么数据不对并且结束
}
else //其他原因读取失败:文件受损,硬件故障。
{
cout << "input terminate by unknown reason : \n  ";
}


if ( 0 == count )
{
cout << "no data processed .\n";
}
else 
{
cout <<"item read : "<< count <<endl ;
cout << "sum = "<< sum << endl ;
cout << "average = " << sum /  count << endl ;
}
inFile.close();//6.关闭文件
cin.get();
return 0 ;
}


七、c++的编程模块

(1)函数返回值的问题

通常,函数将返回值复制到指定的cpu寄存器中或者是内存中,调用程序将查看内存单元。返回函数和调用函数必须就该内存中存储的类型达成一致。函数原型将返回值类型和告知调用程序,而函数定义命令被调函数应返回什么样的数据类型。

(2)为什么需要原型

首先,告诉编译器有什么样的参数,如果没有这样的参数,编译器将会啊报错,

其次,函数计算完成后,将把返回值放在指定的位置,cpu寄存器或者内存单元,然后调用函数,将从这个位置开始取得返回值。由于原型指出了返回值的类型,编译器就  知道检索多少个字节以及如何解释他们。

(3)指针和const ??

(4)函数和二维指针 

二维函数调用两种形式: typename   callname(typename ( *name )[ row ] , typename line ) ;   ===    typename callname( name[][ row ] , typename line ) ;




















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值