Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 15 kết quả

Đề tài: Cách xử lý khi nhập chuỗi số từ bàn phím

  1. #1
    Ngày gia nhập
    10 2007
    Bài viết
    4

    Mặc định Cách xử lý khi nhập chuỗi số từ bàn phím

    Các bạn cho hỏi làm cách nào để nhập một chuỗi các số thực từ bàn phím mà việc nhập sẽ kết thúc khi ta nhấn phím ESC?
    Cảm ơn trước.

  2. #2
    Ngày gia nhập
    10 2007
    Bài viết
    4

    Mình cần giải quyết vấn đề này khi giải bài toán sau:
    Nhập một dãy số thực từ bàn phím và đếm số số dương, số số âm từ dãy số vừa nhập vào đó. Kết thúc nhập khi nhấn phím ESC.

    Cách mình làm như sau:
    Code:
    #include <stdio.h>
    #include <conio.h>
    
    void main()
    {
    	float a[100];
    	int i, n=0, duong=0, am=0;
    	char ch;
    
    	clrscr();
    	printf("\nNhap day so (ESC de ket thuc):\n");
    	do
    	{
    		ch=getch();
    		if(ch==27) break;
    		scanf("%f", &a[n]);
    		if(a[n]>0) duong++;
    		else if(a[n]!=0) am++;
    		n++;
    	} while(1);
    	printf("\nSo so duong: %d", duong);
    	printf("\nSo so am: %d", am);
    	getch();
    }
    Tuy nhiên làm theo cách này thì khi nhập xong 1 số phải ấn thêm 1 phím khác thì mới nhập được số kế tiếp.

  3. #3
    Ngày gia nhập
    06 2007
    Nơi ở
    một nơi xa xăm...
    Bài viết
    127

    Tuy nhiên làm theo cách này thì khi nhập xong 1 số phải ấn thêm 1 phím khác thì mới nhập được số kế tiếp
    Khi nhập xong bạn không báo cho chương trình biết là bạn đã nhập xong giá trị cho biến đó thì làm sao nó biết.

  4. #4
    Ngày gia nhập
    10 2007
    Bài viết
    4

    Bạn nói rõ hơn được không? Mình mới học C nên chưa biết cách xử lý.
    Thanks.

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Cái này mình nghĩ theo chuẩn thì 1 line 1 dòng rồi enter ! Mình cũng thử tìm cách rồi mà chưa tìm ra :( hic ! Cái này mình nghĩ chắc thuộc về platform của tuỳ vào hệ thống ( OS, WIN, LINUX..) nếu muốn nhập key kiểu như bạn mô tả . Nhưng mình không dám chắc, có gì mình sẽ tìm hiểu thêm và trả lời bạn sau nhé ! Bạn thông cảm !

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Cách xử lý khi nhập chuỗi số từ bàn phím

    Cái này do mình xài getch và cin cùng lúc nên nó sẽ có hiện tượng sau :
    -thằng getch nó lấy vào kí tự trên cùng của buffer, trong khi thằng cin lại lấy toàn bộ buffer hoặc tất cả những gì còn dư lại. Vậy thằng getch nó sẽ block thằng cin cho đến khi nó nhận 1 key khác. Đó là vì sao bạn enter 2 lần mới nhập số được . Mà code lại có dòng lệnh sau :
    Code:
    if(ch==27) break;
    Vậy cứ mỗi lần không phải "ESC" thì nó lại bị mất 1 mỗi cái key stroke cho thằng getch chỗ này ( thậm chí có là số đi nữa cũng vậy )
    Vậy chỗ này mình dùng putch(ch) thêm vào như sau :
    PHP Code:
    ..
           
    ch=getch();
           if(
    ch==27) break;
           
    putch(ch);
           
    scanf("%f", &a[n]);
           if(
    a[n]>0duong++;
           else if(
    a[n]!=0am++;
           
    n++; 
    Để giống như nó là 1 cú nhấp hụt của bạn sau mỗi lần while lặp (i.e thằng getch được gọi) trong trường hợp nếu không phải "ESC" để cứ tiếp thằng cin sẽ được gọi và... nhưng cách này cũng hên xui vì không biết thằng putch(ch) nó lại cho thằng ch cái gì :( ! Thôi mình giải thích cho bạn hiểu cách nó hoạt động còn giải quyết thì chắc chờ DR vậy ^^!

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Hi bạn Terminal, hi vọng bạn còn quan tâm đến cái này. Cuối cùng mình cũng tìm được giải pháp tuyệt vời^^ cho đoạn code của bạn như sau :
    Cách 1

    PHP Code:
    #include <sstream>
    #include <iostream>
    #include <string>
    #include <conio.h>

    bool getInputFromUser(std::string &s)
    {
        
    s=""//Khởi tạo chuỗi rỗng
        
    while(1)
        {
            
    char ch getche();
            if(
    ch == 27)      //Ứng với kí tự ESC
                
    return false
            if(
    ch == 13)     //Ứng với kí tự Enter
                
    return true
            
    += ch;
        }
    }

    int main()
    {
        
    float A[100];
        
    int i,
            
    0,
            
    positive 0,
            
    negative 0;
        
    float iss;
        
    std::string aChar;
        
    std::cout << "\nEnter ESC to end\n";
        while (
    getInputFromUser(aChar))
        {
                
    //Chuyển chuỗi thành kiểu float
                
    std::istringstream iss (aChar,std::istringstream::in);
                
    iss >> A[n];
                if(
    A[n] > 0)
                    
    positive++;
                else if(
    A[n] != 0)
                    
    negative++;
                
    n++;
        };
     
        
    std::cout << "\nPositive numbers : \n" << positive;
        
    std::cout << "\nNegative numbers : \n" << negative;
        
        
    system("pause");
        return 
    0;

    Ta viết 1 hàm kiểu bool để thao tác lại 2 kí tự ESC và ENTER, cái này nếu bạn thích có thể thay đổi để xài với các kí tự khác ví dụ như <backspace>, <delete>, <insert> cũng được.
    Thay vì dùng getch() + putch() để type vào hiện ra thì mình dùng getche(), có ý nghĩa là nhận 1 kí tự từ bàn phím và xuất ra màn hình.
    Sau đó ta dùng istringstream trong thư viện #include <sstream> chuyển chuỗi đó về kiểu bạn cần mà ở đây là "float".

    Cách 2
    Mặc có vẻ đơn giản hơn, nhưng dù gì mình cũng thấy cách 1 logic hơn và hiệu quả hơn, cách này dùng atof chuyển kiểu char[] về số, chỉ đơn giản vậy thui !
    PHP Code:
    #include <iostream>
    #include <string>
    #include <conio.h>
    #include <cstdlib>
    #include <iomanip>

    int main()
    {
        
    float array[100];
        
    int indice 0
            
    0,
            
    positive 0,
            
    negative 0;
        
    char ch;
        
    char userInput[10];
        
    std::cout << "\nEnter ESC to end\n";
        do
        {
            
    ch getche();
            if(
    ch == 27) break;
            if(
    ch == 13)
            {
                
    userInput[indice] = 0;
                
    float number atof(userInput);
                array[
    n] = number;
                
    n++; 
                
    indice 0
            }
            else
            {
                
    userInput[indice] = ch;
                ++
    indice;
            }
        }while(
    1);
        for(
    int i 0<= ni++) std::cout << array[i] << std::setw(3);
        
    system("pause");
        return 
    0;

    Cách này cũng được nhưng nó sẽ không kiểm tra cho mình những kí tự nhập vào, cho nên dẫn đến những kết quả không lường được. Cách này thì chỉ nên tham khảo, nên dùng cách 1.

  8. #8
    Ngày gia nhập
    12 2007
    Bài viết
    11

    Thử hàm này xem nhé :

    PHP Code:
    int i 0;
    while ( 
    kbhit() != 23 )   //<----- kí tự nhấn vào khác ENTER
    {
                
    scanf("%d",&a[i++]);


  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Sorry nếu mình hiểu nhầm ý Xcross nhé. Vì mình nghĩ nếu dùng hàm như Xcross nói thì làm sao xử lý kí tự ESC để thoát nhỉ?

  10. #10
    Ngày gia nhập
    12 2007
    Bài viết
    11

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Sorry nếu mình hiểu nhầm ý Xcross nhé. Vì mình nghĩ nếu dùng hàm như Xcross nói thì làm sao xử lý kí tự ESC để thoát nhỉ?
    Viết nhầm sorry

    sửa thành
    PHP Code:
    kbhit() != 27 // <---- Nếu nó không phải la ESC 

Các đề tài tương tự

  1. Lập trình C++ Lệnh cin.getline() không thể nhập chuỗi kế tiếp khi trước đó đã nhập 1 chuỗi vượt quá số kí tự tối đa khi khai báo
    Gửi bởi alonesnail025 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 23-06-2013, 11:34 AM
  2. Bài tập C++ Cách để so sánh 2 chuỗi kí tự giữa chuỗi nhập từ phím và chuỗi từ file xem có giống nhau không?
    Gửi bởi davilson18 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 09-06-2012, 09:47 AM
  3. Trả lời: 0
    Bài viết cuối: 13-05-2012, 10:51 AM
  4. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  5. Kỹ thuật C++ Các quy tắc nhập chuỗi trong C++, làm thế nào để nhập chuỗi có khoảng trắng?
    Gửi bởi quyen1991 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 20-11-2010, 03:36 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn