考研计算机基础构造算法的实例研究

构造算法:实例研究1(计数器控制重复)

要演示如何开发算法,我们要解决几个全班平均成绩的问题。考虑下列问题:

班里有10个学生参加测验,可以提供考试成绩(0到100的整数值),以确定全班平均成绩。

全班平均成绩等于全班成绩总和除以班里人数。计算机上解决这个问题的算法是辅人每人的成绩,进行平均计算,然后打印结果。

下面用伪代码列出要执行的操作,指定这些操作执行的顺序。我们用计数器控制重复(counter-conttrolled repetition)一次一个地输人每人的成绩。这种方法用计数器(counter)变量控制一组语句执行的次数。本例中,计数器超过10时,停止重复。本节介绍伪代码算法(如图2.6)和对应程序(如图2.7)。下节介绍如何开发这个伪代码算法。计数器控制重复通常称为确定重复(definiterepetition),因为循环执行之前,已知重复次数。

注意算法中引用了总数(total)和计数器。总数变量用于累计一系列数值的和。计数器变量用于计数,这里计算输人的成绩数。存放总数的变量通常应先初始化为0之后再在程序中使用,否则总和会包括总数的内存地址中存放的原有数值。

  Set total to zero
   Set grade counter to one
      While grade counter is less than or equal to ten
              Input the next grade
              Add the grade i.to the total
              Add one to the grade counter
      Set the class average to the total divided by ten
      Print the class average

图2.6 用计数器控制重复解决全班平均成绩问题的伪代码算法

// Fig. 2.7: fig0207.cpp
// Class average program with counter-controlled repetition
#include <iostream.h>
int main()
{
	int total,          // sum of grades
	gradeCounter,  // number of grades entered
	grade,        // one grade
	average;      // average of grades
	// initialization phase
	total = 0;                           // clear total
	gradeCounter = 1;                     // prepare to loop
	// processing phase
	while ( gradeCounter <= 10 ) {          // loop 10 times
		cout << "Enter grade: ";          // prompt for input
		cin >> grade;                   // input grade
		total = total + grade;            // add grade to total
		gradeCounter = gradeCounter + 1;    // increment counter
	}
	// termination phase
	average - total / 10;             // integer division
	cout << "Class average is "<< average << endl;
	return 0;  // indicate program ended successfully
}

输出结果:

    Enter grade: 98
    Enter grade: 76
    Enter grade: 71
    Enter grade: 87
    Enter grade: 83
    Enter grade: 90
    Enter grade: 57
    Enter grade: 79
    Enter grade: 82
    Enter grade: 94
    Class average is 81
图2.7 用计数器控制重复解决全班平均成绩问题的C++程序和示例输出

根据使用情况,计数器变量通常应先初始化为0或1(下面会分别举例说明)。未初始化变量会包含垃圾值“garbage”value),也称为未定义值(undefined

value),为该变量保存内存地址中最后存放的值。

常见编程错误2.6

如果不初始化计数器和总和变量,则程序的结果可能不正确.这是一种逻辑错误。

编程技巧2.7

一定要初始化计数器和总和变量。

编程技巧2.8

每个变量在单独一行中声明。注意程序中的平均计算产生一个整数结果。实际上,本例中的成绩总和是817,除以10时应得到81.7,是个带小数点的数,下节将介绍如何处理这种值(称为浮点数)。

常见编程错误2.7

在计数器控制循环中,由于循环计数器(每人循环加1时)比最大合法值多1(例如,从1算到10时为11).因此在循环之后用计数器值进行计算通常会出现差1的错误。

图2.7中,如果第21行用gradeCounter而不是10进行计算,则这个程序的输出显示数值74。

2016考研政策http://www.kyjxy.com/yuanxiao/zhengce/
2016考研数学资料http://www.kyjxy.com/shuxue/ziliao/
2016考研专硕复习方法http://www.kyjxy.com/zhuanshuo/

时间: 2024-11-08 06:36:55

考研计算机基础构造算法的实例研究的相关文章

考研计算机基础:构造算法与自上而下逐步完善:实例研究2

构造算法与自上而下逐步完善:实例研究2(标记控制重复) 下面将全班平均成绩问题一般化,考虑如下问题: 开发一个计算全班平均成绩的程序,在每次程序运行时处理任意个成绩数. 在第一个全班平均成绩例子中,成绩个数(10)是事先预置的.而本例中,则不知道要输入多少个成绩,程序要处理任意个成绩数.程序怎么确定何时停止输入成绩呢?何时计算和打印全班平均成绩呢? 一种办法是用一个特殊值作为标记值(sentinelvalue),也称信号值(signalvalue).哑值(dummy value)或标志值(fla

考研计算机基础while重复结构

while重复结构 重复结构(repetition strucure)使程序 员可以指定一定条件下可以重复的操作.下列伪代码语句: While there are more items on my shopping list Purchase next item and cross it off my list 描述购物过程中发生的重复.条件"there are more ltems on my shopping list"(购物清单中还有更多项目)可真可假.如果条件为true.则执行

考研计算机基础2.6 if/else选择结构

if选择结构只在条件为true时采取操作,条件为false时则忽略这个操作.利用if/else选择结构则可以在条件为true时和条件为false时采取不同操作.例如,下列伪代码: if student's grade is greater than or equal to 60 print "Passed" else print "Failed" 在学生成绩大于或等于60时打印“Passed”,否则打印"Failed".打印之后,都“执行”下一条

基础典型算法研究:合并有序数组

做leetcode第二题的时候,发现合并有序数组是一个很有意思的问题,于是,总结如下,部分内容来源于网络各位大神. 第一种方法: 合并调用sort. 即是将两个数组合并在一个数组里面,然后对合并后的数组调用sort函数即可. class Solution: def getArray(self, A, B) : for item in B : A.append(item) A.sort() 第二种方法: 极值插入法. #include <stdio.h> void insert(int *arr

程序员必须知道的10大基础实用算法及其讲解

程序员必须知道的10大基础实用算法及其讲解 原文出处: cricode 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比 较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构 上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子

程序员必知的10大基础实用算法

    算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2) 次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的 架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元

十大基础实用算法之快速排序和堆排序

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元素,称为 "基准"(pi

基础实用算法

10大基础实用算法及其讲解 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从

计算机基础课程对编写代码有多大影响

相信很多计算机专业刚步入社会开始编程工作的同学都有一个疑惑,大学四年学的计算机基础课程对编程来说几乎用不上,远远没有C/C++.Java.Java Web.sql有用.我当时也有这样的疑惑,因为大部分程序员刚开始工作的任务仅仅只是在别人搭好的框架下,在合适的地方添加上合适的代码,实现某个功能.在这个阶段有这样的疑惑是可以理解的,因为只是在山脚下看问题,不知庐山真面目.在这个阶段有些有心的同学可能会在编码过程中考虑下性能(方法级别的性能),合理使用集合类,合理采用一些算法,减少循环次数和时间复杂度