#define Infinity 1000
#define MaxVertexNum 35
#define MAX 40
#include<stdioh>
#include<stdlibh>
#include<conioh>
#include<stringh>
#include<iostreamh>
typedef struct arcell //边的权值信息
{
int adj; //权值
}arcell,adjmatrix[MaxVertexNum][MaxVertexNum]; //图的邻接矩阵类型
typedef struct vexsinfo //顶点信息
{
int position; //景点的编号
char name[32]; //景点的名称
char introduction[256]; //景点的介绍
}vexsinfo;
typedef struct mgraph //图结构信息
{
vexsinfo vexs[MaxVertexNum]; //顶点向量(数组)
adjmatrix arcs; //邻接矩阵
int vexnum,arcnum; //分别指定顶点数和边数
}mgraph;
//全局变量
int visited[35]; //用于标志是否已经访问过
int d[35]; //用于存放权值或存储路径顶点编号
mgraph campus; //图变量(大学校园)
// (1) 对图初始化
mgraph initgraph()
{
int i=0,j=0;
mgraph c;
cvexnum =28; //顶点个数
carcnum =39; //边的个数
for(i=0;i<cvexnum ;i++) //依次设置顶点编号
cvexs[i]position =i;
//依次输入顶点信息
strcpy(cvexs[0]name ,"小西南门");
strcpy(cvexs[0]introduction ,"离公交站近");
strcpy(cvexs[1]name ,"学校南正门");
strcpy(cvexs[1]introduction ,"学校大门、学校班车进出口");
strcpy(cvexs[2]name ,"语言文化职业学院");
strcpy(cvexs[2]introduction ,"语言文化职业学院办公楼,楼高6层");
strcpy(cvexs[3]name ,"艺术学院");
strcpy(cvexs[3]introduction ,"音乐系、美术系,楼高4层");
strcpy(cvexs[4]name ,"行政楼");
strcpy(cvexs[4]introduction ,"行政办公大楼,楼高5层");
strcpy(cvexs[5]name,"文学院");
strcpy(cvexs[5]introduction ,"文学院,楼高6层");
strcpy(cvexs[6]name ,"体育场");
strcpy(cvexs[6]introduction ,"室外标准田径场");
strcpy(cvexs[7]name,"教育科学学院");
strcpy(cvexs[7]introduction ,"教心系、经管系,楼高5层");
strcpy(cvexs[8]name ,"南区学生宿舍");
strcpy(cvexs[8]introduction ,"离西南门近");
strcpy(cvexs[9]name, "数学与经济管理学院");
strcpy(cvexs[9]introduction , "数学与经济管理学院大楼,楼高4层");
strcpy(cvexs[10]name ,"中区学生宿舍");
strcpy(cvexs[10]introduction ,"若干栋,离学生1、2食堂近");
strcpy(cvexs[11]name ,"职业学院教学大楼");
strcpy(cvexs[11]introduction ,"职业学院教学大楼,楼高5层");
strcpy(cvexs[12]name ,"体育系");
strcpy(cvexs[12]introduction ,"体育系,楼高5层");
strcpy(cvexs[13]name ,"游泳馆");
strcpy(cvexs[13]introduction ,"室内小型游泳馆");
strcpy(cvexs[14]name ,"报告厅、阶梯教室");
strcpy(cvexs[14]introduction ,"可举办中、大型学术会议。有大小报告厅1-6个、阶梯教室1-6个");
strcpy(cvexs[15]name ,"大礼堂、体育馆");
strcpy(cvexs[15]introduction ,"文艺演出所在地、室内运动场");
strcpy(cvexs[16]name ,"1食堂");
strcpy(cvexs[16]introduction ,"教工食堂及学生1食堂在此");
strcpy(cvexs[17]name ,"新图书馆");
strcpy(cvexs[17]introduction ,"建筑面积46000平方米");
strcpy(cvexs[18]name ,"2食堂");
strcpy(cvexs[18]introduction ,"学校东区,学生食堂");
strcpy(cvexs[19]name ,"东区学生宿舍");
strcpy(cvexs[19]introduction ,"离学生2食堂近");
strcpy(cvexs[20]name ,"计算机学院");
strcpy(cvexs[20]introduction ,"计算机学院大楼,楼高5层");
strcpy(cvexs[21]name ,"教工宿舍");
strcpy(cvexs[21]introduction ,"学校青年教职工租住地");
strcpy(cvexs[22]name ,"西区学生宿舍");
strcpy(cvexs[22]introduction ,"离学生3、4食堂近");
strcpy(cvexs[23]name ,"3食堂");
strcpy(cvexs[23]introduction ,"学校西区,学生食堂");
strcpy(cvexs[24]name ,"外国语学院");
strcpy(cvexs[24]introduction ,"外国语学院大楼,楼高5层");
strcpy(cvexs[25]name ,"4食堂");
strcpy(cvexs[25]introduction ,"学校西区,学生食堂,人气较高");
strcpy(cvexs[26]name ,"校医院");
strcpy(cvexs[26]introduction ,"看小病的地方");
strcpy(cvexs[27]name ,"实验楼");
strcpy(cvexs[27]introduction ,"物电学院、化学与生命科学学院、机电系、建材系所在地,机房及多媒体教室若干");
//依次输入边上的权值信息
for(i=0;i<cvexnum ;i++)
for(j=0;j<cvexnum ;j++)
carcs [i][j]adj =Infinity; //先初始化图的邻接矩阵
//部分弧长
carcs[0][2]adj=50; carcs[0][3]adj=60;
carcs[1][4]adj=90;
carcs[2][3]adj=60; carcs[2][8]adj=40;
carcs[3][4]adj=60; carcs[3][6]adj=40;
carcs[4][5]adj=70; carcs[4][9]adj=70; carcs[4][10]adj=80; carcs[4][17]adj=200;
carcs[5][7]adj=70;
carcs[6][9]adj=40;
carcs[7][18]adj=190;
carcs[8][11]adj=50;
carcs[9][12]adj=40;
carcs[10][18]adj=70;
carcs[11][12]adj=60; carcs[11][14]adj=50; carcs[11][15]adj=50;
carcs[12][16]adj=50;
carcs[13][14]adj=40; carcs[13][22]adj=60;
carcs[14][15]adj=50; carcs[14][20]adj=90;
carcs[15][16]adj=60; carcs[15][21]adj=40;
carcs[16][17]adj=60;
carcs[17][18]adj=80;
carcs[18][19]adj=60;
carcs[20][21]adj=60; carcs[20][24]adj=80;
carcs[22][23]adj=60; carcs[22][25]adj=80;
carcs[23][24]adj=60;
carcs[24][26]adj=100; carcs[24][27]adj=100;
carcs[25][26]adj=90;
carcs[26][27]adj=90;
for(i=0;i<cvexnum ;i++) //邻接矩阵是对称矩阵,对称赋值
for(j=0;j<cvexnum ;j++)
carcs[j][i]adj =carcs[i][j]adj ;
return c;
}//initgraph
// (2) 查找景点在图中的序号
int locatevex(mgraph c,int v)
{
int i;
for(i=0;i<cvexnum ;i++)
if(v==cvexs[i]position)
return i; //找到,返回顶点序号i
return -1; //否则,返回-1
}
//(3) 、(4) 求两景点间的所有路径
// (3) 打印序号为m,n景点间的长度不超过8个景点的路径
void path(mgraph c, int m,int n,int k)
{
int s,x=0;
int t=k+1; //t 记载路径上下一个中间顶点在d[]数组中的下标
if(d[k]==n && k<8) //d[k]存储路径顶点。若d[k]是终点n且景点个数<=8,则输出该路径
{ //递归出口,找到一条路径
for(s=0;s<k;s++)
printf("%s--->",cvexs[d[s]]name); //输出该路径。s=0 时为起点m
printf("%s",cvexs[d[s]]name); //输出最后一个景点名(即顶点n的名字,此时s==k)
printf("\n\n");
}
else
{
s=0;
while(s<cvexnum) //从第m个顶点,试探至所有顶点是否有路径
{
if((carcs[d[k]][s]adj<Infinity) && (visited[s]==0)) //初态:顶点m到顶点s有边,且未被访问
{
visited[s]=1;
d[k+1]=s; //存储顶点编号s 至d[k+1]中
path(c,m,n,t); //求从下标为t=k+1的第d[t]个顶点开始的路径(递归调用),同时打印出一条m至n的路径
visited[s]=0; //将找到的路径上顶点的访问标志重新设置为0,以用于试探新的路径
}
s++; //试探从下一个顶点 s 开始是否有到终点的路径
}//endwhile
}//endelse
}//endpath
//(4) 打印两景点间的景点个数不超过8的所有路径。调用(3)
int allpath(mgraph c)
{
int k,i,j,m,n;
printf("\n\n请输入你要查询的两个景点编号:\n\n");
scanf("%d%d",&i,&j);
printf("\n\n");
m=locatevex(c,i); //调用(2),确定该顶点是否存在。若存在,返回该顶点编号
n=locatevex(c,j);
d[0]=m; //存储路径起点m (int d[]数组是全局变量)
for(k=0;k<cvexnum;k++) //全部顶点访问标志初值设为0
visited[k]=0;
visited[m]=1; //第m个顶点访问标志设置为1
path(c,m,n,0); //调用(3)。k=0,对应起点d[0]==m。k为d[]数组下标
return 1;
}
// (5) 用迪杰斯特拉算法,求出一个景点到其他景点间的最短路径,并打印
void shortestpath_dij(mgraph c)
{
//迪杰斯特拉算法,求从顶点v0到其余顶点的最短路经及其带权长度d[v]
//若p[v][w]为1,则w是从v0到v的最短路经上的顶点
//final[v]类型用于设置访问标志
int v,w,i,min,t=0,x,flag=1,v0; //vo为起始景点的编号
int final[35],d[35],p[35][35];
printf("\n请输入一个起始景点的编号:");
scanf("%d",&v0);
printf("\n\n");
while(v0<0||v0>cvexnum)
{
printf("\n你所输入的景点编号不存在\n");
printf("请重新输入:");
scanf("%d",&v0);
}//while
for(v=0;v<cvexnum ;v++)
{
final[v]=0; //初始化各顶点访问标志
d[v]=carcs[v0][v]adj; //v0 到各顶点 v 的权值赋值给d[v]
for(w=0;w<cvexnum ;w++) //初始化p[][]数组,各顶点间的路径全部设置为空路径0
p[v][w]=0;
if(d[v]<Infinity) //v0 到v 有边相连,修改p[v][v0]的值为1
{
p[v][v0]=1;
p[v][v]=1; //各顶点自己到自己要连通
}
}//for
d[v0]=0; //自己到自己的权值设为0
final[v0]=1; //v0的访问标志设为1,v 属于 s 集
for(i=1;i<cvexnum ;i++) //对其余cvexnum-1个顶点w,依次求 v 到 w 的最短路径
{
min=Infinity;
for(w=0;w<cvexnum ;w++) //在未被访问的顶点中,查找与 v0 最近的顶点v
if(!final[w])
if(d[w]<min) //v0 到 w (有边)的权值<min
{
v=w;
min=d[w];
}//if
final[v]=1; //v 的访问标志设置为1,v 属于s集
for(w=0;w<cvexnum ;w++) //修改v0 到其余各顶点w 的最短路径权值d[w]
if(!final[w]&&(min+carcs[v][w]adj <d[w])) //若w 不属于s,且v 到w 有边相连
{
d[w]=min+carcs[v][w]adj; //修改v0 到w 的权值d[w]
for(x=0;x<cvexnum ;x++) //所有v0 到v 的最短路径上的顶点x,都是v0 到w 的最短路径上的顶点
p[w][x]=p[v][x];
p[w][w]=1;
}//if
}//for
for(v=0;v<cvexnum ;v++) //输出v0 到其它顶点v 的最短路径
{
if(v!=v0)
printf("%s",cvexs[v0]name); //输出景点v0 的景点名
for(w=0;w<cvexnum ;w++) //对图中每个顶点w,试探w 是否是v0 到v 的最短路径上的顶点
{
if(p[v][w] && w!=v0 && w!=v) //若w 是且w 不等于v0,则输出该景点
printf("--->%s",cvexs[w]name);
}
printf("---->%s",cvexs[v]name);
printf("\n总路线长为%d米\n\n",d[v]);
}//for
}//shortestpath
//(6)-(11)修改图的信息。包括建图、更新信息、删除、增加结点和边
//(6) 构造图的邻接矩阵
int creatgragh(mgraph &c) //建图。以图的邻接矩阵存储图
{
int i,j,m,n;
int v0,v1;
int distance;
printf("请输入图的顶点数和边数: \n");
scanf("%d %d",&cvexnum ,&carcnum );
printf("下面请输入景点的信息:\n");
for(i=0;i<cvexnum ;i++) //构造顶点向量(数组)
{
printf("请输入景点的编号:");
scanf("%d",cvexs[i]position );
printf("\n请输入景点的名称:");
scanf("%s",cvexs[i]name );
printf("\n请输入景点的简介:");
scanf("%s",cvexs[i]introduction );
}
for(i=0;i<carcnum ;i++) //初始化邻接矩阵
for(j=0;j<carcnum ;j++)
carcs[i][j]adj =Infinity;
printf("下面请输入图的边的信息:\n");
for(i=1;i<=carcnum ;i++) //构造邻接矩阵
{
printf("\n第%d条边的起点 终点 长度为:",i);//输入一条边的起点、终点及权值
scanf("%d %d %d",&v0,&v1,&distance);
m=locatevex(c,v0);
n=locatevex(c,v1);
if(m>=0 && n>=0)
{
carcs[m][n]adj =distance;
carcs[n][m]adj =carcs[m][n]adj ;
}
}
return 1;
}//creatgragh
// (7) 更新图的部分信息。返回值: 1
int newgraph(mgraph &c)
{
int changenum; //计数。用于记录要修改的对象的个数
int i,m,n,t,distance,v0,v1;
printf("\n下面请输入你要修改的景点的个数:\n");
scanf("%d",&changenum);
while(changenum<0||changenum>cvexnum )
{
printf("\n输入错误!请重新输入");
scanf("%d",&changenum);
}
for(i=0;i<changenum;i++)
{
printf("\n请输入景点的编号:");
scanf("%d",&m);
t=locatevex(c,m);
printf("\n请输入景点的名称:");
scanf("%s",cvexs[t]name );
printf("\n请输入景点的简介:");
scanf("%s",cvexs[t]introduction );
}
printf("\n下面请输入你要更新的边数");
scanf("%d",&changenum);
while(changenum<0||changenum>carcnum )
{
printf("\n输入错误!请重新输入");
scanf("%d",&changenum);
}
printf("\n下面请输入更新边的信息:\n");
for(i=1;i<=changenum ;i++)
{
printf("\n修改的第%d条边的起点 终点 长度为:",i);
scanf("%d %d %d",&v0,&v1,&distance);
m=locatevex(c,v0);
n=locatevex(c,v1);
if(m>=0&&n>=0)
{
carcs[m][n]adj =distance;
carcs[n][m]adj =carcs[m][n]adj ;
}
}
return 1;
}//newgraph
3个class,运行UIjava。
public class CircuitException extends Exception {public CircuitException(){}}
import javautilLinkedList;
public class GPS {
public static final int MAX = 65535;
public GPS(int maxSize){
graph = new Graph(maxSize);
}
public GPS(){
graph = new Graph();
}
public Graph graph;
public static void main(String args[]){
GPS gps = new GPS();
try {
gpsgraphaddEdge("a", "b", 1);
gpsgraphaddEdge("a", "c", 1);
gpsgraphaddEdge("b","d" , 1);
gpsgraphaddEdge("c","d" , 1);
gpsgraphaddEdge("d","e" , 1);
gpsgraphaddEdge("d","f" , 1);
gpsgraphaddEdge("e","t" , 2);
gpsgraphaddEdge("f","t" , 1);
LinkedList list = gpsgraphgetPath("a", "d");
for(int i = 0 ; i < listsize() ; i++){
Systemoutprint(listget(i));
}Systemoutprintln();
} catch (CircuitException e) {
Systemoutprintln("出现了自环!");
}
gpsgraphshowGraph();
Systemoutprintln(gpsgraphgap);
}
public class Graph{
public int Zuidazhi = 50;
public int changdu = 0;
public Jiao[] vertex;
public double gap;
public Graph(){
vertex = new Jiao[Zuidazhi];
}
public Graph(int maxSize){
thisZuidazhi = maxSize;
vertex = new Jiao[maxSize];
}
public void addVertex(String name){
vertex[changdu++] = new Jiao(name);
}
public void addEdge(String v1, String v2,double edge) throws CircuitException{
//先找到v1;
if(v1equals(v2))
throw new CircuitException();
Jiao from = null;
Jiao to = null;
for(int i = 0 ; i < changdu ; i++){
if(vertex[i]nameequals(v1)){
from = vertex[i];
}else if(vertex[i]nameequals(v2)){
to = vertex[i];
}
}
if(from == null){
thisaddVertex(v1);
from = thisvertex[changdu-1];
}
if(to == null){
thisaddVertex(v2);
to = thisvertex[changdu-1];
}//已经找到v1和v2;
//没有检测是否v1 v2边已经存在!
//加入边。
Jiao v1adj = new Jiao(v2);
v1adjedge = edge;
Jiao v2adj = new Jiao(v1);
v2adjedge = edge;
//添加联系
//检查联系是否已经存在
Jiao temp = from;
while(tempnext!=null){
Jiao temppar = temp;
temp = tempnext;
if(tempnameequals(v1adjname)){
tempparnext = tempnext;
}
}
v1adjnext = fromnext;
fromnext = v1adj;
//v2adjnext = tonext;
//tonext = v2adj;
}
//假设要找的必然存在,不用想是否不在
public LinkedList getPath(String v1 ,String v2){
int count = 0;
//Systemoutprintln(count++);
boolean found[] = new boolean[changdu];
double distance[] = new double[changdu];
int to = 0;
Jiao from = null;
for(int i = 0 ; i < changdu ; i++){
found[i] = false;
distance[i] = MAX;
}
for(int i = 0 ; i < changdu ; i++){
if(vertex[i]nameequals(v1)){//找到始发地
from = vertex[i];
distance[i] = 0;
found[i] = true;
//Systemoutprintln(count++);
}
if(vertex[i]nameequals(v2)){//找到目的地
to = i;
//Systemoutprintln(count++);
}
}
//必须先准备好路径!
Jiao forCount = from;
int degree = 0;
while(forCount!=null){
degree++;
forCount=forCountnext;
}
LinkedList[] list = new LinkedList[degree];
int [] mark = new int[degree];
for(int i = 0 ; i < degree ; i++){
list[i]=new LinkedList();
mark[i]=MAX;
}
int test=0;
int count2 = 0;
int count3 = 0;
//Systemoutprintln(count+++"xx");
while(!found[to]&&test++<100){
//Systemoutprintln(count+++"FIRST");
//开始时from到所有都是最大值。
//找到标记了的节点
//找标记了的节点邻接的未标记的节点。
//得到最短的边,并标记。
//更新现有路径
double min = MAX;
int address = -1;
int father = -1;
for(int i = 0 ; i < changdu ; i++){//对于已经找到的顶点寻找最小的往后的距离。
if(found[i]){//找到了的。
Jiao temp = vertex[i];
while(temp!=null){//vertex的邻接顶点~~
//先看temp的号码~
int tempNumber = -1;
for(int j = 0 ; j < changdu ; j++){
if(vertex[j]nameequals(tempname)){
tempNumber = j;
break;
}
}
if(!found[tempNumber]){//如果是还没有找到的~
double dist = distance[i]+tempedge;
if(dist < min){
min = dist;
father = i;
//Systemoutprintln(" "+min);
address = tempNumber;
}
}
temp = tempnext;
}
}
}found[address] = true;
distance[address] = min;
//添加到已有路径中去!
//知道father
for(int i = 0 ; i < degree ; i++){
if(list[i]isEmpty()||list[i]getLast()equals(vertex[father]name)){
list[i]addLast(vertex[address]name);
break;
}
}
}
for(int i = 0 ; i < degree ; i++){
if(list[i]isEmpty())
continue;
else{
if(list[i]getLast()equals(v2)){
gap=0;
//先求出gap
Jiao pre = from;
Jiao nex = null;
for(int j = 0 ; j < list[i]size() ; j++){
for(int k = 0 ; k < changdu ; k++){
if(vertex[k]nameequals(list[i]get(j))){
nex = vertex[k];break;
}
}
while(prenext!=null){//找到下一个的长度
pre = prenext;
//Systemoutprintln(nexname +"nexname");
if(prenameequals(nexname)){
gap+=preedge;
//Systemoutprintln(" gap2 "+gap);
}
}
pre = nex;
}
//Systemoutprintln(gap+"gap");
return list[i];
}
}
}
return null;
}
public void showGraph(){
Jiao temp;
for(int i = 0 ; i < changdu ; i++){
temp = vertex[i];
while(temp!=null){
Systemoutprint(tempname+tempedge+" ");
temp = tempnext;
}Systemoutprintln();
}Systemoutprintln("Show Over!");
}
}
public class Jiao{
public String name;
public Jiao next = null;
public double edge;
public Jiao(String name){
thisname = name;
}
}
}
import javaawtEventQueue;
import javaawteventActionEvent;
import javaawteventActionListener;
import javautilLinkedList;
import javaxswingJButton;
import javaxswingDefaultListModel;
import javaxswingJFrame;
import javaxswingJLabel;
import javaxswingJList;
import javaxswingJOptionPane;
import javaxswingJScrollPane;
import javaxswingJSeparator;
import javaxswingJTextField;
import javaxswingSwingConstants;
public class UI extends JFrame implements ActionListener{
private JTextField textField_5;
private JTextField textField_4;
private JList list_1;
private JList list;
private JTextField textField_1;
private JTextField textField_3;
private JTextField textField_2;
private JTextField textField;
private DefaultListModel model = new DefaultListModel();
private DefaultListModel model_1 = new DefaultListModel();
/
Launch the application
@param args
/
public static void main(String args[]) {
EventQueueinvokeLater(new Runnable() {
public void run() {
try {
UI frame = new UI();
framesetVisible(true);
} catch (Exception e) {
eprintStackTrace();
}
}
});
}
/
Create the frame
/
public UI() {
super();
setTitle("GPS寻路");
getContentPane()setLayout(null);
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
final JScrollPane scrollPane = new JScrollPane();
scrollPanesetBounds(11, 36, 221, 193);
getContentPane()add(scrollPane);
list = new JList(model);
scrollPanesetViewportView(list);
final JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1setBounds(253, 36, 218, 193);
getContentPane()add(scrollPane_1);
list_1 = new JList(model_1);
scrollPane_1setViewportView(list_1);
final JLabel label = new JLabel();
labelsetText("从");
labelsetBounds(10, 249, 24, 18);
getContentPane()add(label);
final JLabel label_1 = new JLabel();
label_1setText("到");
label_1setBounds(11, 273, 24, 18);
getContentPane()add(label_1);
textField = new JTextField();
textFieldsetBounds(50, 247, 103, 22);
getContentPane()add(textField);
textField_2 = new JTextField();
textField_2setBounds(50, 271, 103, 22);
getContentPane()add(textField_2);
final JLabel label_2 = new JLabel();
label_2setText("距离");
label_2setBounds(11, 297, 37, 18);
getContentPane()add(label_2);
textField_3 = new JTextField();
textField_3setBounds(50, 295, 103, 22);
getContentPane()add(textField_3);
final JButton button = new JButton();
buttonsetText("添加");
buttonsetBounds(155, 250, 73, 28);
getContentPane()add(button);
final JButton button_1 = new JButton();
button_1setText("删除");
button_1setBounds(155, 285, 73, 28);
getContentPane()add(button_1);
final JLabel label_3 = new JLabel();
label_3setText("距离:");
label_3setBounds(253, 297, 39, 18);
getContentPane()add(label_3);
textField_1 = new JTextField();
textField_1setBounds(293, 295, 86, 22);
getContentPane()add(textField_1);
final JButton button_2 = new JButton();
button_2setText("显示路径");
button_2setBounds(385, 249, 86, 68);
getContentPane()add(button_2);
final JLabel label_4 = new JLabel();
label_4setText("路径表示");
label_4setBounds(11, 10, 66, 18);
getContentPane()add(label_4);
final JLabel label_5 = new JLabel();
label_5setText("最佳路径");
label_5setBounds(253, 12, 66, 18);
getContentPane()add(label_5);
//
buttonaddActionListener(this);
button_1addActionListener(this);
button_2addActionListener(this);
final JLabel label_6 = new JLabel();
label_6setText("从");
label_6setBounds(253, 249, 24, 18);
getContentPane()add(label_6);
textField_4 = new JTextField();
textField_4setBounds(293, 247, 86, 22);
getContentPane()add(textField_4);
final JLabel label_7 = new JLabel();
label_7setText("到");
label_7setBounds(253, 273, 24, 18);
getContentPane()add(label_7);
textField_5 = new JTextField();
textField_5setBounds(293, 271, 86, 22);
getContentPane()add(textField_5);
final JSeparator separator = new JSeparator();
separatorsetOrientation(SwingConstantsVERTICAL);
separatorsetBounds(239, 10, 8, 317);
getContentPane()add(separator);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(egetActionCommand()equals("添加")){
try{String from = textFieldgetText();
String to = textField_2getText();
if(fromequals(to)){
JOptionPaneshowMessageDialog(null, "始点与终点不能相同");
return;
}
if(fromequals("")||toequals("")){
JOptionPaneshowMessageDialog(null, "添加不能为空");
return;
}for(int i = 0 ; i < modelsize() ; i ++){
if(modelget(i)toString()substring(0, modelget(i)toString()indexOf(":"))equals(
from+"->"+to))
modelremove(i);
}
double length = DoubleparseDouble(textField_3getText());
modeladdElement(from+"->"+to+": "+length);
}catch(Exception e1){
JOptionPaneshowMessageDialog(null, "距离为数字值");
}
}
if(egetActionCommand()equals("删除")){
for(int i = 0 ; i < modelsize() ; i++){
if(listisSelectedIndex(i))
modelremove(i);
}
}
if(egetActionCommand()equals("显示路径")){
try{
model_1removeAllElements();
GPS gps = new GPS();
String full,from,to;
double length;
for(int i = 0 ; i < modelsize() ; i++){
full = modelget(i)toString();
from = fullsubstring(0,fullindexOf("-"));
to = fullsubstring(fullindexOf("-")+2,fulllastIndexOf(":"));
length = DoubleparseDouble(fullsubstring(fullindexOf(":")+1, fulllength()-1));
//Systemoutprintln(from);
//Systemoutprintln(to);
try {
gpsgraphaddEdge(from, to, length);
Systemoutprintln(from +" "+ to);
} catch (CircuitException e1) {
Systemoutprintln("有环存在");
}
}LinkedList list = gpsgraphgetPath(textField_4getText(), textField_5getText());
model_1addElement(textField_4getText());
for(int i = 0 ; i < listsize() ; i++){
model_1addElement(listget(i));
}//计算路径长度
textField_1setText(""+gpsgraphgap);
}catch(Exception e1){
JOptionPaneshowMessageDialog(null, "没有找到有关节点");
}
}
}
}
#include <stdlibh>
#include <malloch>
//去除字符串str前面的空白字符(空格或<=15的字符)
//返回空白字符后的字符串
const char skip_white(const char str)
{
unsigned char ch;
for(;;++str)
{
ch=str;
if (ch==0) return str;
if (ch==' ') continue;
if (ch>15) break;
}
return str;
}
//对比赛结果的一条记录进行分析,
//str样式如:A VS B, 2:1;
//d中存放了分析结果,如上 d[0]='A', d[1]='B', d[2]=2, d[3]=1
//如果记录合法,则返回1, 否则返回0
int record(const char str, unsigned char d[4])
{
unsigned char ch;
unsigned char n;
//得到第一个队,并进行合法分析
str=skip_white(str);
ch=str;
if (ch<'A' || ch>'D') return 0;
d[0]=ch;
//确保第一个队后跟了"VS"
str=skip_white(++str);
ch=str++; if (ch!='V') return 0;
ch=str; if (ch!='S') return 0;
//得到第二个队,并进行合法分析
str=skip_white(++str);
ch=str;
if (ch<'A' || ch>'D') return 0;
d[1]=ch;
//确保第二个队后跟了","
str=skip_white(++str);
ch=str; if (ch!=',') return 0;
//得到第一个队比分,并进行合法分析
str=skip_white(++str);
ch=str;
if (ch<'0' || ch>'9') return 0;
for(++str, n=ch-'0';;++str)
{
ch=str;
if (ch<'0' || ch>'9') break;
n=10; n+=(ch-'0');
}
d[2]=n;
//确保第一个队后比分跟了":"
str=skip_white(str);
ch=str;
if (ch!=':') return 0;
//得到第二个队比分,并进行合法分析
str=skip_white(++str);
ch=str;
if (ch<'0' || ch>'9') return 0;
for(++str, n=ch-'0';;++str)
{
ch=str;
if (ch<'0' || ch>'9') break;
n=10; n+=(ch-'0');
}
d[3]=n;
return 1;
}
//现有n支球队,积分为score,进球数为number,
//要求对这n支球队进行排名,如得分相同,则看进球数
//排名结果放到d中
void rank(unsigned char d, const unsigned char score, const unsigned char number, int n)
{
int i,j;
unsigned int SCORE;
SCORE=(unsigned int)malloc(sizeof(unsigned int)n);
for (i=0; i<n; ++i)
{
//得到新的积分标准:SCORE=score×256+number
SCORE[i]=score[i];
SCORE[i]<<=8;
SCORE[i]+=number[i];
}
//根据积分SCORE排名,可能有并列名次
for (i=0; i<n; ++i) d[i]=0;
for (i=0; i<n; ++i)
for(j=0; j<n; ++j)
if (SCORE[i]<SCORE[j]) ++d[i];
free(SCORE);
}
int main(int argc, char argv[])
{
FILE f;
unsigned char number[4]; //进球数
unsigned char score[4];//积分
unsigned char d[4]; //临时变量
unsigned char i;
char buf[200], temp;
if (argc!=2)
{
printf("用法:zq 比赛记录文件名\n");
return 0;
}
f=fopen(argv[1],"r");
if (f==NULL)
{
printf("文件%s打开失败\n", argv[1]);
return 0;
}
for (i=0; i<4; ++i) number[i]=0;
for (i=0; i<4; ++i) score[i]=0;
while(1)
{
temp=fgets(buf, sizeof(buf), f);
if (temp==NULL) break;
if (record(buf,d)==0) continue;
d[0]-='A'; d[1]-='A';
//统计进球数
number[d[0]]+=d[2]; number[d[1]]+=d[3];
//统计积分
if (d[2]>d[3]) score[d[0]]+=3;
else if (d[2]<d[3]) score[d[1]]+=3;
else {score[d[0]]++;score[d[1]]++;}
}
rank(d,score,number,4); //d中存放名次
for (i=0; i<4; ++i)
printf("排名:%-2d %c队 积分:%-4d 进球数:%d\n",d[i]+1, i+'A', score[i], number[i]);
return 0;
}
/
以下是测试文件内容:假定为testtxt
A VS B, 2:1;
A VS C, 1:4;
A VS D, 2:2;
B VS C, 3:1;
B VS D, 4:2;
C VS D, 1:1;
以下是执行程序后的显示:
zq testtxt
排名:3 A队 积分:4 进球数:5
排名:1 B队 积分:6 进球数:8
排名:2 C队 积分:4 进球数:6
排名:4 D队 积分:2 进球数:5
如果要按排名排序,则可以用DOS的sort功能
zq testtxt > 1txt
sort 1txt
排名:1 B队 积分:6 进球数:8
排名:2 C队 积分:4 进球数:6
排名:3 A队 积分:4 进球数:5
排名:4 D队 积分:2 进球数:5
/
1、准备数据
将原有的数据源下拉一行,然后在表格中复制原有数据源的标题行,粘贴在右边空白列
为什么要把原始数据下拉一行, 因为我们会在右边第2行输入条件数据,如果筛选的时候第2行被隐藏了,后面没法输入条件了。所以为了确保第2行不被隐藏,把原始数据下拉了一行处理。
2、录制宏
关键在于这一步,我们在开发工具中,点击录制宏
然后在数据选项卡下,点击高级筛选,在d出的窗口中,原有列表数据,选择A2:D18
条件区域选择F1:I2,点击确定
在开发工具中,停止录制宏
这个时候可以按ALT+F11,可以看到在VBA里面,自动录制了一行代码:
这个代码不需要改动。
3、绑定录制的代码
我们在开发工具里面,插入一个按纽,自动绑定刚刚录制的宏,或者,右键按纽,绑定宏即可,我们在年份中输入1992,点击查询,结果就出来了。
*** 作方法原理:
即可以进行某个条件的查询数据,比如,输入想要搜索的关键词,员工小乔,点击查询即可查询出小乔的信息,
也可以进行多个条件满足的同时查询,比如查询市场部的男性,点击查询,也能得到结果。
上面高大上的查询系统,看起来需要很复杂的VBA编程才能实现,实际,只需要简单的一个录制宏就能轻轻松松的解决。
编写程序是一项系统而繁琐的工作,它不仅需要程序设计人员具有一定的功底,更需要有良好的编程习惯和风格。良好的编程习惯和风格不仅可以使程序代码更易于读懂和修改,更重要的是,它可以使程序的结构更加合理,有助于提高程序的执行效率。下面是我在程序设计中总结的一些经验,供大家参考。
设计顺序
在我们刚开始学习程序设计的时候,要编写一个程序,总是先进行一番构思,然后就一边写代码一边调试。这种方法一般只适用于非常小的程序,根据软件工程的特点,如果对所有程序都还按这种方法进行设计,是不合理的。
其实,设计程序就像我们盖高楼大厦,首先要设计图纸,然后动工。所以,对于个人编写程序来说,应遵循以下步骤:
1、问题分析:对我们要使用程序设计手段去解决的问题进行系统地分析,了解程序是做什么的,要达到一种什么样的效果等。
2、结构设计:也就是对程序的整体框架进行设计,设计出我们需要使用的模块等等,并画出流程图。
3、用户界面设计:在此,我们要设计出用于与用户交互的输入输出界面。
4、代码设计:在这个步骤中,我们要进行代码的编写。
5、调试:对程序中正在发生或可能发生的各种错误进行处理。
6、维护:通俗地说,维护就是对程序进行升级,对原有错误进行修改。
对于以上几个步骤,我想大多数人会认为代码设计最为重要,但如果程序的结构尚未清楚,我们在编写代码的时候就会发生混乱,一个程序性能的好坏,主要还是取决于它的结构是否合理。因此,在程序设计中,我们要尽可能注意这一点,这样才能使我们的程序更加完善。
设计环境
一个良好的编程环境可以使我们在编写程序时,不至于造成各种资源的紊乱,还可以避免资源的丢失。建议大家要在放源程序的目录下建立“programs”文件夹;然后再以你要编写的程序名和版本为名建立一个文件夹,用于存放整个源程序以及各种资源;最后,分别建立几个文件夹,“documents”:用于存放程序文档,包括流程图等;“resource”:用于存放,声音,影片等资源;“debug”:用于存放调试的程序。“release”:用于存放最终释放的程序。
例如:我们要制作一个英语学习软件,名为“english”,版本为10,那么我们的编程环境中应存在以下文件夹:
[drive]:\\…\\programs\\english1\\debug\\
[drive]:\\…\\programs\\english1\\documents\\
[drive]:\\…\\programs\\english1\\resource\\
[drive]:\\…\\programs\\english1\\release\\
另外,最好再建立一个专门的文件夹,用于存放各种模块,以便能实现代码的重用,这样,我们就不用在每次写程序时,都重写所有的模块,编程速度会有很大的提高。
设计技巧
代码如果写得很乱,程序便不易被阅读与修改,所以,在编写代码时要注意以下几点:
(1)注释:写注释虽然要占用一定的时间,但在阅读和修改代码时却会节省很多的时间。所以,建议大家在定义一个函数时,在函数的第一行写出函数的作用,再用一行解释函数的参数,并在每个变量的定义语句后注释出其作用。
(2)变量和函数的命名:每个程序都会使用很多的变量和函数,如果随意命名变量与函数,每次使用时还得在变量或函数的定义语句处查出它的数据类型及名称,而且随意命名还会造成变量与函数重复定义。
建议大家使用匈牙利命名法,方法是:每个变量或函数的开头都以其数据类型的缩写命名,然后再加上代表这个变量或函数的作用的英文单词简写共同组成变量或函数的名称。例如:要定义用于计数的整型变量count,其定义语句为c\\c++:int icount; basic:dim icount as integer。以这种方法定义,不仅可以有效地避免变量与函数的混乱与重复定义,还可以保证数据类型的匹配。
(3)控件命名:如果在windows下编程,你有可能会大量地使用控件,如果不对控件名严加管理,会造成很大程度的混乱,因此,建议在给控件命名时,以控件类型缩写再加上代表这个控件作用的英文单词的简写共同组成此控件的名称。例如:你要命名一个按钮控件,作用是进行删除 *** 作,那么控件名可以命名为cmddel。
并不是每个人都能成为顶级程序员,但我们都在程序员之路上不断进步,追求更完美、更专业化的程序。不妨好好改造一下你的程序,你会从中感受到很多好处。
在 GUI 程序中,修改一组数据和修改两组数据的代码可能会有所不同。以下是一个示例代码,展示了如何在 GUI 程序中修改一组数据:
Copy code
// 修改一组数据
private void modifyData() {
// 获取要修改的数据
int data = getData();
// 修改数据
data = data 2;
// 更新界面显示
updateUI(data);
}
以下是一个示例代码,展示了如何在 GUI 程序中修改两组数据:
Copy code
// 修改两组数据
private void modifyData() {
// 获取第一组要修改的数据
int data1 = getData1();
// 修改数据
data1 = data1 2;
// 更新界面显示
updateUI(data1);
// 获取第二组要修改的数据
int data2 = getData2();
// 修改数据
data2 = data2 3;
// 更新界面显示
updateUI(data2);
}
希望以上内容能够帮助您了解 GUI 程序
以上就是关于编写代码有什么用全部的内容,包括:编写代码有什么用、如何写出好的Java代码、求用C语言和数据结构中的无向图存储结构编一个校园导游图完全的程序代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)