【谭浩强C程序设计精讲 7】数据的输入输出

文章目录

    • 3.5 数据的输入输出
      • 3.5.1 输入输出举例
      • 3.5.2 有关数据输入输出的概念
      • 3.5.3 用 printf 函数输出数据
        • 1. printf 的一般格式
        • 2. 格式字符
      • 3.5.4 用 scanf 函数输入数据
        • 1. scanf 函数的一般形式
        • 2. scanf 函数中的格式声明
        • 3. 使用 scanf 函数时应注意的问题
      • 3.5.5 字符输入输出函数
        • 1. 用 putchar 函数输出一个字符
        • 2. 用 getchar 函数输入一个字符

3.5 数据的输入输出

3.5.1 输入输出举例

首先介绍一个含有输入函数 scanf 和输出函数 printf 的示例。

  • 功能要求:求 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0 方程的根。 a , b , c a,b,c a,b,c 由键盘输入。
  • 解题思路:首先要知道求方程式的根的方法。由数学知识已知:如果 b 2 − 4 a c ≥ 0 b^2-4ac\geq0 b24ac0,则一元二次方程有两个实根:
    x 1 = − b + b 2 − 4 a c 2 a , x 2 = − b − b 2 − 4 a c 2 a x_1=\frac{-b+\sqrt{b^2-4ac}}{2a}, x_2=\frac{-b-\sqrt{b^2-4ac}}{2a} x1=2ab+b24ac ,x2=2abb24ac
    可以将上面的分式分成两项:
    p = − b 2 a , q = b 2 − 4 a c 2 a p=\frac{-b}{2a},q=\frac{\sqrt{b^2-4ac}}{2a} p=2ab,q=2ab24ac


x 1 = p + q , x 2 = p − q x1=p+q,x2=p-q x1=p+q,x2=pq

有了以上公式,只要知道 a , b , c a,b,c a,b,c 的值,就能顺利地求出方程的两个根。

#include <stdio.h>
#include <math.h>   //程序中用到求平方根函数sqrt
int main(void)
{double a,b,c,disc,x1,x2,p,q;    //disc用来存放判别式(b*b-4*a*c)的值printf("请输入a,b,c的值:");scanf("%lf%lf%lf",&a,&b,&c);    //输入双精度型变量的值要用格式声明“%lf”,输入变量前面要加取地址符&disc=b*b-4*a*c;                 //求判别式的值while(disc<0)                   //判断输入的a,b,c值是否符合判别式大于等于0的要求{printf("输入的a,b,c的值不符合要求,请重新输入:");scanf("%lf%lf%lf",&a,&b,&c); disc=b*b-4*a*c;             //重新求判别式的值}p=-b/(2.0*a);q=sqrt(disc)/(2.0*a);x1=p+q;x2=p-q;                 //求出方程的两个根printf("x1=%7.2f\nx2=%7.2f\n",x1,x2);   //“%7.2”表示整数部分占用7列,小数部分保留两位有效数字,且第三位小数按四舍五入。return 0;
}

测试结果1:
在这里插入图片描述

测试结果2:
在这里插入图片描述

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


  • 输入输出是以计算机主机为主体而言的。
  • 输出:从计算机向输出设备(如显示器、打印机等)输出数据称为输出。
  • 输入:从输入设备(如键盘、光盘、扫描仪等)向计算机输入数据称为输入。

  • C语言本身不提供输入输出语句,输入和输出操作是由C标准函数库中的函数来实现的。

  • C语言函数库中有一批标准的输入输出函数,它是以标准的输入输出设备(一般为终端设备)为输入输出对象的。其中有:

    函数名说明函数名说明函数名说明
    putchar输出字符printf格式输出puts输出字符串
    getchar输入字符scanf格式输入gets输入字符串

  • 要在程序文件的开头用预处理指令#include把有关头文件放在本程序中。
    如:
    #include <stdio.h>      //如果程序调用标准输入输出函数,必须包含该头文件
    #include <math.h>       //如果程序中用到标准数学库函数,必须包含该头文件
    

    需要说明的是:如果包含的头文件在C编译系统的子目录下使用#include <xxx.h>形式;如果包含的头文件在用户的当前目录(一般是用户存放源程序文件的子目录)中,则按#include "xxx.h"形式。


3.5.3 用 printf 函数输出数据

1. printf 的一般格式

printf 函数的一般形式:
printf(格式控制,输出表列)
例如:

printf("%d,%c\n",i,c);
  • “格式控制” 是用双撇号括起来的一个字符串,称为格式控制字符串,简称格式字符串。它包括两个信息:
    格式声明:由 “%”格式字符组成,如 %d、%f 等。

    它的作用是将输出的数据转换为指定的格式后输出。

    普通字符:需要在输出时原样输出的字符。如 逗号、空格、换行符或其他字符。

  • 输出表列:是程序需要输出的一些数据,可以是常量、变量或表达式


printf函数的一般形式也可以表示为:
printf(参数1, 参数2, 参数3, …, 参数n)

  • 参数1是格式控制字符串,参数2~参数n是需要输出的数据。
  • 执行 printf 时,参数2~参数n按参数1所指定的格式进行输出。
  • 参数1是必须有的,参数2~参数n是可选的。

2. 格式字符
表3.6 printf 函数中用到的格式字符
格式字符说明
d, i以带符号的十进制形式输出整数(正数不输出符号)
o以八进制无符号形式输出整数(不输出前导符0)
x, X以十六进制无符号形式输出整数(不输出前导符0x),用 x 则输出十六进制数的 a~f 时以小写形式输出,用 X 时,则以大写字母输出。
u以无符号十进制形式输出整数
c以字符形式输出,只输出一个字符
s输出字符串
f以小数形式输出单、双精度数,隐含输出6位小数
e, E以指数形式输出实数,用 e 时指数以 “e” 表示(如1.2e+02),用 E 时指数以 “E” 表示(如1.2E+02)
g, G选用 %f 或 %e 格式中输出宽度较短的一种格式,不输出无意义的0。用 G 时,若以指数形式输出,则指数以大写表示
表3.7 printf 函数中用到的格式附加字符
格式字符说明
l长整型数,可加在格式符 d、o、x、u前面
m(代表一个正整数)数据最小宽度
n(代表一个正整数)对实数,表示输出 n 位小数;对字符串,表示截取的字符个数
-(负号)输出的数字或字符在域内向左靠

以下将举例说明:
【例1】d格式符

printf("%5d\n%5d\n",12,-345);//%5d指定输出数据的位宽

运行结果:
在这里插入图片描述
说明:12前面有3个空格;-345前面有1个空格。

【例2】ld,lld格式符

#include <stdio.h>
int main()
{long i=123456;long long j=1234567890;printf("%ld\n%lld\n",i,j);//长整型用%ld打印,长长整型用%lld打印return 0;
}

运行结果:
在这里插入图片描述

【例3】c格式符

#include <stdio.h>
int main()
{char ch='a';printf("未指定位宽:%c\n",ch);printf("  指定位宽:%5c\n",ch);return 0;
}

运行结果:
在这里插入图片描述

说明:指定位宽的a前面有4个空格。

【例4】c格式符

#include <stdio.h>
int main()
{  short a=121;//定义一个值范围在0~127范围的整数,也可以用%c打印是字符yshort b=377;//若值超过127,再用%c打印,则把最后一个字节的信息按字符形式输出printf("%c\n%c\n",a,b);//377的最后一个字节数值也是121return 0;
}

运行结果:
在这里插入图片描述

【例5】s格式符

printf("%s\n","CHINA");

运行结果:
在这里插入图片描述

【例6】f格式符
(1)基本型,%f,系统默认,整数部分全部输出,小数部分输出6位;
(2)指定数据宽度和小数位数,用 %m.nf,数据总的宽度为m,其中小数占列宽为n。

#include <stdio.h>
int main()
{  double a=1.0;printf("%f\n",a/3);//系统一般默认:整数部分全部输出,小数部分输出6位printf("%20.15f\n",a/3);//数据总的宽度为20,其中小数占列宽为15return 0;
}

在这里插入图片描述

说明:0前面有3个空格,为什么?可以在评论区讨论(标注:讨论1)。

【例7】float 型数据的有效位数

#include <stdio.h>
int main(void)
{float a;a=10000/3.0;printf("%f\n",a);return 0;
}

运行结果:
在这里插入图片描述

结果说明:因为float型数据只能保证6~7位有效数字,因此,虽然程序输出了6位小数,但从左边数第7位数字(即第3位小数)以后的数字并不保证是绝对正确的。

【例8】将例7中的a改成double

#include <stdio.h>
int main(void)
{double a;a=10000/3.0;printf("%f\n",a);return 0;
}

运行结果:
在这里插入图片描述

【例9】输出的数据向左对齐,用%-m.nf。

#include <stdio.h>
int main(void)
{double a;a=10000/3.0;printf("%-25.15f\n%25.15f\n",a,a);return 0;
}

运行结果:
在这里插入图片描述

【例10】e 格式符

#include <stdio.h>
int main(void)
{printf("%e\n",1234.567);printf("%13.2e\n",1234.567);return 0;
}

运行结果:
在这里插入图片描述

【例11】i 格式符。作用与d格式符相同,一般用d少用i。

#include <stdio.h>
int main(void)
{printf("%i\n",1234);  return 0;
}

运行结果:
在这里插入图片描述

【例12】o 格式符。以八进制整数形式输出。

#include <stdio.h>
int main(void)
{int a=-1;printf("%d\t%o\n",a,a);  return 0;
}

运行结果:
在这里插入图片描述

结果说明:-1在内存中是按补码形式存放4个字节的(1111 1111 1111 1111),因此%o按内存单元实际的二进制按3位一组(从右向左)构成八进制数形式。

【例13】x 格式符。十六进制整数形式输出。

#include <stdio.h>
int main(void)
{int a=-1;printf("%d\t%o\t%x\n",a,a,a);  return 0;
}

运行结果:
在这里插入图片描述

【例14】u 格式符。用来输出无符号型数据,以十进制形式输出。

#include <stdio.h>
int main(void)
{unsigned int a=10;int b=-10;printf("%d\t%u\n",a,a);  printf("%d\t%u\n",b,b);  return 0;
}

运行结果:
在这里插入图片描述

【例15】g 格式符。用来输出浮点数,系统自动选择f和e格式输出中长度短的那个。

#include <stdio.h>
int main(void)
{double a=12345678954321;printf("%f\n%e\n%g\n",a,a,a);   return 0;
}

运行结果:
在这里插入图片描述

【例16】普通字符原样输出,%字符输出。

#include <stdio.h>
int main(void)
{printf("输出%%\n");   return 0;
}

运行结果:
在这里插入图片描述

3.5.4 用 scanf 函数输入数据

1. scanf 函数的一般形式
  • scanf(格式控制,地址表列)
  • “格式控制”的含义同printf。
  • “地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址
2. scanf 函数中的格式声明
  • 以 % 开始,以一个格式字符结束,中间可以插入附加的字符。
    scanf("a=%f,b=%f,c=%f",&a,&b,&c);
    
表3.8 scanf 函数中用到的格式字符
格式字符说明
d, i输入有符号的十进制整数
u输入无符号的十进制整数
o输入无符号的八进制整数
x, X输入无符号的十六进制整数(大小写作用相同)
c输入单个字符
s输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志 ‘\0’ 作为其最后一个字符
f输入实数,可以用小数形式或指数形式输入
e,E,g,G与 f 作用相同,e 与 f、g 可以互相替换(大小写作用相同)
表3.9 scanf 函数中用到的格式附加字符
格式字符说明
l输入长整型数据(可用%ld,%lo,%lx,%lu)以及 double 型数据(%lf或%le)
h输入短整型数据(可用%hd,%ho,%hx)
域宽指定输入数据所占宽度(列数),域宽应为正数
*本输入项在读后不赋给相应的变量
3. 使用 scanf 函数时应注意的问题

(1)scanf 函数中的格式控制后面应当是变量地址,而不是变量名。

scanf("%f%f%f",a,b,c);      //错误
scanf("%f%f%f",&a,&b,&c);   //正确

(2)如果在格式控制字符串中除了格式声明以外,还有其他字符,则在输入数据时在对应的位置上输入与这些字符相同的字符。

#include <stdio.h>
int main()
{  float a,b,c;scanf("a=%f,b=%f,c=%f",&a,&b,&c);printf("%f\t%f\t%f\n",a,b,c);return 0;
}

运行结果:
在这里插入图片描述

结果说明:在输入时必须按照原字符原样输入,比如控制字符串中有逗号,如果不输入逗号改成空格是错误的,输入结束后回车。

(3)在用 “%c” 格式声明输入字符时,空格字符和“转义字符”中的字符都作为有效字符输入。

#include <stdio.h>
int main()
{  char c1,c2,c3;scanf("%c%c%c",&c1,&c2,&c3);printf("%c\t%c\t%c\n",c1,c2,c3);return 0;
}

测试结果1:
在这里插入图片描述

测试结果2:
在这里插入图片描述

(4)在输入数值数据时,如输入空格、回车、Tab键或遇非法字符(不属于数值的字符)认为该数据结束。

#include <stdio.h>
int main()
{  int a;char b;float c;scanf("%d%c%f",&a,&b,&c);printf("%d\t%c\t%f\n",a,b,c);return 0;
}

运行结果:
在这里插入图片描述

结果说明:第一个要求输入的是整型数值,输入1234后面输入了一个非数值字符a,则第一个整型变量值就为1234了。因为第2个要求输入一个字符,所以输入的字符a即为第2个字符型变量的值。第3个要求输入浮点型数据,第一个数字开始到非数值结束,因为遇到字母o(字母o实际上是要输入数字0的,但是输入错误了,结果也错了)时结束。

3.5.5 字符输入输出函数

1. 用 putchar 函数输出一个字符
  • putchar 函数的一般输出格式:
    putchar©
    举例:

    #include <stdio.h>
    int main()
    {  char a='B',b='O',c='Y';  //定义三个字符变量并初始化int a1=66,b1=79,c1=89;  //定义三个整型变量并初始化BOY三个字符的ASCII码值putchar(a);putchar(b);putchar(c);putchar('\n');putchar(a1);putchar(b1);putchar(c1);putchar('\n');
    }
    

    运行结果:
    在这里插入图片描述

2. 用 getchar 函数输入一个字符
  • getchar 函数的一般格式:
    getchar()

  • getchar函数没有参数,它的作用是从计算机终端输入一个字符。

  • 示例1:

      #include <stdio.h>int main(){  char a,b,c;     //定义三个字符变量a = getchar();     //从键盘输入一个字符,送入字符变量ab = getchar();     //从键盘输入一个字符,送入字符变量bc = getchar();     //从键盘输入一个字符,送入字符变量cputchar(a);putchar(b);putchar(c);putchar('\n');}
    

    (1)若键盘输入三个字符boy,中间无任何字符,然后回车,输出打印boy。
    测试结果1:
    在这里插入图片描述

    (2)若键盘每输入一个字符,按一次enter回车键,输出是什么样的?
    测试结果2:
    在这里插入图片描述

  • 示例2:输入的字符不传送给变量直接输出boy

    #include <stdio.h>
    int main()
    {  putchar(getchar());putchar(getchar());putchar(getchar());putchar('\n');
    }
    

    测试结果:
    在这里插入图片描述

  • 示例3:从键盘上输入任意一个大写字母,在显示屏上显示相应的小写字母。

     #include <stdio.h>int main(){  char c1,c2;c1 = getchar();     //从键盘上输入一个大写字母,送给字符变量c1c2 = c1+32;         //求对应小写字母的ASCII代码,放在字符变量c2中//使用puchar输出putchar(c2);putchar('\n');//使用printf输出printf("大写字母:%c\n小写字母:%c\n",c1,c2);}
    

    运行结果:
    在这里插入图片描述


    本节完

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/614779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UI自动化测试工具对企业具有重要意义

随着软件行业的不断发展&#xff0c;企业对高质量、高效率的软件交付有着越来越高的要求。在这个背景下&#xff0c;UI自动化测试工具成为了企业不可或缺的一部分。以下是UI自动化测试工具对企业的重要作用&#xff1a; 1. 提高软件质量 UI自动化测试工具能够模拟用户的操作&am…

K8s---存储卷(动态pv和pvc)

当我要发布pvc可以生成pv&#xff0c;还可以共享服务器上直接生成挂载目录。pvc直接绑定pv。 动态pv需要两个组件 1、卷插件&#xff1a;k8s本生支持的动态pv创建不包括nfs&#xff0c;需要声明和安装一个外部插件 Provisioner: 存储分配器。动态创建pv,然后根据pvc的请求自动…

易安联参与制定的《面向云计算的零信任体系》行业标准即将实施

中华人民共和国工业和信息化部公告2023年第38号文件正式发布行业标准&#xff1a;YD/T 4598.2-2023《面向云计算的零信任体系 第2部分&#xff1a;关键能力要求》及YD/T 4598.3-2023《面向云计算的零信任体系 第3部分&#xff1a;安全访问服务边缘能力要求》&#xff0c;并于20…

npm run dev,vite 配置 ip 访问

启动项目通过本地 ip 的方式访问 方式一.通过修改 package.json "scripts": {"dev": "vite --host 0.0.0.0",}, 方式二.通过修改 vite.config.ts export default defineConfig({plugins: [vue(), vueJsx()],server: { // 配置 host 与 port 方…

electron+vue网页直接播放RTSP视频流?

目前大部分摄像头都支持RTSP协议&#xff0c;但是在浏览器限制&#xff0c;最新版的浏览器都不能直接播放RTSP协议&#xff0c;Electron 桌面应用是基于 Chromium 内核的&#xff0c;所以也不能直接播放RTSP&#xff0c;但是我们又有这个需求怎么办呢&#xff1f; 市场上的方案…

SQL-修改表操作

目录 DDL-表操作-修改 添加字段 &#xff08;方括号内容可选&#xff09; 修改字段 修改指定字段的数据类型 修改字段名和字段类型 删除字段 修改表名 删除表 删除指定表&#xff0c;并重新创建该表 总结 &#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦…

大文件分片上传,断点续传,秒传 示例(待更新...)

1.html代码 <template><div class"card content-box"><el-upload ref"upload" class"upload-demo" action"https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15":limit"1" :on-change"hand…

30道JVM综合面试题详解含答案(值得珍藏)

1. 描述一下JVM加载Class文件的原理机制? Java中的所有类&#xff0c;都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类&#xff0c;而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候&#xff0c;我们几乎不需要关心类的加载&#xff0c;因为这些都…

网络编程的理论基础

文章目录 1 重点知识2 应用层3 再谈 "协议"4 HTTP协议4.1 认识URL4.2 urlencode和urldecode4.3 HTTP协议格式4.4 HTTP的方法4.5 HTTP的状态码4.6 HTTP常见Header4.7 最简单的HTTP服务器 3 传输层4 再谈端口号4.1 端口号范围划分4.2 认识知名端口号(Well-Know Port Nu…

环信IM Demo登录方式如何修改为自己项目的?

在环信即时通讯云IM 官网下载Demo&#xff0c;本地运行只有手机验证码的方式登录&#xff1f;怎么更改为自己项目的Appkey和用户去进行登录呢&#xff1f; &#x1f447;&#x1f447;&#x1f447;本文以Web端为例&#xff0c;教大家如何更改代码来实现 1、 VUE2 Demo vue2…

叉车车载终端定制_基于MT6762安卓核心板的车载终端设备方案

叉车车载终端是一款专为叉车车载场景设计的4英寸Android车载平板电脑。它采用了高能低耗的8核ARM架构处理器和交互开放的Android 12操作系统&#xff0c;算力表现强大。此外&#xff0c;该产品还具备丰富的Wi-Fi-5、4G LTE和蓝牙等通讯功能&#xff0c;可选配外部车载蘑菇天线&…

【麒麟V10系统x86环境--bash: ./install:/bin/bash:解释器错误: 权限不够】

不知道那位大拿分享的这个神操作、给力呀 标题-bash: ./install&#xff1a;/bin/bash&#xff1a;解释器错误: 权限不够 执行这个命令即可&#xff1b;sudo setstatus Softmode

Ubuntu server搭建dhcp服务器

安装 直接使用一下命令进行安装 apt-get install isc-dhcp-server 以下就是安装好的图片 然后进入dhcp目录 cd /etc/dhcp 进入后用ls查看当前目录存在哪些文件 使用如下进入dhcp.conf vim dhcpd.conf 红&#xff1a;设置ip域和子网掩码 绿&#xff1a;设置ip池范围 黄…

t2vec code

文章目录 执行过程preprocess.jl 解释h5 文件结构 执行过程 (base) zzqserver1:~/project/t2vec/preprocessing$ julia porto2h5.jl Processing 1710660 trips… 100000 200000 300000 400000 500000 600000 700000 800000 900000 1000000 1100000 1200000 1300000 1400000 15…

2024最新适用于 Windows 、Mac 的最佳屏幕录制软件

屏幕录制软件可以帮助我们录制 PC 和MacBook的实时屏幕视频。如果您想为 优酷录制视频&#xff0c;或者您正在为您的公司制作基于视频的项目&#xff0c;并且需要捕获屏幕的实时视频录制&#xff0c;那么我们在此列出了 一 款适合您的 Windows 、Mac的 2024 年最佳屏幕录制软件…

锤科HandShaker修改版,支持安卓14、澎湃OS

如今几乎各家手机厂商都在布局生态&#xff0c;但PC端往往是最容易被忽略的一环&#xff0c;哪怕是很强的华为鸿蒙、小米澎湃&#xff0c;想要做到手机和电脑互联&#xff0c;也限制了笔记本机型 虽然我一直致力于解锁非小米电脑安装小米电脑管家&#xff0c;比如前几天刚刚更…

决策树(公式推导+举例应用)

文章目录 引言决策树学习基本思路划分选择信息熵信息增益增益率&#xff08;C4.5&#xff09;基尼指数&#xff08;CART&#xff09; 剪枝处理预剪枝&#xff08;逐步构建决策树&#xff09;后剪枝&#xff08;先构建决策树再剪枝&#xff09; 连续值与缺失值处理连续值处理缺失…

考古学家 - 华为OD统一考试

OD统一考试 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 有一个考古学家发现一个石碑&#xff0c;但是很可惜发现时其已经断成多段。 原地发现N个断口整齐的石碑碎片&#xff0c;为了破解石碑内容&#xff0c;考古学家希望有程序能帮忙计算复原后的石…

精品公式——“V型反转”,精准把握V型反转行情,主副图分享

► 日线表现 代码评估 技术指标代码评估&#xff1a; M5, M14, M25 - 指数移动平均线&#xff08;EMA&#xff09;: M5:EMA(C,5),COLORLIBLUE;&#xff1a;5日指数移动平均线&#xff0c;用浅蓝色表示。 M14:EMA(C,13),COLORF00FF0;&#xff1a;13日指数移动平均线&#xff…

定时任务框架-xxljob

spring传统的定时任务Scheduled&#xff0c;但是这样存在这一些问题 &#xff1a; 做集群任务的重复执行问题 cron表达式定义在代码之中&#xff0c;修改不方便 定时任务失败了&#xff0c;无法重试也没有统计 如果任务量过大&#xff0c;不能有效的分片执行 1.分布式任务调…