C程序设计案例教程(上)156_第1页
C程序设计案例教程(上)156_第2页
C程序设计案例教程(上)156_第3页
C程序设计案例教程(上)156_第4页
C程序设计案例教程(上)156_第5页
已阅读5页,还剩151页未读 继续免费阅读

下载本文档

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

文档简介

C程序设计案例教程(上)第1章C语言概述

第2章走进C语言程序设计

第3章选择结构程序设计

第4章循环结构程序设计第1章C语言概述1.1C语言的语法1.2C语言编辑环境1.3C语言开展历史1.4用C语言求解问题的过程1.1C语言的语法

—字C语言共有92个字,其中有大写字母26个〔A~Z〕,小写字母26个(a~z)和数字10个〔0~9〕,共62个。另有特殊字30个,分七类:算术符号:+、-、*、/、%加、减、乘、除、按模取余赋值符号:=赋值关系符号:<、>小于、大于标点符号:.、,、:、;、?点、逗号、冒号、分号、问号逻辑符号:&、||、!、~、^与、或、非、取反、异或括号符号:“〞、‘’、()、[]、{}双引号、单引号、小括号、中括号、大括号特殊符号:空格、#、\、_空格、#号、反斜杠、下划线1.1C语言的语法

—词C语言的词由一个或多个字组成,词是造句的最小意义单位。按组词字的多少分为单字词与多字词。单字词是有限的,绝不多于92个。多字词一般而言是无限的,按词意和用途可分为六类词:关键字、标识符、常量、运算符、分隔符和注释符。第1类词—关键字关键字〔保存字〕,专用于标识C语言意义和用途的专用词,共32个。具体分为七类:根本数据类型5个:char、int、float、double、void修饰存储类型4个:auto、register、static、extern数据类型修饰关键字6个:signed、unsigned、short、long、const、volatile复合数据类型3个:struct、union、enum流程控制12个:break、case、continue、default、do、else、for、goto、if、switch、while、return类型定义关键字1个:typedef求数据类型长度关键字1个:sizeof标识符,它是单字词或多字词,用户用它为对象命名。命名方法即由字母或下划线打头,后跟字母、数字或下划线串。起名字要做到“见其名而知其意〞。第2类词—标识符第3类词—常量常量是在程序运行过程中,其值始终保持不变的量。它是用户在程序中写出或键盘上输入的常数。如12和12.3是数值型常量,前者是整数,后者是实数。又如'a'和"abc"是字符型常量。前者是字符常量,后者是字符串常量,分别用单引号或双引号括住。第4类词—运算符共有43个。运算符按要求运算数据的多少可分为三类:〔1〕要求一个运算对象的一目运算符,共有9个:!、~、++、--、-、〔〕、*、&、sizeof。〔2〕要求二个运算对象的二目运算符,共有33个:[]、.、->、+、-、*、/、%、<<、>>、<、<=、>、>=、==、!=、&、|、^、&&、||、=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=、,。〔3〕要求三个运算对象的三目运算符,只有1个:?:〔可别离词〕第5类词—分隔符分隔符共有5个:逗号、空格、分号、冒号和大括号。逗号用于对象表中对象间的分隔;空格用于句中词间的分隔,可以连续使用一个或多个;分号是每个语句的结束符,同时也是for语句中多个表达式的分隔符;冒号用于定义性标号出现的后面,表示语句的位置。也是定义性标号与语句的分隔符,同时还用于case语句中,作为整常数表达式或字符常量表达式与语句的分隔符。一对大括号是构造程序结构、复合句和分程序的标志。注释符是以“//〞或以“/*〞开始并以“*/〞结束的字符序列,它不是语句,既不编译也不执行。第6类词—注释符1.1C语言的语法

—词组C语言只有一个词组,即表达式。表达式是由运算符与运算对象组成的。1.1C语言的语法

—语句C语言共有24个句子,分为两类:执行语句和说明语句。1.C语言的执行语句〔共14个类型的句子〕〔1〕赋值语句<变量>=<表达式>〔2〕if条件语句if(<表达式>)<语句1>[else<语句2>]〔3〕while循环语句while(<表达式>)语句〔4〕do循环do<语句>while(<表达式>);〔5〕for循环for(表达式1;表达式;表达式3)<语句>〔6〕switch多分支语句switch(<表达式>)<语句>〔7〕case判断语句case<常数表达式>:<语句>〔8〕default缺省语句default:<语句>〔9〕break中断语句break;〔10〕continue继续语句continue;〔11〕return返回语句return;或return(表达式);〔12〕goto转移语句goto<标号>;〔13〕函数调用语句函数名〔实参表〕;〔14〕空语句所谓类型说明〔typedeclaration〕语句是告诉计算机哪些是变量名,即为变量命名。每个类型说明语句都由一个关键词来命名。共有9个关键词,它们是:〔1〕根本类型:整型int字符型char单精度型float双精度型double枚举类型enum〔2〕构造类型数组类型根本类型数组名[常量表达式]..结构体类型struct共用体类型union〔3〕指针类型文件类型FILE指针类型*〔4〕空类型void2.C语言的说明语句〔共10个类型说明语句〕全国计算机等级考试的考试大纲把C语言编辑环境由TC2.0转变到VisualC++6.0,计算机专业的多数初学者也把VisualC++6.0作为编辑环境。1.2C语言编辑环境建立并运行C程序的步骤:1.编辑程序在VisualC++6.0生成程序的源文件,C语言源文件的后缀为.c/.cp〕2.程序编译〔编译程序指出语法错误〕编辑程序后,用该语言的编译程序对其进行编译,以生成二进制代码表示的目标程序(.obj)3.连接与编程环境提供的库函数进行连接〔Link〕形成可执行的程序(.exe)。4.运行与调试经过编辑、编译、连接,生成执行文件后,就可以在编程环境或操作系统环境中运行该程序。如果程序运行所产生的结果不是你想要的结果,这是程序的语义错误〔逻辑错误〕。开始结果语法错误源程序.c/.cpp目标程序.obj可执行程序.exe编辑编译连接运行连接错误运行错误C语言程序的调试、运行步骤1.3C语言的开展历史C语言程序设计语言最早是由肯.汤普生〔KenThompson〕于1973年设计并实现的。当时,肯.汤普生与同在贝尔实验室工作的丹尼斯·里奇〔DennisRitchie〕正在研究PDP-7小型机上的UNIX操作系统。丹尼斯与汤普森是同窗好友,见图1-12,又同在贝尔实验室效力。于是,二人一起用C语言为开发工具,开发出UNIX操作系统,该系统在小型机上的快速运行,立刻引起了程序员们的广泛认可。图1-11肯.汤普生〔KenThompson〕图1-12丹尼斯·里奇〔DennisM.Ritchie〕用C语言求解问题就是程序设计,程序设计是指编写程序的全过程程序设计=算法+数据结构+计算机语言+程序设计方法+工具软件和环境+文档1.4用C语言求解问题的过程第2章走进C语言程序设计2.1在屏幕上显示WelcometoChina!2.2随机给出一道100以内的加法运算测试题2.3答复100以内的加法运算测试题2.4特色运算符和表达式2.5类型转换2.6常用数学库函数2.7C程序书写风格2.1屏幕上显示WelcometoChina!各种类型数据的输出函数printf()printf()函数的根本格式为:printf(格式控制字符串,变量名表);其中,格式控制字符串包括两种信息:格式控制说明和普通字符。格式控制说明。格式控制说明总是由“%〞字符开始,后跟格式控制字符组成,如%d、%f、%c等。它的作用是按指定的格式输出数据,但不同类型的数据采用不同的格式控制字符。见表2-1。普通字符。普通字符即需要原样输出的字符。源程序#include<stdio.h>intmain(void){inta=3,b=5;格式说明输出项表printf("a=%d,b=%d",a,b);return0;}【例2-1】输出整型变量的值。格式控制字符和变量名应该在类型、个数、顺序上保持一致。另外,在格式控制说明中,可以指定整型或实型数据的输出宽度。如%md。m为指定的输出整型数据的宽度。如果数据的位数小于m,那么左端补以空格,假设大于m,那么按实际位数输出。如%-md。m为指定的输出出整型数据的宽度。如果数据的位数小于m,那么右端补以空格,假设大于m,那么按实际位数输出。【例2-2】输出指定宽度的整型变量的值。源程序#include<stdio.h>main(){inta=123,b=12345;printf("%5d,%10d",a,b);return0;}输出结果为123,12345%m.nf。指定输出浮点型数据保存n位小数,且输出宽度是m〔包括符号位和小数点〕。假设数据的实际位数小于m,那么左端补空格,假设大于m,那么按实际位数输出。%-m.nf。指定输出浮点型数据保存n位小数,且输出宽度是m〔包括符号位和小数点〕。假设数据的实际位数小于m,那么右端补以空格,假设大于m,那么按实际位数输出。【例2-3】输出指定宽度和小数位数的浮点型变量的值。#include<stdio.h>intmain(void){floatx=12.345;/*定义变量x为单精度型,并赋初值为12.345*/doubley=123.123456789;/*定义变量y为双精度型,并赋初值12.123456789*/printf("x=%7.2f,y=%7.5f",x,y);/*输出x和y值,并且指定输出数据占7列,分别保存2位和5位小数*/return0;}输出结果为:x=12.35,y=123.12346源程序#include<stdio.h>intmain(void){printf("WelcometoChina!");return0;}在这个例子中,输出的是一串字符,即普通字符【例2-4】在屏幕上显示“WelcometoChina!〞2.1.2库函数和头文件编译系统把提供的大量的系统函数,放在了函数库(.lib)中,而把系统函数的说明放在了21个头文件中。用户用到某头文件,就用文件包含命令把他们插入到源程序中,其使用形式有两种:include<头文件名>或#include"头文件名“C语言中规定在使用scanf()和printf()这两个函数时可以省略相应的#include<stdio.h>命令。C程序是由一个或多个函数组成的程序,但必须有且仅有一个函数名为main的特殊函数,称为主函数。而除主函数和库函数外的函数均为自定义函数。当函数运行时,首先从main()函数开始执行,无论main()函数位置如何。2.1.3主函数及自定义函数一个函数是由函数的首部和函数体两局部组成的函数的第一行称为函数的首部,如intmain(void),它说明函数名、函数类型、函数参数类型及参数名称。函数名称必须后接一对圆括号,即使是对于没有参数的函数,也不能省略这对圆括号。首部之后被包括在一对花括号中的局部,称为函数体,即{printf("WelcometoChina!");return0;}1.主函数或自定义函数的组成2.C程序先从main()函数开始执行无论main()函数在程序中的位置如何,一个C程序总是从main()函数开始执行,当main()函数的最后一行被执行完或遇到return语句执行完,程序结束。main()函数的最后一条语句通常是return0;它的作用是结束main()函数的运行,并向系统返回一个整数0,作为程序的结束状态。3.return

语句4.语句一个函数的函数体中通常包括多条语句,C程序中的语句按功能划分为两类:14个说明语句和10个执行语句,共24个语句。按语句的多少,又可划分为简单句和复合句两类。即简单句是指一条语句,而复合句是指多于一条语句,并且,复合句要用{}括起来。

C语言中的所有语句都必须以分号结束,且程序中所有的标点符号都是英文符号。2.2随机给出一道100以内的小学生加法运算测试题2.2.1常量、变量和根本数据类型在C语言中,数据有常量和变量之分。在程序运行过程中,其值不能被改变的量称为常量在程序运行过程中,其值可以改变的量称为变量。1.常量从数据类型上分为整型常量、实型常量、字符型常量和字符串常量。常量的类型通常由书写格式决定,如100是整型常量〔整数〕,而123.45是实型常量〔实数〕,'a'是字符型常量,"abc"是字符串常量。符号常量是用一个标识符代表一个常量,在程序中用#define命令行定义符号PI代表常量3.14159,此后凡在此程序中出现的PI都代表3.14159,可以和常量一样进行运算。这种用一个标识符代表一个常量,称为符号常量。注意符号常量不同于变量,它的值在其作用域内不能改变,也不能再被赋值。见【例2-6】。习惯上,符号常量名用大写,变量用小写,以示区分。变量是由变量名和变量值两局部组成,变量用标识符表示称为变量名。变量在使用前必须先定义定义变量的语句格式是:<类型说明符><变量名表>;如果在定义的同时,就要为变量赋初值,格式是:<类型说明符><变量名表>=<初值表达式>;只有定义变量后,才能在其后的程序中使用变量,引用变量的值,或者对变量的值进行修改。即变量必须先定义,后使用。C语言中的变量代表保存数据的存储单元,而数学中的变量代表未知数。2.变量无论是常量还是变量都是有类型的,数据类型是指变量的取值范围及其操作的运算符集,不同类型的变量,其取值范围不同,参与操作的运算符不同。C语言提供四大类数据类型如下:3.数据类型空类型双精度型数据类型基本类型构造类型指针类型字符型实型(浮点型)枚举类型单精度型数组类型结构体类型共用体类型整型各种类型的变量的说明整型变量说明句式int变量名表;(2)单精度变量说明句式float变量名表;(3)双精度变量说明句式double变量名表;(4)字符型变量说明句式char变量名表;(5)空类型变量说明句式void变量名表;2.2.2算术运算符和算术表达式根本的算术运算包括加、减、乘、除、求余和其他一些操作,常用的算术运算符有+、-、*、/、%、++、--,都可以用作双目运算符。用算术运算符和括号将运算对象连接起来的符合C语言语法规那么的式子称为算术表达式。2.2.3赋值运算符和赋值表达式常用的赋值运算符有“=〞常用的复合赋值运算符有+=、-=、*=、/=、%=等由赋值运算符将一个变量和一个表达式连接起来的式子,称为赋值表达式。它的一般形式为:<变量><赋值运算符><表达式>赋值表达式的常用格式有以下两种:简单赋值表达式,如a=3;复合赋值表达式,如a=a+3;a=a-3;a=a*3;a=a/3;在使用算术运算符时,要注意以下几点:如果对两个整型数据作除法运算,结果也一定是整数。例如,表达式9/3的值为3,1/2的值为0。求余运算符取整型数据相除的余数,该运算符不能用于实型数据的运算。例如,表达式5%6的值为5,9%4值为1,10%2值为0。+和-还可以作为单目运算符,用于表示数值常量的符号,如+5和-5。(4)双目运算符两侧操作数的类型要相同;否那么,系统自动进行类型转换,转换成相同的类型,再运算。2.2.4关系运算符和关系表达式在C语言中,关系运算就是比较运算,对两个操作数进行比较C语言共提供了6种关系运算符>、>=、<、<=、==、!=等于运算符“==〞和不等于运算符“!=〞具有相同优先级,且这两个运算符的优先级低于其余4种关系运算符。“==〞是关系运算符,用于比较两个操作数是否相等,而“=〞是赋值运算符,表示对变量赋值。2.2.5随机数产生技术C语言提供的头文件stdlib.h说明了随机数产生函数rand(),用户调用此函数能返回一个0~2147483647之间的随机值。【例2-7】产生两个随机数x和y,并输出。源程序#include<stdio.h>#include<stdlib.h>intmain(){intx,y;x=rand();y=rand();printf("x=%d,y=%d",x,y);return0;}

运行结果是x=41,y=18467,当此程序再次执行时,x与y的值仍然是它们。假设要使屡次执行时,其值不同,需要调用函数srand()。srand()函数功能是用于重新设定rand()函数所使用的种子。可以用srand(time(NULL))设定不同的随机数种子。对例2-7改写后的程序见例2-7.1。【例2-7.1】每次运行程序产生两个不同的随机整数#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){intx,y;srand(time(NULL));x=rand();y=rand();printf("x=%d,y=%d",x,y);return0;}2.2.6二路决策判断if-else语句1966年Bohm和Jacopini提出了3种根本程序设计结构:顺序结构、选择结构和循环结构,并指出所有程序都可由这3种根本结构组合而成。程序按照书写顺序执行的,称为顺序结构,它适用于解决简单的问题。而在实际问题中,往往需要对不同情况,根据条件进行判断,选择所要执行的语句,那么称之为选择结构。最简单的选择结构有一路决策判断和二路决策判断,相应的称之为单分支和双分支程序。1.单分支程序关系表达式常用于构建分支程序的判断条件,单分支if语句格式为:if(表达式)语句;语句的意义是:如果表示条件的表达式(如关系表达式)成立,那么执行语句;否那么,将不执行语句。非0(真)0(假)表达式语句单分支if执行流程图双分支程序:如果在两种不同的动作之间作出选择,即二路决策判断,应用if-else语句实现。if-else语句格式:if(表达式)

语句1else

语句2编程时也可把此格式写成如下形式:if(表达式)语句1else语句22.双分支程序非0(真)0(假)表达式语句1语句2双分支if-else执行流程图2.2.7程序解析【例2-8】编程实现,随机给出一道100以内的小学生加法运算测试题。本程序中要考虑随机产生的被加数和加数的和是否小于100,所以要进行二路决策判断即用if-else语句实现。如果x+y的值小于或等于100,就输出这个加法运算的测试题,否那么重新产生随机数x和y,即程序执行流程再次转向x=rand();y=rand();语句,goto语句实现.

goto语句goto语句是无条件转向语句,

告知计算机将程序执行的流程转向指定标号的语句位置去执行,可以用他来实现重复做的工作。利用goto语句改变程序执行方向的句式:goto标号;其中,标号是一个标识符与goto语句配合使用的标号语句的句式是:标号:语句;一般情况下,使用goto语句有两种情况:

(1)与语句一起构成循环结构;

(2)从循环体中跳转到循环体外,但在C语言中可以用break语句和continue语句跳出本层循环和结束本次循环,见后续节。#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){intx,y;srand(time(NULL));aa:x=rand();y=rand();if(x+y<100)printf("%d+%d=",x,y);elsegotoaa;getch();/*观察屏幕*/return0;}源程序2.3答复小学生100以内的加法运算测试题2.3.1各种数据类型变量值的输入函数scanf()scanf()函数的调用格式如下:scanf(格式控制字符串,输入参数表);格式控制字符串表示输入数据的格式,输入参数是变量地址,切记变量名前要加&符。格式控制字符串中包含两种信息:格式控制说明和普通字符。格式控制说明。格式控制说明是由“%〞字符开始,后跟格式控制字符组成,如%d、%f、%c等。表示按指定的格式读入数据。不同类型的数据采用不同的格式控制字符,见表2-4所示。普通字符。普通字符即需要原样输出的字符。2.3.2程序解析【例2-10】答复小学生100以内的加法运算测试题源程序#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){intx,y,answer;srand(time(NULL));aa:x=rand();y=rand();if(x+y<=100)printf("%d+%d=",x,y);elsegotoaa;scanf("%d",&answer);if(answer==x+y)printf("right!\n");elseprintf("wrong!\n");return0;}2.4特色运算符和表达式逗号运算符和逗号表达式逗号表达式的一般形式为:表达式1,表达式2,…,表达式n最后一个表达式的值就是此逗号表达式的值。在所有运算符中,逗号运算符的优先级别最低。用逗号将表达式连接起来的式子称为逗号表达式条件运算符和条件表达式条件运算符是C语言中惟一的一个三目运算符。由问号“?〞和“:〞两个字符组成,用于连接3个运算对象。用条件运算符“?〞和“:〞组成的表达式称为条件表达式。其中运算对象可以是任何合法的算术、关系、赋值等各种类型的表达式。条件表达式的形式如下:表达式1?表达式2:表达式3运算规那么:当“表达式1〞的值为非零时,求出“表达式2〞的值,此时“表达式2〞的值就是整个条件表达式的值;当“表达式1〞的值为零时,那么求“表达式3〞的值,把“表达式3〞的值作为整个条件表达式的值。条件运算符的结合方向为自右至左,且优先级高于赋值运算,但低于逻辑运算、关系运算和算术运算。2.4.3位运算符C提供的位运算符见P27表2-5所示(略)2.4.4自增、自减运算符C语言中除了根本运算符外,还包括两个特殊的算术运算符:自增〔++〕、自减〔--〕运算符。这两个运算符都是单目运算符,而且运算对象必须是变量,不能是常量。自增运算符〔++〕的作用是使单个变量的值增1。自增运算符种类有两种。如:前置++i,先执行i+1,再使用i值;后置i++,先使用i值,在执行i+1。自减运算符〔--〕的作用是使单个变量的值减1。自增运算符种类也有两种。如:前置--i,先执行i-1,再使用i值;后置i--,先使用i值,在执行i-1。源程序#include<stdio.h>intmain(){inti=2,j,k;j=++i;k=i++;printf("%d,%d,%d\n",j,k,i);return0;}输出结果为:3,3,4【例2-17】自增、自减运算符的使用。2.5类型转换2.5.1自动类型转换如果参与运算的数据类型不一致,系统会根据转换规那么自动地将两个不同数据类型的运算对象转换成同一数据类型,然后再进行运算。转换规那么如下:

doublefloatunsigned图2-4类型转换低高longintchar2.6常用数学库函数常用的数学库函数,那么需引入#include<math.h>。绝对值函数fabs(a)平方根函数sqrt(a)幂函数pow(a,n)指数函数exp(x):以e为底的对数函数log(x)三角正弦值函数sin(x)三角余弦值函数cos(x)三角正切值函数tan(x)2.7C程序书写风格C程序书写格式自由,具体如下:C函数中语句的多少任意,只要能完成功能,但所采用的算法要尽量简单。一行中语句的多少任意,只要每句用分号结束。C程序中注释位置任意,只要注释不出现在多字词的中间。语句行间的空行多少任意,只要不影响视觉的连续性。提倡程序按结构清晰的锯齿形状书写,既保持视觉的连贯性,又便于阅读。函数首部的后面和编译预处理的后面不能加分号。第3章选择结构程序设计3.1统计输入的一行字符中各类字符的数量3.2简单菜单项选择择响应3.3个人所得税计算3.4综合应用——星期几的判断本章学习目标字符型数据的输入与输出逻辑运算符与逻辑表达式多路决策判断技术else-if语句及if语句的嵌套简单菜单项选择择响应即switch语句Break语句的作用3.1统计输入的一行字符中各类字符的数量

3.1.1字符类型字符型数据的输入getchar()和输出putchar()函数3.1.3逻辑运算符和逻辑表达式3.1.4多路决策判断else-if语句3.1.5程序解析3.1.1字符类型1.字符常量〔1〕可打印字符可直接从输出设备中打印出来的字符,是用单引号括起来的一个字符。〔2〕不可打印字符不可打印字符指的是该字符不能直接从输出设备输出,是将反斜杠〔\〕后面的字符转换成另外的意义。见表3-1表3-1转义字符及其含义字符形式含义\n换行,将当前位置移到下一行开头\t水平制表(跳到下一个tab位置)\b退格,将当前位置移到前一列\r回车,将当前位置移到本行开头\f换页,将当前位置移到下页开头\\反斜杠字符“\”\'单引号字符\''双引号字符\ddd1到3位8进制数所代表的字符\xhh1到2位16进制数所代表的字符字符变量用来存放字符常量,并且只能存放一个字符。字符变量的定义形式如下:

charcl,c2;2.字符变量将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII码放到存储单元中。3.字符数据在内存中的存储形式及其使用方法【例3-1】向字符变量赋以整数。intmain(){charcl,c2;cl=97;c2=98;printf("%c%c\n",cl,c2);printf("%d%d\n",cl,c2);return0;}运行结果:

ab9798

字符型数据的输入getchar()和输出putchar()函数1.单个字符输入函数getchar()

该函数的功能是从标准输入设备上读入一个字符,函数的值就是从输入设备上得到的字符。getchar()函数没有参数,一般调用形式为:

c=getchar();【例3-2】从输入设备读入字符后输出该字符。源程序#include<stdio.h>intmain(){charc;c=getchar();printf("%c",c);return0;}运行结果1如果输入:a↙那么输出:a运行结果2如果输入:1↙那么输出:1运行结果3如果输入:welcometochina↙那么输出:w2.单个字符输出函数putchar()该函数的功能从标准输出设备上输出一个字符。函数putchar()的一般调用格式为:putchar(输出参数〕;【例3-3】用putchar()输出字符变量和字符常量。#include<stdio.h>intmain(){charch;printf("Enteracharacter:");/*输入提示*/ch=getchar();/*变量ch接收从键盘输入的一个字符*/putchar(ch);/*输出存放在变量ch中的字符*/putchar('?');/*输出字符常量"?"*/}运行结果Enteracharacter:a↙a?【例3-4】用putchar()输出竖排字符OK!。程序分析:用putchar('\n')输出一个换行符,使输出的当前位置移到下一行的开头,实现输出竖排字符。#include<stdio.h>main(){chara,b,c;a='O';b='K';c='!';putchar(a);putchar('\n');putchar(b);putchar('\n');putchar(c);putchar('\n');}运行结果OK!3.1.3逻辑运算符和逻辑表达式

逻辑表达式就是用逻辑运算符将逻辑运算对象连接起来的式子,它的值反映了逻辑运算的结果。c语言提供了3种逻辑运算符,见表3-2。表3-2逻辑运算符目数单目双目运算符!&&||名称逻辑非逻辑与逻辑或优先级高——〉低3.1.3逻辑运算符和逻辑表达式逻辑运算符的优先级与其它种类的运算符相比,其优先关系从高到低如下所示:!〔逻辑非〕—>算数运算—>关系运算—>&&〔逻辑与〕—>||〔逻辑或〕—>赋值运算逻辑运算符的功能见表3-3表3-3逻辑运算的真值表ab!aa&&ba||b假假真真假真假真真真假假假假假真假真真真【例3-5】写出满足以下条件的c语言表达式。ch是空格或者回车。number是奇数。year是闰年,即year能被4整除但不能被100整除,或year能被400整除。ch是英文字母解答:逻辑表达式〔ch=='')||(ch=='\n')。关系表达式number%2!=0。逻辑表达式〔year%4==0&&year%100!=0)||(year%400==0)。逻辑表达式(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')3.1.4多路决策判断else-if语句else-if语句是最常用的实现多路选择的方法,其一般形式为:if〔表达式1)语句1elseif〔表达式2)语句2……elseif〔表达式n-1)语句n-1else语句nelse-if语句执行过程

假表达式1表达式2语句1语句2语句n-1语句n真表达式n-1真假真假假……【例3-6】某百货公司为了促销,采用购物打折优惠方法:每位顾客一次购物①在500元以上者,按九五折优惠。②在1000元以上者,按九折优惠。③在1500元以上者,按八五折优惠。④在2000元以上者,按八折优惠。编写程序,计算优惠后的价格。程序分析,见图3-4,其中d用来表示折扣,m表示商品总金额。假m<500m<1000d=1真真假真假假m<1500d=0.95真d=0.90d=0.85d=0.80m<2000解题步聚:(1)定义浮点型变量:d表示折扣,m表示购物金额,amount表示优惠后的价格。(2)输入购物金额m。(3)根据流程图3-4:计算折扣d。(4)计算amount=m*d。(5)输出amount。#include<stdio.h>main(){floatm,d,amount;printf("请输入所购商品总金额:");scanf("%f",&m);if(m<500)d=1;elseif(m<1000)d=0.95;elseif(m<1500)d=0.90;elseif(m<2000)d=0.85;elsed=0.80;amount=m*d;printf("优惠价为:%6.2f\n",amount);}运行结果请输入所购商品总金额:1600↙优惠价为:1360.00【例3-7】企业发放的奖金根据利润提成。①利润(I)低于或等于10万元时,奖金可提10%;②利润高于10万元,低于20万元时,低于10万元的局部按10%提成,高于10万元的局部,可提成7.5%;③20万到40万之间时,高于20万元的局部,可提成5%;④40万到60万之间时高于40万元的局部,可提成3%;⑤60万到100万之间时,高于60万元的局部,可提成1.5%,高于100万元时,超过100万元的局部按1%提成;要求从键盘输入当月利润I,求应发放奖金总数?解题步聚:(1)定义变量:i表示当月利润,bonus1,bonus2,bonus4,bonus6,bonus10分别用来表示10万元、20万元、40万元、60万元、100万元的奖金,bonus表示应发放的奖金。(2)输入一个变量的值i。(3)根据当月利润i分别落入不同的提成计算段〔共6种〕,而计算bonus。(4)最后输出bonus。#include<stdio.h>main(){longinti;intbonus1,bonus2,bonus4,bonus6,bonus10,bonus;printf("请输入当月利润:");scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.075;bonus4=bonus2+200000*0.05;bonus6=bonus4+200000*0.03;bonus10=bonus6+400000*0.015;if(i<=100000) bonus=i*0.1; elseif(i<=200000)bonus=bonus1+(i-100000)*0.075; elseif(i<=400000)bonus=bonus2+(i-200000)*0.05; elseif(i<=600000)bonus=bonus4+(i-400000)*0.03; elseif(i<=1000000)bonus=bonus6+(i-600000)*0.015; else bonus=bonus10+(i-1000000)*0.01;printf("应发放奖金:%d",bonus);}运行结果请输入当月利润:300000↙应发放奖金:225003.1.5程序解析【例3-8】输入一行字符,统计其中英文字母、数字字符和其他字符的个数。程序分析(1)定义整型变量:digit、letter和other,其中,digit表示数字字符个数,letter表示英文字符个数,other表示其他字符的个数;定义字符型变量ch。(2)然后把键盘输入字符存储到变量ch中。(3)判断键盘输入的字符ch是否是换行,如果是换行,那么ch是'\n',输出digit,letter,other的值。(4)否那么根据ch的值,分别判断〔共3种,数字,字母,其他〕,进行累加。(5)重复(2)、(3)、(4),直到键盘输入换行符为止。#include<stdio.h>intmain(){ intdigit=0,letter=0,other=0; charch; printf("请输入一行字符:"); aa:ch=getchar(); if(ch=='\n') {printf("digit=%d,letter=%d,other=%d",digit,letter,other); return0; } elseif((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))letter++; elseif(ch>='0'&&ch<='9')digit++;elseother++; gotoaa;}运行结果请输入一行字符:please1314!↙letter=6,digit=4,other=23.2简单菜单项选择择响应3.2.1switch语句

switch语句处理多分支选择问题,有3种情况

1.在switch语句的每个语句段中都使用break语句switch(表达式){case常量表达式1:语句段1;break;case常量表达式2:语句段2;break;....…case常量表达式n:语句段n;break;default:语句段n+1;break;}

例如:输入:输出:3.5程序分析(1)定义字符变量operator:表示运算符,双精度变量value1,value2用来表示操作数。(2)输入变量的值value1,operator,value2。(3)用switch()语句根据变量operator进行五分支判断〔+、-、*、/和其他〕,并计算相应的表达式,输出结果。【例3-9】输入一个形式如“操作数运算符操作数〞的四那么运算表达式,输出运算结果。#include<stdio.h>intmain(void){charoperator;doublevalue1,value2;printf("请输入一个表达式:");scanf("%lf%c%lf",&value1,&operator,&value2);switch(operator){case'+':printf("=%.2f\n",value1+value2);break;case'-':printf("=%.2f\n",value1-value2);break;case'*':printf("=%.2f\n",value1*value2);break;case'/':printf("=%.2f\n",value1/value2);break;default:printf("Unknownoperator\n");break;}return0;}运行结果1Typeinanexpression:6.1-2.6↙=3.5运行结果2Typeinanexpression:6.1%2.6↙Unknownoperator2.在switch中不使用break语句break语句在switch语句中是可选的,不使用break的switch语句是:switch(表达式){case常量表达式1:语句段1;case常量表达式2:语句段2;……case常量表达式n:语句段n;default:语句段n+1;}【例3-10】分析执行下面的程序,输出结果是什么。#include<stdio.h>voidmain()

{

intm=20;

switch(m)

{

case19:m+=1;

case20:m+=1;

case21:m+=1;

case22:m+=1;

}

printf("%d\n",m);

}运行结果233.在switch的某些语句段中使用break

【例3-11】输入一行字符,统计其中空格、数字字符和其他字符的个数。解题步骤:(1)定义整型变量:space、digit和other,其中,space表示空格个数,digit表示数字字符个数,other表示其他字符的个数;定义字符型变量ch。(2)然后把键盘输入字符存储到变量ch中。(3)判断键盘输入的字符ch是否是换行,如果是换行,那么ch是'\n',输出space,digit,other的值。(4)否那么根据ch的值,分别判断〔共3种,数字,字母,其他〕,进行累加。(5)重复(2)、(3)、(4),直到键盘输入换行符为止。#include<stdio.h>intmain(){intblank=0,digit=0,other=0;charch;blank=0;printf("请输入一行字符:");aa:ch=getchar();switch(ch){case'':{blank++;gotoaa;

}case'0':case'1':case'2':case'3':case'4':

case'5':case'6':case'7':case'8':case'9':{digit++;gotoaa;}case'\n':break;default:{other++;gotoaa;}}printf("blank=%d,digit=%d,other=%d\n",blank,digit,other);return0;}【例3-12】简单菜单项选择择响应,根据菜单项选择择要启动的操作系统,选择1:启动windows;选择2:启动linux;选择3:启动unix;选择4:启动solaris。程序分析(1)定义字符变量ch。(2)用printf()函数输出菜单。(3)键盘输入单个字符赋给变量ch。(4)用switch()语句根据用户输入编号ch进行五分支操作,当用户输入编号1~4,启动相应的操作系统;输入其他值,显示警告信息。3.2.2程序解析#include<stdio.h>Intmain(){ charinputchar; inputchar='\0';

printf("\n"); printf("PLEASESELECTSTARTOS\n");

printf("1WINDOWSos\n");printf("2LINUXos\n"); printf("3UNIXos\n"); printf("4SOLARISos\n"); ch=getchar();

switch(ch) { case'1': printf("WINDOWSstarting\n"); break; case'2': printf("LINUXstarting\n"); break;

case'3': printf("UNIXstarting\n"); break; case'4': printf("SOLARISstarting\n"); break; default: printf("WARNING........\n"); printf("SYSTEMERROR,POWEROFF.\n"); }}运行结果1PLEASESELECTSTARTOS;1WINDOWSos2LINUXos3UNIXos4SOLARISos1↙WINDOWSstarting运行结果2PLEASESELECTSTARTOS;1WINDOWSos2LINUXos3UNIXos4SOLARISos5↙WARNING........SYSTEMERROR,POWEROFF.3.3个人所得税计算多分支结构与嵌套的if语句它的一般形式如下:if〔表达式1)if(表达式2)语句1else语句2elseif(表达式3〕语句3else语句4【例3-13】显示学生成绩与等级,要求如下:①90分以上者,等级为A;②80分以上者,等级为B;③60分以上者,等级为C;④其它等级为D;解题步骤:(1)定义int变量x:表示学生成绩。(2)输入变量x。(3)用嵌套的if语句进行判断,输出学生成绩等级。main(){intx;printf("pleaseinputx(0<=x<=100):");scanf("%d",&x);if(x>100||x<0)printf("x=%ddataerror!\n",x);else{if(x>=90)printf("x=%disgradeA!\n",x);elseif(x>=80)printf("x=%disgradeB!\n",x);

elseif(x>=60)printf("x=%disgradeC!\n",x);elseprintf("x=%disgradeD!\n",x);}}运行结果1pleaseinputx(0<=x<=100):86↙x=86isgradeB!运行结果2pleaseinputx(0<=x<=100):110↙x=110isdataerror!【例3-14】一元二次方程求解程序分析(1)定义float变量:a,b,c:表示一元二次方程系数,d表示判别式,a2=2*a,x1,x2表示根。(2)输入变量a,b,c。(3)用嵌套的if语句进行判断:假设a=0,解一元一次方程;否那么,解一元二次方程;假设d>0,输出实根,否那么输出复根。

if(d>=0){x2=sqrt(d)/a2;printf("realroot:\n");/*输出实根*/printf("root1=%.2f,root2=%.2f\n",x1+x2,x1-x2);}else{x2=sqrt(-d)/a2;printf("complexroot:\n");/*输出复根*/printf("root1=%.2f+%.2fi\n",x1,x2);printf("root2=%.2f-%.2fi\n",x1,x2);}}}运行结果1Inputa,b,c0,2,4↙root=-2运行结果2Inputa,b,c2,3,4↙root=-2complexroot:root1=-0.75+1.20iroot2=-0.75+1.20i3.3.2程序解析【例3-15】设计个人所得税计算程序。“税法〞规定,工资、薪金所得,使用超额累进税率,以每月收入额减去2000元后的余额,为应纳税所得额。其税率见表3.4。〔程序见书上〕表3.4税率表级数全月应纳税所得额税率(%)级数全月应纳税所得额税率(5%)1不超过500元5640000~60000元302500~2000元10760000~80000元3532000~5000元15880000~100000元4045000~20000元209超过100000元45520000~40000元253.4综合应用——星期几的判断

【例3-16】请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,那么继续判断第二个字母。程序分析:用switch语句比较好,如果第一个字母一样,那么判断用switch语句或if语句判断第二个字母。#include<stdio.h>intmain(){ charletter,letter1;printf("请输入第一个字符:");letter=getchar(); getchar();switch(letter) {

case'S':printf("请输入第二个字符:");letter1=getchar();if(letter1=='a')printf("Saturday\n");elseif(letter1=='u')printf("Sursday\n");elseprintf("dataerror\n"); break;case'F':printf("Friday\n");

case'M':printf("Monday\n");case'T':printf("请输入第二个字符:");letter1=getchar(); if(letter1=='h')printf("Thursday\n"); elseif(letter1=='u')printf("Tuesday\n"); elseprintf("dataerror\n"); break;case'W':printf("wednesday\n");default:printf("dataerror\n"); }return0;}本章小结本章主要讲解了多路决策判断else-if语句、if语句的嵌套、简单菜单项选择择响应switch语句,以及选择结构程序设计的方法,同时,介绍了字符型数据的输入与输出、逻辑运算符与逻辑表达式的用法,使读者能处理字符型数据,并解决选择结构程序设计的实际问题。第4章循环结构程序设计4.1利用格里高利公式求的近似值

4.2模拟彩票开奖4.3统计一批学生成绩的最低分4.4循环结构程序设计4.5综合应用—加法运算测试系统本章学习目标掌握什么是循环及为什么使用循环如何确定循环条件和循环体四种循环(for、while、do-while、if-goto)的区别出循环的几种情况循环嵌套的原理4.1利用格里高利公式求π的近似值4.1.1while循环语句1.while循环语句是当型循环控制语句,它的一般形式为:while(表达式)语句其中,表达式是循环条件,语句为循环体。对while语句的说明如下:⑴while后面的括号()不可省略。⑵后面的表达式可以是任意类型的表达式,但通常是条件表达式或逻辑表达式。表达式的值是循环控制的条件。⑶语句局部称为循环体,当需要执行多条语句时,应使用复合语句。2.while循环执行过程在执行while语句时,先对表达式进行计算,假设其值为“真〞〔非0〕,那么执行循环体中的语句,否那么跳过循环体执行while后面的语句。在进入循环体后,每执行完一次循环体语句后再对表达式进行一次计算和判断,当发现其值为“假〞〔0〕时,立即退出循环。假表达式语句真while循环结构的特点是:先判断表达式,后执行语句。while语句的流程图,如图4-1所示。图4-1while语句执行流程3.while循环应用举例【例4-1】编程实现求sum=1+2+3+…100的值。源程序#include<stdio.h>intmain(){inti=1,sum=0;while(i<=100){sum=sum+i;i++;}printf("sum=%d",sum);return0;}⑴如果while后的表达式的值一开始就为假,循环体一次也不执行。⑵通常情况下,程序中会利用一个变量来控制while语句的表达式的值,这个变量被称为循环控制变量。如本程序中变量i就是循环控制变量。⑶在while循环之前必须对循环控制变量i初始化,并且,循环体中一定要有使循环控制变量i改变的语句。否那么极易造成死循环。⑷遇到以下情况之一,都可以退出while循环:表达式为假(即0)、循环体内有break、return、goto语句〔break语句后续介绍〕。关于while语句的用法,要注意以下几点:【例4-2】编程实现求s=10!。源程序#include<stdio.h>intmain(){longinti=1,s=1;while(i<=10){s=s*i;i++;}printf("s=%ld",s);return0;}【例4-3】编程实现求的前15项的和。源程序#include<stdio.h>intmain(){intfm=1,flag=1,i=1;floatsum=0;while(i<=15){sum=sum+flag*1.0/fm;fm=fm+2;flag=-flag;i++;}printf("sum=%f",sum);return0;}【例4-4】从键盘输入一批学生的C语言考试成绩,求平均成绩。源程序1#include<stdio.h>intmain(){inti=1,n;floatscore,sum=0,aver;printf("请输入C语言考试人数:");scanf("%d",&n);while(i<=n){printf("请输入第%d个同学的C语言成绩:",i);scanf("%f",&score);sum=sum+score;i++;}if(n!=0)printf("C语言考试平均成绩是:%.2f\n",sum/n);elseprintf("人数为0,平均成绩也为0\n");return0;}源程序2#include<stdio.h>intmain(){intnum=0;floatscore,sum=0;printf("请输入C语言考试成绩:");scanf("%f",&score);while(score>=0){sum=sum+score;num++;scanf("%f",&score);}if(num!=0)printf("C语言考试平均成绩是:%.2f\n",sum/num);elseprintf("C语言考试平均成绩是0\n");return0;}源程序#include<stdio.h>#include<math.h>intmain(){intfm=1,flag=1;doubleitem,pi;item=1.0;pi=0;while(fabs(item)>=0.0000001){item=flag*1.0/fm;pi=pi+item;flag=-flag;fm=fm+2;}pi=pi*4;printf("pi=%.5f\n",pi);return0;}4.1.2程序解析【例4-5】利用格里高利公式求的近似值,精度要求到最后一项的绝对值小于10-7。4.2模拟彩票开奖4.2.1dowhile循环语句1.dowhile循环语句是直到型循环控制语句,它的一般形式为:do{

语句}while(表达式);其中,表达式是循环条件,语句为循环体。⑴while后面的括号()不可省略。⑵while(表达式)后面的分号;不能省。⑶后面的表达式可以是任意类型的表达式,但通常是条件表达式或逻辑表达式。表达式的值是循环控制的条件。⑷语句局部称为循环体,当需要执行多条语句时,应使用复合语句。对dowhile语句的说明如下:2.dowhile循环执行过程首先无条件的执行循环体语句,然后才判断表达式的值是否为真〔非0〕,如果为真,那么再执行循环体语句,如此循环往复,直到表达式的值为假〔0〕时循环终止。其对应的流程图如图4-2所示。假真表达式循环体语句图4-2dowhile语句执行流程3.do…while循环应用举例【例4-6】用do…while语句求sum=1+2+3+…100的值。源程序#include<stdio.h>intmain(){inti=1,sum=0;do{sum=sum+i;i++;}while(i<=100);printf("sum=%d\n",sum);return0;}【例4-7】用do…while求10!。源程序#include<stdio.h>intmain(){inti=1;longints=1;do{s=s*i;i++;}while(i<=10);printf("10!=%ld",s);}【例4-8】编写一个模拟彩票开奖的程序。假定彩票号码为2位数,当你任意指定一

温馨提示

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

评论

0/150

提交评论