3.5 数据的输入输出

 

3.5 数据的输入输出

3.5.1 输入输出示例

示例分析

我们来分析一个示例程序,该程序求解一元二次方程 𝑎𝑥2+𝑏𝑥+𝑐=0ax2+bx+c=0 的根,其中 a, b, c 是由用户输入的系数,并假设 𝑏2−4𝑎𝑐>0b2−4ac>0 以确保方程有两个实根。

解题方法

对于一元二次方程,根据数学公式,其解为: 

程序实现

#include <stdio.h>
#include <math.h>

int main() {
    double a, b, c, discriminant, x1, x2, p, q;

    // 输入 a, b, c 的值
    printf("Enter coefficients a, b and c: ");
    scanf("%lf %lf %lf", &a, &b, &c);

    // 计算判别式 (discriminant)
    discriminant = b * b - 4 * a * c;

    // 计算根
    p = -b / (2.0 * a);
    q = sqrt(discriminant) / (2.0 * a);
    x1 = p + q;
    x2 = p - q;

    // 输出结果
    printf("Roots of the equation are: x1 = %.2f, x2 = %.2f\n", x1, x2);

    return 0;
}

输入输出分析

  • 输入:使用 scanf 函数从键盘读取 a, b, c 的值。注意,输入的格式是连续的,用空格隔开,例如输入 1 3 2 对应 a=1, b=3, c=2。
  • 输出:使用 printf 函数输出计算得到的方程的根。格式化输出使得根的显示保留两位小数,以便更清晰地观察结果。

注意事项

  • 确保在使用 sqrt 函数之前,判别式 𝑏2−4𝑎𝑐b2−4ac 必须是非负的。
  • 使用 %lf 格式说明符读取和打印 double 类型的变量。
  • 程序假设 ,在实际应用中,应增加条件检查确保方程有实根。

增强的用户体验

为了让程序更健壮,可以添加判别式的检查,确保输入的系数确实能得到实数根,并对各种情况做出相应的处理(比如复根或单根的情况)。

 

 

3.5.2 有关数据输入输出的概念

在C语言中,数据的输入和输出是通过标准库函数实现的,而不是语言内置的功能。理解这一点对于编写互动或数据处理程序至关重要。

输入输出基础

1. 输入输出的定义

  • 输出: 将数据从计算机传输到外部设备(如显示器、打印机等)。
  • 输入: 从外部设备(如键盘、文件等)获取数据到计算机中。

2. C语言的输入输出实现

C语言没有内置的输入输出语句,这些功能是通过库函数如 printf()scanf() 提供的,这些函数不是C语言的关键字,而是标准库中定义的函数。

3. 库函数的作用

库函数简化了复杂的输入输出操作,使得程序员可以不直接处理底层的硬件细节,而专注于程序逻辑。

输入输出函数

常用的输入输出函数

  • printf(): 用于输出格式化文本到标准输出设备(通常是屏幕)。
  • scanf(): 用于从标准输入设备(通常是键盘)读取输入符合指定格式的数据。
  • putchar(), getchar(): 分别用于输出和输入单个字符。
  • puts(), gets(): 分别用于输出和输入一个字符串(gets() 已被废弃因为存在安全风险,推荐使用 fgets())。

使用示例

#include <stdio.h>

int main() {
    int age;
    printf("Enter your age: ");
    scanf("%d", &age);
    printf("You are %d years old.\n", age);
    return 0;
}

预处理指令 #include

引入标准输入输出库

  • 使用 #include <stdio.h> 将标准输入输出库中的声明和宏引入程序中。
  • 这使得在程序中可以使用 printf(), scanf() 等函数。

#include 的形式

  • <stdio.h>: 从编译器的标准库路径中寻找和包含 stdio.h
  • "stdio.h": 首先在当前目录下寻找 stdio.h,如果找不到,再在标准库路径中寻找。

总结

理解和正确使用C语言中的输入输出函数是基本编程技能的一部分。这些函数提供了与外部世界交互的窗口,允许程序在用户和其他系统之间传递信息。通过标准库的使用,C语言保持了其编译系统的简洁和高效,同时提高了其可移植性和灵活性。

 

 

3.5.3 使用 printf 函数输出数据

在C语言中,printf 是用于输出的主要函数,它允许程序员以多种格式显示数据。掌握 printf 的使用是进行有效编程的关键部分,尤其是在需要输出复杂数据或格式化文本时。

printf 函数的基本使用

1. 函数的一般格式

printf 的基本语法是:

printf("格式控制字符串", 输出列表);
  • 格式控制字符串:包含一系列的格式说明符,用于定义如何显示变量或表达式的值。格式说明符通常以 % 开头,如 %d%f 等。
  • 输出列表:包括一个或多个提供给格式说明符的对应值的变量或表达式。

2. 格式说明符

  • %d%i:输出整数。
  • %f:输出浮点数。
  • %c:输出单个字符。
  • %s:输出字符串。
  • %x%X:以十六进制形式输出无符号整数。
  • %p:输出指针地址。

3. 实例

int a = 5, b = 10;
printf("%d %d\n", a, b);  // 输出: 5 10

float pi = 3.14159;
printf("Pi is approximately %.2f\n", pi);  // 输出: Pi is approximately 3.14

char c = 'A';
printf("The character is %c\n", c);  // 输出: The character is A

4. 普通字符与格式声明

普通字符在 printf 的格式字符串中原样输出,例如:

printf("Hello, World!\n");  // 输出: Hello, World!
printf("a=%d b=%d\n", a, b);  // 输出: a=5 b=10

普通字符包括空格、逗号、换行符 \n 等,这些都会按照它们在字符串中的顺序显示。

注意事项

  1. 格式控制的准确性:使用正确的格式说明符对应数据类型是必须的,错误的格式说明符可能导致不正确的输出或运行时错误。

  2. 数据类型对应:确保提供给 printf 的变量类型与格式说明符匹配。例如,不应该用 %d 来输出浮点数。

  3. 输出格式化:可以在格式说明符中指定宽度、精度等,例如 %7.2f 表示浮点数输出占据至少7个字符宽的空间,其中包括两位小数。

结论

printf 是一种功能强大的输出函数,提供了极高的灵活性来格式化输出。熟练使用 printf 可以大幅提高C语言程序的表达能力,使得输出更加人性化和易于理解。通过实践和多做练习可以更好地掌握其用法。

 

2. 格式字符

在C语言中,printf 函数使用格式字符来指定输出数据的类型和格式。理解和使用这些格式字符是精确控制输出的关键。下面将详细介绍常用的格式字符及其应用。

常用格式字符

1. %d%i

  • 用途: 用于输出带符号的十进制整数。
  • 示例:
     
    int num = 5;
    printf("%d\n", num);  // 输出: 5
    printf("%5d\n", num); // 输出: '    5' (前面有4个空格)
    

2. %c

  • 用途: 用来输出一个字符。
  • 示例:
char ch = 'a';
printf("%c\n", ch);     // 输出: a
printf("%5c\n", ch);    // 输出: '    a' (前面有4个空格)

3. %s

  • 用途: 用来输出一个字符串。
  • 示例:
printf("%s\n", "Hello, World!");  // 输出: Hello, World!

4. %f

  • 用途: 用来输出浮点数(实数),默认显示6位小数。
  • 示例:
float number = 3.14159;
printf("%f\n", number);     // 输出: 3.141590
printf("%.2f\n", number);   // 输出: 3.14 (显示2位小数)
printf("%6.2f\n", number);  // 输出: '  3.14' (总宽度为6)

5. %e%E

  • 用途: 以指数形式输出实数。
  • 示例:
double value = 123.456;
printf("%e\n", value);      // 输出: 1.234560e+02
printf("%E\n", value);      // 输出: 1.234560E+02
printf("%12.5e\n", value);  // 输出: ' 1.23456e+02' (总宽度为12)

6. %o

  • 用途: 以八进制无符号整数形式输出。
  • 示例:
int num = 18;
printf("%o\n", num);  // 输出: 22 (18的八进制表示)

7. %x%X

  • 用途: 以十六进制无符号整数形式输出,%x 输出小写字母,%X 输出大写字母。
  • 示例:
    printf("%x\n", 255);  // 输出: ff
    printf("%X\n", 255);  // 输出: FF
    

8. %u

  • 用途: 用来输出无符号十进制整数。
  • 示例:
    unsigned int num = 3000000000;
    printf("%u\n", num);  // 输出: 3000000000
    

9. %g%G

  • 用途: 输出浮点数,自动选择 %f%e%G%E 类似),以较短的形式显示,并且不输出无意义的零。
  • 示例:
    double num = 0.00012345;
    printf("%g\n", num);  // 输出: 0.00012345
    

格式修饰符

在格式字符前,可以添加修饰符来控制输出的宽度、精度和对齐方式。例如 %10.2f 表示输出的浮点数至少占10个字符宽,其中包括2位小数。

理解并合理使用这些格式字符和修饰符,可以有效地控制数据的输出格式,使程序输出更加符合用户的阅读习惯。

 

3.5.4 使用 scanf 函数输入数据

scanf 是 C 程序中用于从标准输入(通常是键盘)读取数据的主要函数。了解 scanf 的正确用法是保证数据正确输入的关键。

1. scanf 函数的一般形式

scanf 的基本语法为:

scanf("格式控制", &变量1, &变量2, ..., &变量N);
  • 格式控制: 类似于 printf,指定输入数据的类型。
  • 地址列表: 变量的地址,确保输入的数据可以存储到指定的变量中。

2. scanf 函数中的格式声明

格式声明以 % 开始,后跟一个或多个指定的格式字符,用于定义输入数据的类型和处理方式。以下是一些常用的格式字符:

  • %d: 读取一个十进制整数。
  • %i: 读取一个整数(自动检测十进制、八进制或十六进制)。
  • %f: 读取一个浮点数。
  • %lf: 读取一个双精度浮点数。
  • %c: 读取一个字符。
  • %s: 读取一个字符串,直到遇到空白字符。
  • %x: 读取一个十六进制数。

示例使用

int a;
float b;
char c[100];

scanf("%d %f %s", &a, &b, c);

3. 使用 scanf 函数时的注意事项

1. 变量地址

在使用 scanf 时,除了 %c, %s 和数组外,必须在变量名前加 & 符号来传递变量的地址。

2. 匹配格式字符串

如果格式控制字符串中除了格式说明符之外还包含其他字符,则输入时必须严格匹配这些字符。

int a;
float b;
char c[100];

scanf("%d %f %s", &a, &b, c);

在这种情况下,输入必须包含字符 a=, b=, c= 和两个逗号。

3. 使用 %c

%c 用于输入字符时,不会自动跳过前面的空白字符,如空格或换行。为避免意外读取前一个输出的换行符,可以在 %c 前加一个空格:

int a, b, c;
scanf("a=%d,b=%d,c=%d", &a, &b, &c);

4. 读取时遇到非法字符

如果输入的数据与格式字符串不匹配,scanf 会停止读取,留下未处理的数据在输入缓冲区中。

5. 使用 %s

当使用 %s 读取字符串时,scanf 会自动在字符串的末尾添加 null 字符 \0,所以确保分配给字符串的数组足够大,以避免溢出。

结论

正确地使用 scanf 需要注意格式控制字符串的准确性,确保输入格式与期望匹配,以及处理好变量的地址传递。在实践中,多加练习和测试是理解和熟练掌握 scanf 使用的最佳方法。

 

3.5.5 字符输入输出函数

在 C 语言中,除了通用的 printfscanf 函数用于数据的输入和输出,C标准库还提供了一些专用于字符处理的函数。这些函数简单易用,适用于处理单一字符的输入和输出任务。

1. 使用 putchar 函数输出字符

putchar 函数是用于输出单个字符到标准输出设备(通常是屏幕)的简便函数。它的函数原型非常简单:

int putchar(int c);

示例:连续输出字符

#include <stdio.h>
int main() {
    char a = 'B', b = 'O', c = 'Y';
    putchar(a);  // 输出字符 B
    putchar(b);  // 输出字符 O
    putchar(c);  // 输出字符 Y
    putchar('\n');  // 输出换行符
    return 0;
}

运行结果将是:

BOY

2. 使用 getchar 函数输入字符

putchar 相对应,getchar 函数用于从标准输入(通常是键盘)读取单个字符。该函数不需要参数,并返回读取的字符。

示例:从键盘读取并输出字符

#include <stdio.h>
int main() {
    char a, b, c;
    a = getchar();  // 读取一个字符并存储到变量 a
    b = getchar();  // 读取一个字符并存储到变量 b
    c = getchar();  // 读取一个字符并存储到变量 c
    putchar(a);  // 输出字符 a
    putchar(b);  // 输出字符 b
    putchar(c);  // 输出字符 c
    putchar('\n');  // 输出换行符
    return 0;
}

输入“BOY”后按 Enter 键,屏幕将显示:

BOY

注意点:

  1. getchar 在读取字符时不会自动忽略前面的空白字符,包括空格、制表符或换行符。这意味着如果上一条输入命令留下了换行符在输入缓冲区,getchar 将会读取它作为第一个字符。

  2. 连续调用 getchar 可以读取多个字符,但每次只处理一个字符,适用于读取有限长度的输入。

这些字符输入输出函数虽然功能单一,但在需要精确控制输入输出的场景中,它们比 printfscanf 更为直接和高效。在实际编程中,根据需要选择合适的工具是非常重要的。

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值