本章学习内容:
①C数据类型、表达式
②C语句
③数据输入输出的概念及在C语言中的实现
④字符数据的输入输出
⑤格式输入与输出
⑥顺序结构程序设计举例
3.1 C数据类型、表达式
注意:数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 可以进行的操作
3.1.2 常量与变量
常量和符号常量 定义:程序运行过程中,其值不能被改变的量(常数)
分类:直接常量、符号常量
类型 |
示例 |
整型常量 |
12 、 0 、 -3 |
实型常量 |
4.6 、 -1.23 |
字符常量 |
‘a’ 、 ‘b’ |
符号常量 |
PRICE 、 PAI |
符号常量:用标识符代表常量 一般用大写字母: PRICE 、 PI 定义格式: #define 符号常量 常量 其值在作用域内不能改变和再赋值。
符号常量的优点是:见名知意、一改全改
#define PRICE 30
#include <stdio.h>
void main()
{
int num,total;
num=10;
total=num*PRICE;
printf("total=%d\n",total);
}
变量 :其值可以改变的量。
定义格式:数据类型 变量名;
变量应该有名字,并在内存中占据一定的存储单元。
变量名和变量值有不同的含义 变量名实为一个符号地址
#include <stdio.h>
void main()
{
int a;//a为变量
a=3;
printf("a=%d",a);
}
标识符 定义:标识变量名、符号常量名、函数名、数组名、 文件名的字符串序列——名字。
命名规则: 只能由字母、数字、下划线组成,且第一个字符必须是字母或下划线 大小写字母含义不同
3.13 整型数据
整型常量(整常数)的三种表示方法
十进制整数:由数字0~9和正负号表示. 如 123,-456,0
八进制整数:由数字0开头,后跟数字0~7表示. 如 0123,011
十六进制整数:由0x开头,后跟0~9,a~f,A~F表示. 如 0x123,0xff
注意知识点:
①内存以字节为单元组成;
②每个字节有一个地址;
③一个字节一般由8个二进制位组成;
④每个二进位的值是0或1
数值的表示方法——原码、反码和补码
原码:最高位为符号位,其余各位为数值本身的绝对值
反码: 正数:反码与原码相同 负数:符号位为1,其余位对原码取反
补码: 正数:原码、反码、补码相同 负数:最高位为1,其余位为原码取反,再对整个数加1
例 补码:11111001 取反:10000110 加1: 10000111=-7
整型变量的分类 三类整型变量
整数类型和取值范围
整型数据的溢出
此情况称为“溢出”,运行时不报错,编程时要注意
例如:
#include <stdio.h>
void main()
{
int n=0;
do{
++n;//1
}
while(n<=0); //一直加到i=32767 然后再加一 则溢出 此时i=-32768<0,就跳出循环
printf("一直加到溢出,就跳出循环");
}
#include <stdio.h>
void main( )
{
int a , b;
a= 32767;
b= a+1;
printf("%d , %d \n ",a,b);
}
整型常量的类型 整型常量的值在-32768~+32767范围内,编译器认为是int类型 整型常量的值超过上述范围,而在-2147483648 ~ +2147483647范围内,编译器认为是long类型 当系统定义short int与int占内存长度相同,则两种类型常量均可以赋给 int和short int型变量 在整型常量后面加大写L或小写l,则告诉编译器,把该整型常量作为long类型处理。例:123L、0L 在整型常量后面加u,则按无符号整型方式存放,负数转换成补码再按无符号整型方式存放。
那么上面的溢出要如何解决呢?
#include <stdio.h>
void main( )
{
int a , b;
a= 32767;
b= a+1L;//改成1L
printf("%d , %ld \n ",a,b); //改成%ld
}
运行结果:32767,32768
3.1.4 浮点型数据
浮点型常量的表示方法
浮点数(float)又称为实数(real)
两种表示方法:
①十进制小数形式:必须有小数点
如 0.123 、.123 、123.0 、0.0 、123.
②指数形式:e或E之前后必须有数字;指数必须为整数 (考试易错点)
如 123.456e0、12.3456e1 、1.23456e2 、 0.123456e3 、0.0123456e4 等
规范化指数形式 只有一位非零整数的指数形式 是指数的输出形式
浮点型变量 浮点型数据在内存中的存放形式 浮点型数据在内存中占4个字节(32位) 在内存中分成3部分,指数为2的幂次
浮点型变量的分类
float x,y; (指定x、y为单精度浮点型变量)
double z; (指定z为双精度浮点型变量)
long double t; (指定t为长双精度浮点型变量)
注意:浮点型常量一般按双精度64位处理,数后加F或f按单精度; 浮点型常量不分float和double。
3.1.5 字符型数据
字符常量
定义:用单引号括起来的单个字符或转义字符
字符常量的值:该字符的ASCII码值
定义格式:char 变量名 = 值
转义字符:反斜线后面跟一个字符或一个代码值表示
字符变量
①存放字符常量,占用一个字节,存放一个字符
②定义形式:
char c1,c2;
c1='a';c2='b';
字符数据在内存中的存储形式及其使用方法
①以二进制存放字符的ASCII码值(0~255整数)
②与整数的存储形式类似 以字符或整数形式输出
//向字符变量赋整数
#include <stdio.h>
void main( )
{ char c1,c2 ;
c1=97 ;
c2=98 ;
printf(“%c %c \n",c1,c2);
printf(“%d %d \n",c1,c2);
}
//格式符为“%c”时输出的变量值为字符
//格式符为“%d"时输出的变量值为整数
a的ASCII为97,A的ASCII为65
字符串常量
定义:用双引号(“ ”)括起来的字符序列 “How do you do” , “CHINA” , “a” , “$123.45”
存储:每个字符串尾自动加一个 ‘\0’ 作为字符串结束标志
注意:没有字符串变量, 只能用字符数组存放
例如:
#include <stdio.h>
void main()
{
//字符串数组存储,然后用%s输出字符串
char str[]="hello world!";
printf("%s\n",str);
}
3.1.6 变量赋初值
变量的使用:先定义,后使用
变量定义位置:一般放在函数开头 变量初始化:可以在定义时赋初值
这种定义方式是错误的:int a=b=c=3;
正确定义方式:
int a,b,c;
a=b=c=3;
3.1.7 各类数值型数据间的混合运算
整型、实型、字符型数据间可以混合运算
自动转换 什么情况下发生 运算转换------不同类型数据混合运算时
赋值转换------把一个值赋给与其类型不同的变量时
输出转换------输出时转换成指定的输出格式
函数调用转换------实参与形参类型不一致时转换
运算转换规则:不同类型数据运算时先自动转换成同一类型
强制转换(见P56强制类型转换运算符部分)
一般形式:(类型名)(表达式)
例:(int)(x+y) (int)x+y (double)(3/2) (int)3.6
说明:强制转换得到 所需类型的中间变量, 原变量类型不变
3.1.8 算术运算符和算术表达式
基本算术运算符: + - * / % 结合方向:从左向右
说明:
① “-”可为单目运算符时,右结合性
②两整数相除,结果为整数
③%要求两侧均为整型数据
④+ - * / 运算的两个数中有一个数为实数,结果是double型
自增、自减运算符++ --
作用:使变量值加1或减1 种类:
前置 ++i, --i (先执行i+1或i-1,再使用i值)
后置 i++,i-- (先使用i值,再执行i+1或i-1)
注意:
①++ -- 不能用于常量和表达式,如 5++,(a+b)++
②++ -- 结合方向: 自右向左
优先级:-- ++ -- ------>* / % ----->+ -
(2) (3) (4)
③该运算符常用于循环语句中,使循环变量加减1
i先与++又结合,然后与-号结合,所以i=-3
3.1.9 赋值运算符和赋值表达式
简单赋值运算符
①符号: =
②格式: 变量标识符=表达式
③作用:将一个数据(常量或表达式)赋给一个变量 左侧必须是变量,不能是常量或表达式
类型转换
赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型
赋值表达式 形式:<变量> <赋值运算符> <表达式> 赋值表达式的值与变量值相等,且可嵌套
3.1.10 逗号运算符和逗号表达式
①形式:表达式1,表达式2,……表达式n
②结合性:从左向右
③优先级: 15,级别最低
④逗号表达式的值:等于表达式n的值
⑤用途:常用于循环for语句中
3.2 C语句
C程序结构:
①一个C程序可以由多个源程序文件构成
②一个源程序文件由若干函数、预编译命令及全局变量声明部分构成
③函数包括数据定义部分和执行部分,执行部分是C语言语句,完成对数据的操作
复合语句: 用 {…}括起来的一组语句,也称作程序块。 一般形式:
3.2.2 赋值语句
基本格式: 赋值表达式 + ;
赋值表达式可以包含在其它表达式中,而赋值语句不可以。
连续的赋值语句
3.3 数据输入输出的概念及在C语言中的实现
①C语言本身没有I/O语句,所有I/O都由函数来实现。
②常用头文件: stdio.h 定义输入输出函数
string.h 定义字符串操作函数
math.h 定义sin、cos等数学函数
Turbo C 2.0可以不加#include命令
③C语言的标准库函数
由编译系统提供的一系列函数,以库形式存放在系统中,不是C语言文本的组成部分。 库函数已编译成目标文件(.obj),在连接阶段才与源程序编译成的目标文件相连接,生成可执行文件。 调用形式: 函数名(参数表) 注意在调用C语言库函数时,需要使用编译预处理命令#include <相关的头文件>,使相应的头文件包含到用户源程序中。
④标准输入输出函数
putchar 输出字符, scanf 格式输入,puts 输出字符串 getchar 输入字符, printf 格式输出,gets 输入字符串
3.3.1 字符数据的输入输出 putchar 函数(单字符输出函数)
格式: putchar( ‘字符’);或 putchar( 字符变量); 强调:被输出的单个字符必须被‘ ’括起。
#include <stdio.h>
void main()
{ char a,b,c;
a='B'; b=‘O'; c=‘Y';
putchar(a); putchar(b); putchar(c);
}
getchar 函数(单字符输入函数) 。
格式: getchar( ) ; 强调:输入单个字符后,必须按一次回车,计算机才接受输入的字符。
#include <stdio.h>
void main()
{ char c;
c=getchar( );
putchar(c);
}
3.3.2 格式输入与输出 printf函数(格式输出函数) printf函数的一般格式
格式: printf( 格式控制,输出表列);
格式控制:用双引号括起来的字符串,包含两种信息
格式说明:%[修饰符]格式字符,指定输出格式 普通字符:原样输出 输出表列:要输出的数据,可以是变量或表达式,可以没有,多个时以“,”分隔)
注意:调用 printf( ) 时可以省略# include 命令!
格式字符 d格式符:输出十进制整数,有3种用法 %d格式:按数据实际长度输出,数据范围 -32768~32767
%md格式:m指定输出字段的宽度 数据位数小于m,左端补空格,反之按实际输出。
%ld格式:输出长整型数据 可以用%mld格式指定输出列宽
o格式符:八进制输出整数 是将内存中的二进制位整个按八进制输出,所以输出值没有符号。 可以指定输出宽度%mo,长整型可以用%lo格式输出。
x格式符:十六进制输出整数 同o格式符,无符号,即无负十六进制数。 可以指定输出宽度%mx ,长整型可以用%lx格式输出。
u格式符:十进制输出unsigned型数据 int型可以用%u格式输出,unsigned型也可以用%d、%o和%x格式输出。
c格式符:输出一个字符 值在0~255的整数,可以用%c形式输出为字符
s格式符:输出一个字符串 有%s,%ms,% -ms,%m.ns,% -m.ns五种用法
f格式符:输出实数 %f格式:整数部分全部输出,小数6位。可以有非有效数字输出,因为单精度有效位7位,双精度16位。 %m.nf格式:占m列,其中n位小数,左补空格。 % -m.nf格式:右补空格
e格式符:指数形式输出实数 %e格式:不指定m和n,小数6位,指数部分共5位。其中e和指数符号各1位,指数值3位。 %m.ne和% -m.ne格式:m、n、-的含义同前面。没有n时,自动=6
g格式符:输出实数 可以自动根据数值大小选择 f 或 e 格式(选列少的) 不输出无意义的零
scanf 函数(格式输入函数)
一般形式
功能:按指定格式从键盘读入数据,存入地址表指定的存储 单元中,并按回车键结束
格式控制:含义同printf函数
地址表列:变量地址或字符串地址,地址间“,”分隔。
强调:地址列表中每一项必须以取地址运算符&开头。
输入分隔符的指定 一般以空格、TAB或回车键作为分隔符
输入数据时,遇非法输入则认为数据结束 其它字符做分隔符:格式串中两个格式符间有其它字符,则输入时对应位置也要有相同的字符。
3.4 顺序结构程序举例
输入三角形边长,求面积
#include <math.h>
#include <stdio.h>
void main()
{ float a,b,c,s,area;
scanf("%f,%f,%f",&a,&b,&c);
s=1.0/2*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("a=%7.2f, b=%7.2f, c=%7.2f, s=%7.2f\n",a,b,c,s);
printf("area=%7.2f\n",area);
}
从键盘输入大写字母,用小写字母输出
#include "stdio.h"
void main()
{ char c1,c2;
c1=getchar();
printf("%c,%d\n",c1,c1);
c2=c1+32;
printf("%c,%d\n",c2,c2);
}
求ax^2+bx+c的根,设b^2-4*a*c>0
#include <stdio.h>
#include <math.h>
void main()
{ float a,b,c,disc,x1,x2,p,q;
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
disc=b*b-4*a*c;
p=-b/(2*a); q=sqrt(disc)/(2*a);
x1=p+q; x2=p-q;
printf("\n\nx1=%5.2f\nx2=%5.2f\n",x1,x2);
}
精选练习题:
1.使用条件表达式可以构成各种各样的两路选择结构。(两路或多路)
A.对 B.错
2.在switch语句中,每一个case后的常量表达式的值不能相同,因为选择结构中只允许一个分支所对应的语句组被执行。
A.对 B.错
3.在执行switch选择结构时,从匹配表达式的相应case处入口,一直执行到break语句或到达switch的末尾为止
A.对 B.错
4.条件运算符“? :”是C语言中唯一的一个三目运算符,该运算符可以嵌套使用。
A.对 B.错
5.在C语言中,逻辑运算符的优先级高于算术运算符和关系运算符。
A.对 B.错
6.以下运算符中优先级最高的运算符为______。
A.! B.&& C.!= D.%
7.执行以下程序后,输出的结果是______。
include "stdio.h"
main()
{ int w=4,x=3,y=2,z=1;
printf("%d\n",(w<x?w:z<y?z:x)); }
A.4 B.2 C.1 D.3
8.下面程序段的输出结果是______。
int a=-1,b=4,k;
k=(a++<=0)&&(!b--<=0);
//a=0 b=3 k=1
printf("%d,%d,%d",k,a,b);
A.0,0,3 B.0,1,2
C.1,0,3 D.1,1,2
9.若有定义:float x=1.5;int a=1,b=3,c=2; ,则正确的switch语句是___C___。
A.switch(x)//()里为整型,字符,枚举 B.switch(int(x));
{ case 1.0: printf("*\n"); { case 1: printf("*\n");
case 2.0: printf("**\n"); case 2: printf("**\n");
} }
C.switch(a+b) D.switch(a+b)
{ case 1: printf("*\n"); { case 1: printf("*\n");
case 2+1: printf("**\n"); case c: printf("**\n");(error!只能是一个常量)
}
10.下列程序的输出结果是_______。
#inlude <stdio.h>
main()
{ int a=0,b=0,c=0;
if(++a>0||++b>0) ++c; //短路运算,++b未作运算。
printf("%d,%d,%d",a,b,c); }
A.0,0,0 B.1,1, C.1,0,1 D. 0,1,1
11.下列程序的输出结果是_______。
#inlude <stdio.h>
main()
{ int i=1,j=2,k=3;
if(i++==1&&(++j= =3||k++==3)) //短路运算,k=k+3 未作运算。
printf("%d %d %d",i,j,k); }
A.1 2 3 B.2 3 4 C.2 2 3 D. 2 3 3
12.以下程序运行时,若从键盘输入9,则输出结果是_______。
#inlude <stdio.h>
main()
{ int a=1;
scanf("%d",&a);
if(a++<9)
printf("%d\n",a);
else
printf("%d\n",a); }
A.10 B.11 C.9 D.8
13.若变量c的值为非0,则能正确地将c的值赋给变量a和b的表达式是_______。
A.(a=c)||(b=c) B.(b=a)=c
C.(a=c) && (b=c) D.a=c=b
14.设有定义int i;,则表达式(i=1,i=10)? i++||++i:++i的值是_______。
A.10 B.1 C.2 D.3
注意:
(⊙_⊙;)
#include <stdio.h>
void main()
{
int number,sum=0;
read_loop: scanf("%d",&number);
if(!number) goto print_sum;
sum+=number;
goto read_loop;
print_sum: printf("The total sum is %d\n",sum);
}
#include <stdio.h>
main()
{ int i,c;
for(i=0;(c=getchar())!='\n';i+=c)//cmd里面输入AAA,得到65 130 195
printf("%d ",i+c);
}
斐波那契
#include <stdio.h>
#include <conio.h>
void main()
{ long int f1,f2;
int i;
f1=1; f2=1;
for(i=1;i<=20;i++)
{ printf("%12ld %12ld ",f1,f2);
if(i%2==0) printf("\n");
f1=f1+f2;
f2=f2+f1; }
}
#include <stdio.h>
void main()
{
int a=3,b=5,c=7;
if(a>b) a=b;c=a;
if(c!=a) c=b;
printf("%d, %d, %d\n",a,b,c);
}
//important!!!!!!!!!!
/*
#include <stdio.h>
void main()
{
int a=3;
int b;
b = !a--;
printf("%d\n",b);//0
printf("%d\n",a);//2
int c=0;
int d;
d = !c--;
printf("%d\n",d);//1 先算非!c
printf("%d\n",c);//-1
int e=1;
int f;
f = !e--;
printf("%d\n",f);//0
printf("%d\n",e);//0
}*/
/*
#include <stdio.h>
void main()
{
int a=3;
int b;
b = !--a;
printf("%d\n",b);//0
printf("%d\n",a);//2
int c=0;
int d;
d = !--c;
printf("%d\n",d);//0 先算--c
printf("%d\n",c);//-1
int e=1;
int f;
f = !--e;
printf("%d\n",f);//1 先算--e
printf("%d\n",e);//0
}*/
#include <stdio.h>
void main(){
int a=1,b=2,c=3;
printf("%d\n",'0'-48);//'0'=48
printf("%d\n",a+b-c);
printf("%d",a+b-c!='0'-48);//0!=0(error)
}
#include <stdio.h>
void main()
{
//int i;
//printf("%d\n",(i=1,i=10)? i++||++i:++i);
//printf("%d\n",i);
//注意作用域
int i;
i=-1;while(i<10) i+=2;i++;
printf("%d\n",i);//1:i=1 2:i=3 3:i=5 4:i=7 5:i=9 6:i=11 i=12
}
本文笔记来自C程序设计谭浩强PPT,我是热爱学习的呵呵哒!
如果您觉得写得不错,点个赞呀~