19
o o n Kỹ thuật lập trình 501127 – HK2/2011-2012 1 Ỹ UẬ LẬ Ì ài p 4 ần 12 ảng, ỗi và kiể dữ liệ ó ấ rú ài p bắ bộ: Bài 1: Viết chương trình tính ma trận chuyển vị. Prototype: int[][] chuyen_vi(int[][] matran) #include<iostream> using namespace std; int main(){ cout<<"Nhap m,n, cho ma tran A(m x n):"; int m,n; cin>>m>>n; //Khoi tao (nhap) mang m x n int a[m][n]; for(int i=0;i<m;i++) for(int j=0;j<n;j++){ cout<<"Nhap A["<<i<<"]["<<j<<"]:"; cin>>a[i][j]; } //Thuc hien chuyen vi int b[n][m]; for(int i=0;i<n;i++) for(int j=0;j<m;j++){ b[i][j]=a[j][i]; } //In mang ra man hinh cout<<"Ma tran ban dau:\n"; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ cout<<a[i][j]<<" "; } cout<<endl; } cout<<"Ma tran chuyen vi:\n"; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cout<<b[i][j]<<" "; } cout<<endl; } return 0; }

Tut4 solution

Embed Size (px)

Citation preview

Page 1: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012 1

Ỹ UẬ LẬ Ì ài p 4 – ần 12

ảng, ỗi và kiể dữ liệ ó ấ rú

ài p bắ b ộ :

Bài 1:

Viết chương trình tính ma trận chuyển vị.

Prototype: int[][] chuyen_vi(int[][] matran) #include<iostream>

using namespace std;

int main(){

cout<<"Nhap m,n, cho ma tran A(m x n):";

int m,n;

cin>>m>>n;

//Khoi tao (nhap) mang m x n

int a[m][n];

for(int i=0;i<m;i++)

for(int j=0;j<n;j++){

cout<<"Nhap A["<<i<<"]["<<j<<"]:";

cin>>a[i][j];

}

//Thuc hien chuyen vi

int b[n][m];

for(int i=0;i<n;i++)

for(int j=0;j<m;j++){

b[i][j]=a[j][i];

}

//In mang ra man hinh

cout<<"Ma tran ban dau:\n";

for(int i=0;i<m;i++){

for(int j=0;j<n;j++){

cout<<a[i][j]<<" ";

}

cout<<endl;

}

cout<<"Ma tran chuyen vi:\n";

for(int i=0;i<n;i++){

for(int j=0;j<m;j++){

cout<<b[i][j]<<" ";

}

cout<<endl;

}

return 0;

}

Page 2: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012 2

Bài 2:

Viết chương trình nhân hai ma trận.

Prototype: int[][] nhanmatran(int[][] matran1, int[][] matran2) #include<iostream>

#include <stdlib.h>

using namespace std;

int main(){

cout<<"Nhap m,n,p cho ma tran A(m x n), B(n x p):";

int m,n,p;

cin>>m>>n>>p;

srand(time(NULL));

//Khoi tao mang A (m x n), B(n x p) phan tu nguyen ngau nhien

0~4

int a[m][n];

for(int i=0;i<m;i++)

for(int j=0;j<n;j++){

a[i][j]=rand()%5;

}

int b[n][p];

for(int i=0;i<n;i++)

for(int j=0;j<p;j++){

b[i][j]=rand()%5;

}

//Thuc hien nhan ma tran

int c[m][p];

for(int i=0;i<m;i++)

for(int j=0;j<p ;j++){

int total=0;

for(int k=0;k<n;k++)

total+=a[i][k]*b[k][j];

c[i][j]=total;

}

//In mang ra man hinh

cout<<"Ma tran A (m x n) ban dau:\n";

for(int i=0;i<m;i++){

for(int j=0;j<n;j++){

cout<<a[i][j]<<" ";

}

cout<<endl;

}

cout<<"Ma tran B (n x p) ban dau:\n";

for(int i=0;i<n;i++){

for(int j=0;j<p;j++){

cout<<b[i][j]<<" ";

}

cout<<endl;

Page 3: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012 3

}

cout<<"A x B = C (n x p):\n";

for(int i=0;i<m;i++){

for(int j=0;j<p;j++){

cout<<c[i][j]<<" ";

}

cout<<endl;

}

return 0;

}

Page 4: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012 4

Bài 3:

Viết chương trình trả về về kí tự thứ i trong chuỗi, kiểm tra tính hợp lệ của i nhập vào.

Prototype: char ki_tu_tai(int i) #include<iostream> //Khong su dung thu vien string

using namespace std;

int main(){

char s[100];

int length=0;

do{

cout<<"Nhap vao mot chuoi:";

cin.getline(s,100);

while(s[length]!='\0')length++;

length--;

}while (length==0) ;

int vt;

do{

cout<<"Nhap vi tri can trich ki tu:";

cin>>vt;

}while (vt>length||vt<1);

cout<<"Ki tu tai vi tri "<<vt<<" la "<<s[vt-1];

return 0;

}

Page 5: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012 5

Bài 4:

Viết chương trình tìm vị trí xuất hiện đầu tiên của một chuỗi con trong chuỗi hiện tại.

Prototype: int xuat_hien(char* chuoi_hien_tai, char* chuoi_con) #include<iostream> //Khong su dung thu vien string

using namespace std;

int main(){

char s1[100],s2[100];//s1: chuoi hien tai, s2: chuoi con

cout<<"Nhap vao mot chuoi 1:";

cin.getline(s1,100);

cout<<"Nhap vao mot chuoi 2:";

cin.getline(s2,100);

int lengths1=0,lengths2=0;

while(s1[lengths1]!='\0')lengths1++;

lengths1--;

while(s2[lengths2]!='\0')lengths2++;

lengths2--;

int i;

for(i=0;i<lengths1;i++){

if (s1[i]==s2[0]){

int j;

for(j=1;j<lengths2;j++){

if (s1[i+j]!=s2[j]){

break;

}

}

if (j==lengths2){

cout<<"Chuoi con xuat hien trong chuoi hien tai o vi

tri:"<<i+1;

break;

}

}

}

if (i==lengths1){

cout<<"Khong tim thay chuoi con trong chuoi hien tai";

}

return 0;

}

Page 6: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012 6

Bài 5:

Viết chương trình để quản lý thông tin về thời tiết trong năm:

Tạo cấu trúc Ngay chứa ngày, tháng, năm.

Tạo cấu trúc Thoitiet chứa cấu trúc Ngay, nhiệt độ cao nhất trong ngày, nhiệt độ thấp

nhất trong ngày, tốc độ gió lớn nhất.

Tạo mảng các cấu trúc Thoitiet, mỗi phần tử lưu thông tin về thời tiết trong một ngày

trong năm.

Tìm ngày có nhiệt độ cao nhất trong tháng 8/2009, trong năm 2009.

Prototype: Ngay nhiet_do_thap_nhat(Thoitiet[] arr_thoi_tiet) #include<iostream>

#include <stdlib.h>

#define MAX 360 //So ngay luu tru

#define DAYS 30

using namespace std;

struct Date{

int day;

int month;

int year;

};

struct Weather{

Date aday;

float maxtemp;

float mintemp;

float maxwind;

};

int main(){

Weather thoitietnam[MAX];

//khoi tao cac gia tri ngau nhien

srand(time(NULL));

int nam=2009,thang=1,dayth=1; // Khoi tao tu ngay 1/1/2009,

mac dinh 30ngay/1thang

for(int i=0;i<MAX;i++){

thoitietnam[i].aday.day=dayth;

thoitietnam[i].aday.month=thang;

thoitietnam[i].aday.year=nam;

thoitietnam[i].maxtemp=(rand()%350)/10.0; //Nhiet do

maximum la 35.0 (oC)

thoitietnam[i].mintemp=(rand()%350)/10.0; //Nhiet do

maximum la 35.0 (oC)

while (thoitietnam[i].mintemp>thoitietnam[i].maxtemp)

thoitietnam[i].mintemp=(rand()%350)/10.0;

thoitietnam[i].maxwind=(rand()%800)/10.0; //Toc do gio

maximum la 80km/h

dayth++;

if (dayth>DAYS) {

thang++;

dayth=1;

}

Page 7: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012 7

if (thang>12){

nam++;

thang=1;

}

}

//Tim ngay co nhiet do thap nhat trong khoang thoi gian

cout<<"Nhap thang, nam (nhap thang = 0 neu chi xet trong

nam:";

int qmonth,qyear;

Date result;

float qmaxtemp=0;//-1000.0; //Khoi tao qmaxtemp co nhiet do -

1000 (oC)

cin>>qmonth>>qyear;

for(int i=1;i<=MAX;i++){

if(thoitietnam[i].aday.year==qyear&&(qmonth==0?true:thoitietna

m[i].aday.month==qmonth)&&thoitietnam[i].maxtemp>qmaxtemp){

qmaxtemp=thoitietnam[i].maxtemp;

result=thoitietnam[i].aday;

}

}

if (qmaxtemp!=-1000.0){

cout<<"Nhiet do maximum trong thoi gian do la "<<qmaxtemp;

cout<<" vao ngay "<<result.day<<" thang "<<result.month<<"

nam "<<result.year;

}else{

cout<<"Khong do du lieu!";

}

return 0;

}

Page 8: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012 8

ài p làm thêm:

Bài 6:

Viết chương trình trả về một ma trận A (n*n) với phần tử a[i][j] bằng ‘true’ nếu như i và

j là hai số nguyên tố cùng nhau và ngược lại thì bằng ‘false’.

#include<iostream>

using namespace std;

int main(){

cout<<"Nhap n:";

int n;

cin>>n;

bool a[n][n];

for(int i=0;i<n;i++)

for(int j=0;j<n;j++){

int p,q,r;

p=i+1;

q=j+1;

do{

r=p%q;

p=q;

q=r;

}while(q!=0);

if (p==1){//Cung nguyen to

a[i][j]=true;

}else{

a[i][j]=false;

}

}

//in ma tran

for(int i=0;i<n;i++){

for(int j=0;j<n;j++){

cout<<a[i][j]<<" ";

}

cout<<endl;

}

}

Page 9: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012 9

Bài 7:

Viết chương trình trả về chiều dài chuỗi ký tự (không sử dụng hàm strlen). #include<iostream> //Khong su dung thu vien string

using namespace std;

int main(){

cout<<"Nhap vao mot chuoi:";

char s[100];

cin.getline(s,100);

int length=0;

while(s[length]!='\0')length++;

length--;

cout<<"Xau co do dai: "<<length;

return 0;

}

Page 10: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012

10

Bài 8:

Viết chương trình gán kí tự thứ i trong chuỗi bằng kí tự truyền vào.

#include<iostream>

using namespace std;

int main(){

char s[100];

cout<<"Nhap vao mot chuoi:";

cin.getline(s,100);

cout<<"Nhap vi tri can thay the ki tu:";

int vt;

cin>>vt;

cout<<"Nhap ki tu can thay the:";

char c;

cin>>c;

s[vt-1]=c;

cout<<"Chuoi sau khi thay the:"<<s;

return 0;

}

Page 11: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012

11

Bài 9:

Viết chương trình so sánh hai chuỗi, có phân biệt chữ hoa chữ thường (không sử

dụng hàm strcmp).

//trả về:

-1 :cho biết chuỗi 1 < chuỗi 2

0 :cho biết 2 chuỗi giống nhau

1 : cho biết chuỗi 1 > chuỗi 2

#include<iostream> //Khong su dung thu vien string

using namespace std;

int main(){

char s1[100],s2[100];//s1: chuoi hien tai, s2: chuoi con

cout<<"Nhap vao mot chuoi 1:";

cin.getline(s1,100);

cout<<"Nhap vao mot chuoi 2:";

cin.getline(s2,100);

int lengths1=0,lengths2=0;

while(s1[lengths1]!='\0')lengths1++;

lengths1--;

while(s2[lengths2]!='\0')lengths2++;

lengths2--;

int max=(lengths1>lengths2)?lengths1:lengths2;

int i;

for(i=0;i<max;i++){

if (s1[i]<s2[i]){

cout<< -1;

break;

}else if(s1[i]>s2[i]){

cout<< 1;

break;

}else if (i==max-1){

cout<< 0;

}

}

return 0;

}

Page 12: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012

12

Bài 10:

Viết chương trình trả về chuỗi con có chiều dài ilength, bắt đầu từ vị trí istart.

#include<iostream>

using namespace std;

int main(){

cout<<"Nhap xau:";

char s[100];

cin.getline(s,100);

cout<<"Nhap vi tri, chieu dai xau can trich:";

int istart,ilength;

cin>>istart>>ilength;

char subs[ilength+1];

for(int i=0; i<ilength;i++){

subs[i]=s[istart-1+i];

}

cout<<"Xau trich duoc:"<<subs;

return 0;

}

Bài 11:

Viết chương trình chuyển các ký tự trong chuỗi sang chữ in hoa.

#include<iostream>

using namespace std;

int main(){

cout<<"Nhap xau:";

char s[100];

cin.getline(s,100);

int i=0;

while (s[i]!='\0'){

if(s[i]>='a'&&s[i]<='z'){

s[i]=s[i]+'A'-'a';

}

i++;

}

cout<<"Xau in hoa:"<<s;

return 0;

}

Page 13: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012

13

Bài 12:

Viết chương trình xóa các khoảng trắng ở đầu chuỗi và cuối chuỗi.

#include<iostream>

#include<string.h>

using namespace std;

int main(){

cout<<"Nhap xau:";

char s[100];

cin.getline(s,100);

int begin=0,end=strlen(s)-1;

while (s[begin]==' ') begin++;

while (s[end]==' ') end--;

char s2[100];

if (begin<=end){

for(int i=begin;i<=end;i++){

s2[i-begin]=s[i];

}

s2[end-begin+1]='\0';

}else{

strcpy(s2,"");

}

cout<<"Xau xoa khoang trang:"<<s2;

return 0;

}

Page 14: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012

14

Bài 13:

Viết chương trình mô phỏng các phép toán luận lý AND, OR, XOR trên hai chuỗi ký tự.

Cho hai chuỗi ký tự a và b có chiều dài bằng nhau, chỉ chứa các ký tự ‘0’ và ‘1’.

Thực hiện phép toán (a AND b), (a OR b), (a XOR b), kết quả là các phép AND, OR, và

XOR trên từng ký tự.

Chương trình cho phép nhập 2 chuỗi ký tự a và b chiều dài bằng nhau, chiều dài tối đa là

100 ký tự. Kết quả phép toán lưu vào chuỗi ký tự c.

Ví dụ:

a = “001010111”

b = “011110111”

c = a AND b = “001010111”

c = a OR b = “011110111”

c = a XOR b = “010100000”

#include<iostream>

using namespace std;

int main(){

char a[100], b[100], cOR[100],cAND[100],cXOR[100];

cout<<"Nhap chuoi A:";

cin>>a;

cout<<"Nhap chuoi B:";

cin>>b;

if (strlen(a)==strlen(b)){

unsigned int op1,op2,length=strlen(a);

for(unsigned int i=0;i<length;i++){

op1=(a[i]=='1')?1:0;

op2=(b[i]=='1')?1:0;

cOR[i]=op1 or op2?'1':'0';

cAND[i]=op1 and op2?'1':'0';

cXOR[i]=op1 xor op2?'1':'0';

}

cOR[length]='\0';

cAND[length]='\0';

cXOR[length]='\0';

cout<<"OR:"<<cOR<<endl;

cout<<"AND:"<<cAND<<endl;

cout<<"XOR:"<<cXOR<<endl;

}

return 0;

}

Page 15: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012

15

Bài 14:

Viết chương trình trả về độ dài lớn nhất của dãy con tăng và giảm của A và

xuất ra dãy con tăng và giảm lớn nhất của A với A = (a1, a2,…, an) là dãy gồm n số

phân biệt. Một dãy con k phần tử của A là dãy B gồm k số hạng phần tử của A xuất hiện

theo đúng thứ tự mà chúng xuất hiện trong A. Có nghĩa là B = (ai1, ai2,…, aik) với i1 < i2

< …< ik. Dãy con B được gọi là tăng nếu ai1 < ai2 <…< aik, và giảm nếu ai1 > ai2

>…> aik.

#include<iostream>

using namespace std;

int main(){

cout<<"Nhap so phan tu cua A:";

int n;

cin>>n;

int a[n];

for (int i=0;i<n;i++){

cout<<"Nhap phan tu thu "<<i+1<<": ";

cin>>a[i];

}

int tang=1,giam=1,maxtang=1,maxgiam=1;

int i=0;

while (i<n-1){

if (a[i+1]>a[i]){

tang++;

i++;

maxgiam=maxgiam<giam?giam:maxgiam;

giam=1;

}else{

giam++;

i++;

maxtang=maxtang<tang?tang:maxtang;

tang=1;

}

}

maxgiam=maxgiam<giam?giam:maxgiam;

maxtang=maxtang<tang?tang:maxtang;

cout<<"Day tang maximum: "<<maxtang;

cout<<"Day giam maximum: "<<maxgiam;

return 0;

}

Page 16: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012

16

Bài 15:

Với tam giác Pascal như sau:

1 (mảng a)

1 1 (mảng b)

1 2 1 (mảng a)

1 3 3 1 (mảng b)

1 4 6 4 1 (mảng a)

……

Viết chương trình xuất ra dòng thứ n của tam giác Pascal, n nhập từ bàn phím, 0 < n <

100.

Lưu ý: Không dùng mảng 2 chiều. Chỉ dùng 2 mảng các số nguyên luân phiên chứa hàng

thứ i và i+1.

#include<iostream>

using namespace std;

int main(){

cout<<"Nhap n (0<n<100):";

int n;

cin>>n;

int a[100],b[100];

for(int i=0;i<100;i++){

a[i]=0;

b[i]=0;

}

a[0]=1;

for(int i=2;i<=n;i++){

if (i%2==0){

b[0]=1;

for(int j=1;j<=i;j++){

b[j]=a[j-1]+a[j];

}

}else{

a[0]=1;

for(int j=1;j<=i;j++){

a[j]=b[j-1]+b[j];

}

}

}

//In dong thu n

if (n%2==0) {

for(int i=0;i<n;i++) cout<<b[i]<<" ";

}else{

for(int i=0;i<n;i++) cout<<a[i]<<" ";

}

return 0;

}

Page 17: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012

17

Bài 16:

Viết chương trình tạo ra một mảng lưu trữ điểm số của học sinh. Tính trung bình điểm

của tất cả học sinh. Xuất kết quả từng điểm và điểm trung bình.

#include<iostream>

using namespace std;

int main(){

cout<<"Nhap so hoc sinh:";

int n;

cin>>n;

float diem[n];

for(int i=0;i<n;i++){

cout<<"Nhap diem hoc sinh thu "<<i+1<<": ";

cin>>diem[i];

}

float sumdiem=0,tbdiem;

for(int i=0;i<n;i++){

sumdiem+=diem[i];

}

tbdiem=sumdiem/n;

//in ket qua

cout<<"STT Diem";

for(int i=0;i<n;i++){

cout<<"\n"<<i+1<<" "<<diem[i];

}

cout<<"\nDiem trung binh: "<<tbdiem;

return 0;

}

Page 18: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012

18

Bài 17:

Viết chương trình sử dụng kiểu dữ liệu từ điển để quản lý thông tin của một lớp học.

Trong đó khóa là chuỗi mã số học viên còn giá trị là tên của học viên. Viết chương trình

minh họa cho phép nhập vào 10 học viên, và cho phép người dùng tìm kiếm tên của học

viên thông qua mã số học viên. #include<iostream>

#include<string.h>

using namespace std;

#define MAXARR 100 //mang structure luu tru

#define MAXLIST 50 //So luong hoc sinh mot lop

#define HTEN 50 //chieu dai ho ten

#define MASO 3 //chieu dai ma so hoc sinh

struct hocsinh{

char mshs[MASO];

char hoten[HTEN];

};

int main(){

//intial

cout<<"Nhap so luong hoc sinh:";

int n;

cin>>n;

hocsinh hoso[MAXARR];

for(int i=0;i<MAXARR;i++){

strcpy(hoso[i].mshs,"");

strcpy(hoso[i].hoten,"");

}

//Them hoc sinh, gia su nhap hop le, khong nhap trung mshs

(duplicate), code moi xu ly don gian dung do (Collision)

for(int i=0;i<n;i++){

int pos;

cout<<"Nhap ma so hoc sinh thu "<<i+1<<": ";

char masostr[MASO];

cin>>masostr;

int masonum=atoi(masostr); //string to integer

pos=masonum%MAXLIST;

while (strlen(hoso[pos].mshs)!=0) pos++;

cout<<"Ho ten hoc sinh:";

char hotenstr[HTEN];

cin.ignore(2);

cin.getline(hotenstr,HTEN);

strcpy(hoso[pos].mshs,masostr);

strcpy(hoso[pos].hoten,hotenstr);

}

//Tim kiem hoc sinh

cout<<"===============================================\n";

Page 19: Tut4 solution

o o n

Kỹ thuật lập trình 501127 – HK2/2011-2012

19

cout<<"Nhap mshs can tim: ";

char qmasostr[MASO];

cin>>qmasostr;

int qmasonum=atoi(qmasostr);

int pos=qmasonum%MAXLIST;

while (strcmp(hoso[pos].mshs,qmasostr)!=0&&pos<MAXARR) pos++;

if (pos<MAXARR){

cout<<"Maso: "<<hoso[pos].mshs<<" - Ho ten:

"<<hoso[pos].hoten;

}else{

cout<<"Khong tim thay!";

}

return 0;

}

-- ế -