| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1118 人关注过本帖
标题:[求助] 过两日要交的课程设计(看毛病)
取消只看楼主 加入收藏
hilarry
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-9-24
收藏
 问题点数:0 回复次数:0 
[求助] 过两日要交的课程设计(看毛病)

程序里面的排序和扫描好象有点问题,希望各位大哥大姐指点一下
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

#define M 50
#define MaxSizeOfQueue 5000

int m;/* 行 */
int n;/* 列 */

typedef struct {
int Data[M][M];/* 二维数组 */
int Mark[M][M];/* 标志域,是否已访问 */
}FileOfDataType;


typedef struct {
int Result[ M ];/* 结果数组 */
int Looper;/* 有几个结果 */
}ResutType;


ResutType Result;
FileOfDataType FileOfData; /* 二维数组 */

typedef struct{/* 坐标结构 */
int X;
int Y;
}Position;

typedef struct{
Position *base;
int front;
int rear;
}SqQueue;

SqQueue sq;
Position pos;

void InitQueue(SqQueue *sq){

sq->base=(Position *)malloc(MaxSizeOfQueue * sizeof(Position));
if(!sq->base){
printf("申请空间失败!");
exit(0);
}
sq->front=sq->rear=0;
}

void EnQueue(SqQueue *sq,Position *Data){
if((( sq->rear+1) % MaxSizeOfQueue ) == sq->front){/* 队列满 */
exit(0);
}
sq->base[ sq->rear ].X=Data->X;
sq->base[ sq->rear ].Y=Data->Y;
/* cout<<"EnQueue Data:"<<sq.base[ sq.rear ].X<<" "<<sq.base[ sq.rear ].Y; */
sq->rear=sq->rear % MaxSizeOfQueue;
}

int DeQueue(SqQueue *sq,Position *Data){
if(sq->rear == sq->front){/* 队列空 */
/* cout<<"队列空!"; */
return 0;
}
else{
*Data=sq->base[ sq->front ];
/* cout<<"DeQueue Data:"<<Data.X<<" "<<Data.Y; */
sq->front=(sq->front+1) % MaxSizeOfQueue;
return 1;
}
}

int rnd(int uper){/* int 型随机函数 */
return (rand()%uper);
};

int SelectNumber(float Probablility){
int temp;

temp=rnd(100);
Probablility=Probablility*100;
if(Probablility < temp) {
return 0;
}
else{
return 1;
}
}

void PrintArray(){
int i,j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if (FileOfData.Data[ i ][ j ] == 1)
printf("%d",FileOfData.Data[ i ][ j ]);
else
printf(" ");
}
printf("\n");
}
printf("回到菜单...");
getch();
}

void BuildArray(){/* 建立二维数组 */
int i,j;
float Probability;
printf("根据行数和列数建立随机的二维数组:\n");
printf("行 m:");
scanf("%d",&n);
printf("列 n:");
scanf("%d",&m);
printf("数组中 1 出现的概率(0<X<1): ");
scanf("%f",&Probability);

if (m>0 && n>0){
/* FileOfData=(int *)malloc(m * n * sizeof(int)); */
for(i=0;i<m;i++){
for(j=0;j<n;j++){
FileOfData.Data[ i ][ j ]=SelectNumber(Probability);
FileOfData.Mark[ i ][ j ]=0;
}/* for */
}/* for */
printf("成功建立!\n按任意键回到菜单...");
getch();
}
else{
printf("行或列必须要大于0!\n按任意键回到菜单...");
getch();
}
}

void SaveArrayToFile(){
FILE *fp;
int i,j;
char filename[20];
if (m<=0 || n<=0){
printf("行数或列数小于0,保存失败!");
}
else{
printf("保存到文件:");
scanf("%s",filename);
if((fp=fopen(filename,"wb"))==0){
printf("打开文件出错!");
exit(0);
}

fwrite(&m,sizeof(int),1,fp);
fwrite(&n,sizeof(int),1,fp);
for(i=0;i<m;i++){
for(j=0;j<n;j++){
fwrite(&FileOfData.Data[ i ][ j ],sizeof(int),1,fp);
}/* for */
}/* for */
/* cout<<filename<<endl; */
printf("保存文件成功!\n按任意键回到菜单...");
getch();
fclose(fp);
}/* else */
}

void ReadArrayFromFile(){
FILE *fp;
int i,j;
char filename[20];
printf("读取文件:");
scanf("%s",filename);
if((fp=fopen(filename,"rb")) == 0){
printf("读取错误,文件可能不存在");

}
else{
fread(&m,sizeof(int),1,fp);
fread(&n,sizeof(int),1,fp);
for(i=0;i<m;i++){
for(j=0;j<n;j++){
fread(&FileOfData.Data[ i ][ j ],sizeof(int),1,fp);
}/* for */
}/* for */
printf("读取成功!\n按任意键回到菜单...");
getch();
}
}

int SearchVex(){
int ipos;
int jpos;
FileOfData.Mark[pos.X][pos.Y]=1;
do{
jpos=pos.Y-1;/* 左上角 */
ipos=pos.X-1;
if(ipos>=0 && jpos>=0){
if(FileOfData.Mark[ipos][jpos] == 0 && FileOfData.Data[ipos][jpos] == 1){
pos.X=ipos;
pos.Y=jpos;
FileOfData.Mark[ipos][jpos]=1;
EnQueue(&sq,&pos);
Result.Result[Result.Looper]++;
}
}
ipos=pos.X-1;/* 左 */
jpos=pos.Y;
if(ipos >= 0){
if(FileOfData.Mark[ipos][jpos] == 0 && FileOfData.Data[ipos][jpos] == 1){
pos.X=ipos;
pos.Y=jpos;
FileOfData.Mark[ipos][jpos]=1;
EnQueue(&sq,&pos);
Result.Result[Result.Looper]++;
}
}
ipos=pos.X+1;/* 右上 */
jpos=pos.Y+1;
if(jpos < n && ipos < m){
if(FileOfData.Mark[ipos][jpos] == 0 && FileOfData.Data[ipos][jpos] == 1){
pos.X=ipos;
pos.Y=jpos;
FileOfData.Mark[ipos][jpos]=1;
EnQueue(&sq,&pos);
Result.Result[Result.Looper]++;
}
}
ipos=pos.X;/* 下 */
jpos=pos.Y-1;
if(jpos >=0){
if(FileOfData.Mark[ipos][jpos] == 0 && FileOfData.Data[ipos][jpos] == 1){
pos.X=ipos;
pos.Y=jpos;
FileOfData.Mark[ipos][jpos]=1;
EnQueue(&sq,&pos);
Result.Result[Result.Looper]++;
}
}
ipos=pos.X;/* 上 */
jpos=pos.Y+1;
if(jpos < n){
if(FileOfData.Mark[ipos][jpos] == 0 && FileOfData.Data[ipos][jpos] == 1){
pos.X=ipos;
pos.Y=jpos;
FileOfData.Mark[ipos][jpos]=1;
EnQueue(&sq,&pos);
Result.Result[Result.Looper]++;
}
}
ipos=pos.X+1;/* 右下 */
jpos=pos.Y-1;
if(jpos >= 0 && ipos < m){
if(FileOfData.Mark[ipos][jpos] == 0 && FileOfData.Data[ipos][jpos] == 1){
pos.X=ipos;
pos.Y=jpos;
FileOfData.Mark[ipos][jpos]=1;
EnQueue(&sq,&pos);
Result.Result[Result.Looper]++;
}
}
ipos=pos.X+1;/* 右 */
jpos=pos.Y;
if( ipos < m){
if(FileOfData.Mark[ipos][jpos] == 0 && FileOfData.Data[ipos][jpos] == 1){
pos.X=ipos;
pos.Y=jpos;
FileOfData.Mark[ipos][jpos]=1;
EnQueue(&sq,&pos);
Result.Result[Result.Looper]++;
}
}
ipos=pos.X+1;
jpos=pos.Y+1;
if(ipos < m && jpos < n ){
if(FileOfData.Mark[ipos][jpos] == 0 && FileOfData.Data[ipos][jpos] == 1){
pos.X=ipos;
pos.Y=jpos;
FileOfData.Mark[ipos][jpos]=1;
EnQueue(&sq,&pos);
Result.Result[Result.Looper]++;
}
}
}
while(DeQueue(&sq,&pos));/* do while */
return 1;
}

void PrintResult(){
int i;
printf("聚点数:%d",Result.Looper-1);
for(i=0;i<Result.Looper;i++){

printf("\n聚点 %d: 象素点数: %d",i,Result.Result[i]);
}
printf("\n按任意键回到菜单...");
getch();
}

void ClearResult(){
int i;
Result.Looper=0;
for(i=0;i<M;i++){
Result.Result[i]=0;
}
}

void CountNumberOfVex(){
int i,j;
if (m<=0 || n<=0){
printf("行数或列数少于0!");
exit(0);
}
else{
ClearResult();
free(sq.base);
InitQueue(&sq);

for(i=0;i<m;i++){
for(j=0;j<n;j++){
if (FileOfData.Mark[i][j] == 0 && FileOfData.Data[i][j] == 1){
pos.X=i;
pos.Y=j;
EnQueue(&sq,&pos);
Result.Result[Result.Looper]++;
SearchVex();
Result.Looper++;
}
}/* for */
}/* for */

PrintResult();


}
}

int Partition(int low,int high){/* 一趟快速排序 */

int PivotKey;
PivotKey=Result.Result[ low ];

/* cout<<" PivotKey:"<<PivotKey; */
while(low < high){
/* printf("low: %d high: %d",low,high); */
while(low<high && Result.Result[high]>PivotKey) {
/* cout<<"high--"<<endl; */
high--;
}/* high向左 */
Result.Result[low]=Result.Result[high];
while(low<high && Result.Result[low]<=PivotKey){
/* cout<<"low++"<<endl; */
low++;
}/* low向右 */
Result.Result[high]=Result.Result[low];
}/* while */

Result.Result[low]=PivotKey;

return low;
}

void Qsort(int low,int high){
if(low < high){
int pivotloc;
pivotloc=Partition(low,high);

/* cout<<"pivotloc: "<<pivotloc; */
Qsort(low,pivotloc-1);
Qsort(pivotloc+1,high);
}
}

void QuickSort(){/* 对结果进行快速排序 */
if(Result.Looper != 0){
Qsort(0,Result.Looper);
PrintResult();

}
else{
printf("还没有计算结果");
printf("按任意键返回...");
getch();
}
}

void InitResult(){
int i;
Result.Looper=0;
for(i=0;i<M;i++){
Result.Result[ i ]=0;
}
}

void Average(){
int result;
int i;
if(Result.Looper > 0){
printf("开始计算平均象素...\n");
for(i=0,result=0;i<M;i++){
result+=Result.Result[ i ];
}/* for */
printf("计算结果:\n%d",result);
}
else{
printf("\n还没有计算象素...\n");
}
printf("\n按任意键返回...");
getch();
}

void main(){
int Methord;
Methord=0;
InitResult();
while(1){

system("cls");/* 清屏 */
printf("用迷宫算法对数组中的聚点数进行统计\n\n");
printf("1.建立随机二维数组\n");/* BuildArray() */
printf("2.清空二维数组\n");
printf("3.从文件中读取二维数组\n");
printf("4.保存二维数组到文件\n");
printf("5.计算聚点数目\n");
printf("6.对结果进行快速排序\n");
printf("7.清除结果\n");
printf("8.打印二维数组\n");
printf("9.计算平均象素\n");
printf("0.退出\n");
printf("\n\n");
printf("选择: ");
scanf("%d",&Methord);


switch(Methord){
case 1:BuildArray(); break;
case 3:ReadArrayFromFile();break;
case 4:SaveArrayToFile();break;
case 5:CountNumberOfVex();break;
case 6:QuickSort();break;
case 8:PrintArray(); break;
case 9:Average();break;
case 0:exit(0);
}
system("cls");
}/* while */

}

[此贴子已经被作者于2006-9-26 15:08:55编辑过]

搜索更多相关主题的帖子: 课程 毛病 设计 
2006-09-26 08:44
快速回复:[求助] 过两日要交的课程设计(看毛病)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028713 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved