C++条件及循环语句的综合运用实例

用下面公式求π的近似值。π/4≈1-1/3+1/5-1/7+…直到最后一项的绝对值小于10-7为止。根据给定的算法很容易编写程序如下:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main( )
{
  int s=1;
  double n=1,t=1,pi=0;
  while((fabs(t))>1e-7)
  {
    pi=pi+t;
    n=n+2;
    s=-s;
    t=s/n;
  }
  pi=pi*4;
  cout<<"pi="<<setiosflags(ios::fixed)<<setprecision(6)<<pi<<endl;
  return 0;
}

运行结果为

pi=3.141592

注意:不要把n定义为整型变量,否则在执行“t=s/n;”时,得到t的值为0(原因是两个整数相除)。

【例】求Fibonacci数列前40个数。这个数列有如下特点:第1、2个数为1、1。从第3个数开始,每个数是其前面两个数之和。即:

  F1=1 (n=1)
  F2=1 (n=2)
  Fn=Fn-1+Fn-2(n≥3)

这是一个有趣的古典数学问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,假设所有兔子都不死,问每个月的兔子总数为多少?

根据给出的每月兔子总数的关系,可编写程序如下:

#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{
  long f1,f2;
  int i;
  f1=f2=1;
  for(i=1;i<=20;i++)
  {
   cout<<setw(12)<<f1<<setw(12)<<f2;
   //设备输出字段宽度为12,每次输出两个数
   if(i%2==0) cout<<endl;
     //每输出完4个数后换行,使每行输出4个数
     f1=f1+f2;
   //左边的f1代表第3个数,是第1?2个数之和
   f2=f2+f1;
   //左边的f2代表第4个数,是第2?3个数之和
  }
  return 0;
}

【例】找出100~200间的全部素数。编写程序如下:

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main( )
{
  int m,k,i,n=0;
  bool prime;//定义布尔变量prime
  for(m=101;m<=200;m=m+2) //判别m是否为素数,m由101变化到200,增量为2
  {
   prime=true;//循环开始时设prime为真,即先认为m为素数
   k=int(sqrt(m)); //用k代表根号m的整数部分
   for(i=2;i<=k;i++) //此循环作用是将m被2~根号m除,检查是否能整除
     if(m%i==0) //如果能整除,表示m不是素数
     {
      prime=false; //使prime变为假
      break; //终止执行本循环
     }
     if (prime)//如果m为素数
     {
      cout<<setw(5)<<m; //输出素数m,字段宽度为5
      n=n+1; //n用来累计输出素数的个数
     }
     if(n%10==0) cout<<endl; //输出10个数后换行
   }
   cout<<endl;//最后执行一次换行
   return 0;
}

【例】译密码
为使电文保密,往往按一定规律将电文转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。见图3.20,字母按上述规律转换,非字母字符不变,如"Wonderful!"转换为"Asrhivjyp!"。

输入一行字符,要求输出其相应的密码。


程序如下:

#include <iostream>
using namespace std;
int main( )
{
  char c;
  while ((c=getchar( ))!='\n')
  {
   if((c>='a' && c<='z') || (c>='A' && c<='Z'))
   {
     c=c+4;
     if(c>'Z' && c<='Z'+4 || c>'z')
      c=c-26;
   }
   cout<<c;
  }
  cout<<endl;
  return 0;
}

运行结果如下:

I am going to Beijing!
M eq ksmrk xs Fimnmrk!

while语句中括号内的表达式有3个作用:
从键盘读入一个字符,这是用getchar函数实现的;
将读入的字符赋给字符变量c;
判别这个字符是否为'\n'(即换行符)。如果是换行符就执行while语句中的复合语句(即花括号内的语句),对输入的非换行符的字符进行转换处理。

按前面分析的思路对输入的字符进行处理,有一点请读者注意,内嵌的if语句不能写成:
    if (c>'Z'|| c>'z')  c=c-26;
因为所有小写字母都满足“c>'Z'”条件,从而也执行“c=c-26;”语句,这就会出错。因此必须限制其范围为“c>'Z' && c<='Z'+4”,即原字母为'W'到'Z',在此范围以外的不是原大写字母W~Z,不应按此规律转换。

时间: 2015-09-06

C++循环队列实现模型

本文实例讲述了C++循环队列实现模型.分享给大家供大家参考.具体分析如下: 前段时间在知乎上看到这样一个小题目: 用基本类型实现一队列,队列要求size是预先定义好的的.而且要求不可以使用语言自带的api,如C++的STL.普通的实现很简单,但是现在要求要尽可能的时间和空间复杂度的优化,要和语言自带的api比较时间和空间.这个队列还要支持如下的操作: constructor: 初始化队列 enqueue:入队 dequeue:出队 队列是一种基本的数据结构,在平常的应用中十分广泛,多数情况队列都

C++编程中break语句和continue语句的学习教程

break 语句 break 语句可终止执行最近的封闭循环或其所在条件语句. 控制权将传递给该语句结束之后的语句(如果有的话). break; 备注 break 语句与 switch 条件语句以及 do.for 和 while 循环语句配合使用. 在 switch 语句中,break 语句将导致程序执行 switch 语句之外的下一语句. 如果没有 break 语句,则将执行从匹配的 case 标签到 switch 语句末尾之间的每个语句,包括 default 子句. 在循环中,break 语句

解析C++中的for循环以及基于范围的for语句使用

for循环语句 重复执行语句,直到条件变为 false. 语法 for ( init-expression ; cond-expression ; loop-expression ) statement; 备注 使用 for 语句可构建必须执行指定次数的循环. for 语句包括三个可选部分,如下表所示. for 循环元素 下面的示例将显示使用 for 语句的不同方法. #include <iostream> using namespace std; int main() { // The co

如何用C++实现双向循环链表

双向循环链表,即每个节点都拥有一前一后两个指针且头尾互链的链表.各种链表的简单区别如下:单向链表:基本链表:单向循环链表:不同于单向链表以 NULL 判断链表的尾部,单向循环链表的尾部链接到表头,因此当迭代操作到表头前即是尾部:双向链表:比单向链表多出指向前一个节点的指针,但实际上使用双向链表时很少使用不循环的:双向循环链表:相对于单向循环链表,双向循环链表可从头部反向迭代,这在链表长度很大且需要获取.插入或删除靠近链表尾部元素的时候十分高效.单向循环列表只能从表头正向迭代,执行的时间大于从反向

C++循环链表之约瑟夫环的实现方法

本文实例形式展示了C++实现循环链表中约瑟夫环的方法,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: #include <iostream> using namespace std; typedef struct student { int data; struct student* next; }node,*LinkList; //约瑟夫环 void printfList(LinkList head){ LinkList p=head; if (head!=NULL) { do

c++中for双循环的那些事

情况1:如下,这样我们会发现,n输出为100,虽然两层循环的标识符都是i,然是两个做管辖的范围不同,具体情况不明~~~求大神解释 复制代码 代码如下: int main(int argc,char* argv[]){    int n=0;    int mx;    for (int i=0;i<10;i++)    {        for (int i=0;i<10;i++)        {            n++;        }    }    cout<<n&

C++双向循环列表用法实例

本文实例讲述了C++双向循环列表用法.分享给大家供大家参考.具体如下: /* 双向循环链表 */ #include <iostream> using namespace std; //结构体构造链表的指针域和数据域 struct ChainNode { int data; //节点数据 ChainNode *left; //节点的前驱指针 ChainNode *right; //节点的后继指针 }; ////////////创建n个双向循环链表 并返回链表头指针///////// ChainN

用C++实现单向循环链表的解决方法

用C++实现一个单向循环链表,从控制台输入整型数字,存储在单项循环链表中,实现了求链表大小.不足之处,还望指正! 复制代码 代码如下: // TestSound.cpp : 定义控制台应用程序的入口点.//实现单向循环链表#include "stdafx.h"#include <iostream>#include <string>using namespace std;//定义链表一个节点的结构体template <class T>struct NO

讲解C++的do while循环和循环语句的嵌套使用方法

用do-while语句构成循环 do-while语句的特点是先执行循环体,然后判断循环条件是否成立.其一般形式为: do 语句 while (表达式); 它是这样执行的:先执行一次指定的语句(即循环体),然后判别表达式,当表达式的值为非零("真") 时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束.可以用下图表示其流程. [例]用do-while语句求1+2+3+-+100. #include <iostream> using namespace

C++中的while循环和for循环语句学习教程

C++ while循环 while语句的一般形式如下: while (表达式) 语句 其作用是: 当指定的条件为真(表达式为非0)时,执行while语句中的内嵌语句.其流程图见下图. 其特点是:先判断表达式,后执行语句.while循环称为当型循环. 例:求1+2+3+-+100. #include <iostream> using namespace std; int main( ) { int i=1,sum=0; while (i<=100) { sum=sum+i; i++; }

简单掌握C++编程中的while与do-while循环语句使用

While 语句 重复执行语句,直到表达式计算为零. 语法 while ( expression ) statement 备注 expression 的测试在每次执行循环前发生:因此 while 循环执行零次或更多次. 表达式必须是整型.指针类型或包含明确的整型或指针类型转换的类类型. 当中断.导航或回归在语句体中执行时,也可以中止while 循环.请使用continue语句来结束当前迭代但不退出while循环. 继续 将控件传递给下一轮循环 while. 以下代码使用 while 循环从字符串

shell基础学习中的字符串操作、for循环语句示例

复制代码 代码如下: #!/bin/bashmy_name="jxq" echo $my_nameecho ${my_name} # ------------------------------------# 字符串操作# ------------------------------------ # 单引号字符串的限制,双引号没有这些限制:# 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的# 单引号字串中不能出现单引号(对单引号使用转义符后也不行)name="w

简单了解Java编程中线程的创建与守护线程

线程的两种创建方式及优劣比较 1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现类的对象. (3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象.(接口可以实现多继承) (4).调用Thread对象的start()方法,启动线程 示例代码: package demo.thread; public class Tread

简单介绍Java编程中的线程池

从 Java 5 开始,Java 提供了自己的线程池.线程池就是一个线程的容器,每次只执行额定数量的线程. java.util.concurrent.ThreadPoolExecutor 就是这样的线程池.它很灵活,但使用起来也比较复杂,本文就对其做一个介绍. 首先是构造函数.以最简单的构造函数为例: public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit uni

简单讲解Python编程中namedtuple类的用法

Python的Collections模块提供了不少好用的数据容器类型,其中一个精品当属namedtuple. namedtuple能够用来创建类似于元祖的数据类型,除了能够用索引来访问数据,能够迭代,更能够方便的通过属性名来访问数据. 在python中,传统的tuple类似于数组,只能通过下标来访问各个元素,我们还需要注释每个下标代表什么数据.通过使用namedtuple,每个元素有了自己的名字,类似于C语言中的struct,这样数据的意义就可以一目了然了.当然,声明namedtuple是非常简

简单了解Java编程中抛出异常的方法

任何Java代码都可以抛出异常,如:自己编写的代码.来自Java开发环境包中代码,或者Java运行时系统.无论是谁,都可以通过Java的throw语句抛出异常.从方法中抛出的任何异常都必须使用throws子句. 1. throws抛出异常 如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常.例如汽车在运行时可能会出现故障,汽车本身没办法处理这个故障,那就让开车的人来处理. throws语句用在方法定义时声明该方法要抛出的异常类型,如果抛出的是Ex

简单了解PHP编程中数组的指针的使用

要使用数组中的元素,就需要数组的定位.定位的实现需要借助数组指针来完成.PHP中有很多函数可以移动数组指针.下面将给大家介绍几个. 将指针移动到下一个数组位置next() next()函数返回紧接着放在当前数组指针下一个位置的数组值.其形式如下: mixed next(array array) 以下是一个例子: $fruits = array("apple", "banana", "orange", "pear"); echo

简单了解Java编程中对异常处理的运用

Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象.当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被抛出(throw).该方法可以选择自己处理异常或传递该异常.两种情况下,该异常被捕获(caught)并处理.异常可能是由Java运行时系统产生,或者是由你的手工代码产生.被Java抛出的异常与违反语言规范或超出Java执行环境限制的基本错误有关.手工编码产生的异常基本上用于报告方法调用程序的出错状况. Java异常处理通过5个关键字控制:try.catch.th

简单介绍C++编程中派生类的析构函数

和构造函数类似,析构函数也是不能被继承的. 创建派生类对象时,构造函数的调用顺序和继承顺序相同,先执行基类构造函数,然后再执行派生类的构造函数.但是对于析构函数,调用顺序恰好相反,即先执行派生类的析构函数,然后再执行基类的析构函数. 请看下面的例子: #include <iostream> using namespace std; class A{ public: A(){cout<<"A constructor"<<endl;} ~A(){cout

解析Java的JNI编程中的对象引用与内存泄漏问题

JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互--在 Java 程序中调用 native code:在 native code 中嵌入 Java 虚拟机调用 Java 的代码. JNI 编程在软件开发中运用广泛,其优势可以归结为以下几点: 利用 native code 的平台相关性,在平台相关的编程中彰显优势. 对 native code 的代码重用. native code 底层操作