Bootstrap

C++语言篇 第二章 顺序结构

第一节  认识第一个C++程序

1、准备工作:

1、软件安装:
 
 
 

2、启动 Dev C++,点击桌面上的图标

3、中文设置:
如果大家看到界面上的字是英文的,则可以点击主菜单“Tools > Environment Options” (如下图)
 
在弹出的对话框中选择第二个标签页”interface”(如下图),在Language下拉列表中选择Chinese即可,将操作界面改为中文的。
 
4、新建一个文件:
 
从主菜单选择“文件” 〉“新建” 〉“源代码”即可(如下图所示)。
 
5、认识C++界面:
 
 
 
6、放大编辑器的字体:
 
按住 Ctrl键,滚动鼠标滚轴。

 

 

7、保存,编译,调试、运行。

一个好的习惯是创建了一个新程序后,在还未输入代码之前先将该程序保存到硬盘某个目录下,然后在程序的编辑过程中经常性地保存程序,以防止机器突然断电或者死机。要保存程序,只需从主菜单选择“文件”—〉”保存”就可以将文件保存到指定的硬盘目录。如下图所示。

编译:从主菜单选“运行”—〉“编译运行”或快捷键“F9”(如下左图)。如果程序中存在词法、语法等错误,则编译过程失败。编译器会在屏幕右下角的“Compile Log”标签页中显示错误信息,如(如下右图)所示,并且将源程序相应的错误行标成红色底色。

  8、C++程序的执行过程

9、动手练习编程:

输出春晓的校园版;“春眠不觉晓,处处蚊子咬。”
#include<iostream>    
using namespace std;                  
int main()
{
  cout<<"春眠不觉晓,处处蚊子咬。";
  return 0;
}
 
注意:
        1、程序中除双引号内和注释后的内容,其它都必须是要在英文状态输入,双引号也要在英文下输入,否则会编译错误。
 
 
         2、中英文切换:Ctrl+空格;   输入法之间的切换:Ctrl+Shift
 
 
 

2、注释:(//及其后面的内容表示注释行)

  • 注释部分只是起到对原程序行的解释说明作用,而本身并不参与编译。C++忽略注并把每个注释都视为一个空格
  • 在程序适当的地方加上的注释是良好的编程习,使得程序功能一目了然,便于后来者了解程序。
  • 两种注释方法:
  1.      用 “/*” 和“*/” 将需要注释的部分括起来,可跨行
  2.      用“//” 对这一行进行注释,内容只限于单行
// 在显示器上显示一行文字
#include<iostream>
using namespace std;   
/*使用命名空间 std
---- 
----  以下为程序主体部分----*/
int main() 
{    cout<<"my frist program."<<endl;
     return 0;
}

3、预处理指令

#include <iostream>  //预处理
using namespace std;   
int main() 
{   cout<<"my frist program."<<endl;
    return 0;
}
  • iostream是C++中一个库文件,文件中定义了cout对象 , cin对象和endl等,程序中如果要用到这些对象就要调入iostream库文件;
  • 以  #  开头的指令行在程序编译前就会由预处理器先行处理。将头文件iostream的具体代码代替 #include命令行,然后再对该程序进行整体编译。
  • 每个预处理指令都必须占据一行。而预处理命令不是语句,故末尾无分号

4、名字空间

         一个中大型软件往往由多名程序员共同开发,会使用大量的变量名和函数名,不可避免地会出现变量或函数重复命名冲突。当各人代码测试通过,没有问题,但将它们结合到一起,就有可能会出现重命名错误。

          如两家公司的类库中都有一个名为“Stack”的类,那么当你需要同时用到这两个公司的类库时,就会产生名字冲突,无法区分是哪一个Stack,因此,一般公司都会把自己的类,函数,变量等放在一个名字空间中,防止冲突。

          比如:    namespace   s1  {int a = 10;}              namespace   s2    {int a = 20;}
          这样就在两个名字空间中声明了两个不同的变量 a,如果想要同时在一个源文件中使用这两个 a,可以这样做:
          int c = s1::a;             // 表示 s1 中的 a
          int d = s2::a;             // 表示 s2 中的 a
          为了解决合作开发时的命名冲突问题,C++ 引入了命名空间。C++标准库中的所有组件都是在 std 名字空间中声明和定义的。

          最开始时,大家用std::cout来表示输出,cout 是std标准名空间下的名字。

#include <iostream>
int main() 
{   std::cout<<“my frist program.“<<std::endl;
    return 0;
}

          但是这样就要在每一个变量或函数前都要加上其所属的系统名。后来为了方便,演变为在程序头统一书写如下:

#include <iostream>
using  std::cout;
using  std::endl; 
int main() 
{   cout<<“my frist program.“<<endl;
    return 0;
}

          表示程序中的cout、endl等是标准公司std的对象名或变量名。这样在程序中就不要每个变量前都写所属系统名std。但如果变量名多,那在程序头要写上很多的声明。最后演变为在程序头统一写一条声明:using namespace std;表示程序中用到的cout,endl等都是标准公司的。

#include <iostream>
using namespace std;  
int main() 
{   cout<<“my frist program.“<<endl;
    return 0;
}

 

5、主函数

        1、int  main()后面跟一对括号,说明它是一个函数。每个C++程序都必须有一个且只能有一个main()函数。不管main()函数在程序的什么位置,整个程序总是从主函数 main() 开始被执行

        2、每条C++语言必须用分号来结束。但预处理命令、函数头和花括号后不加分号

#include <iostream>
using namespace std;   
int main() //函数头,程序从此开始运行
{   cout<<“my frist program.“<<endl;
     return 0;
}//花括号内的是函数体

 

6、C++程序的书写

  • 每条语句占一行
#include <iostream>      
using namespace std;  
int main() 
 { 
    cout<<“my “;
    cout<<“program”<<endl;
 }
  • 一行内写多条语句。
#include <iostream>      
using namespace std;  
int main() 
{  cout<<“my  ”;  cout<<“program”<<endl; //这是两条语句写在一行;
}
 
  • 一条语名写在多行上。
#include <iostream>      
using namespace std;  
int main() 
 {   //这是一条语句写在两行
    cout<<“my  ”
        <<“program”<<endl;
 }
  • C++语言以分号来判断语句是否结束。

 

7 、函数类型  int 及 返回值 return

  • return  0 表示 返回整数0 给 main() ;
  • int 表明  主函数main()的返回值是一个整数,这个值由reture语句返回;
  • 在新修定的语法标准下,“int ” 和  “return  0”都可以省略,最好不要省略。
 

8、看程序写结果:

 
例1、在梯形中阴影部分面积是150平方厘米,求梯形面积。
【分析】 已知梯形上、下底长为15和25。令梯形的高为h,则由已知三角形面积为150平方厘米,有150=(15*h)/2,得h为20,然后根据梯形面积公式算出梯形面积。 
 
#include<cstdio>                //printf和scanf调用cstdio库,在C语言中可调用stdio.h库
#include<cstdlib>               // 使用system( )调用cstdlib库
using namespace std;            //在C语言中要省略,
int main()                      //整个程序开始
{   float s,h,up,down;          // float定义s,h,up,down为单精度实型变量
    up=15; 	                    //已知上底
    down=25; 	                //已知下底
    h=2*150/up;                 //根据上底求出梯形的高
    s=(up+down)*h/2; 	        //求出梯形的面积
    printf("s=%0.2f\n",s);      // \n是换行控制符,0.2f按实际位数输出,保留2位小数
    system("pause");            //暂停作用
    return 0;                   //结束程序
}

运行结果:                  

 

例2、 已知一位小朋友的电影票价是10元,计算x位小朋友的总票价是多少?

【分析】 假设总票价用y来表示,则这个问题可以用以下几个步骤来实现: ①输入小朋友的数目x; ②用公式y=10*x计算总票价; ③输出总票价y的值。

#include<iostream>               //使用cin,cout,须调用iostream库
using namespace std;
int main()
{  int x,y;                     //定义整型变量
   cout<<"Input x=";            //输入提示
   cin>>x;        	            //小朋友的人数
   y=10*x; 		                //计算总票价
   cout<<"total="<<y<<endl;     //输出总票价
   return 0;                    //结束程序
}

输入:5

输出:               

 

【说明】:  
1、int定义x,y为整型变量,有关整型变量将在第二章详细介绍。
2、cout<<的作用是在屏幕中显示字符串"Input x="。
3、cin>>x的作用是输入一个数,赋予变量x。        
4、cout<<"total="<<y<<endl的作用是输出提示符total=,输出y的值,endl是换行的意思。   通过以上例1.2和例1.3两个例子,可以总结出C++语言程序的结构如下:
  1)C++语言变量在使用之前必须先定义其数据类型,未经定义的变量不能使用。
  2)程序由一个或多个函数组成,一个程序中必须有且只有一个主函数,主函数的名字为main。不论main()函数在程序中什么位置,程序都是从main()函数开始执行,main()函数执行完毕,程序也就结束了。
  3)在程序中可以调用系统提供的库函数。在调用库函数之前,必须将相应头文件包含在程序中。
  4)程序中可以有注释行。注释是为了使程序更易于理解和提示。
  5)程序的语句以分号结束。分号是C++语言不可缺少的组成部分。
  6)程序的书写要注意适当的缩进,一般采用“逐层缩进”形式,以便使程序更加清晰易读。
   把处理问题的步骤编成能从上到下顺序执行的程序,是简单程序的基本特征。再来分析下面一道例题的程序结构,同时继续学习基本语句。

 

例3、 有一个牧场,牧场上的牧草每天都在匀速生长,这片牧场可供15头牛吃20天,或可供20头牛吃10天,那么,这片牧场每天新生的草量可供几头牛吃1天?

【分析】解决这类问题的关键是利用牛吃的草量,最终求出这片牧场每天新生长的草量,我们设1单位的草量为1头牛1天所需的草量,于是15头牛20天所食的草量为300单位(包括这20天内的新生草量),20头牛10天所食的草量为200单位(包括这10天内的新生草量),两者的差值即为10天内的新生草量。

#include<iostream>               //使用cin,cout,须调用iostream库
using namespace std;
int main()
{   int s1,s2,s3;               //变量定义
    s1=15*20;                   //15头牛20天所食的草量
    s2=20*10;                   //20头牛10天所食的草量
    s3=(s1-s2)/(20-10);         //每天新生的草量单位数
    cout<<"s="<<s3<<endl;       //1单位为1头牛1天的食量
    return 0;                   //结束程序
}

输出:               

                                               

例4、 给定一个字符,用它构造一个底边长5个字符,高3个字符的等腰字符三角形。  
 
    #
  ###
#####
 
#include<iostream>              //使用cin,cout,须调用iostream库
using namespace std;
int main()
{  char a;                      //定义字符变量,
   cin>>a;                      //输入给定一个字符
   cout<<"  "<<a<<endl;         //输出1个字符,先输出2个空格
   cout<<" "<<a<<a<<a<<endl;    //输出3个字符,先输出1个空格
   cout<<a<<a<<a<<a<<a<<endl;   //输出5个字符
   return 0;                    //结束程序
}

 

例5、输入两个正整数A和B,试交换A、B的值(使A的值等于B,B的值等于A)。

【分析】 交换两个变量的值方法很多,一般我们采用引入第三个变量的算法,二个变量交换,可以想像成一瓶酱油和一瓶醋进行交换,这时容易想到拿一个空瓶子过来:

① 将酱油倒到空瓶中;② 将醋倒到酱油瓶中;③ 将原空瓶中的酱油倒到醋瓶中。

#include<iostream>                     //使用cin,cout,须调用iostream库
using namespace std;
int main()
{  int a,b,c;                          //定义三个变量
   cout<<"Input a,b=";                 //输入提示Input a,b=
   cin>>a>>b;                          //输入A、B的值
   c=a;   a=b;   b=c;                  //交换A、B的值
   cout<<"a="<<a<<"  b="<<b<<endl;     //输出结果
}

       

9、练习

1、在屏幕上输出一幅画。可以是一棵圣诞树,一个苹果,自主创作。

 

第二节  常量与变量

1、常量

 
常量是在程序运行过程中,其值保持不变的量。 C++ 中定义一个符号常量的格式如下:
 
           类型名   const     常量名=常量值          或               const       类型名      常量名=常量值 
 
例如:
 
int     const       A     = 100;
 
const     float    PI  = 3.1415926;
 
  • 使用符号常量是为了方便程序的修改,增强程序的读性。
  • 符号常量必须先定义,同时进行初始化它表示一个数值。
  • 符号常量的值在其作用域内不能改变,也不能再被赋值。
  • 为了更清晰地区别常量和变量,常量名通常用大写字母表示。

2、变量

 
  • C++要求变量必须先定义后使用。在第一次使用该变量之前进行定义即可。
  • 多个同一类型的变量可以在一行中定义,中间用逗号隔开,也可以分别定义。例如:
                int  a=5,b,c;       //定义3个整型变量a,b,c
    int a=5;             //定义整型变量a,并给a赋初值
       int b;                   //定义整型变量b
       int c;                   //定义整型变量c
 
  • 变量在定义的同时,可以给它指定一个初始值,称为变量的初始化。
  • 变量的赋值    在 C++ 中,可以通过“赋值”语句来修改变量的值。赋值语句的格式如下:

        变量名 = 值或者表达式 ;     其中,“=”  称为“赋值号”。

 

3、变量名及常量名的命名要遵守以下规则:

  • 变量名除了使用26个英文大小写字母和数字外,还可以使用下划线。
  • 第一个字符必须是字母或下划线,不能用数字开头,中间不能有空格。
  • 一般不要超过31个字符。
  • 变量名不要与C++中的库函数名、类名和对象名相同。不能用C++保留字,C++具体的保留字如下表:
  • 尽量使用汉语拼音或含有一定意义的英语单词来定义变量,做到见名知义,便于记忆。

c++关键字分类:

数据类型:void,int,char,float,double,bool,w_char
类型定义:struct,union,enum,class,typedef
常量值:true,false
类型修饰符:long,short,singed,unsigned
类型限定符:const,volatile,restrict
存储说明符:auto,register,static,extern,thread_local,mutable
其它修饰符:inline,asm
循环控制:for,while,do
跳转控制:break,continue,return,goto
分支结构: if,else,switch,case,default
内存管理:new, delete
运算符:sizeof,and,and_eq,bitand,bitor,compl,not,not_eq,or,or_eq,xor,xor_eq
访问限定符:this,friend,virtual,mutable,explicit,operator
类访问修饰符:private,protected,public
模板:template,typename
命名空间:namespace,using
异常处理:throw,try,catch

 

4、练习:

1、下列变量名哪些是合法的变量名?

a123    c3b    file_1   ¥3   cout    Cout    5ab   return 0     Mr.Wang     sum    Day   school_name     a>=b     ¥1234lotus          sum123     day     234NUM     #34     int

 

 

第三节  数据类型

1、简介

  • 数据有数据类型、取值范围、运算类型三个要素。

常用的数据类型有:整型、字符型、布尔型、实数型(浮点型)。

动手编程:

用sizeof()函数测试各种数据类型在计算机中所占的空间大小;

#include <iostream>  //预处理
using namespace std;   
int main() 
{   cout<<"short="<<sizeof(short)<<endl;
    cout<<"int="<<sizeof(int)<<endl;
    cout<<"long="<<sizeof(long)<<endl;
    cout<<"long long="<<sizeof(long long)<<endl;
    cout<<"char="<<sizeof(char)<<endl;
    cout<<"bool="<<sizeof(bool)<<endl;
    cout<<"float="<<sizeof(float)<<endl;
    cout<<"double="<<sizeof(double)<<endl;
    cout<<"long double="<<sizeof(long double)<<endl;
    return 0;
}

 

 

2、整数类型:

整数分“有符号”类型和“无符号”类型,无符号整数取值只会是正数和0。例如int 类型取值范围为 -2147483648 ~ 2147483647 ,unsigned int类型的取值范围为0~4294967295。

  • 定义变量时,要注意数据的大小,避免数据溢出,C++程序中出现这类错误时,编译和运行过程中并不报错。所以,需要特别细心,注意范围检查。 
#include<iostream>
using namespace std;
int main(){
    int a = 2147483647;
    a = a + 1;
    cout << "a=" << a << endl;
    return 0;
}

输出:                                      

  • 在 C++ 程序中,使用的各种变量都应“先声明,后使用”。以下程序会报错:
#include<iostream>
using namespace std;
int main(){
    cin>>a>>b>>d;
    int a,b,c;
    double d,e;
    c = a + b;
    e = c + d;
    cout << a << " + " << b << " = " << c << endl;
    cout << c << " + " << d << " = " << e << endl;
    return 0;
}
  • 在C++中,字符型数据可以直接参与整型或者实型数据的运算,按照其ASCII码值使用。
  • int(ch)可以把char字符型强制转换成int整数类型。
#include<iostream>
using namespace std;
int main(){
    int b = 0, a = 100;
    char ch = 'A';
    b = a + ch;
    cout << ch << " " << int(ch) << " " << b << endl;
    return 0;
}

输出:                                      

  • 不同进制表示法:20(十进制)=024(八进制)=0x14(十六进制)

3、字符类型

1、字符
•单引号括起来的一个字符如‘A’ , ‘2’(非数字) ,
•单引号内只能包含一个字符,如‘ab’是非法的。
•字符常量区分大小字,如‘A’与‘a’ 是不同的字符。
•单引号   ‘    ’  是定界符,不是字符的一部分。
 
 
2、转义字符:
•是以“\”开头的字符系列。它能调用在屏幕上不能显示的字符。
•是将“\”后面的字符转换为另外的意义。例如:\n中的n不代表字母n。而\与n组合一起作为换行。
•转义字符 ‘\n’ ,虽然是二个字符,但系统把它们当成一个字符。
 
注意:1、转义字符是用’\’(斜杠),不是用‘/’(除号)。
   2、“\n”是字符串,‘\n’是字符,功能都可以换行。
 
转义字符列表
  • 运用转义字符   \ddd,\xhh输出字符
     
    运用转义字符\ddd,\xhh可以调用ASC码表中的任意字符;(只有序号为32到126之间的字符可以显示)。ddd代表八进制数,hh代表十六进制数; 
 
#include<bits/stdc++.h>
using namespace std;
int main()
{   cout<<'\x41'<<'\t'<<'\101'<<'\n';
    cout<<'\x42'<<'\t'<<'\102'<<'\12';
    cout<<'\x43'<<'\t'<<'\103'<<'\xa';
}

运行以上程序,思考下面的问题;

1、单引号、双引号在此的效果有没有影响。
2、“\x43”,中的x可以写成大写的X吗?
3、 ‘\t’起了什么作用,其中的\省略会是什么结果?
4、比较‘\n’、‘\12’、‘\xa’的作用是否相同?
 
 
看程序写结果:
 
#include<cstdio>
using namespace std;
int main(){
    char a ='A' ;
    putchar(a); // 输出一个A
    putchar('\\'); // 输出‘\ ’
    putchar('\n' ); // 输出回车换行
    char c;
    c = getchar();
    putchar(c + 1); 
    //输入一个字符, 输出它在ASCII 码表中的后一个字符
    return 0;
}

输出:                                      

 
#include<iostream>
using namespace std;
int main(){
    char c1,c2,c3;
    c1 = ‘a’;
    c2 = ‘Z’;
    c1 = c1 - 32;
    c2 = c2 + 32;
    c3 = ‘0’ + 9;
  cout << c1 << “ ” << c2 << “ ” << c3 << endl; 
    return 0;	
}

输出:                                      

#include<iostream>
using namespace std;
int main()
{
   int  i,j;
   i='A';   j='a';
   cout<<i<<"  "<<j<<'\n';       
}

输出:                                      

 

3、字符串

字符串是用一对双引号括起来的字符序列,例如“China”。‘A’与“A”是不同的:
‘A’是字符,内存中占用一个字节。 “A”是字符串,内存中占用二个字节,分别是A和空字符(字串符结束符)。
 
在 C语言中,用字符数组 char s[]存放字符串,在 C++ 中除了用字符数组 char s[]存放字符串,也可以用 STL 中的 string 类型。每一个字符串的结尾都要加一个“字符串结束标志”,而且是系统自动添加上去的,C++规定以转义字符“\0”作为字符串结束标志。
 
 
 

4、布尔数据类型

布尔常量仅有两个:false(假)=0    和   true(真)=非0。
 
布尔类型内存中占一个字节。
 
 

5、练习

1、输入a,b两个值,并交换他们的值。

2、五位好朋友相聚。第一位朋友带来了 很多糖块赠送给各位朋友,使每人的糖块 在各自原有的基础上翻了一倍;接着第二位好友也同样向每人赠送糖块,他同样使每人的糖块在各人已有的数量上翻了一倍;第三、第四、第五位好友都照此办理。经过这样的赠送之后,每人的糖块恰好都为32块。问各位好友原先的糖块数分别是多少?

3、分钱游戏。甲、乙、丙三人共有24元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。 求原先各人的钱数分别是多少?

4、输入或者字符a,输出全由字符a字符组成的图形。

 例如:     输入8,则输出由8组成的圣诞树。   输入T,则输出由T组成的苹果。

5、输入一个数字a和一个字符b,输出全是由字符b组成的图形,并且图形整体向右平移a的位置。

6、输出各种类型的所占存储空间大小。

7、运用Sizeof() 函数,输出“hello world”字符串占用的存储空间大小。

8、请思考:
”abc\ndef”包含几个字符?   
”abc\\ndef”包含几个字符?
语句 cout<< ”abc\ndef”; 输出结果是:
语句 cout<< ”abc\\ndef”; 输出结果是:
 
9、输入一个33到126之间的数字,输出对应的ASC码字符(试试有几种方法) 。
      输入一个字符,输出其对应的ASC码。(试试有几种方法)。
 
10、输入一个四位数,倒序输出这个数, 如输入1234,输出4321。
 
11、取一个大于8位数的整数a,取从右端开始的4~7位,并输出。
 
12、时间戳
       某国家安全局获得一份珍贵的材料,上面记载着一个恐怖活动的计划,不过,国家安全局人员却没法直接得到实施的时间!材料上的时间使用的是Linux时间戳,即是从1970.1.1日0时0分起到该时刻总共过了多少秒。现希望你帮助完成此事,给你该时间戳,你要写个程序计算出恐怖活动在哪一天实施。这里为了简单起见,规定一年12月,每个月固定为30天。 输入:一个整数n(0<=n<=2147483647),表示从1970.1.1日0时0分开始的秒数。 输出:年月日 格式的日期
样例输入1:1304324570
样例输出1:2011 12  7
样例输入2:93312000
样例输出2:1973  1  1
 
13、计算某次考试语文、数学、英语和计算机等四科的总成绩与平均成绩。 (请用输入语句从键盘输入各科成绩分,并对齐输出)
Yuwen  shuxie  yingyu  pingjun  zhongfen
93          87       90         90         270
 
14、在屏幕上输出一个算术竖式。可以通过输入变量改变因数的值,并用setw()对齐各数位。如:
输入: 89  57
输出:
               89
       +      57
     _______
             146
 
 

第四节  运算符

1、运算符及优先级列表

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

 

()

圆括号

(表达式)/函数名(形参表)

 

.

成员选择(对象)

对象.成员名

 

->

成员选择(指针)

对象指针->成员名

 

2

-

负号运算符

-表达式

右到左

单目运算符

(类型)

强制类型转换

(数据类型)表达式

 

++

自增运算符

++变量名/变量名++

单目运算符

--

自减运算符

--变量名/变量名--

单目运算符

*

取值运算符

*指针变量

单目运算符

&

取地址运算符

&变量名

单目运算符

!

逻辑非运算符

!表达式

单目运算符

~

按位取反运算符

~表达式

单目运算符

sizeof

长度运算符

sizeof(表达式)

 

3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式/整型表达式

双目运算符

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

双目运算符

5

<<

左移

变量<<表达式

左到右

双目运算符

>>

右移

变量>>表达式

双目运算符

6

>

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

<

小于

表达式<表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

双目运算符

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1? 表达式2: 表达式3

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

 

/=

除后赋值

变量/=表达式

 

*=

乘后赋值

变量*=表达式

 

%=

取模后赋值

变量%=表达式

 

+=

加后赋值

变量+=表达式

 

-=

减后赋值

变量-=表达式

 

<<=

左移后赋值

变量<<=表达式

 

>>=

右移后赋值

变量>>=表达式

 

&=

按位与后赋值

变量&=表达式

 

^=

按位异或后赋值

变量^=表达式

 

|=

按位或后赋值

变量|=表达式

 

15

,

逗号运算符

表达式,表达式,…

左到右

从左向右顺序运算

2、算术运算符(+、-、*/%++、--

1、%(模运算符或称求余运算符)两侧必须为整数。如7%4=3
 
 
2、/(整除运算符)两个整数相除为整数。如:5/2=2 ; 
  两个数中有一个为小数则结果为小数  如:5.0/2=2.5;
  两个数中有一个为负数则“向零取整”   如:-19/10=-1   -11/10=-1   -21/10=-2
 
#include<iostream>
using namespace std;
int main()
{
    int n,a,b,c;
    cin >> n;   //从键盘输入一个整数给n
    a = n % 10;
     b = n / 10 % 10; 
     c = n / 100;
    cout << a + b + c << endl;
     return 0;
}

输入:321

输出:                                      

 

计算下面表达式的值:

17/3=                18.0/4=               4567%1000=               17%3=              -17/4=             4567/100=        

 

 
3、++ --(自增自减运算符)作用是使变量加一或减一。
 
#include <iostream>
using namespace std;   
int main()
{ int i,j;
  i=3; j=++i;
  cout<<“j=”<<j<<'\t'<<"i="<<i<<endl;
}

输出: j=              i=      

#include <iostream>
using namespace std;   
int main()
{ int i,j;
  i=3; j=i++;
  cout<<“j=”<<j<<'\t'<<"i="<<i<<endl;
}
输出: j=               i=       

 

#include <iostream>
using namespace std;   
int main()
{ int i,j;
  i=3; j=i--;
  cout<<“j=”<<j<<'\t'<<"i="<<i<<endl;
}
输出: j=               i=       

 

#include <iostream>
using namespace std;   
int main()
{ int i,j;
  i=3; j=--i;
  cout<<“j=”<<j<<'\t'<<"i="<<i<<endl;
}
输出: j=               i=       
 
 
#include<iostream>
using namespace std;
int main()
{  int x,y,z1,z2;
   x=7;   y=8;
   z1=y-(x++);              //计算z1=1,计算后x=8
   z2=y-(++x);              //计算前x的值自加1,x的值为9,再与y求差
   cout<<"z1="<<z1<<endl<<"z2="<<z2;   //分别输出z1和z2的值
}

输出:z1=             z2=      

 
#include <bits/stdc++.h>  
using namespace std;   
int main()
{  int i=1;
   i=(++i)+(++i);
   cout<<i;   
}

输出:                                      

 
#include<bits/stdc++.h>
using namespace std;
int main()
{ int a,b,x,y,x1,y1;
  a=100;
  cout<<a<<"  "<<a++<<"  "<<a++<<endl;
  a=100;  	b=100;
  x=a++;  	y=++a;
  cout<<x<<"  "<<y<<endl;
  a=100;  	b=100;
  x1=a--; 	y1=--a;
  cout<<x1<<"  "<<y1<<endl;
}

输出:                                                     

 

  • 自增(++)、自减(--)运算符为变量的增1和减1提供了紧凑格式。
  • 自增、自减运算符都是单目运算符,其作用是使变量的值增1或减1。
  • 自增、自减运算符有四种应用格式:

         int   a=3;    b=a++;     等价于    b=a;  a=a+1;

         int   a=3;    b=a- -;      等价于    b=a;   a=a-1;

  • (运算符后置用法,代表先使用变量,然后对变量增值)

        int   a=3;    b=++a;     等价于    a=a+1;   b=a;

        int   a=3;    b=- -a;      等价于    a=a-1;   b=a;

  • (运算符前置用法,代表先对变量增值,再使用变量)
  • C++编译器在处理时尽可能多的自左向右将运算符结合在一起。
         例如:a+++b  表示为  (a++)+b  而不是  a+(++b)。
 
  •   在调用函数时,实参的求值顺序一般为自右向左。
     例如:              
 
#include <iostream>
using namespace std;   
int main()
{  int a=1;
   printf("%d,%d,%d",a++,a++,a++);
}

 输出的结果为3,2,1而不是1,2,3。

4、 赋值运算符(=)

1、表达形式:    int a,b,c;   a=3;  b=3;  c=3;    也可以表达为 a=b=c=3;

                           a=5+(c=6);    表达式的a值为11;c的值为6;

            a=(b=4)+(c=6); 表达式的a值为10;b的值为4;c的值为6;

2、复合赋值运算符:在“=” 号前加其他运算符,可以构成复合运算符。
  a+=3   等价于   a=a+3              a+=y+3    等价于  a=a+(y+3)
     a-=3    等价于 a=a-3                 a*=y+4     等价于  a=a*(y+4)
     a*=3    等价于 a=a*3     a%=3      等价于  a=a%3
     a/=3    等价于 a=a/3  
 
3、赋值过程中的类型转换
  float转换为整型 int a;  float b;   b=3.65;    a=b;    则a==3
       字符转换为整型 int a;  char b;   b=‘A’;       a=b;    则a==65
       整型转换为字符 int a;  char b;   a=65;       b=a;    则b==‘A’
 
 
#include <bits/stdc++.h>  
using namespace std;   
int main()
{  int a=10,b,c,t=0,s=100;
   a+=20;
   c=b*=b=a;
   (s/=c)%=a;
   t+=(a+b)*c;
   cout<<a<<"  "<<b<<"  "<<c<<"  "<<s<<"  "<<t<<endl;
}

输出:                                      

 

#include <bits/stdc++.h>  
using namespace std;   
int main()
{  int b=13,a=10;
   (a=(b*=b))+=4;
   cout<<a<<" "<<b;   
}

输出:                                      

 
 
5、关系运算符
  • 关系运算符用于两个值进行比较,运算结果为true(真)或false(假),
       分别用值非0(true)或0(false)表示。C++中的关系运算符如下:
       <(小于)                <=(小于等于)        >(大于)       >=(大于等于)       ==(等于)         !=(不等于)
 
  • 关系运算符都是双目运算符,其结合性是从左到右,<、<=、>、>=运算符的优先级相同,==和!=运算符的优先级相同,前者运算的优先级高于后者。
  • 关系运算符的优先级低于算术运算符。
       例如:a+b>c    等价于  (a+b)>c                         a!=b>c   等价于  a!=(b>c)
#include<iostream>
using namespace std;
int main()
{   int n1=4,n2=5,n3;
    n3=n1>n2;                       //n3的值为0
    n3=n1<n2;                       //n3的值变为1
    n3=n1==4;                       //n3的值变为1
    n3=n1!=4;                       //n3的值变为0
    n3=n1==1+3;                     //n3的值变为1
}

 

 
 
 

6、逻辑运算符

&&(逻辑与)        ||(逻辑或)         !(逻辑非)
 
逻辑表达式的结果为真则为1,结果为假则为0。
 
逻辑非(!)是单目运算符,逻辑与(&&)与逻辑或(||)为双目运算符。
 
逻辑非(!)的优先级最高,逻辑与(&&)次之,逻辑或(||)最低。
 
逻辑运算真值表如下表所示(逻辑运算真值(真为非0,假为0)
 
数学里的表达式(a>x>b), C++中要写成(a>x && x<b)   不能写成(a>x>b)
 
 
逻辑表达式是“短路计算”,在逻辑表达式的计算过程中,一旦能够确定整个表达式的值,就会立刻停止计算.
#include<bits/stdc++.h>
using namespace std;
int main()
{	int a=2,b=3,c=0,d;
	d=(a>b)&&(c=4);
	cout<<c<<" "<<d<<endl;	
}
输出:               
 
#include<bits/stdc++.h>
using namespace std;
int main()
{	int a=2,b=3,c=0,d;
	d=(a<b)&&(c=4);
	cout<<c<<" "<<d<<endl;	
}
输出:               
 
#include<bits/stdc++.h>
using namespace std;
int main()
{	int a=0,b=1;
    bool flag=(a++)&&(b++);
    cout<<a<<" "<<b<<endl;
    flag=a++ && b++;
    cout<<a<<" "<<b<<endl;
    flag=a++ || b++;
    cout<<a<<" "<<b<<endl;	
}

输出:              

 
 

7、 条件运算符

  • 条件运算符“?:”是C++中唯一的三目运算符,其形式为: 表达式1 ?表达式2 :表达式3
 
       它的运算方式为:先计算表达式1的值,如果其值为非0(真), 则表达式2的值就是整个表达式的最终结果; 否则表达式3的值就是整个表达式的值。
 
      例如:max=((a>b)?a:b)
 
     上面例子定义了一个求两个数a和b中最大值,其中决定哪一个是 最大值用了条件运算符。
 
  • 条件运算符的结合性是自右向左。例如有以下条件表达式:
       a>b?a:c>d?c:d  相当于 a>b?a:(c>d?c:d)
 
  • 条件运算符的优先级别高于赋值运算符,低于关系运算符和算术运算符。
       例如有: a>b?a-b:b-a  相当于 a>b?(a-b):(b-a)
 
 

8、 位运算符

  • 位(bit)是计算机中表示信息的最小单位,一般用0和1表示。一个字符在计算机中用8个位表示,8个位组成一个字节。C++语言需要将人们通常所习惯的十进制数表示为二进制、八进制或十六进制数来理解对位的操作。C++中所有的位运算符如下:
       ~(按位求反), <<(左移),  >>(右移), &(按位与), ^(按位异或),  |(按位或)。
 
  • 位运算符是对其操作数按其二进制形式逐位进行运算,参加位运算的操作数必须为整数。
 

9、 sizeof()运算符(求字节运算符)

  • sizeof()运算符是单目运算符,用于计算运算对象在内存中所占字节的多少,它有两种形式:
        sizeof (类型标识符);
        sizeof  表达式;
 
  • sizeof()可以接受的类型标识符很多,

        例如:sizeof(int)表示求整型数据在内存中所占字节数。

        例如:sizeof(“Hello,Wlord!”)表示求字符串在内存中所占字节数。

        例如:int a,则sizeof(a)表示求变量a在内存中所占字节数。

        例如:int a[10],则sizeof(a)表示求数组a在内存中所占字节数。
 
 
10、逗号运算符
 
  • 逗号运算符用于将多个表达式连在一起,并将各表达式从左到右的顺序依次求值,但只有其最右端的表达式的结果,作为整个逗号表达式的结果。
  • 逗号表达式的一般格式为:表达式1,表达式2,……,表达式n
#include <iostream>  
using namespace std;   
int main()
{  int a=3,b=4,c=5,d;
   d=(a+b,b+c,c+a);
   cout<<d;
}
则先求解a+b,再求解b+c,最后求解c+a, 整个表达式的结果为c+a的结果。
  • 逗号运算符的运算级别是所在运算符中最低的。
#include <bits/stdc++.h>  
using namespace std;   
int main()
{  int a,b,c,d;
   cin>>a>>b;
   a*=b;   b--;
   (c=d=a)=b;
   d=(a++,b+10,c--);
   cout<<a<<" "<<b<<" "<<c<<" "<<d;
}

输入: 100      20

输出:                                      

 

 

11、强制类型转换符
 
  • 强制转换的一般形式;(类型名)(表达式)
       (double)a             (将a的值转换成double类型)
       (int) (x+y)              (将x+y的值转换成整数类型)
       (int) x  +y            (将x的值转换成整数类型,再加上y)
       (float) (5%3)         (将5%3的值转换成单精度类型)
#include <iostream>
using namespace std;
int main()
{   int x;
    float a=15.75;
    double b=323.01;
    cout<<(int)a<<endl;
    cout<<(int)(b+0.5)%10 << endl; 
    cout<<(int)b%(int)a+1 << endl;
    return 0;
}

 

 
12、运算符优先级
 
  • 运算符优先级决定了在表达式中各个运算符执行的先后顺序。高优先级运算符先于低优先级运算符进行运算。在优先级相同的情形下,则按从左到右的顺序进行运算。
  • 当表达式中出现了括号时,会改变优先级。先计算括号中的子表达式值,再计算整个表达式的值。
  • 运算符的结合方式有两种:
    左结合和右结合。左结合表示运算符优先与其左边的标识符结合进行运算,如加法;
    右结合表示运算符优先与其右边的标识符结合,如单目运算符+、-。
  • 同一优先级的优先级别相同,运算次序由结合方向决定。

        如1*2/3,*和/的优先级别相同,其结合方向自左向右,则等价于(1*2)/3。

  • 不同的运算符要求有不同的运算对象个数,单目运算符只需一个运算对象,如 i++,-a,sizeof(b)等。

读程序写结果:

#include<bits/stdc++.h> 
using namespace std;
int main()
{ int s=200,a=10;
  int b=20,c=50;
   s-=a;
   s-=b;
   s-=c;
   cout<<s<<endl;
}

输出:                                      

#include<bits/stdc++.h> 
using namespace std;
int main()
{ int i=1,sum=0;
  sum+=i; i*=2;
  sum+=i; i*=2;
  sum+=i; i*=2;
  sum+=i; 
  cout<<"i="<<i<<"," <<"sum="<<sum<<endl;
}

输出:                                      

#include<bits/stdc++.h> 
using namespace std;
main()
{ int a=50,b=200;
  a=b-a;  b=b-a;
  a=a+b;
  cout<<"a="<<a<<"b="<<b<<endl;
}

输出:                                      

#include<bits/stdc++.h> 
using namespace std;
main()
{ int a=17,b=5,c,d;
  c=a/b; d=a%b;
  cout<<c<<" "<<d<<endl; 
}

输出:                                      

 

 

五、库函数

1、 字符处理 ctype.h        

2、 数学函数 math.h         

3 、输入输出 stdio.h      

4 、实用工具程序 stdlib.h  

5 、字符串处理 string.h   

包含在math.h库文件中的函数

函数类型

函数形式

功能

类型

abs(int i)

求整数的绝对值

int

fabs(double x)

返回浮点数的绝对值

double

floor(double x)

向下取整

double

ceil(double x)

向上取整

double

trunc(double x)

取整数部分

int

round(double x)

四舍五入

int

fmod(double x, double y)

计算x对y的模, 即x/y的余数

double

int(double x)

取整数部分

 

exp(double x)

指数函数

double

log(double x)

对数函数ln(x)

double

log10(double x)

对数函数log

double

labs(long n)

取长整型绝对值

long

modf(double value, double *iptr)

把数分为指数和尾数

double

pow(double x, double y)

指数函数(x的y次方)

double

sqrt(double x)

计算平方根

double

rand()

产生0到RAND_MAX之间的随机整数

int

sin(double x)

正弦函数

double

asin(double x)

反正弦函数

double

sinh(double x)

双曲正弦函数

double

cos(double x);

余弦函数

double

acos(double x)

反余弦函数

double

cosh(double x)

双曲余弦函数

double

tan(double x)

正切函数

double

atan(double x)

反正切函数

double

tanh(double x)

双曲正切函数

double

包含在ctype.h库文件中的函数

函数类型

函数形式

功能

类型

 

 

isalpha(int  ch) 

若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0

int

isalnum(int  ch)     

若ch是字母('A'-'Z','a'-'z')或数字('0'-'9')返回非0值,否则返回0

int 

isascii(int  ch)   

若ch是字符(ASCII码中的0-127)返回非0值,否则返回0

int

iscntrl(int  ch)   

若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)返回非0值,否则返回0

int 

isdigit(int  ch)  

若ch是数字('0'-'9')返回非0值,否则返回0

int 

isgraph(int  ch) 

若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0

int

islower(int  ch)   

若ch是小写字母('a'-'z')返回非0值,否则返回0

int 

isprint(int  ch)   

若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0

int 

ispunct(int  ch)     

若ch是标点字符(0x00-0x1F)返回非0值,否则返回0

int

isspace(int  ch) 

若ch是空格('  '),水平制表符('\t'),回车符('\r'), 走纸换行('\f'),垂直制表符('\v'),换行符('\n'),返回非0值,否则返回0

int

 isupper(int  ch)   

若ch是大写字母('A'-'Z')返回非0值,否则返回0

int

isxdigit(int  ch) 

若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值,否则返回0

int

tolower(int  ch)   

若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z')

int

toupper(int  ch)   

若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z')

int

 

 

 

 

包含在string.h库文件中的函数

函数类型

函数形式

功能

类型

strcat(char *dest,const char *src)

将字符串src添加到dest末尾

char

strchr(const char *s,int c)

检索并返回字符c在字符串s中第一次出现的位置

char

strcmp(const char *s1,const char *s2)      

  比较字符串s1与s2的大小,并返回s1-s2

int

stpcpy(char *dest,const char *src)

将字符串src复制到dest

char

strdup(const char *s)       

将字符串s复制到最近建立的单元

char

strlen(const char *s)       

返回字符串s的长度

int

strlwr(char *s)   

将字符串s中的大写字母全部转换成小写字母,并返回转换后的字符串

char

strrev(char *s)      

  将字符串s中的字符全部颠倒顺序重新排列,并返回排列后的字符串

char

strset(char *s,int ch)

将一个字符串s中的所有字符置于一个给定的字符ch

char

strspn(const char *s1,const char *s2)

扫描字符串s1,并返回在s1和s2中均有的字符个数

char

strstr(const char *s1,const char *s2)

描字符串s2,并返回第一次出现s1的位置

char

strtok(char *s1,const char *s2)

检索字符串s1,该字符串s1是由字符串s2中定义的定界符所分隔

char

strupr(char *s)

将字符串s中的小写字母全部转换成大写字母,并返回转换后的字符串

char

包含在stdio.h库文件中的函数

函数类型

函数形式

功能

类型

 

 

 

 

 

 

 

 

 

getch() 

从控制台(键盘)读一个字符,不显示在屏幕上

int

putch()    

向控制台(键盘)写一个字符

int

getchar()   

从控制台(键盘)读一个字符,显示在屏幕上

int

putchar() 

向控制台(键盘)写一个字符

int

getc(FILE  *stream) 

从流stream中读一个字符,并返回这个字符

int

putc(int  ch,FILE  *stream)

向流stream写入一个字符ch

int

getw(FILE  *stream) 

从流stream读入一个整数,错误返回EOF

int

putw(int  w,FILE  *stream)

 向流stream写入一个整数

int

fclose(handle)

关闭handle所表示的文件处理

FILE *

fgetc(FILE  *stream) 

从流stream处读一个字符,并返回这个字符

int

fputc(int  ch,FILE  *stream) 

将字符ch写入流stream中

int

fgets(char  *string,int  n,FILE  *stream)

流stream中读n个字符存入string中

c har *

fopen(char *filename,char *type)

打开一个文件filename,打开方式为type,并返回这个文件指针,type可为以下字符串加上后缀

FILE *

fputs(char  *string,FILE  *stream) 

 将字符串string写入流stream中

int

fread(void  *ptr,int  size,int  nitems,FILE  *stream)

从流stream中读入nitems个长度为size的字符串存入ptr中

int

fwrite(void  *ptr,int  size,int  nitems,FILE  *stream) 

向流stream中写入nitems个长度为size的字符串,字符串在ptr中

int

fscanf(FILE  *stream,char  *format[,argument,…]) 

以格式化形式从流stream中读入一个字符串

int

fprintf(FILE  *stream,char  *format[,argument,…])

以格式化形式将一个字符串写给指定的流stream

int

scanf(char *format[,argument…])

从控制台读入一个字符串,分别对各个参数进行赋值,使用BIOS进行输出

int

printf(char *format[,argument,…])

 

发送格式化字符串输出给控制台(显示器),使用BIOS进行输出

int

看程序写结果:
 
#include<iostream>
#include<cmath>//使用数学函数前必须添加cmath或者math.h 
using namespace std;
int main()
{   double x1,y1,x2,y2;
    cin >> x1 >> y1 >> x2 >> y2;
    cout << sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
    return 0;
}
输入:5  11  5  15
输出:                              
 
 
动手编程:
1、打印输出一个0~1之间的随机数。
2、打印输出一个20~100之间的随机数。
3、随机产生一个四位数。
 

 

六、输入输出语句

1、cin、cout、endl语句

  • cout是C++系统中,由iostream文件定义的一个对象名,称为输出流对象。读作c-out。
  • “<<”  是插入运算符。
  • cout<<“my frist program.“是将字符串“my frist program”插入到输出的队列cout中(输出的队列也称作“输出流”)。
  • cin是C++系统中,由iostream文件定义的一个对象名,称为输出流对象。读作c-in。
  • “>>”  是插入运算符。
  • cin>>a是从键盘输入内容给a。
  • endl是换行, 是  end   line的缩写;
  • C++语言区分大小写,cout 、endl不能写成Cout、Endl。
cin>>a>>b>>c; 可写成
cin>>a;
cin>>b;
cin>>c;
 
cout<<a<<b<<c;
可写成
cout<<a;
cout<<b;
cout<<c;
 
cout输出流控制符 
控制符:可以对I/O流的格式进行控制。C++在头文件iomanip.h中定义了控制符对象,可以直接将这些控制符嵌入到I/O语句中进行格式控制。在使用这些控制符时,要在程序的开头包含头文件iomanip。
dec
设置整数为十进制(相当于 "%d
hex
设置整数为八进制(相当于 "%x
oct
设置整数为十六进制(相当于 "%o
setbase(n)
设置整数为 n 进制 (n=8,10,16)
setfill(n)
置字符填充,c可以是字符常或
字符变量
setprecision(n)
设置浮点数的效数字为
setw(n)
设置字段宽度为n位
setiosflags(ios::fixed)
设置浮点数以固定的小数位数显示
setiosflags(ios::scientific)
设置浮点数以科学计数法表示
setiosflags(ios::left)
输出左对齐
setiosflags(ios::right)
输出右对齐
setiosflags(ios::skipws)
忽略前导空格
setiosflags(ios::uppercase)
在以科学计数法输出E与十六进制
输出X以大写输出,否则小写。
setiosflags(ios::showpos)
输出正数时显示 "+"
resetiosflags()
终止已经设置的输出格式状态,
在括号中应指定内容
#include<iostream>
#include<iomanip>
using namespace std;
int a[20]={0,1};
int main()
{  int i=17;
   char c='q';
   float a=1.3456;
   cout<<setfill(c)<<setw(10)<<setbase(8)<<i;
}

输出:                              

 

2、getchar()和putchar()

  • getchar()函数是接收从键盘输入的单个字符。
1、通常把输入的字符赋予一个字符变量,构成赋值语句。 如:char   ch; ch=getchar();
2、getchar()只能接受单个字符,输入数字也按字符处理。
3、输入多于一个字符时,只接收第一个字符。
4、单独一条getchar();语句是等待用户输入,直到按回车键才结束,可用于暂停程序的运行,直到输入一个回车键。
5、如果在程序中连续有两个以上getchar()函数,应该一次性输入所需字符,最后再按回车键,否则会把回车作为一个字符传给后面的getchar()函数。
6、getchar()是函数,所以后面的括号不能省略。
 
  • putchar()函数是向标准输出设备(显示器)输出单个字符。
#include<bits/stdc++.h>
using namespace std;
int main()
{  char c='B';
   putchar(c);      //  输出字符变量
   putchar('B');    //直接输出
   putchar('\102'); //  转义字符八进制输出字符
   putchar('\x42'); //  转义字符十六进制输出字符
   putchar(66);     //  十进制数输出字符
   putchar(0x42);   //十六进制数输出字符
   putchar(0102);   //  八进制数输出字符
}
3、 Printf()函数 输出格式 :
 
函数的一般形式为: printf  (  “格式控制字符串”,  输出表列)
 
  • 格式控制字符串用于指定输出格式。
  • 格式控制字符串由格式字符串和非格式字符串两种组成。
  • 格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。
    如:         “%d”表示按十进制整型输出;
                     “%ld”表示按十进制长整型输出;
                     “%c”表示按字符型输出等。
 
  • 非格式字符串原样输出,在显示中起提示作用。
  • 输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。
C语言中格式控制字符串的一般形式为:     %[ 标志 ] [ 输出最小宽度 ] [. 精度 ] [ 长度 ] 类型        其中方括号[     ]中的项为可选项。
 
#include <cstdio>
using namespace std;
int main()
{  int a=88,b=89;
   printf("%d %d\n",a,b);
   printf("%d,%d\n",a,b);
   printf("%c,%c\n",a,b);
   printf("a=%d,b=%d",a,b);
}

输出:                              

 
本例中四次输出了a、b的值,但由于格式控制串不同,输出的结果也不相同。
第1行的输出语句格式控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a、b值之间有一个空格。
第2行的printf语句格式控制串中加入的是非格式字符逗号,因此输出的a、b值之间加了一个逗号。
第3行的格式串要求按字符型输出a、b值。
第4行中为了提示输出结果又增加了非格式字符串。
 
 
1 类型参数说明
  类型字符用以表示输出数据的类型,其格式符和意义如下表所示:
格式字符
意义
%d
以十进制形式输出带符号整数(正数不输出符号)
%o
以八进制形式输出无符号整数(不输出前缀0)
%x或%X
以十六进制形式输出无符号整数(不输出前缀Ox)
%u
以十进制形式输出无符号整数
%f
以小数形式输出单、双精度实数
%e或%E
以指数形式输出单、双精度实数
%g或%G
以%f或%e中较短的输出宽度输出单、双精度实数
%c
输出单个字符
%s
输出字符串
(2) [标志  ]   参数说明
标 志
意义
-
结果左对齐,右边填空格
+
输出符号(正号或负号)
空格
输出值为正时冠以空格,为负时冠以负号
#
对c、s、d、u类无影响;
对o类,在输出时加前缀o;
对x类,在输出时加前缀0x;
对e、g、f 类当结果有小数时才给出小数点。
0
将空出的列宽补上0,(不可以搭配使用)
(3) 输出最小宽度
          用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
 
(4) 精度
      精度格式符以“.”开头,后跟十进制整数。本项的意义是:
           1、如果输出数字,则表示小数的位数;
           2、如果输出的是字符,则表示输出字符的个数;
           若实际位数大于所定义的精度数,则截去超过的部分。

(5) 长度
      长度格式符为h、l两种:
           1、 h表示按短整型量输出,
            2、l表示按长整型量输出,如果是实数lf则表示double。
 
 
运行程序,观察结果:
#include <stdio.h>
int main()
{  int a=15;   float b=123.1234567;
   double c=12345678.1234567;
   char d='p';
   printf("a=%d\n", a); // %% 可以输出 %
   printf("a(%%d)=%d, a(%%5d)=%5d, a(%%05d)=%05d ,a(%%-5d)=%-5d, a(%%o)=%o,   a(%%x)=%x\n\n",a,a,a,a,a,a);  
   printf("a=%f\n", b);
   printf("b(%%f)=%f, b(%%lf)=%lf, b(%%5.4lf)=%5.4lf, b(%%e)=%e\n\n",b,b,b,b);
   printf("c=%f\n", c);
   printf("c(%%lf)=%lf, c(%%f)=%f,   c(%%8.4lf)=%8.4lf\n\n",c,c,c);
   printf("d=%c\n", d);
   printf("d(%%c)=%c, d(%%8c)=%8c\n",d,d);
   printf("******(%%5.3s)=%5.3s","******");
}
本例中分析:
 
•第11行以四种格式输出整型变量a的值,其中“%5d ”要求输出宽度为5,而a值为15只有两位故补三个空格。
•第14行以四种格式输出实型量b的值。其中“%f”和“%lf ”格式的输出相同,说明“l”符对“f”类型无影响。“%5.4lf”指定输出宽度为5,精度为4,由于实际长度超过5故应该按实际位数输出,小数位数超过4位部分被截去。
•第17行输出双精度实数,“%8.4lf ”由于指定精度为4位故截去了超过4位的部分。
•第20行输出字符量d,其中“%8c ”指定输出宽度为8故在输出字符p之前补加7个空格。
 
看程序写结果:
#include<cstdio>
using namespace std;
int main()
{ int i=1;
  long j=123;
  printf("%d,%2d,%03d,%1d,%-4ld,%05ld",i,i,i,j,j,j);
}
输出:                                    

 

4、scanf()函数输入格式 :
 
scanf函数的一般形式为: scanf(   格式控制字符串 ”   ,   地址表列  )  ;
格式控制字符串的作用与printf函数相同, 地址表列中给出各变量的地址。地址是由地址运算符“&”跟变量名组成的。如:
&a、&b分别表示变量a和变量b的地址。

 

#include <stdio.h>
int main()
{
    int a,b,c;
    printf("input int a,b,c\n");
    scanf("%d%d%d",&a,&b,&c);
    printf("a=%d,b=%d,c=%d",a,b,c);
    return 0;
}
由于scanf函数本身不能显示提示串,故先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,等待用户输入。在scanf语句的格式串中由于没有非格式字符在“%d%d%d”之间作输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。
如:7   8   9

7
8
9
 
格式字符串:格式字符串的一般形式为:        % [*] [输入数据宽度] [长度] 类型

 

(1) 类型参数说明           表示输入数据的类型,其格式符和意义如下表所示。
格式
字符意义
d
输入十进制整数
o
输入八进制整数
x
输入十六进制整数
u
输入无符号十进制整数
f或e
输入实型数(用小数形式或指数形式)
c
输入单个字符
s
输入字符串

(2)“   *  ”符
   用以表示该输入项读入后不赋予相应的变量,即跳过该输入值。           

       如:scanf("%d %*d %d",&a,&b);
       当输入为:1   2   3时,把1赋予a,2被跳过,3赋予b。
 
(3)宽度
   用十进制整数指定输入的宽度(即字符数)。
        例如:scanf("%5d",&a);
        输入12345678只把12345赋予变量a,其余部分被截去。
        又如: scanf("%4d%4d",&a,&b);
        输入12345678将把1234赋予a,而把5678赋予b。
 
(4)长度
   长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数   
   (如%hd)。h表示输入短整型数据。
 
案例分析:
 
1、scanf( "%c%c%c",&a,&b,&c);
输入 d  e  f 则把‘d’赋予a,空格赋予b,‘e’赋予c。
输入为 def 时,才能把‘d’赋于a,‘e’赋予b,‘f’赋予c。
 
2、如果在格式控制中加入空格作为间隔,
   如:scanf (" %c %c %c",&a,&b,&c);
输入为 d  e  f 时,把'd'赋于a,'e'赋予b,'f'赋予c。
 
3、 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
    scanf(" %d,%d,%d",&a,&b,&c);
    其中用非格式符“ , ”作间隔符,故输入时应为:5,6,7。
    scanf(" a=%d,b=%d,c=%d",&a,&b,&c);
    则输入应为:a=5,b=6,c=7。
 
 
5、Scanf()函数与printf()返回值
 
一、 scanf 函数是有返回值的,它的返回值可以分成三种情况:
1、 返回正整数,表示正确输入参数个数。      如执行 scanf(“%d %d”, &a, &b); 如果输入“3 4”,可以正确输入,返回2(正确输入了两个变量); 如果输入“3,4”,可以正确输入a,无法输入b,返回1 (只输入一个变量)    
 
2、返回0,表示用户的输入不匹配,没有输入任何值。如上例,      如果输入“,3 4”,开始是逗号,没有输入任何值则返回0。  
 
3、返回EOF(EOF是在stdio.h里面定义的常量,值为-1)表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车,就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。
 
二、printf的返回值是输出的字符数,
例如,printf("1234")的返回值是4,而printf("1234\n")的返回值是5。
 
 
 

七、动手练习编程

 
1、输入一个整数,输出它的十进制、八进制、十六进制数
 

2、用putchar(),printf()分别有几种方法输出一个ASC码字符。

3、读入一个单精度浮点数,保留3位小数,输出这个浮点数。

4、读入一个双精度浮点数分别按输出格式“%f”,“%f”保留5位小数, “%e ”和“%g”的形式输出这个数,每次在单独一行上输出。

5、给定一个字符,用它构造一个对角线长5个字符的菱形。
 

 

;