PDA

View Full Version : Chương trình nhập danh sách hóa đơn trên C. Không xuất kết quả ra màn hình



tientran9668
15-01-2010, 12:27 AM
bài tập:
câu 1;viet CT nhap danh sách các hóa đon bao gôm
mã hóa đon,ngày lâp,tình trang.
nêu tình trang =1 ->hóa đon đã thanh toán
=0 ->chưa thanh toán
câu 2: xóa các hóa đơn đã thanh toán
câu 3: xuat các hóa đơn chưa thanh toán ra file DSNO.TXT



#include<conio.h>
#include<stdio.h>
#include<string.h>
typedef struct
{
int ngay,thang,nam;
}NGAY;
typedef struct
{
char mahd[100];
int tinhtrang;
NGAY d;
}HOADON;
void nhapngay(NGAY &d)
{
printf("nhap dd/nn/mm:");
scanf("%d %d %d",&d.ngay,&d.thang,&d.nam);
}
void nhaphd(HOADON &hd)
{
fflush(stdin);
printf("\nnhap ma hd:");
gets(hd.mahd);
fflush(stdin);
nhapngay(hd.d);
fflush(stdin);
printf("\nnhap tinh trang:");
scanf("%d",&hd.tinhtrang);
}
void xuathd(HOADON hd)
{
printf("%s %d %d %d %d",hd.mahd,hd.d.ngay,hd.d.thang,hd.d.nam,hd.tinhtran g);
}
void nhapds(HOADON hd[],int &n)
{
printf("nhap so hoa don:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("\nnhap hoa don thu %d:",i+1);
nhaphd(hd[i]);
}
}
void xuatds(HOADON hd[],int n)
{
for(int i=0;i<n;i++)
{
printf("\nhoa don thu %d: ",i+1);
xuathd(hd[i]);
}
}
void thanhtoan1(HOADON hd[],int n)
{
printf("\nhoa don da thanh toan: ");
for(int i=0;i<n;i++)
{
if(hd[i].tinhtrang==1)
xuathd(hd[i]);
}
}
void thanhtoan2(HOADON hd[],int n)
{ printf("\nhoa don chua thanh toan:");
for(int i=0;i<n;i++)
{
if(hd[i].tinhtrang==0)
xuathd(hd[i]);
}
}
void xoaHD(HOADON hd[],int n)
{
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
hd[j]=hd[j+1];
n=n-1;
}

if(hd[i].tinhtrang==1)
printf("hoa don da xoa");
}


void main()
{
clrscr();
HOADON hd[100];int n;
nhapds(hd,n);
xuatds(hd,n);
thanhtoan1(hd,n);
thanhtoan2(hd,n);
xoaHD(hd,n);
getch();
}


kiem tra giùm em,cai đoạn code mà em tô màu đỏ đó tai sao em kiểm tra mà nó hok báo lỗi nhưng trong quá trình chạy thì no' ko chịu xuất ra màn hình.
Anh chị nào pro thì có thể gợi ý cho em "cách xóa những hóa đơn đã thanh toán" trong đoạn code trên.em cảm ơn mấy anh chị trước nha!!!!
gợi ý giùm em câu 2 và câu 3 ở trên.

shinichith25
15-01-2010, 01:08 AM
Doan code ban lam chua duoc chinh xac. Taj sao laj dung tan 2 ham nhap , 2 ham xuat, va de chua cho so luong hang trong hoa don la bao nhieu, hoac dieu kien dj de ket thuc nhap hoa don. Vi du nhu nhap 5 mat hang, hoac nhap ten mat hang la ky tu dau cach thj ngung ko nhap nua.

tientran9668
15-01-2010, 01:42 AM
Doan code ban lam chua duoc chinh xac. Taj sao laj dung tan 2 ham nhap , 2 ham xuat, va de chua cho so luong hang trong hoa don la bao nhieu, hoac dieu kien dj de ket thuc nhap hoa don. Vi du nhu nhap 5 mat hang, hoac nhap ten mat hang la ky tu dau cach thj ngung ko nhap nua.
bạn chạy thử đoạn code của mình chưa?thầy hướng dẫn cho mình là viết vậy đó.bạn co' thể viết giùm mình đoạn code của bài này hok?nếu hok thì bạn có thể gợi ý cho mình câu 2 và câu 3 cũng dc.

meoconlongvang
15-01-2010, 08:07 AM
void XoaHD(HOADON hd[],int &n)
{
int j = 0, n2 = n;

for(int i=0;i<n2;i++)
{
if(hd[i].tinhtrang == 0)
{
hd[j] = hd[i];
j++;
}
else
{
n--;
}
}
}

void XuatHDNo(HOADON hd[],int n)
{
FILE *f = fopen("DSNO.TXT","wt");

for(int i=0;i<n;i++)
{
if(hd[i].tinhtrang == 0)
{
fprintf(f,"%s %02d/%02d/%02d\n",hd[i].mahd,hd[i].d.ngay,hd[i].d.thang,hd[i].d.nam);
}
}

fclose(f);
}

tientran9668
15-01-2010, 09:06 AM
em cảm ơn chị nha,nhưng chị ơi!em đưa đoạn code của chị vào nó vẫn chạy nhưng nó ko hiểu đoạn code của chị để xóa các hóa đơn đã thanh toán. chị thử chạy toàn bộ đoạn code đó dùm e lun đi. thanks.

meoconlongvang
15-01-2010, 10:11 AM
Bạn thử đổi tên hàm "XoaHD" thành "xoaHD" xem. Tại lúc mình code mình ko thích phong cách của java lắm nên mới viết hoa đầu hàm.

PS : tui ko phải là "chị". Chắc mai mốt phải để chữ ký là "I am boy" quá.

tientran9668
15-01-2010, 05:58 PM
Bạn thử đổi tên hàm "XoaHD" thành "xoaHD" xem. Tại lúc mình code mình ko thích phong cách của java lắm nên mới viết hoa đầu hàm.

PS : tui ko phải là "chị". Chắc mai mốt phải để chữ ký là "I am boy" quá.

hiihi!!!
cho e xin loi nha vi e da keu anh bang chi(:P).anh oi em đổi rùi nhưng mà nó cung hok xóa dc những hóa đơn đã thanh toán.anh xem lai dum` em cái vì em rất cần dạng toán này.
mong anh jup' dùm em.

meoconlongvang
15-01-2010, 09:25 PM
Bạn đem code sau khi đã ghép lên xem.

tientran9668
15-01-2010, 10:05 PM
hic!!em ghép lại rùivà sữa đi sữa lại nhìu lần rùi nhưng mà hok có ít lợi ji` cả.anh thử kiểm tra jum` em đi!!

meoconlongvang
15-01-2010, 10:35 PM
Mình luôn test thử trước khi đem code lên. Nó xóa được bình thường mà.

yuki
16-01-2010, 09:05 PM
bạn ơi ở hàm main sau khi ghi dòng xoaHD(hd,n) thì bạn phải thêm dòng xuatds(hd,n) nữa...nó chạy đến lệnh xóa thì phải xuất thêm lần nữa, nó mới hiện ra màn hình cho bạn những hoa đơn còn nợ.

tauit_dnmd
16-01-2010, 10:36 PM
Đoạn code xóa các hóa đơn đã thanh toán nè bạn:


void xoaHD(HOADON hd[],int n)
{
for(int i=0;i<n;i++)
{
if(hd[i].tinhtrang==1)
{
printf("Se xoa hoa don ma so : %s \n",hd[i].mahd);
for(int j=i;j<n-1;j++)
{
hd[j]=hd[j+1];
}
n=n-1;
}
}
}

Cái này tui đã test thử với đoạn code của bạn rồi,chạy đúng yêu cầu,Không sai 1 tí nào

tientran9668
16-01-2010, 11:01 PM
hihi!!!!!!!!!em cám ơn mấy anh rất nhìu,em đã làm rùi.mấy anh là số 1(:-)h