Viết chương trình bằng ngôn ngữ C# ựể giúp trung tập ngoại ngữ quản lý kỳ thi cuối khoá của một phòng thi sử dụng một cấu trúc tương ứng. Thông tin thắ sinh có cấu trúc như sau:
- Tên sinh viên( Tên sinh viênlà một xâu ký tự có ựộ dài bằng 25) - điểm viết(điểm viết của sinh viên là một số nguyên >=0 và <=10) - điểm nói (điểm nói của sinh viên là một số nguyên >=0 và <=10) Yêu cầu:
a) Nhập thông tin về họ tên và ựiểm của sinh viên với ựịnh dạng sau
Tên sinh viên: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx điểm viết :xx
điểm nói :xx
Chú ý: Chương trình phải kiểm tra sự hợp lệ của ựiểm thi b) In ra bảng ựiểm của mỗi phòng thi như sau:
Stt Tên điểm viết điểm nói Tổng ựiểm xx xxxxxxxxxxxxxxx xx xx xx c)In ra danh sách các sinh viên thi quă ựiều kiện ựể các sinh viên thi qua là các môn thi phái >=5)
Stt Tên điểm viết điểm nói Tổng ựiểm xx xxxxxxxxxxxxxx xx xx xx
d) In ra sinh viên có tổng ựiểm cao nhất. Nếu nhiều thắ sinh có cùng ựiểm cao nhất thì in ra tất cả
Stt Tên Tổng ựiểm xx xxxxxxxxxxxxxxxxxx xx
e) Sắp xếp các sinh viên theo thứ tự giảm dần của ựiểm viết và in ra danh sách mới theo ựịnh dạng thứ haị
using System; struct KieuSV
{
public string HoTen; public int Viet,Doc; }
class CauTruc {
static KieuSV []DSSV; static int SoLuong; static void NhapDSSV() {
ConsolẹWrite("So TS can nhap :");
SoLuong=int.Parse(ConsolẹReadLine()); DSSV=new KieuSV[SoLuong];
for (int i=0; i < SoLuong; i++) {
ConsolẹWrite("Ho ten thi sinh : "); DSSV[i].HoTen=ConsolẹReadLine(); do {
ConsolẹWrite("Diem viet : ");
DSSV[i].Viet=int.Parse(ConsolẹReadLine()); } while (DSSV[i].Viet < 1 || DSSV[i].Viet > 10);
do {
ConsolẹWrite("Diem doc : ");
DSSV[i].Doc=int.Parse(ConsolẹReadLine()); } while (DSSV[i].Doc < 1 || DSSV[i].Doc > 10);
} }
static void DSDiem() {
int i;
ConsolẹWrite("STT Ho va Ten Viet Noi Tong diem \n"); for (i=0; i< SoLuong; ++i)
{
ConsolẹWrite("{0}\t{1}\t{2}\t{3}\t{4}", i+1,
ConsolẹWrite("\n"); }
}
/* In danh sach nhung sinh vien co diem dat ( deu >= 5) */ static void DSSVDat()
{
int i;
ConsolẹWrite("STT Ho va Ten Viet Noi Tong diem \n"); for (i=0; i < SoLuong; ++i)
{
if (DSSV[i].Viet >= 5 && DSSV[i].Doc >= 5) {
ConsolẹWrite("{0}\t{1}\t{2}\t{3}\t{4}", i+1,
DSSV[i].HoTen, DSSV[i].Viet, DSSV[i].Doc, DSSV[i].Viet + DSSV[i].Doc); ConsolẹWrite("\n");
} }
}
static void TongDiemCaoNhat() {
int MAX, i;
/* Tinh tong diem cao nhat */
MAX = DSSV[0].Viet + DSSV[0].Doc; for (i=0; i< SoLuong ; i++)
{
if (DSSV[i].Viet + DSSV[i].Doc > MAX) MAX = DSSV[i].Viet + DSSV[i].Doc; }
/* In ra danh sach cac ts co diem 2 mon cao nhat (= MAX) */ ConsolẹWrite("Ten Viet Noi Tong diem \n");
for (i=0; i < SoLuong; i++) {
if (DSSV[i].Viet + DSSV[i].Doc == MAX) {
ConsolẹWrite("{0}\t{1}\t{2}\t{3}", DSSV[i].HoTen, DSSV[i].Viet, DSSV[i].Doc, DSSV[i].Viet + DSSV[i].Doc);
ConsolẹWrite("\n"); }
} }
static void SapXep() {
int i, j;
KieuSV TG=new KieuSV(); for (i=0; i < SoLuong - 1; i++) for (j=i+1; j < SoLuong; j++)
if (DSSV[j].Viet > DSSV[i].Viet) { TG = DSSV[i]; DSSV[i] = DSSV[j]; DSSV[j] = TG; } }
static int ChonMenu() {
ConsolẹWrite("\n\n\n\t\t\t1. Nhap danh sach sinh vien"); ConsolẹWrite("\n\t\t\t2. Hien thi danh sach sinh vien"); ConsolẹWrite("\n\t\t\t3. Danh sach sinh vien dat ");
ConsolẹWrite("\n\t\t\t4. Cac thi sinh co tong diem cao nhat"); ConsolẹWrite("\n\t\t\t5. Sap xep danh sach sinh vien"); ConsolẹWrite("\n\t\t\t6. Thoat khoi chuong trinh"); ConsolẹWrite("\n\t\t\tBan hay chon mot muc (1->6) : "); int Tam;
Tam=int.Parse(ConsolẹReadLine()); return Tam;
}
static void Main() {
ConsolẹClear(); do
{
switch (ChonMenu()) {
case 1: NhapDSSV(); break;
case 2: DSDiem(); ConsolẹReadKey();break; case 3: DSSVDat();ConsolẹReadKey();break;
case 4: TongDiemCaoNhat(); ConsolẹReadKey();break; case 5: SapXep(); ConsolẹWrite("Da sap xong !");
ConsolẹReadKey();break; case 6: Environment.Exit(0);break;
/* Thoat khoi chuong trinh */ } ConsolẹClear(); } while(true); } } ---
BộI 23: KIÓU Dọ LIỷU LIỷT Kặ & TẺP HĩP 23.1. TẺp hĩp vộ danh sịch liến kạt
(phần này thảo luận và tìm ựọc tài liệu) Các chủ ựề về tập hợp cần thảo luận - ArrayList - Hashtable - Queue - Stack - SorteList - List ...
Các chủ ựề cần thảo luận về danh sách liên kết - Lớp(class)
- Lớp tự trỏ
- Danh sách liên kết ựơn, kép,...
BộI 25: Hỷ THèNG NHẺP XUÊT THẩêNG DỉNG TRONG C# 25.1. Giắi thiỷu vÒ hỷ thèng nhẺp xuÊt cựa C#
Một chương trình thường xuyên làm việc với dữ liệu, ựể có thể lưu trữ lâu dài chúng ta phải lưu trữ và nhận lại dữ liệu từ thiết bị lưu trữ ngoài, nguồn thông tin ngoài không chỉ gồm dữ liệu ựược lưu trữ trên ựĩa từ, ựĩa CD mà nó có thể là dữ liệu của một chương trình khác, hoặc có thể là ựược lưu trữ trên mạngẦ dù chúng ựược lưu trữ ở ựâu chúng cũng chỉ có 1 số dạng như: ựối tượng, kắ tự, hình ảnh hoặc âm thanh, dù dữ liệu ựược lưu trữ dưới hình thức nào, lưu trữ ở ựâu thì C# ựều trừu tượng hoá thành các luồng(Streams), ựiều này là rất tinh vi nó làm cho ta không cần phải quan tâm dữ liệu ựược lưu trữ ở ựâu, dưới dạng thức như thế nào, nó ựồng nhất mọi nguồn dữ liệu với nhau:
để nhận về các thông tin, một chương trình mở một luồng liên kết với ựối tượng nguồn( tệp tin, bộ nhớ, Socket) và ựọc các thông tin tuần tự.
Tương tự ựể ghi thông tin ra các thiết bị ngoài bằng cách mở một luồng ựến ựối tượng ựắch và ghi thông tin ra một cách tuần tự như
Luồng là sự trừu tượng hoá ở mức cao, do vậy bất kể dữ liệu ựược ựọc vào từ ựâu hoặc ghi ra ựâu, thì thuật toán ựọc/ghi tuần tự ựều tựa như sau:
Nhiều người nhầm lẫn về sự khác nhau giữa tập tin và luồng. Một luồng ựơn giản là luồng của thông tin, chứa thông tin sẽ ựược chuyển qua, còn tập tin thì ựể lưu trữ thông tin.
Một luồng ựược sử dụng ựể gởi và nhận thông tin từ bộ nhớ, từ mạng, web, từ một chuỗi,...Một luồng còn ựược sử dụng ựể ựi vào và ra với một tập tin dữ liệụ
Thứ tự của việc ựọc một tập tin
Khi ựọc hay viết một tập tin, cần thiết phải theo một trình tự xác ựịnh. đầu tiên là phải thực hiện công việc mở tập tin. Nếu như tạo mới tập tin, thì việc
mở tập tin cùng lúc với việc tạo ra tập tin ựó. Khi một tập tin ựã mở, cần thiết phải tạo cho nó một luồng ựể ựặt thông tin vào trong một tập tin hay là lấy thông tin ra từ tập tin. Khi tạo một luồng, cần thiết phải chỉ ra thông tin trực tiếp sẽ ựược ựi qua luồng. Sau khi tạo một luồng gắn với một tập tin, thì lúc này chúng ta có thể thực hiện việc ựọc ghi các dữ liệu trên tập tin. Khi thực hiện việc ựọc thông tin từ một tập tin, chúng ta cần thiết phải kiểm tra xem con trỏ tập tin ựã chỉ tới cuối tập tin chưa, tức là chúng ta ựã ựọc ựến cuối tập tin hay chưạ Khi hoàn thành việc ựọc ghi thông tin trên tập tin thì tập tin cần phải ựược ựóng lạị
Tóm lại các bước cơ bản ựể làm việc với một tậo tin là:
Bước 1: Mở hay tạo mới tập tin
Bước 2: Thiết lập một luồng ghi hay ựọc từ tập tin Bước 3: đọc hay ghi dữ liệu lên tập tin
Bước 4: đóng lập tin lại
25.2. Cịc lắp nhẺp xuÊt tẺp tin
Stream hỗ trợ ựọc và ghi dữ liệu ựồng bộ và không ựồng bộ. .Net Framework cung cấp một số lớp dẫn xuất từ lớp Stream, bao gồm cả FileStream, MemoryStream, và NetworkStream. Có một lớp BufferedStream cung cấp một vùng ựệm I/O và có thể sử dụng cho bất kỳ luồng nhập xuất nàọ
Sau ựây là những lớp I/O chắnh của .Net Framework
Lớp Cách sử dụng
Stream Abstract class that supports reading and writing
bytes.
BinaryReader/BinaryWriter Read and write encoded strings and primitive datatypes to and from streams.
File, FileInfo, Directory, DirectoryInfo
Provide implementations for the abstract FileSystemInfo classes, including creating, moving, renaming, and deleting files and directories.
FileStream
For reading to and from File objects; supports random access to files. Opens files
synchronously by default; supports asynchronous file access.
Lớp Cách sử dụng
Textreader,TextWriter, StringReader, StringWriter
TexTReader and TextWriter are abstract classes designed for Unicode character I/Ọ StringReader and StringWriter write to and from strings, allowing your input and output to be either a stream or a string.
BufferedStream
A stream that ađs buffering to another stream such as a NetworkStream. BufferedStreams can improve performance of the stream to which they are attached, but note that FileStream has buffering built in.
MemoryStream
A nonbuffered stream whose encapsulated data is directly accessible in memory, and is most useful as a temporary buffer.
NetworkStream A stream over a network connection.
StreamReader Implements a TextReader that reads characters
from a byte stream in a particular encoding
StreamWriter
Implements a TextWriter for writing information to a string. The information is stored in an underlying StringBuilder. BộI 26: NHẺP XUÊT VắI TỷP TIN V¡N BờN 26.1. Sỏ dông cịc lắp nhẺp xuÊt tỷp tin vẽn bờn
để ựọc/ghi dữ liệu vào tệp văn bản .Net Framework cung cấp cho ta hai lớp rất dễ sử dụng ựó là lớp StreamWriter và StreamReader có chứa các phương thức ựể giúp ta rất dễ dàng thao tác trên tệp văn bản giống như ta thao tác với việc ựọc ghi dữ liệu trên mà hình, bàn phắm.
Vắ dụ 1: Nhập vào từ bàn phắm nội dung một bài thơ và ghi nó vào một tệp văn bản
using System.IO; class ViDu {
static void Main() { string fileName; string cauTho; string tenBaiTho; bool ok; ConsoleKeyInfo kt; do{
ConsolẹWrite("Nhap vao ten tep chua bai tho:"); fileName = ConsolẹReadLine();
ok = false;
if(FilẹExists(fileName)) {
ConsolẹWriteLine("Tep nay da ton tai ban co muon ghi de C/K?"); kt=ConsolẹReadKey();
if (kt.KeyChar == 'c' || kt.KeyChar == 'C') ok = false; else ok = true;
}
}while(ok);
StreamWriter myfile=FilẹCreateText(fileName);
ConsolẹWriteLine("\t\tBAN HAY NHAP VAO MOT BAI THO BAN YEU THICH\n");
ConsolẹWrite("Nhap vao ten bai tho:");tenBaiTho = ConsolẹReadLine(); myfilẹWriteLine("\t\t{0}", tenBaiTho); myfilẹWriteLine(); int i=0; do { ConsolẹWrite("Cau {0}:", ++i); cauTho = ConsolẹReadLine(); myfilẹWriteLine("{0}:{1}",i,cauTho);
ConsolẹWriteLine("Ban co muon nhap tiep C/K"); kt = ConsolẹReadKey();
} while (kt.KeyChar == 'c' || kt.KeyChar == 'C'); myfilẹClose();
} }
Vắ dụ 2: Cho một tệp văn bản có tên là D:/thọtxt hãy ựọc nội dung tệp và ựưa ra màn hình
using System; using System.IO; class Test
{
public static void Main() {
try {
using (StreamReader sr = new StreamReader("d:/thọtxt")) {
string line;
// Read and display lines from the file until the end of // the file is reached.
while ((line = sr.ReadLine()) != null) { ConsolẹWriteLine(line); } } } catch (Exception e) {
ConsolẹWriteLine("Khong the doc duoc noi dung tep"); ConsolẹWriteLine(ẹMessage);
}
ConsolẹReadKey(); }
}
Vắ dụ 3: Cho một tệp có tên là d:\dulieụtxt lưu trữ thông tin về n dãy số. Biết rằng các phần tử của mỗi dãy ựược lưu trên một dòng, giữa các phần tử của dãy
ựặt cách nhau ắt nhất một dấu cách . Hãy ựọc nôi dung tệp và tìm giá trị lớn nhất trong số các phần tử của các dẫy và ghi giá trị này vào cuối tệp
using System; using System.IO; class ViDu1 {
static void Main() {
string xau;
int[][] a=new int[50][]; int d,n=0;
StreamReader f1=FilẹOpenText("D:/dulieụtxt"); xau = f1.ReadLine();
do{
d = 0;
foreach(string con in xaụSplit(' ')) if (con.Length > 0) { ArraỵResize(ref a[n], ++d); a[n][d - 1] = int.Parse(con); } xau = f1.ReadLine(); n = n + 1; }while(xau!=null); f1.Close(); int j,i,max=a[0][0]; for (i = 0; i < n; ++i) for (j = 0; j < a[i].Length; ++j) if (max < a[i][j]) max = a[i][j];
StreamWriter f2 = FilẹAppendText("D:/dulieụtxt"); f2.WriteLine();
f2.WriteLine("Phan tu lon nhat cua cac day la {0}", max); f2.Close();
} }