【计算机408学习笔记】C语言(初级) 2023-12-26

发布时间:2024年01月04日

02数据的类型、数据的输入输出(部分)

1.混合运算
  • float j=i/2;? ??左操作数i、右操作数2。
  • 整型数进行除法运算时,如果运算结果为小数,那么存储浮点数时一定要进行强制类型转换。
  • 例子
#include <stdio.h>

int main() {
????int i=5;
????float j=i/2;//这里做的是整型运算,因为左右操作数都是整型
????float k=(float)i/2;//强制类型转换(float)i
????printf("%f\n",j);
????printf("%f\n",k);
????return 0;
}
  • 结果
2.000000
2.500000
补充:I/O?input/output? 输入/输出
2.printf函数
  • 可以输出各种类型的数据,包括整型、浮点型、字符型、字符串型等。
  • 实际原理:printf函数将这些类型的数据格式化为字符串后,放入标准输出缓冲区,然后将结果显示到屏幕上。
  • 例子
#include <stdio.h>

int main() {
????int age=21;
????printf("Hello %s, you are %d years old\n","Bob",age);
????return 0;
}
  • 结果
Hello Bob, you are 21 years old
  • %codes表示不同的变量类型,也可以限制变量的长度。
  • 位于%和格式化命令之间的一个整数被称为最小字段宽度说明符;%f精度修饰符制定想要的小数位数;%s精度修饰符标识一个最大的长度。
  • printf函数的所有输出都是右对齐,除非在%符号后放置了负号
  • 例子
#include <stdio.h>

int main() {
????int i=10;
????float f=96.3;
????printf("student number=%d score=%f\n",i,f);
????printf("student number=%3d score=%5.2f\n",i,f);
????printf("student number=%-3d score=%5.2f\n",i,f);//默认左对齐,添加负号右对齐
????printf("%s\n","hello");
????printf("%10s\n","hello");
????printf("%-10s\n","hello");
????return 0;
}
  • 结果
student number=10 score=96.300003
student number= 10 score=96.30
student number=10??score=96.30
hello
?????hello
hello
3.整型常量的不同进制表示
  • 二进制0,1:一个字节byte为8位bit,1位存储0或1。
  • 1KB=1024B;1MB=1024KB;1GB=1024MB。
  • int型常量的大小为4字节,32位,最高位代表负号,0为正数,1为负数。
  • 十进制0~9: %d;八进制0-7: %o;十六进制0~9、A~F: %x? %X
  • 十进制转化为二进制:123转化为二进制,除以2取余数直到商为0,然后逆序写出所有余数,不足位数的前方补0,则为0000 0000 0000 0000 0000 0000 0111 1011
  • 十进制转化为十六进制:123转化为十六进制,除以16,商7余11,则为7b(a为10,b为11,依次类推)
  • 十进制转化为八进制:123转化为八进制,除以8,则为173
  • 二进制转化为十六进制:从右往左2的0123次幂,如为1则计算,为0则不计算,1011→2^0+2^1+2^3=11(即b)0111→2^0+2^1+2^2=7
  • 二进制转化为八进制:每三个数分为一组001 111 011,001→2^0=1? 111→2^0+2^1+2^2=7? 011→2^0+2^1=3
  • 八进制转化为十进制:173→(1*8^2=64)+(7*8^1=56)+? (3*8^0=3)=123
  • 例子
#include <stdio.h>

int main() {
????int i=123;
????printf("%d\n",i);//十进制输出
????printf("%o\n",i);//八进制输出
????printf("%x\n",i);//十六进制输出
????return 0;
}
  • 结果
123
173
7b
4.内存视图
  • 十六进制在观察内存时需要频繁使用。
  • 123的十六进制显示为0x0000007b,为什么显示结果为7b000000呢?原因是英特尔的CPU采用了小端方式进行数据存储,因此 低位在前,高位在后。
int i=123;//十进制赋值;
int i=0123;//八进制赋值;
int i=0x123;//十六进制赋值;
5.计算器使用
  • win+r打开运行;输入calc打开计算器
6.scanf函数
  • C语言通过函数库读取标准输入,然后通过对应函数处理将结果打印到屏幕上。C语言未提供输入/输出关键字,其输入输出是通过标准函数库来实现的。
  • C语言通过scanf函数读取键盘输入、键盘输入又被称为标准输入。当scanf函数读取标准输入时,如果还没有输入任何内容,那么scanf函数会被卡住(阻塞)。
  • 原理:输入的时候都是字符串,scanf通过定义的数据类型进行转换
  • 例子
#include <stdio.h>

int main() {
????int i=10;
????scanf("%d",&i);//scanf用来读取标准输入,scanf需要把标准输入的内容存放到某个变量空间,因此变量必须取地址
????printf("i=%d\n",i);
????return 0;
}
  • 结果
20
i=20
7.行缓冲
  • 为什么c没有卡住输入?在执行scanf("%d",&i);时,输入数值30\n;在执行printf("i=%d\n",i);时,读取30,留下\n在缓冲区;在执行scanf("%c",&c);时,读取缓冲区的\n;在执行printf("c=%c\n",c);时,输出了换行。整个过程可以通过断点调试查看。
  • 例子
#include <stdio.h>

int main() {
????int i;
????char c;
????scanf("%d",&i);
????printf("i=%d\n",i);
????scanf("%c",&c);
????printf("c=%c\n",c);
????return 0;
}
  • 结果
30
i=30
c=
  • 解决办法: fflush( stdin );
  • 例子
#include <stdio.h>

int main() {
????int i;
????char c;
????scanf("%d",&i);//scanf用来读取标准输入,scanf需要把标准输入的内容存放到某个变量空间,因此变量必须取地址
????printf("i=%d\n",i);
????fflush(stdin);//清空标准输入缓冲区
????scanf("%c",&c);
????printf("c=%c\n",c);
????return 0;
}
  • 结果
20
i=20
f
c=f
  • 当进行断点调试时,为什么蓝色区域为第6行?因为当进行变量定义时,如果没有赋值,则该条语句不执行。
  • scanf函数在读取 整型数、浮点数、字符串时,会忽略\n、空格符等字符(scanf函数执行时会首先删除这些字符,然后再阻塞)。
  • scanf函数匹配一个字符时,会在缓冲区删除对应的字符。
  • 在执行scanf("%c",&c)语句时,不会忽略任何字符,所以scanf("%c",&c)读取了还在缓冲区中残留的\n。
  • scanf会阻塞,是因为标准输入缓冲区是空的
  • 例子
#include <stdio.h>


int main() {
????int i;
????float j;
????scanf("%d",&i);
????printf("i=%d\n",i);
????scanf("%f",&j);
????printf("j=%f\n",j);
????return 0;
}
  • 结果
20
i=20
11.1
j=11.100000
8.多种数据类型混合输入
  • 让scanf函数一次性读取多种类型的数据时,需注意字符型数据。因为当一行数据中存在字符型数据读取时,读取的字符并不会忽略空格和\n。
  • 当%c不在第一个位置时,需在%c之前增加一个空格。
  • 例子
#include <stdio.h>

int main() {
????int i,ret;
????float f;
????char c;
????ret=scanf("%d %c%f",&i,&c,&f);//%c之前增加空格
????printf("i=%d,c=%c,f=%5.2f\n",i,c,f);
????return 0;
}
  • 结果
1 g 11.2
i=1,c=g,f=11.20
  • 例子
#include<stdio.h>

int main() {
????int i,ret;
????float f;
????char c;
????ret=scanf("%d%c%f",&i,&c,&f);//%c之前不增加空格
????printf("i=%d,c=%c,f=%5.2f\n",i,c,f);
????return 0;
}
  • 结果
1 g 11.2
i=1,c= ,f= 0.00
注释的快捷键:选择需要注释的内容,ctrl+/;取消注释,再操作一次。
9.OJ网站及其使用
文章来源:https://blog.csdn.net/qq_41506166/article/details/135342921
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。