30/09/2018, 20:22

Chương trình đọc một số nguyên dương có tối đa 9 chữ số!

Xin chào các bạn nhé! Thật ra mình mới làm xong 1 bài tập là viết 1 chương trình có thể đọc được 1 số có tối đa 9 chữ số (còn số âm thì nó vẫn đọc ra số nguyên dương). Do hơi dài nên mình hỏi ý kiến các bạn xem chương trình mình có lỗi hay lổ hổng nào không nhé

#include <stdio.h>// *Important: Variable " const "
#include <limits.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#include <Windows.h>
int main()
{
    int x;
    printf("Type a number: ");
    scanf("%d", &x);
    int digit = log10((float)x) + 1;
    if (digit > 9)
        printf("Can not handle
");
    else
    {
        // Xet 9 chu so
        if (digit == 9)
        {
            int temp = x / 100000000;
            if (temp == 1)
                printf("Mot tram ");
            else if (temp == 2)
                printf("Hai tram ");
            else if (temp == 3)
                printf("Ba tram ");
            else if (temp == 4)
                printf("Bon tram ");
            else if (temp == 5)
                printf("Nam tram ");
            else if (temp == 6)
                printf("Sau tram ");
            else if (temp == 7)
                printf("Bay tram ");
            else if (temp == 8)
                printf("Tam tram ");
            else if (temp == 9)
                printf("Chin tram ");
            digit--;
            x %= 100000000;
        }
        // Xet 8 chu so
        if (digit == 8)
        {
            int temp = x / 10000000;
            if (temp == 1)
                printf("muoi ");
            else if (temp == 2)
                printf("hai muoi ");
            else if (temp == 3)
                printf("ba muoi ");
            else if (temp == 4)
                printf("bon muoi ");
            else if (temp == 5)
                printf("nam muoi ");
            else if (temp == 6)
                printf("sau muoi ");
            else if (temp == 7)
                printf("bay muoi ");
            else if (temp == 8)
                printf("tam muoi ");
            else if (temp == 9)
                printf("chin muoi ");
            digit--;
            x %= 10000000;
        }
        // Xet 7 chu so
        if (digit == 7)
        {
            int temp = x / 1000000;
            if (temp == 1)
                printf("mot trieu ");
            else if (temp == 2)
                printf("hai trieu ");
            else if (temp == 3)
                printf("ba trieu ");
            else if (temp == 4)
                printf("bon trieu ");
            else if (temp == 5)
                printf("nam trieu ");
            else if (temp == 6)
                printf("sau trieu ");
            else if (temp == 7)
                printf("bay trieu ");
            else if (temp == 8)
                printf("tam trieu ");
            else if (temp == 9)
                printf("chin trieu ");
            digit--;
            x %= 1000000;
        }
        // Xet 6 chu so
        if (digit == 6)
        {
            int temp = x / 100000;
            if (temp == 1)
                printf("mot tram ");
            else if (temp == 2)
                printf("hai tram ");
            else if (temp == 3)
                printf("ba tram ");
            else if (temp == 4)
                printf("bon tram ");
            else if (temp == 5)
                printf("nam tram ");
            else if (temp == 6)
                printf("sau tram ");
            else if (temp == 7)
                printf("bay tram ");
            else if (temp == 8)
                printf("tam tram ");
            else if (temp == 9)
                printf("chin tram ");
            digit--;
            x %= 100000;
        }
        // Xet 5 chu so
        if (digit == 5)
        {
            int temp = x / 10000;
            if (temp == 1)
                printf("muoi ");
            else if (temp == 2)
                printf("hai muoi ");
            else if (temp == 3)
                printf("ba muoi ");
            else if (temp == 4)
                printf("bon muoi ");
            else if (temp == 5)
                printf("nam muoi ");
            else if (temp == 6)
                printf("sau muoi ");
            else if (temp == 7)
                printf("bay muoi ");
            else if (temp == 8)
                printf("tam muoi ");
            else if (temp == 9)
                printf("chin muoi ");
            digit--;
            x %= 10000;
        }
        // Xet 4 chu so
        if (digit == 4)
        {
            int temp = x / 1000;
            if (temp == 1)
                printf("mot ngan ");
            else if (temp == 2)
                printf("hai ngan ");
            else if (temp == 3)
                printf("ba ngan ");
            else if (temp == 4)
                printf("bon ngan ");
            else if (temp == 5)
                printf("nam ngan ");
            else if (temp == 6)
                printf("sau ngan ");
            else if (temp == 7)
                printf("bay ngan ");
            else if (temp == 8)
                printf("tam ngan ");
            else if (temp == 9)
                printf("chin ngan ");
            digit--;
            x %= 1000;
        }
        //Xet 3 chu so
        if (digit == 3)
        {
            int temp = x / 100;
            if (temp == 1)
                printf("mot tram ");
            else if (temp == 2)
                printf("hai tram ");
            else if (temp == 3)
                printf("ba tram ");
            else if (temp == 4)
                printf("bon tram ");
            else if (temp == 5)
                printf("nam tram ");
            else if (temp == 6)
                printf("sau tram ");
            else if (temp == 7)
                printf("bay tram ");
            else if (temp == 8)
                printf("tam tram ");
            else if (temp == 9)
                printf("chin tram ");
            digit--;
            x %= 100;
        }
        // Xet 2 chu so
        if (digit == 2)
        {
            int temp = x / 10;
            if (temp == 1)
                printf("muoi ");
            else if (temp == 2)
                printf("hai muoi ");
            else if (temp == 3)
                printf("ba muoi ");
            else if (temp == 4)
                printf("bon muoi ");
            else if (temp == 5)
                printf("nam muoi ");
            else if (temp == 6)
                printf("sau muoi ");
            else if (temp == 7)
                printf("bay muoi ");
            else if (temp == 8)
                printf("tam muoi ");
            else if (temp == 9)
                printf("chin muoi ");
            digit--;
        }
        // Xet 1 chu so
        if (digit == 1)
        {
            int temp = x % 10;
            if (temp == 1)
                printf("mot");
            else if (temp == 2)
                printf("hai");
            else if (temp == 3)
                printf("ba");
            else if (temp == 4)
                printf("bon");
            else if (temp == 5)
                printf("lam");
            else if (temp == 6)
                printf("sau");
            else if (temp == 7)
                printf("bay");
            else if (temp == 8)
                printf("tam");
            else if (temp == 9)
                printf("chin");
        }
    }
    getch();
    return 0;
}

Cảm ơn nhiều nhé!

Bé tập Code viết 22:28 ngày 30/09/2018
  • Không nên dùng scanf, không an toàn
  • log10 trả về kiểu Double không nên gán thẳng vào biến kiểu int
  • Input là 0 thì chương trình cho ra gì ???
  • Không nên dùng getch, nếu bộ đệm bị tràn thì getch mất tác dụng, nên dùng system(“pause”)
  • Code dài

Sơ qua là vậy

Người bí ẩn viết 22:32 ngày 30/09/2018

Không nên dùng scanf, không an toàn

Sao k an toàn bạn?[quote=“BetapCode, post:2, topic:24105”]
log10 trả về kiểu Double không nên gán thẳng vào biến kiểu int
[/quote]

Cái này k ép float nó lỗi

Không nên dùng getch, nếu bộ đệm bị tràn thì getch mất tác dụng, nên dùng system(“pause”)

Mình đang học C mà :D[quote=“BetapCode, post:2, topic:24105”]
Code dài
[/quote]

Cái đó mình làm ngắn nhất có thể rồi, theo hướng dẫn anh Nguyễn Việt Nam Sơn. Nếu có cách khác bạn chỉ mình nhé :)[quote=“BetapCode, post:2, topic:24105”]
Input là 0 thì chương trình cho ra gì ???
[/quote]

Cái đó thì đặt thêm 1 cái if nữa là

else if (n == 0)
     printf("Khong");
Bé tập Code viết 22:24 ngày 30/09/2018
  • scanf hoặc là gets dễ gây bug và thời nay người ta không dùng nữa, bạn search google đọc thêm.

  • Bạn phải dùng floor để ép kiểu giá trị trả về của log10 (vốn là double) rồi mới gán vào int. Với lại log10 parameter có kiểu double không phải kiểu float (mình nhớ là vậy), bạn google lại.

    Sao chương trình của bạn không cover luôn trường hợp số âm ???

    int digit = log10((float)x) + 1;
    

đổi thành

  int digit= floor(log10(abs(x))) + 1;
  • Bạn chạy trên Windows thì dùng system("pause") để dừng console, không cứ là ngôn ngữ nào.

  • Bạn có thể dùng đệ qui để chương trình của bạn ngắn hơn, lúc viết code nếu bạn cảm nhận được sự lặp lại và qui luật thì bạn có thể nghĩ đến đệ qui. Nếu không được vậy thì chia thành các hàm nhỏ nhìn code cho gọn.

  • Input là 0 chương trình sẽ bug ngay đoạn tính log10, cho thêm else if cũng không có tác dụng.

p/s: mình mới tập code chém gió vậy thôi không show code khác ra cho bạn được đâu, bạn tự nghĩ theo hướng đó nhé.

Người bí ẩn viết 22:30 ngày 30/09/2018

Chém gió thành bão ak Nói chung mình mới học lập trình nên k biết nhiều thuật ngữ lắm. Đang học căn bản mà.
Mình thử cho else if có tác dụng nhé

Bé tập Code viết 22:31 ngày 30/09/2018

Hiện ra thông tin bạn muốn không chắc là nó đúng.

Bạn cho một dòng in ra digit và nhập vào số 0 xem digit bằng bao nhiêu nhé.

Người bí ẩn viết 22:36 ngày 30/09/2018

thì nhập số 0 nó đọc Khong đúng mà?

sang le viết 22:37 ngày 30/09/2018

int digit = log10((float)x) + 1;

mình chưa hiểu dòng này, bạn giải thích được không

int temp = x / 100000000;

dòng này nữa

mình mới học nên còn kém lắm!

Người bí ẩn viết 22:23 ngày 30/09/2018

Vãi. Mình hỏi bài lại bị hỏi lại Nhân tiện giải thích cho bạn luôn nhé![quote=“ga_ve_C, post:8, topic:24105”]
int digit = log10((float)x) + 1;
[/quote]

Dòng này nghĩa là tạo 1 biến digit kiểu dữ liệu int . Hàm log10() dùng để kiểm tra xem số x có bao nhiêu chữ số. Nhưng vì kiểu dữ liệu là integer nên nó chỉ lấy phần nguyên, phải + 1. Mà phải ép kiểu (float) cho x mới được nhé. Học hết playlist C anh Đạt sẽ hiểu

int temp = x / 100000000;

Cái này là logic lập trình thôi

Duy Du Kích viết 22:30 ngày 30/09/2018

hì. cho mình hỏi bạn học năm mấy rồi mà kiến thức thâm sâu quá v

Bé tập Code viết 22:34 ngày 30/09/2018

Sax tên Bé tập Code là hiểu rồi, tớ mới học mấy bữa à bạn

Lạc Vào Bóng Đêm viết 22:26 ngày 30/09/2018

Tình cờ đi ngang qua thôi cho bạn câu trả lời: Bài bạn theo trình tự thì đúng rồi đấy ok nhưng còn điểm thiếu và điểm thừa:
Điểm thiếu: không xét đk temp == 0; không xét đk hàng triệu, ngàn, đơn vị nếu temp từ 2 - 9 đọc mốt làm vậy thì có nền tảng hơn, không thì cũng được do nó không hổ trợ Tiếng Việt.
Điểm thừa: Thư viện: #include <limits.h>, #include <stdlib.h>, #include <string.h>, #include <ctype.h>, #include <Windows.h>.
Nếu bạn đã học vòng lặp thì ngon hơn:

#include <stdio.h>
#include <conio.h>
#include <math.h>

int main()
{
	int n;
	do{
		printf("\n- Nhap n: ");
		scanf("%d", &n);
		if (n < 0)
		{
			printf("\nNhap so sai: ( n >= 0)");
		}
	} while (n < 0);
	int sochuso = log10((double)n) + 1, x = n, daonguoc = 0, dem = sochuso, dem1 = sochuso;
	dem--;
	while (x != 0)
	{
		int chuso = x % 10;
		daonguoc += chuso * pow(10.0, dem--);
		x /= 10;
	}
	while (daonguoc != 0)
	{
		int chuso = daonguoc % 10;
		if (chuso == 0)
		{
			printf("Khong ");
		}
		else if (chuso == 1)
		{
			printf("Mot ");
		}
		else if (chuso == 2)
		{
			printf("Hai ");
		}
		else if (chuso == 3)
		{
			printf("Ba ");
		}
		else if (chuso == 4)
		{
			printf("Bon ");
		}
		else if (chuso == 5)
		{
			printf("Nam ");
		}
		else if (chuso == 6)
		{
			printf("Sau");
		}
		else if (chuso == 7)
		{
			printf("Bay ");
		}
		else if (chuso == 8)
		{
			printf("Tam ");
		}
		else if (chuso == 9)
		{
			printf("Chin ");
		}
		if (dem1 == 9)
		{
			printf("Tram ");
			dem1--;
		}
		else if (dem1 == 8)
		{
			if (chuso == 1)
			{
				printf("\b\b\b\bMuoi ");
				dem1--;
			}
			else
			{
				printf("Muoi ");
				dem1--;
			}
		}
		else if (dem1 == 7)
		{
			printf("Trieu ");
			dem1--;
		}
		else if (dem1 == 6)
		{
			printf("Tram ");
			dem1--;
		}
		else if (dem1 == 5)
		{
			if (chuso == 1)
			{
				printf("\b\b\b\bMuoi ");
				dem1--;
			}
			else
			{
				printf("Muoi ");
				dem1--;
			}
		}
		else if (dem1 == 4)
		{
			printf("Nghin ");
			dem1--;
		}
		else if (dem1 == 3)
		{
			printf("Tram ");
			dem1--;
		}
		else if (dem1 == 2)
		{
			if (chuso == 1)
			{
				printf("\b\b\b\bMuoi ");
				dem1--;
			}
			else
			{
				printf("Muoi ");
				dem1--;
			}
		}
		else if (dem1 == 1)
		{
			printf("\b.");

		}
		daonguoc /= 10;
	}

	getch();
	return 0;
}

Chỉ áp dụng cho những bạn nhập môn thôi nha!

Bài liên quan
0