关于集合总结

1.并查集【模板】

  • 找到祖先是谁
  • int find(int x) {//查找x的族长
        if (x == fa[x]) return x;
        return fa[x] = find(fa[x]);//把向下寻找的结点定为新的族长
    }
  • 两个集合相并
  • void join(int x, int y) {//并到同一集合中区【模板函数】
        int f1 = find(x);
        int f2 = find(y);
        if (f1 != f2) {
            fa[f1] = f2;//插入f2集合中去。
        }
    }

2.哈希表建立

哈希表的公式由第四章介绍。

重点:

  • 关于模的概念(可先看深入浅出上的数字不同次数计算了解)
  • hash公式
  • 字符串哈希表注意转换hash码

例题:P3370 【模板】字符串哈希

题目描述

如题,给定 NN 个字符串(第 ii 个字符串长度为 M_iMi​,字符串内包含数字、大小写字母,大小写敏感),请求出 NN 个字符串中共有多少个不同的字符串。

友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:)

输入格式

第一行包含一个整数 NN,为字符串的个数。

接下来 NN 行每行包含一个字符串,为所提供的字符串。

输出格式

输出包含一行,包含一个整数,为不同的字符串个数。

输入输出样例

输入 #1复制

5
abc
aaaa
abc
abcc
12345

输出 #1复制

4

说明/提示

对于 30\%30% 的数据:N\leq 10N≤10,M_i≈6Mi​≈6,Mmax\leq 15Mmax≤15。

对于 70\%70% 的数据:N\leq 1000N≤1000,M_i≈100Mi​≈100,Mmax\leq 150Mmax≤150。

对于 100\%100% 的数据:N\leq 10000N≤10000,M_i≈1000Mi​≈1000,Mmax\leq 1500Mmax≤1500。

样例说明:

样例中第一个字符串(abc)和第三个字符串(abc)是一样的,所以所提供字符串的集合为{aaaa,abc,abcc,12345},故共计4个不同的字符串。

#include <iostream>
#include <vector>
#include <string>
#define mod 23333
#define k 261
using namespace std;
char s[1520];
vector<string>link[mod + 2];
int n, ans=0;
inline void insert() {
        int hash = 1;
        for (int i = 0; s[i]; i++)
            hash = (hash*1ll*k + s[i]) % mod;

        string t = s;
        for (int i = 0; i < link[hash].size(); i++) {
            if (link[hash][i] == t) {//是否能搜索到该字符串
                return;
            }
        }
        link[hash].push_back(t);//搜索不到,则加入该数组内
        ans++;//不同字符串次数+1
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> s,
        insert();
    }
    cout << ans << endl;
}

3.set

        set ,重点!!!

        其实关于set的增加,删除,查找一类与其他函数的使用方法差不多的,关键一点在于:
        

s.lower_bound(x)//返回不大于x的第一个元素地址
s.upper_bound()//返回大于x的第一个元素地址

后续内容会增加(据说set十分有用)

例题:P5250 【深基17.例5】木材仓库

题目描述

博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过 100000 条的操作:

  • 进货,格式1 Length:在仓库中放入一根长度为 Length(不超过 10^9109) 的木材。如果已经有相同长度的木材那么输出Already Exist
  • 出货,格式2 Length:从仓库中取出长度为 Length 的木材。如果没有刚好长度的木材,取出仓库中存在的和要求长度最接近的木材。如果有多根木材符合要求,取出比较短的一根。输出取出的木材长度。如果仓库是空的,输出Empty

输入格式

输出格式

输入输出样例

输入 #1复制

7
1 1
1 5
1 3
2 3
2 3
2 3
2 3

输出 #1复制

3
1
5
Empty
#include <iostream>
#include <set>
using namespace std;
int n,m,lenth;
set<int>s;
int main()
{
    cin >> n;
    while (n--) {
        cin >> m >> lenth;
        if (m == 1) {
            if (s.find(lenth) != s.end()) {
                cout << "Already Exist" << endl;
            }
            else {
                s.insert(lenth);
            }
        }
        else if (s.empty()) {
            cout << "Empty" << endl;
        }
        else {
            set<int>::iterator i = s.lower_bound(lenth), j = i;//这就是传说中的迭代器吧,嘿哈
            if (j != s.begin())j--;
            if (i != s.end() && lenth - (*j) > (*i) - lenth) {//如果比它小的距离>比它大的距离,则用j代替i
                j = i;
            }
            cout << *j << endl;
            s.erase(j);//erase删除的是地址
            
        }
    }
}

迭代器的那个点还是要多注意!!!

4.map(yyds!!!)

         曾经年少无知的我写的通讯管理系统几百行,没想到用map几十行就能实现,还是当年的我太天真了吧,哎!!!

        不说了,代码装B:

#include<iostream>

using namespace std;
#include<string>
#define MAX 1000//宏的定义
struct Person {
	string m_Name;
	int m_Sex;
	int m_Age;
	string m_Phone;
	string m_Addr;
};
struct Addressbooks
{
	struct Person personArray[MAX];//联系人数组,信息就储存在里面
	int m_size;//联系人个数
};



void showMenu()
{
	cout << "**************************" << endl;
	cout << "*******1.添加联系人*******" << endl;
	cout << "*******2.显示联系人*******" << endl;
	cout << "*******3.删除联系人*******" << endl;
	cout << "*******4.查找联系人*******" << endl;
	cout << "*******5.修改联系人*******" << endl;
	cout << "*******6.清空联系人*******" << endl;
	cout << "*******0.推出通讯录*******" << endl;
	cout << "**************************" << endl;
}
void addPerson(Addressbooks* abs) {      //第一个功能添加联系人
	if (abs->m_size == MAX) {
		cout << "通讯录已满,无法添加人了" << endl;
		return;
	}
	else
	{
		string name;
		cout << "请输入您的姓名:" << endl;
		cin >> name;
		abs->personArray[abs->m_size].m_Name = name;
		
		cout << "请输入您的性别" << endl;
		cout << "1----男" << endl;
		cout << "2----女 " << endl;
		int sex=0;
		
		while (true) {    //注意观察这个循环
			cin >> sex;
			if (sex == 1 || sex == 2) {
				abs->personArray[abs->m_size].m_Sex = sex;
				break;
			}
			cout << "您输入的性别有误,请您重新输入" << endl;
		}


		cout << "请输入您的年龄: " << endl;
		int age = 0;
		cin >> age;
		abs->personArray[abs->m_size].m_Age = age;
		cout << "请输入您的联系电话: " << endl;

		string phone;
		cin >> phone;
		abs->personArray[abs->m_size].m_Phone = phone;
		cout << "请输入您的家庭地址: " << endl;

		string address;
		cin >> address;
		abs->personArray[abs->m_size].m_Addr = address;
		abs->m_size++;//联系人个数增加一个。
	}
	system("pause");
	system("cls");

}
//显示所有的联系人
void showPerson(Addressbooks* abs) {
	if (abs->m_size == 0) {
		cout << "通讯录里面还没有人呢" << endl;
	}
	else {
		for (int i = 0; i < abs->m_size; i++) {  //在结构体数组当中一定要注意注意第一个开始是a[0]啊循环要从i=0开始
			cout << "姓名:" << abs->personArray[i].m_Name << "\t";
			cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
			cout << "年龄:" << abs->personArray[i].m_Age << "\t";
			cout << "联系电话:" << abs->personArray[i].m_Phone << "\t";
			cout << "家庭住址:" << abs->personArray[i].m_Addr << endl;
		}
	}
	system("pause");
	system("cls");
}

int isExist(Addressbooks* abs, string name) {
	for (int i = 0; i < abs->m_size; i++) {
		if (abs->personArray[i].m_Name == name) {
			return i;
		}
	}
	return -1;
}
//第三个模块开始了
	void deletePerson(Addressbooks * abs) {
		cout << "请输入您要删除的联系人" << endl;
		string name;
		cin >> name;
		int ret = isExist(abs,name);
		if (ret != -1) {
			for (int i = ret; i < abs->m_size; i++) {
				abs->personArray[i] = abs->personArray[i + 1];
			}
			abs->m_size--;
			cout << "该联系人已删除成功" << endl;
		}
		else {
			cout << "查无此人" << endl;
		}
		system("pause");
		system("cls");
	}

	//第四个模块
	void findPerson(Addressbooks* abs) {
		cout << "请输入您要查找的联系人:" << endl;
		string name;
		cin >> name;
		int ret = isExist(abs, name);
		if (ret != -1) {
			cout << "姓名:" << abs->personArray[ret].m_Name << "\t";
			cout << "性别:" << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";
			cout << "年龄:" << abs->personArray[ret].m_Age << "\t";
			cout << "联系电话:" << abs->personArray[ret].m_Phone << "\t";
			cout << "家庭住址:" << abs->personArray[ret].m_Addr << endl;

		}
		else {
			cout << "没有查到该人" << endl;
		}
		system("pause");
		system("cls");

	}
	//第五个模块开始了!!!
	void modifyPerson(Addressbooks* abs) {
		cout << "请输入您要修改的联系人的姓名:" << endl;
		string name;
		cin >> name;
		int ret = isExist(abs, name);
		if (ret != -1)
		{
			string name;
			cout << "请输入您要修改的姓名:" << endl;
			cin >> name;
			abs->personArray[ret].m_Name = name;

			cout << "请输入您要修改的性别:" << endl;
			cout << "1----男" << endl;
			cout << "2----女 " << endl;
			int sex = 0;

			while (true) {    //注意观察这个循环
				cin >> sex;
				if (sex == 1 || sex == 2) {
					abs->personArray[ret].m_Sex = sex;
					break;
				}
				cout << "您输入的性别有误,请您重新输入。" << endl;
			}


			cout << "请输入您要修改的年龄: " << endl;
			int age = 0;
			cin >> age;
			abs->personArray[ret].m_Age = age;
			cout << "请输入您要修改的联系电话: " << endl;
			string phone;
			cin >> phone;
			abs->personArray[ret].m_Phone = phone;

			cout << "请输入您要修改的家庭地址: " << endl;
			string address;
			cin >> address;
			abs->personArray[ret].m_Addr = address;

			cout << "联系人已经修改成功了。" << endl;
			

		}
		else {
			cout << "没有这个联系人呢" << endl;
		}
		system("pause");
		system("cls");
	}
	//第六个模块开始了,清空联系人。
	void cleanPerson(Addressbooks* abs) {
		cout << "您是否真的要清空通讯录里的全部联系人吗?" << endl;
		cout << "确定删除的话请输入1,取消删除请输入0。" << endl;
		
		while (true) {
			int ret;
			cin >> ret;
			if (ret == 1 || ret == 0) {
				if (ret == 1)
				{
					abs->m_size = 0;
					cout << "联系人现在已经全部清空了。" << endl;
					break;
				}
				else {
					cout << "联系人未删除,谢谢操作。" << endl;
					break;
				}

			}
			else {
				cout << "您的输入有误,请重新输入。" << endl;
			}
		}
		
		system("pause");
		system("cls");
	}


int main() {
	Addressbooks abs;//结构体变量
	abs.m_size = 0;

	
	
	while (true) {
		showMenu();
		int select;
		cin >> select;
		switch (select) {
		case 1:
			addPerson(&abs);
			break;
		case 2:
			showPerson(&abs);
			break;
		case 3:
			deletePerson(&abs);
			break; 
		case 4:
			findPerson(&abs);
			break;
		case 5:
			modifyPerson(&abs);
			break;
		case 6:
			cleanPerson(&abs);
			break; 
		case 0:
			cout << "欢迎下次使用钟一淼的通讯录系统呀!" << endl;
			system("pause");
			return 0;//可以直接跳出这个循环switch
			break;
		default:
			break;
			}

	}
	system("pause");
	return 0;
}

用map写的版本后期会更新,哎,世界上走过最难的路,c++的套路a

map例题:P5266 【深基17.例6】学籍管理

题目描述

您要设计一个学籍管理系统,最开始学籍数据是空的,然后该系统能够支持下面的操作(不超过 10^5105 条):

  • 插入与修改,格式1 NAME SCORE:在系统中插入姓名为 NAME(由字母和数字组成不超过 20 个字符的字符串,区分大小写) ,分数为 \texttt{SCORE}SCORE(0<\texttt{SCORE}<2^{31}0<SCORE<231) 的学生。如果已经有同名的学生则更新这名学生的成绩为 SCORE。如果成功插入或者修改则输出OK
  • 查询,格式2 NAME:在系统中查询姓名为 NAME 的学生的成绩。如果没能找到这名学生则输出Not found,否则输出该生成绩。
  • 删除,格式3 NAME:在系统中删除姓名为 NAME 的学生信息。如果没能找到这名学生则输出Not found,否则输出Deleted successfully
  • 汇总,格式4:输出系统中学生数量。

输入格式

输出格式

输入输出样例

输入 #1复制

5
1 lxl 10
2 lxl
3 lxl
2 lxl
4

输出 #1复制

OK
10
Deleted successfully
Not found

        这道题的解题重点就是要掌握map的映射,map<string ,int>s,即可用s[name]=score,即name为s的下标。

#include <iostream>
#include <map>
using namespace std;
map<string, int>s;
int n,m;
string name;
int score;
int main()
{
    cin >> n;
    while (n--) {
        cin >> m;
        if (m == 1) {
            cin >> name >> score;
            s[name] = score;
            cout << "OK" << endl;
        }
        else if (m == 2) {
            cin >> name;
            if (s.find(name) != s.end()) {
                cout << s[name] << endl;
            }
            else {
                cout << "Not found" << endl;
            }
        }
        else if (m == 3) {
            cin >> name;
            if (s.find(name) != s.end()) {
                s.erase(s.find(name));
                cout << "Deleted successfully" << endl;
            }
            else {
                cout << "Not found" << endl;
            }
        }
        else {
            cout << s.size() << endl;
        }
    }
  
}

        本蒟蒻对集合的总结已经写完了,重点还是把这几个代码和函数的原理弄清楚,才学疏浅,部分内容借鉴《深入浅出》书上的内容。

        集合结束,今晚或明天转战图的基本应用,加油,钟一淼! 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如何运用Pb9.0设计学生学籍管理系统 海盐县澉浦中学 贺剑夫 内容提要 学生学籍管理工作是学校管理工作的重要组成部分,现在相当一部分学校的学生学籍管理工作仍沿用手工方式。随着学校规模的扩大、学生人数的增加,效率低下、容易出错的手工方式越来越不适应实际管理工作的需要,利用计算机技术和数据库技术设计开发学生学籍管理系统、实现学生学籍管理工作的自动化成为学生管理部门的迫切需要。 学生学籍管理工作主要是学生基本情况的管理包括学生学籍变动的管理(转入、转出、休学、复学、退学、调班、外出借读、借读、留级或跳级)、学生成绩的管理和教师基本信息管理和教课的管理,主要包括数据输入、修改、删除、追加、查询、统计和打印报表等功能,学生学籍管理系统要能高效、准确地完成这些功能,并要达到界面美观友好、使用方便。PowerBuilder9.0和其他数据库管理系统相比,可以发现它基于C/S的体系结构,除拥有其他开发平台的界面制作的优秀控件之外,以应用系统工程的工作间(WorkSpace)为框架,以数据窗口控件和数据对象作为数据库应用系统开发的核心,通过这两个控件的使用,并结合其他控件的辅助功能,能制作出功能强大的管理系统,因此选用PowerBuilder9.0来制作学生学籍管理系统,实现对学生学籍(包括学籍变动情况)、教师信息及教课和学生成绩的全面管理。 第一个步骤是创建一个工作间和项目目标文件,使以后设计的所有功能都在此目标文件下有组织地灵活运行。第二个步骤是建立系统运行需要的表并把表添加到数据库中。第三个步骤是进行主菜单的设计,使不同的窗口共享这个主菜单,通过设计脚本来触发当前活动窗口中定义的事件来完成数据的增删改、查询、打印。第四个步骤是建立各种窗口,通过数据窗口对象,和建立的各种控件,来实现相应的功能。关系数据库SQL语言对关系模型的发展和数据库管理系统的研制起了重要作用。SQL语言虽为结构式查询语言,但实际上具有定义、查询、更新和控制等多种功能。在学生学籍管理系统的开发过程中,主要使用了嵌入式SQL语句和动态SQL语句在程序中灵活地操纵数据库。 关键字:SQL语言 对象 窗口 数据窗口 控件 一、概述 1.1 项目的背景及意义 学生学籍管理工作是学校管理工作的重要组成部分,现在相当一部分学校的学生学籍管理工作仍沿用手工方式。随着学校规模的扩大、学生人数的增加,效率低下、容易出错的手工方式越来越不适应实际管理工作的需要,利用计算机技术和数据库技术设计开发学生学籍管理系统、实现学生学籍管理工作的自动化成为学生管理部门的迫切需要。 我校是一所农村初级中学,由于师资力量的薄弱和经费的紧缺,对于学生的学籍管理工作更是落后,可以说目前的学校对于学生的学籍管理都是进行手工的操作,这样的操作对于学生的管理非常不便,因此,考虑到这种情况,迫切需要开发一个学籍管理系统来进行这一项工作。 学生的学籍管理工作包括学籍管理工作、学籍的变动管理工作和成绩管理工作,主要包括数据的输入、删除、修改、查询、统计、打印等功能,学生的学籍管理系统要能高效、准确地完成这些功能,并要达到界面友好、使用方便。 1.2 相关技术与开发工具介绍 PowerBuilder是一个基于客户机/服务器方式的、完全可视化的开发环境。在PowerBuilder环境中,可以用一种可视和直观的方式来创建应用程序的用户界面和数据库接口。 PowerBuilder是面向对象的工具,它变革了面向对象技术的使用,并把它应用到用户界面对象中。用户界面的元素都是对象,它们有属性、事件和方法,通过使用这些对象就会大大地缩短应用程序的开发时间。同时,PowerBuilder9.0也是功能强大的编程语言。通过使用PowerScript编写的代码来实现事件驱动程序。 PowerBuilder是一个开放系统,其优秀的开放系统功能是可以访问任何一个常用的后台数据系统,如Sybase、Informix或者DB2。另外,PowerBuilde可以通过一个叫做客户机、服务器开放开发环境的规范与其他PC产品进行集成。 PowerBuilder是一个多平台开发环境,有运行在windows95/98/2000/xp/me下的,也有运行在Macintosh下的Unix版本的系统。因此,PowerBuilder可以为真正的企业开发提供完全的支持。 PowerBuilder提供了对分布式应用程序的开发支持。而对分布处理最广泛和最成功的应用当数Internet技术。PowerBuilder提供了两种Internet应用的访问方式:基于WEB.PB的Browser/Server方式和基于Plugins的Client/Server方式。 在Internet应用程序中,客户浏览器与服务器之间的通信方式是这样的:浏览器向WEB服务器请求调用HTML文档,Web服务器将HTML文件传递给客户浏览器。HTML文档中的元素可以指向其他资源(包括位图、声波文件、插入件、ActiveX控件及应用程序等)。用户用鼠标点击这些元素,相当于向Web服务器提出一个请求。这些请求可以是下载文件,也可以请求Web服务器执行一个应用程序。浏览器-Web服务器的结构如图1-1所示 图1-1 浏览器-Web服务器结构 Web应用的执行过程如图1-2所示 图1-2 Web应用的执行过程 PowerBuilder提供了两种plug-in方式,即Windows Plug-in和Data Window Plug-in。Windows Plug-in相当于在浏览器浏览的HTML中嵌入运行PowerBuilder的应用程序。Data Window Plug-in相当于在浏览器的HTML中嵌入运行PowerBuilder的PSR文件。它们的调用过程如下: (1) 浏览器访问Web服务器,向Web服务器提出请求。 (2) 服务器卸载PSR文件或PBD文件,浏览器显示PowerBuilder窗口对象或PSR文件。 (3) 用户对浏览器上的窗口进行操作,Web服务器把操作的结果返回给PowerBuilder窗口。 1.3 系统可行性分析 建设MIS的必要性取决于需求的迫切性和实现的可行性。可行性并不等于可能性,它还包括很必要性,如果领导或管理人员对信息的需求并不迫切,或各方面的条件不具备,就是不具备可行性。系统可行性包括经济上可行性、技术上可行性、管理上可行性和资源上可行性四个方面。 1.3.1 经济上的可行性 主要对项目的经济效益进行评价。该系统除了购置硬件设备外,操作简便,无须投入较大的培训费用、开发费用、维护费用等,并且在实施过程中减少手工操作的步骤、加快了对学生的学籍管理、学籍变动管理和学生成绩管理的速度。 1.3.2 技术上的可行性 本系统的开发采用的是PowerBuilder9.0,它是一个大型数据库应用系统的开发平台,基于客户/服务器的体系结构,可以广泛开发适合于远程数据库和本地数据库的应用系统。它除拥有其他开发平台的界面制作的优秀控件之外,以应用系统的工作窨(WorkSpace)为框架,以数据窗口控件和数据窗口对象作为数据库应用系统开发的核心,通过这两个控件和使用,并结合其他控件的辅助功能,用户可以制作出许多有用的大中型数据库应用系统。PowerBuilder9.0使开发人员能够开发肥客户端应用来满足日益复杂的商业需求,而且它支持J2EE and Mircrosoft.NET环境。它也奠定了“第四代+”(4Glplus)编程语言的基础,它通过设计、建模、开发、配置和管理的紧密集成大大提高了开发人员的生产力, 1.3.3 管理上的可行性   本系统采用powerbuilder8.0 自带的ASA(Adaptive Server Anywhere)数据库,该数据库简单,通过标准ODBC接口,自动连接数据库,这也是PB具有强大功能和对数据库易操作的一方面。该数据库管理系统能够使用SQL 语句,也可以使用各种连接操作,能单独的使用,也可以与各种编程工具连接起来使用,在管理上非常方便。 1.3.4 资源上的可行性   本系统资源利用方便,数据可通过.txt文件导入数据库而进行使用,也可将数据库文件导出为.txt文件,便于数据的文件格式的转换和资源的共享。 二、总体设计 2.1 系统总体功能结构   图2-1 系统总体功能结构图 在登录窗口中是对使用系统人的身份的识别,如果是系统管理员,则拥有修改、插入、追加、删除、保存数据的权利,并可对能使用本系统人员进行管理。如果是数据管理员,则没有对使用本系统人员的管理项,而普通用户则只能进行查询、打印、页面设置、打印预览等简单功能。在各个学籍管理和学籍变动管理窗口中都有对数据的备份功能。 2.2 系统总体物理结构 本系统的运行模式可以在单机模式、主机模式、客户/服务器(C/S)模式、浏览器/服务器(B/S)模式中进行选择。在计算机网络比较比较普及的今天,比较好的选择应该是C/S或B/S模式。 数据库管理系统(DBMS)选择PowerBuilder自带的Adaptive Server Anywhere 8.0。 三、E—R图设计 1) 学生实体E-R图                  图3-1 学生实体E-R图 2)课程实体E-R图                图3-2 课程实体E-R图 3) 教师实体E-R图 图3-3 教师实体E-R图 4) 选课实体E-R图 图3-4 选课实体E-R图 5) 教课实体E-R图 图3-5 教课实体E-R图 6)学生转出实体E-R图     图3-6 学生转出实体E-R图 7) 学生休学E-R图 图3-7 学生休学实体E-R图 8) 学生复学实体E-R图 图3-8 学生复学实体E-R图 9) 学生退学实体E-R图 图3-9 学生退学实体E-R图 10)学生外出借读实体E-R图 图3-10 学生外出借读实体E-R图 11)学生调班实体E-R图 图3-11 学生调班实体E-R图 12)学生留级(跳级)实体E-R图 图3-12 学生留级(跳级)实体E-R图 13)各实体之间的E-R图     图3-13 各实体之间的E-R图 四、总结与展望 本制作流程,可实现学生、教师、课程间的基本管理和用户的管理,能进行学籍的变动情况处理(如学生转入、学生转出、学生休学、学生复学、学生退学、学生调班、学生留级(跳级)、学生借读及学生外出借读),对报表能进行打印及打印预览,对相关数据能进行备份,在设计中使用了菜单、窗口、数据窗口、数据窗口控件及多种窗口控件,给工作上带来了很大的方便,可以实现学生学籍管理及变动情况管理的应用。 通过对PowerBuilder9.0的窗口对象、菜单对象、数据窗口对象、数据窗口控件、窗口控件及其基本属性的运用,可进行一般的事务处理和软件的设计。 通过Pb9.0可以很方便地将所有的数据库转移到服务器上,实行客户/服务器的管理模式,增加对系统出错处理模块的管理,以及实现Web方面的功能开发。 计算机教育发展到今天,尤其是新课程的改革要求我们计算机教师,特别是农村中学的计算机教师要能编写适合于本地特色的一些管理系统来为学校服务,为教学服务。PB9.0无疑是一种较明智的选择。 参考文献 1、 伍俊良 《PowerBuilder课程设计系统开发案例》 清华大学出版社 2003年 2、 袁方 杨成 《数据库应用系统设计实践教程》 电子科技大学出版社 2001年 3、 黄伟 《PowerBbuilder6.5-7.0实例解析》 北京大学出版社 2000年 4、 张钢 《信息系统开发实践教程》 电子科技大学出版社 2001年 5、 甘仞初 《信息系统开发》 经济科学出版社 1996年 6、 黄梯云 《管理信息系统》 经济科学出版社 1999年 7、康博创作室 《PowerBuilder6.0使用及开发指南》 人民邮电出版社 1999年

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟一淼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值