Upload
tho-le
View
73
Download
0
Embed Size (px)
Citation preview
1
ĐÁP ÁN GIÁO TRÌNH 77 BÀI TẬP C++
Tác giả các lời giải này: blackrose4s Diễn đàn http://cnttdhsupham.forumotion.com
Bài 3:
#include <iostream>
using namespace std;
const float pi=3.14;
void main()
{
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 7:
#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: "<
2
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 cinkhông nhập được chuỗi kí tự
có khoảng trắng
Bài 8:
#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 9:
#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;
}
3
+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
Bài 11:
#include <iostream> using namespace std;
#include <conio>
int main() {
float a,b,c,x;
cout<<"Nhap a,b,c,x ";
cin>>a>>b>>c>>x;
cout<<"f= "<<float(a*x*x+b*x+c);
getch();
return 0;
}
Bài 13:
#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";
}
Bài 15:
#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;
4
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.
5
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
^
6
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 16:
#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 17:
#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;
7
} 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;
}
Bài 18:
#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();
8
return 0;
}
Bài 19:
#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 20:
#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;
9
cout<<"Min= "<<a[0];
getch();
return 0;
}
Bài 22:
#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 23:
#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();
10
return 0;
}
Bài 24:
#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 25:
#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;
}
11
Bài 26:
#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;
}
12
Bài 27:
#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 29:
#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;
}
Bài 30:
#include <iostream> using namespace std;
#include <conio>
int main() {
int n,i;
long int S1=0,S2=0;
long double S3=1,S4=0;
13
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:
#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;
}
Bài 32:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n, ngto;
ngto = 1;
cout << "Nhap gia tri n: ";
cin >> n;
14
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;
}
Bài 38:
#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;
}
15
Bài 39:
#include <iostream>
using namespace std;
void main()
{
for(int i=33;i<=255;i++)
cout<<i<<" : "<<(char) i<<"\n";
}
Bài 40:
#include <iostream>
using namespace std;
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)
{
16
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 ";
}
Bài 53:
#include <iostream>
using namespace std;
bool ktNgTo(int );
17
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;
}
}
////////////////////////////////
Max n số
# 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<<"= ";
18
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";
}
///////////////////////////////////
Vẽ tam giác full
#include <iostream>
using namespace std;
void tamgiacrong(int);
void tamgiacrongnguoc(int) ;
void tamgiacdac(int);
void tamgiacdacnguoc(int);
void main()
{
int n;
cout<<"Nhap chieu cao tam giac : ";
cin>>n;
cout<<"--------Tam giac dac ------\n";
tamgiacdac(n);
cout<<"--------Tam giac dac nguoc ------\n";
tamgiacdacnguoc(n);
cout<<"--------Tam giac rong ------\n";
tamgiacrong(n);
cout<<endl;
cout<<"--------Tam giac rong nguoc ------\n";
tamgiacrongnguoc(n);
}
19
void tamgiacdac(int n)
{
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n-i;j++)
cout<<" ";
for (int j=1;j<=2*i-1;j++)
cout<<"*";
cout<<"\n";
}
}
void tamgiacdacnguoc(int n)
{
for (int i=n;i>=1;i--)
{
for (int j=1;j<=n-i;j++)
cout<<" ";
for (int j=1;j<=2*i-1;j++)
cout<<"*";
cout<<"\n";
}
}
void tamgiacrong(int n)
{
for (int i=1;i<=n-1;i++)
{
for (int j=1;j<=n-i;j++)
cout<<" ";
cout<<"*";
if (i>1)
{
for (int j=1;j<=2*i-3;j++)
cout<<" ";
cout<<"*";
}
20
cout<<"\n";
}
for (int i=1;i<=2*n-1;i++)
cout<<"*";
}
void tamgiacrongnguoc(int n)
{
for (int i=1;i<=2*n-1;i++)
cout<<"*";
cout<<"\n";
for (int i=n-1;i>=1;i--)
{
for (int j=1;j<=n-i;j++)
cout<<" ";
cout<<"*";
if (i>1)
{
for (int j=1;j<=2*i-3;j++)
cout<<" ";
cout<<"*";
}
cout<<"\n";
}
}
Bài 41:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
using namespace std;
void nguoivsmay();
void mayvsnguoi();
void game();
void choitiep();
void win();
void lose();
21
void main()
{
system("cls");
game();
}
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));
22
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;
23
if ((chon<1)||(chon>3))
game();
}
while ((chon!=1)&&(chon!=2)&&(chon!=3));
system("cls");
if (chon==1) nguoivsmay();
if (chon==2) mayvsnguoi();
}
void win()
{
cout<<endl;
cout<<endl;
cout<<" **** **** **** *** ***\n";
cout<<" *** *** ******** *** *** \n";
cout<<" ********** *** *** *** *** \n";
cout<<" **** *** *** *** *** \n";
cout<<" **** *** *** *** *** \n";
cout<<" **** ******** ********** \n";
cout<<" **** **** ******** \n";
cout<<endl;
cout<<" *** ****** *** **** ****** ***\n";
cout<<" *** *** *** *** **** *** *** ***\n";
cout<<" *** *** *** *** **** *** *** ***\n";
cout<<" *** *** *** *** **** *** *** ***\n";
cout<<" **** **** **** *** *******\n";
cout<<" **** **** **** *** ******\n";
}
void lose()
{
cout<<endl;
cout<<endl;
cout<<" **** **** **** *** ***\n";
24
cout<<" *** *** ******** *** *** \n";
cout<<" ********** *** *** *** *** \n";
cout<<" **** *** *** *** *** \n";
cout<<" **** *** *** *** *** \n";
cout<<" **** ******** ********** \n";
cout<<" **** **** ******** LOSE\n";
cout<<endl;
}
void choitiep()
{
char choitiep;
cout<<"Ban co muon choi tiep ko ?? (C/K) ";
cin>>choitiep;
if ((choitiep=='C')||(choitiep=='c')) main();
}
[i][i]
/////////////////////////////////////
Đoạn code trên có một cái mới về phần tạo số ngẫu nhiên....
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():
25
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ể
26
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ố
27
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.
/////////////////////////////////
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);