Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 12
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Code này của mình bị lỗi chỗ nhập xâu, sửa thế nào ạ ?

    Mình chưa hiểu code này sai ở đâu ạ, mình nhập chỗ mã số của mỗi khách hàng đáng nhé ra
    mã số = KH002, còn tên là Nguyen Van A , nhưng mà nó lại nhận vào mã số là KH002NguyenVanA mới chán ợ

    code đây các bác

    Mã:
    #include <iostream>#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <string.h>#define MAX 1000 using namespace std; struct khachhang{  char maso[5];  char ten[30];  char diachi[30];};khachhang a[MAX];int n=0; void MenuChinh();void MenuQuanLyKH();void MenuQuanLySDT();void DanhSachKH();void ThemMoiKH();int timkiem(int x, char t[5]);void ChinhSuaKH();void xoaKH(int vt);void XoaBoKH(); main(){  MenuChinh();} void MenuChinh(){  char c;  fflush(stdin);  do  {    system("CLS");    cout<<"Khi an chon, neu go nhieu so thi lay so dau, vd 123-> chon 1; danh 2345-> chon 2"<<endl;    cout<<"-- QUAN LY THUE BAO DIEN THOAI --"<<endl;    cout<<"================================="<<endl;    cout<<"_ 1. Quan ly Khach hang          "<<endl;    cout<<"_ 2. Quan ly so dien thoai       "<<endl;    cout<<"_ 0. Thoat.                      "<<endl;    cout<<"#Chon: ";    cin>>c;  } while ( !( (c=='0') || (c=='2') || (c=='1')) );  switch (c)  {     case '1': MenuQuanLyKH(); break;     case '2': MenuQuanLySDT(); break;     default: exit(0);  }} void MenuQuanLyKH(){  char c;  fflush(stdin);  do  {    system("CLS");    cout<<"-- QUAN LY THUE BAO DIEN THOAI --"<<endl;    cout<<"Quan ly Khach hang               "<<endl;    cout<<"================================="<<endl;    cout<<"_ 1. Danh sach khach hang        "<<endl;    cout<<"_ 2. Them moi                    "<<endl;    cout<<"_ 3. Chinh sua                   "<<endl;    cout<<"_ 4. Xoa bo                      "<<endl;    cout<<"_ 0. Tro ve menu chinh           "<<endl;    cout<<"#Chon: ";    cin>>c;  } while  ( !( (c>='0') && (c<'5') ) );  switch (c)  {     case '1': DanhSachKH(); break;     case '2': ThemMoiKH(); MenuQuanLyKH(); break;     case '3': ChinhSuaKH(); MenuQuanLyKH(); break;     case '4': XoaBoKH(); MenuQuanLyKH(); break;     default: MenuChinh();  }} void MenuQuanLySDT(){  // phan nay minh chua code a   char c;  fflush(stdin);} void DanhSachKH(){  int i;  char c;  fflush(stdin);  system("CLS");  cout<<"-- QUAN LY THUE BAO DIEN THOAI --"<<endl;  cout<<"Danh sach khanh hang"<<endl;  cout<<"-------------------------------------------------"<<endl;  cout<<"Lan luot cac muc: STT, Ma so, Ten khach hang, Dia chi."<<endl;  if (n==0) cout<<"Hien chua co khach hang nao"<<endl;  for (i=1; i<=n; i++)  {    if (i==15)    {      cout<<"An Enter de tiep tuc in ra tiep"<<endl;      getch();      system("CLS");    }    cout<<i<<", "<<a[i].maso<<", "<<a[i].ten<<", "<<a[i].diachi<<endl;  }  cout<<"-------------------------------------------------"<<endl;  cout<<"1. Them moi | 2. Chinh sua | 3. Xoa bo | 0.Quay ve";  do  {    cout<<endl;    fflush(stdin);    cout<<"#Chon: "; cin>>c;  } while (! (c>='0') && (c<'4') );  switch (c)  {    case '1': ThemMoiKH(); DanhSachKH(); break;    case '2': ChinhSuaKH(); DanhSachKH(); break;    case '3': XoaBoKH(); DanhSachKH(); break;    default : MenuQuanLyKH();  }} int timkiem(int x, char t[5]){  int i;  for (i=1; i<=x; i++)    if ( strcmp(a[i].maso,t)==0 ) return i;  return 0;} void ThemMoiKH(){  char c;  int kt;  system("CLS");  cout<<"-- QUAN LY THUE BAO DIEN THOAI --"<<endl;  cout<<"Them moi khach hang"<<endl;  cout<<"-----------"<<endl;  do  {    n++;    cout<<endl;    do    {      fflush(stdin);      cout<<"_ Ma khach hang: ";      gets(a[n].maso,5);      fflush(stdin);      kt=timkiem(n-1,a[n].maso);      if (kt !=0 )      {        cout<<"Ma da trung, an Enter de nhap lai";        getch();      }    } while (kt!=0);    fflush(stdin);    cout<<"_ Ten khach hang: "; cin.getline(a[n].ten,30);    fflush(stdin);    cout<<"_ Dia chi: "; cin.getline(a[n].diachi,30);    cout<<".........."<<endl;    cout<<"Khach hang moi da duoc them thanh cong !"<<endl;    do    {      fflush(stdin);      cout<<"_ Ban co muon tiep tuc ? (C/K): ";      cin>>c;      c=toupper(c);    } while (!( (c=='K') || (c=='C') ));  } while (c!='K');} void ChinhSuaKH(){  char c;  char maKH[10];  int vt;  system("CLS");  cout<<"-- QUAN LY THUE BAO DIEN THOAI --"<<endl;  cout<<"Sua thong tin khach hang"<<endl;  cout<<"-----------"<<endl;  do  {    do    {      fflush(stdin);      cout<<"_ Nhap ma khach hang can sua: "; cin.getline(maKH,10);      vt=timkiem(n,maKH);      if (vt==0) cout<<"khong tim thay ma."<<endl;    } while (vt==0);    cout<<"Thong tin cu:"<<endl;    cout<<"+ Ten khach hang: "<<a[vt].ten<<endl;    cout<<"+ Dia chi: "<<a[vt].diachi<<endl<<endl;    cout<<"Nhap thong tin moi: "<<endl;    cout<<"+ Ten khach hang: "; cin.getline(a[vt].ten,30);    fflush(stdin);    cout<<"+ Dia chi: "; cin.getline(a[vt].diachi, 30);    cout<<"........."<<endl;    cout<<"Thong tin moi da duoc cap nhat thanh cong !"<<endl;    do    {      fflush(stdin);      cout<<"_ Ban co muon tiep tuc ? (C/K): ";      cin>>c;      c=toupper(c);    } while (!( (c=='K') || (c=='C') ));  } while (c!='K');} void xoaKH(int vt){  int i;  for (i=vt; i<n; i++) a[i]=a[i+1];  n--;} void XoaBoKH(){  char c;  char maKH[10];  int vt;  system("CLS");  cout<<"-- QUAN LY THUE BAO DIEN THOAI --"<<endl;  cout<<"Xoa thong tin khach hang"<<endl;  cout<<"-----------"<<endl;  do  {    do    {      fflush(stdin);      cout<<"_ Nhap ma khach hang can xoa: "; cin.getline(maKH,10);      vt=timkiem(n,maKH);      if (vt==0) cout<<"khong tim thay ma."<<endl;    } while (vt ==0 );    cout<<"Thong tin khach hang:"<<endl;    cout<<"+ Ten khach hang: "<<a[vt].ten<<endl;    cout<<"+ Dia chi: "<<a[vt].diachi<<endl<<endl;    xoaKH(vt);    cout<<"Da xoa thanh cong !"<<endl;    do    {      fflush(stdin);      cout<<"_ Ban co muon tiep tuc ? (C/K): ";      cin>>c;      c=toupper(c);    } while (!( (c=='K') || (c=='C') ));  } while (c!='K');}
    còn mình nghi là sai ở cái hàm nhập người này vào ạ


    Mã:
    void ThemMoiKH(){  char c;  int kt;............    n++;    cout<<endl;    fflush(stdin);    cout<<"_ Ma khach hang: ";    cin.getline(a[n].maso,5); // chỗ cin.get này có lẽ mình đã làm sai gì đó nên cái mã số không đúng được như theo ý mình ợ, mà nếu chỗ này dùng là cin.getline thì nó ra lặp vô hạn, còn dùng gets thì không bị lặp vô hạn nhưng vẫn lỗi như mình đã nói ở đầu topic ạ.    fflush(stdin);    cout<<"_ Ten khach hang: "; cin.getline(a[n].ten,30);    fflush(stdin);    cout<<"_ Dia chi: "; cin.getline(a[n].diachi,30);    cout<<".........."<<endl;    cout<<"Khach hang moi da duoc them thanh cong !"<<endl;.......}

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    maso có là char[5] chỉ chứa được tối đa chuỗi có 4 ký tự, làm sao chứa được "KH002" có 5 ký tự.

    tăng lên thành char[6]

    đổi từ hàm gets(char*) sang cin.getline(char*, int) là đúng rồi, bị cái lỗi trên là vì cin.getline(str, 5) đọc vào 4 ký tự, ký tự thứ 5 ko phải là '
    ' nên nó set failbit cho cin, cin sau dòng này ko xài được nữa.

    sửa bằng cách thêm "mấy" dòng sau cin.getline(str, 6):

    Mã:
    if (cin.fail()) { // hoặc !cin    cin.clear(); //xóa failbit     cin.ignore(100, '
    '); //bỏ qua các ký tự còn dư chưa đọc hết của dòng ký tự hiện tại}

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    cái kia là bị multiple definition, tức là mảng a bị định nghĩa lại nhiều lần. Cách khắc phục:
    1. đừng xài biến toàn cục.
    2. đừng xài global variables.


    - '09' là ký tự. "09" mới là chuỗi ký tự... Với lại nếu chỉ so sánh 2 ký tự đầu có phải là "09" hay ko thì cứ so sánh từng ký tự một: (temp[0] == '0' && temp[1] == '9')
    - mảng trong C/C++ bắt đầu từ 0, nên temp[1] thực chất là ký tự thứ 2
    - trong C/C++ ko có truyền mảng, chỉ có truyền con trỏ, nên char temp[11] thực chất là char* temp

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Thanks bạn nhiều [IMG]images/smilies/smile.png[/IMG], mình đã sửa được chỗ đó rồi. Như hiện giờ mình đang muốn làm 1 bài này ra thành nhiều phần có 1 file là chứa dữ liệu chung là mảng a,n,... là file ctdl.h của cả chương trình. 3 file .h là file thư viện chứ các hàm, các file .cpp là file định nghĩa các hàm trong thư viện hamchung.h, xulyDLKH.h, xulySDT.h
    đây là code của mình
    http://www.fileswap.com/dl/vi0Lz0kGGv/code.rar.html
    Nhưng nó báo là lỗi không tìm thấy cái mảng a, n mặc dù mình đã khai báo thư viện ctdl.h ở các file .h, .cpp khác ?
    đây là lỗi mà code::block báo ạ


    ||=== Build: Debug in dienthoai (compiler: GNU GCC Compiler) ===|
    D:\Dropbox\code\CC++\dienthoai\main.cpp|6|warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]|
    obj\Debug\main.o||In function `_tcf_0':|
    d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\i nclude\c++\iostream|75|multiple definition of `vt'|
    obj\Debug\main.o||In function `_tcf_0':|
    d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\i nclude\c++\iostream|75|multiple definition of `n'|
    obj\Debug\hamchung.o:d:\codeblocks\mingw\bin\..\li b\gcc\mingw32\4.7.1\include\c++\iostream|75|first defined here|
    obj\Debug\main.o||In function `main':|
    D:\Dropbox\code\CC++\dienthoai\main.cpp|8|multiple definition of `a'|
    obj\Debug\hamchung.o:d:\codeblocks\mingw\bin\..\li b\gcc\mingw32\4.7.1\include\c++\bits\basic_ios.h|1 50|first defined here|
    obj\Debug\xulyDLKH.o||In function `_tcf_0':|
    d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\i nclude\c++\iostream|75|multiple definition of `n'|
    obj\Debug\hamchung.o:d:\codeblocks\mingw\bin\..\li b\gcc\mingw32\4.7.1\include\c++\iostream|75|first defined here|
    obj\Debug\xulyDLKH.o||In function `ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12 _Ios_Iostate':|
    d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\i nclude\c++\bits\basic_ios.h|150|multiple definition of `a'|
    obj\Debug\hamchung.o:d:\codeblocks\mingw\bin\..\li b\gcc\mingw32\4.7.1\include\c++\bits\basic_ios.h|1 50|first defined here|
    obj\Debug\xulySDT.o||In function `_tcf_0':|
    d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\i nclude\c++\iostream|75|multiple definition of `vt'|
    obj\Debug\xulySDT.o||In function `ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12 _Ios_Iostate':|
    d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\i nclude\c++\bits\basic_ios.h|150|multiple definition of `a'|
    obj\Debug\hamchung.o:d:\codeblocks\mingw\bin\..\li b\gcc\mingw32\4.7.1\include\c++\bits\basic_ios.h|1 50|first defined here|
    obj\Debug\xulySDT.o||In function `_tcf_0':|
    d:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\i nclude\c++\iostream|75|multiple definition of `n'|
    obj\Debug\hamchung.o:d:\codeblocks\mingw\bin\..\li b\gcc\mingw32\4.7.1\include\c++\iostream|75|first defined here|
    ||=== Build failed: 14 error(s), 1 warning(s) (0 minute(s), 1 second(s)) ===|
    À và thêm nữa là mình đang cần kiểm tra số điện thoại xem có đúng là 2 số đâu là 09 không và độ dài số điện thoại =10, nhưng khi mình dùng hàm cắt xâu để lấy là kí tự thứ 1, 2 của xâu thì bị lỗi, đây là code của hàm mình :
    Mã:
    int checksdt(char temp[11])
    {
      int test=0;
      char dau[3];
      strcpy(dau,temp[1]);
      strcat(dau,temp[2]);
      if ( (strlen(temp) == 10) && (strcmp(dau,'09')==0) ) test=1;
      return test;
    }
    nhưng nó lại báo lỗi ở hàm strcpy và strcmp, vậy lý do là gì nhỉ ?

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi INTP
    cái kia là bị multiple definition, tức là mảng a bị định nghĩa lại nhiều lần. Cách khắc phục:
    1. đừng xài biến toàn cục.
    2. đừng xài global variables.


    - '09' là ký tự. "09" mới là chuỗi ký tự... Với lại nếu chỉ so sánh 2 ký tự đầu có phải là "09" hay ko thì cứ so sánh từng ký tự một: (temp[0] == '0' && temp[1] == '9')
    - mảng trong C/C++ bắt đầu từ 0, nên temp[1] thực chất là ký tự thứ 2
    - trong C/C++ ko có truyền mảng, chỉ có truyền con trỏ, nên char temp[11] thực chất là char* temp
    Tại sao không dùng được biến toàn cục bác nhỉ ?, mình theo mình nghĩ là mình khai báo vào cái thư viện ctdl.h thì nó dùng dữ liệu, biến ở trong đó là phải được chứ nhỉ ?
    Nếu không dùng biến toàn cục thì đổi kiểu gì đây bác ?, chả nhẽ mình sẽ truyền tham số cho từng hàm 1 ạ ?

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi daogiahieu
    Tại sao không dùng được biến toàn cục bác nhỉ ?, mình theo mình nghĩ là mình khai báo vào cái thư viện ctdl.h thì nó dùng dữ liệu, biến ở trong đó là phải được chứ nhỉ ?
    Nếu không dùng biến toàn cục thì đổi kiểu gì đây bác ?, chả nhẽ mình sẽ truyền tham số cho từng hàm 1 ạ ?
    - Đụng tên.
    - Tất nhiên nếu như bạn dùng namespace riêng thì ko sao (bỏ cái using namespace std; đi nhóe).
    -> Vấn đề là C++ mới có namespace, và code bạn toàn C là C.
    Cái này thì bạn tự refactor.

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    biến toàn cục dễ trùng tên => tên phức tạp để tránh trùng => hàm sử dụng biến toàn cục thì phải biết tên phức tạp của biến toàn cục, trong khi viết hàm truyền tham số vào thì đổi tên ngắn gọn được...

    Hơn nữa 1 hàm xài biến toàn cục thì ko re-use được, vd 1 lúc chỉ xài được cho 1 ctdl, nếu phải xài 2 ctdl cùng lúc thì làm sao? Truyền tham số là con trỏ tới ctdl cho từng hàm thì có thể sử dụng ctdl khác nhau, 1 hàm find(ctdl* db, char* name) có thể re-use cho 2 ctdl khác nhau.

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    OK được rồi thanks bác, mình đã hiểu.

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Các bạn ơi, giờ mình muốn đọc cái dữ liệu của người từ tệp, nhưng không hiểu nó toàn bị đọc lệch
    mình muốn đọc theo thứ tự là mã số, tên người, địa chỉ, số các số điện thoại
    đây là file cần đọc

    3
    KH001
    Nguyen Van A
    Ha Noi
    2
    KH002
    Nguyen Van B
    Da Nang
    1
    KH003
    Nguyen Van C
    Hai Phong
    1
    đây là file thông tin về điện thoại của mỗi người

    0973141146
    Tra Sau
    04/05/2010
    0912364489
    Tra Truoc
    12/6/2010
    0924325543
    Tra Sau
    5/8/2011
    0954234789
    Tra Sau
    1/52013
    đây là code của mình phần đọc đó
    Mã:
    void DocTep()
    {
      int i, j;
      ifstream fin("customer.dat", ios::in);
      ifstream fin2("number.dat", ios::in);
      if ( (fin) && (fin2) )
      {
        fin>>n;
        for (i=1; i<=n; i++)
        {
          fin.clear(); fin.getline(a[i].maso, StrMAX);
          fin.clear(); fin.getline(a[i].ten, StrMAX);
          fin.clear(); fin.getline(a[i].diachi, StrMAX);
          fin.clear(); fin>>a[i].soluong;
          for (j=1; j<=a[i].soluong; j++)
          {
            fin2.clear(); fin2.getline(a[i].sodt[j].sdt, StrMAX);
            fin2.clear(); fin2.getline(a[i].sodt[j].loaithuebao, StrMAX);
            fin2.clear(); fin2.getline(a[i].sodt[j].ngaydangky, StrMAX);
          }
        }
      }
      fin.close(); fin2.close();
    }
    và kết quả (


    còn phần số điện thoại nó chả đọc được tý nào mới chán (

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Các bạn ơi, chỉnh hộ mình phần đọc dữ liệu từ file với ạ, mình ngồi viết hết các hàm xử lý dữ liệu rồi mà còn phần đọc này mãi vẫn chưa chỉnh được ạ.

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •