CHƯƠng 1 : Các khái niệm cơ BẢn của ngôn ngữ C



tải về 230.67 Kb.
trang3/3
Chuyển đổi dữ liệu07.01.2018
Kích230.67 Kb.
#35812
1   2   3
                { t =hv[i] ; hv[i] = hv[j] ; hv[j] = t }
/* ghi lên đĩa */
fseek (fp, 0, SEEK-END);
for ( i=0; ifwrite(&hv[i], size of (KieuHV), 1, fp);
}

CHƯƠNG 8 : TRUYỀN SỐ LIỆU CHO HÀM



1/ Truyền đối số cho hàm main( ) :
- Ví dụ : ta muốn viết một chương trình có tên là Hello.că hello.exe khi chạy trên MS-DOS ta nhập các đối số vào chương trình. Ví dụ : c:> Tom and Jerry ( enter) máy sẽ in ra câu :
Chào Tom and Jerry.
- Viết chương trình trên như sau :
Void main ( int argc, char*argv[ ])
{
......
}
Trong đó :
+ argc : cho biết tổng số đối số truyền vào tính cả tên chương trình đối với ví dụ trên argc = 4. Mỗi đối số truyền vào được xem như là xâu ký tự.
+ mãng argv [ ] sẽ là con trỏ , trỏ lần lượt đến các đối số.
argv[0] -->"Hello"
argv[1] --> "Tom"
argv[2] --> "and"
argv[3] --> "Jerry"
void main ( int argc, char *argv[ ])
{ int i ;
   printf("Chào !");
   for ( i=1 ; i < argc ; i++)
   printf("%s", argv[ i]);
}
2/ Truyền cấu trúc cho hàm - Hàm trên các cấu trúc :
- Chương trình gọi nhập học viên(HV).
- Chương trình bị gọi void nhap ( struct Kiểu HV HV[ ])
Hoặc void nhập (Kiểu HV HV[ ])
- Ví dụ : nhập danh sách lớp :
#include
#include
#include #define N 100
typedef struct
{ char ten[20] ; int tuoi ; float diem ; } kieu HV
/* khai báo hàm nhập dữ liệu*/
void nhap ( int n , Kieu HV HV [ ] )
{int i ; float t;
    for ( i = 0; i< n ; i++)
        { printf ( " Nhập hv thử %d ", i++); scanf(....) }
/* chương trình chính */
main ( )
    { Kieu HV hv[n];
       nhap ( n, hv);
    }
* Hàm có thể trả về giá trị cấu trúc hoặc con trỏ cấu trúc :
+ Ví dụ : Hàm Kieu HV *ptim ( char*ten, KieuHV HV[ ] , int n) : có tác dụng tìm trong danh sách n học viên trong mãng HV[ ] người có tên và hàm trả về con trỏ, trỏ tới người tìm được hoặc trả về NULL nếu không tìm thấy .
+ Hàm Kieu HV tim( char*ten, KieuHV HV[ ], int n); : cũng với mục đích như hàm trên nhưng trả về giá trị của một cấu trúc.
+ Ví dụ :
#include"stdio.h"
#include"conio.h"
#include"string.h"
typedef struct
{ char ten[20] ; int tuổi ; float điểm } Kieu HV ;
Kieu HV *ptim ( char*ten, KieuHV HV[ ] , int n );
Kieu HV tim ( char *ten, Kieu HV hv[ ] , int n );
main( )
{ Kieu HV *p, ds[100],h ; int i, h, n ; char ten[20] ; float diem;
clrscr ( );
printf("\n Số người n = " ) ; scanf ("%d *c ",&n);
for ( i=0 ; i    { printf("\họ tên "); gets(h.Tên) ; /* tự viết lấy*/
       ds[i] = h ;
    }
/* tìm kiếm 1 theo ten dùng hàm ptim*/
while (1)
   { printf ("\n Họ tên người cần tìm"); gets (tên);
      if ((p =ptim ( ten, ds, n)) = = NULL)
          printf("\n không tìm thấy ");
      else
       indanhsach(*p);
   }
/* tìm kiếm theo tên dùng hàm tim*/
while(1)
   { printf("\n Họ tên cần tìm "); gets(ten);
      if ( tim ( ten, ds, n).ten[0] = = 0 )
           printf("\n Không tìm thấy");
      else indanhsach ( tim ( ten, ds, n));
   }
Kieu HV *ptim ( char*ten, Kieu HV hv[ ] , int n)
{ int i ;
for ( i= 0 ; i< n ; ++i)
    if ( strcmp ( ten, hv[i].ten= = )return (&hv[ i]);
          return (NULL);
}
Kieu HV tim (char*ten, Kieu HV hv[ ] , int n)
{ int i ; HV tam ;
   tam.ten[0]=0;
   for ( i=0 ; i     if(strcmp(ten,hv[i].ten = = )) return (hv[i]);
         return ( tam);
}
void indanhsach (Kieu HV p)
{ printf("\n Họ tên % tuổi % điểm %f", p.ten, p.tuổi, p.diêm);
}

CHƯƠNG 8 : TRUYỀN SỐ LIỆU CHO HÀM

1/ Truyền đối số cho hàm main( ) :


- Ví dụ : ta muốn viết một chương trình có tên là Hello.că hello.exe khi chạy trên MS-DOS ta nhập các đối số vào chương trình. Ví dụ : c:> Tom and Jerry ( enter) máy sẽ in ra câu :
Chào Tom and Jerry.
- Viết chương trình trên như sau :
Void main ( int argc, char*argv[ ])
{
......
}
Trong đó :
+ argc : cho biết tổng số đối số truyền vào tính cả tên chương trình đối với ví dụ trên argc = 4. Mỗi đối số truyền vào được xem như là xâu ký tự.
+ mãng argv [ ] sẽ là con trỏ , trỏ lần lượt đến các đối số.
argv[0] -->"Hello"
argv[1] --> "Tom"
argv[2] --> "and"
argv[3] --> "Jerry"
void main ( int argc, char *argv[ ])
{ int i ;
   printf("Chào !");
   for ( i=1 ; i < argc ; i++)
   printf("%s", argv[ i]);
}
2/ Truyền cấu trúc cho hàm - Hàm trên các cấu trúc :
- Chương trình gọi nhập học viên(HV).
- Chương trình bị gọi void nhap ( struct Kiểu HV HV[ ])
Hoặc void nhập (Kiểu HV HV[ ])
- Ví dụ : nhập danh sách lớp :
#include
#include
#include #define N 100
typedef struct
{ char ten[20] ; int tuoi ; float diem ; } kieu HV
/* khai báo hàm nhập dữ liệu*/
void nhap ( int n , Kieu HV HV [ ] )
{int i ; float t;
    for ( i = 0; i< n ; i++)
        { printf ( " Nhập hv thử %d ", i++); scanf(....) }
/* chương trình chính */
main ( )
    { Kieu HV hv[n];
       nhap ( n, hv);
    }
* Hàm có thể trả về giá trị cấu trúc hoặc con trỏ cấu trúc :
+ Ví dụ : Hàm Kieu HV *ptim ( char*ten, KieuHV HV[ ] , int n) : có tác dụng tìm trong danh sách n học viên trong mãng HV[ ] người có tên và hàm trả về con trỏ, trỏ tới người tìm được hoặc trả về NULL nếu không tìm thấy .
+ Hàm Kieu HV tim( char*ten, KieuHV HV[ ], int n); : cũng với mục đích như hàm trên nhưng trả về giá trị của một cấu trúc.
+ Ví dụ :
#include"stdio.h"
#include"conio.h"
#include"string.h"
typedef struct
{ char ten[20] ; int tuổi ; float điểm } Kieu HV ;
Kieu HV *ptim ( char*ten, KieuHV HV[ ] , int n );
Kieu HV tim ( char *ten, Kieu HV hv[ ] , int n );
main( )
{ Kieu HV *p, ds[100],h ; int i, h, n ; char ten[20] ; float diem;
clrscr ( );
printf("\n Số người n = " ) ; scanf ("%d *c ",&n);
for ( i=0 ; i    { printf("\họ tên "); gets(h.Tên) ; /* tự viết lấy*/
       ds[i] = h ;
    }
/* tìm kiếm 1 theo ten dùng hàm ptim*/
while (1)
   { printf ("\n Họ tên người cần tìm"); gets (tên);
      if ((p =ptim ( ten, ds, n)) = = NULL)
          printf("\n không tìm thấy ");
      else
       indanhsach(*p);
   }
/* tìm kiếm theo tên dùng hàm tim*/
while(1)
   { printf("\n Họ tên cần tìm "); gets(ten);
      if ( tim ( ten, ds, n).ten[0] = = 0 )
           printf("\n Không tìm thấy");
      else indanhsach ( tim ( ten, ds, n));
   }
Kieu HV *ptim ( char*ten, Kieu HV hv[ ] , int n)
{ int i ;
for ( i= 0 ; i< n ; ++i)
    if ( strcmp ( ten, hv[i].ten= = )return (&hv[ i]);
          return (NULL);
}
Kieu HV tim (char*ten, Kieu HV hv[ ] , int n)
{ int i ; HV tam ;
   tam.ten[0]=0;
   for ( i=0 ; i     if(strcmp(ten,hv[i].ten = = )) return (hv[i]);
         return ( tam);
}
void indanhsach (Kieu HV p)
{ printf("\n Họ tên % tuổi % điểm %f", p.ten, p.tuổi, p.diêm);
}

CHƯƠNG 9 : DANH SÁCH LIÊN KẾT ( MÓC NỐI)



- Danh sách liên kết : Nếu sử dụng mãng để quản lý danh sách sẽ rất tốn kèm và cứng nhắc trong thao tác ă khắc phục = danh sách liên kết.
- Danh sách liên kết gồm các phần tử . Mỗi phần tử có 2 vùng chính : vùng dữ liệu và vùng liên kết. Vùng liên kết là một hay nhiều con trỏ, trỏ đến các phần tử trước hoặc sau nó tùy thuộc vào yêu cầu của công việc.
- Khai báo danh sách liên kết :
Typedef struct Kieu du lieu
  { ;
   Kiểu dữ liệu < các con trỏ >;
 } Kiểu dữ liệu ;
- Dùng typedef struct kieu du lieu định nghĩa kiểu dữ liệu mới. Trong kiểu dữ liệu này có 2 phần, phần đầu tiên là phần khai báo các trường, phần thứ 2 là các con trỏ, trỏ đến chính kiểu dữ liệu đó, dòng cuối cùng là cần thiết để các con trỏ được phép khai báo chính là kiểu dữ liệu mà các con trỏ đó là thành phần.
- Ví dụ : typedef struct sinhvien
{ char hoten[30] ;
   int diem ;
   struct sinhvien *tiep ;
} sinhvien ;
sinhvien *head ; / con trỏ đặc biệt luôn trỏ tới đầu danh sách*/
- Mỗi một phần tử có một con trỏ, trỏ đến phần tử tiếp theo. Riêng phần tử cuối cùng con trỏ sẽ trỏ đến một kiểu đặc biệt : Kiểu NULL( nghĩa là con trỏ đó không trỏ đến một phần tử nào cả). Ban đầu con trỏ danh sách (head) được gán bằng NULL.
- Ðể cấp phát bộ nhớ, ta cần kiểm tra xem có đủ không ( tránh rối loạn chương trình)
- Ví dụ :
#define size of (sinhvien)
sinhvien *sv
sv=NULL ;
if ((sv = (sinhvien*)malloc (size sv) = = NULL)
   { printf (" không đủ bộ nhớ RAM \n");
      getch ( );
      return ;
   }
- Hàm size of ( kiểu phần tử ) cho kích thước của kiểu phần tử bằng byte.
sv là con trỏ phụ cần thiết cho các thao tác trong chương trình. size sv có kích thước bằng vùng nhớ một phần tử ( nhờ sử dụng hàm size of( )). Cần gán sv = NULL đề phòng sinhvien đang trỏ vào một phần tử của danh sách. Khi thêm vào, chương trình sẽ tự động tìm vị trí thích hợp của phần tử mới. Do trong ngôn ngữ C không định nghĩa kiểu string như trong PASCAL, nên càn dùng hàm so sánh strcmp(st1,st2). Hàm này cho kết quả kiểu int sau khi so sánh st1 và st2 như sau :
< 0 nếu st1 < st2.
= 0 nếu st1 = st2.
> 0 nếu st1 >st2.
- Các trường hợp xảy ra khi thêm một phần tử vào một danh sách :
+ Nếu phần tử mới ở đầu danh sách , cần sửa lại con trỏ head.
+ Nếu đã có phần tử đó, phải lựa chọn liệu có ghi đè lên không?
+ Các trường hợp khác cần sửa lại con trỏ như sau : Giả sử cần chèn phần tử mới vào giữa phần tử 1 và 2 ta có :
......
- Ví dụ : Chương trình qủan lý sinh viên gồm : thêm, bớt, duyệt danh sách, tìm kiếm phần tử
/*********************
Chương trình qủan lý sinh viên
***********************/
#include
#include
#include< stdlib.h>
#include
#include
void taomenu( )
void themsv ( );
void timkiem ( );
void loaibo( );
void danhsach( );
void vitrihv (char st[ ], int d ); /* tìm vị trí hợp lý */
void lietke ( );
#define sizesv size of (sinhvien)
typedef(truct sinhvien)
    { char hoten[30] ;
      int diem ;
      struct sinhvien *tiep ;
    } sinhvien ;
  sinhvien *head;
  sinhvien *sv ;
  void main ( )
     { clrscr ( );
        gotoxy(1,12);
        printf (" chương trình quản lý danh sách sinh viên (DSLK)\n");
        getch ( ) ;
        taomenu ( );
    } /* kết thúc hàm main ( ) */
void taomenu ( )
    { char ch ;
     do
      { clrscr( );
        printf(" thêm sinh viên tìm kiếm loại bỏ liệt kê Quit \n");
        ch = toupper (getch());
        switch (ch)
              { case "I' :themsv() ;break ;
                 case ' I ' : timkiem( ) ; break ;
                 case ' L; : loaibo( ) ;break ;
                 case ' D' : lietke( ) ; break ;
                 case ' Q ' : exit (1) ; break ;
                 default : break ;
            }
  }
while ( ch!= 'Q');
}
void themsv ( )
{ char tensv [30] ; int diem ;
   clrscr ( );
    printf(" thêm sinh viên vào danh sách \n");
    gotoxy(1,10) ; printf(" họ và tên : "); gets( tensv);
     printf("điểm :"); scanf("%d", &diem);
     vitrihv ( tensv, diem);
}
void vitrihv( char st [ ] ) int d )
{ sinhvien *find = NULL , *next = NULL; int kq ; char ch ;
   sv = NULL ;
   if ((sv = ( sinhvien*) malloc ( sizesv )) = = NULL)
        { printf(" không đủ bộ nhớ \n") ; getch( ) ; return }
       strcpy ( svă hoten, st);
      svă diem = d ;
/* nếu danh sách ban đầu là rỗng */
    if ( head = = NULL)
           { head = sv ; headă tiep = NULL ; }
    else
{ /* tìm vị trí mới của phần tử trong danh sách */
          find = head ; next = find ;
           while ((find!=NULL) &&((kq=strcmp(findă hoten, sv ă hoten))< 0)
                   { next = find ; find = findătiep ;}
                   if ( kq = = 0)
                       { printf("sinh viên đã có trong danh sách . Ghi đè (Y/N) ? \n");
                           ch = getch( ); ch = toupper (ch);
                           if (ch = 'N')
                               { free(sv) ; return ; }
                           else
                                  find --> diem = d ;
                             free (sv) ;
                        return ;
                   }
/* nếu phần tử thêm vào đầu danh sách */
              if (find = = head )
                    { sv ă tiep = head ; head = sv ; }
              else { sv ă tiep = find ; next ă tiep = sv ; }
    }
}
void timkiem( )
   { char tensv[30] ; int kq ; clrscr ( );
       printf(" tên sinh viên cần tìm :") ; gets(tensv);
       if((tensv !=" " ) && (head1 = NULL))
            { sv = head ;
               while ((sv! = NULL) &&((kq = strcmp(svăhoten, tensv))< 0)
               sv = sv ă tiep ;
               if(kq = = 0);
                     printf (" Họ và tên %s điểm %d", svăhoten, svă diem);
              else printf (" không có sinh viên %s \n", tensv);
           }
        getch( ) ;
   }
void loaibo( )
{ char tensv [30] ; int kq ; sinhvien *next ;
  clrscr ( )
  printf ( " tên sinh viên cần loại bỏ :"); scanf("%s", tensv );
  iF((tensv!=NULL) && (head!= NULL))
    { sv = head ; next = sv ;
       while ((kq = strcmp (svă hoten, tensv )) < 0)
          { next = sv ; sv = sv ă tiep ; }
          if ( kq = = 0)
             { if ( sv = = head )
                 { head = head ă tiep ; free (sv) ; return ; }
                    next ă tiep = sv ă tiep ;
     free(sv);
                 }
        else
            { printf (" không có tên %s \n", tensv );
      }
  }
}
void lietke( )
{ clrscr( )
sv = head ;
while ( sv! = NULL)
    { printf(" Họ và tên : %s \n" , svăhoten );
        printf(" điểm : %d \n\n", svă diem);
        sv = svătiep ;
    }
    getch( );
  }
Bài tập : Hãy lập trình quản lý sinh viên sử dụng cấu trúc danh sách. Mỗi phần tử cấu trúc như sau : họ và tên, điểm.
Yêu cầu : - In danh sách sinh viên có điểm >= 7.
- Sắp xếp theo điểm .
- Loại bỏ sinh viên nào đó ( nhập tên vào ).





Каталог: 2007
2007 -> Mẫu 01/hc-sn-dn (Ban hành kèm theo Thông tư số 83/2007/tt-btc ngày 16/7/2007 của Bộ Tài chính) TỜ khai hiện trạng sử DỤng nhà, ĐẤt thuộc sở HỮu nhà NƯỚc và ĐỀ xuất phưƠng án xử LÝ
2007 -> BỘ NÔng nghiệP & phát triển nông thôn cục trồng trọt giới Thiệu
2007 -> 10tcn tiêu chuẩn ngành 10tcn 1011 : 2006 giống cà RỐt-quy phạm khảo nghiệm tính khác biệT, TÍnh đỒng nhấT
2007 -> TIÊu chuẩn ngành 10tcn 683 : 2006 giống dưa chuột-quy phạm khảo nghiệM
2007 -> PHÁt triển nông thôN
2007 -> ĐOÀn tncs hồ chí minh
2007 -> List of the countries of the world sorted by total area
2007 -> Số: 962/QĐ-ubnd vĩnh Long, ngày 16 tháng 5 năm 2007
2007 -> Hồ sơ ngành hàng rau quả
2007 -> BẢn cáo bạch domesco vcbs

tải về 230.67 Kb.

Chia sẻ với bạn bè của bạn:
1   2   3




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương