C Primer Plus中的一个练习题

第五章的最后一个练习题,5-8.

要求:

/*
输入一个华氏温度。以double类型读入温度值,并将它作为一个参数传递给用户提供的函数Temperatures()。
该函数将计算对应的摄氏温度和绝对温度,并以小数点右边有两位数字的精度显示这三种温度。
它应该用每个值所代表的温度刻度来标识这三个值。
Celsius = 1.8 * Fahrenheit + 32.0
Kelvin = Celsius + 273.16
*/

最开始,我写了如下的代码:

先用gets(),获取输入字符串,再比较第一个字符是否是数字来判断输入是否合法,再用sscanf()函数读取输入字符串中的数字。

#include <stdio.h>

void Temperatures(double Fahrenheit);

int main(void)
{
	double tmp;

	char str[20];

	printf("Enter a temperature in Fahrenheit:\n");
	gets(str);

	while (str[0] >= ‘0‘ && str[0] <= ‘9‘)
	{
		sscanf(str,"%lf", &tmp);
		Temperatures(tmp);
		printf("Enter a temperature in Fahrenheit:\n");
		gets(str);
	}

	return 0;
}

void Temperatures(double Fahrenheit)
{
	float Celsius, Kelvin;
	Celsius = 1.8 * Fahrenheit + 32.0;
	Kelvin = Celsius + 273.16;
	printf("%.2f  %.2f  %.2f", Fahrenheit, Celsius, Kelvin);

}

后来发现,如过利用scanf()的返回值作为判断,可以简化代码。

scanf()函数的返回值是成功读入的项目的个数,假如没有读取任何项目,则返回值为0。

简化后的代码:

#include <stdio.h>
void Temperatures(double Fahrenheit);
int main(void)
{
	double tmp;

	printf("Enter a temperature in Fahrenheit:\n");
	while (scanf("%lf", &tmp))
	{
		Temperatures(tmp);
		printf("Enter a temperature in Fahrenheit:\n");
	}
	return 0;
}

void Temperatures(double Fahrenheit)
{
	float Celsius, Kelvin;
	Celsius = 1.8 * Fahrenheit + 32.0;
	Kelvin = Celsius + 273.16;
	printf("%.2f  %.2f  %.2f", Fahrenheit, Celsius, Kelvin);

}

C Primer Plus中的一个练习题

时间: 2024-10-31 18:29:24

C Primer Plus中的一个练习题的相关文章

C++primer原书中的一个错误(派生类using声明对基类权限的影响)

在C++primer 第4版的 15章 15.2.5中有下面这样一段提示: "注解:派生类可以恢复继承成员的访问级别,但不能使访问级别比基类中原来指定的更严格或者更宽松." 在vs2010中经过验证,这段话是错误的.具体见以下代码: //Base.h #pragma once #include <iostream> using namespace std; class Base { public: Base(void); ~Base(void); size_t size()

获取字符串中某一个字段的数据,GetValueFromStr

gps数据格式为:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A* /********************************************************************** *版权所有 (C)2015, Wuyq. * *文件名称: GetValueFromStr.c *内容摘要:用于演示从gps数据字符串中获取相应的内容 *其它说明:无 *当前版本: V1.0 *作

Android系统中添加一个产品----图文详解

本文本着开源的精神介绍如何向一个Android系统中添加一个产品的整个过程,按照以下过程笔者有理由相信每个将要从事本行业的人都可以完成,其实添加一个产品并不难,难的是对其相关硬件的修改,好了废话不多说. 首先我们要创建一个属于自己产品的目录,这里以WY_device为例,以WY作为产品的名字. 首先从已经存在的产品中拷贝一个以产品的名字为名的.mk文件,修改为自己的.mk文件,在这里为WY.mk 对其进行如下的修改: 然后添加AndroidProducts.mk  这是添加产品的配置文件名路径,

今天中了一个脚本病毒。把我的所有 html 加了 vbs 脚本,WriteData 是什么鬼?

今天中了一个脚本病毒.把我的所有 html 加了 vbs 脚本: WriteData 是什么鬼? <SCRIPT Language=VBScript><!-- DropFileName = "svchost.exe" WriteData = "4D5A90000300000004000000FFFF0000B8000000000000004000000000000000000000000000000000000000000000000000000000000

Spring中的一个错误:使用Resources时报错(The annotation @Resources is disallowed for this location)

在学习Spring的过程中遇到一个错误:在使用注解@resources的时候提示:The annotation @Resources is disallowed for this location 后来来在学问Java网友的时候解决了. 原来的代码是这样的: 1 package com.show.biz; 2 3 import javax.annotation.Resources; 4 5 import com.show.biz.UserBiz; 6 import com.show.dao.Us

实现同一个脚本多次运行,系统中只有一个进程

编写脚本,实现同一个脚本多次运行,系统中只有一个进程 [email protected] scripts]#cat pid.sh #!/bin/sh pidpath=/tmp/a.pid if [ -f "$pidpath" ]   then     kill `cat $pidpath` >/dev/null 2>&1     rm -f $pidpath fi echo $$ >$pidpath sleep 300 测试如下 [email protecte

java中,一个简单但出错率又大的‘加法’题,1+1+&#39;1&#39;+1+1+1+1+&quot;1&quot;=?

1+1+'1'+1+1+1+1+"1"=? 结果是多少?很多人看了题之后,可能会说结果是71.  当然有的童鞋可能会说很简单,放工具里运行一下就知道结果了,如果不运行代码,你会得出一个什么样的结果呢? 如果告诉你答案是551,会迷惑么?怎么会得出551? 下面我们来看看怎么算的: 1.我们大家都知道1 .'1'."1"的区别,1 表示一个int类型,’1'是表示一个char类型,"1" 表示一个字符串类型. 2.1+1+'1'+1+1+1+1+&

结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占用int长度空间,空数组不占任何空间.“这个数组不占用任何内存”,意味着这样的结构节省空间:“该数组的内存地址就和它后面的元素地址相同”,意味着无需初始化,数组名就是后面元素的地址,直接就能当指针使用. 这样的写法最适合制作动态buffer,因为可以这样分配空间malloc(sizeof(struc

如何在RCP程序中添加一个banner栏

前言:这段时间还算比较空闲,我准备把过去做过的有些形形色色,甚至有些奇怪的研究总结一下,也许刚好有人用的着也不一定,不枉为之抓耳挠腮的时光和浪费的电力.以前有个客户提出要在RCP程序中添加一个banner栏,研究了很久才搞定.代码是基于eclipse4.3.2的. 先看一下效果预览: 为了添加一个banner栏,我们必须重写RCP程序最外层的layout类,即TrimmedPartLayout.java.这个layout类是用来控制menu,toolbar等最基本的layout布局的.我们写一个