LỜI MỞ ĐẦULời đầu tiên, em xin được gửi lời cảm ơn chân thành tới các Thầy, các Cô trongtrường Đại học Vinh, đặc biệt là các Thầy Cô trong khoa Công nghệ thông tin – nhữngngười đã trực t
Trang 1LỜI MỞ ĐẦU
Lời đầu tiên, em xin được gửi lời cảm ơn chân thành tới các Thầy, các Cô trongtrường Đại học Vinh, đặc biệt là các Thầy Cô trong khoa Công nghệ thông tin – nhữngngười đã trực tiếp giảng dạy, giúp đỡ em trong suốt những năm tháng học tập ởtrường, cảm ơn nhà trường và khoa CNTT đã tạo điều kiện cho em thực tập cơ sở đểchuẩn bị tốt cho công việc học tập và rèn luyện các kỹ năng cần thiết khi trở thànhngười kỹ sư CNTT thực sự
Sinh viên CNTT ngày nay phải không ngừng học hỏi, cập nhật những cái mới
và biết ứng dụng những kiến thức đã được học vào thực tiễn của cuộc sống Đợt thựctập cơ sở này chính là những bước đầu tiên để em đi sâu vào tìm hiểu trong lĩnh vựccông nghệ thông tin, trên cơ sở những kiến thức đã được học trong những năm họcvừa qua
Để hoàn thành đợt thực tập chuyên ngành này, ngoài sự cố gắng nỗ lực của bảnthân còn có sự tận tình giúp đỡ và giảng dạy của các thầy, cô giáo trong khoa CNTTTrường Đại học Vinh Em xin được gửi lời cảm ơn chân thành đến các thầy cô trongkhoa Công nghệ thông tin, đặc biệt là thầy Vũ Chí Cường đã nhiệt tình hướng dẫn emtrong quá trình thực hiện đề tài này
Vì thời gian và trình độ còn hạn chế nên chắc chắn em không tránh khỏi nhữngthiếu sót Em rất mong nhận được những góp ý của các thầy cô và các bạn để để tàinày được hoàn thiện hơn
Sinh viên thực hiện
Trang 2LỜI CẢM ƠN
Lời đầu tiên, em xin được gửi lời cảm ơn chân thành tới các Thầy, các Cô trongtrường Đại học Vinh, đặc biệt là các Thầy Cô trong khoa Công nghệ thông tin – nhữngngười đã trực tiếp giảng dạy, giúp đỡ em trong suốt những năm tháng học tập ởtrường, cảm ơn nhà trường và khoa CNTT đã tạo điều kiện cho em thực tập cơ sở đểchuẩn bị tốt cho công việc học tập và rèn luyện các kỹ năng cần thiết khi trở thànhngười kỹ sư CNTT thực sự
Sinh viên CNTT ngày nay phải không ngừng học hỏi, cập nhật những cái mới
và biết ứng dụng những kiến thức đã được học vào thực tiễn của cuộc sống Đợt thựctập cơ sở này chính là những bước đầu tiên để em đi sâu vào tìm hiểu trong lĩnh vựccông nghệ thông tin, trên cơ sở những kiến thức đã được học trong những năm họcvừa qua
Để hoàn thành đợt thực tập chuyên ngành này, ngoài sự cố gắng nỗ lực của bảnthân còn có sự tận tình giúp đỡ và giảng dạy của các thầy, cô giáo trong khoa CNTTTrường Đại học Vinh Em xin được gửi lời cảm ơn chân thành đến các thầy cô trongkhoa Công nghệ thông tin, đặc biệt là thầy Vũ Chí Cường đã nhiệt tình hướng dẫn emtrong quá trình thực hiện đề tài này
Vì thời gian và trình độ còn hạn chế nên chắc chắn em không tránh khỏi nhữngthiếu sót Em rất mong nhận được những góp ý của các thầy cô và các bạn để để tàinày được hoàn thiện hơn
Sinh viên thực hiện
Trang 3
MỤC LỤC
LỜI MỞ ĐẦU 1
LỜI CẢM ƠN 2
NỘI DUNG 5
Bài 1: 5
1.1 Xác định bài toán 5
1.1.1 Đề bài 5
1.1.2 Xác định đầu vào, đầu ra của bài toán 5
1.2 Thuật Toán 5
1.2.1 Thuật Toán Kiểm Tra Dữ Liệu 5
1.2.1.1 Mô tả thuật toán: 5
1.2.1.2 Sơ đồ khối mô tả thuật toán 6
1.2.1.3 Đoạn chương trình 6
1.2.2 Thuật Toán Đọc Từ Tệp: 7
1.2.2.1 Mô tả thuật toán: 7
1.2.2.2.Sơ đồ khối mô tả thuật toán: 7
1.2.2.3 Đoạn chương trình 7
1.2.3 Thuật toán kiểm tra số nguyên tố 8
1.2.3.1 Mô tả thuật toán: 8
1.2.3.2 Sơ đồ khối mô tả thuật toán 9
1.2.3.3: Đoạn chương trình 9
1.2.4 Thuật toán liệt kê số nguyên tố 10
1.2.4.1 Mô tả thuật toán 10
1.2.4.2 Sơ đồ khối 11
1.2.4.3 Đoạn chương trình 11
1.2.5 Thuật toán xóa số nguyên tố trùng nhau 12
1.2.5.1 Mô tả thuật toán 12
1.2.5.2 Sơ đồ khối 13
1.2.5.3 Đoạn chương trình 13
1.2.6 Một số hàm phát triển thêm cho bài toán 14
1.2.6.1 Tạo 1 menu để tạo mới hay mở file đã có: 14
Trang 41.3 Toàn bộ chương trình 15
1.4 Dữ liệu test và kết quả tương ứng 22
1.4.1 Bộ Test 1 22
1.4.2 Bộ Test 2 22
1.4.3 Bộ test 3 23
1.4.4 Bộ test 4(Nhập từ bàn phím) 24
1.4.5 Một Số Lỗi 24
1.5 Kết luận: 26
1.6 Thông tin ngôn ngữ lập trình 26
Bài 2 26
2.1 Xác định bài toán 26
2.1.1 Đề bài 26
2.1.2 Phân tích bài toán 26
2.2 Thuật toán 26
2.2.1 Thuật toán lũy thừa nhanh 26
2.2.1.3 Đoạn chương trình 29
2.2.2 Thuật toán chuyển số nguyên sang xâu nhị phân 29
2.2.2.1 Đoạn chương trình 29
2.2.2.2 Thuật toán đọc tệp 30
2.3 Chương trình cài đặt 31
2.4 Test bài toán cụ thể 33
2.5 Kết luận: 34
2.6 Thông tin ngôn ngữ lập trình 34
Trang 5- Viết chương trình đọc các phần tử của tệp trên vào một mảng hai chiều anxm.
- Xây dựng mảng một chiều b gồm các số nguyên tố có mặt trong mảng haichiều a
+ Từ yêu cầu bài toán, em đã phát triển bài toán thêm, có thêm nhập dữ liệu từbàn phím để khi muốn sửa file gốc thì có thể sửa trực tiếp mà không phải vào thư mụcchứa file input.txt
+ Thêm vào 1 số hàm tạo menu…
1.2 Thuật Toán
1.2.1 Thuật Toán Kiểm Tra Dữ Liệu
1.2.1.1 Mô tả thuật toán:
Bước 1: Đọc dữ liệu từ tệp input.txt để kiểm tra
Trong khi chưa kết thúc tệp: đưa dữ liệu vào biến, chuyển sang bước 2
Ngược lại, chuyển sang bước 3
Trang 6Bước 2: Kiểm tra dữ liệu:
Nếu dữ liệu dữ liệu đọc vào đúng là số nguyên.Quay lại bước 1
Nếu sai trả về true Chuyển sang bước 4
Bước 3: Trả về false, chuyển sang bước 4
Bước 4: Kết thúc
1.2.1.2 Sơ đồ khối mô tả thuật toán
1.2.1.3 Đoạn chương trình.
Trang 7if('0'>kt||'9'<kt)return true;
}return false;
}
1.2.2 Thuật Toán Đọc Từ Tệp:
1.2.2.1 Mô tả thuật toán:
Bước 1: Đọc cácdữ liệutừ tệp input.txt
Bước 2: Kiểm tra dữ liệu:
Nếu đọc dữ liệu thành công chuyển sang bước 3
Ngược lại chuyển sang bước 4
Bước 3: Đưa dữ liệu ra Quay lại bước 1
Bước 4: Kết thúc
1.2.2.2.Sơ đồ khối mô tả thuật toán:
1.2.2.3 Đoạn chương trình.
Trang 8void docFile(int a[100][100], int &n, int &m){
FILE *f;
f= fopen("input.txt","rt");
if(!f){
printf("\a Not found File!");
_getch();
exit(1);
}while(!feof(f))
{
fscanf(f,"%d%d",&n,&m);
for(i=0;i<n;i++){
for (j=0;j<m;j++)
fscanf(f,"%d",&a[i][j]);
}
}fclose(f);//dong file
}
1.2.3 Thuật toán kiểm tra số nguyên tố.
1.2.3.1 Mô tả thuật toán:
a Định nghĩa số nguyên tố:
Số nguyên tố là số tự nhiên chỉ chia hết cho 1 và chính nó Ngoài ra nó khôngchia hết cho bất cứ số nào khác Số 0 và 1 không được coi là số nguyên tố
b Thuật toán:
Bước 1: Nhập (Lấy từ tệp) 1 số nguyên không âm N
Bước 2: Nếu N = 0 hoặc N=1 thì N không là số nguyên tố (return false) rồi sangbước 7
Trang 9Bước 3: Gán i = 2.
Bước 4: Nếu i>căn bậc 2 của N thì thông báo N là số nguyên tố
Bước 5: Cho i chạy từ 2 đến N-1Bước 6: + Nếu N chia hết cho i thì N không là số nguyên tố (return false) rồisang bước 7
+ Ngược lại return true, tăng i++
Trang 10if(i>s) return true;
if(a%i == 0) return false;
return true;
}
}
1.2.4 Thuật toán liệt kê số nguyên tố.
1.2.4.1 Mô tả thuật toán.
Bước 1: khai báo k,i,j, gán k =0
Bước 2: Cho i chạy đến vị trí cuối của hàng
- Nếu i= số hàng -1 thì sang bước 6
Bước 3: Cho j chạy đến vị trí cuối của cột
- Nếu j = số cột -1 thì tăng j, sang bước 2
Bước 4: Nếu phần tủ a[i][j] của mảng a là số ngTố thì:
- Gán phần tử thứ k của mảng b cho a[i][j]
- Tăng k
- Tăng biến đếm(dùng để đếm xem có bao nhiêu phần tử của mảng b).Bước 5: Nếu phần tử a[i][j] chưa là số nguyên tố thì tăng i, quay lại bước 3.Bước 6: Kết thúc
Trang 111.2.4.2 Sơ đồ khối.
1.2.4.3 Đoạn chương trình.
void lietkesoNT(int a[100][100],int b[100], int &k)
{
k=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++){
Trang 12b[k]=a[i][j];
k++;
dem++;
}}
}
1.2.5 Thuật toán xóa số nguyên tố trùng nhau.
1.2.5.1 Mô tả thuật toán.
Bước 1: Đọc các phần tửtừ tệp đưa vào mảng a
Khởi tạo mảng b có số phần tử là dem
Ban đầu dem=0
Bước 2:So sánh lần lượt từng phần tử có trong mảng a với tất cả các phần tử cótrong mảng b:
Nếu phần tử trong mảng a chưa có trong mảng b thì thêm phần tử đó vào mảngb
Nếu phần tử trong mảng a đã có trong mảng b thì không thêm vào mảng b nữa.Lặp lại bước 2 cho đến khi duyệt hết tất cả các phần tử trong mảng a
Bước 3: Hiện thị mảng, xem mảng b
Bước 4: kết thúc
Trang 131.2.5.2 Sơ đồ khối.
1.2.5.3 Đoạn chương trình
void xoa(int b[100], int &dem){
if(b[i]==b[j]) {
tg=b[j];
b[j]=b[dem-1];b[dem-1]=tg;
dem ;
j ;
} }
}
1.2.6 Một số hàm phát triển thêm cho bài toán.
1.2.6.1 Tạo 1 menu để tạo mới hay mở file đã có:
a Đoạn chương trình:
Trang 14int menu(){
cout<<"==============MENU=============="<<endl;cout<<"Chon chuc nang:"<<endl;
cout<<" 1 - Tao moi"<<endl;
Hình 1.2.5.1: Menu chọn tạo/mở file
1.3 Toàn bộ chương trình.
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <stdlib.h>
Trang 15cout<<" 1 - Tao moi"<<endl;
doc>>kt;
if('0'>kt||'9'<kt)return true;
}return false;
Trang 16void docFile(int a[100][100], int &n, int &m)
{
FILE *f;// khai bao bien con tro File f;
f= fopen("input.txt","rt"); //mo tep;
if(!f){
printf("\a Not found File!");
_getch();
exit(1);
}
{fscanf_s(f,"%d%d",&n,&m
for(i=0;i<n;i++){
for (j=0;j<m;j++)
fscanf_s(f,"%d",&a[i][j}
}fclose(f);//dong file
cout<<"\t"<<a[i][j];
cout<<("\n");
}
Trang 17void Input(int a[100][100], int n, int m)
cout<<"Nhap vao phan tu ["<<i+1<<"]["<<j+1<<"]: " ;
cin>>a[i][j];
}//===============ghi dl ra file===============
fprintf(f,"%d %d\n",n,m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
fprintf(f,"%d\t",a[i][j]);
fprintf(f,"\n");
}fclose(f);
Trang 18else
for( i=2;i<a;i++){
if(i>s) return true;
if(a%i == 0) return false;
}
return true; // nguoc lai la snt}
//Liet ke cac so nt roi dua vao mag b[]
void lietkesoNT(int a[100][100],int b[100], int &k)
if(soNT(a[i][j])) // neu ptu a[i][j] tm la soNT{
//============xoa cac SNT trung nhau ============
void xoa(int b[100], int &dem)
{
int i,j;
// int dem;
Trang 19int tg;
for(i=0;i<dem-1;i++)
{ for(j=i+1;j<dem;j++)
if(b[i]==b[j]) {
Trang 20xemmang(a,n,m);
break;
}else
printf("Du lieu khong dung! \n");}
case 2:
{
if(!checkFile()){
docFile(a,n,m);
xemmang(a,n,m);
break;
}else
printf("Du lieu khong dung! \n");}
Trang 21}getch();
Trang 221.4.2 Bộ Test 2
Dữ liệu test:
Kết quả test:
Trang 231.4.3 Bộ test 3.
Dữ liệu vào
Kết quả test
Trang 241.4.4 Bộ test 4(Nhập từ bàn phím).
File sau khi nhập:
Trang 261.5 Kết luận:
- Chương trình chạy nhanh, kết quả đúng yêu cầu
- Chương trình báo lỗi trong trường hợp dữ liệu vào:
+ Có chứa kí hiệu đặc biệt, chữ cái, chứa dấu âm, file trốn
+ File đầu vào không tồn tại
1.6 Thông tin ngôn ngữ lập trình
-Chương trình được lập trình bằng ngôn ngữ C++, với phần mềm Visual Studio2010
- Output: là kết quả của a ^ n mod m
2.1.2 Phân tích bài toán.
+ INPUT :
- a,m,n
+ OUTPUT:
Trang 27- Kết quả a^n mod m.
2.2 Thuật toán.
2.2.1 Thuật toán lũy thừa nhanh.
o Mô tả thuật toán
Thuật toán bình phương và nhân là thuật toán tính nhanh lũy thừa tự nhiên
của một số (thực hoặc nguyên), trong trường hợp cơ số là số nguyên có thể được rútgọn theo mộtmôđun nào đó
Phép nâng lên lũy thừa tự nhiên bậc n của số x (x được gọi là cơ số) được định
o Áp dụng thuật toán lũy thừa nhanh tính: a^n mod m
Ta dựa theo công thức đồng dư thức:
Trang 28+ (a×b) mod n = ((a mod n) × (b mod n)) mod n
+ Trong giải thuật đệ quy trên đây ta xét tính chẵn lẻ của n và liên tục chia ncho 2 lấy phần nguyên cho đến khi n=0 Thực chất quá trình này chính là tìm các bítcủa n Do đó ta có thể thực hiện phép đổi ra số nhị phân trước sau đó tính lũy thừa theoquy tắc bình phương và nhân
Ta có các bước sau:
Bước 1: Khởi tạo p = 1, s[100], nhập a,n,m
Bước 2: Đổi n ra số nhị phân đưa vào mảng b[b0…bk].Bước 3: Copy xâu nhị phân từ mảng b vào mảng s[]
Bước 4: Cho i chạy từ 0 đến độ dài của s[] (strlen(s))
- Nếu phần tử trong mảng s[] = 0, thì p=(p*p) % m
- Ngược lại: p=(((p*p) % m) * a) % m
Bước 5: kết thúc
Sơ đồ khối
Trang 29Bắt đầu
Đổi n sang hệ nhị phân
S[i]==’0’
Nhập a,n,mKhởi tạo p=1,s[],i=0
Copy b[] sang s[]
p=(((p*p) % m) * a) % mp=(p*p) % m
Trang 30unsigned long a,n,m,p=1;
getch();
return 0;
}
2.2.2 Thuật toán chuyển số nguyên sang xâu nhị phân.
2.2.2.1 Đoạn chương trình.
char *nhiphan(int n){
int i=0,j,k,x;
char s[33],b[3]={'0','1'},tg;
x=n;
while (x!=0){
k=x%2;
Trang 31i++;
x=x/2;
}//Vì khi đổi sang xâu nhị phân, đưa vào mảng s[] thì xâu đó là xâu đảo của xâunhị phân cần tìm nên ta cần đảo ngược lại xâu đó
j=i;
for(i=0;i<(j/2);i++){
tg=s[i];
s[i]=s[j-i-1];
s[j-i-1]=tg;
}s[j]=NULL;
printf("\a Not found File!");
_getch();
exit(1);
}while(!feof(f))
{
Trang 33cout<<"1 – Doc tu tep "<<endl;
cout<<"2 – Nhap tu ban phim."<<endl;
Trang 34 Ví dụ này được tính bằng tay:
Đổi n = 27 ra số nhị phân ta được
Bảng sau đây tính toán từng bước theo giá trị của các bít của 27.Khởi tạo p = 1
-Như vậy ta có
Trang 35 Tính bằng phần mềm lũy thừa nhanh.
2.5 Kết luận:
- Chương trình chạy nhanh, kết quả đúng yêu cầu
- Chương trình báo lỗi trong trường hợp dữ liệu vào:
+ Nhập sai dữ liệu
2.6 Thông tin ngôn ngữ lập trình
-Chương trình được lập trình bằng ngôn ngữ C, với phần mềm Visual Studio2010
Trang 36TÀI LIỆU THAM KHẢO
1 Website
- http://vi.wikipedia.org/
- http://congdongcviet.com
2 Giáo trình
Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật, Nhà xuất bản Đại học quốc gia Hà
Nội, năm xuất bản, 2006