Bài tập 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.

×

Bài tập lập trình c++

Huyzz

Gà con
1. Giới thiệu

Một xe robot Arduino di chuyển trong một mặt phẳng bắt đầu từ điểm gốc (0,0). Xe có thể di chuyển theo hướng LÊN, XUỐNG, TRÁI và PHẢI với một số bước nhất định. Sinh viên hãy viết chương trình tính khoảng cách từ vị trí hiện tại sau một chuỗi chuyển động so với điểm điểm gốc ban đầu. Sau đó kiểm tra khoảng cách là một số chính phương hay một số nguyên tố.

Lưu ý: Nếu khoảng cách là dạng số thực (Float), thì chỉ cần làm tròn thành dạng in số nguyên (Int).Hint: sử dụng hàm round()

2. Dữ liệu nhập

Dữ liệu nhập của chương trình được là một chuỗi các kỹ tự gồm chữ và số (xem thêm ví dụ ở phần dữ liệu xuất). Chuỗi này chứa kiểu kí tự theo định dạng sau:

direction, steps
directions: giá trị này cho biết hướng đi của xe Arduino trên mặt phẳng được ký hiệu như sau U (di lên), D (đi xuống), L (bên trái), R (bên phải)
steps: giá trị này cho biết số bước mà xe đi trên mặt phẳng
3. Dữ liệu xuất

Chương trình sẽ xuất trực tiếp ra màn hình khoảng cách mà xe đã đi được và kiểm tra xem giá trị của khoảng cách này là một số nguyên tố hay số chính phương

Giả sử rằng chương trình sẽ được nhập vào các giá trị tuần tự được liệt kê dưới đây.

U5D3L3R2
Chương trình sẽ thực thi và xuất ra màn hình kết quả như sau:
Khoảng cách xe đã di chuyển từ vị trí ban đầu tới điểm hiện tại: 2
Số 2 là số nguyên tố
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
int move(string moves)
{
char direction[100];
int length[100];
int x, y;
x = 0;
y = 0;
int slen = moves.length();
int num_direc=0;
int num_length = 0;
//chuyen tu string ve cac array
for (int i = 0;i< slen;i++)
{
if (moves < 60 && moves > 40)
{
length[num_length] = (int)(moves-'0');
while (moves[i+1] < 60 && moves[i+1] > 40)
{
length[num_length] = length[num_length] * 10 + (int)(moves[i+1] - '0');
i++;
}
num_length++;
}
else
{
direction[num_direc] = moves;
num_direc++;
}
}
// tim toa do cua Arduino
for (int i = 0; i < num_direc; i++)
{
if (direction == 'L') { x -= length; }
if (direction == 'R') { x += length; }
if (direction == 'D') { y -= length; }
if (direction == 'U') { y += length; }
}
// tinh khoan cach theo toa do
float distance;
distance = sqrt(x * x + y * y);
return round(distance);
}
bool isPrime(int n)
{
if (n < 2) return 0;
for (int i = 2; i < sqrt(n); i++)
{
if (n % i == 0) return 0;
}
return 1;
}
bool isSquared(int n)
{
if (n < 1) return 0;
if (sqrt(n) - int(sqrt(n)) == 0) return 1;
return 0;
}
int main()
{
string moves;
int distance;
bool primality, squared;
cin >> moves;
distance = move(moves);
cout << "Khoang cach xe da di chuyen tu vi tri ban dau toi diem hien tai: "
<< distance << '\n';
primality = isPrime(distance);
squared = isSquared(distance);
if (primality) {
cout << "So " << distance << " la so nguyen to\n";
}
if (squared) {
cout << "So " << distance << " la so chinh phuong\n";
}
return 0;
}
Em đã thử nhiều cách nhưng vẫn bị sai hidden test. Có ai biết code của em sai ở đâu không ạ.
 

malemkhoang

Rìu Chiến
Tôi không biết lập trình. Nhưng theo tôi thì:
Khoảng di chuyển theo chiều dọc tôi cho là m = U - D (quy ước U là chiều dương);
Khoảng di chuyển theo chiều ngang là n = R - L (quy ước R là chiều dương);
Khoảng cách so với điểm gốc (0, 0) là: k = sqrt(m * n)
Xét k là việc còn lại của bạn.​
 

dammage

Rìu Chiến
code thì bạn bỏ vô trong tag code, cứ quăng đại lên đây như vầy làm mấy cái [ i ] bị mất hết, tui sửa lại giùm bạn đây

C++:
#include <cmath>
#include <iostream>
#include <string>
using namespace std;

int move(string moves)
{
    char direction[100];
    int length[100];
    int x, y;
    x = 0;
    y = 0;
    int slen = moves.length();
    int num_direc = 0;
    int num_length = 0;

    //chuyen tu string ve cac array
    for (int i = 0; i < slen; i++)
    {
        // là số
        if (moves[i] < 60 && moves[i] > 40)
        {
            length[num_length] = (int)(moves[i] - '0');
            while (moves[i + 1] < 60 && moves[i + 1] > 40)
            {
                length[num_length] = length[num_length] * 10 + (int)(moves[i + 1] - '0');
                i++;
            }

            num_length++;
        }
        else    // là hướng LRDU
        {
            direction[num_direc] = moves[i];
            num_direc++;
        }
    }

    // tim toa do cua Arduino
    for (int i = 0; i < num_direc; i++)
    {
        if (direction[i] == 'L') { x -= length[i]; }
        if (direction[i] == 'R') { x += length[i]; }
        if (direction[i] == 'D') { y -= length[i]; }
        if (direction[i] == 'U') { y += length[i]; }
    }

    // tinh khoan cach theo toa do
    float distance;
    distance = sqrt(x * x + y * y);
    return round(distance);
}

bool isPrime(int n)
{
    if (n < 2) return 0;
    for (int i = 2; i < sqrt(n); i++)
    {
        if (n % i == 0) return 0;
    }
    return 1;
}

bool isSquared(int n)
{
    if (n < 1) return 0;

    if (sqrt(n) - int(sqrt(n)) == 0) return 1;

    return 0;
}

int main()
{
    string moves;
    int distance;
    bool primality, squared;
    cin >> moves;
    distance = move(moves);
    cout << "Khoang cach xe da di chuyen tu vi tri ban dau toi diem hien tai: " << distance << '\n';
    primality = isPrime(distance);
    squared = isSquared(distance);
    if (primality)
    {
        cout << "So " << distance << " la so nguyen to\n";
    }
    if (squared)
    {
        cout << "So " << distance << " la so chinh phuong\n";
    }
    return 0;
}
test sơ với ideone thấy ok mà ta, L6D7 nó cho ra số nguyên tố với số chính phương luôn
https://ideone.com/yB7GA1
 

TianAn

Gà con
1. Giới thiệu

Một xe robot Arduino di chuyển trong một mặt phẳng bắt đầu từ điểm gốc (0,0). Xe có thể di chuyển theo hướng LÊN, XUỐNG, TRÁI và PHẢI với một số bước nhất định. Sinh viên hãy viết chương trình tính khoảng cách từ vị trí hiện tại sau một chuỗi chuyển động so với điểm điểm gốc ban đầu. Sau đó kiểm tra khoảng cách là một số chính phương hay một số nguyên tố.

Lưu ý: Nếu khoảng cách là dạng số thực (Float), thì chỉ cần làm tròn thành dạng in số nguyên (Int).Hint: sử dụng hàm round()

2. Dữ liệu nhập

Dữ liệu nhập của chương trình được là một chuỗi các kỹ tự gồm chữ và số (xem thêm ví dụ ở phần dữ liệu xuất). Chuỗi này chứa kiểu kí tự theo định dạng sau:

direction, steps
directions: giá trị này cho biết hướng đi của xe Arduino trên mặt phẳng được ký hiệu như sau U (di lên), D (đi xuống), L (bên trái), R (bên phải)
steps: giá trị này cho biết số bước mà xe đi trên mặt phẳng
3. Dữ liệu xuất

Chương trình sẽ xuất trực tiếp ra màn hình khoảng cách mà xe đã đi được và kiểm tra xem giá trị của khoảng cách này là một số nguyên tố hay số chính phương

Giả sử rằng chương trình sẽ được nhập vào các giá trị tuần tự được liệt kê dưới đây.

U5D3L3R2
Chương trình sẽ thực thi và xuất ra màn hình kết quả như sau:
Khoảng cách xe đã di chuyển từ vị trí ban đầu tới điểm hiện tại: 2
Số 2 là số nguyên tố
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
int move(string moves)
{
char direction[100];
int length[100];
int x, y;
x = 0;
y = 0;
int slen = moves.length();
int num_direc=0;
int num_length = 0;
//chuyen tu string ve cac array
for (int i = 0;i< slen;i++)
{
if (moves < 60 && moves > 40)
{
length[num_length] = (int)(moves-'0');
while (moves[i+1] < 60 && moves[i+1] > 40)
{
length[num_length] = length[num_length] * 10 + (int)(moves[i+1] - '0');
i++;
}
num_length++;
}
else
{
direction[num_direc] = moves;
num_direc++;
}
}
// tim toa do cua Arduino
for (int i = 0; i < num_direc; i++)
{
if (direction == 'L') { x -= length; }
if (direction == 'R') { x += length; }
if (direction == 'D') { y -= length; }
if (direction == 'U') { y += length; }
}
// tinh khoan cach theo toa do
float distance;
distance = sqrt(x * x + y * y);
return round(distance);
}
bool isPrime(int n)
{
if (n < 2) return 0;
for (int i = 2; i < sqrt(n); i++)
{
if (n % i == 0) return 0;
}
return 1;
}
bool isSquared(int n)
{
if (n < 1) return 0;
if (sqrt(n) - int(sqrt(n)) == 0) return 1;
return 0;
}
int main()
{
string moves;
int distance;
bool primality, squared;
cin >> moves;
distance = move(moves);
cout << "Khoang cach xe da di chuyen tu vi tri ban dau toi diem hien tai: "
<< distance << '\n';
primality = isPrime(distance);
squared = isSquared(distance);
if (primality) {
cout << "So " << distance << " la so nguyen to\n";
}
if (squared) {
cout << "So " << distance << " la so chinh phuong\n";
}
return 0;
}
Em đã thử nhiều cách nhưng vẫn bị sai hidden test. Có ai biết code của em sai ở đâu không ạ.
tại sao phải là moves<60 && moves>40 với lại int(moves-'0') v ạ. Em cảm ơn
 

TianAn

Gà con
code thì bạn bỏ vô trong tag code, cứ quăng đại lên đây như vầy làm mấy cái [ i ] bị mất hết, tui sửa lại giùm bạn đây

C++:
#include <cmath>
#include <iostream>
#include <string>
using namespace std;

int move(string moves)
{
    char direction[100];
    int length[100];
    int x, y;
    x = 0;
    y = 0;
    int slen = moves.length();
    int num_direc = 0;
    int num_length = 0;

    //chuyen tu string ve cac array
    for (int i = 0; i < slen; i++)
    {
        // là số
        if (moves[i] < 60 && moves[i] > 40)
        {
            length[num_length] = (int)(moves[i] - '0');
            while (moves[i + 1] < 60 && moves[i + 1] > 40)
            {
                length[num_length] = length[num_length] * 10 + (int)(moves[i + 1] - '0');
                i++;
            }

            num_length++;
        }
        else    // là hướng LRDU
        {
            direction[num_direc] = moves[i];
            num_direc++;
        }
    }

    // tim toa do cua Arduino
    for (int i = 0; i < num_direc; i++)
    {
        if (direction[i] == 'L') { x -= length[i]; }
        if (direction[i] == 'R') { x += length[i]; }
        if (direction[i] == 'D') { y -= length[i]; }
        if (direction[i] == 'U') { y += length[i]; }
    }

    // tinh khoan cach theo toa do
    float distance;
    distance = sqrt(x * x + y * y);
    return round(distance);
}

bool isPrime(int n)
{
    if (n < 2) return 0;
    for (int i = 2; i < sqrt(n); i++)
    {
        if (n % i == 0) return 0;
    }
    return 1;
}

bool isSquared(int n)
{
    if (n < 1) return 0;

    if (sqrt(n) - int(sqrt(n)) == 0) return 1;

    return 0;
}

int main()
{
    string moves;
    int distance;
    bool primality, squared;
    cin >> moves;
    distance = move(moves);
    cout << "Khoang cach xe da di chuyen tu vi tri ban dau toi diem hien tai: " << distance << '\n';
    primality = isPrime(distance);
    squared = isSquared(distance);
    if (primality)
    {
        cout << "So " << distance << " la so nguyen to\n";
    }
    if (squared)
    {
        cout << "So " << distance << " la so chinh phuong\n";
    }
    return 0;
}
test sơ với ideone thấy ok mà ta, L6D7 nó cho ra số nguyên tố với số chính phương luôn
https://ideone.com/yB7GA1
tại sao phải là moves<60 && moves>40 với lại int(moves-'0') v ạ. Em cảm ơn
 

dammage

Rìu Chiến
tại sao phải là moves<60 && moves>40 với lại int(moves-'0') v ạ. Em cảm ơn
kiểm tra kí tự có phải là chữ số hay không bằng cách so sánh mã ascii của nó, nếu mã từ 41 tới 59 thì nó là chữ số, chỗ này đúng ra phải kiểm tra mã từ 48 tới 57 tương ứng với chữ số 0 tới 9, nhưng thôi tui để luôn vậy

còn trừ cho '0' là để convert kí tự đó về giá trị int thôi, chẳng hạn kí tự '7' - '0' = (int)7
 


Top