Hỏi một số bài lập trình c++

chào các ac chị trên diễn đàn,m mới học lập trình c++ có một số bài vẫn chưa làm được mong cac ac giúp m với:

1.
viết chương trình thực hiện cac yêu cầu sau:
-nhập vào một số nguyên dương n,
-nhập mảng có n số nguyên.
-sắp xếp mảng a sao cho các số chẵn ỏ đầu mảng theo thứ tự giảm dần,các số lẻ ở cuối mảng theo thứ tự giảm dần.
2.
viết chương trình nhập vào một mảng có n số nguyên,hiển thị mảng ra màn hình .chỉ bằng một lần duyệt mảng duy nhất
hãy cho biết mảng vừa nhập thỏa mãn tính chất nào dưới đây;
+mảng tăng thực sự(a<a[i+1],0<=i<=n-2)
+mảng tăng dần(a<=a[i+1],0<=i<=n-2)
+mảng giảm thực sự(a>a[i+1],0=i<=n-2)
+mảng giảm dần(a>=a[i+1],0<=i<=n-2)
+mảng không có trật tự nào,
 

snowolf901

Tuyết Lang
1.
- tách chuỗi nhập vào thành 2 chuỗi con
- sắp xếp độc lập 2 chuỗi, 1 chuỗi asc và 1 chuỗi desc
- gộp 2 chuỗi lại
Ý tưởng mình là thế. Thuật toán sắp xếp của C++ thì google đầy
2. Ý tưởng:
- cho 3 biến, gí trị bool là isEqual, isBigger, isSmaller đều là false;
- cho j = 0;
- for(int i=0;i<n-2;i++){
j=i+1;
if(a = a[j]) isEqual = true;
if(a > a[j]) isBigger = true;
if(a < a[j]) isSmaller = true;
}

- kiểm tra điều kiện, nếu cả 3 thằng là true thì không có trật tự, nếu vừa = vừa lớn hơn thì tăng dần....

hi vọng đúng :D
 

tengiday

Happy life
Bài 1: Lúc đọc n số thì bạn cho số chẵn điền ở đầu mảng, còn số lẻ điền từ cuối mảng, sau đó chỉ sort lại theo từng phần thôi. Code toàn bài sẽ thế này. Có lẽ còn vài trường hợp chưa test kỹ, nhưng đại khái như sau:
Mã:
#include <stdio.h>

void printArr(int * a, int n) {
    for (int i = 0; i < n; ++i)
        printf("%d ", a[i]);
    printf("\n");
}

void sortArr(int * a, int L, int R) {
    if (L >= R)
        return;
    for (int i = L + 1; i <= R; ++i) {
        int key = a[i], j = i - 1;
        for (; j >= 0 && a[j] < key; --j)
            a[j + 1] = a[j];
        a[j + 1] = key;
    }
}

int main() {
    int n = 0;
    printf("N = ");
    scanf("%d", &n);
    if (n < 1)
        return 0;

    int * a = new int[n];
    int endingEvenInd = -1, startingOddInd = n;
    for (int i = 0; i < n; ++i) {
        int t = -1;
        printf("a[%d] = ", i);
        scanf("%d", &t);
        if (t % 2 == 0)
            a[++endingEvenInd] = t;
        else
            a[--startingOddInd] = t;
    }

    sortArr(a, 0, endingEvenInd);
    sortArr(a, startingOddInd, n - 1);
    printArr(a, n);
    
    delete[] a;
    return 0;
}

Còn bài 2 thì chỉ xét trường hợp thôi; có thời gian mình sẽ viết tiếp.
 
Sửa lần cuối:

snowolf901

Tuyết Lang
Bài 1: Lúc đọc n số thì bạn cho số chẵn điền ở đầu mảng, còn số lẻ điền từ cuối mảng, sau đó chỉ sort lại theo từng phần thôi. Code toàn bài sẽ thế này. Có lẽ còn vài trường hợp chưa test kỹ, nhưng đại khái như sau:
Mã:
#include <stdio.h>
#include <stdlib.h>

void printArr(int * a, int n) {
    for (int i = 0; i < n; ++i)
        printf("%d ", a[i]);
    printf("\n");
}

void sortArr(int * a, int L, int R) {
    if (L >= R)
        return;
    for (int i = L + 1; i <= R; ++i) {
        int key = a[i], j = i - 1;
        for (; j >= 0 && a[j] < key; --j)
            a[j + 1] = a[j];
        a[j + 1] = key;
    }
}

int main() {
    int n = 0;
    printf("N = ");
    scanf("%d", &n);
    if (n < 1)
        return 0;

    int * a = new int[n];
    int endingEvenInd = -1, startingOddInd = n;
    for (int i = 0; i < n; ++i) {
        int t = -1;
        printf("a[%d] = ", i);
        scanf("%d", &t);
        if (t % 2 == 0)
            a[++endingEvenInd] = t;
        else
            a[--startingOddInd] = t;
    }

    sortArr(a, 0, endingEvenInd);
    sortArr(a, startingOddInd, n - 1);
    printArr(a, n);
    
    delete[] a;
    return 0;
}

Còn bài 2 thì chỉ xét trường hợp thôi; có thời gian mình sẽ viết tiếp.

Nên giúp bạn ý về ý tưởng chứ làm nguyên cả bài thế này thì bạn ấy sẽ không hiểu sâu và không tự tay mò mẫm :)
 

tengiday

Happy life
Về bài 2, phần nhập và in mảng bạn tự làm nhé. Riêng phần kiểm tra thì cần viết 1 function kiểm tra mảng, sẽ trả ra: 1, 2, 3, 4, và 0 theo đúng thứ tự bạn đã ghi như trong đề. Dùng 2 phần tử đầu làm cột mốc rồi kiểm tra hết toàn bộ phần tử của mảng theo như vậy. Riêng trường hợp bằng nhau thì dùng 1 biến lưu riêng, để kết quả cuối cùng chỉ cần cộng lại thôi.
- Ở đây mình dùng convention là nếu n < 2 thì mảng chưa sắp xếp.
- Nếu các phần tử đều bằng nhau thì xem như trường hợp mảng chưa sắp xếp.
[ah]
Mã:
int checkArr(int * a, int n) {
    int rsl = -1, isEqual = 0;
    if (n < 2)
        return 0;
        
    for (int i = 0; i < n - 1; ++i)
        if (a[i] < a[i + 1]) {
            if (rsl == 3)
                return 0;
            rsl = 1;
        }
        else if (a[i] > a[i + 1]) {
            if (rsl == 1)
                return 0;
            rsl = 3;
        }
        else
            isEqual = 1;
    return rsl + isEqual;
}
[/ah]
 
Bài 1:
Ý tưởng: nhập mảng, nếu phần tử nhập vào chẵn thì nhét vào mảng a, nếu phần tử nhập vào lẻ thì nhét vào mảng b, sau đó ta sắp xếp cả hai mảng và in ra lần lượt.
Mã:
#include <iostream>

using namespace std;

bool check(bool increase, int a, int b)
{
    if(increase && b > a)
    {
        //kiem tra tang, b > a
        return true;
    }
    
    if(!increase && b < a)
    {
        return true;
    }

    return false;
}

void quickSort(int a[100], int left, int right, bool increase)
{
    int i = left, j = right;
    int pivot = (i + j) / 2;

    while(i <= j)
    {
        while(check(increase, a[i], a[pivot]))
        {
            i++;
        }

        while(check(increase, a[pivot], a[j]))
        {
            j--;
        }

        if(i <= j)
        {
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;
            i++;
            j--;
        }
    }

    if(i < right)
    {
        quickSort(a, i, right, increase);
    }
    if(left < j)
    {
        quickSort(a, left, j, increase);
    }
}

int main()
{
    int n, temp, count1 = 0, count2 = 0;

    //cout << "Vui long nhap i, j: "; cin >> i, j;
    cin >> n;

    int a[100], b[100];

    for(int i = 0; i < n; i++)
    {
        cin >> temp;

        if(temp % 2 == 0)
        {
            a[count1] = temp;
            count1 ++;
        }
        else
        {
            b[count2] = temp;
            count2 ++;
        }
    }

    quickSort(a, 0, count1 - 1, 0);
    quickSort(b, 0, count2 - 1, 0);

    for(int i = 0; i < count1; i++)
    {
        cout << a[i] << " ";
    }

    for(int i = 0; i < count2; i++)
    {
        cout << b[i] << " ";
    }

}
Bài 2: Cứ mỗi khi lặp lại dùng bốn biến boolean để kiểm soát. Nếu cả bốn biến đều sai thì tức là mảng không có thứ tự.
Mã:
#include <iostream>

using namespace std;

int main()
{
    int n, a[1000];
    
    cin >> n;
    
    bool check1 = true, check2 = true, check3 = true, check4 = true;
    //check 1: tang thuc su
    //check 2: tang dan
    //check 3: giam thuc su
    //check 4: giam dan
    
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    
    for(int i = 0; i <= n - 2; i++)
    {
        if(check1)
        {
            if(!(a[i] < a[i + 1]))
            {
                check1 = false;
                
            }
        }
        
        if(check2)
        {
            if(!(a[i] <= a[i + 1]))
            {
                check2 = false;
                
            }
        }
        
        if(check3)
        {
            if(!(a[i] > a[i + 1]))
            {
                check3 = false;
            }
        }
        
        if(check4)
        {
            if(!(a[i] >= a[i + 1]))
            {
                check4 = false;
            }
        }
    }
    
    if(check1)
    {
        cout << "Mang tang thuc su." << endl;
    }
    
    if(check2)
    {
        cout << "Mang tang dan dan." << endl;
    }
    
    if(check3)
    {
        cout << "Mang giam thuc su." << endl;
    }
    
    if(check4)
    {
        cout << "Mang giam dan dan." << endl;
    }
    
    if(!(check1 || check2 || check3 || check4))
    {
        cout << "Mang khong co thu tu.";
    }
}
 
Top