设有int x;对语句 scanf long int("%5d",&x); 当输入流为123456时,123将被赋给

golang fmt.printf I/O 函数格式化说明 - 简书
golang fmt.printf I/O 函数格式化说明
fmt 包实现了格式化 I/O 函数,类似于 C 的 printf 和 scanf
格式“占位符”衍生自 C,但比 C 更简单
常用格式化输出
fmt.Printf("start at number %v, end count %v\n",start, count)
注意参数输出数量和占位符数量要一致
IDEA开发快速格式化模板
使用IDEA开发可以配置自定义代码模板快速生成
Settings -& Editor -& Live Templates
选中 go 语言展开 选则增加一条
Abbreviation 填写 fpf
Description 填写 print fmt format
Template text
fmt.Printf("$END$",$VAR$)
Applicable in 点击右侧 Define选中 Go: statenebt
Paste_Image.png
使用时在Go语言编辑的函数中输入 fpf 就会自动开始编写格式化输出
Paste_Image.png
同理可以配置
fpfl 自动模板,帮助填写一个格式化后自动换行,内容
fmt.Printf("$END$\n",$VAR$)
喜欢log的输出也可以自己定义模板
一般占位符
相应值的默认格式
在打印结构体时,默认格式,会添加字段名
相应值的 Go 语法表示
相应值的类型的 Go 语法表示
字面上的百分号,并非值的占位符
布尔占位符
单词 true 或 false
整数占位符
二进制表示
相应 Unicode 码点所表示的字符
十进制表示
八进制表示
单引号围绕的字符字面值,由 Go 语法安全地转义
十六进制表示,字母形式为小写 a-f
十六进制表示,字母形式为大写 A-F
Unicode 格式:U+1234,等同于 "U+%04X"
浮点数及其复合构成占位符
无小数部分的,指数为二的幂的科学计数法,与 strconv.FormatFloat 的 'b' 转换格式一致。例如 -
科学计数法,例如 -
科学计数法,例如 -
有小数点而无指数,例如 123.456
根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的 0)输出
根据情况选择 %E 或 %f 以产生更紧凑的(无末尾的 0)输出
字符串与字节切片占位符
字符串或切片的无解译字节
双引号围绕的字符串,由 Go 语法安全地转义
十六进制,小写字母,每字节两个字符
十六进制,大写字母,每字节两个字符
十六进制表示,前缀 0x
这里没有 'u' 标记。若整数为无符号类型,他们就会被打印成无符号的
类似地, 这里也不需要指定操作数的大小(int8,int64)。
宽度与精度的控制格式以 Unicode 码点为单位。(这点与 C 的 printf 不同, 它以字节数为单位。)
二者或其中之一均可用字符 '*' 表示, 此时它们的值会从下一个操作数中获取,该操作数的类型必须为 int。
// 宽度与精度的控制以 Unicode 码点为单位
fmt.Printf("\"%8s\"\n", "123456") // 最大长度为 8
fmt.Printf("\"%8s\"\n", "Hello")
// 最大长度为 8
// 宽度与精度均可用字符 '*' 表示
fmt.Printf("%0*.*f \n", 8, 3, 13.25) // 总长度 8,小数位数 3
fmt.Printf("%08.3f \n", 13.25)
// 总长度 8,小数位数 3
对数值而言,宽度为该数值占用区域的最小宽度;精度为小数点之后的位数
但对于 %g/%G 而言,精度为所有数字的总数。
例如,对于 123.45,格式 %6.2f 会打印 123.45,而 %.4g 会打印 123.5。
%e 和 %f 的默认精度为 6;但对于 %g 而言,它的默认精度为确定该值所必须的最小位数
对大多数值而言,宽度为输出的最小字符数,如果必要的话会为已格式化的形式填充空格。
对字符串而言,精度为输出的最大字符数,如果必要的话会直接截断。
// 宽度与精度标记字符串
fmt.Printf("%8q", "ABC")
// 最小长度为 8(包括 %q 的引号字符)
fmt.Printf("%.8q", "") // 最大长度为 8(不包括 %q 的引号字符)
总打印数值的正负号;对于 %q(%+q)保证只输出 ASCII 编码的字符
在右侧而非左侧填充空格(左对齐该区域)
备用格式:对八进制添加前导 0(%#o),对十六进制添加前导 0x(%#x)或 0X(%#X)对 %p(%#p)去掉前导 0x
如果可能的话,%q(%#q)会打印原始(即反引号围绕的)字符串
如果是可打印字符,%U(%#U)会写出该字符的 Unicode 编码形式(如字符 x 会被打印成 U+0078 'x')
' ' (空格)为数值中省略的正负号留出空白(% d);以十六进制(% x, % X)打印字符串或切片时,在字节之间用空格隔开
fmt.Printf("% x\n", "Hello")
// 48 65 6c 6c 6f
填充前导的 0 而非空格;对于数字,这会将填充移到正负号之后
标记有时会被占位符忽略,所以不要指望它们。例如十进制没有备用格式,因此 %#d 与 %d 的行为相同
对于每一个 Printf 类的函数,都有一个 Print 函数,该函数不接受任何格式化, 它等价于对每一个操作数都应用 %v
另一个变参函数 Println 会在操作数之间插入空白, 并在末尾追加一个换行符
不考虑占位符的话,如果操作数是接口值,就会使用其内部的具体值,而非接口本身
var i interface{} = 23
fmt.Printf("%v\n", i)
// 会打印 23
若一个操作数实现了 Formatter 接口,该接口就能更好地用于控制格式化。
若其格式(它对于 Println 等函数是隐式的 %v)对于字符串是有效的(%s %q %v %x %X),以下两条规则也适用:
若一个操作数实现了 error 接口,Error 方法就能将该对象转换为字符串,随后会根据占位符的需要进行格式化。
若一个操作数实现了 String() string 方法,该方法能将该对象转换为字符串,随后会根据占位符的需要进行格式化。
// 为避免以下这类递归的情况
type X string
func (x X) String() string { return Sprintf("&%s&", x) }
// 需要在递归前转换该值
func (x X) String() string { return Sprintf("&%s&", string(x)) }
格式化错误输出
如果给占位符提供了无效的实参(例如将一个字符串提供给 %d),所生成的字符串会包含该问题的描述,如下例所示:
// 类型错误或占位符未知:%!verb(type=value)
Printf("%d", hi)
// %!d(string=hi)
// 实参太多:%!(EXTRA type=value)
Printf("hi", "guys")
// hi%!(EXTRA string=guys)
// 实参太少:%!verb(MISSING)
Printf("hi%d")
// hi %!d(MISSING)
// 宽度或精度不是 int 类型:%!(BADWIDTH)或 %!(BADPREC)
Printf("%*s", 4.5, "hi")
// %!(BADWIDTH)hi
Printf("%.*s", 4.5, "hi")
// %!(BADPREC)hi
所有错误都始于“%!”,有时紧跟着单个字符(占位符),并以小括号括住的描述结尾
一组类似的函数通过扫描已格式化的文本来产生值
Scan、Scanf 和 Scanln
从 os.Stdin 中读取
Fscan、Fscanf 和 Fscanln
从指定的 io.Reader 中读取
Sscan、Sscanf 和 Sscanln
从实参字符串中读取
Scanln、Fscanln 和 Sscanln
在换行符处停止扫描,且需要条目紧随换行符之后
Scanf、Fscanf 和 Sscanf
需要输入换行符来匹配格式中的换行符;其它函数则将换行符视为空格
Scanf、Fscanf 和 Sscanf
根据格式字符串解析实参,类似于 Printf
例如,%x 会将一个整数扫描为十六进制数,而 %v 则会扫描该值的默认表现格式
格式化行为类似于 Printf,但也有如下例外:
%p 没有实现
%T 没有实现
%e %E %f %F %g %G 都完全等价,且可扫描任何浮点数或复合数值
%s 和 %v 在扫描字符串时会将其中的空格作为分隔符
标记 # 和 + 没有实现
在使用 %v 占位符扫描整数时,可接受友好的进制前缀 0(八进制)和 0x(十六进制)
宽度被解释为输入的文本(%5s 意为最多从输入中读取 5 个符文来扫描成字符串),而扫描函数则没有精度的语法(没有 %5.2f,只有 %5f)
当以某种格式进行扫描时,无论在格式中还是在输入中,所有非空的连续空白字符 (除换行符外)都等价于单个空格
由于这种限制,格式字符串文本必须匹配输入的文本,如果不匹配,扫描过程就会停止,并返回已扫描的实参数
在所有的扫描参数中,若一个操作数实现了 Scan 方法(即它实现了 Scanner 接口),该操作数将使用该方法扫描其文本
此外,若已扫描的实参数少于所提供的实参数,就会返回一个错误
所有需要被扫描的实参都必须是基本类型或实现了 Scanner 接口的类型
Fscan 等函数会从输入中多读取一个字符(符文),因此,如果循环调用扫描函数,可能会跳过输入中的某些数据
一般只有在输入的数据中没有空白符时该问题才会出现。
若提供给 Fscan 的读取器实现了 ReadRune,就会用该方法读取字符
若此读取器还实现了 UnreadRune 方法,就会用该方法保存字符,而连续的调用将不会丢失数据
若要为没有 ReadRune 和 UnreadRune 方法的读取器加上这些功能,需使用 bufio.NewReader
没有什么是一行代码不能解决的,如果有就两行
Context https://github.com/sinlov
longaaaa =; Console.WriteLine(aaaa.ToString(&N0&)); Console.WriteLine(string.Format(&{0:N0}&,)); Console.WriteLine(&架构师 w...
第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一行一行地执行。一般情况下,每一行就是一个语句。 语句(statement)是为了完成某种任务而进行的操作,比如下面就是一行赋值语句: 这条语句先用var命令,声...
第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型和基本包装类型 用类型的值(对象)是引用类型的-个实例。在ECMAScript中,引用类型是--种数据结构, 1 I用于将数据和功能组织在一起。它也常被称为类,...
C语言笔记 一终端命令 ls -l显示当前工作路径下的所有的文件及文件信息 d开头文件夹 -开头文件 r读 w写 x执行 - -当前用户的权限 - -其他用户的权限 & pwd查看终端程序的工作路径 &cd切换工作路径 &clear清理屏幕 &touch新建文件 &open...
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
初级 小明之前完全没接触过Android开发,是个应届生,他的待遇是13k,然后小明以校招的身份进入了名企,然后小明需要怎么学习才能成为初级工程师呢?这个时候,小明对编程基础、数据结构、C语言都有一定基础,Java语法什么的也都掌握的比较好,Android才有java语言,...
没有设计的思想,你就不能成为一名架构师。架构师是一个能撸的了一手好代码,画的了一个漂亮的UML/原型,写的了一篇技术文档,更加能解决好项目关键技术的综合人才。架构师=前端工程师+后端程序员+系统分析师+关键技术解决+各种技术搭配+设计模式+部署调优+其他,可见架构师是多面...
不是每颗尘埃 都会拥有,如此绚烂的回忆 在这星陨如雨的仲夏夜 一抹淡淡的云朵,在天空游弋 若是每次相逢 都能记起,你那深情的双眸 在被岁月冰封的时光里 许多翩翩的花瓣,已飘落随风 布谷鸟飞过的山谷 松涛还在忘情的起舞 灰色的野兔穿过一道道山岭 滴落的星光绵延在荒草丛生的小路...
上海——宜昌——重庆——上海,这是那次旅行的行程路线。为期五天。在我心中,那是一次美妙而难忘的旅行。不仅在于沿途的风景美,还在于我们是全家出游——妈妈、我、儿子和爱人。
一 从小在东北平原上长大的我,看惯了一马平川的...#include&stdio.h& main() { int x,y; scanf(“%2d%1d”,&x,&y); printf(“_百度知道
#include&stdio.h& main() { int x,y; scanf(“%2d%1d”,&x,&y); printf(“
n”,x+y)#include&stdio.h&gt,&x,&y);printf(“%d\main(){int x,y;scanf(“%2d%1d”
我有更好的答案
输入时将数字截断了,%2d表示取输入字符的两位 即12%1d表示取输入字符的1位 即312+3=15
scanf(“%2d%1d)这里限制了你的x和y的长度了
%2d说明x的值为12
%1d说明y的值为3
所以它们的和为15啊!再输入的时候最好不要加前面的限制啊,正常是在输出端才设置的
因为%2d%1d没有空格符或逗号之类的区分,所以,%2d则x=12,%1d,则y=3,后面输入的都不起作用了,输出x+y,即为15
2d得到的不是12吗?1d得到3,自然结果为15了
(“%2d%1d”,&x,&y);也就是说x接受两位也就是12,y接受一位3,后面的无效结果当然是15了
其他2条回答
为您推荐:
其他类似问题
scanf的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。scanf函数的格式说明
格式说明字符串规定了输入项中的变量将以何种类型的数据格式(由转换说明符给出)被输入,格式控制字符串的一般形式:
[修饰符] 转换说明符
其中修饰符为任选项。
1)格式转换说明符:用于指定相应输入项内容的输入格式,常用格式见下表1。
表1 scanf函数转换说明符
输入一个十进制整数
输入一个八进制整数
输入一个十六进制整数
输入一个有符号或无符号的十进制、八进制、十六进制整数
输入一个无符号十进制整数
f 、e或E、 g或G
输入一个小数形式或指数形式的浮点数
输入一个字符
输入一个字符串
&&&&&&scanf(“%d”,&x);
有两个参数“%d”和&x,第一个参数是格式控制字符串,由%后接一个类型转换说明符构成,指出用户应该输入的数据类型,转换说明符%d说明输入
的数据应该是一个整数。第二个参数是变量x的地址,&与变量名连用是将变量x的内存地址告诉scanf函数,计算机然后就会将输入的数据存储在这
个地址单元中。
计算机在执行scanf语句时,等待用户输入变量x的值,用户通过键入一个整数并按下回车键响应请求,计算机把用户的输入值赋给变量x,操作完成后,对x的引用就会使用这个值。scanf函数(及后面学习的printf函数)提高了用户与计算机之间的交互性。
在 有多个输入项时,如果格式控制字符串中没有普通字符或转义字符作为读入数据之间的分隔符,则一般采用空格符、符或回车键作为读入数
据的分隔符,当C语言的编译系统空格符、符或回车键以及非法字符时,会自动认为数据输入结束。计算机等待所有的数据输入结束后的最
后一次&回车键&,将读入的数据分别付给对应的变量所指定的内存单元。如果数据的输入少于格式控制字符串中指定的转换说明符的个数,则计算机
将一直等待数据的输入,直到所有数据全部被键入为止。
&&&&&&scanf(“%d%d”,&x,&y);
读入数据的方式可以是:
&&&&&&1&空格&2&回车&
&&&&&&1&回车&
&&&&&&2&回车&
采用“%d%d”形式的格式字时,不能使用其它的数据读入方式。例如:1,2&回车&,会使得只有1被送入x单元,而y单元不能够得到数据2。
但是,在输入多个带有字符型数据时,若以空格符作为分隔符,可能产生非预期的结果。此时,空格将被作为有效字符处理。
&&&&&&char
&&&&&&scanf(“%d%c”,&a,&ch);
果数据读入方式为:123&空格&a&回车&,本意是期望变量a的值为数值32,变量ch的值为字符a,但实际上用于分隔数据的
空格被作为有效字符数据读入并赋予给字符变量ch。为了避免这种情况,可以在格式控制字符串中加入空格作为分隔符。将上面例句改为:scanf(“%d
%c”,&a,&ch);此处的%d后的空格,就可以跳过字符‘a’前所有的空格,从而保证非空格数据的正确录入。
scanf函数的修饰符有:数据读入宽度(域宽)、*和长度。修饰符和意义见下表2。
表2 修饰符以及意义
指定输入数据的宽度
跳过相应数据不作处理
读入长整型、双精度型或短整型数据
①域宽
可以用一个十进制数指定输入数据的数据宽度,系统自动按域宽截取输入数据。
&&&&&&scanf(“=”,&a);
表示按宽度3输入一个整数给变量a。如果读入数据为:123456&回车&,则变量a实际接收的值为123。
&&&&&&scanf(“-=M”,&a,&b,&c);
如果读入数据为:&回车&,则变量a、b 、c 的值分别是12、345和6789。可以实现数据的自动截取。
②字符*
*表示按指定格式读入数据但不赋予相应的变量,作用是跳过相应的读入数据。
&&&&&&scanf(“%d%*d%d”,&a,&b,&c);
执行该语句,若输入为1? 2? 3&回车&,结果为a=1,b=3,c未赋值,2被跳过。
例1:一个实际问题——处理一个日期数据。
假设日期读入的格式为:
12-2-/2003,该数据格式中的年、月、日三个数据需要保存,但是连接年、月、日数据的连接符需要被废弃。
当用户以12-02-2003形式键入日期数据时,该数据中的每一个数值(年、月、日)需要被读入对应的变量year、month、date内存单元中,为了去掉不需要的将年、月、日数据分开的连接符,直接方法是将这些字符包含在scanf的格式控制串中。
例 如将语句写成:scanf(“%d─%d─%d’,&date,&month,&year);这条语句可以去掉以
12-2-2003形式读入数据中的连字符,但是当用户输入如下格式的日期数据::12/2/:2003时,该语句语句不仅不能去掉不
需要的字符(/或:),还会造成数据错误(只能正确得到date数据)。如果在输入格式字符串中使用scanf函数提供的*,将语句写成:
scanf(“%d%*c%d%*c%d’,&date,&month,&year);就能够从输入数据中读取有效数据并废弃任何%*c所指定的数据(不将其赋给某个变量)。
程序清单如下:
month, day,
&&&&&&printf("Enter
a date in the form d-m-y:");
&&&&&&scanf("%d%*c%d
%*c%d",&date,&month,,&year);
&&&&&&printf("date=%d
month=%d year=%d\n",date ,month,year);
运行结果:
&&&&&&Enter
a date in the from d-m-y:12/3/2003
&&&&&&day=12,month=3,year=2003
③l和h
用于说明输入的数据时长整型(l)或短整型(h)。l和h可以和转换说明符d、o、x一起使用,形式为%ld、%lo、%lx、%hd、%ho、%hx,此外l还可以与f或e一起(%lf或%le)表示输入double型数据。
&&&&&&long
&&&&&&short
&&&&&&scanf(“ld%hd”,&a,&b);
表示变量a的数据按宽度为10的长整型读入,而变量b的数据按短整型读入。
3)普通字符(非格式字符)
格式控制字符串中除了格式字与修饰符外,还可以包含普通字符,这些普通字符包括:可打印字符、空格和转义字符。
①可打印字符:对scanf函数,如果格式控制字符串中的说明符之间包含有其他字符,那么在输入数据时,必须在相应位置读入这些字符。
&&&&&&scanf(“%d,%d”,&a,&b);
若数据输入:1&空格&2;则只有变量a的数据是正确的,变量b则会发生错误。这是因为格式控制字符串中存在可打印字符“,”,所以在读入数据时,必须以“,”作为输入数据的分隔符。
正确地读入数据方式应为:1,2&回车&
如:scanf(“a=%d,b=%f,c=%c”,&a,&b,&c);当输入为:1,2,a时,虽然采用了“,”分隔数据,
但也会产生错误,因为在格式控制字符串中还有其他的可打印字符(如:“a=”,“b=”,“c=”等)。也就是说,这些字符作为输入数据的分隔符,在
scanf函数读入数据时自动去掉。因此正确地数据读入方式应为:a=1,b=2.1,c=a&回车&
②空格
格式控制字符串中的空格可以分隔数据,在多个数据输入过程中,如果没有普通字符做数据的分隔符,则在数值数据输入时,可以用空格作为读入数据的分隔符,但在字符数据输入时,空格则不能作为数据之间的分隔符,它将被作为有效数据处理。
③转义字符
在以%c格式的数据读入中,转义字符被作为有效字符处理。而在格式控制字符串中的转义字符具有输入转义字符所代表的控制代码或特殊字符的功能。
请分析下面程序代码:
&&&&&&scanf("%d%d\n",&a,&b);
&&&&&&printf("a=%d,b=%d\n",a,b);
如果输入1 2,会发生什么现象?应该怎样读入数据,才能得到执行结果?
尽量不要在scanf()函数的格式控制字符串中出现普通字符,特别是转义字符,它会增加读入数据的难度并可能造成不可预料的错误。
来自博客分享
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。4,111 views
一个普通的iOS程序员,平时也写Android和Java。C语言程序设计教程第二版答案 高教版 谭浩强 张基温
&&&&c 语言程序设计教程第二版高等教育出版社 谭浩强 张基温 唐永炎 等第1章1.1 请叙述什么是高级语言 高级语言主要是指和机器硬件环境无关的程序设计语言。 1.2 什么是过程化语言什么是非过程化语言 所谓面向过程语言, 就是把解题过程看作是数据被加工的过程。 其主要特点是数据与算 法的分离。如 c,pascal。可将过程程序设&&&&计语言简单地看作:程序=算法+数据结构。 非过程化语言的特点是数据和算法是一个有机的整体。如 c++。 1.3 请简述建立 c 语言程序的过程。 编辑,编译,连接,运行。file1.c file1.obj file1.exe 1.4 请编写一个程序,能显示出以下两行文字: i am a student. i love china. //filename:thqch1_04.c #include&stdio.h& int main() { printf(&i am a student.
&); printf(&i love china.
&); return 0; } 1.5 编一程序,从键盘输入两个整数,输出此两数之和。 //filename:thqch1_05.c #include&stdio.h& int main() { int x,y; printf(&请输入两个整数 x y,中间用空格隔开&); scanf(&%d%d&,&x,&y); printf(&x 与 y 的和为%d.
&,x+y); return 0; } 1.6 调用库函数,求以下的函数值: (1) cos3.5678 (2) lg90 (3) e2.567 (4)5(5) tan0.78563 //filename:thqch1_06.c #include&stdio.h& #include&math.h& int main() { printf(&cos3.5678=%f
&,cos(3.5678)); printf(&lg90=%f
&,log10(90)); printf(&exp(2.567)=%f
&,exp(2.567)); printf(&sqrt(5)=%f
&,sqrt(5)); printf(&tan(0.78563)=%f
&, tan(0.78563)); return 0; } 1.7 编写一个求三个整数之和的程序。 //filename:thqch1_07.c #include&stdio.h& int sumofthreenum(int x,int y,int z); int main() { int x,y,z; printf(&请输入三个整数,中间用空格分隔(x y z):&); scanf(&%d%d%d&,&x,&y,&z); printf(&三个数的和为%d
&,sumofthreenum(x,y,z)); return 0; } int sumofthreenum(int x,int y,int z) { return x+y+z; } 1.8 编写一个求 a+│b│的程序。 //filename:thqch1_08.c #include&stdio.h& #include&math.h& int sumofaandabsb(int a,int b);//求 a 与 b 的绝对值的和 int main() { int x,y; printf(&请输入两个整数,中间用空格分隔(x y):&); scanf(&%d%d&,&x,&y); printf(&三个数的和为%d
&,sumofaandabsb(x,y)); return 0; } int sumofaandabsb(int a,int b) { return a+abs(b); } 1.9 编写一个求 0~100 之间全部偶数之和的程序。 //filename:thqch1_09.c #include&stdio.h& #include&math.h& int sumofoddbetween0_100();//求 0 与 100 之间的偶数的和 int main() { printf(&0 与 100 之间的偶数的和为%d
&,sumofoddbetween0_100()); return 0; } int sumofoddbetween0_100() { int i,sum=0; for(i=0;i&=100;i++){ if(i%2==0)sum=sum+i; } } 1.10 编写一个程序,从 5 个整数中找出最小的数,并显示此数。 int findminnum(int a[],int k);//从 k 个整数中找出最小的数 { if(n&1) exit(0); int i,x=a[0]; for(i=1;i&k;i++){ if(a[i]&x) x=a[i]; } } 第2章2.1 为什么 c 语言中每个数据都要属于一个特定的类型 因为不同的类型在内存中所占的存储空间不同, 将数据区分为不同的类型可以更好地组 织数据,提高数据处理的效率。 2.2 指出数的定点形式与浮点形式有何不同。 定点数不含指数部分,浮点数含指数部分。 2.3 计算机中表示的数是连续的吗 不是。 2.4 写一个程序测试你所用的 c 版本中的 float 型数据所占的字节数。 int main() { printf(&float 型数据的长度为%d
&,sizeof(float)); return 0; } 2.5 写一个程序测试一下把带小数的 float 和 double 型数据用 printf 函数输出时,小数 部分截断还是四舍五入 #include&stdio.h& int main() { a=3.1415926; b=3.7935; printf(&a=%8.6f
&,a,b); return 0; } 运行结果: a=3.141593 b=3.794 这说明在截断时,按四舍五入来处理的。 2.6 下列常数中哪些是合法的 c 常量那些是非法的 c 常量对合法者指出其类型,对非法 者指出原因。 3 -0. 2 -0x2al 0x7g e3 003 2 3.e-5 ‘
’ “x-y” ‘{’ 12.5e “105” 0 ‘105’ “35′53” 3+5 35 7″ π e 2e5 ‘ab’ 0x2.5b 03e5 ±7f 7ff 2e-310 1.3 5e+0 1g3 合法的常量如下: -0. -0x2al
3.e-5 2e5 ‘{’ ‘
’ “105” “x-y” “35′53” 不合法的常量如下: 3 2 0x7g e3 2 12.5e ‘105’ “35′53” 3+5 0 35 7″ π e ‘ab’ 0x2.5b 03e5 ±7f 7ff 2e-310 1.3 1g3 2.7 下面语句的执行结果是什么 (1) printf(“07 abc11 de12 fghxa”); (2) printf(“
”); (3) printf(“
why is 21+31 equal to %d
”,21+31); (1) 07 执行响铃,然后输出 abc;11 执行 tab 键的功能;12 为换行;xa 也为 换行; (2) 换行然后输出 abc,执行 tab 键,输出 de,换行输出 fgh,再换行; (3) 换行后,输出 why is 21+31 equal to 52 然后两次换行。 2.8 在下列符号中,你可以选用哪些作变量名哪些不可以为什么 a3b 3ab π +a b *x s b5 if next day e2 ok intger maxnumber i*j 可作变量名的有: a3b s next intger maxnumber 2.9 写出下面程序段执行后变量 a,b,c 的值。 char a=’2’,b=’a’; c=a+b; a=c; a 的 ascii 码为 147,为图形符号 ;b 的值为’a’;c 的值为 147。 2.10 写出下面程序的输出结果。 main() { x=-3+4*5-6; printf(“%d
”,x); x=3+4%5-6; printf(“%d
”,x); x=-3*4%-6/5; printf(“%d
”,x); x=(7+6)%5/2; printf(“%d
”,x); } 11 1 0 1 2.11 写出下面程序的输出结果。 main() { printf(“%d%d%d%d
”,1+2,5.2,-2*4,11%3); printf(“%.5f%.5f%.5f
”,1.+2.,5.12,-2.*4.); } 32-82 3.00-8. 写出下面程序的执行结果。 int main() { int x=2,y,z; x*=3+2; printf(&%d
&,x); x*=y=z=4; printf(&%d
&,x); x=y=1; z=x++-1; printf(&%d,%d
&,x,z); z+=-x+++(++y); printf(&%d,%d
&,x,z); return 0; } 10 40 2,0 3,0 2.13 写出下面程序的运行结果。 int main() { int x=40,y=4,z=4; x=y==z; printf(&%d
&,x); x=x==(y-z); printf(&%d
&,x); return 0; } 1 0 2.14 写出下面程序的执行结果。 int main() { int x,y,z; x=y=z=3; y=x++-1; printf(&%d %d &,x,y); y=++x-1; printf(&%d %d &,x,y); y=z--+1; printf(&%d %d &,x,y); y=z--+1; printf(&%d %d &,x,y); y=--z+1; printf(&%d %d &,x,y); return 0; } 4 2 5 4 2 4 1 2.15 写出下面程序的输出结果。 int main() { int i,j; i=16; j=(i++)+i; printf(&%d
&,j); i=15; printf(&%d %d
&,++i,i); i=20; j=i--+i; printf(&%d
&,j); i=13; printf(&%d %d
&,i++,i); return 0; } 32 16 15 40 13 132 2.16 写出下列表达式的值。 (1) 1&4 && 4&7 (2) 1&4 && 7&4 (3) !(2&5==5) (4) !(1&3)||(2&5) (5) !(4&=6) && (3&=7) (1) 1 (2) 0 (3) 0 (4) 1 (5) 0 2.17 写出下面程序的输出结果。 int main() { int x,y,z; x=y=z=0; ++x||++y&&++z; printf(&x=%d y=%d z=%d
&,x,y,z); x=y=z=0; ++x&&++y||++z; printf(&x=%d y=%d z=%d
&,x,y,z); x=y=z=0; ++x&&++y&&++z; printf(&x=%d y=%d z=%d
&,x,y,z); x=y=z=-1; ++x&&++y&&++z; printf(&x=%d y=%d z=%d
&,x,y,z); x=y=z=-1; ++x&&++y||++z; printf(&x=%d y=%d z=%d
&,x,y,z); x=y=z=-1; ++x||++y&&++z; printf(&x=%d y=%d z=%d
&,x,y,z); return 0; } x=1 y=0 z=0 x=1 y=1 z=0 x=1 y=1 z=1 x=0 y=-1 z=-1 x=0 y=-1 z=0 x=0 y=0 z=-1 2.18 用 c 语言描述下列命题。 (1) a 小于 b 或者小于 c。 (2) a 或 b 都小于 c。 (3) a 或 b 中有一个小于 c。 (4) a 非负整数。 (5) a 是奇数。 (6) a 不能被 b 整除。 (7) 角 a 在第一或第三象限。 (8) a 是一个带小数的正数,而 b 是一个带小数的负数。 (1) a&b||a&c (2) a&c&&b&c (3) a&c||b&c (4) (fmod(a,1)==0)&&(a&=0),函数 fmod(a,1)的作用是求整除 a/1 的余数 (5) fmod(a,2)==1 (6) fmod(a,b)!=0 (7) (a&=0&&a&=pi/2)||(a&=pi&&a&=pi*3.2) (8) (floor(a)!=a&&a&0)&&(floor(b)!=b&&b&0),函数 floor(a)的作用是求出不大于 a 的最大整数。 2.19 写出下面程序的输出结果。 int main() { int x=1,y=1,z=1; y=y+z; x=x+y; printf(&%d
&,x&yy:x); printf(&%d
&,x&yx++:y++); printf(&%d
&,x); printf(&%d
&,y); x=3; y=z=4; printf(&%d
&,(x&=z&=x)1:0); printf(&%d
&,z&=y&&y&=x); return 0; } 3 2 3 3 0 1 2.20 若 x=3,y=z=4,求下列表达式的值。 (1) (z&=y&=x)1:0 (2) z&=y&&y&=x (1) 0 (2) 1 2.21 若 x=3,y=2,z=1,求下列表达式的值。 (1) x&yy:x (2) x&yx++:y++ (3) z+=x&yx++:y++ (1) 3 (2) 2 (3) 3 2.22 写出下面程序的输出结果。 int main() { int x=1,y=2,z=3; x+=y+=z; printf(&%d &,x&yy:x); printf(&%d &,x&yx++:y++); printf(&%d &,x); printf(&%d &,y); printf(&%d
&,z+=x&yx++:y++); printf(&%d %d &,y,z); x=3; y=z=4; printf(&%d &,(z&=y&x)1:0); printf(&%d
&,z&=y&&y&=x); return 0; } 6 5 6 6 9 7 9 0 1 2.23 用条件表达式描述: (1) 取三个数中的最大者。 (2) 任意两数存放在变量 c1 与 c2 中,让小数存放在 c1 中,大数存放在 c2 中,并输 出大数。 (1) 设三个数分别为 a,b,c,表达式如下: (max1=(a&b)a:b)&cmax1:c (2) 设任意两数分别为 a,b,表达式如下: c2=(a&b)a:b; c1=(a&b)a:b; printf(“%d
”,c2); 2.24 编写一个程序打印出下面的内容。 tel: int main() { long b=351; char ch='-'; long c=774545; printf(&tel: 0%ld%c%ld
&,b,ch,c); return 0; } 2.25 写出下面程序的输出结果。 int main() { int i=128; float x=234.89; double y=-123.4567; char ch='*'; printf(&%d%f%lf
&,i,x,y); printf(&%.3f%.3e
&,x,x); printf(&%08.3f%08.3e
&,x,x); printf(&%g%f%e
&,y,y,y); printf(&%6c%c%c%d%%
&,ch,ch,ch,i); return 0; } 999-123..2 9e+002 -123.457-123..2 ***128% 2.26 有一字符串 s 的值为”abcdefghijkl”,写出执行完下面的程序段后的输出结果。 int main() { char s[]=&abcdefghijkl&; printf(&%%%20s%%
&,s); printf(&%%%-20s%%
&,s); printf(&%%%020s%%
&,s); printf(&%%%-020s%%
&,s); return 0; } % abcdefghijkl% %abcdefghijkl % %abcdefghijkl% %abcdefghijkl % 2.27 写出下面程序的输出结果。 int main() { c='a'; i=65; printf(&c:dec=%d oct=%o hex=%x ascii=%c
&,c,c,c,c); printf(&i:dec=%d oct=%o hex=%x unsigned=%u
&,i,i,i,i); c='x'; i=-4; printf(&c:dec=%d oct=%o hex=%x ascii=%c
&,c,c,c,c); printf(&i:dec=%d oct=%o hex=%x unsigned=%u
&,i,i,i,i); return 0; } c:dec=65 oct=101 hex=41 ascii=a i:dec=65 oct=101 hex=41 unsigned=65 c:dec=120 oct=170 hex=78 ascii=x i:dec=-4 oct=177774 hex=fffc unsigned= 指出下面程序段中的错误,并改正。 int main() { seanf(&%c%d%c%f;c,b,a,b); return 0; } scanf(&%c%f%d%f
”,&c,&b,&a,&b); 2.29 当输入流为”a72”时,执行下面的程序段。 int i,j; float x,y; scanf(&%2d%f%f%c%d&,&i,&x,&y,&c,&j); 56, 789.345.000000, a, 72 2.30 请说明 c 语言的数据类型,并指出 c 语言有哪些特点 整型&&&&字符型 单精度型 基本类型&&&&实型 浮点型
枚举类型 数据类型 数组类型
构造类型结构体类型
共用体类型
空类型c 语言的数据类型丰富,功能强。c 语言兼有高级语言和低级语言的功能,灵活方便。 缺点是较复杂,危险性高,不易掌握。 2.31 c 语言为什么要规定对所有的变量要“先定义,后使用”这样做有什么好处 (1) 因为如果不加定义,就无从知道标识符是变量还是别的程序实体; (2) 如果不加定义,就不知道它的类型,也就无法为其分配指定大小的存储单元; (3) 如果不加定义,就无法在编译阶段对其进行检查,以确定其合法性。 2.32 请将下面各数用八进制和十六进制数表示: (1) 10 (2) 32 (3) 75 (4) –617 (5) –111 (6) 2483 (7) –2003 (1) 012 0xa (2) 040 0x20 (3) b (4)
0xfffffd97 (5)
0xffffff61 (6) b3 (7)
0xffffb 2.34 写出以下程序的运行结果。 int main() { char c1='a',c2='b',c3='c',c4='101',c5='116'; printf(&a%cb%c c%c abc
&,c1,c2,c3); printf(& %c %c
&,c4,c5); return 0; } aabb cc abc a n 2.35 要将“china”译成密码,密码规律是:用原来的字母后面第 4 个字母代替原来的字 母。例如,字母“a”后面第 4 个字母是“e” ,用“e”代替“a” 。因此, “china”应译为 “glmre” 。请编一程序,用赋初值的方法使 c1,c2,c3,c4,c5 五个变量的值分别为‘c’ , ‘h’ , ‘i’ , ‘n’ , ‘a’ ,经过运算,使 c1,c2,c3,c4,c5 分别变为‘g’ , ‘ l’ , ‘ m’ , ‘ r’ , ‘e’ ,并输出。 int main() { char c1,c2,c3,c4,c5; printf(&请输入五个字符:&); scanf(&%c %c %c %c %c&,&c1,&c2,&c3,&c4,&c5); c1+=4; c2+=4; c3+=4; c4+=4; c5+=4; printf(&加密后的结果为:%c%c%c%c%c
&,c1,c2,c3,c4,c5); return 0; } 2.36 程序能否写成如下形式: int main() { int c1,c2; c1=97; c2=98; printf(&%c %c
&,c1,c2); return 0; } 程序输出 a b 2.37 求下面算术表达式的值。 (1) x+a%3*(int)(x+y)%2/4 设 x=2.5,a=7,y=4.7 (2) (float)(a+b)/2+(int)x/y 设 a=2,b=3,x=3.5,y=2.5 (1) 2.) 3..38 写出以下程序的运行结果。 int main() { int i,j,m,n; i=8; j=10; m=++i; n=j++; printf(&%d,%d,%d,%d
&,i,j,m,n); return 0; } 9,11,9,10 2.40 写出下面表达式运算后 a 的值,设原来 a=12。 (1) a+=a (2) a-=2 (3) a*=2+3 (4) a%=(n%=2)(设 n 的值等于 5) (5) a/=a+a (6) a+=a-=a*=a (1) 24 (2) 10 (3) 60 (4) 0 (5) 0 (6) 0 2.41 什么是算术运算什么是关系运算什么是逻辑运算 算术运算:+ - * / % ++ -关系运算:& & == &= &= != 逻辑运算:! && || 2.42 c 语言中如何表示真假系统如何判断一个量的真假 c 语言用整数 1 和 0 表示真假 2.43 写出下面各逻辑表达式的值,设 a=3,b=4,c=5。 (1) a+b&c && b==c (2) a||b+c && b-c (3) !(a&b) && !c && !1 (4) !(x=a) && (y=b) && 0 (5) !(a+b)+c-1 && b+c/2 (1) 0 (2) 1 (3) 0 (4) 0 (5) 1 2.44 c 语言为什么要把输入输出的功能用函数来实现,而不作为语言的基本部分 因为输入输出的对象是数据, 而数据是以介质为载体的, 因此进行输入输出就要与各种外部 设备打交道。 由于不同的系统进行输入输出的差异较大, 所以必须使用函数和操作系统进行 交互,以便存取不同的设备文件。 2.45 若 a=3, b=4, c=5, x=1.2, y=2.4, z=-3.6, u=51274, n=128765, c1=’a’, c2=’b’。 想得到以下的输出格式和结果,请写出程序。 要求输出结果如下: a= 3 b= 4 c= 5 x=1.200000,y=2.400000,z=-3.600000 x+y= 3.60 y+z=-1.20 z+x=-2.40 u= 51274 n= =’a’ or 97(ascii) c2=’b’ or 98(ascii) int main() { int a=3,b=4,c=5; double x=1.2,y=2.4,z=-3.6; unsigned int u=51274,n=128765; char c1='a',c2='b'; printf(&a=%2d b=%2d c=%2d
&,a,b,c); printf(&x=%f,y=%f,z=%f
&,x,y,z); printf(&x+y=%5.2f y+z=%5.2f z+x=%5.2f
&,x+y,y+z,z+x); printf(&u=%6u n=%10u
&,u,n); printf(&c1=%c or %d(ascii)
&,c1,c1); printf(&c2=%c or %d(ascii)
&,c2,c2); return 0; } 2.46 请写出下面程序的输出结果: int main() { int a=5,b=7; float x=67.8564,y=-789.124; char c='a'; long n=1234567; unsigned u=65535; printf(&%d%d
&,a,b); printf(&%3d%3d
&,a,b); printf(&%f,%f
&,x,y); printf(&%-10f,%-10f
&,x,y); printf(&%8.2f,%8.2f,%.4f,%.4f,%3f,%3f
&,x,y,x,y,x,y); printf(&%e,%10.2e
&,x,y); printf(&%c,%d,%o,%x
&,c,c,c,c); printf(&%ld,%lo,%x
&,n,n,n); printf(&%u,%o,%x,%d
&,u,u,u,u); printf(&%s,%5.3s
&,&computer&,&computer&); return 0; } 57 5 7 67.9..856400 ,-789..86, -789.12,67.40,67.9..1,-7.89e+002 a,65,101,41
,ffff,65535 computer, com 2.47 用下面的 scanf 函数输入数据,使 a=3,b=7,x=8.5,7=71.82,c1=’a’,c2=’a’, 问在键盘上如何输入 int main() { int a,b; float x,y; char c1,c2; scanf(&%d %d %f %f %c %c&,&a,&b,&x,&y,&c1,&c2); printf(&%d %d
&,a,b); printf(&%f %f
&,x,y); printf(&%c %c
&,c1,c2); return 0; } 2.48 用下面的 scanf 函数输入数据, 使 a=10, b=20, c1=’a’, c2=’a’, x=1.5, y=-3.75, z=67.8,请问在键盘上如何输入数据 int main() { int a,b; char c1,c2; float x,y,z; scanf(&%d %d %c %c %f %f %f&,&a,&b,&c1,&c2,&x,&y,&z); printf(&%d %d
&,a,b); printf(&%f %f %f
&,x,y,z); printf(&%c %c
&,c1,c2); return 0; } 2.49 设圆半径 r=1.5,圆柱高 h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体 积。用 scanf 输入数据,然后输出计算结果。输出时要求有文字说明并取小数点后两位数 字,请编程序。 #define pi 3.1415926 int main() { double r,h; scanf(&%lf %lf&,&r,&h); printf(&圆的周长=%.2f
&,2*pi*r); printf(&圆的面积=%.2f
&,pi*r*r); printf(&圆球表面积=%.2f
&,pi*r*r/6); printf(&圆球体积=%.2f
&,4*pi*r*r*r/3); printf(&圆柱体积=%.2f
&,pi*r*r*h); return 0; } 2.50 输入一个华氏温度的取值 f,要求输出摄氏温度的取值 c。公式为 c=5(f-32)/9 输出要有文字说明,取两位小数。 #include&stdio.h& double centigradetemperture(double fahrenheit); int main() { printf(&请输入华氏温度:&); scanf(&%lf&,&f); printf(&摄氏温度为%.2f
&, centigradetemperature(f)); return 0; } double centigradetemperature(double fahrenheit) { return 5*(fahrenheit-32)/9; } 2.51 编程序:用 getchar 函数读入两个字符 c1,c2,然后分别用 putchar 函数和 printf 函数输出这两个字符,并思考以下问题:(1)变量 c1,c2 应定义为字符型还是整型,或二 者皆可(2) 要求输出 c1 和 c2 的 ascii 码,应如何处理用 putchar 函数还是 printf 函 数(3) 整型变量与字符变量是否在任何情况下都可以互相代替如: char c1,c2; 与 int c1,c2; 是否无条件等价 int main() { char c1,c2; c1=getchar(); c2=getchar(); putchar(c1); putchar(c2); printf(&
&,c1,c2); return 0; } (1) 二者皆可。 (2) 用 printf 函数将 printf(&
&,c1,c2)改成 printf(&
&,c1,c2)即可。 (3) 不是,整型可以代替字符型,但字符无法完全替代整型。 第3章3.1 写出下面程序的执行结果。 int main() { int value1,value2, value1=50; value2=25; sum=value1+value2; printf(&the sum of %d and %d is %d
&,value1,value2,sum); return 0; } the sum of 50 and 25 is 75 3.2 请设计下列算法: (1) 有两盘磁带,a 录英语,b 录音乐,把它们交换过程。 (2) 依次输入 10 个数,找出最大数。 (3) 把三个任意数按大小顺序排列。 (4) 判断一个整数 n 能否倍和 5 整除。 (5) 求两个正整数 m 和 n 的最大公约数。 (1) int a,b,c; c=a; a=b; b=c; (2) int max(int a[],n) { for(i=0;i&n;i++) if(a&a[i) a=a[i]; } (3) int main() { int a,b,c; scanf(&%d %d %d&,&a,&b,&c); if(a&b){ if(a&c) if(b&c) printf(&%d %d %d&,a,b,c); else printf(&%d %d %d&,a,c,b); else printf(&%d %d %d&,c,a,b); } else{ if(b&c) if(a&c) printf(&%d %d %d&,b,a,c); else printf(&%d %d %d&,b,c,a); else printf(&%d %d %d&,c,b,a); } return 0; } (4) int main() { scanf(&%d&,&a); if(a%3 && a%5) printf(&不能被 3 和 5 整除
&); else if(a%3) printf(&不能被 3 整除但可以被 5 整除
&); else if(a%5) printf(&不能被 5 整除但可以被 3 整除
&); else printf(&既可以被 3 整除也可以被 5 整除
&); return 0; } (5) int maxsamenum(int m,int n) { int u,v,r; u=m; v=n; if(u*v!=0) { while(r=u%v) { u=v; v=r; } } else return 0; } 3.3 有下列条件语句: if(a&b) if(c&d) x=1; else if(a&c) if(b&d) x=2; else x=3; else if(a&d) if(b&c) x=4; else x=5; else x=6; else x=7; (1) 把此语句写得逻辑关系更清晰一些。 (2) 检查其中有无多余的判断条件或矛盾的判断条件。 (3) 重写一个等效的、简洁的条件语句。 if(a&b){ if(c&d) x=1; else{ /* a&b d&=c */ if(a&c) /* a&b a&c d&=c */ if(b&d) x=2; /* a&b&d&=c */ else x=3; /* a&b a&c d&=c b&=d */ else{ /* d&=c&=a&b */ if(a&d) if(b&c) x=4; else x=5; else x=6; } } } else x=7; 检查: if(a&b){ if(c&d) x=1; else{ if(a&c) if(b&d) x=2; else x=3; else x=6; } } else x=7; 3.4 写出下面程序的执行结果。 int main() { int x,y=1,z; if(y!=0) x=5; printf(&x=%d &,x); if(y==0) x=3; else x=5; printf(&x=%d
&,x); z=-1; if(z&0) if(y&0)x=3; else x=5; printf(&x=%d
&,x); if(z=y&0) x=3; else if(y==0) x=5; else x=7; printf(&x=%d &,x); printf(&z=%d
&,z); if(x=z=y) x=3; printf(&x=%d &,x); printf(&z=%d
&,z); return 0; } x=5 x=5 x=3 x=7 z=-1 x=3 z=1 3.5 设计一个从五个数中取最大数及最小数的程序。 int main() { double n,max, printf(“enter 5 real numbers:
”); scanf(“%lf”,&n); max=n; min=n; while(scnaf(“%lf”,&n)!=eof){ if(n&max) max=n; if(n&min) min=n; } printf(“
max=%lf,min=%lf”,max,min); return 0; } 3.6 由键盘输入三个数,按降序打印此三数。 int main() { float a,b,c,x; printf(“
please enter 3 reals:
”); scanf(“%f %f %f”,&a,&b,&c); if(a&b){ x=a; a=b; b=x; } if(b&c) printf(“%f %f %f
”,a,b,c); else if(c&a) printf(“%f %f %f
”,c,a,b); else printf(“%f %f %f
”,a,c,b); return 0; } 3.7 设计一个判断输入年份是否闰年的 c 程序。 #include&stdio.h& int isleap(int year); int main() { printf(&请输入年份:&); scanf(“%d”,&year); if(isleap(year)) printf(&%d 是闰年!
&,year); else printf(&%d 不是闰年!
&,year); return 0; } int isleap(int year) { if(year%4==0 && year%100!=0 || year%400==0) return 1; else return 0; } 3.8 由键盘输入三个数,计算以这三个数为边长的三角形面积。 #include&stdio.h& #include&math.h& double triarea(double a,double b,double c); int main() { float a,b,c; printf(&请输入三角形的三个边长,中间用空格分隔:&); scanf(”%f %f %f”,&a,&b,&c); printf(&三角形的面积是%lf
&,triarea(a,b,c)); return 0; } double triarea(double a,double b,double c) { double s,s1; if((a+b)&c && (b+c)&a && (c+a)&b){ s=(a+b+c)/2; s1=s*(s-a)*(s-b)*(s-c); s=sqrt(s1); } else return 0; } 3.9 由键盘输入一个数,打印出它的类型标识符。 int main() { printf(“
please enter 1 number:”); c=getchar(); while(c!=
){ if(c==.) label =1; c=getchar(); } if(label==1) printf(“
float”); else printf(“
int”); return 0; } 3.10 指出下面程序的打印结果。 int main() { int n=0; while(n++&=1) printf(“%d ”,n); printf(“%d
”,n); return 0; } 1 2 3 3.11 把下列程序改写得更合理。 (1) while(a){ if(b) } (2) do{ if(!a) }while(a) (1) while(a){ if(!b) } (2) do{ if(a){ b; } }while(a) 3.12 指出下面三个程序的功能。当输入为“quert”时,它们的执行结果是什么 (1) int main() { c=getchar(); while(c!=){ putchar(c); c=getchar(); } return 0; } (2) int main() { while((c=getchar())!=) putchar(++c); } (3) int main() { while(putchar(gechar())!=); } (1)的功能是显示从键盘输入的每一个字符,当输入时结束。当输入“ quwet”时,执行 结果是 quwet。 (2)的功能是显示从键盘输入的每一个字符的下一个字符, 当输入时结束。 当输入 “quwet” 时,执行结果是 rvfsu。 (3)的功能与(1)相同,但输出结果多一个。 3.13 把由键盘输入的数列(如 1,3,5,7,9,…)按相反的顺序输出。 #include&stdio.h& #define n 100 int main() { int a[n]; printf(&请输入数列的长度:&); scanf(“%d”,&k); printf(&请输入数列各元素:
&); for(i=0;i&k;i++) scanf(“%d”,&a[i]); for(i=k;i&0;i--) printf(“%d
”,a[i-1]); return 0; } 3.14 打印 ascii 码值为 32~255 的 ascii 码值、字符对照表。 int main() { for(i=32;i&256;i++){ if(i%8==0) printf(“
”); printf(&4d %c&,i,i); } return 0; } 3.15 打印形状为直角三角形的九九表。 int main() { int i,j; printf(&*&); for(i=1;i&10;i++) printf(&%4d&,i); printf(”
”); for(i=1;i&10;i++){ printf(”%2d”,i); for(j=1;j&=i;j++) printf(“%4d”,j*k); printf(“
”); } return 0; } 3.16 计算 e 的值。 e=1 + 1/1! + 1/2! + 1/3! + … 使误差小于给定的精度δ 。 #include&stdio.h& #define n 1000 #define m ((n-1)/3+1) int e[m]={1};//每次计算三位 void mdiv(int m,int e[]); int main() { for(i=n;i&=1;i--){ mdiv(i,e); e[0]++; } printf(&e=%d.&,e[0]); for(i=1;i&=m;i++){ if(e[i]&10) printf(&00%d&,[i]); else if(e[i]&100) printf(&0%d&,e[i]); else printf(&%d&,e[i]); printf(& &); } printf(&
&); return 0; } void mdiv(int m,int e[]) { long int rem=0,d; for(int i=0;i&=m;i++){ d=e[i]; e[i]=(d+rem)/m; rem=(d+rem)%m*1000; } } 3.17 递增的牛群:若一头母牛,从第四年开始每年生一头母牛。按此规律,第 n 年时有多 少头母牛 #include &stdio.h& #define n 20 int main() { int a[n]; a[0]=1; a[1]=1; a[2]=1; a[3]=2; /*从第 i 年开始,三年前的小牛已可以生产,即 a[i-3]属于可生产牛, 则第 i 年将新增小牛数 a[i-3]头。 将上年(i-1 年)牛的总数 a[i-1]加上新生小牛数 a[i-3], 即为第 i 年牛的总数 a[i-1]+a[i-3]=a[i]。*/ for(i=3;i&n;i++) a[i]=a[i-3]+a[i-1]; for(i=0;i&n;i++) printf(&%d
&,a[i]); return 0; } 3.18 把一元人民币换成 5 分、2 分和 1 分的硬币,有多少种换法 #include &stdio.h& int main() { int x,y,z; int total=100; int times=0; for(x=0;x&=total/5;x++){ for(y=0;y&=(total-5*x)/2;y++){ z=total-5*x-2*y; times++; printf(&%d 个 5 分,&,x); printf(&%d 个 2 分,&,y); printf(&%d 个 1 分
&,z); } } printf(&共有%d&种换法
&,times); return 0; } 3.19 百马百担问题。有 100 匹马,驮 100 担货,大马驮 3 担,中马驮 2 担,两个小马驮 1 担。问有大,中,小马各多少匹 int main() { int x,y,z; int horsetotalnum=100; int burdentotalnum=100; int times=0; for(x=0;x&=horsetotalnum/3;x++) for(y=0;y&=(horsetotalnum-3*x)/2;y++) for(z=0;z&=100;z++){ if(x+y+z==horsetotalnum && 6*x+4*y+z==2*burdentotalnum){ times++; printf(&大马%d 个,&,x); printf(&中马%d 个,&,y); printf(&小马%d 个
&,z); } } printf(&共有%d 种组合
&,times); return 0; } 3.20 车票问题。某铁路线上共有 10 个车站,问需准备几种车票 int main() { int i,j,station,total=0; printf(&请输入车站的数量:&); scanf(“%d”,station); for(i=1;i&i++) for(j=i;j&j++) total+=2; printf(&共需%d 种车票
&,total); return 0; } 3.21 验证欧拉公式 a(n)=n*n-n+41 是-39~40 之间的素数通项公式 #include&stdio.h& #include&math.h& int main() { int i,j,p; for(i=-39; ;i++){ p=i*i-i+41; printf(&n=%d p=(%d)*(%d)-(%d)+41=%d ”,n,n,n,n,p); for(j=2;j&=sqrt((double)p);j++) if(!(p%j)){ printf(&error
&); return 0; } printf(&ok
&); } return 0; } 3.22. 延长数列。将下列数列: 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,1,5,10,10,5,1,… 延长到 55 个。 int main() { int a[60]; int i,j,k=0; for(i=1; ;i++){ if((k+1)&55) a[k+1]=1; for(j=2;j&i;j++){ if((k+j)&55) a[k+j]=a[k-(i-1)+(j-1)]+a[k-(i-1)+j]; } if((k+j)&55) a[k+=i]=1; } for(i=1;i&=55;i++) printf(“%4d”,a[i]); return 0; } 3.23 吉普车穿越沙漠问题。 用一辆吉普车穿越 1000 公里的沙漠。 吉普车的总装油量为 500l, 耗油量为 1l/km。由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时加油库。该吉普 车要以最少的油耗穿越沙漠,应在什么地方建立临时油库,以及在什么地方安放多少油最 少 int main() {//倒数第 k 个站点//当前站点离终点的距离//下一站点离本站的距离//当前站点的储油量 //显然,算法结束的条件是,当前站点离终点的距离 distation&1000 //倒数第一个站点的初条件是 k=0; distation=0; total=0; //从下一站点到本站的距离为 x, //从下一站点跑到本站点 k 需要跑 2k+1 次 x 距离, //用以保证本站点有足够的油量储备 //下一站点的油量储备应为 500*(k+1),或者本站点的油量储备为 500k while(distation&1000){ //显示当前站点号,当前站点离终点距离,当前站点储油量 printf(&倒数第%d 个站点,&,k); printf(&该站点距终点的距离为%lfkm&,distation); printf(&当前站点油量储备为%ld
&,total); x=500.0/(2*k+1); distation=distation+x; total=total+500; k++; } //当前站点已经越过起点,所以应回到前一站点重新计算 distation=distation-x; total=total-500; k--; x=1000- distation=distation+x; total=total+(2*k+1)*x; printf(&倒数第%d 个站点,&,k); printf(&该站点距终点的距离为%lfkm &,distation); printf(&当前站点油量储备为%lf 升
&,total); return 0; } 3.24. 印度国王的奖励。相传古代印度国王奖励他的聪明能干的宰相达依尔(国际象棋的发 明者),问他要少摸达依尔回答: “陛下只要在国际象棋棋盘的第一个格子上放一粒麦子, 第二个格子上放二粒麦子,以后每个格子的麦子都按前一格的两倍计算,如果陛下按此法 给我 64 格的麦子,我就感激不尽,其他什么也不要了。 ”国王想: “这还不容易! ”就让人 扛了一袋麦子,但很快用光了,再扛出一袋还不够,请您为国王算一算共要给达依尔多少 8 小麦(设一立方小麦约 1.4×10 粒) int main() { int i, double wheattal=0; double wheatfnu=1; printf(&请输入棋盘格数:&); scanf(“%d”,frame); for(i=0;i&i++){ wheattal+= wheatfnu+= } printf(&小麦的总量约为%lf
&,wheattal/1.4e8); return 0; } 3.25 输入两个正整数 m 和 n,求其最大公约数和最小公倍数。 int greatestcommondivisor(int m,int n) /*返回最大公约数*/ { int u,v,r; if(m==0 || n==0) return 0; u=m; v=n; while(r=u%v){ u=v; v=r; } } int leastcommonmultiple(int m,int n) /* 返回最小公倍数 */ { u=greatestcommondivisor(m,n); if(!u) return 0; return u*(m/u)*(n/u); } 3.26 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 #define n 100 int main() { char s[n]; char *p; int i=0,j=0,k=0,m=0; gets(s); p=s; while(*p!=''){ if(*p&123 && *p&64) i++; else if(*p==32) j++; else if(*p&58 && *p&47) k++; else m++; p++; } printf(&英文字符个数为:%d
&,i); printf(&空格数为:%d
&,j); printf(&数字个数为:%d
&,k); printf(&其它字符个数为:%d
&,m); return 0; } 3.27 求 sn=a + aa + aaa + … + aa…a (n 个 a)之值,其中 a 是一个数字。 long int sumofaa(int a,int k) { if(a&1 || k&1) return 0; if(k==1) else return 10*(sumofaa(a,k-1)-sumofaa(a,k-2))+a+sumofaa(a,k-1); } 3.28 求 n! (即求 1!+2!+3!+…+20!)。n 120long int sumofrfact(int k) { if(k&1) return 0; else if(k&2) return 1; else return k*(sumofrfact(k-1)-sumofrfact(k-2))+sumofrfact(k-1); } 3.29 求100 50 10k
k 1 k 11 k 1 klong int sumofk(int k) { int i,sum=0; if(k&1) return 0; for(i=1;i&=k;i++) sum+=i; } long int sumofk2(int k) { int i,sum=0; if(k&1) return 0; for(i=1;i&=k;i++) sum+=i*i; } double sumofk1(int k) { double sum=0.0; if(k&1) return 0; for(i=1;i&=k;i++) sum+=1.0/i; } 3.30 打印出所有“水仙花数” 。所谓水仙花数是指一个三位数,其各位数字立方和等于该 3 3 3 数本身。例如,153=1 +5 +3 。 int main() { int i=0; int x,y,z; for(x=1;x&10;x++) for(y=0;y&10;y++) for(z=0;z&10;z++) if(x*x*x+y*y*y+z*z*z==x*100+y*10+z){ printf(&%d
&,x*100+y*10+z); i++; } printf(&共有%d 个水仙花数
&,i); return 0; } 3.31 一个数如果恰好等于它的因子之和,这个数就称之为“完数” 。例如,6 的因子为 1, 2,3,而 6=1+2+3,因此 6 是“完数” 。编程序找出 1000 之内的所有完数。并按下面的格式 输出其因子。 #define n 1000 int allfactors(int a[],int k); int overnum(int k); int main() { int i,k=0; for(i=1;i&=n;i++){ if(overnum(i)){ printf(&%d is overnum
&,i); k++; } } printf(&there are %d overnums
&,k); return 0; } /* 求 k 的所有因子,因子保存在数组 a 中,返回因子的个数 */ int allfactors(int a[],int k) { int m=1;/* 用以记录因子的个数 */ if(k&1) return 0; a[0]=1; for(i=2;i&k;i++){ if(k%i==0){ /* i 是因子 */ a[m++]=i; /* 因子送数组保存 */ } } } int overnum(int k) { int a[100]; int j,m; int sum=0; m=allfactors(a,k);/* 记录因子个数 */ for(j=0;j&m;j++) sum=sum+a[j]; /* 求出各因子的累加和 */ if(k==sum) /* 是完数 */ return 1; else return 0; } 3.32 有一分数序列: 2 3 5 8 13 21 , , , , , ,… 1 2 3 5 8 13求出这个序列的前 20 项之和。 #define n 20 double sumfractions(int k); int main() { printf(&%lf
&,sumfractions(n)); return 0; } double sumfractions(int k) { double sum=0.0; double a=2.0,b=1.0, for(i=0;i&k;i++){ sum=sum+a/b; temp=a; a=a+b; b= } } 3.33 一个球从 100 米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第 10 次落地时,共经过多少米第 10 次反弹多高 double totaldistance(double height,double times,double ratio); double reboundingdistance(double height,double times,double ratio); int main() { double height,times, printf(&请输入小球的高度,反弹次数,反弹高度比例:&); scanf(&%lf%lf%lf&,&height,&times,&ratio); printf(&反弹的总距离为%lf 米
&,totaldistance(height,times,ratio)); printf(& 最 后 一 次 反 弹 的 高 度 为 %lf 米
&,reboundingdistance(height,times,ratio)); return 0; } double totaldistance(double height,double times,double ratio) { double sum=0.0; h= for(i=0;i&i++){ if(i==0) sum=sum+h; else sum=sum+2*h; h=h* } } double reboundingdistance(double height,double times,double ratio) { h= for(i=0;i&i++){ h=h* } } 3.34 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一 个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。已经每天早上都吃了前一天剩 下的一半零一个。 到第 10 天早上再想吃时, 见只剩下一个桃子了。 求第一天共摘多少桃子 int monkeyeatpeach(int days); int main() { printf(&请输入猴子吃桃的天数:&); scanf(&%d&,&days); printf(&猴子总共摘了%d 个桃子
&,monkeyeatpeach(days)); return 0; } int monkeyeatpeach(int days) { int i,sum=1; for(i=0;i&i++) sum=2*(sum+1); } 3.35 用迭代法求 x= a 的近似根。求平方根的迭代公式为x n 1 1 a
-5要求前后两次求出的 x 的误差的绝对值小于 10 。 double approximatesqrtroot(double a,double precision); int main() { double a, printf(&请输入欲求平方根的数及精度:&); scanf(&%lf%lf&,&a,&prec); printf(&%lf 的平方根近似为%lf
&,a,approximatesqrtroot(a,prec)); return 0; } double approximatesqrtroot(double a,double precision) { double x1=a,x2; x2=(x1+a/x1)/2; if(a&0) exit(0); while(fabs(x1-x2)&precision){ x1=x2; x2=(x1+a/x1)/2; } return x2; } 3.36 用牛顿迭代法求方程在 1.5 附近的根。 3 2 2x -4x +3x-6=0 /* 牛顿迭代法解方程 */ double newtonsolvingequation(double x,double precision) { double x1,x2; x1=x; x2=x1-func1(x1)/dfunc1(x1); while(fabs(x1-x2)&precision){ x1=x2; x2=x1-func1(x1)/dfunc1(x1); } return x2; } double func1(double x)/* 方程 f(x)=0 的函数 f(x) */ { return 2*x*x*x-4*x*x+3*x-6; } double dfunc1(double x)/* f(x)的导函数 */ { return 6*x*x-8*x+3; } 3.37 用二分法求方程在(-10,10)之间的根。 3 2 2x -4x +3x-6=0 /* 二分法解方程 */ double binarysolvingequation(double x1,double x2,double precision) { double a,b,c; a=x1; b=x2; while(fabs(a-b)&precision){ c=(a+b)/2; if(func1(c)*func1(a)&0) b=c; else a=c; } } double func1(double x)/* 方程 f(x)=0 的函数 f(x) */ { return 2*x*x*x-4*x*x+3*x-6; } 3.38 打印出以下图案。 * *** ***** ******* ***** *** * void showspace(int k); int main() { int i,j; int bl,/* bl 为起始位置,el 为本行图案长度 */ scanf(&%d&,&maxstarnum); if(maxstarnum%2==0) return 0;/* 最大长度不是奇数,不符合题意退出 */ for(i=0;i&i++){ if(i&=maxstarnum/2){/* 计算上半区每行图案起始位置和长度 */ bl=maxstarnum/2-i; el=2*i+1; } else{/* 计算下半区每行图案起始位置和长度 */ bl=i-maxstarnum/2; el=maxstarnum-(2*(i-maxstarnum/2)); } showspace(bl);/* 图案前的空格数 */ for(j=j&bl+j++) printf(&*&);/* 显示每行图案 */ printf(&
&); } return 0; } void showspace(int k) { int i=0; while(i++&k) printf(& &); } 3.39 两个乒乓球队进行比赛,每队各出三人。甲队为 a,b,c 三人,乙队为 x,y,z 三人。 已抽签决定比赛名单。有人向队员打听比赛名单,a 说他不和 x 比,c 说他不和 x,z 比, 请编程序找出三对赛手的名单。 int main() { char a,b,c; for(a='x';a&='z';a++) for(b='x';b&='z';b++) for(c='x';c&='z';c++) if(a!='x' && c!='x' && c!='z' && a!=b && b!=c && c!=a) printf(&a vs %c, b vs %c, c vs %c
&,a,b,c); return 0; } 3.40 有三个整数 a,b,c,由键盘输入,输出其中最大的数。 int max3(int a,int b,int c); int main() { int a,b,c; scanf(&%d%d%d&,&a,&b,&c); printf(&最大的数是%d
&,max3(a,b,c)); return 0; } int max3(int a,int b,int c) { temp=a&ba:b; return temp&ctemp:c; } 3.41 有一函数:x
10 编写一程序,输入 x,输出 y 值。 double funcy(double x); int main() { double x,y; scanf(&%lf&,&x); y=funcy(x); printf(&最大的数是%lf
&,y); return 0; } double funcy(double x) { if(x&1) else if(x&10) return 2*x-1; else return 3*x-11; } 3.42 给出百分制成绩,要求输出成绩等级’a’,’b’,’c’,’d’,’e’。90 分以上为’a’, 81~89 分为’b’,70~79 分为’c’,60~69 分为’d’,60 分以下为’e’。 int main() { scanf(&%lf&,&score); if(score&100 || score&0) return 0; if(score&=90) printf(&a
&); else if(score&=80) printf(&b
&); else if(score&=70) printf(&c
&); else if(score&=60) printf(&d
&); else printf(&e
&); return 0; } 3.43 给一个不多于 5 位的正整数,要求:(1) 求出它是几位数;(2) 分别打印出每一位数 字;(3) 按逆序打印出各位数字,例如原数为 321,应输出 123。 int main() { int i,k; int a[5]; scanf(&%u&,&x); if(x&99999 || x&0) return 0; a[0]=x/10000; a[1]=(x-a[0]*1; a[2]=(x-a[0]*10000-a[1]*; a[3]=(x-a[0]*10000-a[1]*1000-a[2]*100)/10; a[4]=x-a[0]*10000-a[1]*1000-a[2]*100-a[3]*10; /* 求出它的几位数 */ printf(&(1):&); if(a[0]) printf(&5 位数
&); else if(a[1]) printf(&4 位数
&); else if(a[2]) printf(&3 位数
&); else if(a[1]) printf(&2 位数
&); else printf(&1 位数
&); /* 计算无效 0 的个数 */ k=0; while(k&5 && a[k]==0) k++; /* 打印每一位数字 */ printf(&(2):&); for(i=k;i&5;i++) printf(&%d &,a[i]); printf(&
&); /* 逆序打印每一位数字 */ printf(&(3):&); for(i=4;i&=k;i--) printf(&%d &,a[i]); printf(&
&); return 0; } 3.44 企业发放的奖金根据利润提成。利润(i)低于或等于 10 万元的,奖金可提 10%;利润 高于 10 万元,低于 20 万元(100000&i≤200000)时,低于 10 万元的部分按 10%提成,高于 10 万元的部分,可提成 7.5%;当 200000&i≤400000 时,高于 20 万元的部分按 5%提成;当 400000&i≤600000 时,高于 40 万元的部分按 3%提成;当 600000&i≤1000000 时,高于 60 万的部分按 1.5%提成;当 i≥1000000 时,超过 100 万元的部分按 1%提成。从键盘输入当 月利润 i,求应发奖金总数。 int main() { double i, printf(&请输入本月利润(万元):&); scanf(&%lf&,&i); if(i&0) return 0; if(i&=10) bouns=i*0.1; else if(i&=20) bouns=10*0.1+(i-10)*0.75; else if(i&=40) bouns=10*0.1+10*0.75+(i-20)*0.05; else if(i&=60) bouns=10*0.1+10*0.75+20*0.05+(i-40)*0.03; else if(i&=100) bouns=10*0.1+10*0.75+20*0.05+ 20*0.03+(i-60)*0.15; else bouns=10*0.1+10*0.75+20*0.05+ 20*0.03+40*0.15+(i-100)*0.01; printf(&本月总奖金数为%lf 万元
&,bouns); return 0; } 3.45 输入四个整数,要求按大小顺序输出 #define n 4 int bubble(int a[],int k); int main() { int a[n]; for(i=0;i&n;i++) scanf(&%d&,&a[i]); if(bubble(a,n)){ for(i=0;i&4;i++) printf(&%d &,a[i]); printf(&
&); } return 0; } int bubble(int a[],int k) { int i,j; int t, if(k&1) return 0; for(i=1;i&=k-1;i++){ t=k-i; for(j=0;j&=t-1;j++) if(a[j]&a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]= } } return 1; } 3.46 有四个圆塔,圆心分别为(2,2),(-2,2),(-2,-2),(2,-2),圆半径为 1,见图 3.12。 这四个塔的高度都为 10 米, 塔以外无建筑物。 今输入任一点的坐标, 求该点相应的高度(塔 外的高度为 0)。 double towerheight(double x,double y,double z); int main() { double x,y,z; scanf(&%lf %lf %lf&,&x,&y,&z); printf(&该点的高度为%lf
&,towerheight(x,y,z)); return 0; } double towerheight(double x,double y,double z) { if( (x-2)*(x-2)+(y-2)*(y-2)&=1 || (x+2)*(x+2)+(y-2)*(y-2)&=1 || (x-2)*(x-2)+(y+2)*(y+2)&=1 || (x+2)*(x+2)+(y+2)*(y+2)&=1 ) else return 0; } 第4章函 数4.1 指出下列程序中的错误或不合理之处,并改正之。 int main() { int s,x,n; s=power(x,n); } power(y) { int i,p=1; for(i=1;i&=n;++i) p=p*y; } int power(int x,int n); int main() { int s,x,n; scanf(“%d %d”,&x,&n); s=power(x,n); printf(“%s=%d
”,s); return 0; } int power(int x,int n) { int i,p=1; for(i=1;i&=n;++i) p=p*x*i; } 4.2 编写程序在屏幕上画一条正弦曲线。 #include&stdio.h& #include&math.h& #include&string.h& #define pi 3.1415926 void showspace(int k); int main() { int setloc=20; int amplitude=10; int angle=15; for(i=0;i&=360;i=i+angle){ curloc=(int)(setloc+amplitude*sin(i*pi/180)); if(curloc&setloc){ showspace(curloc-1); printf(&*&); showspace(setloc-curloc-1); printf(&i&); } else{ if(curloc==setloc){ showspace(setloc-1); printf(&*&); } else{ showspace(setloc-1); printf(&i&); showspace(curloc-setloc-1); printf(&*&); } } printf(&
&); } return 0; } void showspace(int k) { int i=0; while(i++&k) printf(& &); } 4.3 编写一个函数,重复打印给定的字符 n 次。 void showappointcharacter(char c,int n) { for(k=0;k&n;k++) printf(“%c”,c); } 4.4 编写一个函数,求出一个正整数的所有因子。 #include&stdio.h& #define n 100 int a[n]; int allfactors(int a[],int k); int main() { int i,t,k; scanf(&%d&,&k); t=allfactors(a,k); if(t) for(i=0;i&t;i++) printf(&%d &,a[i]); else printf(&没有公因子
&); printf(&
&); return 0; } int allfactors(int a[],int k) { int m=0;/* 用以记录因子的个数 */ int u=k;/* 用以保存余数 */ for(i=2;i&k;i++){ while(u%i==0){ /* i 是因子 */ a[m++]=i; /* 因子送数组保存 */ u=u/i; /* 余数 */ } } } 4.5 写出计算 ackermann 函数 ack(m,n)的递归函数。对于 m≥0,n≥0,ack(m,n)定义为: ack(0,n)=n+1 ack(m,0)=ack(m-1,1) ack(m,n)=ack((m-1),ack(m,n-1)) 对 m&0,n&0 要求显示计算过程。 long int ack(int m,int k); int main() { int m,k; printf(&请输入 m,n 的值:&); scanf(“%d %d”,&m,&k); printf(“%d
”,ack(m,k)); return 0; } long int ack(int m,int k) { if(m&0 || k&0) exit(0); if(!m){ printf(&ack(%d,%d)=%d
&,m,k,k+1); return k+1; } else if(!k){ printf(&ack(%d,%d)=ack(&%d,1)
&,m,k,m-1); return ack(m-1,1); } else{ printf(&ack(%d,%d)=ack(%d,ack(%d,%d))
&,m,k,m-1,m,k-1); return ack((m-1),ack(m,k-1)); } } 4.6 写出计算 hermite 多项式 hn(x)值的递归函数。hn(x)定义如下: h0(x)=1 h1(x)=2x hn(x)=2xhn-1(x)-2(n-1)hn-2(x) (对 x&1) #include&stdio.h& #include&stdlib.h& double hermite(double x,int k); int main() {/* k 阶 hermite 多项式 */ /* hermite 函数的自变量取值 */ printf(&请输入 hermite 函数的阶数 n 和自变量 x:&); scanf(&%d %lf&,&k,&x); printf(&%lf
&,hermite(x,k)); return 0; } double hermite(double x,int k) { if(k&0) exit(0); if(k&1) return 1; else{ if(k&2) return 2*x; else{ if(x&=1) exit(0); else return 2*x*hermite(x,k-1)-2*(k-1)*hermite(x,k-2); } } } 4.7 写一个求 n 个数的最大公约数和最小公倍数的递归函数。 int twocommondivisor(int m,int n) /*两个数的最大公约数*/ { int u,v,r; if(m==0 || n==0) return 0; u=m; v=n; while(r=u%v){ u=v; v=r; } } int twocommonmultiple(int m,int n) /*两个数的最小公倍数*/ { u=twocommondivisor(m,n); if(!u) return 0; return u*(m/u)*(n/u); } int maxcommondivision(int a[],int k)/*最大公约数*/ { if(k&2) return 0; if(k&3) return twocommondivisor(a[k-1],a[k-2]); else{ return twocommondivisor(maxcommondivision(a,k-1),a[k-1]); } } int mincommonmultiple(int a[],int k)/*最小公倍数*/ { if(k&1) return 0; if(k&2) return a[k-1]; if(k&3) return twocommonmultiple(a[k-1],a[k-2]); else{ return twocommonmultiple(mincommonmultiple(a,k-1),a[k-1]); } } 4.8 写一个将整数转换成字符串的函数。 /* 由于一个 2 字节整数的取值范围为-,所以待转换的数最大不超过 5 位数*/ int integertostring(int k,char s[]); int main() { int i=109; char s[10]; if(integertostring(i,s)) printf(&%s
&,s); else printf(&error
&); return 0; } int integertostring(int k,char s[]) { int k1,j,i=0; char str[20]; if(k&-32768 || k&32767) return 0; if(k&0) k1=-k;/*如果是负数,仅转换其数字部分*/ else k1=k; do{ str[i++]=k1%10+'0'; }while((k1/=10)&0); if(k&0) str[i++]='-'; for(i=i-1,j=0;j&=i;j++) s[j]=str[i-j]; s[j]=''; return 1; } 4.9 写出下面程序的运行结果。 void fun(int i,int j); int main() { int i,j,x,y,n,g; i=2; j=3; g=x=5; y=9; n=7; fun(n,6); printf(&g=%d;i=%d;j=%d;
&,g,i,j); printf(&x=%d;y=%d;
&,x,y); fun(n,6); return 0; } void fun(int i,int j) { int x,y,g; g=8; x=7; y=2; printf(&g=%d;i=%d;j=%d;
&,g,i,j); printf(&x=%d;y=%d;
&,x,y); x=8; y=6; } g=8;i=7;j=6; x=7;y=2; g=5;i=2;j=3; x=5;y=9; g=8;i=7;j=6; x=7;y=2; 4.10 写出下面程序的执行结果。 void incx(); void incy(); int main() { incx(); incy(); incx(); incy(); incx(); incy(); return 0; } void incx() { int x=0; printf(&x=%d &,++x); } void incy() { static int y=0; printf(&
&,++y); } x=1 y=1 x=1 y=2 x=1 y=3 4.11 写出下面程序的执行结果。 int ran(); int rand(); int main() { int i,j; for(i=0;i&3;i++){ for(j=0;j&2;j++) printf(&%3d&,ran()); printf(&
&); } for(i=0;i&2;i++){ for(j=0;j&2;j++) printf(&%3d&,rand()); printf(&
&); } return 0; } int ran() { static int see=1234,n; printf(&(see=%4d)&,see); n=(see%1000)/10; } int rand() { int see=1234,n; printf(&(see=%5d)&,see); see=(see+2; n=(see%1000)/10; } (see=1234) 23(see=1234) 23 (see=1234) 23(see=1234) 23 (see=1234) 23(see=1234) 23 (see= 1234) 53(see= 1234) 53 (see= 1234) 53(see= .12 指出下列程序中各变量的存储属性,并写出程序的执行结果。 #include&stdio.h& int reset(); int next(int j); int last(int j); int new(int i); int i=1; int main() { int i,j; i=reset(); for(j=1;j&=3;j++){ printf(&i=%d;j=%d;
&,i,j); printf(&next(i)=%d
&,next(i)); printf(&last(i)=%d
&,last(i)); printf(&new(i+j)=%d
&,new(i+j)); } return 0; } int reset() {
} int next(int j) { return j=i++; } int last(int j) { static int i=10; return j=i--; } int new(int i) { int j=10; return i=j+=i; } 解:存储属性:程序第二行定义的变量 i 为外部变量。main 函数中的 i,j 是自动变量。函 数 last 中定义了静态局部变量 i,函数 new 中定义了自动变量 j。 执行结果: i=1;j=1; next(i)=1 last(i)=10 new(i+j)=12 i=1;j=2; next(i)=2 last(i)=9 new(i+j)=13 i=1;j=3; next(i)=3 last(i)=8 new(i+j)=14 4.13 写出下面程序的执行结果。 #include&stdio.h& #define low 0 #define high 5 #define change 2 int i= int workover(int j); int resert(int i); int main() { int i= resert(i/2); printf(&i=%d
&,i); resert(i=i/2); printf(&i=%d
&,i); resert(i/2); printf(&i=%d
&,i); workover(i); printf(&i=%d
&,i); return 0; } int workover(int i) { i=(i%i)*((i*i)/(2*i)+4); printf(&i=%d
&,i); } int resert(int i) { i=i&changehigh: } i=5 i=2 i=2 i=0 i=2 4.14 若有宏定义 #define max(a,b) ((a)&(b)(a):(b) 则表达式 max(a,max(b,max(c,d))) 将扩展成什么如何修改上述表达式,可使其宏替换变得稍微小一点(10 分) ((a)&( ((b)&( ((c)&(d)(c):(d)))(b):( ((c)&(d)(c):(d)))))(a):( ((b)&(k)(b): ( ((c)&(d)(c):(d)))))) 可把上面的表达式改写为: max(max(a,b),max(c,d)) 4.15 写出下面程序的执行结果。 #include&stdio.h& #define fudge(k) k+3.1415926 #define pr(a) printf(&n=%d &,(int)(a)) #define print(a) pr(a);putchar('
') #define print2(a,b) pr(a);print(b) #define print3(a,b,c) pr(a);print2(b,c) #define max(a,b) (a&bb:a) int main() { { int x=2; print(x*fudge(2)); } { for(cel=0;cel&=100;cel+=50) print2(cel,9.15*cel+32); } { int x=1,y=2; print3(max(x++,y),x,y); print3(max(x++,y),x,y); } return 0; } n=7 n=0 n=50 n=100 n=1404 n=2 n=2 n=2 n=3 n=4 n=2 4.16 写出下面程序的执行结果。 #include&stdio.h& #define s x=y=z #define p3(x,y,z) printf(&x=%d y=%d z=%d
&,x,y,z) int main() { int x,y,z; s=1; ++x||++y||++z; p3(x,y,z); s=1; ++x&&++y||++z; p3(x,y,z); s=1; ++x&&++y&&++z; p3(x,y,z); s=-1; ++x||++y&&++z; p3(x,y,z); s=-1; ++x||++y||++z; p3(x,y,z); s=-1; ++x&&++y&&++z; p3(x,y,z); return 1; } x=2 y=1 z=1 x=2 y=2 z=1 x=2 y=2 z=2 x=0 y=0 z=-1 x=0 y=0 z=0 x=0 y=-1 z=-1 4.17 定义一个宏,将大写字母变成小写字母。 #define tolower(ch) ((ch)&=’a’&&(ch)&=’z’)(ch)+’a’-‘a’:(ch) 4.18 定义一个宏,交换两个参数的值。 #define swap(a,b) (a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b); 4.19 编写两个函数,分别求两个整数的最大公约数和最小公倍数,并用主函数调用这两个 函数,然后输出结果。 int twocommondivisor(int m,int n) /*两个数的最大公约数*/ { int u,v,r; if(m==0 || n==0) return 0; u=m; v=n; while(r=u%v){ u=v; v=r; } } int twocommonmultiple(int m,int n) /*两个数的最小公倍数*/ { u=twocommondivisor(m,n); if(!u) return 0; return u*(m/u)*(n/u); } 4.20 求方程 ax2+bx+c=0 的根,用三个函数分别求当 b2-4a 大于 0、等于 0 和小于 0 时的根, 并输出结果。从主函数输入 a,b,c 的值。 #include&stdio.h& #include&stdlib.h& #include&math.h& void realroot(double,double,double); void equalroot(double,double,double); void imageroot(double,double,double); int main() { double a,b,c; scanf(&%lf %lf %lf&,&a,&b,&c); if(b*b-4*a*c&0) realroot(a,b,c); else if(b*b-4*a*c==0) equalroot(a,b,c); else imageroot(a,b,c); return 0; } void realroot(double a,double b,double c) { if(b*b-4*a*c&=0) exit(0); printf(&x1=%lf x2=%lf
&,(-b+sqrt(b*b-4*a*c))/(2*a),(-b-sqrt(b*b-4*a*c))/(2*a)); } void equalroot(double a,double b,double c) { if(b*b-4*a*c) exit(0); printf(&x1=%lf x2=%lf
&,(-b)/(2*a),(-b)/(2*a)); } void imageroot(double a,double b,double c) { if(b*b-4*a*c&=0) exit(0); printf(&x1=%lf+j%lf x2=%lf-j%lf
&, (-b)/(2*a),sqrt(4*a*c-b*b)/(2*a), (-b)/(2*a),sqrt(4*a*c-b*b)/(2*a)); } 4.21 编写一个判断素数的函数。在主函数输入一个整数,输出是否素数的信息。 int prime(unsigned int number); int main() { scanf(&%u&,&m); if(prime(m)) printf(&%u 是素数!
&,m); else printf(&%u 不是素数!
&,m); return 0; } int prime(unsigned int number) { int f=1; if(number&1) exit(0); for(n=2;n&=number/2;n++) if(number%n==0){ f=0; } } 4.22 用牛顿迭代法求根。方程为 ax3+bx2+cx+d=0,系数 a,b,c,d 由主函数输入,求 x 在 1 附近的一个实根。求出根后由主函数输出。 /* 牛顿迭代法解方程 */ double newtonsolvingequation(double a,double b,double c,double d,double x,double precision); double func1(double a,double b,double c,double d,double x);/* 方程 f(x)=0 的函数 f(x) */ double dfunc1(double a,double b,double c,double x);/* f(x)的导函数 */ int main() { double a,b,c,d; scanf(&%lf%lf%lf%lf&,&a,&b,&c,&d); printf(&方程的根为%lf
&,newtonsolvingequation(a,b,c,d,1,0.0001)); } double newtonsolvingequation(double a,double b,double c,double d,double x,double precision) { double x1,x2; x1=x; x2=x1-func1(a,b,c,d,x1)/dfunc1(a,b,c,x1); while(fabs(x1-x2)&precision){ x1=x2; x2=x1-func1(a,b,c,d,x1)/dfunc1(a,b,c,x1); } return x2; } double func1(double a,double b,double c,double d,double x)/* 方程 f(x)=0 的函数 f(x) */ { return a*x*x*x+b*x*x+c*x+d; } double dfunc1(double a,double b,double c,double x)/* f(x)的导函数 */ { return 3*a*x*x+2*b*x+c; } 4.23 用递归的方法求 n 阶勒让德多项式的值,递归公式为1
1double lp(double x,int k); int main() { printf(&请输入 x 和勒让德多项式的阶次 k:&); scanf(&%lf%d&,&x,&k); printf(&x=%lf 时的%d 阶勒让德多项式的值为%lf
&,x,k,lp(x,k)); return 0; } double lp(double x,int k) { if(k&0) exit(0); if(k==0) return 1; if(k==1) else return ((2*k-1)*x-lp(x,k-1)-(k-1)*lp(x,k-2))/k; } 4.24 输入 10 个学生 5 门课的成绩,分别用函数求:(1) 每个学生平均分;(2) 每门课的平 均 分 ; (3) 找 出 最 高 的 分 数 所 对 应 的 学 生 和 课 程 ; (4) 求 平 均 分 方 差 :
,其中 xi 为某一学生的平均分。
2#define m 10 #define n 5 double a[m][n]; /*第 k 个学生的平均分*/ double onestudentaveragescore(int k) { double sum=0; for(i=0;i&n;i++) sum=sum+a[k][i]; return sum/n; } /*第 k 门课的平均分*/ double onecourseaveragescore(int k) { int i,sum=0; for(i=0;i&m;i++) sum=sum+a[i][k]; return sum/m; } /*找出最高分数的学生和课程*/ int maxscorenum() { int i,j,m,k; double a=0; for(i=0;i&m;i++) for(j=0;j&n;j++) if(a&a[i][j]){ a=a[i][j]; m=i; k=j; } printf(&第%d 个学生,第%d 门课程
&,m,k); return 1; } /*求均方差*/ double variance() { double x,sum1=0,sum2=0; int i,j; for(i=0;i&m;i++){ x=onestudentaveragescore(i); sum1=sum1+x*x; } for(i=0;i&m;i++){ x=onestudentaveragescore(i); sum2=sum2+x; } return sum1/m-(sum2/m)*(sum2/m); } 4.25 编写几个函数: (1) 输入 100 个职工的姓名和职工号; (2) 按职工号由小到大顺序排序, 姓名顺序也随之调整;(3) 要求输入一个职工号,用折半查找法找出该职工的姓名,从主函 数输入要查找的职工号并输出该职工的姓名。 struct employee{ char name[10]; }; void enter(struct employee a[],int k) { if(k&1) for(i=0;i&k;i++){ printf(&请输入职工号和职工姓名:
&); scanf(&%d %s&,&a[i].num,a[i].name); } } void sortinnum(struct employee a[],int k) { int i,j,t;
for(i=1;i&k;i++){ t=k-i; for(j=0;j&=t-1;j++) if(a[j].num&a[j+1].num){ temp=a[j]; a[j]=a[j+1]; a[j+1]= } } } char *find(struct employee a[],int k,int x) { int top=0,bot=k-1, if(k&=0) mid=(top+bot)/2; while(x!=a[mid].num && top&=bot){ if(a[mid].num&x) top=mid+1; else{ if(a[mid].num==x) return a[mid]. else bot=mid-1; } mid=(top+bot)/2; } if(x==a[mid].num) return a[mid]. } 4.26 编写一函数,输入一个十六进制数并输出相应的十进制数。 void hextodec() { scanf(&%x&,&x); printf(&%d
&,x); } 4.27 用递归法将一个整数 n 转换成字符串。例如,输入 483,应输出字符串”483”。n 的位 数不确定,可以是任意位数的整数。 int integertostring(int k,char s[]) { int k1,j,i=0; char str[20]; if(k&-32768 || k&32767) return 0; if(k&0) k1=-k;/*如果是负数,仅转换其数字部分*/ else k1=k; do{ str[i++]=k1%10+'0'; }while((k1/=10)&0); if(k&0) str[i++]='-'; for(i=i-1,j=0;j&=i;j++) s[j]=str[i-j]; s[j]=''; return 1; } 4.28 给出年、月、日,计算该日是该年的第几天。 int daynum(int year,int month,int day) { int i,sum=0; int a[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if(isleap(year)) a[1]=29; for(i=0;i&month-1;i++) sum=sum+a[i]; sum=sum+ } int isleap(int year) { if(year%4==0 && year%100!=0 || year%400==0) return 1; else return 0; } 4.29 用递归方法求yxx3 x5 x7 x9
3! 5! 7! 9!到第 n 项,n 和 x 由键盘输入。 double func(double x,int k); int main() { scanf(&%lf %d&,&x,&k); printf(&%lf
&,func(x,k)); return 0; } double func(double x,int k) { if(k&0) exit(0); if(k==0) if(k==1) return x-x*x*x/6; else{ a=func(x,k-1)-func(x,k-2); return func(x,k-1)-a*x*x/((2*k+1)*(2*k)); } } 4.30 输入两个整数,求它们相除的余数。用带参数的宏来实现,试编程序。 #define remainder(a,b) scanf(“%d%d”,&a,&b); printf(“%d”,a%b) 4.31 三角形的面积为area
c 其中 s 1 a
,a,b,c 为三角形的三边。定义两个带参数的宏,一个用来求 s,另 2一个用来求 area。编写程序,在程序中用带实参数的宏名来求面积 area。 #define s(a,b,c) (a+b+c)/2 #define area(a,b,c) sqrt(s*(s-a)*(s-b)*(s-c)) 4.32 给年份 year 定义一个宏,以判别该年份是否闰年。 #define isleap(year) (year%4==0 && year%100!=0 || year%400==0) 4.33 请分析以下一组宏所定义的输出格式: #define nl putchar(
) #define pr(format,value) printf(“value=%format ”,(value)) #define print1(f,x1) pr(f,x1); nl #define print2(f,x1,x2) pr(f,x1); print1(f,x2) 如果在程序中有以下的宏引用: pr(d,x); print1(d,x); print2(d,x1,x2); 写出宏展开后的情况,并写出应输出的结果,设 x=5,x1=3,x2=8。 解:展开后为: printf(“value=%format ”,x); printf(“value=%format= ”,x); putchar(
); printf(“value=%format= ”,x1); printf(“value=%format ”,x2); putchar(
): 如果运行以下程序: #include&stdio.h& #define nl putchar('
') #define pr(format,value) printf(&value=%format &,(value)) #define print1(format,x1) pr(format,x1); nl #define print2(format,x1,x2) pr(format,x1); print1(format,x2) int main() { float x=5, x1=3, x2=8; pr(d,x); print1(d,x); print2(d,x1,x2); return 0; } 输出结果如下: value=5.000000ormat value=5.000000ormat value=3.000000ormat value=5.000000ormat 用 turbo c 和 visual c 进行宏代换时,字符串中的字符不予替换,一律保持原状。 4.34 请设计输出实数的格式,包括:(1) 一行输出一个实数;(2) 一行内输出两个实数;(3) 一行内输出三个实数。实数用”6.2f”格式输出。 解: #define pr printf #define nl “
” #define fs “%f” #define f “%6.2f” #define f1 f nl #define f2 f “ ” f nl #define f# f “ ” f “ ” f nl 4.35 设 计 所需 的 各种 各样 的 输出 格 式 ( 包 括整 数、 实 数、 字 符串 等 ) 。 用一 个 文件 名 “format.h”,把这些信息都放到此文件内,另编一个程序文件,用#include“format.h”命令 以确保能使用这些格式。 /*

我要回帖

更多关于 scanf int8 的文章

 

随机推荐