月度归档:2014年11月

数值字符串判断函数(C语言)

用于判断输入的字符串是否是数值字符串

通常对于输入的字符串常常需要判断是否是数值, 以便可以作为数字输入

判断条件:

  1. 字符串有数字, ‘+’, ‘-‘ 组成
  2. ‘+’, ‘-‘ 只能出现在首个字符位置上
  3. 当首字符符合条件2时, 后面不能为’.’
  4. ‘+’, ‘-‘, 不能同时出现, 且他们每个字符最多出现一次

输入条件:

输入为连续字符, 中间没有空格

输出结果:

根据判断条件判断输入的字符串是否符合判定条件, 符合输入 true, 否则输出 false

源代码:

bool check(char str[]) {
	if (str[0] == '+') {
		if (str[1] == '.')
			return false;
		else {
			int i = 1;
			int cnt = 0;
			while (str[i] != '\0') {
				if (str[i] == '.') {
					cnt++;
				} else if (str[i] < '0' || str[i] > '9') {
					return false;
				}
				i++;
			}
			if (cnt > 1) {
				return false;
			}
		}
	} else if (str[0] == '-') {
		if (str[1] == '.')
			return false;
		else {
			int i = 1;
			int cnt = 0;
			while (str[i] != '\0') {
				if (str[i] == '.') {
					cnt++;
				} else if (str[i] < '0' || str[i] > '9') {
					return false;
				}
				i++;
			}
			if (cnt > 1) {
				return false;
			}
		}
	} else {
		int i = 0;
		int cnt = 0;
		while (str[i] != '\0') {
			if (str[i] == '.') {
				cnt++;
			} else if (str[i] < '0' || str[i] > '9') {
				return false;
			}
			i++;
		}
		if (cnt > 1) {
			return false;
		}
	}
	
	return true;
}

链表程序示例(图书类C++)

简单图书类示例

使用链表实现, 当然使用类(结构体)的数组都能实现, 程序使用的是C++原因, 基本上可以用C语言实现. 经过一番测试, 函数基本完美. 其中书本自动插入函数着实比较难, 不过好歹写出来.
show

代码程序(300多行, 比较简陋):

 

/******************************************************************
	Name:   	C++链表程序演示
	Date:  		2014-11-11 19:57:50
	Author: 	lnesuper
    Version:    V0.6
    Discripts:  实现元素智能插入(排序插入), 测试功能正常
*******************************************************************/

#include <iostream>
#include <stdlib.h>         //atoi(), atof()函数所在的头文件
using namespace std;

//图书类的定义
class book {
	public:
		int num;            //图书编号
		float price;        //图书价格
		book* pNext;        //下一个节点指针
};

//函数原型声明
book* creat(void);          		//创建链表
bool ncheck(string str);    		//判断字符串是否是纯数字
bool strcheck(string str);			//判断字符串是否是数字和"."的组合(可以看作为小数)
bool repeat(book* pHead, int num);   //判断id是否相等
void show(book* pHead);  			//显示链表
void del(book* pHead); 				//删除图书类节点
void add(book* pHead);   			//尾部追加节点
void preadd(book* pHead); 			//头部插入
void autoadd(book* pHead);   		//顺序添加
int getnum(book* pHead);       		//获取节点个数

int main(void) {
	cout << "----------------生成书库----------------" << endl;
	book* pHead = creat();      //生成一个book类的链表
	show(pHead);                //显示book类的pHead对象内容
	cout << "----------------删除书库----------------" << endl;
	del(pHead);
	show(pHead);
	cout << "----------------尾部添加----------------" << endl;
	add(pHead);
	show(pHead);
	cout << "----------------头部添加----------------" << endl;
	preadd(pHead);
	show(pHead);
	cout << "----------------智能添加----------------" << endl;
	autoadd(pHead);
	show(pHead);
	cout << "--------------------------------" << endl;
	cout << "统计共" << getnum(pHead) << "本图书" << endl;

	return 0;
}

book* creat(void) {
	book *pHead = new book;     //定义一个头指针
	book *p = pHead;            //定义一个p指针, 它指向头指针
	pHead->pNext = NULL;        //将头指针的pNext成员(指针)赋为空
	string str;                 //C++字符串类
	do {
		//判断输入是否为数字组合
		do {

			do {
				cout << "请输入图书的整形编号(数字0结束输入): ";
				cin >> str;
			} while (!ncheck(str.c_str()));
			
			if (repeat(pHead, atoi(str.c_str()))) {
				cout << "Warning!!! 输入的编号已存在\n" << endl;
				continue;
			}
		} while (repeat(pHead, atoi(str.c_str())));
		book *pNew = new book;      //生成一个book类pNext对象

		pNew->num = atoi(str.c_str());    	 	//pNew->num

		if (0 != pNew->num) {
			//判断输入字符串是否为数字和"."的组合
			do {
				cout << "请输入编号为" << pNew->num << "的图书的价格(数字): ";
				cin >> str;
			} while (!strcheck(str.c_str()));
			pNew->pNext = NULL;                 //pNew->pNext
			pNew->price = atof(str.c_str());	//pNew-price
			p->pNext = pNew;
			p = pNew;
		} else {
	        delete pNew;
	        p->pNext = NULL;
	        pNew = NULL;

			return pHead;
		}
		
	} while (true);

}


//判断字符串是否为开头不为零的纯数字组成函数
bool ncheck(string str) {
	int i;
	for (i = 0; i < str.length(); i++) {
		if (str[i] >= '0' && str[i] <= '9')
			continue;
		else
			return false;
	}
	return true;
}

//判断字符串是否为非零浮点数函数
bool strcheck(string str) {
	int i;
	for (i = 0; i < str.length(); i++) {
		if (str[i] >= '0' && str[i] <= '9' || str[i] == '.')
			continue;
		else
			return false;
	}
	return true;
}

//判断类成员num的值是否相等
bool repeat(book* pHead, int num) {
	book* p = pHead;
	while (NULL != p->pNext) {
		p = p->pNext;
		if (num == p->num || 0 == p->num) {
			return true;
		}
	}
	return false;
}

//显示图书信息
void show(book* pHead) {
	book* p = pHead;
	if (NULL == pHead->pNext) {
		cout << "链表为空\n" << endl;
	} else {
		cout << "================图书信息================" << endl;
		do {
			p = p->pNext;
			cout << "图书编号: " << p->num << " 该书的价格: " << p->price << endl;
		} while (NULL != p->pNext);
		cout << "共" << getnum(pHead) << "本图书, 输出完毕" << endl;
		cout << "========================================" << endl;
	}

	return;
}

//删除图书编号为id的节点
void del(book* pHead) {

	if (NULL == pHead->pNext) {
		cout << "链表为空, 无法删除" << endl;

		return;
	} else {
		string st;
        do {
			cout << "请输入需要删除的图书编号(非负整数): ";
			cin >> st;
		} while (!ncheck(st.c_str()));
		int id = atoi(st.c_str());
		book* p = pHead;

		do {
			book* pT = p->pNext;
			if (id == pT->num) {
				p->pNext = pT->pNext;
				delete pT;
				cout << "删除成功" << endl;

				return;
			} else
				p = p->pNext;
		} while (NULL != p->pNext);
		cout << "未找到元素, 删除失败" << endl;
		return;
	}
}

//添加图书信息函数
void add(book* pHead) {
	book* p = pHead;

	//将指针指向尾节点
	while (NULL != p->pNext) {
		p = p->pNext;
	}

	//添加节点
	book* pNode = new book;
	
    string str;
	cout << "请输入添加图书的整形(非0数字)编号: ";
	cin >> str;
	while (!ncheck(str.c_str()) || 0 == atoi(str.c_str()) || repeat(pHead, atoi(str.c_str()))) {
		if (repeat(pHead, atoi(str.c_str()))) {
			cout << "Warning!!! 输入的编号已存在\n" << endl;
		}
		cout << "请输入添加图书的整数(非0数字)编号: ";
		cin >> str;
	}
	pNode->num = atoi(str.c_str());
	do {
		cout << "请输入编号为" << pNode->num << "的图书的价格(数字): ";
		cin >> str;
	} while (!strcheck(str.c_str()));
	pNode->price = atof(str.c_str());
	pNode->pNext = NULL;
	p->pNext = pNode;
	cout << "\n" << endl;
	
	return;
}

void preadd(book* pHead) {
	book* pNode = new book;
	string str;
	cout << "请输入添加图书的整形(非0数字)编号: ";
	cin >> str;
	while (!ncheck(str.c_str()) || 0 == atoi(str.c_str()) || repeat(pHead, atoi(str.c_str()))) {
		if (repeat(pHead, atoi(str.c_str()))) {
			cout << "Warning!!! 输入的编号已存在\n" << endl;
		}
		cout << "请输入添加图书的整数(非0数字)编号: ";
		cin >> str;
	}

	pNode->num = atoi(str.c_str());
	do {
		cout << "请输入编号为" << pNode->num << "的图书的价格(数字): ";
		cin >> str;
		} while (!strcheck(str.c_str()));
	pNode->price = atoi(str.c_str());
	
	pNode->pNext = pHead->pNext;
	pHead->pNext = pNode;

	return;
}

//智能添加节点
void autoadd(book* pHead) {
	book* pNode = new book;
	    string str;
	cout << "请输入添加图书的整形(非0数字)编号: ";
	cin >> str;
	while (!ncheck(str.c_str()) || 0 == atoi(str.c_str()) || repeat(pHead, atoi(str.c_str()))) {
		if (repeat(pHead, atoi(str.c_str()))) {
			cout << "Warning!!! 输入的编号已存在\n" << endl;
		}
		cout << "请输入添加图书的整数(非0数字)编号: ";
		cin >> str;
	}
	pNode->num = atoi(str.c_str());
	do {
		cout << "请输入添加的图书编号为" << pNode->num << "的图书的价格(数字): ";
		cin >> str;
		} while (!strcheck(str.c_str()));
	pNode->price = atoi(str.c_str());
	
	pNode->pNext = NULL;

	if (NULL == pHead->pNext) {
		pHead->pNext = pNode;

		return;
	} else {
		book* p = pHead;
		book* pT = p->pNext;
		do {
			if (pNode->num < pT->num) {
				pNode->pNext = pT;
				p->pNext = pNode;
				
				return;
			} else if (pT->pNext == NULL) {
				pNode->pNext = pT->pNext;
				pT->pNext = pNode;
				
				return;
			} else {
				p = pT;
				pT = pT->pNext;
			}
		} while (true);
	}
 }

//获取链表长度
int getnum(book* pHead) {
	int cnt = 0;
	book* p = pHead;
	while (NULL != p->pNext) {
		p = p->pNext;
		cnt++;
	}

	return cnt;
}

/*
Test Result:
----------------------
----------------生成书库----------------
请输入图书的整形编号(数字0结束输入): 3
请输入编号为3的图书的价格(数字): 33.3
请输入图书的整形编号(数字0结束输入): 5
请输入编号为5的图书的价格(数字): 55.5
请输入图书的整形编号(数字0结束输入): 3
Warning!!! 输入的编号已存在

请输入图书的整形编号(数字0结束输入): 0
================图书信息================
图书编号: 3 该书的价格: 33.3
图书编号: 5 该书的价格: 55.5
共2本图书, 输出完毕
========================================
----------------删除书库----------------
请输入需要删除的图书编号(非负整数): 0
未找到元素, 删除失败
================图书信息================
图书编号: 3 该书的价格: 33.3
图书编号: 5 该书的价格: 55.5
共2本图书, 输出完毕
========================================
----------------尾部添加----------------
请输入添加图书的整形(非0数字)编号: 0
请输入添加图书的整数(非0数字)编号: 3
Warning!!! 输入的编号已存在

请输入添加图书的整数(非0数字)编号: 2
请输入编号为2的图书的价格(数字): 22

================图书信息================
图书编号: 3 该书的价格: 33.3
图书编号: 5 该书的价格: 55.5
图书编号: 2 该书的价格: 22
共3本图书, 输出完毕
========================================
----------------头部添加----------------
请输入添加图书的整形(非0数字)编号: 6
请输入编号为6的图书的价格(数字): 66
================图书信息================
图书编号: 6 该书的价格: 66
图书编号: 3 该书的价格: 33.3
图书编号: 5 该书的价格: 55.5
图书编号: 2 该书的价格: 22
共4本图书, 输出完毕
========================================
----------------智能添加----------------
请输入添加图书的整形(非0数字)编号: 7
请输入添加的图书编号为7的图书的价格(数字): 77
================图书信息================
图书编号: 6 该书的价格: 66
图书编号: 3 该书的价格: 33.3
图书编号: 5 该书的价格: 55.5
图书编号: 2 该书的价格: 22
图书编号: 7 该书的价格: 77
共5本图书, 输出完毕
========================================
--------------------------------
统计共5本图书

*/

小更新:

添加字符界面
下载: 源代码下载

兔子问题

兔子问题来源:

根据高德纳(Donald Ervin Knuth)的《计算机程序设计艺术》(The Art of Computer Programming),1150年印度数学家Gopala和金月在研究箱子包装物件长阔刚好为1和2的可行方法数目时,首先描述这个数列。 在西方,最先研究这个数列的人是比萨的列奥那多(意大利人斐波那契 Leonardo Fibonacci),他描述兔子生长的数目时用上了这数列。

  • 第一个月初有一对刚诞生的兔子
  • 第二个月之后(第三个月初)它们可以生育
  • 每月每对可生育的兔子会诞生下一对新兔子
  • 兔子永不死去

假设在n月有可生育的兔子总共a对,n+1月就总共有b对。在n+2月必定总共有a+b对: 因为在n+2月的时候,前一月(n+1月)的b对兔子可以存留至第n+2月(在当月属于新诞生的兔子尚不能生育)。而新生育出的兔子对数等于所有在n月就已存在的a对

求第N个月兔子对数问题

就是一个斐波那契数列中的一个数
费波那契数列由0和1开始,之后的费波那契系数就由之前的两数相加。首几个费波那契系数是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……

使用递归方法实现(C++)

 

/*************************************************

 *	Name:  			求第N个月兔子对数
 *      Date:   		2014-11-4 23:34:45
 *      Author: 		lnesuper
 *      Version:    	V0.1
 *      Discription:    使用递归解决兔子问题
 *      In math:        F(0) = 0
 *                      F(1) = 1
 *                      F(n) = F(n-1) + F(n-2); (n>2)

**************************************************/

#include <iostream>
using namespace std;

int f(int n);

int main(void) {
	int n;
    cout << "请输入所求第n个月的数值: ";
    cin >> n;
    
	cout << "第" << n << "个月的兔子对数: " <<  f(n) << endl;
	
	return 0;
}

/*
	第一个月:  一对兔子
	第二个月:  二对兔子
  	第 N 个月: 第 N-1 个月的兔子数 + 第 N-2 个月兔子对数
*/
int f(int n) {
	if (1 == n)
		return 1;
	else if (2 == n)
		return 2;
	else
		return f(n - 1) + f(n - 2);
}

/*
Result:

请输入所求第n个月的数值: 40
第40个月的兔子对数: 165580141

--------------------------------
Process exited after 5.223 seconds with return value 0
请按任意键继续. . .

*/

继续阅读