Tài liệu tham khảo cho các học phần: An toàn và bảo mật thông tin, Kỹ thuật lập trình C, Kỹ thuật lập trình (khoa Điện)

Tài liệu tham khảo cho học phần An toàn và bảo mật thông tin:

1. Cryptography and Network Security: Principles and Practice 5th Edition by William Stallings, 2011

2. Information Security The Complete Reference, 2nd Edition by Mark Rhodes-Ousley, 2013

Tài liệu tham khảo cho học phần Kỹ thuật lập trình C:

1. C Primer Plus, Fifth Edition by Stephen Prata, 2004

2. The C programming language, 2nd Edition by Brian W. Kernighan and Dennis M. Ritchie, 1988

3. Danh sách các bài tập và bài mẫu (cần cài đặt Winrar 5 để giải nén): download.

4. Bài về mảng struct (học ngày 22/04/2015): download

5. Bài về xử lý xâu ký tự (học ngày 22/04/2015): download.

6. Bài về mảng cấu trúc Tam giác (học ngày 5/05/2015): download.

7. Học ngày 12/05 (file): download and download.

8. Học ngày 19/05 (struct-sach): download.

9. Học ngày 20/05: file sinhvien

10. Một số bài tập để ôn tập học phần Kỹ thuật lập trình C: download

Tài liệu tham khảo Kỹ thuật lập trình (khoa Điện):

1. Thinking in C++, 2nd Edition by Bruce Eckel

2. Programming embedded systems in C and C++ by Michael Barr, 1999

3. Bài mẫu về kế thừa học ngày 24/05/2015: download.

4. Đề cương ôn tập và bài thi test ngày 29/05/2015: download.

Timer class for C/C++ – run on all Linux/Windows systems

File  header timer.h:

#ifndef TIMER_H
#define TIMER_H
#include <time.h>
class Timer
{
public:
Timer();
~Timer();
void start();
float Get_Elapsed_restart();
float Get_Elapsed();
float Get_Elapsed_s();
float Get_Elapsed_s_restart();
private:
clock_t starttime, finaltime;
};
#endif
File timer.cpp:

#include “timer.h”
Timer::Timer()
{
}
Timer::~Timer()
{
}

void Timer::start()
{
starttime=clock();
}

float Timer::Get_Elapsed_restart()
{
finaltime=clock();
float val=(float)(finaltime-starttime);
starttime=finaltime;
return val;
}

float Timer::Get_Elapsed()
{
finaltime=clock();
return (float)(finaltime-starttime);
}

float Timer::Get_Elapsed_s()
{
return (float)Get_Elapsed()/CLOCKS_PER_SEC;
}

float Timer::Get_Elapsed_s_restart()
{
return (float)Get_Elapsed_restart()/CLOCKS_PER_SEC;
}

Chương trình C/C++ hiển thị các file bị ẩn do virus – C/C++ program that shows hidden file by virus

// chuong trinh chuyen doi cac thu muc bi virus bien thanh an (hidden)
// sang dang binh thuong
// Ngay 10/06/2007
// Tac gia: Nguyen Huu Tuan
// De test chuong trinh, copy file .exe vao thu muc nao do
// tao thu muc an bang lenh: attrib +h +r +s <ten thu muc>
// Sau do chay thu chuong trinh
// Chuong trinh duoc dich bang C-Free, DevCpp, Visual C++ 2005

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>

int main()
{
system(“dir /b /a > list.txt”);
ifstream fi(“list.txt”);
ofstream fo(“done.bat”);
char str[255];
fo << “@echo off” << endl;
while(fi.getline(str,255))
fo << “attrib -a -s -h -r \”” << str << “\”” << endl;
fi.close();
fo.close();
system(“done.bat”);
system(“del done.bat”);
system(“del list.txt”);
return 0;
}

Sắp xếp cơ bản – Basic sorting

Chương trình cài đặt các thuật toán sắp xếp cơ bản (sắp xếp nổi bọt (bubble sort), sắp xếp chọn (selection sort), sắp xếp chèn (insertion sort), sắp xếp nhanh (quick sort), sắp xếp trộn (merge sort), sắp xếp vun đống (heap sort)), so sánh thời gian thực hiện giữa các thuật toán và 1 hidden operation (can you find it out?).
Hình minh họa:
Vsort's image
Chương trình: download

Danh sách liên kết với ngôn ngữ C – Linked list in C programming language

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

// khai bao cau truc cho mot nut cua danh sach
typedef struct Node
{
// truong du lieu
int data;
struct Node * next;
} NodeType;

// khai bao kieu danh sach
typedef struct
{
NodeType * head;
NodeType * tail;
// so phan tu cua danh sach
int spt;
}LList;

// ham khoi tao danh sach
void init(LList * list);
// ham them 1 phan tu vao dau danh sach
void addFirst(LList *list, int d);
// ham them mot phan tu vao cuoi danh sach
void addLast(LList *list, int d);
// ham xoa phan tu o cuoi danh sach
int delLast(LList * list);
// ham xoa phan tu o dau danh sach
int delFirst(LList * list);
void insertAfter(LList * list, NodeType * p);
void insertBefore(LList * list, NodeType * p);
void removeAfter(LList * list, NodeType * p);
void removeBefore(LList * list, NodeType * p);
// ham in danh sach
void printList(LList list);
// ham sap xep danh sach
void sort(LList *list);
// ham tim kiem trong danh sach
NodeType * search(LList *, int d);
// giai phong toan bo danh sach
void freeAll(LList * list);

int main()
{
LList myList;
init(&myList);
addFirst(&myList, 10);
addFirst(&myList, 1);
addFirst(&myList, 12);
addLast(&myList, 20);
addLast(&myList, 23);
addLast(&myList, 25);
sort(&myList);
printList(myList);
freeAll(&myList);
printList(myList);
return 0;
}
void init(LList * list)
{
list->head = list->tail = NULL;
list->spt = 0;
}

void printList(LList list)
{
NodeType * tmp;
tmp = list.head;
while(tmp!=NULL)
{
printf(“%d “, tmp->data);
tmp = tmp->next;
}
printf(“\n”);
}

void addFirst(LList * list, int d)
{
NodeType * tmp = (NodeType *)malloc(sizeof(NodeType));
tmp->data = d;
if(list->spt==0)
{
tmp->next = NULL;
list->head = list->tail = tmp;
}
else
{
tmp->next = list->head;
list->head = tmp;
}
list->spt = list->spt+1;
}

void addLast(LList * list, int d)
{
NodeType * tmp = (NodeType *)malloc(sizeof(NodeType));
tmp->data = d;
tmp->next = NULL;
if(list->spt==0)
list->head = list->tail = tmp;
else
{
list->tail->next = tmp;
list->tail = tmp;
}
list->spt = list->spt+1;
}

NodeType * search(LList * list, int d)
{
NodeType * tmp = list->head;
while(tmp!=NULL)
{
if (tmp->data==d)
break;
tmp = tmp->next;
}
return tmp;
}

int delLast(LList * list)
{
NodeType * p, * q;
int ret = -1;

if(list->spt>0)
{
p = list->head;
q = NULL;
while(p->next!=NULL)
{
q = p;
p = p->next;
}
if(q!=NULL)
{
// danh sach chi co 1 phan tu
q->next = NULL;
list->tail = q;
}
else
list->head = list->tail = NULL;
ret = p->data;
free(p);
list->spt = list->spt-1;
}
return ret;
}

int delFirst(LList * list)
{
int ret=-1;
NodeType * tmp;
if(list->spt>0)
{
tmp = list->head;
if(list->spt==1)
{
// danh sach chi co 1 phan tu
ret = list->head->data;
list->head = list->tail = NULL;
}else
list->head = list->head->next;
free(tmp);
list->spt = list->spt – 1;
}
return ret;
}

// sap xep dung thuat toan doi cho truc tiep (interchange sort)
void sort(LList * list)
{
NodeType * p, * q;
int tmp;

p = list->head;
while(p!=NULL)
{
q = p->next;
while(q!=NULL)
{
if(q->data < p->data)
{
tmp = q->data;
q->data = p->data;
p->data = tmp;
}
q = q->next;
}
p = p->next;
}
}

void freeAll(LList * list)
{
NodeType * p, * q;
if(list->spt>0)
{
p = list->head;
list->head = list->tail = NULL;
list->spt = 0;
while(p)
{
q = p->next;
free(p);
p = q;
}
}
}

Đo thời gian thực hiện chương trình C/C++/C# (Timer 4 newbie)

Đo thời gian thực hiện chương trình C/C++/C# (Timer 4 newbie)

Ngày 10/03/2014: Cập nhật với chuẩn C++11, xem bài viết tại đây (lưu ý phần đo thời gian với thư viện chrono ở trang 2 của bài báo).
(Ngày cập nhật cuối: 30/3/2009)
Chủ đề bài báo: C/C++/C#
Trong các cuộc thi lập trình, các chương trình cài đặt các thuật toán cùng giải quyết một bài toán, chúng ta luôn có nhu cầu kiểm thử tốc độ thực hiện của các cài đặt bằng cách xem xét thời gian một đoạn chương trình hay một chương trình thực hiện là bao lâu. Trong bài báo nhỏ này, tôi xin cung cấp cách thức đo thời gian thực hiện của các chương trình được viết bằng các ngôn ngữ C/C++/C# trên DOS và trên Windows.
1. Đo thời gian thực hiện chương trình với ngôn ngữ C/C++ trên DOS
Đối với môi trường DOS chúng ta có thể dùng hàm clock() để đo thời gian thực hiện của chương trình cho cả chương trình viết bằng C và C++. Hàm clock() có khai báo nằm trong file header time.h, giá trị trả về của hàm là thời gian bắt đầu từ lúc chương trình chạy cho tới lúc gọi hàm, tính bằng số giây nhân với hằng số CLOCKS_PER_SEC, hằng số CLOCKS_PER_SEC có giá trị như CLK_TCK.
Ví dụ sau đo thời gian thực hiện của 600000000 vòng lặp rỗng:
// file timer4c.c
#include
#include
#include
int main( void )
{
long i = 600000000L;
clock_t start, finish;
double duration;
// Do thoi gian cua mot su kien
printf( “Thoi gian thuc hien %ld vong lap rong:”, i );
start = clock();
while( i– )
;
finish = clock();
duration = (double)(finish – start) / CLOCKS_PER_SEC;
printf( “%2.1f giay\n”, duration );
system(“pause”);
return 0;
}
2. Đo thời gian thực hiện chương trình với ngôn ngữ C trên Windows
Trên Windows chúng ta sử dụng hàm QueryPerformanceCounter(LARGE_INTEGER *) để thực hiện việc đo thời gian, hàm được khai báo trong file header windows.h. Hàm này có kiểu trả về là BOOL và trả về giá trị là thời gian tính bằng giây từ lúc chương trình bắt đầu chạy, tham số đầu vào là con trỏ tới một biến kiểu LARGE_INTEGER.
Ví dụ sau là chương trình đo thời gian thực hiện 600000000 vòng lặp rỗng:
// file timer4w.c
#include
#include
// khai bao cau truc va cac ham
typedef struct {
LARGE_INTEGER start;
LARGE_INTEGER stop;
} stopWatch;
void startTimer( stopWatch *timer) ;
void stopTimer( stopWatch *timer) ;
double LIToSecs( LARGE_INTEGER * L) ;
double getElapsedTime( stopWatch *timer);
void startTimer( stopWatch *timer)
{
QueryPerformanceCounter(&timer->start) ;
}
void stopTimer( stopWatch *timer)
{
QueryPerformanceCounter(&timer->stop) ;
}
double LIToSecs( LARGE_INTEGER * L)
{
LARGE_INTEGER frequency;
QueryPerformanceFrequency( &frequency ) ;
return ((double)L->QuadPart /(double)frequency.QuadPart) ;
}
double getElapsedTime( stopWatch *timer) {
LARGE_INTEGER time;
time.QuadPart = timer->stop.QuadPart – timer->start.QuadPart;
return LIToSecs( &time) ;
}
// su dung cac ham
int main()
{
long i = 600000000L;
stopWatch timer;
double duration;
// Do thoi gian cua mot su kien
printf( “Thoi gian thuc hien %ld vong lap rong:”, i );
startTimer(&timer);
while( i– )
;
stopTimer(&timer);
duration = getElapsedTime(&timer);
printf( “%2.1f giay\n”, duration );
system(“pause”);
return 0;
}
3. Đo thời gian thực hiện của chương trình với C++ trên Windows
Tương tự như đối với chương trình C trên Windows, ở đây ta cũng sử dụng hàm QueryPerformanceCounter(LARGE_INTEGER *), tuy nhiên ta xây dựng lớp CStopWatch để tiện dùng cho các chương trình khác nhau.
// file timer4w.cpp
#include
#include
using namespace std;
typedef struct {
LARGE_INTEGER start;
LARGE_INTEGER stop;
} stopWatch;
// khai bao lop CStopWatch
class CStopWatch {
private:
stopWatch timer;
LARGE_INTEGER frequency;
double LIToSecs( LARGE_INTEGER & L) ;
public:
CStopWatch() ;
void startTimer( ) ;
void stopTimer( ) ;
double getElapsedTime() ;
};
double CStopWatch::LIToSecs( LARGE_INTEGER & L)
{
return ((double)L.QuadPart /(double)frequency.QuadPart) ;
}
CStopWatch::CStopWatch()
{
timer.start.QuadPart=0;
timer.stop.QuadPart=0;
QueryPerformanceFrequency( &frequency ) ;
}
void CStopWatch::startTimer( )
{
QueryPerformanceCounter(&timer.start) ;
}
void CStopWatch::stopTimer( )
{
QueryPerformanceCounter(&timer.stop) ;
}
double CStopWatch::getElapsedTime()
{
LARGE_INTEGER time;
time.QuadPart = timer.stop.QuadPart – timer.start.QuadPart;
return LIToSecs( time) ;
}
// su dung lop CStopWatch
int main()
{
long i = 600000000L;
CStopWatch timer;
double duration;
// Do thoi gian cua mot su kien
printf( “Thoi gian thuc hien %ld vong lap rong:”, i );
timer.startTimer();
while( i– )
;
timer.stopTimer();
duration = timer.getElapsedTime();
printf( “%2.1f giay\n”, duration );
system(“pause”);
return 0;
}
4. Đo thời gian thực hiện của chương trình với C#
Bắt đầu từ .NET Framework 2.0, lớp StopWatch được cung cấp cho người dùng để tiến hành các công việc liên quan tới đo đếm thời gian thực hiện 1 tác vụ nào đó, lớp này nằm trong namespace System.Diagnostics.
Ví dụ sau đây là chương trình đo thời gian thực hiện 600000000 vòng lặp rỗng:
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace Timer
{
class Program
{
static void Main(string[] args)
{
Stopwatch st = new Stopwatch();
st.Start();
long i = 600000000L;
Console.WriteLine(“Thoi gian thuc hien {0} vong lap rong:”, i);
while (i > 0)
–i;
st.Stop();
Console.WriteLine(“{0} giay”, st.Elapsed.ToString());
if (Stopwatch.IsHighResolution)
Console.WriteLine(“Timed with Hi res”);
else
Console.WriteLine(“Not Timed with Hi res”);
Console.ReadKey();
}
}
}
5. Tài liệu tham khảo
1. MSDN 9.0, clock function (ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/dv_vccrt/html/3e1853dd-498f-49ba-b06a-f2315f20904e.htm).
2. http://cplus.about.com/od/howtodothingsin1/a/timing.htm
3. http://cplus.about.com/od/howtodothingsi2/a/timing.htm
4. http://cplus.about.com/od/howtodothingsinc/a/timing.htm
5. Microsoft® Windows® Internals, Fourth Edition: Microsoft Windows Server™ 2003, Windows XP, and Windows 2000, Mark E. Russinovich, David A. Solomon

Mặc dù đã hết sức thận trọng và xem xét kỹ lưỡng các ví dụ đưa ra trong bài viết, tuy vậy vẫn có thể không tránh khỏi các sai sót, rất mong nhận được sự đóng góp ý kiến của các bạn độc giả. Mọi góp ý, thắc mắc xin gửi về địa chỉ email: tuannhtn@yahoo.com.

Bài tập C – Học ngày 8/5/2009

Chủ đề:
1. File trong C
2. Sinh số ngẫu nhiên
3. Số nguyên tố
4. Xử lý mảng
Đề bài:
Viết chương trình sinh n số nguyên ngẫu nhiên (mỗi số không quá 10000, n không quá 1000), ghi mảng vào file dat1.txt: đầu tiên là số phần tử (n) sau đó là các số nguyên, các số ngăn cách với nhau bằng 1 dấu cách. Đọc các số nguyên từ file dat1.txt sau đó ghi các số nguyên tố vào file nguyento.txt theo định dạng giống như file dat1.txt.
Thuật toán để kiểm tra các số nguyên từ file dat1.txt và ghi vào file nguyento.txt:
Dùng biến m để lưu số lượng số nguyên tố, ban đầu m bằng 0, sử dụng mảng x để lưu các số nguyên tố đọc được từ file dat1.txt, mỗi lần đọc ra một số và kiểm tra, nếu đúng là số nguyên tố thì tăng m lên 1 đơn vị.
Lời giải:
// Bai giang tren lop ngay 8/5/2009
// Nguyen Huu Tuan – Dai hoc Hang hai Viet Nam
// Email: tuannhtn@yahoo.com, tuannhtn@gmail.com
// Blog: 4fire.wordpress.com

#include
#include
void sinhngaunhien(char * tenfile, int n, int maxval);
void docfile(char * tenfile);
void songuyento(char * file1, char * file2);
int ktnguyento(int n);

int main()
{
int n;
int maxval = 1000;
char file1[] = “dat1.txt”;
char file2[13] = “nt.txt”;
printf(“Nhap n = “);
scanf(“%d”, &n);
sinhngaunhien(file1, n, maxval);
printf(“File ngau nhien:\n”);
docfile(file1);
songuyento(file1, file2);
printf(“\nFile chua cac so nguyen to:\n”);
docfile(file2);
system(“pause”);
return 0;
}

int ktnguyento(int n)
{
int i;
int m;
if (n==1)
return 0;
m = (int)sqrt(n);
for(i=2;i<=m;i++)
if(n % i == 0)
return 0;
return 1;
}

void sinhngaunhien(char * tenfile, int n, int maxval)
{
// sinh ngau nhien n so nguyen nho hon maxval
// ghi n so nguyen vao file co ten la tenfile
int i, x;
FILE * f;
f = fopen(tenfile,”wt”);
if(f==NULL)
{
printf(“Loi mo file %s”, tenfile);
return;
}
srand(time(NULL));
fprintf(f, “%d “, n);
for(i=0;i<n;++i)
{
x = rand() % maxval;
fprintf(f, “%d “, x);
}
fclose(f);
}
void songuyento(char * file1, char * file2)
{
int n, m, i;
int x[10000];
FILE * f1, *f2;
f1 = fopen(file1,”rt”);
f2 = fopen(file2,”wt”);
if(f1==NULL||f2==NULL)
{
printf(“Loi mo file”);
return;
}
fscanf(f1,”%d”, &n);
m = 0;
for(i=0;i<n;++i)
{
fscanf(f1,”%d”, &x[m]);
if(ktnguyento(x[m])==1)
m++;
}
fprintf(f2, “%d “, m);
for(i=0;i<m;++i)
fprintf(f2, “%d “, x[i]);
fclose(f1);
fclose(f2);
}
void docfile(char * tenfile)
{
int i, n;
int x;
FILE * f = fopen(tenfile, “rt”);
if(f==NULL)
{
printf(“Loi mo file %s”, tenfile);
return;
}
fscanf(f,”%d”, &n); // doc so phan tu
// doc tung phan tu
for(i=0;i<n;++i)
{
fscanf(f,”%d”, &x);
printf(“%d “, x);
}
fclose(f);
}