标签:函数 示例 int 程序 编译器 printf 变量 语言
目录该文档是在Visual Studio Code1.67.1上运行
摘自C语言程序设计现代方法第二版(修订版)
第2章 C语言基本概念
# 格式简要介绍
#include<stdio.h>
int main(void)
{
printf("这是第一个示例: " );
return 0;
}
按行释义:
#include<stdio.h> 是必不可少的,它"包含"了C语言标准的输入/输出的相关信息
程序可执行代码都在main函数中,这个函数代表"主"程序,C程序中允许有多个函数,但只有main函数是必须有的,main函数前面的int表明该函数将返回一个整数值,圆括号中的void表明main函数没有参数
main函数中的第一行代码是用来显示期望信息的,printf函数来自标准输入/输出库,可以产生完美的格式化输出,\n告诉printf函数执行完消息显示后要进行换行操作
return 0; 表明程序终止时会向操作系统返回值0,return 也可以写成 return x + 3、return x + 7...
return 0有2个作用:
1、使main函数终止(即结束程序)
2、指出main函数的返回值是0
注:如main函数的末尾没有return语句程序依然能终止,但许多编译器会产生一条告警,告警意为函数应该返回一个整数却没有这么做
# 编译和链接
编译器通常要求带上文件的扩展名.c, 源代码写完后需要把程序转化为机器可执行的形式,对C程序来说转化通常包含下列3步
1、预处理 -- 首先程序会被交给预处理器(preprocessor)。预处理器执行以#开头的命令(通常称为指令)。预处理器有点类似于编辑器,它可以给程序添加内容,也可以修改程序
2、编译 -- 修改后的程序现在可以进人编译器(compiler) 了。编译器会把程序翻译成机器指令(即目标代码)。然而,这样的程序还是不可以运行的。
3、链接 -- 链接器(linker)把由编译器产生的目标代码和所需的其他斯加代码整合在起,这样才最终产生了完全可执行的程序。这些附加代码包括程序中用到的库函数(如printf函数)。
preprocessor --> compiler --> linker
上述的过程是自动实现的,因为预处理器通常会和编译器集成在一起,所以人们不会注意到它在工作
根据不同的编译器和操作系统,编译和链接所需的命令也是多种多样的,在UNIX系统环境下通常把C编译器命名为cc,为了编译和链接上述程序,需要在终端或命令行窗口输人如下命令:
% cc pun.c
注:字符%是UNIX系统的提示符,不需要输人,在使用编译器cc时,系统自动进行链接操作,无须单独的链接命令
在编译和链接好程序后,编译器cc会把可执行程序放到默认名为a.out的文件中。编译器cc有许多选项,其中一个选项(-o)允许为含有可执行程序的文件选择名字。
例如要把文件pun.c生成的可执行文件命名为pun,那么只需输人下列命令:
% cc -o pun pun.c
# 指令
在编译C程序之前预处理器会首先对其进行编辑,我们把预处理器执行的命令成为指令,如 #include<stdio.h> 则说明在编译前把 <stdio.h> 中的信息 "包含" 到程序中
<stdio.h> 被称为头,每个头都包含一些标准库的内容,<stdio.h>没有内置的 "读" 和 "写"命令
所有指令都是以字符 # 开始,指令默认只占一行且每条指令的结尾没有分号或其他特殊标记
# 函数
函数分为2大类:程序员编写的函数 和 作为C语言实现的一部分提供的函数,后者称为库函数(library function),因为他们属于一个由编译器提供的函数"库"
# 语句
要求某个函数执行分派给它的任务称为调用这个函数
C语言规定每条语句都要以分号结尾(复合语句除外),原因是由于语句可以连续占用多行,有时很难确定它的结束位置,因此用分号来向编译器显示语句的结束位置,这点和 指令 不同
# 注释
C语言中注释有4种写法:
/*这是第一种注释*/ ===> 单行注释
/* 这是第二种注释
可要分清了 */
/* 这是第三种注释
可要分清了
*/
/*
* 这是第四种注释
* 可要分清了
*/
C99提供了另一种写法: //这是注释 ===> 单行注释的2种写法都可以
# 变量和赋值
每一个变量都必须有一个类型(type),类型用来说明变量所存储的数据的种类,类型会影响变量的存储方式以及允许对变量进行的操作,所以选择合适的类型非常关键
例如数值型变量的类型决定了变量所能存储的最大值和最小值,同时也决定了是否允许在小数点后出现数字
int(integer)型变量可存整数,整数的取值范围是受限制的,做大的整数通常是2147483647,但在某些计算机上也可能是32767
float(floating-point)型变量可存储带小数位的数,但float型变量在进行算术运算时float型通常比int型变量慢,且float型变量所存储的数值往往只是实际数值的一个近视值
# 声明
在使用变量前必须对其进行声明(为编译器所做的描述),声明变量首先要指定变量的类型,然后说明变量的名字,例如
int book;
int height, length, width, volume;
float profit;
float profit, loss;
int mai(void)
{
声明
语句
}
注: 建议在声明和语句之间留出一个空行
# 赋值
变量通过赋值(assignment)的方式获得值,例如:
height = 8;
length = 9;
变量在赋值或以其他方式使用前必须先声明,即:
int height;
float length;
int volume;
height = 8;
length = 3.5f; # 把一个包含小数点的常量赋值给float型变量时最好在该变量后面加上一个字母f(代表float,默认保留小数点后6位数字)
volume = height * length; # 赋值运算的右侧可以是一个含有常量、变量和运算符的公式(术语叫表达式)
print("%d\n%f\n", height, length) # 占位符%d用来指明在显示过程中变量height和length的值的显示位置,如要强制%f显示小数点后9位数字可在%和f中间加上数字
printf("%d\n", volume);
注:printf("%.2f", length) 即保留小数点后2位
# 初始化
当程序开始执行时,某些变量会被自动设置为零(大多数变量则不会),没有默认值且尚未在程序中被赋值的变量是未初始化的(uninitialized)
在声明变量时加入初始值
int height = 8, length = 12, width = 10; # 在同一个声明中可以对任意数量的变量进行初始化
# 读入输入
为了获取输入就要用到scanf函数,scanf函数和printf相对应,2个函数中的f都是 "格式化" 的意思,且2个函数都需要使用格式串(format string)来指定输入/输出数据的形式
scanf函数需要知道将获得的输入数据的格式
示例:
scanf("%d", &i); 正确
scanf("4df%d", &i); 错误,格式串中不能出现任意多余的字符
printf函数需要知道输出数据的显示格式
示例:
printf("这是你输入的数: %d", i)
一般每一个scanf函数调用都紧跟在一个printf函数调用的后面,这样可提示用户何时输入和输入什么
示例:
#include<stdio.h>
int main(void)
{
int i; ==> 定义变量
printf("请输入你要输出的数: "); ==> 打印提示语
scanf("%d", &i); ==> 获取输入
printf("%d", i); ==> 打印变量/输入
return 0; ==> 返回类型
}
注:如用户输入的不是数值,会返回未知的数值
# 定义常量的名字
当程序含有常量时建议给这些变量命名,在以后阅读程序是也许会有人不明白之前定义常量的含义,因此可采用称为宏定义(macro definition)的特性给常量命名,宏名字一般为大写
格式1:
#define INCHES_PER_POUND 166
说明:这里的 #define 是预处理指令,类似前面的#include,因而该行结尾也没有分号,当对程序进行编译是,预处理器会把每一个宏替换为其表示的值,例如:
weight = (volume + INCHES_PER_POUND - 1) / INCHES_PER_POUND
简化为:weight = (volume + 166 -1) / 166
格式2:
#define INCHES_PER_POUND (2 * 6)
# 标识符
在编写程序时需要对变量、函数、宏和其他实体进行命名,这些名字成为标识符(identifier)。在C语言中标识符可含有字母、数字、下划线,但必须以字符或下划线开头
在C99中标识符还可用某些 "通用字符名"
第4章 表达式
计算通用产品代码的校验码
美国和加拿大的货物生产商会在超市销售的每件商品上放置一个条形码。 这种被称为通用产品代码(Universal Product Code, UPC)的条形码可以识别生产商和产品。
每个条形码表示一个12位的数,通常这个数会打印在条形码下面。例如以下的条形码来自Sufers法式面包腊肠比萨的包装:
数字 0 13800 15173 5 出现在条形码的下方。
第1个数字表示商品的种类(大部分商品用0成者7表示,2表示需要称量的商品,3表示药品或与健康相关的商品,而5表示赠品)。
第一组5位数字用来标识生产商( 13800是雀巢美国的冷冻食品公司的代码)。
第二组5位数字用来标识产品(包括包装尺寸)。
最后1位数字是“校验位”,它唯一的目的是帮助识别前面数字中的错误。如果条形码扫描出现错误,那么前11位数字可能会和最后一位数字不匹配, 超市扫描机将拒绝整个条形码。
下面是一种计算校验位的方法:
首先把第1位、第3位、第5位、第7位、第9位和第11位数字相加:
然后把第2位、第4位、第6位、第8位和第10位数字相加
接着把第一次加法的结果乘以3,再和第二次加法的结果相加;
随后再把上述结果减去1;
相减后的结果除以10取余数;
最后用9减去上一步骤中得到的余数。
拿上述条形码举例,即0+3+0+1+1+3得到第一个和8,
由1+8+0+5+7 得到第二个和21。
把第一个和乘以3(得24)后再加上第二个和得到45(即24+21的和),45减1得到44。
把44除以10取余数为4。再用9减去余数4,结果为5
下面编写一个程序来计算任意通用产品代码的校验位。要求用户输入通用产品代码的前11位数字,然后程序显示出相应的校验位。为了避免混淆,要求用户分3部分输人数字:
左边的第一个数字、第一组5位数字以及第二组5位数字
程序会话的形式如下所示:
Enter the first (single) digit: 0
Enter first group of five digits: 13800
Enter second group of five digits: 15173
Check digit: 5
程序不是按一个5位数来读取每组5位数字的,而是将它们读作5个1位数。把数看成一个个独立的数字来读取更为方便,而且也无须担心由于5位数过大而无法存储到int型变量中。
(某些编译器限定int型变量的最大值为32767。)为了读取单个的数字,我们使用带有%1d转换说明的scanf函数,其中1d匹配只有1位的整数。
文件名:upc.c
#include<stdio.h>
int main(void)
{
int d, i1, i2, i3, i4, i5, j1, j2, j3, j4, j5,
first_sum, second_sum, total;
printf("请输入第一个(段)数字: " );
scanf("%1d", &d);
printf("请输入第二段中的5个数: ");
scanf("%1d%1d%1d%1d%1d", &i1, &i2, &i3, &i4, &i5);
printf("请输入第三段中的5个数: ");
scanf("%1d%1d%1d%1d%1d", &j1, &j2, &j3, &j4, &j5);
first_sum = d + i2 + i4 + j1 + j3 + j5;
second_sum = i1 + i3 + i5 + j2 + j4;
total = 3 * first_sum + second_sum;
printf("check digit: %d\n\n", 9 - ((total - 1) % 10));
return 0;
}
标签:函数,示例,int,程序,编译器,printf,变量,语言 来源: https://www.cnblogs.com/smlile-you-me/p/16288185.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。