題目要求基本如下:
請編寫一個控制臺程序,要求用戶可以輸入任意組條件,定義兩個字母之間的大小關系。程序可以通過已輸入的條件,推斷出給定的兩個字母之間的大小關系。例如:
用戶輸入:A>B
用戶輸入:B>C
用戶輸入:A?C
程序顯示:A>C
用戶輸入:C<D
用戶輸入:A?D
程序顯示:無法判斷
用戶輸入:A<C
程序顯示:與原有條件沖突
。。。
字母僅為 26 個英文字母之一,條件只有大于和小于兩種,問號表示向計算機提問。程序要能檢查用戶輸入的語法是否正確,檢查條件是否于原有的條件沖突,并輸入判斷結果。
其實這個題目考的是如何選擇一個好的數據結構,來實現這個算法。
我的思路就是使用最簡單的二維數組來表達,具體如下:
總共只有 26 個英文字母,所以不訪定義一個26X26的二維字符數組來保存相互之間的關系;
因為關系是相互的,所以只需要矩陣的上半部分或者下半部分(不過26X26也不算很大,就算了吧~~);
例如: 如果用戶輸入了A>B,先查詢A和B之間的大小關系,如果與‘>’沖突,則提示出錯;
不存在沖突則設置[A][B]='>'和[B][A]='<';并且做如下設置:將所以小于B的字符都小于A、所有大于A的字符都大于B;
如果用戶查詢兩個字符之間的關系,則直接從二維表中查找二者的關系并輸出
這樣一來,問題就迎刃而解了
具體代碼如下:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define UNKNOWN 'u'
#define LARGER '>'
#define LESS '<'
#define MAX_COL 26
//初始化二維數組
void Init();
//打印二維數組
void Print();
//查詢兩個字符的大小關系
bool Query(char v1,char v2);
//輸入兩個字符的大小關系
bool Input(char v1,char op,char v2);
//獲取兩個字符的大小關系
char GetRel(char v1,char v2);
//設置兩個字符的大小關系
void SetRel(char v1,char v2,char op);
char matrix[MAX_COL][MAX_COL];
//主函數
int main()
{
Init();
char buf[8];
char v1,op,v2;
while(true)
{
printf("用戶輸入:");
memset(buf,0,8);
scanf("%s",buf);
strupr(buf);
if(strcmp(buf,"EXIT")==0
||strcmp(buf,"QUIT")==0
||strcmp(buf,"Q")==0
)
break;
if(strcmp(buf,"PRINT")==0
||strcmp(buf,"P")==0 )
{
Print();
continue;
}
v1=buf[0];
op=buf[1];
v2=buf[2];
if(!isalpha(v1) || !isalpha(v2))
{
printf("Error:Invalid char!\n");
continue;
}
if(op=='?')
{
Query(v1,v2);
}
else if(op == '>' || op == '<')
{
if(v1==v2)
{
printf("Error:two chars are equal!\n");
continue;
}
Input(v1,op,v2);
}
else
{
printf("Error:Unknown operator!\n");
}
}
}
void Init()
{
for(int i=0;i<MAX_COL;i++)
{
for(int j=0;j<MAX_COL;j++)
{
matrix[i][j]=UNKNOWN;
}
}
}
void Print()
{
for(int i=0;i<MAX_COL;i++)
{
for(int j=0;j<MAX_COL;j++)
{
printf("%c",matrix[i][j]);
}
printf("\n");
}
}
bool Query(char v1,char v2)
{
char rel=GetRel(v1,v2);
switch(rel)
{
case UNKNOWN:
printf("程序顯示:無法判斷\n");
return true;
}
printf("程序顯示:%c%c%c\n",v1,rel,v2);
return true;
}
bool Input(char v1,char op,char v2)
{
char rel=GetRel(v1,v2);
if(rel==UNKNOWN)
{
SetRel(v1,v2,op);
//若v1>v2,則所有比v1大的符號都將比v2大,所有比v2小的符號都將比v1小
if(op == LARGER)
{
for(int
i='A';i<='Z';i++)
{
if(LARGER ==GetRel(i,v1))
{
SetRel(i,v2,LARGER);
}
if(LESS == GetRel(i,v2))
{
SetRel(i,v1,LESS);
}
}
}
//若v1<v2,則所以小于v1的符號都比v2小,所有大于v2的符號都將比v1大
else if(op==LESS)
{
for(int
i='A';i<='Z';i++)
{
if(LESS ==GetRel(i,v1))
{
SetRel(i,v2,LESS);
}
if(LARGER == GetRel(i,v2))
{
SetRel(i,v1,LARGER);
}
}
}
}
else if(rel != op)
{
printf("程序顯示:與原有條件沖突\n");
return false;
}
return true;
}
char GetRel(char v1,char v2)
{
return matrix[v1-'A'][v2-'A'];
}
void SetRel(char v1,char v2,char op)
{
matrix[v1-'A'][v2-'A']=op;
matrix[v2-'A'][v1-'A']=(op==LARGER)?LESS:LARGER;
}
posted on 2007-06-29 17:32
Darkblue 閱讀(1513)
評論(4) 編輯 收藏 引用