Tin học
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Em không hiểu code liên quan đến Đối số của Hàm main()

Go down

Em không hiểu code liên quan đến Đối số của Hàm main() Empty Em không hiểu code liên quan đến Đối số của Hàm main()

Bài gửi  NguyenDucAnh 6/4/2016, 22:31

Thầy giải thích dùm em code dưới đây ạ. Em không hiểu lắm.
int main(int argc, char * argv[])
{
if (argc == 2)
SoLan = atoi(argv[1]);
}

Admin:
- Hàm main() có 2 đối số: argc (để nhận số Tham số dòng lệnh) và argv (để nhận chính các tham số dòng lệnh).
- Em hãy tạo một Shortcut (lệnh tắt) tới chương trình .EXE của mình. Phím phải chuột tại lệnh tắt này, chọn Properties sẽ thấy và sửa được Các tham số dòng lệnh: Tham số 1 là Đường dẫn tới .EXE tương ứng (thường được đặt trong cặp " "); Tham số 2 lúc đầu không có, nên em phải gõ thêm một số nguyên (ví dụ, số 3) cách Tham số 1 ít nhất bằng 1 dấu cách. Tham số 2 của dòng lệnh như vậy chính là Số lần giải phương trình, cần truyền vào Hàm main() thông qua Đối số argv (một mảng xâu ký tự, đúng hơn: một mảng con trỏ tới các xâu ký tự của các tham số dòng lệnh tương ứng).
Em không hiểu code liên quan đến Đối số của Hàm main() Lenhta10
- Hàm main() bắt đầu bằng cấu trúc điều khiển if kiểm tra xem giá trị của argc có bằng 2 hay không. Nếu bằng 2, nghĩa là có 2 tham số dòng lệnh, mà Tham số dòng lệnh thứ 2 là số 3 mà em đã nhập trong Properties của Shortcut ở trên.
- Phần tử mảng argv[1] trỏ tới số 3 đó ở dạng xâu ký tự, do đó cần dùng hàm atoi() để chuyển đổi thành một số kiểu int (số nguyên 4 byte trên máy tính 32-bit), rồi gán cho biến SoLan.
- Nếu argc chứa số 1 (chứng tỏ Không có Tham số dòng lệnh thứ 2, và Dòng lệnh trong Shortcut chỉ có 1 tham số là Đường dẫn tới .EXE tương ứng, không có số nào như số 3 tiếp sau), biến SoLan không thay đổi và chứa số 1 ban đầu theo mặc định (default).
- Như vậy, bằng cách trên, có thể truyền Số lần lặp giải PTB2 từ Dòng lệnh vào Hàm main() của chương trình.
- Bài tập: Thêm Tham số dòng lệnh thứ 3 là Số milli giây cần truyền cho hàm Sleep() ở cuối Hàm main() !

NguyenDucAnh

Tổng số bài gửi : 13
Join date : 20/02/2016
Age : 28
Đến từ : Đăk Lăk

Về Đầu Trang Go down

Em không hiểu code liên quan đến Đối số của Hàm main() Empty Re: Em không hiểu code liên quan đến Đối số của Hàm main()

Bài gửi  NguyenDucAnh 7/4/2016, 16:04

Em cảm ơn thầy ạ. Em đã hiểu và viết code của em. Thầy xem có sai sót đoạn nào ạ.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <Windows.h>

using namespace std;

void GiaiPhuongTrinhBacHai();

int a, b, c, delta, i, SoLan = 1, TatDen = 3000;

void main(int Nguyen, char * Duc[], char * Anh[])
{
if ((Nguyen == 2)||(Nguyen == 3))
{
SoLan = atoi(Duc[1]);
TatDen = atoi(Anh[1]);
TatDen *= 1000;
}

cout << "Giai phuong trinh bac hai\n\n\n";

for (i = 1; i <= SoLan; i++)
{
cout << "- Phuong trinh thu " << i << ":\n\n";

do
{
cout <<"He So A: "; cin>> a;
} while (a==0);

cout <<"He So B: "; cin>> b;
cout <<"He So C: "; cin>> c;

GiaiPhuongTrinhBacHai();
}

Sleep (TatDen);
}
void GiaiPhuongTrinhBacHai()
{
delta = b*b-4*a*c;

if (delta < 0)
cout << "phuong trinh vo nghiem\n\n";
else
if (delta == 0)
cout << "Phuong trinh co nghiem kep la:\nx = " << -b/(2*a) << "\n\n";
else
cout << "Phuong trinh co hai nghiem phan biet:\nx = "
<< (-b-sqrt(delta))/(2*a)
<< endl << "x = "
<< (-b+sqrt(delta))/(2*a)
<< "\n\n";
}

Admin:
- Em vẫn chưa thực sự hiểu về các đối số của Hàm main() !
- Hàm main() chỉ có 2 đối số theo chuẩn C quy định: argc (để nhận số Tham số dòng lệnh) và argv (để nhận chính các tham số dòng lệnh).

NguyenDucAnh

Tổng số bài gửi : 13
Join date : 20/02/2016
Age : 28
Đến từ : Đăk Lăk

Về Đầu Trang Go down

Em không hiểu code liên quan đến Đối số của Hàm main() Empty Re: Em không hiểu code liên quan đến Đối số của Hàm main()

Bài gửi  NguyenDucAnh 7/4/2016, 20:31

Em mới sửa ạ Very Happy

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <Windows.h>

using namespace std;

void GiaiPhuongTrinhBacHai();

int a, b, c, delta, i, SoLan = 1, TatDen = 3000;

void main(int Duc, char * Anh[])
{
if (Duc == 2)
SoLan = atoi(Anh[1]);
else
if (Duc == 3)
{
SoLan = atoi(Anh[1]);
TatDen = atoi(Anh[2]);
TatDen *= 1000;
}

cout << "Giai phuong trinh bac hai\n\n\n";

for (i = 1; i <= SoLan; i++)
{
cout << "- Phuong trinh thu " << i << ":\n\n";

do
{
cout <<"He So A: "; cin>> a;
} while (a==0);

cout <<"He So B: "; cin>> b;
cout <<"He So C: "; cin>> c;

GiaiPhuongTrinhBacHai();
}

Sleep (TatDen);
}
void GiaiPhuongTrinhBacHai()
{
delta = b*b-4*a*c;

if (delta < 0)
cout << "phuong trinh vo nghiem\n\n";
else
if (delta == 0)
cout << "Phuong trinh co nghiem kep la:\nx = " << -b/(2*a) << "\n\n";
else
cout << "Phuong trinh co hai nghiem phan biet:\nx = "
<< (-b-sqrt(delta))/(2*a)
<< endl << "x = "
<< (-b+sqrt(delta))/(2*a)
<< "\n\n";
}


Admin:
- Chúc mừng em đã Hiểu và Giải đúng Bài tập liên quan đến Đối số của Hàm main() !
- Nên dùng tên đối số của main() theo quy định chuẩn là argcargv (em dùng Duc và Anh tương ứng cho các tên này, tuy không sai).
- Tham số dòng lệnh thứ 3 của em là một số nguyên chỉ Số giây (chứ không phải milli giây) cần Ngủ (Sleep), nên trong chương trình em đã dùng lệnh TatDen *= 1000 để nhân giá trị của biến TatDen lên 1000 (vì hàm Sleep đòi hỏi số milli giây), do 1 giây = 1000 milli giây. Thày đánh giá cao cách làm này !

NguyenDucAnh

Tổng số bài gửi : 13
Join date : 20/02/2016
Age : 28
Đến từ : Đăk Lăk

Về Đầu Trang Go down

Em không hiểu code liên quan đến Đối số của Hàm main() Empty Re: Em không hiểu code liên quan đến Đối số của Hàm main()

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết