Kết quả sai sau khi gộp các bài tập

Các anh ơi cho em hỏi sao khi e gộp chương trình như thế này lại chạy sai vậy ạ? viết riêng câu lệnh bài 25 thì vẫn chạy đúng.

//23.sap xep tang dan phan tu am
// va giam dan phan tu duong
#include<stdio.h>
#include<stdlib.h>

void swap(int * a, int * b) {
    int temp;
    temp = * b;
    * b = * a;
    * a = temp;
}
void nhap(int * a, int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf("nhap phan tu thu %d: \t", i);
        scanf("%d", a + i);
    }
}
void xuat(int * a, int n) {
    int i;
    for (i = 0; i < n; i++)
        printf("%5d", *(a + i));
}
void tang(int * a, int n) {
    int i, j;
    for (i = 0; i < n - 1; i++)
        for (j = i + 1; j < n; j++)
            if ( * (a + i) > * (a + j))
                swap(a + i, a + j);
}
void bai23(int * a, int n) {
    int j, i;
    for (i = 0; i < n - 1; i++)
        for (j = i + 1; j < n; j++) {
            if ( * (a + i) < 0 && * (a + j) < 0 && * (a + i) > * (a + j))
                swap(a + i, a + j);
            if ( * (a + i) >= 0 && * (a + j) >= 0 && * (a + i) < * (a + j))
                swap(a + i, a + j);
        }
    printf("\n mang tang dan cac so am va giam dan cac so duong");
    xuat(a, n);

}
void bai24(int * a, int n) //sap xep mang tang dan
{
    tang(a, n);
    printf("\n mang sap xep theo thu tu tang dan:");
    xuat(a, n);
}
int ktnt(int * a) {
    int i, dem = 0;
    for (i = 1; i <= * a; i++)
        if ( * a % i == 0) dem++;
    if (dem != 2) return 0;
    return 1;
}
void bai25(int * a, int n) //sap xep tang dan cac phan tu nguyen to tang dan va giam dan cacpt k nto
{
    int i, j; {
        if (ktnt(a + i) == 0 && ktnt(a + j) == 0 && * (a + i) < * (a + j))
            swap(a + i, a + j);

        if (ktnt(a + i) == 1 && ktnt(a + j) == 1 && * (a + i) > * (a + j))
            swap(a + i, a + j);
    }
    printf("mang cac pt nto tang dan & k nto giam dan:");
    xuat(a, n);
}
int main() {
    int * a, n;
    do {
        printf("nhap so phan tu :");
        scanf("%d", & n);
    } while (n < 1 || n > 100);
    a = (int * ) malloc((n + 1) * sizeof(int));
    nhap(a, n);
    printf("mang ca ban la:");
    xuat(a, n);
    bai23(a, n);
    bai24(a, n);
    bai25(a, n);
    free(a);
}
//sap xep tang dan cac phan tu nguyen to tang dan va giam dan cac pt k nto
#include<stdio.h>

#include<stdlib.h>

void doicho(int * a, int * b) {
    int temp;
    temp = * b;
    * b = * a;
    * a = temp;
}
void nhap(int * a, int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf("nhap phan tu thu %d: \t", i);
        scanf("%d", a + i);
    }
}
void xuat(int * a, int n) {
    int i;
    for (i = 0; i < n; i++)
        printf("%5d", *(a + i));
}
int ktnt(int * a) {
    int dem = 0, i;
    for (i = 1; i <= * a; i++)
        if ( * a % i == 0)
            dem++;
    if (dem == 2)
        return 1;
    return 0;
}
int main() {

    int * a, n, j, i;
    do {
        printf("nhap so phan tu :");
        scanf("%d", & n);
    } while (n < 1 || n > 100);
    a = (int * ) malloc(n * sizeof(int));
    nhap(a, n);
    xuat(a, n);
    for (i = 0; i < n - 1; i++)
        for (j = i + 1; j < n; j++) {
            if (ktnt(a + i) == 0 && ktnt(a + j) == 0 && * (a + i) < * (a + j))
                doicho(a + i, a + j);

            if (ktnt(a + i) == 1 && ktnt(a + j) == 1 && * (a + i) > * (a + j))
                doicho(a + i, a + j);
        }
    printf("mang cac pt nto tang dan & k nto giam dan:");
    xuat(a, n);
    free(a);
}
1 Like

Sao em không ứng dụng mấy hàm sort của std:vector mà tự viết làm gì cho cực vậy.

=>Mình nghĩ bạn đã không khởi tạo giá trị i, j trong hàm “bai25”.

  • Nếu đúng thì phải int i = 0; j = 0;. Hoặc như thế nào đó.
  • Nêu ở các trường hợp khởi tạo khác mà cảm thấy dư thừa như
int i = 0;
for (i = 0; i < n; i++) 
{
      printf("nhap phan tu thu %d: \t", i);
      scanf("%d", a + i);
}

thì có thể sửa thành

int i = 0;
for (; i < n; i++)
{
      printf("nhap phan tu thu %d: \t", i);
      scanf("%d", a + i);
}
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?