Hỏi/ Thắc mắc - Nhờ các pro xem xét giúp em đoạn code lập trình C | VN-Zoom | Cộng đồng Chia Sẻ Kiến Thức Công Nghệ và Phần Mềm Máy Tính

Adblocker detected! Please consider reading this notice.

We've detected that you are using AdBlock Plus or some other adblocking software which is preventing the page from fully loading.

We need money to operate the site, and almost all of it comes from our online advertising.

Please add vn-z.vn to your ad blocking whitelist or disable your adblocking software. 

All the knowledge we share is completely free. If you are willing, please support us here.

×

Hỏi/ Thắc mắc Nhờ các pro xem xét giúp em đoạn code lập trình C

dangthaihoc

Búa Gỗ Đôi
Em đang tập tành học lập trình C. Em có viết đoạn code sau, nhưng khi chạy CT in ra KQ bị sai. mọi người chỉ giáo giúp em ạ
#include "conio.h"
#include "stdio.h"
#include "math.h"
float n[],sa,sd,a,d;
int i,j,k;
main()
{
tt:
printf("\nBan dinh nhap day so co bao nhieu so: ");
scanf("%d",&k);
printf("\nVui long nhap mot day so bat ky, cac so cach nhau boi dau cach hoac enter \n");
i=0;j=0;sa=0;sd=0;a=0,d=0;
do
scanf("%f",&n);
while (++i,i<k);

for(j=0;j<i;j++) //Vòng lặp tính trung bình cộng
{
if (n[j] > 0)
{
sd = sd + n[j];
++d;

}
else
{
sa = sa + n[j];
++a;
}
}
printf("\nTrung binh cong cac so am la: %0.2f",sa/a);
printf("\nTrung binh cong cac so duong la: %0.2f",sd/d);
printf("\n===================================================");
printf("\nBan co muong tiep tuc c/k (co/khong): ");
if (getche()=='c'||getche()=='C') goto tt;
printf("\n===================================================");

}

1.png
 
Sửa lần cuối:

dammage

Rìu Chiến
lần sau bạn nên bỏ code vô trong tag code, để như vậy vừa khó đọc mà vừa bị hiển thị sai, cái n[i ] chỗ vòng do while bị forum hiểu thành là tag in nghiêng nên nó bị mất, làm tui tưởng bạn bị thiếu chỗ đó

ngôn ngữ c theo đúng chuẩn thì khai báo mảng phải có số phần tử rõ ràng, tui chỉ sửa lại 2 chỗ như trong hình thôi, kết quả như sau
Untitled.jpg


ngoài ra còn 1 lỗi nữa, bạn phải kiểm tra a với d có bằng 0 hay không rồi mới chia trung bình, lỡ người dùng nhập vào mảng toàn dương hoặc toàn âm thì sẽ bị lỗi chia 0, code này tui sửa luôn chỗ đó nè, xài toán tử ?:
C:
#include "conio.h"
#include "stdio.h"
#include "math.h"

/*
- Nhập dãy số bất kỳ
- Chạy vòng lặp for (i=0;;i++)
xét điều kiện từng số một
+nếu số âm cộng tổng vào biến sa
+nếu số dương cộng tổng vào viến sd
- tính trung bình = sa/(i+1) & sd/(i+1)
- in KQ ra màn hình
*/

float n[100],sa,sd,a,d;
int i,j,k;

main()
{
tt:
    printf("\nBan dinh nhap day so co bao nhieu so: ");
    scanf("%d",&k);
    printf("\nVui long nhap mot day so bat ky, cac so cach nhau boi dau cach hoac enter \n");
    i=0;j=0;sa=0;sd=0;a=0,d=0;
    do
        scanf("%f",&n[i]);
    while (++i,i<k);

    for(j=0;j<i;j++) //Vòng lặp tính trung bình cộng
    {
        if (n[j] > 0)
        {
            sd = sd + n[j];
            ++d;
        }
        else
        {
            sa = sa + n[j];
            ++a;
        }
    }

    printf("\nTrung binh cong cac so am la: %0.2f",(a>0)?sa/a:0);
    printf("\nTrung binh cong cac so duong la: %0.2f",(d>0)?sd/d:d);
    printf("\n===================================================");
    printf("\nBan co muong tiep tuc c/k (co/khong): ");
    if (getche()=='c'||getche()=='C') goto tt;
    printf("\n===================================================");
}
 
Sửa lần cuối:

dangthaihoc

Búa Gỗ Đôi
lần sau bạn nên bỏ code vô trong tag code, để như vậy vừa khó đọc mà vừa bị hiển thị sai, cái n[i ] chỗ vòng do while bị forum hiểu thành là tag in nghiêng nên nó bị mất, làm tui tưởng bạn bị thiếu chỗ đó

ngôn ngữ c theo đúng chuẩn thì khai báo mảng phải có số phần tử rõ ràng, tui chỉ sửa lại 2 chỗ như trong hình thôi, kết quả như sau
Untitled.jpg


ngoài ra còn 1 lỗi nữa, bạn phải kiểm tra a với d có bằng 0 hay không rồi mới chia trung bình, lỡ người dùng nhập vào mảng toàn dương hoặc toàn âm thì sẽ bị lỗi chia 0, code này tui sửa luôn chỗ đó nè, xài toán tử ?:
C:
#include "conio.h"
#include "stdio.h"
#include "math.h"

/*
- Nhập dãy số bất kỳ
- Chạy vòng lặp for (i=0;;i++)
xét điều kiện từng số một
+nếu số âm cộng tổng vào biến sa
+nếu số dương cộng tổng vào viến sd
- tính trung bình = sa/(i+1) & sd/(i+1)
- in KQ ra màn hình
*/

float n[100],sa,sd,a,d;
int i,j,k;

main()
{
tt:
    printf("\nBan dinh nhap day so co bao nhieu so: ");
    scanf("%d",&k);
    printf("\nVui long nhap mot day so bat ky, cac so cach nhau boi dau cach hoac enter \n");
    i=0;j=0;sa=0;sd=0;a=0,d=0;
    do
        scanf("%f",&n[i]);
    while (++i,i<k);

    for(j=0;j<i;j++) //Vòng lặp tính trung bình cộng
    {
        if (n[j] > 0)
        {
            sd = sd + n[j];
            ++d;
        }
        else
        {
            sa = sa + n[j];
            ++a;
        }
    }

    printf("\nTrung binh cong cac so am la: %0.2f",(a>0)?sa/a:0);
    printf("\nTrung binh cong cac so duong la: %0.2f",(d>0)?sd/d:d);
    printf("\n===================================================");
    printf("\nBan co muong tiep tuc c/k (co/khong): ");
    if (getche()=='c'||getche()=='C') goto tt;
    printf("\n===================================================");
}
Cám ơn bạn nhiều!
 

Handrf

Kiếm đá
lần sau nhớ up cái đề nữa nhé bạn. code không thôi thì nhìn phát chóng mặt liền
 

dangthaihoc

Búa Gỗ Đôi
lần sau nhớ up cái đề nữa nhé bạn. code không thôi thì nhìn phát chóng mặt liền
bạn ơi, làm phiền bạn tiếp giúp mình đoạn code này
C:
/*
Đề bài:
tính e^x theo cthuc:
e^x = 1+ x/1! + ... + x^n/n!
Chọn n sao cho
x^n/n! < 0.00001
*/
#include "conio.h"
#include "stdio.h"
#include "math.h"

main()
{
int i,j;
float gt,ex,x;
tt:
    printf("Chao mung ban den voi chuong trinh tinh e^x");
    printf("\nVui long nhap so mu:");
    scanf("%f",&x);
    for (i=1,ex=1;;++i)
    {
        for (j=1;j<i;++j)// Tính i!
        {
            gt=1;
            gt=gt*j;
        }
    if (pow(x,i)/gt < 0.00001) //xét điều kiện
    break;
    else
    ex = ex + pow(x,i)/gt;     //Tính ex
    }
    printf("e^%0.2f = %0.2f",x,ex);
    printf("\nBan co muong tiep tuc c/k (co/khong): ");
    if (getche()=='c'||getche()=='C') goto tt;
}
 

Handrf

Kiếm đá
C:
#include "conio.h"
#include "stdio.h"
#include "math.h"

main()
{
int i,j;
float gt,ex,x;
tt:
    printf("Chao mung ban den voi chuong trinh tinh e^x");
    printf("\nVui long nhap so mu:");
    scanf("%f",&x);
    for (i=1,ex=1;;++i)
    {
        gt = 1;
        for (j=1;j<=i;++j)// Tính i!
        {
            gt=gt*j;
        }
    if (pow(x,i)/gt < 0.00001) //xét điều kiện
        break;
    else
        ex = ex + pow(x,i)/gt;     //Tính ex
    }
    printf("e^%0.2f = %0.2f",x,ex);
    printf("\nBan co muong tiep tuc c/k (co/khong): ");
    if (getche()=='c'||getche()=='C') goto tt;
}

bạn check giúp mình. mình có sửa lại chút chỗ gt=1 với j <= i thôi
 

dangthaihoc

Búa Gỗ Đôi
C:
#include "conio.h"
#include "stdio.h"
#include "math.h"

main()
{
int i,j;
float gt,ex,x;
tt:
    printf("Chao mung ban den voi chuong trinh tinh e^x");
    printf("\nVui long nhap so mu:");
    scanf("%f",&x);
    for (i=1,ex=1;;++i)
    {
        gt = 1;
        for (j=1;j<=i;++j)// Tính i!
        {
            gt=gt*j;
        }
    if (pow(x,i)/gt < 0.00001) //xét điều kiện
        break;
    else
        ex = ex + pow(x,i)/gt;     //Tính ex
    }
    printf("e^%0.2f = %0.2f",x,ex);
    printf("\nBan co muong tiep tuc c/k (co/khong): ");
    if (getche()=='c'||getche()=='C') goto tt;
}

bạn check giúp mình. mình có sửa lại chút chỗ gt=1 với j <= i thôi
Cám ơn bạn!
 

dangthaihoc

Búa Gỗ Đôi
bạn cho mình hỏi thêm, tại sao chỗ này của mình nó bị lỗi ở dòng nhập dãy số thứ 3 và dòng lệnh ra bị lỗi???
C:
/*
- nhập 4 dãy số
- tìm min,max của 4 số có cùng chỉ số
- in ra màn hình theo trình tự: ai bi ci di min max
- sử dụng mảng 1 chiều
*/
#include "stdio.h"
#include "conio.h"
float a[100],b[100],c[100],d[100];
float min,max;
int n,i,j,k,l;
int m;
main()
{
tt:
    //Nhập 4 dãy số liệu vào 4 mảng 1 chiều
    printf("Moi day so thu nhat bao gom bao nhieu chu so: ");
    scanf("%d",&n);
    printf("Day 1 la:\n");
    for(i=n-1;i>=0;--i) scanf("%f",&a[i]);
    printf("Day 2 la:\n");
    for(j=n-1;j>=0;--j) scanf("%f",&b[j]);
    printf("Day 3 la:\n");
    for(k=n-1;k>=0;--k) scanf("%f",&c[k]);
    printf("Day 4 la:\n");
    for(l=n-1;l>=0;--l) scanf("%f",&d[l]);
    //Tìm min,max
    for (m=n-1;m>=0;--m)
    {
        min=a[m];
        if (min > b[m]) min=b[m];
        if (min > c[m]) min=c[m];
        if (min > d[m]) min=d[m];
        max=a[m];
        if (max < b[m]) max=b[m];
        if (max < c[m]) max=c[m];
        if (max < d[m]) max=d[m];
        printf("\n %0.2f  %0.2f  %0.2f  %0.2f  %0.2f  %0.2f",a[m],b[m],c[m],d[m],min,max);

    }
    printf("\nBan co muong tiep tuc c/k (co/khong): ");
    if (getche()=='c'||getche()=='C') goto tt;
}
1.jpg

sau khi thêm câu lệnh fflush(stdin) vào mình ms điền được dãy 3???
- Thứ hai nữa là ở các câu lệnh có các dấu >= hay <= mình nghĩ phải thay bằng các dấu > hay < nhưng máy chạy ra lại bị sai????
 
Sửa lần cuối:

dammage

Rìu Chiến
bạn cho mình hỏi thêm, tại sao chỗ này của mình nó bị lỗi ở dòng nhập dãy số thứ 3 và dòng lệnh ra bị lỗi???
C:
/*
- nhập 4 dãy số
- tìm min,max của 4 số có cùng chỉ số
- in ra màn hình theo trình tự: ai bi ci di min max
- sử dụng mảng 1 chiều
*/

#include "stdio.h"
#include "conio.h"

int a[100],b[100],c[100],d[100];
int min,max;
int n,i,j,k,l;
int m;

main()
{
tt:
    //Nhập 4 dãy số liệu vào 4 mảng 1 chiều
    printf("Moi day so thu nhat bao gom bao nhieu chu so: ");
    scanf("%d",&n);
    printf("Day 1 la:\n");
    for(i=n-1;i>=0;--i) scanf("%d",&a[i]);
    printf("Day 2 la:\n");
    for(j=n-1;j>=0;--j) scanf("%d",&b[j]);
    printf("Day 3 la:\n");
    for(k=n-1;k>=0;--k) scanf("%d",&c[k]);
    printf("Day 4 la:\n");
    for(l=n-1;l>=0;--l) scanf("%d",&d[l]);

    //Tìm min,max
    for (m=0;m<n;++m)
    {
        min=a[m];
        if (min > b[m]) min=b[m];
        if (min > c[m]) min=c[m];
        if (min > d[m]) min=d[m];

        max=a[m];
        if (max < b[m]) max=b[m];
        if (max < c[m]) max=c[m];
        if (max < d[m]) max=d[m];
        printf("\n %d  %d  %d  %d  %d  %d",a[m],b[m],c[m],d[m],min,max);
    }
    printf("\nBan co muong tiep tuc c/k (co/khong): ");
    if (getche()=='c'||getche()=='C') goto tt;
}
Xem phần đính kèm 8721
sau khi thêm câu lệnh fflush(stdin) vào mình ms điền được dãy 3???
mảng n phần tử thì các phần tử sẽ từ 0 tới n - 1, nếu đảo ngược lại thì sẽ là từ n - 1 tới 0, chỗ nhập dãy bạn xài vòng for như vậy là sai rồi, phải có thêm dấu = nữa mới đúng
for(i=n-1;i>=0;--i) scanf(......);

ngoài ra góp ý thêm, kiểu dữ liệu float là để làm việc với số thập phân, nếu yêu cầu không dính tới số thập phân thì hạn chế xài vì nó có nhiều nhược điểm riêng chẳng hạn lỗi so sánh ==, tui đã sửa 2 cái kiểu float của mảng và max min lại được như sau
Untitled.jpg
 

dangthaihoc

Búa Gỗ Đôi
* Bạn cho mình hỏi thêm, sao câu lệnh trên của mình, khi mình thêm câu lệnh fflush(stdin) thì máy mới nhận được dòng nhập thứ 3. Còn không là không nhận dòng lệnh nhập dãy số thứ 3
 

dammage

Rìu Chiến
* bạn cho mình hỏi, minh diễn giải câu lệnh for như sau:
vd n=2
for(i=n-1;i>0;--i) scanf(a);
B1: máy thực hiện câu lệnh scanf(a[1]) với i=1
B2: máy kiểm tra i=1>0, máy thực hiện câu lệnh scanf(a[0])
vậy nếu thêm i=0 nữa thì máy sẽ thực hiện câu lệnh scanf(a-1])

* Bạn cho mình hỏi thêm, sao câu lệnh trên của mình, khi mình thêm câu lệnh fflush(stdin) thì máy mới nhận được dòng nhập thứ 3
vòng for đó tương đương với 1 vòng while như sau
C:
i = n - 1
while(i > 0)
{
    scanf("%d",&a[i ]);
    --i
}
nó giảm i xong mới lặp và kiểm tra điều kiện, như vậy

bước 1: máy thực hiện câu lệnh scanf(a[1]) với i = 1
bước 2: --i, lúc này i sẽ bằng 0
bước 3: lặp và kiểm tra điều kiện i = 0 > 0 => sai, vòng lặp thoát

như vậy phần tử cuối cùng bạn nhập chính là a[1] chứ không phải a[0]

còn cái flush thì tui không biết nữa, chắc tại bạn xài trình biên dịch khác, tui xài borland c 5.02 khỏi cần flush gì vẫn ra kết quả như trên mà
 

dangthaihoc

Búa Gỗ Đôi
Cám ơn bạn!!! Mình cũng dùng codeblock ý. chứ borland C mình chạy win 64 nên không cài được. híc!!!
 

Handrf

Kiếm đá
Cám ơn bạn!!! Mình cũng dùng codeblock ý. chứ borland C mình chạy win 64 nên không cài được. híc!!!
tập sống với lũ thôi bạn. sang Java cũng phải làm thế đấy. Code block là theo đúng chuẩn. Có thể compiler của Borland C là nó nhúng tay vào "giải quyết hộ" bạn vấn đề này thôi. Và đây là "tính năng", không phải "lỗi" {byebye}

Bạn có thể gu gồ hoặc mình có link sẵn cho bạn tham khảo:

https://daynhauhoc.com/t/ham-fflush-stdin-dung-de-lam-gi/1874
 

dammage

Rìu Chiến
Cám ơn bạn!!! Mình cũng dùng codeblock ý. chứ borland C mình chạy win 64 nên không cài được. híc!!!
hồi chiều mắc làm, giờ rảnh cài codeblock test nè, copy nguyên xi code bạn ở trên luôn chạy cũng bình thường mà có gì đâu ta
Untitled.jpg


tập sống với lũ thôi bạn. sang Java cũng phải làm thế đấy. Code block là theo đúng chuẩn. Có thể compiler của Borland C là nó nhúng tay vào "giải quyết hộ" bạn vấn đề này thôi. Và đây là "tính năng", không phải "lỗi" {byebye}

Bạn có thể gu gồ hoặc mình có link sẵn cho bạn tham khảo:

https://daynhauhoc.com/t/ham-fflush-stdin-dung-de-lam-gi/1874
cái borland c cũ xì rồi, được cái nhanh thôi chứ tui cũng hông khuyến khích ai xài
fV2jNq8.gif
 


Top