27
1 ĐÁP ÁN GIÁO TRÌNH 77 BÀI TẬP C++ Tác gicác li gii 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: "<

[Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

  • Upload
    tho-le

  • View
    73

  • Download
    0

Embed Size (px)

Citation preview

Page 1: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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: "<

Page 2: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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;

}

Page 3: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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;

Page 4: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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.

Page 5: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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

^

Page 6: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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;

Page 7: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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();

Page 8: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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;

Page 9: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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();

Page 10: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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;

}

Page 11: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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;

}

Page 12: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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;

Page 13: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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;

Page 14: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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;

}

Page 15: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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)

{

Page 16: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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 );

Page 17: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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<<"= ";

Page 18: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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);

}

Page 19: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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<<"*";

}

Page 20: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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();

Page 21: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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));

Page 22: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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;

Page 23: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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";

Page 24: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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():

Page 25: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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ể

Page 26: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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ố

Page 27: [Lib4u.net]Dap an Giao Trinh 77 Bai Tap C++

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);