轻松学习C语言 第三章

本章学习内容:

①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,我是热爱学习的呵呵哒!

如果您觉得写得不错,点个赞呀~

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/weixin_41987016/article/details/105818945