30/09/2018, 19:04

Lỗi hàm trong C cơ bản

mong anh chị giúp đỡ em thấy trong các lần nhập kí tự kiểu dự liệu char thường mắc các lỗi lạ . sau đây là 2 đoạn code của 1 bài toán , 1 dùng hàm if_else , 1 dùng switch_case .mọi người chú ý hàm scanf_s("%c", &x)

#include<stdio.h>
#include<conio.h>
#include<math.h>
void main()
{
	
		
	int  n;
	const int A = 250000, B = 200000, C = 150000;
	 
	char p;
	double t;
	
	printf("nhap so ngay su dung:");
	scanf_s("%d", &n);
	printf("nhap loai phong:");
	scanf_s(" %c", &p,1);
	
	if (p == 'A')
	{
		if (n > 12)
		{
			t = A*n*0.9;
			printf("tien phong:%lf", t);

		}
		else
		{
			t = A*n;
			printf("tien phong:%lf", t);
		}

	}
	else
	{
		if (p == 'B')
		{
			if (n > 12)
			{
				t = B*n*0.92;
				printf("tien phong:%lf", t);

			}
			else
			{
				t = B*n;
				printf("tien phong:%lf", t);
			}
		}


		else
		{
			if (p == 'C')
			{
				if (n > 12)
				{
					t = C*n*0.92;
					printf("tien phong:%lf", t);

				}
				else
				{
					t = C*n;
					printf("tien phong:%lf", t);
				}
			}
		}
	}
	
	
	_getch();
}
/*Tinh tien thue phong khi biet so ngay thue va loai phong (mot trong 3 loai A, B hoac C voi qui dinh nhu sau:
-	Loai A: 250.000 d/ngay
-	Loai B: 200.000 d/ngay
-	Loai C: 150.000 d/ngay
Neu thue qua 12 ngay thi phan tram duoc giam tren tong so tien (tinh theo gia qui dinh) la:
10% cho phong loai A
8 % cho phong loai B hoac C   */
#include "stdio.h"
#include "conio.h"

void main()
{
	const int Don_gia_loai_A=250000, Don_gia_loai_B=200000, Don_gia_loai_C=150000;
	char Loai_phong;
	float So_ngay_thue, Tong_tien;
	// Khoi tao gia tri cho moi don gia
	
	printf("Chuong trinh tinh tien phong cho tung loai phong theo so ngay thue.
Xin quy khach nhap loai phong (A, B, hoac C): ");
	scanf_s(" %c", &Loai_phong,1);
	printf("
Xin nhap vao so ngay thue: ");
	scanf_s("%f", &So_ngay_thue);
	switch (Loai_phong)
	{
	case 'A':
		Tong_tien = Don_gia_loai_A	*	So_ngay_thue;
		if (So_ngay_thue > 12)
			Tong_tien = Tong_tien * 0.9;
		break;
	case 'B':
		Tong_tien = Don_gia_loai_B	*	So_ngay_thue;
		if (So_ngay_thue > 12)
			Tong_tien = Tong_tien * 0.92;
		break;
	case 'C':
		Tong_tien = Don_gia_loai_C	*	So_ngay_thue;
		if (So_ngay_thue > 12)
			Tong_tien = Tong_tien * 0.92;
		break;
	default:
		break;
	}
	printf("
Tong tien thue la: %f", Tong_tien);
	_getch();
}

. bài bằng hàm switch có 1 anh chỉ em thêm 1 vào hàm scanf("%c", &x,1)
còn bài if em em phải thêm 1 và khoảng trắng trước %c mới chạy : scanf_s(" %c", &x,1).
ai có thể cho em biết đây là lổi lập trình do em đúng không và cách khắc phục hiệu quả nhất

LazyCat viết 21:18 ngày 30/09/2018

Bạn thử thêm lệnh fflush(stdin); và trước mỗi lệnh scanf_s() thử xem

ref: http://www.cplusplus.com/reference/cstdio/fflush/

Leng Keng viết 21:04 ngày 30/09/2018

sao bạn không dùng string cho tiện!
dùng char hơi phức tạp!.

anon51853234 viết 21:18 ngày 30/09/2018

do em đang học cơ bản với tự học nên bắt đầu những thứ cơ bản nhất mà thấy lỗi lạ quá nên muốn lên đây hỏi

anon51853234 viết 21:11 ngày 30/09/2018

để em thử xem sao , em cảm ơn

Leng Keng viết 21:18 ngày 30/09/2018

chết mình nhầm! nó là của c++ oy!.

Leng Keng viết 21:17 ngày 30/09/2018

nếu có thể dùng c++ thì bạn tham khảo đoạn code này của mình:

using namespace std;
int main(){
	string i;//tao bien i kieu string
	getline(cin,i);//nhap i
	cout<<"Lenh vua nhap la:"<<i;//in chuoi i ra amn hinh
	return 0;
}```
anon51853234 viết 21:06 ngày 30/09/2018

em cảm ơn anh nhiều , 1 kinh nghiemj hay

Leng Keng viết 21:04 ngày 30/09/2018

mình nghĩ bạn có thể bắt đầu luôn với c++, vì c với c++ không khác j nhau mấy! mà lệnh trong c++ tối ưu hơn(có thể nói là ngắn hơn)!.
còn nếu bạn dùng kiểu char để nhập nhiều kí tự thì bạn phải dùng như đoạn code dưới:

	char hoten[50];//khai bao mang kieu char 50 ki tu
	fflush(stdin);//xoa bo nho pim
	cin.getline(hoten,sizeof (shoten),'\n');///nhap thong tin

còn dùng như bạn hình như chỉ nhập được một kí tự.

anon51853234 viết 21:11 ngày 30/09/2018

n’);///nhap thong tin

dạ , em cảm ơn hjhj , do đang tự học nên nghe nói C là cái căn bản nhất nên em đâm đầu vào trước

Leng Keng viết 21:06 ngày 30/09/2018

umk học chắc một tí , khi em nhảy qua ngôn ngữ khác thì sẽ nhàn hơn, và nhanh hiểu! anh cũng đang tự học java.

anon51853234 viết 21:14 ngày 30/09/2018

anh đang học ngành gì

Leng Keng viết 21:08 ngày 30/09/2018

anh học công nghệ thông tin, năm 2 ở bưu chính

anon51853234 viết 21:18 ngày 30/09/2018

mình tốt nghiệp ngành cơ khí spkt rồi , theo đuổi đam mê thôi cậu , ngành kia đi làm cảm giác k hợp

Leng Keng viết 21:10 ngày 30/09/2018

thế hả! giờ sang nghành này cũng không muộn đâu! bạn cũng thế đăng kí vài khóa dạy lập trình như của aptech hay MIT j đó để biết hướng học. mình học trên trường cũng thế thui, toàn tự giác tìm hiểu là chính! bạn có thể tham khảo trang wed vietjack.com, cũng khá hay! chúc bạn thành công.

anon51853234 viết 21:16 ngày 30/09/2018

ukm , mình cảm ơn nhé

Bài liên quan
0