30/09/2018, 20:13

Lập trình c cơ bản: viết 2 hàm giải phương trình bậc 1 và bậc 2

e đang làm cái phần bài tập bên hàm (function) cái cái bài tập này.

  • viết 2 hàm giải phương trình bậc 1 và bậc 2
    chương trình yêu cầu người dùng chọn lựa. Chọn 1 thì giải pt bậc 1, chọn 2 thì giải pt bậc 2. e làm tới phần xử lý còn xuất ra e hơi bí bác nào giúp em phần đó với code của e:
#include <stdio.h>
#include <conio.h>

float ptbac1(float a, float b)
{
    printf("nhap vao he so a : "); scanf("%f", &a);
    printf("nhap vao he so b : "); scanf("%f", &b);

    if(a == 0)
    {
        if(b == 0)
            printf("phuong trinh vo nghiem");
        else
            printf("phuong trinh co mot nghiem duy nhat x = %f", -b/2*a);
        return 1;
    }
    return 0;
}

float ptbac2(float a, float b, float c)
{
    printf("nhap vao he so a : "); scanf("%f", &a);
    printf("nhap vao he so b : "); scanf("%f", &b);
    printf("nhap vao he so c : "); scanf("%f", &c);

    if(a != 0)
    {
        float deta = b*b - 4*a*c;

        if(deta > 0)
        {
            float x1 = (-b + sqrt(deta)) / 2*a;
            float x2 = (-b - sqrt(deta)) / 2*a;

            printf("vay phuong trinh co 2 nghiem phan biet la 
");
            printf("x1 = %f 
", &x1);
            printf("x2 = %f", & x2);
        }
        else if(deta == 0)
            printf("phuong trinh vo nghiem");
        else
            printf("phuong trinh co nghiem kep x = %f", -b/2*a);

        return 1;
    }
    return 0;
}
NhatTa viết 22:21 ngày 30/09/2018

Chưa hiểu ý bạn lắm.Theo mình thấy 2 hàm giải phương trình nếu đã xuất kế quả trong hàm thì không cần phải trả về kiểu float cứ để void. Phần chọn lựa thì dùng switch case hoặc if đều được

Phong Le Hung viết 22:17 ngày 30/09/2018

ý e là phần xuất làm thế nào để lựa chọn 1 trong 2 ấy bác, chẳng hạn nhấn 1 là chọn pt bậc 1 còn nhấn 2 là chọn pt bậc 2 dạng như vậy ý

17XGOD viết 22:27 ngày 30/09/2018

PT bậc nhất dạng : ax+b=0 đúng không??

vậy cái if đầu tiên if(a==0) nếu b!=0 thì làm sao mà x=-b/(2*a) được

VD: 1/0 thì sao mà tính được

Ngô Doãn Tuấn viết 22:20 ngày 30/09/2018

nhấn 1 là chọn pt bậc 1 còn nhấn 2 là chọn pt bậc 2

int LuaChon;
do{
// Thông báo chọn 1 là chọn pt bậc 1 , nhấn 2 là chọn pt bậc 2
if(LuaChon==1) Call ptbac1();
else if(LuaChon==2) Call ptbac2();
else Thông báo nhập lựa chọn chưa đúng;
}
while(LuaChon<1||LuaChon>2);

Không biết có phải ý bạn là như vậy không ?
Mình hơi thắc mắc là tại sao lại là bạn lại để hàm ở dạng trả về float

Phong Le Hung viết 22:27 ngày 30/09/2018

vì pt bậc 1 hay pt bậc 2 đều có các số thực nên mình để float để tính luôn các số thực

Jobs Apple Steve viết 22:14 ngày 30/09/2018

thế bạn phải làm menu với swith chứ bạn

Jobs Apple Steve viết 22:25 ngày 30/09/2018
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 int main()
{
 float a=0,b=0,c=0;
    float x=0,y=0;
    float d=0;
    int luachon=1;
    printf("ban muon giai phuong trinh nao vay ban\n\n");
    printf("1. phuong trinh bac 2\n\n");
    printf("2.phuong trinh bac 1\n\n");
    scanf("%d",&luachon);
    switch(luachon)
    {
    case 1:
printf("nhap so a :");
scanf("%f",&a);
printf("nhap so b :");
scanf("%f",&b);
printf("nhap so c :");
scanf("%f",&c);
if(a==0&&b!=0)
{
x=(-c)/(b);
printf("%f",x);
}
else if(a!=0)
{
d=b*b-4*a*c;
if(d==0)
{
x=(-b)/(2*a);
printf("%f",x);
}
else if(d>0)
    {
x=(-b+sqrt(d))/(2*a);
y=(-b-sqrt(d))/(2*a);
printf("%f",x);
printf("%f",y);
}
else
{
printf("phuong trinh vo nghiem\n\n");
}
}
break;
    case 2:
        printf("toi chua lam duoc chuong trinh nay mong ban thong cam a");
}
return 0;
}
Jobs Apple Steve viết 22:14 ngày 30/09/2018

đã viết đã tét cho bạn mà mình khuyên bạn nếu bạn dùng hàm để trả về phương trình bậc 1 thì được còn nếu muốn trả về phương trình bậc 2 có lẽ bạn nên dùng con trỏ vì một hàm chỉ trả vè duy nhất một giá thôi bạn à đấy là thoe ý kiến của mình nha bạn

Jobs Apple Steve viết 22:19 ngày 30/09/2018

@TheSky cho ý kiến cái nào like dạo à

Jobs Apple Steve viết 22:23 ngày 30/09/2018
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
float bacnhat(float a,float b );
 int main()
{
 float a=0,b=0,c=0;
    float x=0,y=0;
    float d=0;
    float u=0,t=0;
    float r=0;
    int luachon=1;
    printf("ban muon giai phuong trinh nao vay ban\n\n");
    printf("1. phuong trinh bac 2\n\n");
    printf("2.phuong trinh bac 1\n\n");
    scanf("%d",&luachon);
    switch(luachon)
    {
    case 1:
printf("nhap so a :");
scanf("%f",&a);
printf("nhap so b :");
scanf("%f",&b);
printf("nhap so c :");
scanf("%f",&c);
if(a==0&&b!=0)
{
x=(-c)/(b);
printf("%f",x);
}
else if(a!=0)
{
d=b*b-4*a*c;
if(d==0)
{
x=(-b)/(2*a);
printf("%f",x);
}
else if(d>0)
    {
x=(-b+sqrt(d))/(2*a);
y=(-b-sqrt(d))/(2*a);
printf("%f",x);
printf("%f",y);
}
else
{
printf("phuong trinh vo nghiem\n\n");
}
}
break;
    case 2:
        printf("moi ban nhap so u nha:\n\n");
        scanf("%f",&u);
        printf("moi ban nhap so t nha:\n\n");
        scanf("%f",&t);
        r=bacnhat(u,t);
        printf("%f",r);
        break;
}
return 0;
}
float bacnhat(float a,float b )
{
    float x=0;
    if(a==0)
    {
        printf("phuong trinh nay vo nghiem roi nha ban");
    }
    else if(a!=0)
    {
        x=(-b)/a;
    }
    return x;
}

đấy là code hoàn chỉnh của mình theo yêu cầu của bạn mình chỉ viết đươc thế này thôi mong bạn góp y s nha mà tiện thể bạn đang học ở đâu vậy mình cũng đang học c ở fpt aptech nha

Phong Le Hung viết 22:22 ngày 30/09/2018

mình chỉ học online thôi ^^ và kiếm ít bài tập để bổ sung ý mà

Jobs Apple Steve viết 22:19 ngày 30/09/2018

banj xem the co duoc khong ban minh moi hoc thoi a

Jobs Apple Steve viết 22:25 ngày 30/09/2018

mong banj chỉ giáo thêm nha đoạn code của mình @phong_le_hung
@TheSky like dạo à chỉ giáo đi ông

Ngô Doãn Tuấn viết 22:18 ngày 30/09/2018

switch(luachon)

Nếu người dùng nhập vào 3 thì sao nhỉ ?

if(a==0)
{
printf(“phuong trinh nay vo nghiem roi nha ban”);
}

Vì hàm trả về kiểu float nếu phương trình vô nghiệm thì làm sao để biết.
Trả về 0. Nhỡ may nghiệm = 0 thì sao ta ???

Jobs Apple Steve viết 22:23 ngày 30/09/2018

ax +b=0 nếu a mà bằng 0 thì chẳng vô nghiệm rồi

Ngô Doãn Tuấn viết 22:17 ngày 30/09/2018

b = 0 thì sao vẫn đúng mà nhỉ :3

Phong Le Hung viết 22:26 ngày 30/09/2018

if(a==0)
{
if(b == 0)
printf(“phuong trinh vo nghiem”);
else
printf("%d", -b/2*a);
}

Ngô Doãn Tuấn viết 22:23 ngày 30/09/2018

Mình sửa lại đoạn code của bạn chút :

if(a==0)
{
if(b == 0)
printf("phuong trinh vo nghiem");
}
else
printf("%d", -b/2*a);

Mình nghĩ thế này chứ nhỉ ?
Thế này vẫn chưa đủ chặt chẽ

Phong Le Hung viết 22:17 ngày 30/09/2018

có gì thiếu bạn chỉ giáo thêm ^^

Nguyễn Văn Lâm viết 22:16 ngày 30/09/2018

Điều kiện pn sai tùm lum và cả đống lỗi nữa rồi.
Bạn tham khảo code này xem sao

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

void LuaChon(int &z);
void GiaiPTBac1(int a, int b);
void GiaiPtBac2(float a, float b, float c);


void Nhap(int &n)
{
	printf("Nhap lan luot cac so cho truoc giai pt = ");
	scanf("%d", &n);
}

void LuaChon(int &z)
{
	int a, b, c;
	printf("************************Menu************************");
	printf("\n1. Giai Pt bac 1\n2. Giai Pt bac 2\nMoi ban Nhap vao lua chon: ");
	scanf("%d", &z);
	if (z == 1)
	{
		Nhap(a); Nhap(b);	
		GiaiPTBac1(a, b);
	}
	else 
	{
		Nhap(a); Nhap(b); Nhap(c);
		GiaiPtBac2(a, b, c);
	}
}

void GiaiPTBac1(int a, int b)
{
	float x;
	if (a == 0)
	{
		if (b == 0)
		{
			printf("\vo so nghiem");
		}
		else 
		{
			printf("\nVo nghiem");
		}
	}
	else 
	{
		x = -b / (float)a;
		printf("x = %f", x);
	}
}

void GiaiPtBac2(float a, float b, float c)
{
	float delta;
	delta = (b * b) - (4 * a * c);
	if (delta > 0)
	{
		printf("sqrt of %f = %f\n", delta, sqrt(delta));
		float x1;
		x1 = (-b + sqrt(delta)) / (2 * a);
		printf("x1 = %f\n", x1);
		float x2;
		x2 = (-b - sqrt(delta)) / (2 * a);
		printf("x2 = %f\n", x2);
	}
	else if	(delta == 0)
	{
		float x;
		x = -b / (2 * a);
		printf("co ngiem kep la %f", x);
	}
	else 
	{
		printf("vo nghiem");
	}
}

int main()
{	
	int n, a, b, z;
	float x; 
	LuaChon(z);

	
	getch();
	return 0;
}


Bài liên quan
0