C/C++数据类型与输入输出
- 基本数据类型
- 输入与输出
- 复合数据类型(将在下几篇博客中总结)
C/C++数据类型
数据类型总图
数据类型差别
数据类型不同的意义
1)指明数据的大小,以便正确分配,访问,回收内存。
2)对本质上不可区分的内存数据进行不同的操作。
- 注意:不同的编译器可能对数据类型分配的字节书可能不同,但这是常见的字节分配
- 补充字节数:字节(Byte )是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于有八位二进制数。
基本数据类型应用
常量与变量:
程序运行过程中其值不能被改变为常量常量分为:整形常量(整数)、实型常量(实数)、字符常量(普通字符和转义字符)、自己声明的const常量。
注意:字符常量(字母及符号)与ASCALL码的关系,字符常量可以与ASCALL码的相互转化并应用于解题
变量:代表一个名字,具有特定的属性的一个存储单元,用来存放数据,在程序中自己先声明,后使用。
常用基本类型介绍
常见C/C++运算符
C/C++输入输出
概述C与C++输入输出的本质差异
C语言的的输入输出用的主要是scanf()、printf()函数,而C++是使用类对象cin、cout进行输入人输出
C语言输入输出格式
输出格式:printf(“格式控制字符”,“输出列表”)或printf(“字符串+转义字符(可省略)”);例如:printf("%d,%c\n",i,c);
输入格式:scanf(“格式控制字符”,地址列表);例如:scanf("%d,%f",&a,&b),
注意:1. &为取地址运算符,放在变量之前可以获取变量的地址。2.输出列表中变量的值应与格式控制符一一对应,否则会出现强制隐式转换甚至产生错误。
- C 输出应用举例
//例1:字符串输出
# include <stdio.h>
int main(void)
{
printf("Hello World!\n"); // \n表示换行
return 0;
}
//例2:变量值输出
#include<stdio.h>
int main()
{
int a=10;
double b=2.5;
float c=0.9;
char d={'A'};
printf("%d %f %f %c\n",a,b,c,d) // \n表示换行
return 0;
}
//例3:变量字符一起输出
#include<stdio.h>
int main()
{
int a=10;
float b=0.9;
printf("整数:%d,浮点数:%f,hai ke yi tian jia zi fu chuan\d",a,b);
return 0;
}
注意:浮点数(double和float等类型)默认输出为小数点后六位。
因为程序中虽然写的是 a=10,但是在内存中并不是将 10 这个十进制数存放进去,而是将 10 的二进制代码存放进去了。计算机只能执行二进制 0、1 代码,而 0、1 代码本身并没有什么实际的含义,它可以表示任何类型的数据。所以输出的时候要强调是以哪种进制形式输出。所以就必须要有“输>出控制符”,以告诉操作系统应该怎样解读二进制数据。
如果是%x就是以十六进制的形式输出,要是%o就是以八进制的形式输出,大家自己试一下。
在格式控制符之间的东西会被“如实”的打印出来,如在例2中:输出的数据以“空格”作为分隔符
在例三中输出的数据以‘,’来作为分隔符。
//例4:指定数据宽度和小数位数(格式控制符发生变化为:%m.nf)
#include<stdio.h>
int main()
{
double b=2.54321;
float c=0.123456789;
printf("%10.4f,%1.3f,\n",b,c); // \n表示换行
return 0;
}
注意请看数据宽度的定义
//例5:输出数据左对齐(默认右对齐)用例如这样的格式控制符:%-m.nf
#include<stdio.h>
int main()
{
double a=100/3.0;
printf("%25.15f",a);//默认右对齐
printf("\n");
printf("%-25.15f",a);//左对齐
printf("\n");
//注意浮点最后一位输出四舍五入已经不准确了
}
//输出结果
33.333333333333336
33.333333333333336 结尾处
C 输入应用举例
//scanf("格式控制字符",地址列表)输入与printf()用法相似,注意地址列表中的变量类型,要与格式控制符一一对应,“地址列表”放的一定是地址(如: &变量)。
//例子
#include<stdio.h>
int main()
{
int a;
double b;
char c;
scanf("%d %lf %c",&a,&b,&c);//空格间隔符
printf("%d %lf %c \n",a,b,c); //这里输出也指定了间隔符
}
//输入:2 42.422 p
//输出:2 42.422000 p
// Program ended with exit code: 0
//注意:1 在输入的时候需要指定相邻输入数据的间隔符,如变量a,b的间隔符为“空格”,过不指定间隔符则会一直读取输入的字符知道不满足该控制符所满足的类型,开始为下一个类型变量读取输入值。
//注意:2 以控制符%c输入时 空格 和 转义字符 也会被认为有效字符输入
c++输入输出输出格式
#include<iostream>
using namespace std;
int main()
{
int a,b;
double c;
cin>>a; //equal to scanf("%d",&a);
cin>>a>>b>>c; //equal to scanf("%d%d%lf",a,b,c)
cout<<a; //equal to printf("%d",a)
cout<<a<<b<<c; //equal to printf("%d%d%lf",a,b,c)
return 0;
}
//C++的简单输入输出,相对C 更简单,但是当需要控制格式输入输出时就相对C 更难了
补充知识以深入了解输入输出
补2. 什么是类:“类”并不是一个神秘的东西,简单说“类”就是用户定义的一种数据类型(与内置类型int、double、char等相似),类是对一类相似事物进行抽象,从而达到简化,找出它们共有的属性,改类 含有 能够表示什么信息、能够对数据执行的操作(即该类中的函数)。而“对象”则是一个“类”进行实例化(抽象的逆过程) 产生一个符合这个类的 真实(可用于解决问题的)“个体”,而这个“个体”拥有“这个‘类’所定义的功能”;
而cin,cout就是ostream实例化出的“个体”
还不懂可以借鉴百度百科
补1. 对输入输出流的理解
C++格式控制输入输出(没有格式化输入,因为cin比较智能)
C++有两种方法控制格式输出:
1、用格式控制符(使用控制符时,在程序开头加投文件#include )
2、用流对象的成员函数控制符
- 输出格式控制类成员函数用法
cout.precision()设置小数点后精确度,
cout.width(n) //设置输出宽度n,实际宽度>输出宽度,则按实际输出,每次使用只生效一次,下次使用还要再写上这句
cout.setf()设置显示格式,比如cout.setf(ios::left)左对齐或者cout.setf(ios::right)
cout.setf(ios::showpoint)不管是否有小数位,显示小数点
cout.fill();不足宽度则填充,如cout.fill(‘0’);
cout.precision(6);
cout.setf(ios::showpoint);//强制出现‘+’号- C++ 格式控制符方法
dec //设置基数为10hec //设置基数为16
oct //设置基数为8
setfill© //设置填充字符c
setprecision(n) //设置显示小数精度为n位
setw(n) // 设置域宽为n个字符
setiosflags(ios::fixed) // 固定的浮点显示
setiosflags(ios::scientific) //指数表示
setiosflags(ios::left) // 左对齐
setiosflags(ios::right) // 右对齐
setiosflags(ios::skipws) //忽略前导空白
setiosflags(ios::uppercase) //16进制数大写输出
setiosflags(ios::lowercase) //16进制小写输出
C++格式输出举例(以下是转载别人的)
/*基础例子*/
#include <iostream>
#include <iomanip>
using namespace std;
int main ()
{
double a=123456.343001;
cout<<"a的值为123456.343001"<<endl<<endl;
cout<<"不做任何操作,默认情况下只显示6六位数据:"<<a<<endl<<endl;
cout<<"指定10位小数且为浮点数表示setiosflags(ios::fixed):"<<setiosflags(ios::fixed)<<setprecision(10)<<a<<endl<<endl;
cout<<"指定为10位小数且为指数形式表示setiosflags(ios::scientific),就是留下有效位:如何指定的有效位超过本来的有效位,其输出就是本身的位数:"<<setiosflags(ios::scientific)<<setprecision(12)<<a<<endl<<endl; cout<<"指定为10位小数且为指数形式表示setiosflags(ios::scientific),就是留下有效位:setprecision(10)指定留下10位有效位"<<setiosflags(ios::scientific)<<setprecision(10)<<a<<endl<<endl;
cout<<"左对齐:"<<setiosflags(ios::left)<<setprecision(20)<<a<<endl<<endl;
cout<<"右对齐:"<<setiosflags(ios::right)<<setprecision(20)<<a<<endl<<endl;
system("pause");
return 0;
16 }
/*一个按进制输出的例子*/
#include<iomanip.h>
void main()
{
int x=30, y=300, z=1024;
cout<<x<<' '<<y<<' '<<z<<endl; //按十进制输出
cout<<oct<<x<<' '<<y<<' '<<z<<endl; //按八进制输出
cout<<setiosflags(ios::showbase); //设置基指示符
cout<<x<<' '<<y<<' '<<z<<endl; //仍按八进制输出
cout<<resetiosflags(ios::showbase); //取消基指示符
cout<<hex<<x<<' '<<y<<' '<<z<<endl; //按十六进制输出
cout<<setiosflags(ios::showbase | ios::uppercase);
//设置基指示符和数值中的字母大写输出,
cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六进制输出
cout<<resetiosflags(ios::showbase | ios::uppercase);
//取消基指示符和数值中的字母大写输出
cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六进制输出
cout<<dec<<x<<' '<<y<<' '<<z<<endl; //按十进制输出
/*一个使用填充,宽度,对齐方式的例子*/
#include <iostream.h>
void main()
{
cout<<"第一章"<<endl;
cout<<" ";
cout.setf(ios::left); //设置对齐方式为left
cout.width(7); //设置宽度为7,不足用空格填充
cout<<"1.1";
cout<<"什么是C语言";
cout.unsetf(ios::left); //取消对齐方式,用缺省right方式
cout.fill('.'); //设置填充方式
cout.width(30); //设置宽度,只对下条输出有用
cout<<1<<endl;
cout<<" ";
cout.width(7); //设置宽度
cout.setf(ios::left); //设置对齐方式为left
cout.fill(' '); //设置填充,缺省为空格
cout<<"1.11";
cout<<"C语言的历史";
cout.unsetf(ios::left); //取消对齐方式
cout.fill('.');
cout.width(30);
cout<<58<<endl;
cout.fill(' ');
cout<<"第二章"<<endl;
}
/*关于浮点数的格式*/
#include <iostream.h>
void main()
{
float f=2.0/3.0,f1=0.000000001,f2=-9.9;
cout<<f<<' '<<f1<<' '<<f2<<endl; //正常输出
cout.setf(ios::showpos); //强制在正数前加+号
cout<<f<<' '<<f1<<' '<<f2<<endl;
cout.unsetf(ios::showpos); //取消正数前加+号
cout.setf(ios::showpoint); //强制显示小数点后的无效0
cout<<f<<' '<<f1<<' '<<f2<<endl;
cout.unsetf(ios::showpoint); //取消显示小数点后的无效0
cout.setf(ios::scientific); //科学记数法
cout<<f<<' '<<f1<<' '<<f2<<endl;
cout.unsetf(ios::scientific); //取消科学记数法
cout.setf(ios::fixed); //按点输出显示
cout<<f<<' '<<f1<<' '<<f2<<endl;
cout.unsetf(ios::fixed); //取消按点输出显示
cout.precision(18); //精度为18,正常为6
cout<<f<<' '<<f1<<' '<<f2<<endl;
cout.precision(6); //精度恢复为6
}
- 其他输入输出
在c/c++系统中除了标准的输入输出外,还提供了更多的输入函数。
这写函数主要有getch(),getche(), getchar (),cin.get(),putch(),putchar(),cout.put(),gets(),cin.getline(),puts()。另外 还有些为了让缓冲区不影响程序的正确操作的缓冲去的操作,如:cin.putback(),fflush(stdin),cout.flush().我们 做一下简单的说明。
1、getch()和getche(),非缓冲式输入,从键盘读入一个字符。getch()读入字符不显示。有conio.h支持。
2、cin.get(),getchar(),缓冲式输入,从键盘读入一个字符,并显示。getchar()由stdio.h支持,cin.get()由iostream.h支持。
3、putch()和putchar(),非缓冲式输出,输出一个字符到显示器。putch()由conio.h支持,putchar()由stdio.h支持。
4、cout.put(),缓冲式输出,输出一个字符到显示器。由iostream.h支持。
5、gets()和cin.geline(),缓冲式输入,读入一字符串(包括空格,不包括最后的回车),gets()由stdio.h支持,cin.getline()由iostream.h支持。
6、puts(),非缓冲输出,输出一个字符串,由stdio.h支持。
7、cin.putback(),把一个字符送回输入缓冲区。
8、fflush(stdin),清除输入缓冲区操作。无法清除cin.get()等带来的操作。
9、cout.flush(),清楚输出缓冲区。 在这里我们稍微说一下输入/输出缓冲区,这是为了减少程序访问io带来中断而设的一段空间。当程序满足某个刷新条件时,那就将清理缓冲区。具体条件为:
参考别人的各种函数总结