C++教程系列之-01-C++概述与NOIP案例

2022-11-12 17:02:27 浏览数 (1)

C 教程系列之-01-C 概述与NOIP案例

  • 1. C 概述
    • 1.1 编程语言
    • 1.2 C与C
    • 1.3 NOIP中的环境
  • 2. C 教程
    • 2.1 C 官网介绍
    • 2.2 编译器
    • 2.3 控制台程序
    • 2.4 C 的程序结构
  • 3. NOIP真题案例

1. C 概述

参考连接:

C 官网

C语言中文网

1.1 编程语言

我们也可以通过”语言“来控制计算机,让计算机为我们做事情,这样的语言就叫做编程语言(Programming Language)。

编程语言有很多种,常用的有C语言、C 、Java、C#、Python、PHP、JavaScript、Go语言、Objective-C、Swift、汇编语言等,每种语言都有自己擅长的方面。

编程语言的发展大概经历了以下几个阶段: 汇编语言 --> 面向过程编程 --> 面向对象编程 汇编语言是编程语言的拓荒年代,它非常底层,直接和计算机硬件打交道,开发效率低,学习成本高; C语言是面向过程的编程语言,已经脱离了计算机硬件,可以设计中等规模的程序了; Java、C 、Python、C#、PHP 等是面向对象的编程语言,它们在面向过程的基础上又增加了很多概念。

1.2 C与C

C语言是一门面向过程的编译型语言,它的运行速度极快,仅次于汇编语言。C语言是计算机产业的核心语言,操作系统、硬件驱动、关键组件、数据库等都离不开C语言;不学习C语言,就不能了解计算机底层。

C 一开始被本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)发明时,起初被称为“C with Classes”,即「带类的C」。

很明显它是在C语言的基础上扩充了类class等面向对象的特性和机制。但是后来经过一步步修订和很多次演变,最终才形成了现如今这个支持一系列重大特性的庞大编程语言。

C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。 C 被认为是一种中级语言,它综合了高级语言和低级语言的特点。 C 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C 进一步扩充和完善了 C 语言,最初命名为带类的C,后来在 1983 年更名为 C 。 C 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C 程序。 注意:使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。

标准库

标准的 C 由三个重要部分组成: 核心语言,提供了所有构件块,包括变量、数据类型和常量,等等。 C 标准库,提供了大量的函数,用于操作文件、字符串等。 标准模板库(STL),提供了大量的方法,用于操作数据结构等。

1.3 NOIP中的环境

经过多轮开发和内部测试,NOI Linux 2.0版(Ubuntu-NOI 2.0版)已经基于Ubuntu 20.04.1版定制完成,现正式对外发布。

根据NOI科学委员会决议,该系统将自2021年9月1日起作为NOI系列比赛和CSP-J/S等活动的标准环境使用。在此日期前,NOI相关活动标准环境仍为旧版NOI Linux。

NOI Linux2.0 的使用教程可参考:

NOI Linux2.0使用(2022.07.21)

NOI Linux2.0中提供的系统情况如下:

2. C 教程

2.1 C 官网介绍

C 官网如下:

https://cplusplus.com/

C 的官网教程如下:

https://cplusplus.com/doc/tutorial/

2.2 编译器

计算机只理解一种语言,这种语言由一组由1和0组成的指令组成。这种计算机语言被恰当地称为机器语言。

对计算机的一条指令可能是这样的:

00000 10011110

允许用户输入两个数字、将两个数字相加并显示总数的特定计算机的机器语言程序可以包含以下机器代码指令:

可以想象,直接用机器语言编写计算机程序,只使用1和0是非常繁琐和容易出错的。为了使编程更容易,开发了高级语言。高级程序还使程序员更容易检查和理解彼此的程序。

如果以上的代码,由C 完成,代码如下:

代码语言:javascript复制
int a, b, sum;
     
cin >> a;
cin >> b;
             
sum = a   b;
cout << sum << endl;

通过对比,理解用c 语言编写程序比用机器语言编写程序要容易得多。

因为计算机只能理解机器语言,而人类希望用高级语言写作,高级语言必须在某个时刻被重写(翻译)成机器语言。这是通过称为编译器解释器汇编器的特殊程序来完成的,这些程序内置于各种编程应用程序中。

c 被设计成一种编译语言,这意味着它通常被翻译成系统可以直接理解的机器语言,这使得生成的程序非常高效。为此,需要一组工具,称为开发工具链,其核心是编译器及其链接器

2.3 控制台程序

控制台程序是使用文本与用户和环境进行通信的程序,例如将文本打印到屏幕上或从键盘读取输入。

对于初学者来说,编译c 程序最简单的方法是使用集成开发环境(IDE)。IDE通常集成了几种开发工具,包括文本编辑器和直接从IDE中编译程序的工具。

常用的几种工具为:

Code::blocks Visual Studio Express Dev-C

关于Code::blocks的安装方式如下:

C 教程系列之-02-win10系统下codeblocks-20.03下载与安装

2.4 C 的程序结构

下面通过一个例子说明C 的程序结构。

打开Code::blocks,新建文件,代码如下:

代码语言:javascript复制
// my first program in C  
#include <iostream>
using namespace std;

int main ()
{
  std::cout << "Hello World! " << endl;;
  cout << "I'm a C   program";
}

先编译,再运行,输出为:

  1. 第一行的 // my first program in C 两个斜杠符号表示该行的其余部分是程序员插入的注释,但对程序的行为没有影响。程序员使用它们来包含关于代码或程序的简短解释或观察。在本例中,它是对程序的一个简短的介绍性描述。
  2. 第二行的 #include <iostream> 以井号(#)开头的行是由预处理器读取和解释的指令。它们是在程序本身开始编译之前解释的特殊行。在本例中,指令#include <iostream>指示预处理器包含一段标准的c 代码,称为头iostream,它允许执行标准的输入和输出操作,例如将这个程序(Hello World)的输出写入屏幕。
  3. 第三行 using namespace std; 为了引用std命名空间中的元素,程序必须限定库中每个元素的使用(就像我们用std::作为cout前缀所做的那样),或者引入其组件的可见性。引入这些组件可见性的最典型方法是使用声明: using namespace std;
  4. 第四行 空行 空行对程序没有影响。它们只是提高了代码的可读性
  5. 第五行 int main () 这一行开始声明函数。从本质上讲,函数是一组有名称的代码语句:在本例中,这为后面的代码语句组提供了名称“main”。函数将在后面的章节中详细讨论,但本质上,它们的定义是由一个类型(int)、一个名称(main)和一对括号(())连续介绍的,可选地包括形参。 名为main的函数是所有c 程序中的一个特殊函数;它是程序运行时调用的函数。所有c 程序的执行都从主函数开始,而不管该函数在代码中的实际位置。
  6. 第六行 和 第九行 { } 第6行的开大括号({)表示main函数定义的开始,第9行的闭大括号(})表示main函数定义的结束。这些大括号之间的所有内容都是函数体,它定义了调用main时发生的事情。所有函数都使用大括号来表示其定义的开始和结束。
  7. 第八行 和 第九行 std::cout << "Hello World! " << endl;; cout << “I’m a C program”; 这2行是一个c 语句。语句是一种实际上可以产生某种效果的表达式。它是程序的核心,指定程序的实际行为。语句的执行顺序与它们在函数体中的出现顺序相同。 如果您以前看过c 代码,您可能见过使用cout而不是std::cout。两者都命名相同的对象:第一个使用其非限定名(cout),而第二个直接在命名空间std中限定它(如std::cout) cout是标准库的一部分,标准c 库中的所有元素都在命名空间中声明:命名空间std。 该语句有四部分:首先,std::cout,它标识标准字符输出设备(通常是计算机屏幕)。第二,插入操作符(<<),它指示将接下来的内容插入std::cout。最后,带有引号的句子(“Hello world!”)是插入到标准输出中的内容。第四,<< endl 表示输入换行符; 注意,语句以分号(;)结束。这个字符标志着语句的结束,就像英语中句点结束一个句子一样。所有c 语句都必须以分号字符结束。c 中最常见的语法错误之一是忘记以分号结束语句。

3. NOIP真题案例

参考:

https://blog.csdn.net/m0_38083668/article/details/82084692

https://blog.csdn.net/scar_lyw/article/details/78834200

题目描述:小凯手中有两种面值的金币,两种面值均为正整数且彼此互素(互素也就是互质,是公约数只有1的两个整数,叫做互质整数。公约数只有1的两个自然数,叫做互质自然数,后者是前者的特殊情形。)。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在小凯无法准确支付的商品。

输入格式:输入数据仅一行,包含两个正整数 a 和 b ,它们之间用一个空格隔开,表示小凯手中金币的面值。

输出格式:输出文件仅一行,一个正整数 N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。

输入 5 7 输出 23 备注

【输入输出样例1说明】

小凯手中有面值为5和7的金币无数个,在不找零的前提下无法准确支付价值为1、2、3、4、6、8、9、11、13、16、18、23的物品,其中最贵的物品价值为11,比23贵的物品都能买到,比如:

24 = 5 * 4 7 * 2

25 = 5 * 5 7 * 0

26 = 5 * 1 7 * 3

27 = 5 * 4 7 * 1

28 = 5 * 0 7 * 4

29 = 5 * 3 7 * 2

30 = 5 * 6 7 * 0

31 = 5 * 2 7 * 3

……

结论为:

x * y - x - y

代码实现

代码语言:javascript复制
#include <bits/stdc  .h>
using namespace std;

long long n,m;

int main()
{
	cin>>n>>m;
	cout<<(n-1)*(m-1)-1<<"n";
	return 0;
}

编译后运行:

0 人点赞