Ai có tài liệu đó rồi thì đọc tiếp, chưa có thì chịu khó down về hén. 77 bài tập C++ đó hình như là tài liệu lưu hành nội bộ của trường ta thì phải! Rất đáng để đọc vì có thể gặp các bài tương tự trong đề thi (suy nghĩ chủ quan ).
Nhằm giúp các bạn dễ dàng tiếp cận với môn học này hơn. Mình mạn phép dùng kiến thức ít ỏi về lập trình của bản thân viết một loạt bài giải + hướng dẫn chi tiết . Bằng cách này bạn sẽ ít phải gặp khó khăn hơn khi học và thực hành bởi lập trình là một môn rất khó xơi.
Một số lưu ý:
1.Code mình tự viết và test xong rồi mới post vì thế không thể chắc chắn những vấn đề phái sinh ngoài ý muốn trong lúc chạy chương trình và càng không đảm bảo tính hoàn hảo của code.
2.Code viết trong Borland C++ 5.02, khuyến khích các bạn đang xài bản cũ nâng cấp từ bản 4.0 trở lên để hạn chế tối đa lỗi.
3.Bạn nào có bất cứ thắc mắc gì cứ comment tại topic này. Mình hổng dám chắc trả lời được hết nhưng biết chắc sẽ có những ACE khác biết và giải đáp được cho bạn.
4.Người ta nói "Sức người có hạn - Lựu đạn có chốt". Hơ hơ mong được sự giúp đỡ từ những Bro đang ẩn mình trong lớp ta viết giùm vài bài giải nhé.
Chúc các bạn học tốt !
Bài tập 1: Viết chương trình hiện ra màn hình dòng chữ " CHAO MUNG CAC BAN DEN VOI MON HOC C++"
Đây là bài giải có sẵn trong tài liệu
Code:
#include using namespace std;
int main() { cout<<” CHAO MUNG CAC BAN DEN VOI MON HOC C++”; return 0 ; }
Bài giải trên đúng không có gì sai nhưng lại sử dụng thư viện iostream.h đã cũ và lỗi thời. Khi chạy chương trình thì hiện lên cái màn hình đen rồi tắt cái phụt chưa kịp thấy dòng chữ đâu hết
Hiện nay , đa số các lập trình viên sử dụng thư viện stdio.h có chức năng xuất nhập dữ liệu tương tự. Khuyến khích các bạn nên chuyển sang dùng thư viện này bởi nó tốt hơn nhiều. Mọi thông tin về thư viện stdio.h bạn có thể xem lại cuốn sách này.
#include #include void main() { printf("CHAO MUNG CAC BAN DEN VOI MON HOC C++"); getch(); }
+Phần khai báo, dùng thư viện conio.h để sử dụng lệnh getch() làm cho màn hình đứng lại chờ nhập kí tự từ bàn phím mục đích là để thấy được dòng chữ trên màn hình.Các bạn cứ nhấn Enter là được rồi chương trình sẽ tự động thoát do không phải làm gì nữa tiếp theo. +Theo quy định chuẩn của C thì phải khai báo int main(...) và phải có giá trị trả về return x , nhằm mục đích chương trình phải trả về một giá trị nào đấy sau khi thực thi xong, báo cho hệ thống biết có lỗi xảy ra hay không hoặc cái gì đó đại loại như vậy. Tuy nhiên,đó là nếu dịch trên window thì luôn phải trả về giá trị! Mấy bạn xài C++ chạy trên DOS thì ta muốn làm sao cũng được nên mình xài void main() tức tự động trả về giá trị rỗng. Lần sau sẽ dùng int main() cho nó đúng chuẩn hen, cái này còn xa lắm chưa cần hiểu bây giờ đâu, cứ xem nó như là cú pháp đi.
Số lần được cảm ơn :Message reputation : 100% (1 vote)
Sat Feb 06, 2010 3:14 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Bài tập 2
Bài tập 2: Viết chương trình xuất ra màn hình hình vuông đặc kí tự '*' có cạnh bằng a (với a nhập từ bàn phím)
Code:
#include<conio.h> #include<stdio.h> int main() { int a,i,j; printf("Nhap a"); scanf("%d",&a); \\Có vấn đề nhỏ, xem giải thích bên dưới for(i=1;i<=a;i++) { for(j=1;j<=a;j++) printf("*"); printf("\n"); } getch(); return 0; }
+ Bài tập này dễ không có gì khó. Bạn nào còn mập mờ mấy cấu trúc lệnh trong bài giải có thể xem lại quyển Lập trình C căn bản mình post link ở trên.
+ Có bạn sẽ hỏi ở dòng scanf tại sao trước biến a lại đặt dấu '&' ? Nếu không đặt dấu đó thì sao ? Dấu '&' là để bổ sung đối số cho biến. Mỗi khi gọi biến đến một đối tượng trong chương trình theo kiểu được chỉ định tương ứng của nó mà bạn đã định dạng sẽ theo thứ tự như nhau. Hiểu cho đơn giản là như thế này nè! Nguyên nhân là do sự quá cao cấp của C++ chứ trong Pascal thì không có vụ này đâu nha! Trong chương trình trên biến a bị gọi đến 2 đối tượng (đem so sánh với i và j ).Như vậy có sự lẫn lộn qua lại giữa 2 đối tượng này trong khi thực hiện chương trình do C++ không bảo đảm thứ tự của việc so sánh i với a và j với a trong phạm vi số nguyên dẫn đến một số lỗi nhẹ thì sai hỏng kết quả nặng thì Crash Program. Tốt nhất thì khi dùng hàm scanf bạn nhớ thêm dấu '&' trước biến nhé. Trình độ của chúng ta chưa đến mức độ bỏ cái dấu ấy đâu.
Số lần được cảm ơn :Message reputation : 100% (1 vote)
Sat Feb 06, 2010 3:40 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Bài tập 3
Bài tập 3: *Viết chương trình nhập vào bán kính của hình tròn; xuất ra diện tích và chu vi của hình tròn đó. *Diện tích của hình tròn biết trước bằng cách nhập vào từ bàn phím, tính và in ra bán kính của hình tròn đó.
Chu vi CV=2*Pi*r Diện tích S=Pi*r*r
Code:
#include<conio.h> #include<stdio.h> int main() { int r; float CV,S,Pi=3.14; printf(" Nhap r"); scanf("%d",&r); CV=2*Pi*r; S=Pi*r*r; printf("\n Chu vi =%.2f",CV); printf("\n Dien tich=%.2f",S); getch(); return 0; }
Code:
#include<conio.h> #include<stdio.h> #include<math.h> int main() { float r,S,Pi=3.14; printf(" Nhap S"); scanf("%5f",&S); r=sqrt(S/3.14); printf("\n Ban kinh=%.2f",r); getch(); return 0; }
Sat Feb 06, 2010 4:01 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Bài tập 4,5
Bài tập 4: Viết chương trình nhập vào đáy lớn, đáy nhỏ, chiều cao của hình thang; xuất ra diện tích của hình thang đó
S=(đáy lớn + đáy nhỏ)*chiều cao/2
Tương tự bài 3 thui bỏ qua cho rồi :lol!:
Bài tập 5: Chương trình tính giá trị biểu thức y= 3*exp(cos(t+1))
Code:
#include<conio.h> #include<stdio.h> #include<math.h> int main() { double t,y; printf("Nhap so thuc t"); scanf("%f",&t); y=3*exp(cos(t+1)); printf("Gia tri cua y la %.2f",y); getch(); return 0; }
Số lần được cảm ơn :Message reputation : 100% (1 vote)
Sat Feb 06, 2010 4:27 pm
Tổng điều hành
Regulus™
Giới tính :
Đến từ : ...
Join : 06/11/2009
Bài gửi : 758
HUMOR : Nghe nhạc.. Computer
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
mình thấy bạn hơi nhầm lẫn về các câu lệnh trên C và C++: Tuy các câu lệnh trên C có thể chạy trên nền C++ và ngược lại nhưng chúng ta nên chú ý sử dụng câu lệnh C++ cho đúng chuẩn ...
Đối với C: thư viện nhập xuất và đồ họa là conio.h và stdio.h Đối với C++: Đó là iostream.h
Câu lệnh nhập xuất trong C: printf và scanf ( hoặc printf_s và scanf_s nếu bạn sử dụng VS >=2005 ) Câu lệnh nhập xuất trong C++: cin và cout
Đối với thư viện chuẩn iostream.h vẫn có thể hiển thị kết quả trên màn hình.. Chỉ cần nhấn phím Ctrl + F5 là xong
Các bài tập ở trên phần lớn bạn làm theo phong cách C ... Nên làm theo C++ sẽ hay hơn :d
Đó là góp ý nho nhỏ của mình ... Rất cảm ơn bạn đã share code cho mọi người tham khảo .... Mong bạn tích cực phát huy ... Thanks
Sat Feb 06, 2010 4:59 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
Regulus đã viết:
mình thấy bạn hơi nhầm lẫn về các câu lệnh trên C và C++ : Tuy các câu lệnh trên C có thể chạy trên nền C và ngược lại nhưng chúng ta nên chú ý sử dụng câu lệnh C cho đúng chuẩn ...
Đối với C: thư viện nhập xuất và đồ họa là conio.h và stdio.h Đối với C++ : Đó là iostream.h
Câu lệnh nhập xuất trong C: printf và scanf ( hoặc printf_s và scanf_s nếu bạn sử dụng VS >=2005 ) Câu lệnh nhập xuất trong C++ : cin và cout
Đối với thư viện chuẩn iostream.h vẫn có thể hiển thị kết quả trên màn hình.. Chỉ cần nhấn phím Ctrl F5 là xong
Các bài tập ở trên phần lớn bạn làm theo phong cách C ... Nên làm theo C++ sẽ hay hơn
Đó là góp ý nho nhỏ của mình ... Rất cảm ơn bạn đã share code cho mọi người tham khảo .... Mong bạn tích cực phát huy ... Thanks
Thật là hâm mộ PRO quá đi Giúp tui mở mang đầu óc nhiều lắm nha ! Rút kinh nghiệm, từ bài tập thứ 6 trở đi, mình sẽ viết code theo phong cách C++ như bạn Regulus đã nhắc nhở. 5 bài tập ở trên chắc không cần phải viết lại đâu nhỉ ? Các bạn ITK35 của chúng ta đầu óc thông minh, sáng lạng chắc chắn biết tự sửa lại đúng hông nè! Mà cho dù không sửa lại làm y chang như thế thầy cũng cho 9.5 điểm ò
Sat Feb 06, 2010 5:07 pm
Tổng điều hành
Regulus™
Giới tính :
Đến từ : ...
Join : 06/11/2009
Bài gửi : 758
HUMOR : Nghe nhạc.. Computer
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
Bài 2:
Code:
#include <iostream> using namespace std;
void main() { int a, i, j; cout<<"Ban hay nhap do dai canh: "; cin>>a; for (i = 1; i<= a; i++) { for (j =1; j<= a; j++) cout<<"* "; cout<<"\n"; } }
int r; cout<<"Nhap vao ban kinh hinh tron : "; cin>>r; float s=pi*pi*r; cout<<"Dien tich hinh tron co ban kinh "<<r<<" la "<<s<<endl; }
Bài 5:
Code:
#include<iostream> using namespace std; #include<cmath> int main() { double t, y; cout<<"Moi ban nhap 1 so thuc t: "; cin>>t; y= 3*exp(cos(t+1)); cout<<"Gia tri cua bieu thuc can tinh la: "<< y<<endl; return 0; }
Bài 13
Code:
#include<iostream> using namespace std;
void main() { int a; cout<<"Nhap vao mot so nguyen "; cin>>a; if (a%2==0) cout<<"So chan"; else cout<<"So le"; cout<<"\n"; }
Qua tết làm tiếp ) .. năm nay ko làm nữa ) .. up
Mon Feb 08, 2010 11:03 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Bài tập 6,7
Bài tập 6: Viết chương trình nhập vào 2 số nguyên và các phép toán , -, *, /. In ra kết quả phép toán đó.
Code:
Bài giải trong tài liệu
Bài tập 7: Viết chương trình nhập vào thông tin của một sinh viên bao gồm : Mã số sinh viên, họ tên, quê quán, năm sinh, điểm trung bình các năm học; xuất ra thông tin của sinh viên vừa nhập.
Code:
#include <iostream> using namespace std; #include <conio> int main() { char MS[20],HT[100],QQ[100]; \\Chú ý 1 int NS; float DTB; cout<<"Nhap ma so sinh vien \n"; cin.getline(MS,20); \\Chú ý 2 cout<<"Nhap Ho Ten \n"; cin.getline(HT,100); cout<<"Nhap que quan \n"; cin.getline(QQ,100); cout<<"Nhap nam sinh \n"; cin>>NS; cout<<"Nhap diem trung binh cac nam hoc \n"; cin>>DTB; cout<<"**** Thong tin sinh vien ****"; cout<<"\n MSSV: "< cout<<"\n Ho ten: "< cout<<"\n Que quan: "< cout<<"\n Nam sinh: "< cout<<"\n Diem trung binh cac nam hoc: "< getch(); return 0; }
Chú ý 1:Có thể khai báo biến chuỗi kí tự theo kiểu char biến[độ rộng(tối đa 255)] . Nhược điểm là chuỗi chỉ được tối đa 255 kí tự thôi .
Chú ý 2: Dùng hàm cin.getline(biến,độ rộng) để có thể đánh được khoảng trắng khi nhập tên hoặc quê quán. Cái này phải sử dụng riêng do tính chất của hàm cin không nhập được chuỗi kí tự có khoảng trắng
Mon Feb 08, 2010 11:29 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Bài tập 8, 9
Bài tập 8: Viết chương trình nhập vào ba cạnh của một tam giác, tính và xuất ra diện tích của tam giác đó
Code:
#include <iostream> using namespace std; #include <conio> #include <math> int main() { float a,b,c,p,S; cout<<"Nhap 3 canh tam giac "; cin>>a>>b>>c; p=(a+b+c)/2; S=sqrt(p*(p-a)*(p-b)*(p-c)); cout<<"Dien tich tam giac la: "< getch(); return 0; }
Bài tập 9: Một đoạn thẳng được biểu diễn bởi 2 điểm trong mặt phẳng. Viết chương trình nhập vào hai điểm của một đoạn thẳng và xuất ra trung điểm của đoạn thẳng đó.
Code:
#include <iostream> using namespace std; #include <conio> #include <math> int main() { float xA,xB,yA,yB; cout<<" Nhap xA,yA,xB,yB "; cin>>xA>>yA>>xB>>yB; cout<<"\n Trung diem co toa do la I("<<float((xA+xB)/2)<<","<<float((yA+yB)/2)<<")"; \\Chú ý getch(); return 0; }
+Chú ý:Để rút ngắn bài giải và khỏi phải khai báo thêm biến x1, x2. Ta có thể dùng hàm cout đưa ra màn hình giá trị của x1 hay x2 thông qua biểu thức tính của nó và đặt biểu thức trong float() để đưa ra màn hình giá trị thực
Được sửa bởi blackrose4s ngày Mon Feb 08, 2010 11:52 pm; sửa lần 1.
Mon Feb 08, 2010 11:47 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Bài tập 10,11
Bài tập 10: Viết chương trình nhập vào ba đỉnh của một tam giác. Xuất ra trọng tâm của tam giác đó
Giống bài 9 ghê có điều thêm 2 biến nữa. Các bạn tự giải nhé :flower:
Bài tập 11: Xét tam thức bậc 2 có dạng ax2 + bx + c. Viết chương trình nhập vào các hệ số của một tam thức bậc 2 và giá trị của biến số x; xuất ra giá trị của tam thức bậc 2 đó.
+Bài này đáng ra mà cho hay một chút phải thêm code ngăn không cho nhập số 0 ở biến a thì mới đúng là tính giá trị của tam thức bậc 2. Mà thôi mệt ! Nhiu đó là đủ gòi, muốn nhập số phức cũng được
Tue Feb 09, 2010 1:31 am
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
Bài tập 12: Hãy tìm biểu thức đúng trong các biểu thức dưới đây:
(i=j)++ i+j ++ ++(i+j) ++i+++j
Đầu tiên cần biết rằng một biểu thức phải trả về giá trị có thể là kiểu số nguyên, số thực, kiểu kí tự hay kiểu boolean. Nhìn sơ qua 4 biểu thức trên không có kí tự , không có các toán tử quan hệ nên không thể là kiểu kí tự hay kiểu boolean
Đây là một bài khó. Để làm được mà không ngồi máy test thì phải thuộc thứ tự ưu tiên của các toán tử. Thui thì ngồi ôn lại bài một chút:
Khi viết các biểu thức phức tạp với nhiều toán hạng các bạn có thể tự hỏi toán hạng nào được tính trước, toán hạng nào được tính sau. Ví dụ như trong biểu thức sau:
a = 5 + 7 % 2
có thể có hai cách hiểu sau:
a = 5 + (7 % 2) với kết quả là 6,
hoặc a = (5 + 7) % 2 với kết quả là 0
Câu trả lời đúng là biểu thức đầu tiên. Vì nguyên nhân nói trên, ngôn ngữ C đã thiết lập một thứ tự ưu tiên giữa các toán tử, không chỉ riêng các toán tử số học mà tất cả các toán tử có thể xuất hiện trong C . Thứ tự ưu tiên của chúng được liệt kê trong bảng sau theo thứ tự từ cao xuống thấp.
Thứ tự
Toán tử
Mô tả
Associativity
1
::
scope
Trái
2
() [ ] -> . sizeof
Trái
3
--
tăng/giảm
Phải
~
Đảo ngược bit
!
NOT
& *
Toán tử con trỏ
(type)
Chuyển đổi kiểu
-
Dương hoặc âm
4
* / %
Toán tử số học
Trái
5
-
Toán tử số học
Trái
6
<< >>
Dịch bit
Trái
7
< <= > >=
Toán tử quan hệ
Trái
8
== !=
Toán tử quan hệ
Trái
9
& ^ |
Toán tử thao tác bit
Trái
10
&& ||
Toán tử logic
Trái
11
?:
Toán tử điều kiện
Phải
12
= = -= *= /= %= = <<= &= ^= |=
Toán tử gán
Phải
13
,
Dấu phẩy
Trái
Associativity định nghĩa trong trường hợp có một vài toán tử có cùng thứ tự ưu tiên thì cái nào sẽ được tính trước, toán tử ở phía xa nhất bên phải hay là xa nhất bên trái.Nếu bạn muốn viết một biểu thức phức tạp mà lại không chắc lắm về thứ tự ưu tiên của các toán tử thì nên sử dụng các ngoặc đơn. Các bạn nên thực hiện điều này vì nó sẽ giúp chương trình dễ đọc hơn
Bây giờ giải thích từng biểu thức :
Để cho dễ hiểu, giả bộ mình gán i=3 ; j=5 và toàn bộ biểu thức gán cho biến a
a=(i=j)++
Ưu tiên trong ngoặc và bên trái trước -> Đầu tiên gán giá trị của biến j cho i -> do i nằm bên trái nên là nhân vật chính, j có nhiệm vụ phải truyền giá trị của mình cho i. "++" được ưu tiên hơn dấu gán "=" nhưng do "++" nằm phía bên phải (i=j) chứ không nằm liền kề với dấu gán "=" nên phải ưu tiên dấu gán "=" nằm bên trái trước. Ra khỏi cặp dấu ngoặc (), i có giá trị là 5 lập tức truyền giá trị (hay gán giá trị) cho a rồi sau đó i tăng lên một đơn vị. Sau khi xong toàn bộ thì a = 5 , i =6 , j=5
Kiểm tra lại qua đoạn mã sau
Code:
#include <iostream> using namespace std; #include <conio> int main() { float i=3,j=5,a,b,c; a=i+j++; cout<<a<<i<<j; getch(); return 0; }
Nói chung là cứ xem lại bảng thứ tự ưu tiên rồi xét. Chú ý Associativity mấy toán tử ưu tiên kiểu bên phải khi chúng nằm liền kề nhau, còn tổng thể thì vẫn là ưu tiên bên trái trước.
a=i+j++ với i=3,j=5
Đầu tiên i+j=8 . Sau đó a=i+j=8 . Cuối cùng j+1=6
a=++(i+j) với i=3,j=5
Đầu tiên i+j=8. Sau đó không tính được tiếp do toán tử ++ chỉ sử dụng được khi nó đứng trước hay đứng sau 1 biến. Ở đây, trước và sau nó là dấu gán"=" và dấu ngoặc "(" =>Biểu thức sai.
a=++i+++j với i=3,j=5
Trình dịch sẽ hiểu như thế này a=++i++ +j (do ++ ưu tiên hơn nên được hiểu trước) Trước và sau biến i đều có toán tử tăng "++". Điều này vi phạm quy tắc sử dụng của toán tử tăng/giảm trong C ( Mình không rõ lắm chỗ này hình như là có liên quan đến con trỏ gì ấy) Trình dịch sẽ báo lỗi => Biểu thức sai
Fri Feb 19, 2010 6:45 am
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Bài tập 15*
Bài tập 15: Viết chương trình thể hiện trò chơi oẳn tù tì với quy ước: Búa = 'B'; Bao ='O'; Kéo = 'K'. Nhập vào hai kí tự đại diện cho hai người chơi. Xuất ra màn hình câu thông báo người chơi nào thắng hoặc hoà
Code:
#include <iostream> using namespace std; #include <conio> int main() { char a,b; //B1 int c,d; cout<<"Anh ra cai \n"; //B2 cin>>a; if (a=='B') c=1; else if (a=='O') c=2; else c=3; cout<<"Em ra cai \n"; cin>>b; if (b=='B') d=1; else if (b=='O') d=2; else d=3; switch(c^d) { //B3 case 0: // draw //B4 cout<<"Hoa roi!"; break; case 1: // KEO vs BAO if(a=='K') cout<<"Anh thang - Em thua"; else cout<<("Anh thua - Em thang"); break; case 2: // BUA vs KEO if(a=='B') cout<<"Anh thang - E thua"; else cout<<"Anh thua - Em thang"; break; case 3: // BUA vs BAO if(a=='B') cout<<"Anh thua - Em thang"; else cout<<("Anh thang - Em thua"); break; } getch(); return 0; }
Giải thích từng bước làm:
B1: Khai báo 2 biến a,b kiểu char để nhận 3 kí tự B O K tương ứng với Búa Bao Kéo . Tiếp đó khai báo thêm 2 biến c,d kiểu int (c đại diện cho a, d đại diện cho b) để quy ước 3 kí tự B O K tương ứng sang 3 số 1 2 3 cho dễ tính toán.
B2: Giả sử 2 người chơi là anh với em . Nhiệm vụ của bước này là nhận các kí tự từ bàn phím vào 2 biến a,b rồi dựa vào đó quy ra được c với d
B3: XOR là toán tử thao tác trên bit nhưng do tính chất đơn giản của bài toán nên ta có thể lợi dụng toán tử này để rút ngắn bài giải lại. Trước hết xin giới thiệu về toán tử XOR và cách sử dụng:
XOR
Cũng giống OR, toán tử thao tác bit XOR (còn gọi là OR có loại trừ - exclusive OR) cũng là một toán tử hai ngôi, có nhiệm vụ thực hiện tính toán (trên từng bit) với hai chuỗi bit có cùng độ dài để tạo ra một chuỗi bit mới có cùng độ dài với hai chuỗi bit ban đầu. Tuy nhiên, trên mỗi cặp bit tương ứng nhau của hai toán hạng, toán tử XOR sẽ trả về 1 nếu chỉ có một trong hai bit là 1 (và bit còn lại là 0), ngược lại, XOR trả về bit 0.Trong C, C++, Java, C#, toán tử thao tác bit XOR được biểu diễn bằng kí hiệu "^" (dấu mũ) Ví dụ:
0101 ^ 0011 --------- 0110
Ôi! Cái này mệt nhức đầu lắm, trình độ mới học chưa dám nghĩ đến.Đơn giản chỉ cần hiểu như thế này: 2 chuỗi bit trên có cùng độ dài, ta xếp chúng lại song song với nhau sau đó so sánh số trên và dưới cứ giống nhau thì kết quả ở dưới điền số 0, khác nhau thì điền số 1 .
Bây giờ liên quan đến bài toán của chúng ta: c và d chỉ có thể nhận 1 trong 3 giá trị là 1, 2 và 3 tương ứng trong hệ nhị phân là 01, 10 và 11 . Ta thực hiện c^d ( c xor d ) nghĩa là đã thực hiện phép toán XOR chúng trong hệ nhị phân. Làm cái ví dụ cho dễ hiểu:
Giả sử c=1; d=2 01 ^ 10 -------------- 11 -----> số 3 trong hệ thập phân
Giả sử c=3; d=1 11 ^ 01 -------------- 10 ------> số 2 trong hệ thập phân
Nếu 2 số giống nhau thì tất nhiên trả về 00 tức là số 0. Hơ hơ và cũng hổng hiểu tại sao trong phạm vi 1 đến 3 thì cứ 2 số khác nhau thì trả về số còn lại. Không biết tới đây còn ai chưa hiểu nữa nhỉ
B4: Bước còn lại thì đơn giản, nó trả về số nào thì ta biết kí tự tương ứng với số đó Anh và Em đều không oẳn ra, ta dùng If giải quyết ngon ơ phần còn lại .
Bài này tốn nhiều mồ hôi và nước mắt của tui lắm đó nha !
Fri Feb 19, 2010 8:47 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Bài tập 16,17
Bài tập 16: Viết chương trình tính lương của nhân viên dựa theo thâm niên công tác (TNCT) như sau; Lương=hệ số*lương căn bản, trong đó lương căn bản là 650000 đồng +Nếu TNCT <12 tháng: hệ số =1.92 +Nếu TNCT 12 <= TNCT < 36 tháng : hệ số = 2.34 +Nếu 36<= TNCT <60 tháng: hệ số = 3 +Nếu TNCT >= 60 tháng: hệ số = 4.5
Code:
#include <iostream> using namespace std; #include <conio> int main() { const int luongcb=650; int tnct; double heso,luong; cout<<" Cho biet tham nien cong tac \n"; cin>>tnct; if (tnct < 12) heso = 1.92; else if (tnct < 36) heso = 2.34; else if (tnct < 60) heso = 3; else heso = 4.5; luong=luongcb*heso; cout<<"Luong = "<<luong<<"000 ngan dong"; getch(); return 0; }
Bài tập 17: Một điểm KARAOKE tính tiền khách hàng theo công thức sau: +Mỗi giờ trong 3 giờ đầu tiên tính 30 000 đồng/giờ +Mỗi giờ tiếp theo có đơn giá giảm 30% so với đơn giá trong 3 giờ đầu tiên. Ngoài ra nếu thời gian thuê phong từ 8 - 17 giờ thì được giảm giá 10%. Viết chương trình nhập vào giờ bắt đầu, giờ kết thúc và in ra số tiền khách hàng phải trả biết rằng 8 <= giờ bắt đầu <= 24.
Code:
#include <iostream> using namespace std; #include <conio> int main() { int giobd,giokt,thoigian,tien; do { cout<<"Nhap gio bat dau \n"; cin>>giobd; cout<<"Nhap gio ket thuc \n"; cin>>giokt; } while((giobd < 8)||(giokt > 24)||(giobd > giokt)); thoigian=giokt-giobd; if (thoigian > 3) tien = 3 * 30000 + (thoigian - 3) * 30000 * 0.7; else tien = thoigian * 30000; if (giokt <= 17) tien *= 0.9; cout<<"So tien la "<<tien<<" ngan dong"; getch(); return 0; }
Fri Mar 05, 2010 11:31 am
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
Bài tập 18: Nhập vào ngày tháng của một năm hiện tại. Bạn hãy viết chương trình + Kiểm tra tính hợp lệ của ngày tháng nhập + Cho biết tháng này thuộc quý mấy trong năm + Cho biết tháng nhập có bao nhiêu ngày + Cho biết ngày hôm sau của ngày đã nhập là ngày nào + Cho biết ngày hôm trước của ngày đã nhập là ngày nào
Code:
#include <iostream> using namespace std; #include <conio> int main() { int mth[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int ngay,thang,nam; cout <<"Nhap ngay, thang, nam: \n"; cin >> ngay >> thang >> nam; if (((nam%4==0)&&(nam%100!=0))||(nam%400==0)) mth[1]++; if ((ngay>0)&&(ngay<=mth[thang-1])&&(thang>0)&&(thang<13)&&(nam>0)) { if ((thang==1)||(thang==2)||(thang==3)) cout<<"Thang "<<thang<<" thuoc quy I \n"; else if ((thang==4)||(thang==5)||(thang==6)) cout<<"Thang "<<thang<<" thuoc quy II \n"; else if ((thang==7)||(thang==8)||(thang==9)) cout<<"Thang "<<thang<<" thuoc quy III \n"; else cout<<"Thang "<<thang<<" thuoc quy IV \n"; cout<<"Thang "<<thang<<" co "<<mth[thang-1]<<" ngay \n"; if (ngay==mth[thang-1]) cout<<"Ngay hom sau la ngay 1 \n"; else cout<<"Ngay hom sau la ngay "<< ngay+1 <<"\n"; if (ngay==1) cout<<"Ngay hom truoc la ngay "<<mth[thang]; else cout<<"Ngay hom truoc la ngay "<<ngay-1; } else cout << "Ngay thang ban nhap khong hop le"; getch(); return 0; }
+ Tạo mảng mth gồm 12 phần tử với giá trị mỗi phần tử tương ứng với số ngày các tháng từ 1 đến 12. Lưu ý, C++ quy định địa chỉ của phần tử đầu tiên là mth[0] + Nhập ngày tháng năm + Kiểm tra năm người nhập có phải là năm nhuận hay không? Nếu là năm nhuận thì truy cập đến địa chỉ của tháng 2 ( mth[1] ) tăng nó lên thêm 1 đơn vị tức 1 ngày. + Phần còn lại thì xuất ra màn hình thông tin theo yêu cầu của đề .
Fri Mar 05, 2010 11:58 am
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
Bài tập 19: Viết chương trình nhập vào 3 số, tìm số lớn nhất, nhỏ nhất của 3 số đó.
Code:
#include <iostream> using namespace std; #include <conio> int main() { int a[3],i,j,t; cout<<"Nhap 3 so \n"; cin>>a[0]>>a[1]>>a[2]; for(i=0;i<2;i++) for(j=i+1;j<3;j++) if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } cout<<"Max= "<<a[2]<<endl; cout<<"Min= "<<a[0]; getch(); return 0; }
Bài tập 20: Viết chương trình nhập vào 4 số, tìm số lớn nhất, nhỏ nhất của 4 số đó.
Code:
#include <iostream> using namespace std; #include <conio> int main() { int a[4],i,j,t; cout<<"Nhap 4 so \n"; cin>>a[0]>>a[1]>>a[2]>>a[3]; for(i=0;i<3;i++) for(j=i+1;j<4;j++) if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } cout<<"Max= "<<a[3]<<endl; cout<<"Min= "<<a[0]; getch(); return 0; }
Fri Mar 05, 2010 12:45 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
Bài tập 22: Viết chương trình giải bất phương trình: ax+b>0
Code:
#include <iostream> using namespace std; #include <conio> int main() { double a,b; do { cout<<"Nhap 2 so \n"; cin>>a>>b; } while (a==0); if (a>0) cout<<"Nghiem: x > "<<-b/a; else cout<<"Nghiem: x < "<<-b/a; getch(); return 0; }
Bài tập 23: Viết chương trình nhập vào 2 phân số, xuất ra tổng, hiệu, tích thương của 2 phân số đó. Lưu ý kiểm tra điều kiện nhập mẫu khác 0 ( dùng do...while )
Code:
#include <conio> #include <math> int main() { double a,b,c,d; do { cout<<"Nhap tu va mau phan so 1 \n"; cin>>a>>b; } while (b==0); do { cout<<"Nhap tu va mau phan so 2 \n"; cin>>c>>d; } while (d==0); cout<<"Tong = "<<(a/b+c/d)<<endl; cout<<"Hieu = "<<abs(a/b-c/d)<<endl; cout<<"Tich = "<<(a/b*c/d)<<endl; if (c!=0) cout<<"Thuong = "<<((a/b)/(c/d)); else cout<<"Thuong khong tinh duoc."; getch(); return 0; }
Sat Mar 06, 2010 10:22 am
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
Bài tập 24: Viết chương trình nhập vào một kí tự. Hãy xét xem đây có phải là kí tự chữ in? Là kí tự chữ thường? Là kí tự số ? Hay là kí tự khác những loại kí tự trên?
Code:
#include <iostream> using namespace std; #include <conio> int main() { char a; int b; cout<<"Nhap ki tu \n"; cin>>a; b=int(a); if ((b>=48)&&(b<=57)) cout<<"La ki tu so"; else if ((b>=65)&&(b<=90)) cout<<"La ki tu chu in hoa"; else if ((b>=97)&&(b<=122)) cout<<"La ki tu chu thuong"; else cout<<"La ki tu dac biet"; getch(); return 0; }
Bài tập 25: Chương trình cho phép bạn nhập vào một số nguyên dương, là lượng điện tiêu thụ (kWh) trong tháng của nhà bạn. Chương trình tính và in số tiền nhà bạn phải trả cho tháng đó được tính theo giá định mức như bảng sau:
100 kwh đầu tiên
50 kwh tiếp
50 kwh tiếp
100 kwh tiếp
Từ 300 kwh trở lên
550 VND
900 VND
1250 VND
1450 VND
1700 VND
và phải đóng thuế giá trị gia tăng 10%.
Code:
#include <iostream> using namespace std; #include <conio> int main() { unsigned int a; long st; cout<<"Nhap luong dien tieu thu (kWh) \n"; cin>>a; if (a<=100) st=a*550; else if ((a>100)&&(a<=150)) st=100*550+(a-100)*900; else if ((a>150)&&(a<=200)) st=100*550+50*900+(a-150)*1250; else if ((a>200)&&(a<=300)) st=100*550+50*900+50*1250+(a-200)*1450; else st=100*550+50*900+50*1250+100*1450+(a-300)*1700; cout<<"So tien phai tra la "<<st*1.1<<" VND."; getch(); return 0; }
Sat Mar 06, 2010 11:29 am
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
Bài tập 26: Một công ty trả lương cho nhân viên (theo tuần) như sau: + Nhà quản lí (mã số 1) nhận một khoản lương cố định X (theo tuần). + Công nhân làm theo giờ (mã số 2) nhận một khoản lương cơ bản Y đồng trong 40 giờ đầu trong tuần và 1.5 lần lương cơ bản cho mỗi giờ vượt mức qui định đó. + Lương công nhân theo lợi nhuận (mã số 3) được nhận 500.000đ công thêm 7% trị giá doanh số Z mà công nhân ấy bán hàng ra trong tuần. + Lương công nhân theo sản phẩm (mã số 4) nhận tiền dựa vào số N sản phẩm mà người đó đã làm ra trong tuần, với mỗi sản phẩm thì người này nhận được S đồng (mỗi người chỉ làm ra một loại sản phẩm nhất định). Viết chương trình cho nhập vào mã số, tùy theo loại công nhân mà cho phép nhập vào những thông tin cần thiết cho công nhân đó để tính lương. Sau đó tính lương mà công ty phải trả cho nhân viên ấy trong tuần.
Code:
Coming soon
Mon Mar 22, 2010 1:30 am
Tổng điều hành
Regulus™
Giới tính :
Đến từ : ...
Join : 06/11/2009
Bài gửi : 758
HUMOR : Nghe nhạc.. Computer
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
Bai 29
Code:
#include <iostream> using namespace std; int main() { int gt=1,n; cout<<"Nhap n="; cin>>n; for(int i = (n % 2)? 1 : 2; i <= n; i += 2) gt *= i; cout<<n<<"!!= "<<gt<<endl; return 0; }
Bai 32
Code:
#include <iostream> #include <cmath> using namespace std; int main() { int n, ngto; ngto = 1; cout << "Nhap gia tri n: "; cin >> n; for (int i=2; i < n; i++) { if (n%i == 0) { ngto = 0; break; } } if (ngto == 1) cout << "\n So "<< n << " la so nguyen to."; else cout << "\n So " << n << " khong phai la so nguyen to."; return 0; }
Bai 38
Code:
#include <iostream> using namespace std; int UCLN(int, int); void main() { int a,b,u ; cout<<"Nhap 2 so a,b : "; cin>>a>>b; u=UCLN(a,b); int BCNN=(a*b)/u; cout<<"Uoc chung lon nhat cua "<<a<<" & "<<b<<" la "<<u<<endl; cout<<"Boi chung nho nhat cua "<<a<<" & "<<b<<" la "<<BCNN<<endl; }
int UCLN(int a, int b) { while (a!=b) { if (a>b) a=a-b; else b=b-a; } return a; }
void main() { long tien,t500=0,t200=0,t100=0,t50=0,t20=0,t10=0,t5=0,t2=0,t1=0; cout<<"Nhap so tien can doi : "; cin>>tien; if (tien>=500000) { t500=tien/500000; tien=tien-t500*500000; } if (tien>=200000) { t200=tien/200000; tien=tien-t200*200000; } if (tien>=100000) { t100=tien/100000; tien=tien-t100*100000; } if (tien>=50000) { t50=tien/50000; tien=tien-t50*50000; } if (tien>=20000) { t20=tien/20000; tien=tien-t20*20000; } if (tien>=10000) { t10=tien/10000; tien=tien-t10*10000; } if (tien>=5000) { t5=tien/5000; tien=tien-t5*5000; } if (tien>=2000) { t2=tien/2000; tien=tien-t2*2000; } if (tien>=1000) { t1=tien/1000; tien=tien-t1*1000; }
cout<<"Ban doi duoc \n" <<t500<<" To 500k \n " <<t200<<" To 200k \n " <<t100<<" To 100k \n " <<t50<<" To 50k \n " <<t20<<" To 20k \n " <<t10<<" To 10k \n " <<t5<<" To 5k \n " <<t2<<" To 2k \n " <<t1<<" To 1k \n "; }
Bai 53
Code:
#include <iostream> using namespace std; bool ktNgTo(int ); void main() { int n; cout<<"n= "; cin>>n; for (int i=2;i<=n;i++) if (ktNgTo(i)) cout<<i<<" ";
}
bool ktNgTo(int n) { bool nt=true; for (int i=2;i<n;i++) { if (n%i==0) { nt=false; break; } } return nt; }
Tìm số đảo ngược của 1 số
Code:
#include <iostream> using namespace std;
void main() {
int i,n; cout<<"Nhap vao n="; cin>>n; int k=n; int s=0; while (n!=0) { i=n%10; s=10*s+i; n=n/10; } cout<<"So dao nguoc : "<<s<<endl; if (s==k) cout<<"Day la so doi xung "; else cout<<"Ko doi xung ";
}
Max n số
Code:
# include <iostream> using namespace std;
void main() { int day[200]; int sophantu; do { cout<<"Nhap so phan tu cua mang "; cin>>sophantu; } while ((sophantu<=0)|| (sophantu>200)); for (int i=1; i<=sophantu;i++) { cout<<"Nhap phan tu thu "<<i<<"= "; cin>>day[i]; } int max=day[1]; for (int i=1; i<=sophantu;i++) { if (max<day[i]) max = day[i]; } cout<<max<<" la so lon nhat trong "<<sophantu<<" so da nhap \n"; }
void nguoivsmay() { srand((unsigned)time(NULL)); int may=rand()%100; bool dung=false; int nguoichoi; cout<<"Ban co 7 lan doan!!! CO LEN \n"; for (int i=1;i<=7;i++) { cout<<"-------------Lan doan thu "<<i<<"/7------------------------\n";
cout<<"Nhap so ban doan nao : "; cin>>nguoichoi; if (may>nguoichoi) cout<<"KO DUNG !!! .... So ban chon NHO QUA\n "; if (may<nguoichoi) cout<<"KO DUNG !!! .... So ban chon LON QUA\n"; if (may==nguoichoi) { dung=true; win() ; break;
} cout<<"-------------------------------------\n"; } if (dung==false) lose(); choitiep();
} void mayvsnguoi() { bool dung=false; srand((unsigned)time(NULL)); int nguoichoi,solan,may; cout<<"Nhap so ban muon may doan "; cin>>nguoichoi; cout<<"Nhap so lan gioi han : "; cin>>solan; for (int i=1;i<=solan;i++) {
may=rand()%100; cout<<"Lan doan thu "<<setw(3)<<i<<" : May doan so "<<may<<endl;
if (may==nguoichoi) { dung=true; lose(); break;
}
} if (dung==false) win(); choitiep(); } void game() { system("cls"); int chon; cout<<"------------------ Rex Riddle -----------------------\n"; cout<<"******************************************************\n" ; cout<<"************** TRO CHOI DOAN SO *******************\n" ; cout<<"******************************************************\n" ; cout<<endl; cout<<"Vui long chon tro choi ^^ \n"; cout<<"1. Nguoi vs may ! \n"; cout<<"2. May vs nguoi ! \n"; cout<<"3. Thoat \n"; do {
cin>>chon; if ((chon<1)||(chon>3)) game();
} while ((chon!=1)&&(chon!=2)&&(chon!=3));
system("cls"); if (chon==1) nguoivsmay(); if (chon==2) mayvsnguoi();
void choitiep() { char choitiep; cout<<"Ban co muon choi tiep ko ?? (C/K) "; cin>>choitiep; if ((choitiep=='C')||(choitiep=='c')) main();
}
[i][i]
[/i][/i]
Đoạn code trên có một cái mới về phần tạo số ngẫu nhiên.... mọi người đọc bài này có thể hiểu thêm chút
[/i][/i]Những tình huống không thể dự đoán trước được sẽ làm nên sự hấp dẫn cho game. Chẳng hạn, sự thay đổi chiến thuật bất ngờ của đối thủ trong game dàn trận, hoặc sự xuất hiện bất ngờ của một con quái vật trong action game. Tạo nên một con số ngẫu nhiên là một kĩ thuật cơ bản của dạng này.
Giới thiệu chương trình Die Roller: (đổ xúc xắc)
Chương trình Die Roller tái hiện lại việc đổ một con xúc xắc có sáu mặt. Máy tính sẽ tính toán mặt nào sẽ xuất hiện một cách ngẫu nhiên. Hình 2.11 cho thấy kết quả của chương trình:
Hình 2.11: Chương trình tạo ra một con số ngẫu nhiên. Gọi hàm rand():
Một trong những điều tôi làm đầu tiên là include file mới:
Code: #include File cstdlib chứa những hàm tương tác với con số ngẫu nhiên. Vì tôi đã include nó, tôi được phép gọi hàm thuộc file này, cụ thể là hàm rand(), đó là những gì tôi làm ở hàm main():
Code: int randomNumber = rand(); //tạo một con số ngẫu nhiên Như bạn đã học ở Chương 1, hàm là một đoạn code có thể làm việc gì đó, sau đó trả lại một giá trị. Bạn gọi hàm bằng cách sử dụng tên nó, sau đó là hai dấu ngoặc đơn, (hyutars: bên trong hai dấu ngoặc đơn có thể có các đổi). Nếu hàm trả về một giá trị, bạn có thể gán giá trị đó cho một biến. Tôi sử dụng một câu lệnh gán, gán giá trị trả về của hàm rand() (một con số ngẫu nhiên) cho biến randomNumber.
Lưu ý: Hàm rand() tạo ra một con số ngẫu nhiên từ 0 đến ít nhất là 32767. Tôi không thể nói trước giá trị lớn nhất do hàm rand() tạo ra vì nó phụ thuộc vào sự bổ sung của bạn trong C++ (nguyên văn: depends on your implementation of C++). Giá trị lớn nhất được lưu giữ trong hằng số RAND_MAX, được định nghĩa trong file cstdlib. Cho nên nếu bạn muốn biết giá trị lớn nhất hàm rand() có thể tạo ra, chỉ cần cout RAND_MAX.
Hàm còn có thể lấy các giá trị tử bên ngoài vào để sử dụng. Bạn cung cấp các giá trị đó cho hàm bằng cách đặt chúng ở giữa hai dấu ngoặc đơn, tách biệt các giá trị đó bởi dấu phẩy. Những giá trị đó được gọi là đối số, và khi đó, bạn đã trao quyền sử dụng chúng cho hàm. Tôi không để giá trị nào ở hàm rand() vì hàm đó không cần sử dụng đối số nào cả.
Nhân tố tạo ra số ngẫu nhiên: (Seeding the Random Number Generator)
Hàm rand() tạo ra một số giả ngẫu nhiên (không phải là số ngẫu nhiên thật) dựa vào một công thức. Để hiểu vấn đề này ta cứ tưởng tượng rand() đọc một cuốn sách lớn mà nội dung của nó là các số ngẫu nhiên. Nhưng rand() luôn luôn bắt đầu tại trang đầu của cuốn sách lúc chương trình chạy. Điều đó có nghĩa là rand() luôn cho ra những số giống nhau mỗi khi chương trình chạy. (hyutars: bạn có thể kiểm chứng điều này bằng cách bỏ hàm srand đi) Bạn có thể sửa lại vị trí bắt đầu của rand() trong cuốn sách bằng cách dùng hàm srand() (cũng được định nghĩa trong cstdlib). Số ở giữa hai dấu ngoặc đơn hàm srand() là nhân tố để tạo ra số ngẫu nhiên, và để chúng ta có những số ngẫu nhiên thực sự, nhân tố đó phải là một con số khác nhau mỗi khi chương trình chạy. Cách tốt nhất là sử dụng hàm time() (được định nghĩa trong ctime), nó sẽ trả về một con số dựa vào thời gian hiện hành. Để có thể sử dụng hàm time(), tôi include file ctime ở đầu chương trình:
Code: #include Sau đó, trong hàm main(), tôi tạo ra số ngẫu nhiên dựa vào thời gian hiện tại:
Code: srand(time(0)); // seed random number generator based on current time Trong đoạn code trên, tôi dùng hàm time(0) như là một đối số của hàm srand(). Nghĩa là giá trị trả về của hàm time(0) sẽ được sử dụng bởi hàm srand(). Tổng quát, bạn có thể dùng hàm này để làm đối số cho hàm kia, miễn sao giá trị trả về của hàm làm đối số phải hợp lệ. Trong hàm time(0), tôi đã đặt đối số là 0 vào. time(0) sẽ trả về một giá trị dựa vào thời gian hiện hành, sau đó tôi đưa giá trị đó cho hàm srand() -> tạo ra một số thực sự ngẫu nhiên.
Thu hẹp vùng tạo ra số ngẫu nhiên:
Sau khi tạo ra một số ngẫu nhiên, biến randomNumber giữ một giá trị từ 0 đến 32 767. Nhưng tôi muốn số đó phải từ 1 đến 6 thôi(đang chơi trò đổ xúc xắc mà), do đó tôi dùng câu lệnh này để thu hẹp phạm vi đó lại:
Code: int die = (randomNumber % 6) + 1; // get a number between 1 and 6 Tất cả những số dương khi chia cho 6 đều có số dư từ 0 đến 5. Trong câu lệnh trên, tôi lấy số dư và cộng thêm 1, phạm vi của biến die bây giờ sẽ là 1 đến 6 – đúng như điều chúng ta mong muốn. Bạn có thể dùng kĩ thuật này để điều chỉnh phạm vi xuất hiện của số ngẫu nhiên.
Bẫy: Dùng toán tử modulus (chia lấy dư) để điều chỉnh phạm vi xuất hiện của một số ngẫu nhiên không phải lúc nào cũng đúng tuyệt đối. Sẽ có những con số xuất hiện nhiều hơn so với các con số khác. Nhưng dù thế nào đi nữa, đây không phải là vấn đề đối với một game đơn giản.
Trích dẫn :
Túm lại toàn bộ là muốn tạo 1 số ngẫu nhiên ko trùng nhau
Sử dụng lệnh
Code:
srand((unsigned)time(NULL)); Số cần tạo ngẫu nhiên =rand()%(khoảng giới hạn);
Nhớ phải thêm 2 thư viên
Code:
#include <cstdlib> #include <ctime>
Code:
srand((unsigned)time(NULL)); n =rand()%(100);
VD: tạo 1 số n ngẫu nhiên từ 0 - 100
To be continued...
Sun Mar 28, 2010 3:43 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
Bài 26: Đề bài ở phía trên
Code:
#include <iostream> using namespace std; #include <conio> int main() { unsigned int MS; int X,Y,t; do { cout<<"Nhap ma so nhan vien \n"; cin>>MS; } while (MS>4); if (MS==1) { cout<<"Nhap khoan luong co dinh X \n"; cin>>X; cout<<"Luong cho nha quan li la "<<X<<" VND."; } else if (MS==2) { cout<<"Nhap khoan luong co ban Y \n"; cin>>Y; cout<<"Nhap so h lam duoc trong tuan \n"; cin>>t; if (t<=40) X=40*Y; else X=(t-40)*1.5*Y+40*Y; cout<<"Luong cho cong nhan lam theo gio la "<<X<<" VND."; } else if (MS==3) { cout<<"Nhap tri gia doanh so Z \n"; cin>>Y; cout<<"Luong cong nhan theo loi nhuan la "<<(500000+0.7*Y)<<" VND."; } else if (MS==4) { cout<<"Nhap so N san pham lam ra trong tuan \n"; cin>>X; cout<<"Nhap so tien S tra cho moi san pham \n"; cin>>Y; cout<<"Luong cong nhan theo san pham la "<<X*Y<<" VND."; } getch(); return 0; }
Bài 27: Nhập vào một số nguyên có 2 chữ số. In ra cách đọc của nó
Code:
#include <iostream> using namespace std; #include <conio> #include <stdlib> const char* chu[10] = {"khong", "mot", "hai", "ba", "bon", "nam", "sau", "bay", "tam", "chin"}; int main() { int a,hangchuc,hangdonvi; cout<<"Nhap so nguyen 2 chu so \n"; cin>>a; hangchuc = a/10; hangdonvi = a - hangchuc*10; if (a==10) cout<<"muoi"; else if (a<20) cout<<"muoi "<<chu[hangdonvi]; else cout<<chu[hangchuc]<<" muoi "<<chu[hangdonvi]; getch(); return 0; }
Bài này mình không làm theo cấu trúc switch mà tài liệu hướng dẫn bởi nó dài vì thế nên code chưa hay, có vài khiếm khuyết nho nhỏ nhưng chấp nhận được
Bài 28: Nhập vào một số nguyên có 3 chữ số, hãy in ra cách đọc của nó
Code:
Tài liệu đã hướng dẫn rất rõ ràng, các bạn tự làm nhé !
Sun Mar 28, 2010 4:49 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
Bài 30: Viết chương trình nhập vào số nguyên n. Tính và in ra các tổng sau (trong tài liệu) :
Code:
#include <iostream> using namespace std; #include <conio> int main() { int n,i; long int S1=0,S2=0; long double S3=1,S4=0; cout<<"Nhap so nguyen n \n"; cin>>n; for(i=1;i<=n;i++) { S1+=i; S3*=i; S4+=(1/((i+1)*(i+2))); } for (i=1;i<2*n+1;i+=2) S2+=i; cout<<S1<<endl<<S2<<endl<<S3<<endl<<S4; getch(); return 0; }
Bài 31: Viết chương trình đếm và in ra số lượng các số nguyên chia hết cho 3 hoặc 7 nằm trong đoạn từ 1 đến 100.
Code:
#include <iostream> using namespace std; #include <conio> int main() { int dem = 0; for (int i = 1; i <= 100; i++) { if( (i % 3 ==0) || (i % 7 == 0)) { dem++; } } cout<<dem; getch(); return 0; }
Sat Jul 16, 2011 8:38 am
Ma Mới
hieuphysic
Giới tính :
Đến từ : Galaxy
Join : 16/07/2011
Bài gửi : 1
HUMOR : 123456
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]
mình có bài này nhờ bạn giúp! viết trên nền Bordland nhé! Yêu cầu: nhập vào ngày,tháng,năm. xuất ra ngày đó là thứ mấy. nó k đơn giản vì k cho biết ngày làm mốc là thứ mấy hết! cta có thể lấy ngày 1 tháng 1 năm 1 làm thứ 2 k? đương nhiên tính từ Công Nguyên, chứ trước CN còn mệt nữa ak..
Sat Jul 16, 2011 1:59 pm
Người Nhà
blackrose4s
Giới tính :
Đến từ : không gian
Join : 10/11/2009
Bài gửi : 312
HUMOR : không rõ ràng
Thú cưng .:
Tiêu đề: Re: 77 bài tập C++. Giải+Hướng dẫn+Gợi mở chi tiết [update tới Bài 41]