-
please find a bug !
Code:
/**********************************************
** @copyright reserved by the author
**author: xuxuelong
**data: 20009/12/18
**IDE: visula c++ 6.0
**major: CS-software engineering-08
**email address: [email protected]
**attention: if you find a bug in the
**.......... operation ,just email me!
**********************************************/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define Max 100
#define OK 1
#define ERROR 0
/********************/
typedef struct node
{
int row;
int colum;
int value;
}data;
typedef struct _matrix
{
int row_size;
int colum_size;
int non_zero_amount;
data matrix[Max+1];
}tri_matrix;
/********subfunctions**********/
/*******function prototypes****/
int creat_matrix(tri_matrix &T)
{//creat a tri_matrix T with row_temp rows and colum_temp colums
/*input how many rows matrixs have*/
printf("The matrix's row size :");
scanf("%d",&T.row_size);
/*input how many colums matrixs have*/
printf("The matrix's colum size:");
scanf("%d",&T.colum_size);
printf("Input the number of non_zero amount :");
scanf("%d",&T.non_zero_amount);
printf("/*****************************************/\n");
for(int count=1;count<=T.non_zero_amount;count++)
{
do
{//insure the row mark is valid
printf("Input the mark of <row>:");
scanf("%d",&T.matrix[count].row);
}while(T.matrix[count].row>T.row_size);
do
{//insure the colum mark is valid
printf("Input the mark of <colum>:");
scanf("%d",&T.matrix[count].colum);
}while(T.matrix[count].colum>T.colum_size);
/*input the value of the matrix*/
do
{//insure the value is non zero
printf("Input the <value> of the node:");
scanf("%d",&T.matrix[count].value);
}while(T.matrix[count].value==0);
printf("/************************************/\n");
}//for
return OK;
}//creat_matrix
void print_matrix(tri_matrix T)
{//print out the info of the matrix
printf("\t\tRow\t\t\tColum\t\t\tValue\n");
printf("\t\t-------------------------------------------------\n");
for(int count=1;count<=T.non_zero_amount;count++)
{
printf("\t\t%d\t\t\t%d\t\t\t%d\n",T.matrix[count].row,T.matrix[count].colum,T.matrix[count].value);
printf("\t\t-------------------------------------------------\n");
Sleep(1000);
}
}//print_matrix
int add_matrix(tri_matrix one,tri_matrix two, tri_matrix &three)
{//add matrix one and two then put the result in three
int i,j,k;//count in the loop
for(i=1;i<=one.non_zero_amount;i++)
{//assign one's info to three
three.matrix[i].row=one.matrix[i].row;
three.matrix[i].colum=one.matrix[i].colum;
three.matrix[i].value=one.matrix[i].value;
}
three.non_zero_amount=i-1;
/*insert two's info to three*/
for(j=1;j<=two.non_zero_amount;j++)
{//insert one by one of the two's nodes
for(i=1;i<=three.non_zero_amount;i++)
{
if(two.matrix[j].row<three.matrix[i].row)
{//node in two insert into three
for(k=three.non_zero_amount;k>=i;k--)
{//backoff the elements in three
three.matrix[k+1].row=three.matrix[k].row;
three.matrix[k+1].colum=three.matrix[k].colum;
three.matrix[k+1].value=three.matrix[k].value;
}
/*two's insert element replace the origin one*/
three.matrix[i].row=two.matrix[j].row;
three.matrix[i].colum=two.matrix[j].colum;
three.matrix[i].value=two.matrix[j].value;
three.non_zero_amount++;
break;
}
else
if(two.matrix[j].row==three.matrix[i].row)
{//row equal then compare the colums
if(two.matrix[j].colum==three.matrix[i].colum)
{//all equal
three.matrix[i].row=three.matrix[i].row;
three.matrix[i].colum=three.matrix[i].colum;
three.matrix[i].value+=two.matrix[j].value;
break;//two's element to the next one
}
else
if(two.matrix[j].colum<three.matrix[i].colum)
{
for(k=three.non_zero_amount;k>=i;k--)
{//backoff the elements in three
three.matrix[k+1].row=three.matrix[k].row;
three.matrix[k+1].colum=three.matrix[k].colum;
three.matrix[k+1].value=three.matrix[k].value;
}
three.matrix[i].row=two.matrix[j].row;
three.matrix[i].colum=two.matrix[j].colum;
three.matrix[i].value=two.matrix[j].value;
three.non_zero_amount++;
break;//two's element to the next one
}
else
{
if(i==three.non_zero_amount)
{//insert to the last
three.matrix[three.non_zero_amount+1].row=two.matrix[j].row;
three.matrix[three.non_zero_amount+1].colum=two.matrix[j].colum;
three.matrix[three.non_zero_amount+1].value=two.matrix[j].value;
three.non_zero_amount++;
}
else continue;//element in three to the next one
}//else
}//if
else//two.matrix[j].row>three.matrix[i].row
{
if(i==three.non_zero_amount)
{//insert to the last
three.matrix[three.non_zero_amount+1].row=two.matrix[j].row;
three.matrix[three.non_zero_amount+1].colum=two.matrix[j].colum;
three.matrix[three.non_zero_amount+1].value=two.matrix[j].value;
three.non_zero_amount++;
break;
}
else continue;
}
}//inner for
}//outer for
three.non_zero_amount=three.non_zero_amount;
three.row_size=one.row_size;
three.colum_size=one.colum_size;
return OK;
}//add_matrix
int multiply_matrix(tri_matrix one, tri_matrix two,tri_matrix &three)
{//multiply one and two ,print the result in three
int k=1;//element count in the loop three
three.row_size=one.row_size;
three.colum_size=two.colum_size;
for(int i=1;i<=one.non_zero_amount;i++)
{
for(int j=1;j<=two.non_zero_amount;j++)
{
if(one.matrix[i].colum==two.matrix[j].row)
{//the apply of matrix's attribute
three.matrix[k].row=one.matrix[i].row;
three.matrix[k].colum=two.matrix[j].colum;
three.matrix[k].value=one.matrix[i].value*two.matrix[j].value;
k++;
}
}//for
NULL;
}//for
three.non_zero_amount=--k;
return OK;
}//multiplay_matrix
void swap(int &a,int &b)
{//exchange the value between a and b
int temp;
temp=a;
a=b;
b=temp;
}//swap
int trans_matrix(tri_matrix one,tri_matrix &T)
{//figure out the transfort matrix of one
/*sort the colum(bubble sort) and assign to T*/
for(int i=1;i<=one.non_zero_amount;i++)
{
/*initilize to be the minimum one*/
T.matrix[i].row=one.matrix[i].colum;
T.matrix[i].colum=one.matrix[i].row;
T.matrix[i].value=one.matrix[i].value;
for(int j=i+1;j<=one.non_zero_amount;j++)
{
if(T.matrix[i].row<one.matrix[j].colum)
continue;
if(T.matrix[i].row>one.matrix[j].colum)
{
swap(T.matrix[i].row,one.matrix[j].colum);
swap(T.matrix[i].colum,one.matrix[j].row);
swap(T.matrix[i].value,one.matrix[j].value);
continue;
}else
{//T's row equal to one's colum
if(T.matrix[i].colum<one.matrix[j].row)
continue;
if(T.matrix[i].colum>one.matrix[j].row)
{//only swap the colum of T
swap(T.matrix[i].colum,one.matrix[j].row);
swap(T.matrix[i].value,one.matrix[j].value);
continue;
}
}
}//for
T.matrix[i].row=T.matrix[i].row;
T.matrix[i].colum=T.matrix[i].colum;
T.matrix[i].value=T.matrix[i].value;
}//for
T.row_size=one.row_size;
T.colum_size=one.colum_size;
T.non_zero_amount=one.non_zero_amount;
return OK;
}//trans_matrix
/*******the main function********/
/*******the main function********/
int main(void)
{
/*declare three tri_matrix*/
tri_matrix one,two,three;
int choice;//as a mark of selection
char flag;//selection mark
while(OK)
{
system("cls");
system("color a4");
printf("\t$*****************************************************$\n");
putchar('\n');
printf("\t\t %c------------Functions------------%c\n",2,2);
putchar('\n');
printf("\t\t %c---------------------------------%c\n",2,2);
printf("\t\t %c <1>matrix---addition %c\n",2,2);
printf("\t\t %c---------------------------------%c\n",2,2);
printf("\t\t %c <2>matrix---multiplication %c\n",2,2);
printf("\t\t %c---------------------------------%c\n",2,2);
printf("\t\t %c <3>matrix---transformation %c\n",2,2);
printf("\t\t %c---------------------------------%c\n",2,2);
printf("\t\t %c <4>exit-----quit the program %c\n",2,2);
printf("\t\t %c---------------------------------%c\n",2,2);
putchar('\n');
printf("\t\t %c--------Triples Row First--------%c\n",2,2);
printf("\t$*****************************************************$\n");
printf("Please choose a choice :(1--4)\n");
scanf("%d",&choice);
switch(choice)
{
case 1: printf("\t<addition>\n");
/***creat the first one***/
printf("\n");
printf("Creat the one matrix\n");
printf("\n");
creat_matrix(one);
printf("The one tri_matrix is below:\n");
print_matrix(one);
/*****creat the second one****/
printf("Creat the two matrix\n");
printf("\n");
creat_matrix(two);
printf("The two tri_matrix is below:\n");
print_matrix(two);
/*********check*******/
while(two.row_size!=one.row_size||two.colum_size!=one.colum_size)
{//insure the two matrix are valid to add
printf("--------------------------------ERROR---------------------------!\n");
printf("!!!The two matrix should have the same row size and colum size!!!\n");
printf("--------------------------------ERROR---------------------------!\n");
printf("Creat the two matrix\n");
printf("\n");
creat_matrix(two);
print_matrix(two);
}
/*******add the two matrix********/
printf("Add the two matrix\n");
putchar('\n');
add_matrix(one,two,three);
printf("The three matrix is below:\n");
Sleep(2000);
print_matrix(three);
system("pause");
break;
case 2:printf("\t<multiplication>\n");
/***creat the first one***/
printf("\n");
printf("Creat the one matrix\n");
printf("\n");
creat_matrix(one);
printf("The one matrix is below:\n");
print_matrix(one);
/*****creat the second one****/
printf("Creat the two matrix\n");
printf("\n");
creat_matrix(two);
printf("The two matrix is below:\n");
print_matrix(two);
/**********check**********/
while(one.colum_size!=two.row_size)
{//if not equal ,creat a valid one
printf("--------------------------------ERROR---------------------------!\n");
printf("!!!!!!!!!!One's colum size should equal to two's row size!!!!!!!!\n");
printf("--------------------------------ERROR---------------------------!\n");
printf("Creat the two matrix\n");
printf("\n");
creat_matrix(two);
printf("The two matrix is below:\n");
printf("\n");
print_matrix(two);
}
/*******multiply the two matrix********/
printf("Multiply the two matrix\n");
multiply_matrix(one,two,three);
printf("Print the results of multiplication\n");
Sleep(2000);
print_matrix(three);
system("pause");
break;
case 3:printf("\t<transformation>\n");
/***creat a matrix***/
printf("\n");
printf("Creat a matrix\n");
printf("\n");
creat_matrix(one);
printf("The matrix is below:\n");
print_matrix(one);
/*****transformation of the matrix*****/
printf("The transfortid matrix is :\n");
Sleep(2000);
trans_matrix(one,three);
print_matrix(three);
system("pause");
break;
case 4: printf("Are you sure to quit the system<Y/N>?\n");
fflush(stdin);
scanf("%c",&flag);
if(flag=='y'||flag=='Y'||flag=='\n')
{
printf("\t\t%c-------%c-------%c-------%c-------%c\n",2,2,2,2,2);
putchar('\n');
printf("\t\t(^_^)Thanks For Using This!(^_^)\n");
putchar('\n');
printf("\t\t%c-------%c-------%c-------%c-------%c\n",2,2,2,2,2);
putchar('\n');
Sleep(2000);
exit(OK);
}
break;
}//switch
NULL;
}//while
return OK;
}
-
-
I'd get rid of fflush(stdin), and rely on you to post up whatever problems you have with your program, for the rest.
-
Quote:
Originally Posted by
stevesmithx
LOL.:)