【C语言】语言篇——程序设计入门

news2024/10/6 4:03:37

C站的小伙伴们大家好呀!我最近在学习刘汝佳老师的《算法竞赛入门经典》,跟着这本书来学习和做习题,在这里和大家一起分享进步。下面是本书的第一部分的语言篇。

语言篇——程序设计入门

  • 算术表达式
  • 变量及其输入
  • 顺序结构程序设计
  • 分支结构程序设计
  • 输出实验
  • 习题

算术表达式

#include<stdio.h>
int main(void)
{
	printf("%d\n",8/2);
	printf("%d\n",8/5);
	printf("%d\n",(-8)/5);
	printf("%d\n",8/(-5));
	return 0;
}

运行结果如下:
在这里插入图片描述
那如何计算和输出8/5的值呢?
我们来看下面的程序:

#include<stdio.h>
int main(void)
{
	printf("%.1f\n",8.0/5.0);
	printf("%.2f\n",8.0/5.0);
	printf("%.1f\n",8/5);
	printf("%d\n",8.0/5.0);
	return 0;
}

运行结果如下:
在这里插入图片描述
之所有有上面的输出,这是因为,在C语言中:

整数/整数=整数;
浮点数/浮点数=浮点数;
整数-浮点数=浮点数;

8和5被看作是整数,所以其商也为整数,1。
8.0和5.0被看作是浮点数,所以其商也是浮点数。
而%.1f和%.2f这里的"1"和"2"是小数点后的位数。

变量及其输入

#include <stdio.h>
int main(void)
{
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d\n",a+b);
	return 0;
}

 首先,声明两个整型变量a和b,然后利用scanf()函数从键盘读入数据并放到a和b中。
 scanf的占位符和变量的数据类型应一一对应,且每个变量前需加"&"符号。(可以把变量理解为"存放值的场所")在C语言中,变量有自己的数据类型,例如,int型变量存放整数值,而double型变量存放双精度浮点数。
例题1-1
输入底面半径r和高h,输出圆柱体的表面积,保留3位小数。

样例输入:
3.5 9
样例输出:
Area=274.889

分析
表面积=侧面积+底面积 × 2 \times 2 ×2
我们先来看下面这样一个错误的程序:

#include <stdio.h>
#define PI 3.14
int main(void)
{

	double r,h,s1,s2,Area;
	scanf("%d%d",&r,&h);//输入半径和高
	s1=2*PI*r*h;
	s2=2*PI*r*r;
	Area=s1+s2;
	printf("Area=%.3lf\n",Area);
	return 0;
}

错误原因:

代码实现

#include <stdio.h>
#define PI 3.14
int main(void)
{
    double r,h,s1,s2,Area;
	scanf("%lf%lf",&r,&h);//输入半径和高
	s1=2*PI*r*h;//侧面积
	s2=2*PI*r*r;//上底和下底底面积
	Area=s1+s2;
	printf("Area=%.3lf\n",Area);
	return 0;
}

 上述的代码中对于常量 π \pi π的处理是用宏定义来处理的。
编译程序时,所有的PI都会用3.14来替换,这一过程被称为编译时替换。在运行程序时,程序中所有的替换均已完成。

#define指令还可定义字符和字符串常量。前者使用单引号,后者使用双引号。如下所示:

#define ESC '\033'
#define OOPS "Now you have done it!"

此外,还可以利用关键字const类型限定符来定义常量。
const类型限定符
const所修饰的内容是不可变的,故只有可读性。
宏和const的区别是,在代码生成时所被处理的阶段不同,宏的替换在预编译(预处理)阶段,而const 常量则在编译阶段才确定,并分配内存。

const常量有数据类型,而宏没有数据类型。编译器只对宏在预编译阶段进行替换,却没有类型及安全检查,所以在替换过程中可能会出现错误。但是编译器却可以对const所定义的常量进行类型和安全检查,由宏引起的错误一般调试不出来,而const常量可以。

即,将上述代码改写为:

#include <stdio.h>
#include <math.h>
int main(void)
{

	double r,h,s1,s2,Area;
    const double PI = acos(-1.0);
	scanf("%lf%lf",&r,&h);//输入半径和高
	s1=2*PI*r*h;
	s2=2*PI*r*r;
	Area=s1+s2;
	printf("Area=%.3lf\n",Area);
	return 0;
}

补充:

接下来,我们看以下这条赋值语句

s1=2*PI*r*h;

 对于赋值语句,“赋值”是个动作,其确切的含义是,先计算右边的值,再赋值给左边的变量,覆盖它原来的值。变量是“喜新厌旧”的,即新的值将覆盖原来的值,一旦被赋予了新的值,变量中原来的值就丢失了。

顺序结构程序设计

例题1-2
输入一个三位数,分离出它的百位十位和个位,反转后输出。

样例输入:
127
样例输出:
721

分析
读入n,百位=n/100,十位=n/10%10,个位=n%10
代码实现

#include <stdio.h>
int main(void)
{
	int n;
	scanf("%d",&n);
	printf("%d%d%d\n",n%10,n/10%10,n/100);
	return 0;
}

这里有一个问题是,如果个位是0,例如输入250,输出052吗?
所以我们可以进一步改进:
方法一

#include <stdio.h>
int main(void)
{
	int n,m;
	scanf("%d",&n);
	m=n%10*100+n/10%10*10+n/100;
	printf("%d\n",m);
	return 0;
}

这样如果是输入250,就会输出52。
若改变输出格式,也可以输出052。

printf("%03d\n",m);

方法二分支结构:

#include <stdio.h>
int main(void)
{
	int n,m;
	scanf("%d",&n);
	if (n%10)   //个位不等于0
		printf("%d%d%d\n",n%10,n/10%10,n/100);
	else if (n%10==0)   //个位等于0
		printf("%d%d\n",n/10%10,n/100);
	return 0;
}

例题1-3
交换变量:输入两个整数m和n,交换二者的值,然后输出。

样例输入:
824 16
样例输出:
16 824

最简单的做法,输出时交换:

#include <stdio.h>
int main(void)
{
	int n,m;
	scanf("%d%d",&n,&m);
	printf("%d %d \n",m,n);
	return 0;
}

最经典的做法:三变量法:

#include <stdio.h>
int main(void)
{
	int n,m,t;
	scanf("%d%d",&n,&m);
	t=n;n=m;m=t;
	printf("%d %d\n",n,m);
	return 0;
}

不借助任何变量,进行交换:

#include<stdio.h>
int main()
{
 int m, n;
 scanf("%d%d", &m, &n);
 m = m + n;
 n = m - n;
 m = m - n;
 printf("%d %d\n", m, n);
 return 0;
}

分支结构程序设计

例题1-4
鸡兔同笼:
已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。如果无解,则输出No answer。
分析
假设鸡有a只,兔有b只,则a+b=n,2a+4b=m,联立解得a=(4n-m)/2,b=n-a。
怎样判断无解呢?
解出a或者b是负数。或者a或者b不是整数。

#include<stdio.h>
int main()
{
 int a, b, n, m;
 scanf("%d%d", &n, &m);
 a = (4*n-m)/2; b = n-a;
 if(m % 2 == 1 || a < 0 || b < 0)  //短路的方法计算逻辑表达式
 printf("No answer\n");
 else
 printf("%d %d\n", a, b);
 return 0;
}

C语言中的逻辑运算符,都是短路运算符,一旦能确定整个表达式的值,就不再进行计算了。
例题1-5:三个整数排序
输入三个整数,从小到大排序后输出。

样例输入
20 7 33
样例输出
7 20 33

分析
方法一这三个数有可能的六种排序:
abc,acb,bac,bca,cab,cba,所以我们可以利用分支结构一一列出:
(这里需要注意的是,千万不要忽略等于即不仅仅有可能是a<b<c,也有可能a<=b<=c)

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

方法二
利用前面讲过的三变量交换法,先检查a和b,使得a是a和b中最小的数,然后再检查,a和c使得a是a和c中最小的数(即a,b,c中最小的数),然后再检查b和c,使得b是b和c中最小的数。

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

输出实验

转义字符\n

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

在这里插入图片描述
输出’’

#include <stdio.h>
int main(void)
{
	printf("\\\n");//编译器会把双斜线理解成单个字符'\'
	return 0;
}

在这里插入图片描述
表达式1/0 ,1.0/0.0,0.0/0.0

	printf("%d",0.0/0.0);
	printf("%d",1.0/0.0);
	printf("%d",1/0);

系统都会报错:

divide or mod by zero

习题

习题1-1平均数(average)
输入3个整数,输出他们的平均值,保留3位整数。

#include <stdio.h>
int main(void)
{
	double a,b,c;
	scanf("%lf%lf%lf",&a,&b,&c);
	printf("%.3lf\n",(a+b+c)/3);
	return 0;
}

习题1-2温度(temperature)
输入华氏温度f,输出对应的摄氏温度c,保留3位小数。提示:c=5(f-32)/9。

#include <stdio.h>
int main(void)
{
	double f;
	scanf("%lf",&f);
	printf("%.3lf\n",5*(f-32)/9);
	return 0;
}

习题1-3连续和(sum)
输入正整数n,输出1+2+3+……+n。

#include <stdio.h>
int main(void)
{
	int i,n,sum=0;
	scanf("%d",&n);
	for (i=1;i<=n;i++)
		sum+=i;
	printf("%d\n",sum);
	return 0;
}

习题1-4正弦和余弦(sin和cos)
输入正整数n(n<360),输出n度的正弦、余弦函数值。

#include <stdio.h>
#include <math.h>
int main(void)
{
	double n;
	const double PI=3.1415;
	scanf("%lf",&n);
    printf("cos(%.1lf)=%lf,sin(%.1lf)=%lf\n",n,cos(n/180*PI),n,sin(n/180*PI));
	return 0;
}

这里需要注意的是,输入的n是角度,而cos(),sin()函数的参数是弧度制的,所以需要转化。
习题1-5
一件衣服95元,若消费满300元,可打八五折。输入购买衣服件数,输出需要支付的金额(单位:元),保留两位小数。

#include <stdio.h>
int main(void)
{
	int n;
	scanf("%d",&n);
	if (n*95>=300)
		printf("%.2lf\n",n*95*0.85);
	else
		printf("%d\n",n*95);
	return 0;
}

习题1-6 三角形(triangle)
输入三角形3条边的长度值(均为正整数),判断是否能为直角三角形的3个边长。如果可以,则输出yes,如果不能,则输出no。
如果根本无法构成三角形,则输出not a triangle。

#include <stdio.h>
int main(void)
{
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	if (a+b<=c || a+c<=b || b+c<=a)//无法构成三角形
		printf("not a triangle\n");
	else if (a*a+b*b=c*c || a*a+c*c=b*b || b*b+c*c=a*a)//直角
		printf("yes\n");
	else 
		printf("no\n");
	return 0;
}

习题1-7年份(year)
输入年份,判断是否为闰年。如果是,则输出yes,否则输出no。
判断闰年
能被4整除但不能被100整除,或者能被100整除。

#include <stdio.h>
int main(void)
{
	int n;
	scanf("%d",&n);
	if (n/400==0  ||  (n%4==0 && n/100!=0))
		printf("yes\n");
	else
		printf("np\n");
	return 0;
}

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

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

相关文章

1.1 什么是eBPF?(上)

大多数介绍eBPF的文章都是用“eBPF是一种革命性的内核技术”来描绘的。这样讲一点也不夸张。因为它允许在Linux的内核中执行沙盒程序,在不改变内核源码或加载内核模块的前提下直接地,安全地,快捷地扩展内核,并改变内核的行为。可以想像在运行时,将用户空间的eBPF程序加载到…

C4D R26 渲染学习笔记 建模篇(2):手动建模

介绍篇 C4D R26 渲染学习笔记&#xff08;1&#xff09;&#xff1a;C4D版本选择和初始UI框介绍 C4D R26 渲染学习笔记&#xff08;2&#xff09;&#xff1a;渲染流程介绍 C4D R26 渲染学习笔记&#xff08;3&#xff09;&#xff1a;物体基本操作快捷键 建模篇 C4D R26 渲…

第一个servlet的程序

文章目录 一.Hello World的程序1.创建项目2.引入依赖3.创建目录4.编写代码5.打包程序6.部署程序7.验证程序 二.简化部署方式1.下载插件2.配置smart Tomcat插件3.测试插件 三.常见的servelt问题出现 404出现 405出现 500出现 "空白页面"出现 "无法访问此网站&quo…

图像风格迁移

一、简介 图像风格迁移是指&#xff0c;将一副内容图的内容&#xff0c;和一幅或多幅风格图的风格融合在一起&#xff0c;从而生成一些有意思的图片。 我们使用 TensorFlow 和 Keras 分别来实现图像风格迁移&#xff0c;主要用到深度学习中的卷积神经网络&#xff0c;即CNN。…

Transformer应用之构建聊天机器人(二)

四、模型训练解析 在PyTorch提供的“Chatbot Tutorial”中&#xff0c;关于训练提到了2个小技巧&#xff1a; 使用”teacher forcing”模式&#xff0c;通过设置参数“teacher_forcing_ratio”来决定是否需要使用当前标签词汇来作为decoder的下一个输入&#xff0c;而不是把d…

Linux:查看进程。

Linux&#xff1a;查看进程。 windows linux TTY如果是&#xff1f;说明是不是终端(控制台)启动的&#xff0c;而是系统内部自己启动的。 TIME是启动Linux后&#xff0c;这个进程一共占用了cpu多少时间00…

《Spring Guides系列学习》guide46 - guide50

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gui…

《Python安全攻防:渗透测试实战指南》极致经典,学完即可包吃包住

前言 网络江湖&#xff0c;风起云涌&#xff0c;攻防博弈&#xff0c;从未间断&#xff0c;且愈演愈烈。从架构安全到被动纵深防御&#xff0c;再到主动防御、安全智能&#xff0c;直至进攻反制&#xff0c;皆直指安全的本质——攻防。未知攻&#xff0c;焉知防! 每一位网络安…

【Python】循环语句 ② ( while 嵌套循环 | 代码示例 - while 嵌套循环 )

文章目录 一、while 嵌套循环1、while 嵌套循环语法2、代码示例 - while 嵌套循环 一、while 嵌套循环 1、while 嵌套循环语法 while 嵌套循环 就是 在 外层循环 中 , 嵌套 内层循环 ; while 嵌套循环 语法格式 : while 外层循环条件:外层循环操作1外层循环操作2while 内存循…

VuePress + GitHub Actions 自动部署

文章目录 前言背景GitHub Actions简介基本概念引用 Actionworkflow 文件 自动部署创建 Action权限问题 小结参考文献 前言 我的第二本开源书籍《后台开发命令 365》上线啦。 为了方便阅读&#xff0c;使用 VuePress 将之前记录的后台常用 Linux 命令博文整理成一个系统的开源…

路径规划算法:基于阴阳对优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于阴阳对优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于阴阳对优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

Compose 没有 inputType 怎么过滤(限制)输入内容?这题我会!

前言 闲话 在我之前的文章 《Compose For Desktop 实践&#xff1a;使用 Compose-jb 做一个时间水印助手》 中&#xff0c;我埋了一个坑&#xff0c;关于在 Compose 中如何过滤 TextField 的输入内容。时隔好几个月了&#xff0c;今天这篇文章就是来填这个坑的。 为什么需要…

Doris

Aggregate 模型 是相同key的数据进行自动聚合的表模型。表中的列按照是否设置了 AggregationType&#xff0c;分为 Key&#xff08;维度列&#xff09;和 Value&#xff08;指标列&#xff09;&#xff0c;没有设置 AggregationType 的称为 Key&#xff0c;设置了 Aggregation…

散列表(哈希表)

目录 散列表 散列函数 散列表常用函数 1. 直接定址法 2. 除留余数法 2.1. exmple 3. 数字分析法 4. 平方取中法 5. 折叠法 处理冲突的方法 1. 开放定址法---线性探测 2. 二次探测法 3. 再Hash法 4. 拉链法(链地址法) 散列表&#xff08;Hash table&#xff0c;也…

Redis缓存击穿及解决问题

缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时候&#xff0c;恰好这时间点对这个 Key有大量的并发请求过来&#xff0c;这些请求发现缓存过期- -般都会从后端DB加载数据并回设到缓存&#xff0c;这个时候大并发的请求可能会瞬间把DB压垮。 解决方案有两种…

第五十四天学习记录:C语言进阶:动态内存管理Ⅱ

常见的动态内存错误 1、对NULL指针的解引用操作 int* p(int*)malloc(4); //p进行相关的判断 *p10;//malloc开辟空间失败&#xff0c;有可能对NULL指针解引用 free(p); pNULL;2、对动态开辟的内存的越界访问 int* p(int*)malloc(40);//10个int if(p!NULL) {int i0;//越界for(…

微服务项目租房网

文章目录 一、租房网项目的介绍1、使用的技术介绍2、使用的组件和开发工具的版本以及作用3、项目模块结构4、项目总体架构 二、环境搭建1、启动前端服务2、CentOS7各个组件的安装2.1 安装Docker2.2 安装JDK2.3 安装Redis(6390)2.4 安装FastDFS(8888)2.5 安装MongoDB(27017)2.6 …

Niagara—— 概述

目录 一&#xff0c;核心组件 Systems Emitters Modules Parameters 二&#xff0c;创建系统或发射器向导 System向导 Emetter向导 三&#xff0c;Niagara VFX工作流程 创建系统 创建或添加发射器 创建或添加模块 Niagara是最新一代VFX系统&#xff0c;无需程序员…

Junit测试框架详解

目录 Junit框架 导入Junit到项目 Junit注解 Test Disabled BeforeAll / AfterAll BeforeEach / AfterEach 参数化 单参数 多参数 CSV获取参数 方法获取参数 断言 assertEquals / assertNotEquals assertNull / assertNotNull 用例执行顺序 测试套件Suite 指定…

使用IIS创建WEB服务

文章目录 前言一、Web服务是什么&#xff1f;1.Web服务概述2.如何获取网页资源3.常见Web服务端软件4.什么是IIS 二、安装IIS1.安装Web服务器角色2.准备网页文件3.配置Web站点4.客户端浏览例&#xff1a;配置IIS站点 三、虚拟主机概述1.虚拟Web主机2.虚拟主机的几种类型3.基于端…