C 003-C 变量和数据类型2
C 数据类型
数据类型及定义
数据类型及类型大小
1.unsigned 不影响变量存储的大小,仅影响变量取值的范围 2.指针的大小位寻址空间大小N位编译器的寻址空间大小=2 的N次方
浮点数据的使用
代码语言:javascript复制#include <iostream>
using namespace std;
int main()
{
//类型一:整数位很多
double x=12345678;
//类型二:小数位很多,有效小数位少
double y=0.00005678;
//类型三:小数位很多,有效小数位也多
double z=1.1234567;
cout<<x<<endl;
cout<<y<<endl;
cout<<z<<endl;
// 前两个数采用了科学记数法(scientific notation),第三个数保留了5位小数。
cout<<"$$$$$$$$$$$$$$$"<<endl;
return 0;
}
输出为:
1.23457e 07 5.678e-05 1.12346 $
前两个数采用了科学记数法(scientific notation),第三个数保留了5位小数。浮点数用默认记数法defaultfloat编写:这种表示方法尽可能用多的位数,这个位数包括小数点前及小数点后的位数。 默认记数法特点
1)保留有效位至多6位(有效位包括小数点前的位数,正如上文译文提到的),如 double z=1.1234567;的输出为1.12346。截取数字的规则是四舍五入 2)删去无效位数(也算是第一点的进一步说明) double x=1.234596; cout<<x<<endl; 的输出为1.2346,而不是1.23460 3)适当情况下会用科学记数法(scientific notation) //类型一:整数位很多 double x=12345678; //类型二:小数位很多,有效小数位少 double y=0.00005678;
题目描述:求阴影面积
代码语言:javascript复制#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double m,n,S,S1,S2;
cout<<"请输入两个正方形的边长m和n,用空格或换行分割"<<endl;
cin>>m>>n;
S1 = 0.5*m*m;//
S2=0.5*(n-m)*n;
S = S1 S2;
cout<<"阴影面积为:"<<fixed<<setprecision(2)<<S<<endl;
return 0;
}
输出为:
代码语言:javascript复制请输入两个正方形的边长m和n,用空格或换行分割
10 5
阴影面积为:37.50
Process returned 0 (0x0) execution time : 4.613 s
Press any key to continue.
题目描述:计算园的周长和面积
代码语言:javascript复制//#include <iostream>
//#include <iomanip>
//#include<cmath>
//#include <limits>
#include<bits/stdc .h>
using namespace std;
int main()
{
/*
const long double pi = acos(-1.L);
std::cout << "default precision (6): " << pi << 'n'
<< "std::setprecision(10): " << std::setprecision(10) << pi << 'n'
<< "max precision: "
<< std::setprecision(std::numeric_limits<long double>::digits10 1)
<< pi << 'n';
*/
/*
default precision (6): 3.14159
std::setprecision(10): 3.141592654
max precision: 3.141592653589793239
*/
double pi = 3.14;
double r,C,S;
cout<<"输入半径的长度"<<endl;
cin>>r;
C = 2*pi*r;
S = pi*r*r;
cout<<"园的周长为:"<<C<<endl; // 62.83185307179586232
cout<<"园的面积为:"<<S<<endl; // 314.1592653589793258
//cout<<"园的周长为:"<<std::setprecision(2)<<C<<endl; //63
//cout<<"园的面积为:"<<S<<endl; // 3.1e 02
//cout<<"园的周长为:"<<fixed<<C<<endl; //62.83
//cout<<"园的面积为:"<<S<<endl; //314.16
return 0;
}
输出为:
代码语言:javascript复制输入半径的长度
5.67
园的周长为:35.6076
园的面积为:100.948
如何取消科学计数法表示浮点数
用fixed,一个manipulator。 fixed
代码语言:javascript复制fixed是一个计算机专业术语,指向托管变量的指针并在 statement 执行期间“钉住”该变量。 fixed流操作符,它表示浮点输出应该以固定点或小数点表示法显示
#include <iostream>
using namespace std;
int main()
{
//类型一:整数位很多
double x=123456789;
//类型二:小数位很多,有效小数位少
double y=0.000056789;
cout<<fixed<<x<<endl;
cout<<fixed<<y<<endl;
// 其实只要出现了fixed,则后面都是以fixed输出。第2行fixed不需要写了
return 0;
}
输出为:
123456789.000000 0.000057
其实只要出现了fixed,则后面都是以fixed输出。第2行fixed不需要写了。 当 std::setprecision和std::ios::fixed一起使用时,则精度特指小数点后面保留的位数(注意和前面的区别,前面是包括小数点前面后面所有数字位数),如:上例中的 std::setprecision(10) << pi,则输出3.1415926536,不算小数点,小数点后面数字有10位
代码语言:javascript复制cout << setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2);
setiosflags 是包含在命名空间iomanip中的C 操作符,该操作符的作用是执行由有参数指定区域内的动作; ios::fixed 是操作符setiosflags 的参数之一,该参数指定的动作是以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移向小数点右侧; ios::right 也是setiosflags 的参数,该参数的指定作用是在指定区域内右对齐输出; setprecision 也是包含在命名空间iomanip 中的C 操作符,该操作符的作用是设定浮点数; setprecision(2) 的意思就是小数点输出的精度,即是小数点右面的数字的个数为2。 使用 setprecision(n) 可控制输出流显示浮点数的数字个数。C 默认的流输出数值有效位是6。 如果setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。 setiosflags(ios::fixed)是用定点方式表示实数
所以: cout << setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2);
合在一起的意思就是,输出一个右对齐的小数点后两位的浮点数。
iomanip的作用比较多:
主要是对cin,cout之类的一些操纵运算子,比如setfill, setw, setbase, setprecision等等。它是I/O流控制头文件, 就像C里面的格式化输出一样。以下是一些常见的控制函数的:
dec 置基数为10 相当于"%d" hex 置基数为16 相当于"%X" oct 置基数为8 相当于"%o" setfill(c) 设填充字符为c setprecision (n) 设显示小数精度为n位 setw (n) 设域宽为n个字符,这个控制符的意思是保证输出宽度为n。如: cout << setw(3) << 1 << setw(3) << 10 << setw(3) << 100; 输出结果为 1 10100 (默认是右对齐)当输出长度大于3时(<<1000),setw(3)不起作用。
另外:
代码语言:javascript复制setioflags(ios::fixed) 固定的浮点显示 setioflags(ios::scientific) 指数表示 setiosflags(ios::left) 左对齐 setiosflags(ios::right) 右对齐 setiosflags(ios::skipws) 忽略前导空白 setiosflags(ios::uppercase) 16进制数大写输出 setiosflags(ios::lowercase) 16进制小写输出 setiosflags(ios::showpoint) 强制显示小数点 setiosflags(ios::showpos) 强制显示符号
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout<<12345.1234568 <<endl; // 输出"12345.1"
cout << setprecision(3) << 10.1234568 << endl;
// 输出"10.1"
cout << setprecision(3) << 12345.1234568 << endl;
//输出"1.23e 004 "
cout << setiosflags(ios::fixed) << setprecision(3) <<12345.1234568 << endl;
//输出"12345.123 "
cout <<setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2)<< 10.2345 << endl;
//输出"10.23 "
cout <<setw(8)<< setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2)<< 10.2345 << endl;
//输出" 10.23 "
cout <<setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(2)<< 10.2345 << endl;
//输出"10.23 "
return 0;
}
布尔变量的使用
隐式转换与显式转换
题目描述:计算球的体积
代码语言:javascript复制#include <iostream>
using namespace std;
int main()
{
double pi = 3.14;
double r,V;
cout<<"输入半径的长度"<<endl;
cin>>r;
//V = 4/3*3.14*r*r*r; //3.14
V = 4.0/3*3.14*r*r*r; //4.18667
cout<<"园的体积为:"<<fixed<<V<<endl; //62.83
return 0;
}
输出为:
代码语言:javascript复制输入半径的长度
1
园的体积为:3.140000
Process returned 0 (0x0) execution time : 4.491 s
Press any key to continue.
上面的题中,发现4/3和4.0/3时的计算结果不一致,这里就出现了隐式转换的问题。
隐式转换规则:
C 语言编译系统提供的内部数据类型的隐式自动转换规则如下: 1、执行算术运算时,低类型(短字节)可以转换为高类型(长字节);例如: int型转换成double型,char型转换成int型等等; 2、赋值表达式中,等号右边表达式的值的类型自动隐式地转换为左边变量的类型,并赋值给它; 3、函数调用时,将实参的值传递给形参,系统首先会自动隐式地把实参的值的类型转换为形参的类型,然后再赋值给形参; 4、函数有返回值时,系统首先会自动隐式地将返回表达式的值的类型转换为函数的返回类型,然后再赋值给调用函数返回;
显式强制类型转换C风格
在C 基本的数据类型中,可以分为四类:整型,浮点型,字符型,布尔型。其中数值型包括 整型与浮点型;字符型即为char。 (1)将浮点型数据赋值给整型变量时,舍弃其小数部分。 (2)将整型数据赋值给浮点型变量时,数值不变,但是以指数形式存储。 (3)将double型数据赋值给float型变量时,注意数值范围溢出。 (4)字符型数据可以赋值给整型变量,此时存入的是字符的ASCII码。 (5)将一个int,short或long型数据赋值给一个char型变量,只将低8位原封不动的送到char型变量中。 (6)将有符号型数据赋值给长度相同的无符号型变量,连同原来的符号位一起传送。
显式强制类型转换C 风格
C 中强制类型转换函数有4个: const_cast(用于去除const属性), static_cast(用于基本类型的强制转换), dynamic_cast(用于多态类型之间的类型转换), reinterpreter_cast(用于不同类型之间的指针之间的转换,最常用的就是不同类型之间函数指针的转换)。
参考:C 强制类型转换
代码语言:javascript复制#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 3;
double result = (double)a / (double)b;
cout<<result<<endl;
// 使用 static_cast 关键字
int a1 = 10;
int b1 = 3;
double result1 = static_cast<double>(a1) / static_cast<double>(b1);
cout<<result1<<endl;
return 0;
}
输出为:
字符数据的使用
C和C 中字符型变量只占用一个字节; 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII码放入到存储单元。
代码语言:javascript复制#include <iostream>
using namespace std;
int main(){
char ch = 'a';//要用单引号,且只能有一个字符
cout << ch << endl;
cout << sizeof(char) << endl;//查看字符型变量所占内存大小
cout << (int)ch << endl;//字符型变量对应的ASCII码
//system("pause");
cout <<"$$$$$$$$$$$$$$"<<endl;
//char s1;
//cin >>s1; // 不能输入空格和换行符
//cout <<s1 ;
cout <<"$$$$$$$$$$$$$$"<<endl;
char s2;
s2 = getchar(); // 能输入空格32和换行符10
cout << s2 <<int(s2) ;
return 0;
}
ASCII码
课堂练习
题目描述 字符与整数运行
代码语言:javascript复制#include <iostream>
using namespace std;
int main(){
char a,b;
cin >>a; //输入A
cout<<"a 1 = "<<a 1<<endl; //输出a =66
b = a 1; //赋值,并转换为char类型
cout<<"b = "<<b<<endl; //输出b=B
return 0;
}
题目描述 字符大写转小写
代码语言:javascript复制#include <iostream>
using namespace std;
int main(){
char a;
cin >>a; //输入A
cout<<char(a 32)<<endl; //输出a
return 0;
}
题目描述 SOS
代码语言:javascript复制#include <iostream>
using namespace std;
int main(){
char a,b,c;
cin >>a>>b>>c; //输入A
a = a-3;
b = b-3;
c = c-3;
cout<<a<<b<<c<<endl; //输出a
return 0;
}
总结
本系列为C 学习系列,会介绍C 基础语法,基础算法与数据结构的相关内容。本文为浮点类型,布尔类型,隐式与显示转换,字符类型的基本使用,以及相关案例练习。