C语言程序设计教程(第2版) 全套课件 郭伟青 第1-11章 概述、C语言的数据类型-文件的使用_第1页
C语言程序设计教程(第2版) 全套课件 郭伟青 第1-11章 概述、C语言的数据类型-文件的使用_第2页
C语言程序设计教程(第2版) 全套课件 郭伟青 第1-11章 概述、C语言的数据类型-文件的使用_第3页
C语言程序设计教程(第2版) 全套课件 郭伟青 第1-11章 概述、C语言的数据类型-文件的使用_第4页
C语言程序设计教程(第2版) 全套课件 郭伟青 第1-11章 概述、C语言的数据类型-文件的使用_第5页
已阅读5页,还剩512页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1C程序设计

2一、源程序和计算机语言介绍1、基本概念计算机源程序:用计算机语言设计的程序代码计算机语言:计算机系统所能接受、理解和执行的语言(低级语言和高级语言)

32、计算机语言分类1)低级语言机器语言例:0110000010000001(加法)0100000001000010(减法)汇编语言2)高级语言(面向对象、面向过程)如:Basic、Fortran、Pascal、VB、C语言、C++、Java等43.C语言产生的背景1)以前的操作系统等系统软件主要由汇编语言编写2)汇编语言的特点:依赖于硬件、程序的可读性和可移植性较差、可直接对硬件进行操作54.C语言的发展过程ALGOL60:1960年出现的,是一种面向问题的高级语言,离硬件较远,不宜用来编写系统程序CPL语言:较ALGOL60接近硬件,但难以实现BCPL语言:英国剑桥大学的MatinRichards对CPL作了简化B语言:1970年美国贝尔实验室KenThompsonC语言:于1972年至1973年间诞生于美国贝尔实验室,由Denis

M.

Ritchie创建

该语言既简单又接近硬件,并用它编写了第一个UNIX操作系统67二、C语言的特点

C语言简洁紧凑C语言介于汇编语言与高级语言之间C语言是一种结构化语言C语言有丰富的数据类型C语言有丰富的运算符C语言具有较高的移植性灵活性8三、简单的C程序实例例1

在屏幕上输出如下内容:

Hello,Everyone

程序如下:

#include<stdio.h>voidmain(){printf("Hello,Everyone\n");

}

编译预处理

主函数语句9

#include<iostream>usingnamespacestd;intmain(){cout<<"Hello,Everyone”<<endl;

return0;}

10

#include<cstdio>voidmain(){printf("Hello,Everyone\n“);

}

11例2一个简单的加法计算程序,求两个整数的和。

12例3

输入三个数,求其中的最大数

#include<stdio.h>floatmax(floatx,floaty)

{floatm; /*定义变量m*/if(x>y)

m=x;elsem=y;returnm; /*返回m的值*/

}13voidmain(){floata,b,c,t,maxdata;printf("请输入三个数:\n");scanf(“%f%f%f",&a,&b,&c);t=max(a,b);

/*调用函数max,求a、b两较大者*/

maxdata=max(t,c);

/*调用函数max,求t、c两较大者*/

printf(“最大数:%f\n”,maxdata);

/*输出maxdata*/

}14四、C程序的结构1.注释注释不是程序部分,在程序执行时不起任何作用,其作用是增加程序可读性。C语言的两种注释方法:/*

注释内容*/,适用于注释多行,“/*”和“*/”之间的内容即为注释。//

注释内容,适用于注释单行,“//”后面的部分(行)即为注释。注释可以是任何可显示字符152.编译预处理以“#”号开头的命令行如:#include<stdio.h>命令的作用是将“stdio.h”头文件,嵌入到源程序中不同的编译预处理命令完成不同功能

163.函数源程序由1个main函数与n(n0)个自定义函数组成C程序执行时,总是从主函数main开始,与

main函数在整个程序中的位置无关函数书写格式

函数类型函数名(参数){类型声明语句执行语句部分}1、实现C++程序执行的步骤五、

C程序的执行步骤

编辑链接编译执行程序代码的录入,生成源程序*.cpp语法分析查错,翻译生成目标程序*.obj与其它目标程序或库文件链接,生成可执行程序*.exe182、C程序的书写格式

一般每行写一条语句。虽然一行可写多条语句,但降低可读性,且给调试程序带来不方便。在使用语句的花括号“{}”时,尽可能采用左右花括号各占一行,且上、下对齐,便于检查花括号的匹配性。

整个程序采用递缩格式书写。在程序中对关键语句做适当的注释,以提高程序的可读性。19(1)什么是源程序(2)C程序的特点(3)C程序的基本结构(4)完成一个C程序需要经过哪些步骤本章要点一常量与变量

常量:在程序执行过程中,其值不能被改变。五种常量:1.整型常量2.实型常量

3.字符常量4.字符串常量

5.符号常量

1.整型常量(三种形式)1)十进制整型常量,首位数字不能是0123,-56,0,-19,而0123则不是20第二章C语言的数据类型

2)八进制整常量,首位数字必须是00123即十进制的83

十六进制整常量,首位有效数字前必须前缀0x0x123即十进制的291

-0x56即十进制的-86

0x1a即十进制的26注:1.整型常量后加u或U表示无符号整型常量

2.整型常量后加L或l表示long类型常量212.实型常量(又称浮点数)

表示方法1)十进制小数形式0.123,98.78,123.0.02)指数形式

注意:E或e前必须有数字,后跟整数1e3,(1*103=1000)142e-3(142*10-3=0.142)2.3E2(2.3*102=230)22

类型1)double类型实常量在VC++6.0中,实常量均为double类型。以64位,即8个字节存放,有效位数为16位2)float类型实常量以32位,即4个字节存放,有效位数为6。实常量加f后缀则为float

如:3.1415f233.字符常量

1).字符常量:用单引号括起来的一个字符,如:‘a’,‘n’,‘!’,‘Q’,‘6’2).对于换行、跳格、退格等不可显示字符,C以转义符表示,见表3.1所示(P40)

3).转义符表示的是一个字符常量例:字符串“\t\Name\\address\n”的长度为15

24例1:#include<stdio.h>

voidmain(){printf("%c%c",'a','n');printf("%c%c",'a','\n');}25例2

输入一个字符,输出该字符的字形及其ASCII值。

#include<stdio.h>voidmain(){charch;scanf(“%c”,&ch);printf(“%c的ASCII值为%d\n”,ch,ch);}264.字符串常量:用双引号括起来的一个字符序列。如:“p”,“gggg”,”7yy8”,”改革”,“杭州市”

注意:字符串常量与字符常量的区别例:C被指定为字符变量:

charc;c=‘a’;是正确的。而

c=“a”;是错误的275.符号常量

符号常量:在程序中指定用符号名代表一个常量

用编译预处理语句声明符号常量例1

#definePRICE30#include<stdio.h>voidmain()

{

intnum,total;

num=10;

total=num*PRICE;

printf(“total=%d”,total);

}

28例2输入一个半径值,求圆周长和圆面积#include<stdio.h>#definePI3.14159voidmain(){floatr,k,s;scanf("%f",&r);k=2*PI*r;s=PI*r*r;printf("圆周长:%.2f圆面积:%.2f\n",k,s);}

29变量在程序的执行过程中,其值可以改变的量,有自己的名称及确定的数据类型。1.变量定义变量定义的作用是:①为变量指定一个名称及其数据类型,让系统为它分配相应的存储空间;②

确定相应变量的存储方式、数值范围和有效位数;③确定相应变量所允许进行的操作

30变量定义的一般形式:类型标识符变量名列表;例如:

inta,b,c;unsignedintx,y,z;定义x、y、z为无符号

int类型变量。变量名列表是用逗号隔开的若干个变量名,同类型的变量定义可在同一语句中。其中变量名的取名按标识符的命名规则。312.变量赋初值若在定义语句中将某个变量名写作“变量名=表达式”的形式,则在定义变量的同时对变量初始化例如:intx,sum=0;doublepi=3.14159,area;charc1='#',c2;如果几个同类型变量的初值是相同的,要分开赋值。例如:“inta=1,b=1,c=1;”(正确)

不能写成“inta=b=c=1;”。【注意】一般变量定义后未初始化,其初值不确定,不能直接使用。例如:inta;printf("%d\n",a);执行后结果是不确定的32二.字符集与标识符

1.C语言的字符集在C源程序中,用到的字符集有大、小写字母、数字、其他符号等。其他符号:+-*/%<>=^~|&!#’",.:;()[]{}_(下划线)?\空格332.标识符标识符是一个名字,由编程者指定或系统指定,它是给程序中的实体——变量、符号常量、函数、数组、结构体以及文件所起的名字

(1)系统指定的标识符称为保留字或关键字,关键字有特定的含义,用户不能再将它当作一般标识符使用(2)用户指定的标识符是以字母或下划线开头,由字母、数字、下划线组成的字符序列。如:NAME、_sum、max、i12、j_3、x1ab2、z2003_5是合法标识符。如:NUM1、3sum、double、usa$a5是非法标识符。34(3)C语言对标识符的长度无规定,为了提高程序的通用性,建议标识符的字符数不超过7个字符。在定义标识符时,建议遵循以下原则:①尽量做到“见名知义”,以增加程序的可读性。如:用sum存放累加和、用score存放成绩等。②C语言对标识符中大、小写字母是有区分的如:AB、Ab、aB、ab各不相同。通常将变量名、函数名用小写字母标识,而符号常量用大写字母标识。35三数据类型

36整型1.整型数据的长度、类型标识符与数值范围见表3.22.整型数据中,按数据是否带符号,又分为有符号整数和无符号(unsigned)整数3.整数在计算机内部是用该数的二进制补码形式存放4.C语言提供了一个测定数据类型所占存储空间长度的运算符“sizeof”,它的格式为:

sizeof(类型标识符)或sizeof(变量名)例如:sizeof(int),sizeof(long)可以分别计算出系统的int类型及long类型所占的存储空间字节数

37数值的表示方法——原码、反码和补码原码:最高位为符号位,其余各位为数值本身的绝对值反码:正数:反码与原码相同负数:符号位为1,其余位对原码取反补码:正数:原码、反码、补码相同负数:最高位为1,其余位为原码取反,再对整个数加138实型实型数据在内存中的存放形式占4或8个字节,在内存中以指数形式存放实型变量的分类

float

32bit,取值范围3.4*10-38---3.4*1038

6位有效数字

double

64bit,取值范围1.7*10-308---1.7*10308

16位有效数字例:floata;a=11111.111

(最后两位小数不起作用)

39字符型(char)数据字符类型的数据在内存中以相应的ASCII码存放一个字节存储一个字符例:字符‘A’的ASCII码为65,在内存中以:01000001形式存放以ASCII码参加运算,处理方法与整数相同如:表达式“32+‘A’”的结果为9740四数据的输入/输出1.格式输出函数printf

格式:printf(格式控制字符串,表达式列表)功能:按照格式控制字符串所给定的输出格式,把各表达式的值在显示器上输出例如:printf("a=%d,x=%f\n",a,x)41格式控制字符串由格式说明符和其他字符组成,基本规则为:1.遇格式说明符(以“%”开头,格式说明字符结尾)则以此格式输出列表中对应表达式的值2.遇非格式说明符则原样输出(若要输出一个“%”字符,在字符串中要用“%%”表示)格式说明符的作用:将对应的数据转换为指定的格式输出,其作用如表3-2所示。在格式说明符中,%与格式说明字符之间可以加可选的附加说明符,见表3-3。

421)整型数据的输出①格式符%d或%i输出带符号的十进制整数例如:inta=10,b=20;printf("a=%d,b=%i\n",a,b);输出结果为:a=10,b=20分析:在格式控制字符串中如有除格式说明符以外的其他字符,则会原样输出这些字符,它们改进了输出效果,提高输出结果的易理解性。43例1

输入一个整数,表示时间秒数,转换成时间格式hh:mm:ss格式输出。

#include<stdio.h>voidmain(){intt,h,m,s;

scanf(“%d”,&t);h=t/3600;//小时数,1小时合3600秒m=(t-h*3600)/60;//分钟数,1分钟合60秒s=t-h*3600-m*60;//秒数printf("%02d:%02d:%02d\n",h,m,s);//表示输出数据各占2列,不足左边补0}44程序执行:10000↙02:46:05③指定宽度输出。格式符%md、%mo、%mx、%mu均可指定输出数据的宽度(列数)

m(正整数)小于实际宽度时不起作用

m大于实际宽度时结果右对齐输出,左边补空格。

m前加负号则在域宽内左对齐输出,右边补空格。45例3#include<stdio.h>voidmain(){ inta=12345;

printf("a=%d#\n",a); printf("a=%4d#\n",a); printf("a=%8d#\n",a); printf("a=%-8d#\n",a);}46(2)字符、字符串的输出格式符%c输出一个字符例4字符的输出。#include<stdio.h>voidmain(){charc='a';intb=97;printf("%c,%d\n",c,c);printf("%c,%d\n",b,b);printf("%c,%d\n",c+1,c+1); //计算c+1的值为98,即bprintf("%c,%d\n",c-32,c-32);//将小写字母转换为大写字母}

47程序执行:a,97a,97b,98A,65②格式符%s输出字符串。例如:printf("%s%s\n","Windows","XP");输出结果为:WindowsXP48(3)实型数据的输出(%f、%e或%E)①float、double类型数据都可以用相同的格式符格式符%f使得输出结果保留6位小数

(不足6位后面补0,超过6位在第七位四舍五入)49②用格式符%m.nf、%.nf输出实型数据m、n为正整数,m为输出数据所占列数(小数点及符号位各占一列),n为输出小数点后面的位数m大于实际宽度时,左边补空格至m位,m前有负号则右边补空格至m位m小于实际数据输出宽度时自动失效格式符%.nf表示不规定域宽,只设定输出小数位数。50例5单、双精度实型数据的输出。#include<stdio.h>voidmain(){floatf=314.15;doubled=3.1415926;printf("f=%f,f=%e\n",f,f);printf("d=%f,d=%e\n",d,d);printf("d=%6.3f,d=%6.2f,d=%.3f\n",d,d,d);}51程序执行:f=314.149994,f=3.141500e+002d=3.141593,d=3.141593e+000d=3.142,d=3.14,d=3.1422.格式输入函数scanf格式:scanf(格式控制字符串,地址列表)如:scanf(“%d%f”,&a,&b);功能:按照格式控制字符串所给定的输入格式,把输入数据按地址列表存入指定的存储单元说明:“格式控制字符串”的含义与printf函数相似;“地址列表”是由若干个地址组成的列表,可以是变量的地址、数组的首地址、数组元素的地址52(1)格式控制字符串基本规则:

1.遇非格式说明符则必须原样输入,与之抵消例1:以hh:mm:ss形式输入当前时间,输出合时间秒数

#include<stdio.h>voidmain(){intt,h,m,s;scanf(“%d:%d:%d”,&h,&m,&s);//输入时间

t=h*3600+m*60+s;//计算合时间秒数

printf("%d\n",t);}53程序执行1:8:10:12↙29412程序执行2:81012↙-8589647082.遇格式说明符则以此格式输入数据存放到地址列表中对应的变量内存单元中。注:scanf函数可以使用的格式说明符和作用如表3-4所示,在%与格式字符之间也可以有附加说明符,如表3-5所示。54①格式说明符:

1)输入单个字符用格式符%c,输入字符串,用格式符%s。

2)输入各类整型数据,用格式符%d、%i、%o、%x、%u。3)输入不同字长的整型数据时,格式符中应当加入长度修饰符,如%hd、%ld分别用于short、long类型数据的输入。

4)输入float类型数据,用格式符%f;输入double类型数据,必须用格式符%lf55例2:

整型数据的输入。

#include<stdio.h>voidmain(){inta,b;

scanf(“%d%x”,&a,&b);//分别以十进制、十六进制形式输入a、bprintf("a=%d,b=%d\n",a,b);}56程序执行1:2727↙a=27,b=39程序执行2:27,27↙a=27,b=-858993460

例3字符型数据的输入

#include<stdio.h>voidmain(){charc1,c2,c3;

scanf(“%c%c%c”,&c1,&c2,&c3);printf("%c,%c,%c\n",c1,c2,c3);}注意:输入多个字符时,不需加间隔符57程序执行1:abc↙a,b,c程序执行2:abc↙a,,b(4)输入项之间的分隔符

scanf函数从缓冲区中读取数据时,数据与数据之间必须有分隔符,确定哪些信息作为一个数据项。C确定一个数据项的结束,有下列几种方法:①数值类型数据可用空格、换行符(’\n’)、制表键Tab(’\t’)作分隔符。②与对应的格式说明项不匹配或已到规定宽度。58例输入项之间的分隔符

#include<stdio.h>voidmain(){inta,b,c;printf(“inputabc\n”);scanf("%d%d%d",&a,&b,&c);printf(“a=%d,b=%d,c=%d\n”,a,b,c);printf(“inputa,b,c\n”);scanf("%d,%d,%d",&a,&b,&c);printf(“a=%d,b=%d,c=%d\n”,a,b,c);printf(“inputa=b=c=\n”);scanf("a=%db=%dc=%d",&a,&b,&c);printf(“a=%d,b=%d,c=%d\n”,a,b,c);}593字符数据的输入/输出

1).字符输出函数(putchar)格式:putchar(x)功能:向标准输出设备(一般是屏幕)输出一个字符x说明:输出的x可以是字符常量(包括转义字符)、变量或表达式,还可以是整型数据。例如:

#include<stdio.h>

voidmain()

{charc=‘A’;putchar(c);//输出’A’

putchar(‘A’);

putchar(’\n’);

putchar(’\101’);

putchar(65);}

60

例:#include<stdio.h>voidmain(){charc1,c2,c3;c1=getchar();

c2=getchar();c3=getchar();

putchar(c1);putchar(c2);putchar(c3);

}612).字符输入函数(getchar)格式:c=getchar()功能:从标准输入设备(一般是键盘)读取一个字符。例:

#include<stdio.h>voidmain(){

charc;c=getchar();putchar(c);}

62第三章常用运算符、表达式和库函数C语言中有以下算术运算符(按运算级别高低排列):单目运算符:–(取负)、++(自增)、--(自减)双目运算符:有两个运算对象的运算符*(乘)、/(除)、%(求余)

+(加)、–(减)【说明】“+”、“–”只有一个运算对象时也是单目运算符,其优先级高于双目算术运算符,如表达式“5*–3”的值为–15。+、–、*、/与数学中运算相似,先乘除后加减,结合性均为从左到右。注意/(除法)运算符的运算对象若都是整型数据时,结果也是整数,舍去小数部分。例如:1.0/2为0.5,1/2为0,9/5为1,–9/5为–1通过运算符“/”的整除特性,我们可以对整型量作一些特殊的有效处理例如:若整型变量k是一个三位数,求k的百位上的数,可以写作“k/100”,如k=123,则“k/100”为1,即求得了k百位上的数字字符类型的数据是以该字符的ASCII码值参加运算。例如:’a’+2为99,’5’–’0’为5取余运算符“%”是求整数除法的余数,余数符号与左边的运算对象符号相同,不能用于实型数据的运算例如:2%3为2,4%2为0,’a’%6为1,

–9%5为–4,9%–5为4。例如:“intk=12345;”,求k的十位上的数字,可以写作“k%100/10”,“k%100”得45,“45/10”得4即为变量k十位上的数字。同样,要得到k个位上的数字可写为“k%10”。强制类型转换运算符其表示形式是:(类型标识符)表达式例如:inti=5,j=2;则i/j只能做整除运算,得到整数部分2,如要保留小数部分,需做实数除法,可以写作:“(double)i/j”注意:“(double)i/j”与“(double)(i/j)”的区别,后者先完成“i/j”整除,再将结果转换成double型,即值为2.0,仍得不到真正的小数部分。例如:floatx=123.56;则“x%5”不合法,必须将x强制转换成整型,用“(int)x%5”【说明】对表达式中的变量而言,强制类型转换,仅仅是为了本次运算的需要,取得一个中间值,而不改变定义语句中对变量类型的定义。例如,计算“(double)i/j”并未改变定义为int类型的变量i为double类型例1:

强制类型转换举例(1)计算实型变量x的整数部分与y的小数部分之和写作:(int)x+(y–(int)y)(2)实型数据d保留3位小数(不四舍五入)。写作:(int)(d*1000)/1000.0(3)求整型变量k的右边第n位上的数字。写作:k/(int)pow(10,n–1)%10自增(++)、自减运算(--)作用:使变量的值增1或减1是单目运算符,优先级别比*、/、%高,结合性“从右到左”使用格式前缀格式:运算符变量后缀格式:变量运算符两种格式的区别:前缀格式中,先使变量加(减)1,再使用变量的值;后缀格式中,先使用变量的原值,再使变量加(减)1例2.

注意下列程序运行后变量x与y的区别

#include<stdio.h>voidmain(){inta=2,b=2,x,y;x=--a+2;//前缀运算

y=b--+2;//后缀运算

printf("x=%dy=%d\n”,x,y);printf("a=%db=%d\n”,a,b);}

程序运行:x=3y=4a=1b=1

赋值运算符赋值表达式:变量名=表达式功能:先计算表达式的值,再将计算结果送到变量赋值运算符的优先级比算术运算符低,结合性“从右到左”赋值语句:变量名=表达式;

例如:赋值语句“a=b=c=1;”

赋值语句“a=1+2*3.14159;”赋值时数据类型的转换在赋值语句中,左边变量和右边表达式的类型不同时,系统会自动完成类型转换,将表达式的值转换为与左边变量相同类型的数据,再赋值例如:intx=3;则表达式:x=x+1.999的值是4。例如:“doublez;”,语句“z=23;”执行后,

z的值是实数23.0复合赋值运算符:双目运算符与赋值运算符的合成或简化,主要有:

+=、–=、*=、/=、%=

(亦称自反算术赋值运算符)复合赋值运算可以简化程序,但降低了程序的可读性,且易导致错误。

例如:表达式“x*=y+5”的等效形式是

x=x*(y+5),不能理解为x=x*y+5;表达式“x/=2*y–10”的等效形式是

x=x/(2*y–10)

不能理解为x=x/2*y–10例3

赋值运算符的使用

#include<stdio.h>

voidmain()

{inta=5,b=5,c=5;

a-=2;//表示a=a-2b*=a+3;//表示b=b*(a+3)c*=a;//表示c=c*aprintf("a=%d,b=%d,c=%d\n",a,b,c);}

程序运行:a=3,b=30,c=15关系运算符

是双目运算,用于对两个运算对象间的大小比较C语言提供6个关系运算符:

>

(大于)>=

(大于或等于)<

(小于)<=

(小于或等于)==

(等于)!=(不等于)

【注意】不要误将关系运算符“==”写作“=”,一般不要对实型数据作相等或不等判断,而是利用两个数差值的绝对值与给定的一个近似于0的数比较,来判断实型数据相等或不等。例:

分析下面程序的运行结果

#include<stdio.h>voidmain(){floatx,y=0.3;y=y*11;x=3+0.3;

if(x==y)printf("ok,x=y");elseprintf("no,x!=y");}if语句的表达式应改写为fabs(x–y)<1e–5。即若|x–y|<10–5,则认为x、y相等,否则不等。运算优先级①在关系运算符中,“>、>=、<、<=”运算的优先级相同,“==、!=”运算的优先级相同,且前者高于后者。②与其他运算符比较,比算术运算符的优先级低、比赋值运算符的优先级高。关系表达式 关系表达式格式:表达式关系运算符表达式关系表达式成立,其值为1;关系表达式不成立,其值为0。例分析下面程序的运行结果。

#include<stdio.h>voidmain(){inta,b,c;scanf("%d%d%d",&a,&b,&c);a=b!=c;//第5行

printf("a=%d,b=%d,c=%d\n",a,b,c);a==(b=c++*3);//第7行

printf("a=%d,b=%d,c=%d\n",a,b,c);a=b>c>2;//第9行

printf("a=%d,b=%d,c=%d\n",a,b,c);}输入234a=1,b=3,c=4a=1,b=12,c=5a=0,b=12,c=5例

若有intx=2,y=3,z=5;,计算下列关系表达式的值(1)x%2==0表达式值是1。“x%2”值为0,再计算“0==0”结果为1(2)z=x–1>=y–2<y–x表达式值是0。先进行算术运算,得“z=1>=1<1”,根据结合性,从左到右运算,计算“1>=1”其值是1,得“z=1<1”,再计算“1<1”为0,再把0给z(3)8<5<3表达式值是1。根据运算符的结合性从左到右计算,先计算“8<5”其值为0,再计算“0<3”,值为1,表达式的值为1。逻辑运算符

1.C语言提供3个逻辑运算符!(逻辑非)&&(逻辑与)||

(逻辑或)(1)逻辑非一般形式:!表达式功能:是单目运算符,其结果为运算对象逻辑值得“反”例如:“!x”作用是判别x是否为0,x为0时,值为1,否则值为0,与“x==0”等价。(2)逻辑与一般形式:表达式&&表达式功能:若参加运算的两个表达式值均为非0,则结果为1;否则结果为0。例如:判断“c是一个大写字母”的逻辑表达式如下:“c>=’A’&&c<=’Z’”,其中“&&”用以判断两个条件“c>=’A’”和“c<=’Z’”(ASCII码值比较)是否“同时成立”。(3)逻辑或一般形式:表达式||表达式功能:若参加运算的两个表达式值均为0,则结果为0;否则结果为1。例如:判断“c是一个字母”的逻辑表达式如下:“c>=’A’&&c<=’Z’||c>=’a’&&c<=’z’”,其中“||”用以判断两个条件是否“有一个成立”。2.运算优先级(1)逻辑运算符的运算优先级,从高到低依次为:!、&&、||,各不相同。例如:判别“a小于4且|b|>3”的逻辑表达式如下:“a<4&&(b>3||b<–3)”,其中的括号用来改变表达式中各运算符的运算顺序。本例写成“a<4&&b>3||b<–3”是错误的(2)与其他运算符比较!(逻辑非)是单目运算符,与++、--优先级相同,结合性“从右到左”。其他逻辑运算符(&&、||)比关系运算符

(>

、>=

、<

、<=

、==

、!=)的优先级低,比赋值运算赋(=)的优先级高。逻辑表达式例

设“inta=2,b=3;charc=’A’;floatx=3.6,

y=–4.4”,写出下列表达式的值。(1)a>b||!(c–‘A’)&&x<y代入各变量值:0||!(0)&&0即0||1&&0亦即0||0,结果为0。(2)a–b&&!c–5||y*2<x按照各运算符的优先级加括号,改写作((a–b)&&((!c)–5))||((y*2)<x),代入各变量值后为(–1&&(0–5))||(–8.8<3.6),又可以写作“(1&&1)||1”,计算结果为1。例

根据下列条件,写出C的逻辑表达式(1)条件“长度分别为a、b、c的三条线段能够组成三角形”。

a+b>c&&a+c>b&&b+c>a(2)条件“|x|是一个两位数”。

x>=10&&x<=99||x>=–99&&x<=–10(3)条件“y年是润年”

y%4==0&&y%100!=0||y%400==0(4)条件“x、y落在圆心在(0,0)半径为1的圆外、中心点在(0,0)边长为4的矩形内:

x*x+y*y>1&&x>=–2&&x<=2&&y>=–2&&y<=2【说明】在由&&和||运算符组成的逻辑表达式中,为提高程序的执行效率,C语言规定,只对能够确定整个表达式值的最少数目的子表达式进行计算,即当计算出某个子表达式值后就可以确定整个逻辑表达式的值,后面的子表达式就不再计算了。计算“A&&B”时若A为0、计算“A||B”时若A为1,则不计算B。例分析下面程序的运行结果

#include"stdio.h"voidmain(){intx,y,z,m;x=y=z=0;m=++x&&++y||++z;printf("m=%dx=%dy=%dz=%d",m,x,y,z);}[程序说明]由于“++x&&++y”为1,表达式“++x&&++y||++z”值已完全确定,所以表达式中的“++z”被忽略。程序运行:m=1x=1y=1z=0例分析下面程序的运行结果

#include"stdio.h"voidmain(){intx,y,z,m;x=y=z=–1;m=++x&&++y||++z;printf("m=%dx=%dy=%dz=%d",m,x,y,z);}[程序说明]“++x&&++y||++z”;由于“++x”为0,表达式中的“&&++y”被忽略,因还不能得出整个表达式得结果,再计算“||++z”程序运行:m=0x=0y=-1z=0条件表达式

P601.条件运算符(?:)是C语言惟一的三目运算符条件运算符的优先级比赋值运算符高,比前面介绍的其他运算符低。条件运算符的结合性为“从右到左”。条件运算是根据某一逻辑条件,在两个表达式中取其中一个表达式值。2.条件表达式一般形式:表达式1?表达式2:表达式3条件表达式计算:先计算表达式1的值,若该值非0,则计算表达式2的值作为条件表达式值;否则计算表达式3的值作为条件表达式值。对整个条件表达式来说,表达式1起条件判别作用,根据它的值是否为0来决定执行表达式2或表达式3。例

用条件表达式计算。(1)求变量t的符号

f=t>=0?1:–1;(2)求三个变量x、y、z最大值

s=(s=x>y?x:y)>z?s:z;(3)字符变量ch若为小写字母则改为大写字母,其余字符不变

ch=(ch>=’a’&&ch<=’z’?ch+’A’–’a’:ch)(4)输出整型变量x的绝对值

(x>0)?printf("%d",x):printf("%d",–x);

或printf(“%d”,x>0?x:-x);【注意】若inta=1,b=2,c=3,d=4;表达式“a>b?a:c>d?c:d”的值为4。根据右结合性,表达式相当于“a>b?a:(c>d?c:d)”例:

下列程序输入变量a、b、c后,按值从大到小输出

#include<stdio.h>voidmain(){inta,b,c,m,n,k;scanf("%d%d%d",&a,&b,&c);m=(m=a>b?a:b)>c?m:c;//u取a、b、c中最大值

n=(n=a<b?a:b)<c?n:c;//t取a、b、c中最小值

k=a+b+c–m–n;printf("%d%d%d\n",m,k,n);}

#include<stdio.h>voidmain(){inta,b;a=8;b=7; a=(a--==b++)?a%3:a/3;printf(“a=%db=%d\n”,a,b);}#include<stdio.h>voidmain(){

intx=2,y=3;x*=y+4;

printf("%d,%d\n",x,y);

x/=y=5;printf("%d,%d\n",x,y);

x-=y%2;

printf("%d,%d\n",x,y);}#include<stdio.h>voidmain(){

unsignedk,n;

scanf("%u",&n);k=n%10*10+n/10;printf("n=%dk=%d\n",n,k);}98各种运算符的优先级。结合方向为“从右到左”的运算符有:

自增、自减(++、--)逻辑非(!)赋值(=)条件(?:)算术运算符高关系运算符逻辑运算符条件运算符赋值运算符逗号运算符低第四章结构化程序设计

顺序结构选择结构循环结构99100AB顺序结构YN条件AYN循环结构结构化程序设计的3种基本结构

选择结构条件AB一、顺序结构例1输入华氏温度,将其转换成摄氏温度输出。转换公式为:C=5/9*(F-32)

#include<stdio.h>voidmain(){floatF,C; printf("输入一个华氏温度\n");scanf("%f",&F); C=5.0/9*(F-32); printf("c=%.2f",C);}101例2输入三角形的三个边长,计算并输出三角形的面积。根据三条边的边长,计算三角形面积的公式如下:

s=(x+y+z)/2

面积=sqrt(s*(s-x)*(s-y)*(s-z))

操作步骤如下:(1)输入x、y、z(2)如果x、y、z能构成三角形,则计算面积并输出,否则转(3)(3)输出提示信息,告诉用户x、y、z不能构成三角形的三条边102#include<stdio.h>#include<math.h>voidmain(){ doublex,y,z,s,area;

printf("Thesidesofatriangle:\n"); scanf("%lf%lf%lf",&x,&y,&z);

if(x+y>z&&x+z>y&&y+z>x)

{ s=(x+y+z)/2; area=sqrt(s*(s-x)*(s-y)*(s-z)); printf(“面积为%.2f\n",area); } else printf(“无法构成三角形\n");//输出不是三角形的提示信息}

103

二、选择结构1.if结构的三种形式

1)双分支

if(表达式)

语句1;else

语句2;功能:先计算表达式值,若表达式值不为零,则执行第一个分支语句1,否则直接执行第二个分支语句2例:if(x>0)printf(“%f\n”,x);

elseprintf(“%f\n”,-x);104if语句双分支的执行流程图

105

语句1语句2表达式零非零例输入一个学生的C语言考试成绩,确定是否需重修该课,如果成绩大于等于60分输出“Pass”,否则输出“Fail”和“Youmusttakethiscourseagain.”

#include<stdio.h>voidmain(){ intgrade; printf("Pleaseinputgrade:\n"); scanf("%d",&grade); if(grade>=60) printf("Pass\n"); else

{ printf("Fail\n"); printf("Youmusttakethiscourseagain.");

}//注意不要少写一对{}}106例:编程,输入x,求下列分段函数f(x)的值。

1-x2x≤5f(x)=(x-5)1/4x>5#include<stdio.h>#include<math.h>voidmain(){doubley,x;scanf(“%lf”,&x);if(x<=5)y=1-x*x;elsey=pow(x-5,1.0/4);printf(“f(%.5f)=%.8f\n”,x,y);}1072.if语句的单分支形式if(表达式)语句;108

语句表达式零非零

图if语句单分支执行流程例:输入一个x值,求x的绝对值

#include<stdio.h>voidmain(){ doublex; printf("Pleaseinputx:\n"); scanf("%lf",&x);

if(x<0) x=-x; printf("|x|=%.2f\n",x); }109例:输入两个数存放到变量a、b中,如果a>b,把a、b变量值交换,然后输出a、b。

分析:交换a、b变量值的方法是:先把a暂存在临时变量t中,然后把b赋值给a,最后把t赋值给b。110#include<stdio.h>voidmain(){ inta,b,t;

printf("Inputa、b:\n"); scanf("%d%d",&a,&b);

if(a>b){t=a;//三条语句,实现a、b变量值交换

a=b;b=t;}printf("%d%d\n",a,b);}1113.if语句的嵌套形式(1)else—if嵌套的一般形式

if语句的else分支又是一条完整的if语句,就构成了else—if的嵌套形式。

if(表达式1)语句1elseif(表达式2)语句2

… else

if(表达式n-1)语句n-1 else

语句n功能:先计算表达式1,若表达式1的值非0,则执行语句1,整个if语句执行结束;否则,计算表达式2,……;只有当表达式1、表达式2……表达式n-1的值都为0时,执行最后else的分支语句n。执行流程如下图所示。112113非零else—if嵌套执行流程图表达式1零表达式2零零…表达式n-1语句2语句n-1语句n零…语句1非零非零例:输入一个x,计算符号函数f(x)的值。符号函数如下:

#include<stdio.h>voidmain(){inty; doublex;printf("Pleaseinputx:\n");scanf("%lf",&x);if(x>0)y=1;else if(x==0)y=0; else y=-1;printf(“f(x)=%d”,y);}114程序执行:Pleaseinputscore:8.7↙f(x)=1(2)双分支if语句嵌套的一般形式

如果if—else语句中的2个分支语句都是一条完整的if语句时,就形成双分支if语句的嵌套。if(表达式1)

if(表达式2)语句1

else

语句2else

if(表达式3)语句3

else

语句4功能:先计算表达式1,在表达式1值为非0条件下,则计算表达式2,根据其值1或0,选择语句1或语句2执行,若在表达式1值为0条件下,若根据表达式3值0或1,选择语句3执行,或语句4执行。115例:输入平面上的一个坐标点p(x,y),判断该点是在第几象限。

voidmain(){doublex,y;printf("Pleaseinputx,y:\n");scanf("%lf%lf",&x,&y);if(x>=0)if(y>=0)printf("firstquadrant\n");elseprintf("thefourthquadrant\n");elseif(y>=0)printf("thesecondquadrant\n");elseprintf("thethirdquadrant\n");}116Pleaseinputx,y:-84↙thesecondquadrant例:输入一个学生的数学成绩,根据成绩,将其转换成“Good”、“Pass”、“Fail”输出。转换规则:100-80:“Good”

79-60:“Pass”;

59-0:“Fail”117

#include<stdio.h>voidmain(){intscore;

printf("Pleaseinputscore:\n");scanf("%d",&score);

if(score>=80&&score<=100) printf("Good\n"); elseif(score>=60&&score<80) printf("Pass\n"); elseif(score>=0&&score<60) printf("Fail\n"); elseprintf("Thescoreiserror\n");}例:求一元二次方程a·x2+b·x+c=0的根#include<stdio.h>#include<math.h>voidmain(){ doublea,b,c,dalt;//a、b、c存放方程系数

doublex1,x2,real,imag; printf("Pleaseinputa、b、c:\n");

scanf("%lf%lf%lf",&a,&b,&c);if(a==0) printf(“这不是一个一元二次方程\n");//非一元二次方程118else{

dalt=b*b-4*a*c;if(dalt>=0){ x1=-b+sqrt(dalt)/(2*a); x2=-b-sqrt(dalt)/(2*a); printf("x1=%.2f\n",x1); printf("x2=%.2f\n",x2); } else{//处理虚根情况

real=-b/(2*a);//计算虚根的虚部

imag=sqrt(-dalt)/(2*a);//计算虚根的实部

printf("x1=%.2f%+.2fi\n",real,imag);//输出一个虚根

printf("x2=%.2f%+.2fi\n",real,-imag); }}} 119if嵌套语句的使用说明为了分清结构的层次、提高程序的可读性,在编辑源程序时采用递缩格式多层if结构嵌套时,由后向前使每一个else

与前面与之相距最近的if匹配if与else正确的匹配尤为重要,写程序时,若不能正确的对应,将导致程序的逻辑错误,使程序执行结果不正确。120思考题:编程序,输入x,y计算下面的函数值

f(x,y)=x2+y2x>0,y>0x2-y2x>0,y<=0x+yx<=0,y>0x-yx<=0,y<=0121#include<stdio.h>voidmain(){floatx,y,z;printf("pleaseinputx,y:\n");scanf("%f%f",&x,&y);if(x>0)if(y>0)z=x*x+y*y;elsez=x*x-y*y;elseif(y>0)z=x+y;elsez=x-y;printf("f(%.1f,%.1f)=%.1f",x,y,z);}122Switch结构switch为多分支选择结构的另一种形式123格式:

switch(表达式){case常量1:语句组1case常量2:语句组2

….….….….case常量n:语句组ndefault:语句组n+1}

124表达式语句组1语句组2语句组n语句组n+1值1值2switch语句流程default值nswitch结构使用说明1.表达式的计算结果必须为整型或字符型,值1~值n必须是整型或字符型常量2.当表达式取值为“值i”时,执行“语句组i” ,若表达式取值1~值n以外的值,则执行“语句组n+1” 3.执行“语句组i”中的语句“break;”时,控制将跳转出switch结构,执行该结构后的语句;若语句组中不存在“break;”语句,执行“语句组i”后还要顺序执行“语句组i”后的语句组 4.若表达式的值不属于值1~值n,也没有default语句,则该switch结构不起任何作用125例:输入一个n,计算1+2+3+...+n的值,n≤6。如果n超过6,值为7*n*n–3

#include<stdio.h>voidmain(){intn,y=0;printf("请输入n:\n");scanf("%d",&n);switch(n){case6:y+=6; case5:y+=5;case4:y+=4; case3:y+=3;case2:y+=2;case1:y+=1; break; default:y=7*n*n-3;}

printf("y=%d",y);}126例:银行利率查询。假设有四种银行利率分别是活期、1年期、3年期和五年期,当前这四档的银行利率分别是0.36%、2.25%、3.33%和3.6%。根据屏幕菜单项号,用户输入1、2、3或4,查询指定档利率100元到期后的本金及利息总额。菜单:1---活期2---一年期3---三年期4---五年期127#include<stdio.h>voidmain(){ intchoice; //存放选择编号

doubley; printf("1---活期\n"); //显示菜单项

printf("2---一年期\n"); printf("3---三年期\n"); printf("4---五年期\n"); printf("Pleaseinputchoice[1-4]:"); scanf("%d",&choice); //输入选项号

switch(choice){ case1:y=100*(1+0.0036*1);break; case2:y=100*(1+0.0225*1);break; case3:y=100*(1+0.0333*3);break; case4:y=100*(1+0.0360*5);break; default:printf("Sorry,yourchoiceiserror\n");

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论