Giúp sửa lỗi sai trong code

Mọi người giúp em với ạ, sao nó kết quả đổi cứ ra =0

#include<string.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include <conio.h>
typedef struct{
	int dl;
}Data;
/////////////////////////////////
typedef struct tagNode{
	Data infor;
	struct tagNode *link;
}Node;
/////////////////////////////////
typedef struct{
	Node *pHead;
	Node *pTail;
	int spt;
}Queue;
/////////////////////////////////
//tao 1 hang doi rong
void init_Q(Queue&Q)
{
	Q.pHead= NULL;
	Q.pTail= NULL;
	Q.spt=0;
}
//kiem tra hang doi co rong khong?
int empty_Q(Queue&Q)
{
	return (Q.spt==0);
}
int full_Q(Queue Q)
{
	return 0;
}
//them cuoi
void add_Q(Queue &Q, Data x)
{
	Node *pp;
	pp=(Node*)malloc(sizeof(Node));
	pp->infor=x;
	pp->link=NULL;
	if(empty_Q(Q)){
		Q.pTail=Q.pHead=pp;
	}
	else{
		Q.pTail->link=pp;
		Q.pTail=pp;
	}
	Q.spt++;
}
////////////////////////////
void del_Q (Queue &Q,Data x) {
       Node *q = Q.pHead,*pp=Q.pTail;
      if( empty_Q(Q) ) return;
      else 
	  { 
    if(  Q.pHead == Q.pTail)
	{
	  Q.pHead= Q.pHead=NULL;
}
    else
    {
    	while(pp->link!=Q.pHead) pp= pp->link;
    	x=Q.pHead->infor;
    	Q.pHead=pp;
    	Q.pHead->link=NULL;
    }
      free(q);
}
}
Data getQ(Queue&Q)
{
	return Q.pHead->infor;
}
void doi_2_10()
{
	
	char s[100];
	int i,n;
	int t=0;
   	Data x;
	Queue Q;
	printf("\n nhap so nhi phan:");
	fflush(stdin);
	gets(s);
	printf("\n day so nhi phan vua nhap la: % s",s);
	init_Q(Q);
	n=strlen(s);
	for(i=0;i<n;i++)
	{
		if(s[i]=='1')
		x.dl=1*pow(2,n-i-1);
	else
	   x.dl=0*pow(2,n-i-1);
	}
	while(!empty_Q(Q))
   {
   	del_Q(Q,x);
   	t=t+x.dl;
   }
   printf("\n dang thap phan la:% d",t);
   	 add_Q(Q,x);
}
int main()
{
	doi_2_10();
	getch();
	return 0;
}

Bạn đang muốn đổi chuỗi nhị phân sang thập phân à? Có yêu cầu nào nói phải làm một cách phức tạp như vậy không?

1 Like

có bạn ạ mình phải làm theo kiểu hàng đợi

Mình thấy một vài điểm như sau:

for(i=0;i<n;i++)
{
	if(s[i]=='1')
	x.dl=1*pow(2,n-i-1);
else
   x.dl=0*pow(2,n-i-1);
}

Đoạn này bạn tính giá trị cho các chữ số nhị phân từ trái qua phải, và sau đó không làm gì cả với giá trị bạn vừa tính ra. Bạn nên add_Q(Q,x); sau khi tính toán. Bạn đặt add_Q(Q,x); cuối cùng có ý nghĩa gì?

	while(!empty_Q(Q))
   {
   	del_Q(Q,x);
   	t=t+x.dl;
   }

Có vẻ như vòng lặp này bị lặp vô tận.

1 Like

bạn có cách nào để sửa cái vòng lặp bị vô tận kia ko chứ mình đi tham khảo một vài bài rồi nhưng ko nghĩ ra

Về bản chất hàng đợi, phần tử vào trước sẽ ra trước. Bạn xoá phần tử trong hàng đợi theo giá trị là hoàn toàn sai về mặt ý tưởng rồi. Nếu bạn thấy khó khăn trong việc cài đặt hàng đợi, thì dùng tạm std::queue trong C++ để giải quyết bài toán trước, rồi tập cài đặt lại Queue sau.

1 Like

ok cảm ơn bạn :heart:

Cấu trúc phù hợp với bài này là stack chứ ko phải queue.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?