计算机基础知识

计算机发展历程:从ENIAC到冯·诺依曼体系

1946年,世界上第一台通用电子计算机ENIAC(电子数字积分计算机)在美国诞生,其主要由电子管组成,体积庞大且功耗极高,运算速度仅为每秒5000次加法运算。
1945年,冯·诺依曼提出的"存储程序"概念彻底改变了这一局面,该体系结构明确计算机应包含运算器、控制器、存储器、输入设备和输出设备五大核心部件,并将程序与数据一同存储于存储器中,奠定了现代计算机的理论基础。

此后,计算机经历了四代演进:

代际 时间范围 主要元件 核心特点
第一代 1946-1957 电子管 体积大、耗电高、可靠性低
第二代 1958-1964 晶体管 体积缩小、功耗降低、可靠性提升
第三代 1965-1970 集成电路 小型化、成本降低、性能提升
第四代 1971至今 超大规模集成电路 微型化、智能化、网络化普及 4

计算机系统组成:硬件与软件的协同

硬件组成:冯·诺依曼五大部件的现代实现

运算器与控制器共同构成CPU(中央处理单元),其中运算器(ALU)负责算术与逻辑运算,控制器(CU)协调各部件工作,寄存器则用于临时存储运算数据。CPU性能常用时钟频率(单位GHz)衡量,频率越高处理速度通常越快。

存储器分为内存与外存:

内存包括RAM(随机存取存储器,断电后数据丢失,用于临时存储运行中的程序和数据)

ROM(只读存储器,断电数据不丢失,存储固件程序)及缓存(高速缓冲存储器,提升CPU访问数据效率);

外存如硬盘、SSD则用于长期存储数据。早期计算机曾使用磁心存储元件作为内存,功能与现代RAM类似。

输入/输出设备(I/O设备) 是计算机与外界交互的桥梁:输入设备如键盘、鼠标、扫描仪,用于将外部信息传入计算机;输出设备如显示器、打印机、音箱,用于呈现计算结果。随着物联网技术发展,智能传感器(如温度传感器、运动传感器)成为新型输入设备,可实时采集环境数据并传入计算机系统,体现了2025年GESP考纲对物联网设备概念的新增要求。

软件系统:从系统软件到应用软件

软件分为系统软件与应用软件:
系统软件是计算机运行的基础,包括操作系统(常见的操作系统 苹果的IOS、华为的鸿蒙、小米的澎湃)、驱动程序等,其中操作系统负责文件管理、进程调度、内存分配等核心功能;
应用软件则是为特定需求开发的程序,如办公软件(wps、office、还有真题出现的金山永中)、编程工具等。

数据存储:二进制与存储单位换算

计算机内部采用二进制表示信息,位(bit) 是最小单位(0或1),字节(Byte) 为基本存储单位,1 Byte = 8 bits。

存储单位换算关系
1 KB = 1024 B(注意:非1000 B,这是考试常见易错点)
1 MB = 1024 KB
1 GB = 1024 MB

例如,一个4 GB的U盘实际可存储容量约为4 × 1024 × 1024 × 1024 Byte,而非直观的4000 MB。

计算机语言:从机器语言到高级语言

计算机语言按抽象程度分为三代:
机器语言由0和1组成,可直接被CPU执行,但可读性极差;
汇编语言用助记符代替机器指令,需汇编器转换为机器语言;
高级语言(如C++)采用接近自然语言的语法,需通过编译器编译为机器语言后执行。

GESP一级C++认证即针对高级语言编程能力的考核,要求掌握基本语法与编程逻辑。

真题中有 GESP认证是有3种语言 图形化、python 、c++ 、每个等级难度是相同的和语言无关

C++编程基础

开发环境使用

在GESP一级C++考试中,熟练掌握开发环境的使用是完成编程任务的基础。考试流程以“新建-编写-编译-调试”为主线,考生需通过集成开发环境(如Dev C++)完成代码开发的全流程操作。以下将详细介绍核心操作步骤、关键快捷键及常见问题解决方法。

核心操作流程

GESP一级考试中,开发环境的使用遵循标准化流程,具体包括三个关键环节,调试打断短点我会放到算法班讲解:

  1. 新建文件

    启动Dev C++后,通过“文件→新建→源代码”创建空源文件(扩展名为.cpp),该文件将用于编写C++代码。新建的源文件需确保为空白状态,避免残留无关代码影响编译结果。

  2. 编写代码

    在代码编辑窗口中输入题目要求的程序逻辑,Dev C++提供代码高亮和自动补全功能,可辅助减少语法错误。编写时需注意代码缩进规范,确保结构清晰,便于后续调试。

  3. 编译与运行

    完成代码编写后,需通过编译器将源代码转化为可执行文件。编译操作可通过快捷键F9执行,若代码存在语法错误,编译器会在下方信息栏提示具体错误位置。运行F10,编译和运算F11。

关键快捷键汇总

  • Ctrl+S:保存当前代码(建议每编写5-10行代码执行一次,防止意外丢失)
  • F9:编译源代码(检查语法错误)
  • F5:启动调试模式(配合断点使用,逐行排查逻辑问题)
  • F10:直接运行程序(适用于快速验证代码输出结果)
  • F11:编译运行程序(一般都选择这个快捷键方便哈哈哈)

基本语法结构

C++ 程序的基本语法结构是编写正确代码的基础,涵盖程序框架、标识符命名、常量变量定义及注释规范等核心要素。通过正确与错误代码的对比分析,能更直观地理解语法规则的重要性。

程序框架与命名空间

C++ 程序需遵循固定的框架结构,其中 命名空间 的正确使用是避免编译错误的关键。标准框架如下:

cpp

#include <iostream>  // 引入输入输出流库,提供 cout/cin 功能
using namespace std; // 使用标准命名空间,简化 std::cout 为 cout
int main() {         // 主函数,程序执行入口
    // 核心代码区域
    return 0;        // 程序正常结束标志
}

错误对比:若省略 using namespace std;,直接使用 cout 会导致“未定义标识符”错误:

cpp

#include <iostream>
// 缺少 using namespace std;
int main() {
    cout << "Hello"; // 编译错误:'cout' 未声明
    return 0;
}
  • #include :必须放在程序开头,否则无法使用输入输出功能。
  • int main():唯一的程序入口,函数体用 {} 包裹,不可嵌套其他 main 函数。
  • return 0:主函数结束时必须返回整数,0 表示程序正常退出。

这个框架要求一级的考生全部能自己默写出来,默不出来的同学也不要慌,Devc++里自带框架,

但是using namespace std;这个是要求自己能记下来的。

标识符与关键字

标识符也叫变量名
是用于命名变量、函数的符号,需严格遵循命名规则:
只能包含字母(A-Z/a-z)、数字(0-9)和下划线(_),且不能以数字开头,区分大小写,禁止使用关键字。

类别 合法示例 非法示例 错误原因
变量名 _countnum1 2vara+b 以数字开头/包含非法符号
常量名 MAX_SIZE int 使用关键字作为标识符
函数名 calcSum my-var 包含减号(非法符号)

关键字是 C++ 预留的特殊词汇,如 intiffor 等,具有固定语法功能,判断关键字的小技巧输入到Devc++中看看是否会变粗在做真题发现题目会有坑会问你cin cout可以做变量名不 他们不是关键字可以做变量名喔关键字看这里  cin cout printf scanf 不是关键

C++基本数据类型

一、整数类型

用于存储没有小数部分的数字,是编程中最常用的类型之一。

类型 存储大小(通常) 取值范围
int 4 字节 -2,147,483,648 ~ 2,147,483,647
long long 8 字节 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

二、浮点数类型

用于存储带有小数部分的数字,适合表示分数、小数等。

类型 存储大小 精度 示例
float 4 字节 约 7 位有效数字 3.1415926f(末尾加 f 表示 float 类型)
double 8 字节 约 15-16 位有效数字 3.141592653589793(默认的浮点类型)
  • cout 默认显示 6 位有效数字
  • 可用 printf 控制精度:

    cpp

    double b = 4214.21421412;
    printf("%.6f\n", b); // 输出 6 位小数
    printf("%.2f\n", b); // 输出 2 位小数
    

三、字符与字符串类型

用于存储文本数据。

类型 存储 示例
char 1 字节(ASCII 码) 'A', 'b', '1'(使用单引号)
string 动态长度(需包含头文件 #include <string> "Hello"(使用双引号)

四、布尔类型

用于表示逻辑判断结果(真 / 假)。

类型 取值 存储
bool true(1) / false(0) 1 字节

五、变量定义和赋值

cpp

数据类型 变量名; // 声明但不初始化(值随机)
数据类型 变量名 = 值; // 声明并初始化
int a; // 未初始化,可能为任意值
int b = 10; // 初始化为 10
double pi = 3.14;
char ch = 'A';
string name = "Alice";
bool isOK = true;

基本运算

算术与关系算

1、赋值运算符(=)

把右边的内容赋值给左边,很多同学会和(==)搞混

int a=10;//是把10赋值给a

a==10 //(==)是比较运算符 返回 0 / 1
2、算术运算符

加(+)、减(-)、乘(*)、除(/)和取余(%

取余运算应用:

// 判断奇偶性
if (x % 2 == 1) cout << x << "是奇数";
if (x % 2) cout << x << "是奇数";

if (x % 2 == 0) cout << x << "是偶数";


// 判断整除性
if (x % 3 == 0) cout << x << "能被3整除";
if (x % 7 == 0) cout << x << "能被7整除";
if (x % n == 0) cout << x << "能被n整除";

求多位数的各位数字:

int a = 1234;

// 个位:a % 10 = 4
// 十位:a / 10 % 10 = 3
// 百位:a / 100 % 10 = 2
// 千位:a / 1000 % 10 = 1

// 时间转换示例:3661秒 = ?小时?分钟?秒
int t = 3661;
int s = t % 60;  // 1秒
int f = t / 60 % 60;  // 1分钟
int h = t / 3600;  // 1小时

取余和循环结合反转数字算法:

int n = 123;
while (n != 0) {
    cout << n % 10;  // 输出个位数
    n /= 10;         // 移除个位数
}
// 输出:321
3 比较运算符

> < >= <= == !=

返回布尔值(true /false):

5 > 2;    // true
5 == 2;   // false
4 逻辑运算符
  • &&(与):所有条件都为真时结果为真

  • ||(或):至少一个条件为真时结果为真

  • !(非):取反

优先级: ! > && > ||

5 运算符优先级

从高到低:

  1. 算术运算符 (+ - * / %)

  2. 比较运算符 (> < >= <= == !=)

  3. 逻辑运算符 (! > && > ||)


5 + 1 * 3 > 7 || 3 + 6 > 10 && 7 - 5 == 2
// 等价于:(5 + (1 * 3)) > 7 || ((3 + 6) > 10) && ((7 - 5) == 2)
6 复合运算符
a = a + 1;  // 等价于 a += 1;
a = a * 2;  // 等价于 a *= 2;
a = a - 3;  // 等价于 a -= 3;
a = a / 4;  // 等价于 a /= 4;
7 自增自减运算运算符
前缀形式(++a/--a):先增减,后使用
int a = 5; int b = ++a; // a先变为6,然后赋值给b,b=6 


后缀形式(a++/a--):先使用,后增减

int a = 5; int b = a++; // a的值5先赋给b,然后a变为6,b=5
8 三目算运算符
条件 ? 表达式1 : 表达式2

如果条件为真,执行表达式1并返回其结果

如果条件为假,执行表达式2并返回其结果

    int a = 10, b = 20;
    
    // 找出两个数中的较大值
    int max = (a > b) ? a : b;
    cout << "较大值是: " << max << endl;  // 输出: 较大值是: 20
    
    // 判断奇偶性
    int num = 7;
    string ans = (num % 2 == 0) ? "偶数" : "奇数";
    cout << num << "是" << ans << endl;  // 输出: 7是奇数

程序结构

1 顺序结构

代码按照从上到下、从左到右、从内到外的顺序执行

2 分支结构

1. 单分支
if (条件) {
    // 条件为true时执行的代码
}
2. 双分支
if (条件) {
    // 条件为true时执行的代码
} else {
    // 条件为false时执行的代码
}
3. 多分支
if (条件1) {
    // 条件1为true时执行的代码
} else if (条件2) {
    // 条件2为true时执行的代码
} else if (条件3) {
    // 条件3为true时执行的代码
} else {
    // 上面条件都不满足时执行的代码
}
4. 多分支变形switch语句
switch (表达式) {
    case 常量1:
        // 代码块1
        break;
    case 常量2:
        // 代码块2
        break;
    // ... 更多case
    default:
        // 默认代码块
}

没有break会贯穿比如:
int month = 2;
switch (month) {
    case 12:
    case 1:
    case 2:
        cout << "冬季" << endl;  // 12月、1月、2月都是冬季
        break;
    case 3:
    case 4:
    case 5:
        cout << "春季" << endl;
        break;
    case 6:
    case 7:
    case 8:
        cout << "夏季" << endl;
        break;
    case 9:
    case 10:
    case 11:
        cout << "秋季" << endl;
        break;
    default:
        cout << "无效月份" << endl;
}

3 循环结构

1 while循环(条件循环)

适用场景: 知道循环条件但不确定循环次数

// 输出1-5
int i = 1;
while (i <= 5) {
    cout << i;
    i++;
}

// 输出2,4,6,8,10
int j = 2;
while (j <= 10) {
    cout << j;
    j += 2;
}
2 for循环(次数循环)

适用场景: 明确知道循环次数

循环三要素:

  1. 循环开始的值

  2. 循环结束的条件

  3. 循环每次的步长

// 输出1-5(递增)
for (int i = 1; i <= 5; i++) {
    cout << i;
}

// 输出5-1(递减)
for (int i = 5; i >= 1; i--) {
    cout << i;
}

// 输出2,4,6,8,10(步长为2)
for (int i = 2; i <= 10; i += 2) {
    cout << i;
}
3 、do...while循环
// while循环:先判断后执行
int a = 10;
while (a < 5) {
    cout << "这不会执行";
}

// do-while循环:先执行后判断
int b = 10;
do {
    cout << "这会执行一次";  // 尽管条件不满足,仍会执行一次
} while (b < 5);
4、break 和 continue关键字
break 

    //找到第一个满足条件的数字后退出
    for (int i = 1; i <= 10; i++) {
        if (i % 3 == 0) {
            cout << "找到第一个能被3整除的数: " << i << endl;
            break;  // 找到后立即退出循环
        }
        cout  << i << endl;
    }

continue

  // 示例 只输出奇数
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            continue;  // 跳过偶数
        }
        cout << i << " ";  // 只输出奇数
    }
    cout << endl;  // 输出: 1 3 5 7 9
    

综合应用示例

判断质数

输入一个整数判断是否为质数

输入 5 输出 是质数

    int n;
    cin >> n;
    
    bool f = true;
    
    if (n <= 1) {
        f = false;
    } else {
        for (int i = 2; i * i <= n; i++) {
            if (n % i == 0) {
                f = false;
                break;  // 发现因数立即退出,提高效率
            }
        }
    }
    
    if (f) {
        cout << n << " 是质数" << endl;
    } else {
        cout << n << " 不是质数" << endl;
    }
    

计算数字位数

输入一个整数(多位数),判断n是几位数。

输入123 输出 3

int n, count = 0;
cin >> n;

if (n == 0) {
    count = 1;
} else {
    while (n != 0) {
        count++;
        n /= 10;
    }
}

cout << "数字有" << count << "位";

2025 年 6 月真题解析:阶梯电价计算

题目要求:某地区实行阶梯电价,用电量 ≤200 度部分按 0.56 元/度计费,超额部分按 0.63 元/度计费。编写程序根据输入的用电量计算总电费。

逻辑分析

设用电量为 kWh,总电费为 cost

  • kWh ≤ 200 时,cost = kWh * 0.56
  • kWh > 200 时,cost = 200 * 0.56 + (kWh - 200) * 0.63

代码实现

#include <iostream>
using namespace std;

int main() {
    int kWh;
    cin >> kWh;  // 输入用电量
    double cost;
    if (kWh <= 200) {
        cost = kWh * 0.56;  // 基础电量计费
    } else {
        cost = 200 * 0.56 + (kWh - 200) * 0.63;  // 超额部分叠加计费
    }
    cout << cost << endl;
    return 0;
}

关键说明

  • 通过 if-else 实现双分支逻辑,确保覆盖所有用电量场景;
  • 浮点型变量 cost 存储计算结果,避免整数除法导致精度丢失;
  • 条件判断 kWh <= 200 简洁清晰,符合阶梯电价的分段规则。

C风格输入输出

一、scanf 输入函数

scanf 函数用于从标准输入(通常是键盘)读取数据,其基本语法为:

scanf("格式控制", &变量列表);

int score;
printf("请输入成绩: ");  // 提示用户输入
scanf("%d", &score);      // 读取整数,注意 &score 不可省略
二、printf 输出函数

printf 函数用于向标准输出(通常是屏幕)打印数据,其基本语法为:

printf("格式控制", 变量列表);

示例:输出变量 x 的值

cpp

int x = 10;
printf("x=: %d\n", x);  // 输出:x=: 10


printf("x=: %03d\n", x);  //相当于有3个格子10只填了两个格子前面的格子补0 输出:x=: 010

//还要考保留小数点后几位
double a =3.1415;
printf("%.2f",a);//输出3.14 表留小数点后两位
三、格式字符串占位符速查表

格式控制字符串中的占位符需与变量类型严格匹配,以下为 GESP 一级考试常用占位符:

占位符 数据类型 说明示例
%d 整数(int) printf("%d", 100); → 输出 100
%lf 双精度浮点数(double) printf("%.2lf", 3.1415); → 输出 3.14
%c 字符(char) printf("%c", 'A'); → 输出 A
%s 字符串(char[]) printf("%s", "GESP"); → 输出 GESP

编程题解题技巧

所有的真题编程题基本都写了,总结出的点

编程题第一题比较基础是输入输出题目偶尔加个if判断 基本IPO就可以做出来了 

编程题第二题就是单层循环的枚举不同看我13课的复习枚举复习

输入输出类题目

输入输出题四步法

解决输入输出类问题需遵循**“读入→处理→计算→输出”四步法**,该框架能帮助初学者规范解题流程,减少逻辑漏洞:

  1. 读入(Input):明确输入数据的类型(如整数、浮点数)和格式(如单个数据、多变量、多组数据),使用 cin 语句正确读取数据。
  2. 处理(Processing):根据题目要求设计数据存储方案,定义合适的变量类型(如 int 存储整数,double 存储小数),并对异常情况(如无效输入)进行预判。
  3. 计算(Calculation):通过算术运算(加减乘除等)或逻辑判断(如条件分支)实现题目核心逻辑。
  4. 输出(Output):使用 cout 语句按指定格式输出结果,注意换行符 endl 或空格的使用,确保与题目要求一致。

四步法应用示例(以“计算两个整数之和”为例):

  • 读入cin >> a >> b;(读取两个整数 ab
  • 处理:定义 int 类型变量 ab 存储输入数据
  • 计算a + b(执行加法运算)
  • 输出cout << a + b << endl;(输出结果并换行)
#include <iostream>
using namespace std;

int main() {
    int a, b;       // 处理:定义变量存储输入数据
    cin >> a >> b;  // 读入:读取两个整数
    cout << a + b << endl;  // 计算与输出:求和并输出结果
    return 0;
}
多组输入判断类题型

描述输入n个数据,输出被m整数的数之和

输入5 2 

1 2 3 4 5

输出2 4 

#include <iostream>
using namespace std;

int main() {
    int n,m,x,sum=0;
    cin>>n>>m;
    while(n--){
        cin>>x;
        if(x%m==0) cout<<x<<" ";
    }
    return 0;
}
时间类问题专题解析

总秒数 = 时 × 3600 + 分 × 60 + 秒

以下是具体解题步骤:

  1. 读入:输入三个整数 h(时)、m(分)、s(秒),格式为空格分隔的三个数字。
  2. 处理:定义 int h, m, s, total 变量,其中 total 用于存储计算结果。
  3. 计算:应用公式 total = h * 3600 + m * 60 + s,注意单位换算的正确性(1 小时 = 3600 秒,1 分钟 = 60 秒)。
  4. 输出:使用 cout 输出 total 的值。

代码实现

#include <iostream>
using namespace std;

int main() {
    int h, m, s;
    cin >> h >> m >> s;  // 读入时、分、秒
    int total = h * 3600 + m * 60 + s;  // 计算总秒数
    cout << total << endl;  // 输出结果
    return 0;
}

推荐练习题目

  • 洛谷 OJ [P1001 A+B Problem](基础输入输出,单组数据求和)
  • 洛谷 OJ [P5703 苹果采购](简单算术运算,输入苹果单价与数量计算总价)

循环枚举类题

一、累加器清零:结果正确性的关键

这是同学们容易犯错的要记得sum初始化为0

int main() {
    int n, m, sum;  // 未初始化 sum,其值为随机垃圾值
    cin >> n >> m;
    for (int i = n; i <= m; i++) {
        if (i % 3 == 0) sum += i;  // 结果包含随机值,完全错误
    }
}

正确实践:始终在使用累加器前显式清零(sum = 0),确保每次计算从基准值开始。

二、最小公倍数枚举法:以真题“值日”问题为例

枚举法在数学问题中应用广泛,例如“值日周期”问题:输入小杨值日周期 m 和小红值日周期 n,求两人再次同一天值日的最少天数(即最小公倍数)。解题思路:从 m 开始枚举至 m*n(最小公倍数的理论上限),判断是否同时为 m 和 n 的倍数,首个符合条件的数即为答案。

代码实现

#include <iostream>
using namespace std;

int main() {
    int m, n;
    cin >> m >> n;
    for (int i = m; i <= m * n; i++) {  // 枚举范围:[m, m*n]
        if (i % m == 0 && i % n == 0) {  // 判断条件:同时为 m 和 n 的倍数
            cout << i;
            return 0;  // 找到结果后立即退出程序
        }
    }
}

逻辑解析:枚举对象为天数 i,范围设定为 m 至 m*n(因最小公倍数不会超过两数乘积),通过模运算判断倍数关系,体现了“明确范围→循环结构→条件判断→输出结果”的完整解题步骤。

三、高频题型与推荐练习

循环枚举类题目常见于数学问题(累加、因数)、时间计算、日期处理,多练习真题同学们加油!!!

CCF GESP C++ 一级上机题 - 题单 - 洛谷 | 计算机科学教育新生态

2025年6月编程题详解

题目1:假期阅读

题目描述:小A有n页书,每天最多读k页,假期共t天,求最多能读多少页。

解析

  • 核心逻辑:计算假期总阅读能力(k×t)与书总页数n的最小值。
  • 代码优化:使用三目运算符简化条件判断
#include <iostream>
using namespace std;
int main() {
    int n, k, t;
    cin >> n >> k >> t;
    cout << min(n, k * t); // 直接取两者较小值
    return 0;
}
题目2:值日

题目描述:小杨每m天值日一次,小红每n天值日一次,求下次共同值日天数。

解析

  • 枚举优化:从max(m,n)开始枚举,减少无效循环
#include <iostream>
#include <algorithm> // 需包含算法库
using namespace std;
int main() {
    int m, n;
    cin >> m >> n;
    for (int i = max(m, n); ; i++) { // 从较大值开始枚举
        if (i % m == 0 && i % n == 0) {
            cout << i;
            break;
        }
    }
    return 0;
}

新增考点:物联网设备基础

  • 智能传感器:如温度传感器(输入设备)、智能灯泡(输出设备)
  • 应用场景:智能家居系统中传感器数据通过计算机处理并控制设备

考试时间分配建议

题型 题量 建议时间
选择题 15道 30分钟
判断题 10道 20分钟
编程题1 1道 35分钟
编程题2 1道 35分钟

还是比较详细的求点赞收藏~

注意:编程题需先编译调试,确保无语法错误再提交

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐