2017-07-19 17:23:43 liuyuxin123 阅读数 5994
  • 深入浅出C++程序设计(基础篇)视频教学

    C/C++都是比较早的、也是非常经典的编程语言,至今仍然非常流行。本教程结合个人超过10年的C/C++的使用经验,调试完成整套深入浅出C++程序设计教程,包括基础篇、面向对象篇、C++STL标准模板库,每篇都适合不同层次的C/C++爱好者学习与使用。

    12548 人正在学习 去看看 李建祥

描述
简单的计算器,支持加减乘除四种运算。仅需考虑输入输出为整数的情况,数据和运算结果不超过int的范围。(来源: POJ)

输入
输入一行,三个参数,其中前两个为整数,第三个为操作符加减乘除其一。

输出
输出只有一行,为运算结果(一个整数),但如果出现除数为0的情况,则输出:Divided by zero;如果出现无效的操作符,则输出:Invalid operator!

样例输入

第一组
1 2 +
第二组
1 0 /
第三组
1 0 XOR

样例输出

第一组
3
第二组
Divided by zero!
第三组
Invalid operator!

程序示例:

//Data:June 19, 2017
//Writen by Yuxin Liu
#include <iostream>
using namespace std;
int main()
{
    int a[2] = { 0, 0 };//Initialization 
    char b = ' ';
    //输入
    for (int i = 0; i < 2; i++)
    {
        cin >> a[i];
    }
    cin >> b;
    //switch语句匹配相关运算符
    switch (b)
    {
    case '+' : 
        cout << a[0] + a[1];
        break;
    case '-' : 
        cout << a[0] - a[1];
        break;
    case '*' : 
        cout << a[0] * a[1];
        break;
    case '/' : 
        if (a[1]==0)
        {
            cout << "Divided by zero!";
            break;
        }
        else
        {
            cout << a[0] / a[1];
            break;
        }
    default: 
        cout << "Invalid operator !";

    }
    return 0;
}
2014-04-06 20:14:25 guodongxiaren 阅读数 2987
  • 深入浅出C++程序设计(基础篇)视频教学

    C/C++都是比较早的、也是非常经典的编程语言,至今仍然非常流行。本教程结合个人超过10年的C/C++的使用经验,调试完成整套深入浅出C++程序设计教程,包括基础篇、面向对象篇、C++STL标准模板库,每篇都适合不同层次的C/C++爱好者学习与使用。

    12548 人正在学习 去看看 李建祥

—————————————————————————————————————————

    我们经常会遇到使用C/C++语言编写一个菜单系统的情况。在控制台窗口打印一个有好多选项的菜单,然后提示你通过输入对应的编号来完成相应的操作。

    这不,我们数据结构课,老师也是叫我们把一种数据结构的所有操作输出到一个菜单里,通过输入序号来测试每个操作的功能。老师给出了我们大体上框架的代码,但是老师使用的是switch来执行菜单,代码较多重复,相当麻烦。于是我就使用函数指针数组来替代实现了相同的功能。

——————————————————————————————————————————

本文的写作背景

这是我们作业里要实现的效果(当然,本文的目的不是介绍数据结构):

输入对应序号之后,老师的main函数中代码是这样的:

cin>>choose;//整型
if(choose>0&&choose<14)
{
	system("cls");//VC的清屏函数,gcc不适用
	displayCurrentObject(sq);//打印当前顺序表的每个元素
}
switch(choose)
{
case 1:ex3_1_1(sq,continueYesNo);break;
case 2:ex3_1_2(sq,continueYesNo);break;
case 3:ex3_1_3(sq,continueYesNo);break;
case 4:ex3_1_4(sq,continueYesNo);break;
case 5:ex3_1_5(sq,continueYesNo);break;
case 6:ex3_1_6(sq,continueYesNo);break;
case 7:ex3_1_7(sq,continueYesNo);break;
case 8:ex3_1_8(sq,continueYesNo);break;
case 9:ex3_1_9(sq,continueYesNo);break;
case 10:ex3_1_10(sq,continueYesNo);break;
case 11:ex3_1_11(sq,continueYesNo);break;
case 12:ex3_1_12(sq,continueYesNo);break;
case 13:ex3_1_13(sq,continueYesNo);break;

default:    cout<<"\n  你选择了结束"<<endl<<endl;
	return;
}
//判断是否继续操作
if(continueYesNo=='N'||continueYesNo=='n')
	break;

我们自定义的顺序表类中封装的每一个操作都单独编写了一个测试函数来测试这些操作,比如:

//ex3_1_Test.h单独的一个头文件
//测试:判断顺序表是否为空
template <typename ElemType>
void ex3_1_2(MySqList<ElemType>& sq,char& continueYesNo)
{
	cout<<" ***********\4判断顺序表是否为空\4**********"<<endl<<endl;
	if(sq.isEmpty())
		cout<<"当前顺序表为空"<<endl;
	else
	{
		cout<<"当前顺序表不为空"<<endl;
		cout<<sq;
	}
	cout<<" *****************************************"<<endl<<endl;
	cout<<" 还继续吗(Y.继续\tN.结束)?";
	cin>>continueYesNo;
}
当然,这些都不是本文的重点,只不过是作为我写作本文的一个背景。

函数指针数组替代switch

我们看到每一个测试函数ex3_1_……都有相同的形参列表:一个自定义的模板MySqList对象的引用,和一个用于判断是否继续的char型continueYesNo。这也是我们老师搭的框架。然而switch语句下面十几个case着实让人看着不舒服,因为它们每一个都实在是太像了。所以我改用了函数指针的数组来实现。

//main函数所在的cpp文件中
void (*test[13])(MySqList<int>&,char&)={ex3_1_1,ex3_1_2,ex3_1_3,ex3_1_4,
					ex3_1_5,ex3_1_6,ex3_1_7,ex3_1_8,
					ex3_1_9,ex3_1_10,ex3_1_11,ex3_1_12,
				        ex3_1_13};

然后原来冗长的switch语句就变成了:

cin>>choose;
if(choose>0&&choose<14)
{
	system("cls");
	displayCurrentObject(sq);
}
test[choose-1](sq,continueYesNo);
if(continueYesNo=='N'||continueYesNo=='n')
	break;
请注意函数指针数组的写法。

void (*test[])(形参列表)={……};
如果在声明的时候初始化,那么[ ]中可省略数组大小,就像普通数组一样。其实只要能理解函数指针,那么函数指针的数组也就一目了然了。

小讲解函数指针及其数组

普通的函数指针,比如我们有三个判断大小的函数:

//功能:判断两整数是否相等
bool equal(int a,int b)
{
	if(a==b)
		return true;
	else
		return false;
}				
//功能:判断一个整数是否大于另一个整数
bool great(int a,int b)
{
	if(a>b)
		return true;
	else
		return false;
}	
//功能:判断一个整数是否小于另一个整数
bool less(int a,int b)
{
	if(a<b)
		return true;
	else
		return false;
}
这是三个具有相同形参列表的函数。有时候我们需要动态的执行这三个操作,比如由用户决定,,或者其他情况需要我们把函数本身作为参数传递的时候。

假设我们有一个函数fun用于比较两个整型,而具体是何种比较则作为一个形参,我们可以写成:

bool fun(int a,int b,bool(*compare)(int,int))
{
	return (*compare)(a,b);
}
看懂了吗,其实万变不离其宗,bool(*compare)(int,int)看起来虽然复杂,其实也是一个形参的类型加上一个该类型形参的变量名,就好比是 int a 一样,a只是一个整型变量,起什么名字无所谓。bool(*compare)(int,int)分解开也是两部分:

bool(*)(int,int) 是参数的类型,compare是该类型的变量名,也是起什么名字无所谓的。再看指针数组比如:

bool(*fun[3])(int,int)={equal,great,less};
就好理解了吧,同样是在变量名后面加上[ ] 来代表数组。上面的代码也等价于:

bool(*fun2[3])(int,int);
fun2[0] = equal;
fun2[1] = great;
fun2[2] = less;
或许有人会心生疑问,这里的fun2[ ]数组里面应该包含的是指针啊,能直接把函数名赋值给它吗?没错是可以的实际上函数的函数名本身就是一个指针类型。

//这是等效的操作
fun2[0] = equal;
fun2[0] = &equal;
//注意!这里的&是取地址符号,而非引用符号

2019-10-19 16:04:29 weixin_45287871 阅读数 61
  • 深入浅出C++程序设计(基础篇)视频教学

    C/C++都是比较早的、也是非常经典的编程语言,至今仍然非常流行。本教程结合个人超过10年的C/C++的使用经验,调试完成整套深入浅出C++程序设计教程,包括基础篇、面向对象篇、C++STL标准模板库,每篇都适合不同层次的C/C++爱好者学习与使用。

    12548 人正在学习 去看看 李建祥

按照以下要求写一个C++小程序:用C++语言编写一个打字训练器。

提供一个练习盲打的应用软件。让用户在不看键盘的情况下,通过屏幕看到所键入的字符。该应用程序在屏幕显示一个虚拟键盘和一个文本输入区,能够将用户在实际键盘中所按下的某个按键高亮显示在虚拟键盘上,同时应用程序中还应包含一些菜单,实现选择字体、字号、文本颜色、以及清除所显示的文本等各项功能。
在这里插入图片描述
C++网络版的打字软件源程序,程序会连接远程数据库获取打字信息,并包括有打字练习、网上考试模块,本程序编写时要用到很多网络知识、数据库知识以及字符处理功能等。 提示:编译完成后要将SkinPlusPlusDLL.dll拷贝至Debug目录中,TypeData.mdb放入Debug\Data中。
在这里插入图片描述
项目结构展示:
在这里插入图片描述
部分源码展示:
在这里插入图片描述
一款专门为打字初学者打造的打字练习软件,特别适合初学拼音的朋友们,使用十分简单,傻瓜式的设计,开发过程也很简单,适合刚入门的小白练手。
在这里插入图片描述
最后,如果你在学习C/C++的过程中遇到了问题,可以来问小编哦~小编很热情的(●’◡’●)

声明:本文内容来源于网络,如有侵权请联系删除

2019-05-30 17:00:36 weixin_41986518 阅读数 1008
  • 深入浅出C++程序设计(基础篇)视频教学

    C/C++都是比较早的、也是非常经典的编程语言,至今仍然非常流行。本教程结合个人超过10年的C/C++的使用经验,调试完成整套深入浅出C++程序设计教程,包括基础篇、面向对象篇、C++STL标准模板库,每篇都适合不同层次的C/C++爱好者学习与使用。

    12548 人正在学习 去看看 李建祥

现在的航空公司都有自己的订票系统相比大家都看过或用过,那么各位小伙伴想没想过自己写一个这个系统出来呢?今天,就让小编带着大家用C语言代码来写一个自己的航空公司订票系统吧。

 

项目展示:

 

代码展示:

 

效果展示:

 

该程序显示一个带有下列选项的菜单:预订机票、取消预订、查看某人是否预定了机票,以及显示预订乘客。这些信息保存在一个按照字母排列的名字链表中。在程序的简化版中,假设只为一趟航班预订机票。在完全版中不再限制航班的数目。创建一个航班链表,其中每个节点都指向乘客链表的指针。

 

 

 

2016-11-23 19:41:36 longjingwen12345 阅读数 1453
  • 深入浅出C++程序设计(基础篇)视频教学

    C/C++都是比较早的、也是非常经典的编程语言,至今仍然非常流行。本教程结合个人超过10年的C/C++的使用经验,调试完成整套深入浅出C++程序设计教程,包括基础篇、面向对象篇、C++STL标准模板库,每篇都适合不同层次的C/C++爱好者学习与使用。

    12548 人正在学习 去看看 李建祥

C++实现双向循环链表,包括链表的创建,插入,删除,查询等基本操作,并带有操作菜单,见底部效果图

// 双向循环链表3.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

//每个链表对象的结构
typedef struct node {
    int data;
    struct node *pre;
    struct node *next;
}Dnode;

//创建一个带头结点的双向循环链表
void creatLinkList(Dnode *&head)
{
    Dnode *p, *q;
    int x;
    int i = 1;//结点位置
    q = (Dnode *)malloc(sizeof(Dnode));
    if (q == NULL)
    {
        cout << "内存分配失败!" << endl;

    }
    q->data = 0;
    q->pre = q;
    q->next = q;
    head = q;

    cout << "请输入第" << i << "个结点值:";
    cin >> x;
    cout << endl;
    while (x != 0)
    {
        p = (Dnode *)malloc(sizeof(Dnode));
        if (p == NULL)
        {
            cout << "内存分配失败!" << endl;

        }
        p->data = x;
        p->next = head;
        p->pre = q;
        q->next = p;
        q = p;
        i++;
        cout << "请输入第" << i << "个结点值:";
        cin >> x;
        cout << endl;
    }
}

//遍历链表
void printLinkList(Dnode *L)
{
    Dnode *head, *p;
    head = L;
    p = L->next;
    while (p != head) {
        cout << p->data <<"  ";
        p = p->next;
    }
    cout << endl;
}

//返回链表的大小
int length(Dnode *L)
{

    int sum = 0;
    Dnode *head, *p;
    head = p = L;
    while (p->next != head) {
        sum++;
        p = p->next;
    }
    return sum;
}
//获取第i个结点前的位置
Dnode * getPosition(Dnode *L, int i)
{

    Dnode *head = L, *p = L->next;

    int j = 1;
    while (p != head&&j<(i - 1))
    {
        p = p->next;
        j++;
    }
    return p;

}

//向链表第i个位置,插入数据为e的结点
int insertElemToLinkList(Dnode *L, int i, int e)
{

    int sum = length(L);
    if (i<1 || i>(sum + 1))
    {
        cout << "请输入正确的插入位置" << endl;
        return 0;
    }
    Dnode *p, *q, *head;
    head = L;

    q = (Dnode *)malloc(sizeof(Dnode));
    if (q == NULL)
    {
        cout << "内存分配失败!" << endl;
        return 0;
    }
    //在链表头部插入
    if (i == 1)
    {
        q->data = e;
        q->next = head->next;
        q->pre = head;
        head->next->pre = q;
        head->next = q;
        return 1;
    }

    else {
        p = getPosition(L, i);
        q->data = e;
        q->next = p->next;
        q->pre = p;
        p->next->pre = q;
        p->next = q;
        return 1;

    }
    return 0;

}
//删除第i个结点
void deleteLinkList(Dnode *L, int i)
{

    Dnode *p, *head = L;
    p = L;
    int j = 1;
    int sum = length(L);
    if (i<1 || i>sum)
    {
        cout << "删除位置超出聊表的范围!" << endl;
        return ;
    }

    while (j <= i)
    {
        p = p->next;
        j++;
    }
    int k = p->data;
    p->pre->next = p->next;
    p->next->pre = p->pre;
    free(p);

}

//查找链表中是否有某个值
Dnode * search(Dnode *L, int e)
{

    Dnode *p, *head;
    head = L;
    p = L->next;
    while (p != head&&p->data != e)
    {
        p = p->next;
    }
    if (p != head)
    {
        return p;
    }
    else
    {
        return NULL;
    }
}

void main()
{
    Dnode *L = NULL;
    //让程序成菜单形式,不会退出
    while (true)
    {
        int m = 0;//菜单项
        int i, e;
        cout << endl;
        cout << "    ***********************************************************" << endl;
        cout << "    *                                                         *" << endl;
        cout << "    *     1、创建链表                                         *"<< endl;
        cout << "    *     2、遍历链表                                         *" << endl;
        cout << "    *     2、求链表长度                                       *" << endl;
        cout << "    *     4、向链表的第i个位置插入新结点(i>=1)              *" << endl;
        cout << "    *     5、删除链表中的的第i个值(i>=1)                    *"<< endl;
        cout << "    *     6、查询链表中是否有key的结点                        *"<< endl;
        cout << "    *                                                         *" << endl;
        cout << "    ***********************************************************" << endl;
        cout << "请输入菜单序号,执行相应操作:";
        cin >> m;
        cout << endl;
        if (L == NULL&&m!=1)
        {
            cout <<"请先初始化链表,再执行其它相关操作"<<endl ;
            m = 1;
        }
        switch (m)
        {
        case 1://创建链表  
            creatLinkList(L);
            break;
        case 2://遍历链表  
            printLinkList(L);

            break;
        case 3://求链表长度 
            cout << "链表的长度为:" << length(L) << endl;
            break;
        case 4://向链表的第i个位置插入新结点(i>=1)         
            cout << "插入新节点,请输入待插入的值和位置:" << endl;
            cin >> e >> i;
            cout << endl;
            insertElemToLinkList(L, i, e);
            cout << "新链表的所有元素输出如下:" << endl;
            printLinkList(L);
            break;
        case 5://删除链表中的的第i个值(i>=1)
            cout << "删除聊表中的第i个元素,请输入要删除的位置(位置从1开始计数):";
            cin >> i;
            cout << endl;
            deleteLinkList(L, i);
            cout << "新链表的所有元素输出如下:" << endl;
            printLinkList(L);
            break;
        case 6://查询链表中是否有key的结点  
            cout << "查询链表中是否有某个数,请输入需要查询的key:";
            cin >> e;
            cout << endl;
            Dnode *m = search(L, e);
            if (m != NULL)
            {
                cout << "链表中存在" << e <<endl;
            }
            break;
        }
    }
}


这里写图片描述

没有更多推荐了,返回首页