计算机基础与算法设计详解

table {
border-collapse: collapse;
width: 100%;
margin-bottom: 1rem;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 4px;
overflow-x: auto;
}

1、列举三个硬件组件。

中央处理器(CPU)、主存储器(MM,也称为随机存取存储器RAM)、输入/输出设备

2、为什么需要二级存储设备?

因为程序和数据在处理前必须存储在主内存中,且计算机关闭时主内存中的所有信息都会丢失,所以需要将主内存中存储的信息转移到其他设备进行永久存储,二级存储设备就提供了这种永久存储功能。

3、操作系统的功能是什么?

操作系统的作用

操作系统控制计算机,在开启个人电脑时首先加载,没有操作系统计算机将无法使用。它监控计算机的整体活动并提供服务,包括:

内存管理

输入/输出活动

存储管理

此外,操作系统还有一个特殊程序来组织二级存储以便方便访问信息。同时,它也是运行应用程序的程序。

4、程序有哪两种类型?

程序有两种类型:系统程序和应用程序。

5、机器语言和高级语言之间有哪些区别?

在机器语言中,程序使用二进制代码编写;而在高级语言中,程序更接近自然语言。对于执行而言,高级语言程序需要翻译成机器语言,而机器语言无需翻译成其他语言。

6、什么是源程序?

用高级编程语言编写的程序称为源程序。

7、为什么需要编译器?

需要编译器将用高级语言编写的程序翻译成计算机能够理解和执行的机器语言。

8、编译器会报告哪种类型的错误?

编译器会报告语法错误,例如:

变量声明后缺少分号

使用未声明的标识符

编译时能检测到这些语法错误,且一个语法错误可能导致后续多个语句出现语法错误。

9、为什么需要将用高级语言编写的程序翻译成机器语言?

程序翻译原理

因为计算机只能直接理解自己的机器语言,无法直接执行用高级语言编写的指令,所以要将高级语言程序翻译成计算机的机器语言,计算机才能执行该程序。

10、为什么你更愿意用高级语言而不是机器语言编写程序?

在机器语言中,程序使用二进制代码编写,而在高级语言中,程序更接近自然语言。

对于执行:

高级语言程序需要翻译成机器语言。

机器语言程序无需翻译成其他语言。

因为计算机不能直接执行用高级语言编写的指令,所以需要编译器将高级语言程序翻译成机器代码。但高级语言更易学习、理解和编写,能提高编程效率,因此人们更愿意使用高级语言编写程序。

11、设计一个算法来计算四个测试成绩的加权平均值。四个测试成绩及其各自的权重以如下格式给出:测试成绩1 测试成绩1的权重 … 。例如,示例数据如下:75 0.20 95 0.35 85 0.15 65 0.30

获取四个测试成绩及其对应的权重,分别记为

testScore1


weightTestScore1


testScore2


weightTestScore2


testScore3


weightTestScore3


testScore4


weightTestScore4

计算加权成绩之和,设

weightedSum

为加权成绩之和,

weightedSum = testScore1 * weightTestScore1 + testScore2 * weightTestScore2 + testScore3 * weightTestScore3 + testScore4 * weightTestScore4

计算权重之和,设

totalWeight

为权重之和,

totalWeight = weightTestScore1 + weightTestScore2 + weightTestScore3 + weightTestScore4

计算加权平均值,设

weightedAverage

为加权平均值,

weightedAverage = weightedSum / totalWeight

输出加权平均值。

12、设计一个算法,将以25美分硬币(quarters)、10美分硬币(dimes)、5美分硬币(nickels)和1美分硬币(pennies)形式给出的零钱转换为1美分硬币的数量。

获取25美分硬币、10美分硬币、5美分硬币和1美分硬币的数量。

计算25美分硬币对应的1美分硬币数量:25美分硬币数量乘以25。

计算10美分硬币对应的1美分硬币数量:10美分硬币数量乘以10。

计算5美分硬币对应的1美分硬币数量:5美分硬币数量乘以5。

计算所有硬币对应的1美分硬币总数:将25美分、10美分、5美分硬币对应的1美分硬币数量与1美分硬币本身的数量相加。

输出1美分硬币的总数。

13、已知披萨的半径(单位:英寸)和价格,设计一个算法来计算每平方英寸披萨的价格。


a. 获取半径;  
b. 面积 = π * 半径 * 半径;  
c. 获取价格;  
d. 每平方英寸价格 = 价格 / 面积

14、为了盈利,家具店所售商品的价格会在进价基础上提高80%。提价后,每件商品会打九折出售。设计一个算法来计算家具店所售商品的售价。要计算售价,你需要哪些信息?

需要商品的原始进价信息。

15、假设a、b和c分别表示三角形的边长。那么,三角形的面积可以使用公式√(s(s – a)(s – b)(s – c))来计算,其中s = (1/2)(a + b + c)。设计一个使用此公式来计算三角形面积的算法。计算面积需要哪些信息?

算法如下:

获取 a、b、c;

$ s = frac{1}{2}(a + b + c) $;

$ ext{area} = sqrt{s(s – a)(s – b)(s – c)} $。

计算面积需要的信息是三角形各边的长度。

16、杰森通常使用互联网购买各种物品。如果一次订购的物品总费用达到或超过 200 美元,则免运费和手续费;否则,每件物品的运费和手续费为 10 美元。设计一个算法,提示杰森输入订购的物品数量和每件物品的价格,然后输出总账单金额。该算法必须使用循环来获取每件物品的价格。(为简单起见,可假设杰森一次订购不超过五件物品。)

提示杰森输入订购的物品数量

numItems

初始化变量

totalCost

为 0。

使用循环(从 1 到

numItems

):

– 提示杰森输入当前物品的价格

price



– 将

price

累加到

totalCost

中。

判断

totalCost

是否大于等于 200:

– 如果是,总账单金额

totalBilling = totalCost



– 如果否,总账单金额

totalBilling = totalCost + numItems * 10

输出总账单金额

totalBilling

17、假设发送国际传真的费用计算方式如下:服务费为3美元,前10页每页0.2美元,之后每页0.1美元。设计一个算法,要求用户输入要传真的页数,然后根据输入的页数计算应付款金额。

提示用户输入要传真的页数。

读取用户输入的页数。

初始化费用变量为3美元(服务费)。

如果页数小于等于10:

– 费用 = 3 + 页数 * 0.2

否则:

– 费用 = 3 + 10 * 0.2 + (页数 – 10) * 0.1

输出应付款金额。

18、一台自动取款机(ATM)允许客户每天最多取款500美元。如果客户取款超过300美元,超出300美元部分的手续费为该超出金额的4%。如果客户账户内资金不足,ATM会告知客户资金不足,并让客户选择支付25美元手续费来取款。如果账户内没有钱或账户余额为负,ATM不允许客户取款。如果取款金额超过500美元,ATM会告知客户可取款的最大金额。编写一个算法,允许客户输入取款金额。然后该算法检查账户内的总金额,向客户支付款项,并从账户中扣除取款金额和可能产生的手续费。

以下是该算法的步骤:

提示客户输入要取款的金额,记为

withdrawAmount

获取客户账户的总金额,记为

accountBalance

检查

withdrawAmount

是否大于 500:

– 如果是,告知客户可取款的最大金额为 500 美元,结束算法。

检查

accountBalance

是否小于等于 0:

– 如果是,告知客户账户无钱或余额为负,不允许取款,结束算法。

检查

accountBalance

是否小于

withdrawAmount



– 如果是,告知客户资金不足,询问客户是否愿意支付 25 美元手续费取款:

如果客户同意,检查

accountBalance

是否大于等于

withdrawAmount + 25

如果是,向客户支付

withdrawAmount

金额,将

accountBalance

更新为

accountBalance - withdrawAmount - 25

如果否,告知客户即使支付手续费账户余额也不足,结束算法。

如果客户不同意,告知客户无法取款,结束算法。

检查

withdrawAmount

是否大于 300:

– 如果是,计算手续费

serviceCharge = (withdrawAmount - 300) * 0.04



– 如果否,

serviceCharge = 0

向客户支付

withdrawAmount

金额,将

accountBalance

更新为

accountBalance - withdrawAmount - serviceCharge

结束算法。

19、给定一份学生姓名及其考试成绩的列表,设计一个算法完成以下任务:a. 计算平均考试成绩。b. 确定并打印出所有考试成绩低于平均成绩的学生姓名。c. 确定最高考试成绩。d. 打印出所有考试成绩与最高成绩相同的学生姓名。(必须将此问题分解为子问题,第一个子问题确定平均考试成绩,第二个子问题确定并打印出所有成绩低于平均成绩的学生姓名,第三个子问题确定最高考试成绩,第四个子问题打印出所有成绩与最高成绩相同的学生姓名,主算法结合这些子问题的解决方案。

主算法


使用以下算法计算平均考试成绩:


i. 将总和(sum)和计数(count)设为 0。

ii. 对班级中的每个学生重复以下操作:

获取考试成绩(testScore)。

计数(count)加 1,并将当前考试成绩加到总和(sum)中更新总和的值。

iii. 使用以下公式计算平均考试成绩:

– 如果计数(count)为 0,平均考试成绩(averageTestScore) = 0;

– 否则,平均考试成绩(averageTestScore) = 总和(sum)/ 计数(count)。


使用以下算法确定并打印出所有考试成绩低于平均成绩的学生姓名:


对班级中的每个学生重复以下操作:

i. 获取学生姓名(studentName)和考试成绩(testScore)。

ii. 如果考试成绩(testScore)小于平均考试成绩(averageTestScore),打印学生姓名(studentName)。


使用以下算法确定最高考试成绩:


i. 获取第一个学生的考试成绩,将其称为最高考试成绩(highestTestScore)。

ii. 对班级中其余的每个学生重复以下操作:

获取考试成绩(testScore)。

如果考试成绩(testScore)大于最高考试成绩(highestTestScore),最高考试成绩(highestTestScore) = 考试成绩(testScore)。


使用以下算法打印出所有考试成绩与最高成绩相同的学生姓名:


对班级中的每个学生重复以下操作:

i. 获取学生姓名(studentName)和考试成绩(testScore)。

ii. 如果考试成绩(testScore)等于最高考试成绩(highestTestScore),打印学生姓名(studentName)。

20、考虑以下语句:string str = “Now is the time for the party!”; 以下语句的输出是什么?(假设各部分相互独立) a. cout << str.size() << endl; b. cout << str.substr(7, 8) << endl; c. string::size_type ind = str.find(‘f’); string s = str.substr(ind + 4, 9); cout << s << endl; d. cout << str.insert(11, “best “) << endl; e. str.erase(16, 14); str.insert(16, “to study for the exam?”); cout << str << endl;


a. 29  
b. the time  
c. party!  
d. Now is the best time for the party!  
e. Now is the time to study for the exam?

21、a. 定义一个枚举类型 triangleType,其值包括 scalene(不等边三角形)、isosceles(等腰三角形)、equilateral(等边三角形)和 noTriangle(非三角形)。b. 编写一个函数 triangleShape,该函数接受三个参数,每个参数代表三角形的一条边的长度。该函数应返回三角形的形状。(注意:在一个三角形中,任意两边长度之和大于第三边的长度。)c. 编写一个程序,提示用户输入三角形各边的长度,并输出三角形的形状。

以下是实现上述需求的代码:


#include <iostream>
// a. 定义枚举类型 triangleType
enum triangleType { scalene, isosceles, equilateral, noTriangle };

// b. 编写函数 triangleShape 
triangleType triangleShape(double side1, double side2, double side3) {
    if (side1 + side2 <= side3 || side1 + side3 <= side2 || side2 + side3 <= side1) {
        return noTriangle;
    }
    if (side1 == side2 && side2 == side3) {
        return equilateral;
    }
    if (side1 == side2 || side1 == side3 || side2 == side3) {
        return isosceles;
    }
    return scalene;
}

int main() {
    double side1, side2, side3;
    // c. 提示用户输入三角形各边的长度 
    std::cout << "请输入三角形三条边的长度:" << std::endl;
    std::cin >> side1 >> side2 >> side3;

    // 调用函数并输出结果 
    triangleType shape = triangleShape(side1, side2, side3);
    switch (shape) {
        case scalene:
            std::cout << "这是一个不等边三角形。" << std::endl;
            break;
        case isosceles:
            std::cout << "这是一个等腰三角形。" << std::endl;
            break;
        case equilateral:
            std::cout << "这是一个等边三角形。" << std::endl;
            break;
        case noTriangle:
            std::cout << "这不是一个三角形。" << std::endl;
            break;
    }
    return 0;
}

22、定义一个名为 menuItemType 的结构体,包含两个成员:类型为 string 的 menuItem 和类型为 double 的 menuPrice。


struct menuItemType 
{ 
    string menuItem; 
    double menuPrice; 
}; 

23、编写一个程序来帮助当地一家餐厅实现早餐计费系统的自动化。该程序应实现以下功能:a. 向顾客展示餐厅提供的不同早餐菜品。b. 允许顾客从菜单中选择多个菜品。c. 计算并打印账单。假设餐厅提供以下早餐菜品(每个菜品的价格显示在菜品名称右侧):普通鸡蛋 $1.45、培根鸡蛋 $2.45、松饼 $0.99、法式吐司 $1.99、水果篮 $2.49、麦片 $0.69、咖啡 $0.50、茶 $0.75。定义一个结构体 menuItemType 的数组 menuList 来存储这些菜品信息。你的程序必须至少包含以下函数:• 函数 getData:该函数将数据加载到数组 menuList 中。• 函数 showMenu:该函数展示餐厅提供的不同菜品,并告知用户如何选择菜品。• 函数 printCheck:该函数计算并打印账单。(注意,账单金额应包含 5%的税。)示例输出如下:欢迎光临约翰尼餐厅,培根鸡蛋 $2.45,松饼 $0.99,咖啡 $0.50,税 $0.20,应付金额 $4.14。输出格式保留两位小数。输出中每个菜品的名称必须左对齐。你可以假设用户每种菜品只选择一份。


由于无法直接提供完整代码,但可以给出实现思路。首先定义结构体 `menuItemType` 存储菜品信息。`getData` 函数用于初始化 `menuList` 数组,将菜品和价格存入。`showMenu` 函数遍历 `menuList` 数组展示菜品和价格,并提示用户选择方式。`printCheck` 函数根据用户选择计算总价,加上 5% 的税,最后按格式输出账单。在主函数中调用这些函数完成整个流程。

24、重写类studentType的定义,使函数print和calculateGPA成为纯虚函数。假设studentType类继承自personType类,并且该类还有setID、setCourses、setGrades等成员函数。


class studentType : public personType
{
public:
    virtual void print() = 0;
    virtual void calculateGpa() = 0;
    void setID(long id);
    void setCourses(const string c[], int noOfC);
    void setGrades(const char cG[], int noOfC);
    // 其他成员函数和成员变量
};

25、假设类employeeType表示员工类型,fullTimeEmployee表示全职员工类,继承自employeeType,partTimeEmployee表示兼职员工类,也继承自employeeType。每个类的构造函数合理设置(如partTimeEmployee类构造函数可接收姓名、姓氏、员工编号、时薪、工作小时数等参数)。以下哪个语句是合法的?a. employeeType tempEmp; b. fullTimeEmployee newEmp(); c. partTimeEmployee pEmp(“Molly”, “Burton”, 101, 0.0, 0);

a、c

26、判断以下陈述的对错。a. catch块的列出顺序不重要。b. 异常可以在它发生的函数中捕获,也可以在调用该方法的任何函数中捕获。c. 处理异常的一种方法是打印错误信息并退出程序。d. 为避免编译错误,所有异常都需要报告。

a. 错误;b. 正确;c. 正确;d. 错误

27、try块和catch块有什么区别?


`try`块用于放置可能产生异常的语句,以及若发生异常则不应执行的语句;  
`catch`块用于指定能捕获的异常类型,并包含异常处理程序。

- 若`try`块中未抛出异常,与其关联的所有`catch`块将被忽略,程序在最后一个`catch`块后继续执行;
- 若`try`块中抛出异常,`try`块中剩余语句将被忽略,程序按顺序搜索`catch`块,找到匹配异常类型的`catch`块后执行其代码,其后的`catch`块将被忽略。

28、如果抛出了异常但未被捕获,会发生什么?

如果程序未处理异常,将调用terminate函数终止程序。

29、如果try块中没有抛出异常会发生什么?

所有与该try块关联的catch块都会被忽略,程序执行将在最后一个catch块之后继续。

30、如果在 try 块中抛出异常会发生什么?


如果在 `try` 块中抛出异常,`try` 块中剩余的语句将被忽略。程序会按照 `catch` 块在 `try` 块之后出现的顺序搜索这些 `catch` 块,寻找合适的异常处理程序。如果抛出的异常类型与某个 `catch` 块中的参数类型匹配,该 `catch` 块中的代码将执行,并且此 `catch` 块之后的其余 `catch` 块将被忽略。

若函数中抛出异常,函数可以:

- 不做处理,
- 部分处理异常并抛出相同或新的异常,
- 或抛出新的异常,

函数调用栈会展开,直到有 `try/catch` 块处理该异常或程序不处理该异常。若程序不处理异常,将调用 `terminate` 函数终止程序。

31、以下C++代码有什么问题?并提供正确的代码。代码为:double balance = 25000; double intRate; catch (double x) { cout << “Negative interest rate: ” << x << endl; } try { cout << “Enter the interest rate: “; cin >> intRate; cout << endl; if (intRate < 0.0) throw intRate; cout << “Interest: $” << balance * intRate / 100 << endl; }

代码的问题在于

catch

块出现在

try

块之前,在C++中,

catch

块必须紧跟在对应的

try

块之后。正确的代码如下:


double balance = 25000;
double intRate;
try {
    cout << "Enter the interest rate: ";
    cin >> intRate;
    cout << endl;
    if (intRate < 0.0)
        throw intRate;
    cout << "Interest: $" << balance * intRate / 100 << endl;
}
catch (double x) {
    cout << "Negative interest rate: " << x << endl;
}

32、考虑以下 C++ 代码:double balance; try { cout << “Enter the balance: “; cin >> balance; cout << endl; if (balance < 1000.00) throw balance; cout << “Leaving the try block.” << endl; } catch (double x) { cout << “Current balance: ” << x << endl << “Balance must be greater than 1000.00” << endl; } a. 在这段代码中,找出 try 块。b. 在这段代码中,找出 catch 块。c. 在这段代码中,找出 catch 块的参数及其类型。d. 在这段代码中,找出 throw 语句。

a. try 块为:


{
    cout << "Enter the balance: ";
    cin >> balance;
    cout << endl;
    if (balance < 1000.00)
        throw balance;
    cout << "Leaving the try block." << endl;
}

b. catch 块为:


catch (double x)
{
    cout << "Current balance: " << x << endl
         << "Balance must be greater than 1000.00" << endl;
}

c. catch 块参数为

x

,类型为

double

d. throw 语句为:


if (balance < 1000.00)
    throw balance;
© 版权声明

相关文章

暂无评论

none
暂无评论...