數(shù)制轉(zhuǎn)換
從鍵盤(pán)輸入一個(gè)十進(jìn)制數(shù)n,并輸入要轉(zhuǎn)換的進(jìn)制數(shù)m,利用棧將n轉(zhuǎn)換成m進(jìn)制,并輸出轉(zhuǎn)換后的結(jié)果。
首先設(shè)計(jì)一個(gè)含有多個(gè)菜單項(xiàng)的主菜單程序,然后再為這些菜單項(xiàng)配上相應(yīng)的功能。
主菜單設(shè)計(jì)要求:
程序運(yùn)行后,顯示一個(gè)標(biāo)題“進(jìn)制轉(zhuǎn)換”,標(biāo)題下方給出4個(gè)菜單項(xiàng)的內(nèi)容和輸入提示:
- 輸入一個(gè)十進(jìn)制數(shù)n
- 輸入進(jìn)制轉(zhuǎn)換m
- 進(jìn)制轉(zhuǎn)換
- 繼續(xù)否?(y/n)
請(qǐng)選擇1—4:
功能要求:
完成各菜單的要求,能用棧正確轉(zhuǎn)換數(shù)制
棧是限定僅在表尾進(jìn)行插入或刪除操作的線性表,后進(jìn)先出
特別注意:
進(jìn)行進(jìn)制轉(zhuǎn)換時(shí)要考慮十六進(jìn)制的特殊性,為完成十進(jìn)制與十六進(jìn)制間的轉(zhuǎn)換利用if語(yǔ)句,對(duì)e的值進(jìn)行判斷:
當(dāng)e大于10時(shí),為保證十六進(jìn)制正確轉(zhuǎn)換:
當(dāng)e的值等于11時(shí),輸出A;
當(dāng)e的值等于12時(shí),輸出B;
當(dāng)e的值等于13時(shí),輸出C;
當(dāng)e的值等于14時(shí),輸出D;
當(dāng)e的值等于15時(shí),輸出E;
流程圖:
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-730061.html
實(shí)驗(yàn)代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-730061.html
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define OVERFLOW -2
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100 //順序棧存儲(chǔ)空間的初始分配量
#define STACKINCREMENT 10
typedef int SElemType;
typedef int Status;
//順序棧的存儲(chǔ)結(jié)構(gòu)
typedef struct{
SElemType *base; //棧底指針
SElemType *top; //棧頂指針
int stacksize; //棧可用的最大容量
}SqStack;
//順序棧的初始化
Status InitStack(SqStack &S) //構(gòu)建一個(gè)空棧S
{
S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); //為順序棧動(dòng)態(tài)分配一個(gè)容量為STACK_INIT_SIZE的數(shù)組空間
if(!S.base)
exit (OVERFLOW); //存儲(chǔ)分配失敗
S.top = S.base; //top初始為base,空棧
S.stacksize = STACK_INIT_SIZE; //stacksize置為棧的最大容量STACK_INIT_SIZE
return OK;
}
//順序棧的入棧
Status Push(SqStack &S,SElemType e)
{
if(S.top - S.base == S.stacksize ){
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); //棧滿(mǎn),追加存儲(chǔ)空間
if(!S.base)
return OVERFLOW; //存儲(chǔ)分配失敗
S.top=S.base +S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++ = e; //元素e壓入棧頂,棧頂指針加一
return OK;
}
//順序棧的出棧
Status Pop(SqStack &S,SElemType &e) //
{
if(S.top==S.base)
return ERROR; //???,返回ERROR
e = *--S.top; //棧頂指針減一,將棧頂元素賦給e
return e;
}
//主函數(shù)
int main()
{
int choice;
char c;
int n,m;
SElemType e;
SqStack S;
InitStack(S);
printf("**********進(jìn)制轉(zhuǎn)換**********\n");
printf("1.請(qǐng)輸入一個(gè)十進(jìn)制數(shù)n\n");
printf("2.請(qǐng)輸入轉(zhuǎn)換的進(jìn)制m\n");
printf("3.進(jìn)制轉(zhuǎn)換\n");
printf("4.繼續(xù)或退出(y/n)\n");
while(choice) //保證操作的選擇循環(huán)進(jìn)行
{
printf("請(qǐng)選擇操作1--4:\n");
scanf("%d",&choice);
if(choice >4 ||choice<=0) //如果輸入的操作數(shù)不符合條件,則退出程序
{
printf("您輸入的數(shù)據(jù)有誤!\n");
return 0; //返回0,結(jié)束循環(huán),退出程序
}
while(choice <= 4) //進(jìn)行操作1--4的選擇
{
if(choice == 1)
{
printf("請(qǐng)輸入一個(gè)十進(jìn)制數(shù):\n");
scanf("%d",&n);
break;
}
if(choice == 2)
{
printf("請(qǐng)輸入轉(zhuǎn)換的進(jìn)制:\n");
scanf("%d",&m);
break;
}
if(choice == 3)
{
printf("進(jìn)制轉(zhuǎn)換:\n");
while(n!=0)
{
Push(S,n%m);
n=n/m;
}
while(S.top!=S.base)
{
e=Pop(S,e);
if(e<10)
printf("%d",e);
else if(e>=10)
{
if(e==10)
printf("A");
if(e==12)
printf("B");
if(e==13)
printf("C");
if(e==14)
printf("D");
if(e==15)
printf("E");
}
}
printf("\n");
break;
}
if(choice == 4)
{
printf("請(qǐng)輸入y/n選擇繼續(xù)或退出\n");
getchar();
scanf("%c",&c);
if(c=='y')
{
printf("請(qǐng)輸入操作1--4繼續(xù)運(yùn)行程序:\n");
scanf("%d",&choice);
}
if(c == 'n')
return 0; //返回0,結(jié)束循環(huán),退出程序
}
}
}
}
到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu):利用棧實(shí)現(xiàn)數(shù)制轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!