Nhờ tư vấn - Mọi người tư vấn giúp em đoạn code C em viết bị sai chỗ nào ạ???? <Ngày 17/1/2020> | 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.

If possible, please support us by clicking on the advertisements.

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

×

Nhờ tư vấn Mọi người tư vấn giúp em đoạn code C em viết bị sai chỗ nào ạ???? <Ngày 17/1/2020>

dangthaihoc

Búa Gỗ Đôi
Bài trên em giải được rồi, nhưng giờ gặp vấn đề này ạ:
C:
/*
Lập chương trình in ra n số thực nhập từ bàn phím trên m dòng.
*/
#include "conio.h"
#include "stdio.h"
#include "math.h"
int m,n,i,j,t;
float s[100],a[100][100];
main()
{
    printf("\nBan muon nhap bao nhieu so thuc tren bao nhieu dong??");
    printf("\nSo so thuc ");
    scanf("%d",&n);
    printf("\nSo dong: ");
    scanf("%d",&m);
    //Nhap vao day so
    printf("Vui long nhap day so:\n");
    for (i=0;i<n;++i)
        scanf("%f",&s[i]);
    //Gán dãy số vào mảng
    i=0;
    for (t=0;t < m; ++t)
    {

        for (j=0,i=i;j <= n/m; ++j)
        {
            a[t][j] = s[i];
            ++i;
        }

    }

    //in ra day so
    printf("\nDay so in ra:\n");
    for (i=0;i<m;++i)
    {
        for (j=0;j<=t;++j)
            printf("%f\t",a[i][j]);
        printf("\n");
    }
}
KQ:
1.jpg

nhưng em thấy đoạn code trên của em sau ở chỗ: Có thêm số 0 trong màn hình in ra. Nhờ các tiền bối chỉ giáo thêm ạ!!!!!
 

dammage

Rìu Chiến
tui bỏ 2 cái dấu = chỗ điều kiện vòng for nè
C:
/*
Lập chương trình in ra n số thực nhập từ bàn phím trên m dòng.
*/

#include "conio.h"
#include "stdio.h"
#include "math.h"
int m,n,i,j,t;
float s[100],a[100][100];
main()
{
    ............

    //Gán dãy số vào mảng
    i=0;
    for (t=0;t < m; ++t)
    {
        for (j=0,i=i;j < n/m; ++j)
        {
            a[t][j] = s[i];
            ++i;
        }
    }

    //in ra day so
    printf("\nDay so in ra:\n");
    for (i=0;i<m;++i)
    {
        for (j=0;j<t;++j)
            printf("%f\t",a[i][j]);
        printf("\n");
    }
}

kết quả, chỉ in được 9 vì 10 chia 3 thì nó không tròn rồi
Untitled.jpg



<<------------------<>< oOo ><>------------------>>

có 1 cách giải quyết khác, bạn cứ điền số vào các dòng, các số còn dư sẽ đổ hết vô dòng cuối
C:
/*
Lập chương trình in ra n số thực nhập từ bàn phím trên m dòng.
*/

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

int m,n,i,j,t;
float s[100],a[100][100];

main()
{
    printf("\nBan muon nhap bao nhieu so thuc tren bao nhieu dong??");
    printf("\nSo so thuc ");
    scanf("%d",&n);
    printf("\nSo dong: ");
    scanf("%d",&m);

    //Nhap vao day so
    printf("Vui long nhap day so:\n");
    for (t = 0; t < n; ++t)
        scanf("%f", &s[t]);

    //Gán dãy số vào mảng
    t = 0;
    for (i = 0; i < m - 1; ++i)
    {
        for (j = 0; j < n/m; ++j)
        {
            a[i][j] = s[t];
            ++t;
        }
    }
    j = 0;
    while(t < n)
    {
        a[i][j] = s[t];
        t++;
        j++;
    }

    //in ra day so
    t = 0;
    printf("\nDay so in ra:\n");
    for (i = 0; i < m - 1; ++i)
    {
        for (j = 0; j < n/m; ++j)
        {
            printf("%f\t",a[i][j]);
            t++;
        }
        printf("\n");
    }
    j = 0;
    while(t < n)
    {
        printf("%f\t", a[i][j]);
        t++;
        j++;
    }
}

giả sử có 12 số thực chia cho 5 dòng, sẽ thừa ra 2 số, 2 số này tui đổ hết vô dòng cuối cùng, bởi vậy dòng cuối sẽ có tới 4 số thực, cách này thì đảm bảo in đủ số đủ hàng
Untitled.jpg
 
Sửa lần cuối:

dammage

Rìu Chiến
mới sửa lại cái code "cải tiến" ở trên, hồi chiều test xong mà lu bu xong copy lộn
 

dangthaihoc

Búa Gỗ Đôi
Hôm qua mình làm về, không có máy. nay đến mình code lại như sau:
C:
/*
Lập chương trình in ra n số thực nhập từ bàn phím trên m dòng.
*/
#include "conio.h"
#include "stdio.h"
#include "math.h"
int m,n,i,j,t;
float s[100],a[100][100];
main()
{
    printf("\nBan muon nhap bao nhieu so thuc tren bao nhieu dong??");
    printf("\nSo so thuc nhap vao: ");
    scanf("%d",&n);
    printf("\nSo dong: ");
    scanf("%d",&m);
    //Nhap vao day so
    printf("Vui long nhap day so:\n");
    for (i=0;i<n;++i)
        scanf("%f",&s[i]);
    //Gán dãy số vào mảng
    i=0;
    for (t=0;t < m; ++t)
    {

        for (j=0,i=i;j <= n/m; ++j)
        {
            a[t][j] = s[i];
            ++i;
        }


    }

    //in m-1 dòng trên
        printf("\nDay so in ra:\n");
        for (i=0;i<m-1;++i)
        {
            for (j=0;j<=t;++j)
            printf("%f\t",a[i][j]);
            printf("\n");
        }
    //in ra dòng thứ m
        i = m-1;
        for (j=0;j<=n-n/m*m;++j)
        printf("%f\t",a[i][j]);
    getche();
}
KQL:
2020-01-14_090331.jpg
 

dammage

Rìu Chiến
mừ bạn @dammage đang học hay đang làm vậy???
tui đang ở trên đất sài gòn (chứ ở dưới đất là chết rồi), và đi làm rồi
7L1XX2F.gif
 

dangthaihoc

Búa Gỗ Đôi
Mọi người xem giúp em đoạn code này coi bị sai chỗ nào ạ. KQ ra bị sai
@dammage @1234560987 @Handrf
C:
/*
Nhập hai dãy số: a1, ... , an và b1, ... ,bn
Cả hai đều theo thứ tự tăng dần
Lập chương trình xây dựng một dãy mới theo thứ tự tăng dần từ hai dãy trên.
*/
#include "conio.h"
#include "stdio.h"
main()
{
    //Nhập hai dãy số vào hai mảng a,b
    int i,j,m,n;
    float a[100], b[100],c[100],vt;

    printf ("Day 1: \n");
    printf("So phan tu cua day 1:\n");
    scanf("%d",&m);
    printf("Vui long nhap day so 1: \n");
    for (i=0;i<m;++i)
        scanf("%f",&a[i]);

    printf ("Day 2: \n");
    printf("So phan tu cua day 2: \n");
    scanf("%d",&n);
    printf("Vui long nhap day so 1: \n");
    for (i=0;i<n;++i)
        scanf("%f",&b[i]);

    //Gộp hai biểu thức vào chung một mạng c
    for(i=0,j=0;j<m;++i,++j)
        c[i] = a[j];
    for (i=m,j=0;j<n;++i,++j)
        c[i] = b[j];

    /* Xắp xếp mảng C theo trình tự tăng dần
    So sánh lần lượt một giá trị vs những giá trị còn lại trong dãy
        Nếu giá trị đó lớn hơn giá trị còn lại, đổi chỗ hai giá trị cho nhau
    */
    for (i=0;i < m+n; ++i)
    {
        for (j = m+n;j > i;--j)
        {
            if (c[i] > c[j])
            {
                vt = c[i];
                c[i] = c[j];
                c[j] = vt;
            }

        }
    }
    // In KQ ra màn hình
    printf("======================\n");
    printf("Hai day so vua nhap:\n");
    for (i=0;i<m;i++)
        printf("%0.2f  ",a[i]);
    printf("\n");
    for (i=0;i<n;i++)
        printf("%0.2f  ",b[i]);
    printf("\n");
    printf("Day so xap xep lai la:\n");
    for (i=0;i<m+n;++i)
        printf("%0.2f  ",c[i]);
        getch();
}
 

Attachments

  • 2020-01-14_165621.jpg
    2020-01-14_165621.jpg
    41.6 KB · Lượt xem: 13
Sửa lần cuối:

dammage

Rìu Chiến
cái chỗ sắp xếp mảng c bạn sai thôi, tui sửa lại rồi, cái thuật sắp xếp đó gọi là selection sort đó, với tui sửa luôn kiểu mảng float thành int nữa, để float in ra có mấy con số 0 nhìn mỏi mắt với tốn chỗ, kích thướt cái cmd có giới hạn mà

C:
/*
Nhập hai dãy số: a1, ... , an và b1, ... ,bn
Cả hai đều theo thứ tự tăng dần
Lập chương trình xây dựng một dãy mới theo thứ tự tăng dần từ hai dãy trên.
*/

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

main()
{
    //Nhập hai dãy số vào hai mảng a,b
    int i,j,m,n;
    int a[100], b[100],c[100],vt;

    printf ("Day 1: \n");
    printf("So phan tu cua day 1:\n");
    scanf("%d",&m);
    printf("Vui long nhap day so 1: \n");
    for (i=0;i<m;++i)
        scanf("%d",&a[i]);

    printf ("Day 2: \n");
    printf("So phan tu cua day 2: \n");
    scanf("%d",&n);
    printf("Vui long nhap day so 1: \n");
    for (i=0;i<n;++i)
        scanf("%d",&b[i]);

    //Gộp hai biểu thức vào chung một mạng c
    for(i=0,j=0;j<m;++i,++j)
        c[i] = a[j];
    for (i=m,j=0;j<n;++i,++j)
        c[i] = b[j];

    
    /* Xắp xếp mảng C theo trình tự tăng dần
    So sánh lần lượt một giá trị vs những giá trị còn lại trong dãy
    Nếu giá trị đó lớn hơn giá trị còn lại, đổi chỗ hai giá trị cho nhau
    */
    for (i=0;i < m+n; ++i)
    {
        for (j = i + 1;j < m + n;++j)
        {
            if (c[i] > c[j])
            {
                vt = c[i];
                c[i] = c[j];
                c[j] = vt;
            }
        }
    }

    // In KQ ra màn hình
    printf("======================\n");
    printf("Hai day so vua nhap:\n");
    for (i=0;i<m;i++)
        printf("%d  ",a[i]);

    printf("\n");
    for (i=0;i<n;i++)
        printf("%d  ",b[i]);
    printf("\n");

    printf("Day so xap xep lai la:\n");
    for (i=0;i<m+n;++i)
        printf("%d  ",c[i]);

    getch();
}

Untitled.jpg
 

dangthaihoc

Búa Gỗ Đôi
cái chỗ sắp xếp mảng c bạn sai thôi, tui sửa lại rồi, cái thuật sắp xếp đó gọi là selection sort đó, với tui sửa luôn kiểu mảng float thành int nữa, để float in ra có mấy con số 0 nhìn mỏi mắt với tốn chỗ, kích thướt cái cmd có giới hạn mà



Untitled.jpg
mình tư duy thuật toán bị lộn bạn. trên đg về nhà, mình ms biết minh sai cái hết sức cơ bản là , i = m+n-1
híc!!!!!
Làm sao để tránh khỏi những lối sơ đẳng đó hen!???
 
Sửa lần cuối:

dammage

Rìu Chiến
mình tư duy thuật toán bị lộn bạn. trên đg về nhà, mình ms biết minh sai cái hết sức cơ bản là , i = m+n-1
híc!!!!!
Làm sao để tránh khỏi những lối sơ đẳng đó hen!???
tư duy thuật toán thì theo tui chắc đòi hỏi nhiều kinh nghiệm viết và đọc code, từ từ sẽ đào luyện thành những kĩ năng và thậm chí trực giác

lúc suy nghĩ bạn thử viết pseudo code (mã giả) hay vẽ hình ra giấy coi sao, mấy cái thao tác mảng này nọ chưa phải thứ trừu tượng, bạn vẽ ra sẽ dễ hình dung hơn

ở đây có cái video minh họa từng thao tác của thuật sắp xếp chọn nè
 

dangthaihoc

Búa Gỗ Đôi
Chuyện là em học C, tới phần con trỏ, gặp ngay cái ví dụ đầu mừ KQ ra em không hiểu????
Mọi người xem giúp em đoạn code này coi bị sai chỗ nào ạ.
@dammage @1234560987 @Handrf
Mã:
/*
Chương trình giải phương trình bậc hai
*/
#include "stdio.h"
#include "conio.h"
int ptb2 (float a, float b, float c, float *x1, float *x2);
main()
{
    int s,ch;
    float a,b,c,x1,x2;
    printf("\nVao a,b,c\n");
    scanf("%f%f%f,&a,&b,&c");
    s = ptb2(a,b,c,&x1,&x2);
    if (s==0)
        printf("\n a=0");
    else if (s == -1)
        printf ("\n delta < 0");
    else
        printf ("\nx1 = %0.2f  x2 = %0.2f",x1,x2);
}
    //Hàm giải phương trình bậc hai
int ptb2 (float a, float b, float c, float *x1, float *x2)
{
    float delta;
    if (a == 0) return 0;
    delta = b*b - 4*a*c;
    if (delta < 0) return -1;
    *x1 = (-b - sqrt(delta))/(2*a);
    *x2 = (-b + sqrt(delta))/(2*a);
    return 1;
}
 

Attachments

  • kq.jpg
    kq.jpg
    30.3 KB · Lượt xem: 7

Handrf

Kiếm đá
Chuyện là em học C, tới phần con trỏ, gặp ngay cái ví dụ đầu mừ KQ ra em không hiểu????
Mọi người xem giúp em đoạn code này coi bị sai chỗ nào ạ.
@dammage @1234560987 @Handrf
Mã:
/*
Chương trình giải phương trình bậc hai
*/
#include "stdio.h"
#include "conio.h"
int ptb2 (float a, float b, float c, float *x1, float *x2);
main()
{
    int s,ch;
    float a,b,c,x1,x2;
    printf("\nVao a,b,c\n");
    scanf("%f%f%f,&a,&b,&c");
    s = ptb2(a,b,c,&x1,&x2);
    if (s==0)
        printf("\n a=0");
    else if (s == -1)
        printf ("\n delta < 0");
    else
        printf ("\nx1 = %0.2f  x2 = %0.2f",x1,x2);
}
    //Hàm giải phương trình bậc hai
int ptb2 (float a, float b, float c, float *x1, float *x2)
{
    float delta;
    if (a == 0) return 0;
    delta = b*b - 4*a*c;
    if (delta < 0) return -1;
    *x1 = (-b - sqrt(delta))/(2*a);
    *x2 = (-b + sqrt(delta))/(2*a);
    return 1;
}

lỗi chỗ này nè bạn

C:
main()
{
    int s,ch;
    float a,b,c,x1,x2;
    printf("\nVao a,b,c\n");
// Lỗi ở đây  //
    scanf("%f%f%f,&a,&b,&c");
// end of lỗi //
    s = ptb2(a,b,c,&x1,&x2);
    if (s==0)
        printf("\n a=0");
    else if (s == -1)
        printf ("\n delta < 0");
    else
        printf ("\nx1 = %0.2f  x2 = %0.2f",x1,x2);
}


{EMO_110}
 


Top