Note if this example is in your plugin: If its 80%> of your whole script, I suggest you dont post it as a plugin.
This is a small example on changing weapon models for Counter-Strike. With this example you can change all 3 types of the model: view, player, and world. I have written one with Engine and Fakemeta for people who are not familiar with Fakemeta yet, and one only on fakemeta for L33T coders.
I hope this helps, so people dont need to keep posting about this ;).
Engine and Fakemeta
Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
new VIEW_MODEL[] = "models/v_<model name>.mdl"
new PLAYER_MODEL[] = "models/p_<model name>.mdl"
new WORLD_MODEL[] = "models/w_<model name>.mdl"
new OLDWORLD_MODEL[] = "models/w_<model name>.mdl" // the world model you want replaced
new PLUGIN_NAME[] = "Custom Weapon Model"
new PLUGIN_AUTHOR[] = "Cheap_Suit"
new PLUGIN_VERSION[] = "1.0"
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
register_event("CurWeapon", "Event_CurWeapon", "be","1=1")
register_forward(FM_SetModel, "fw_SetModel")
}
public plugin_precache()
{
precache_model(VIEW_MODEL)
precache_model(PLAYER_MODEL)
precache_model(WORLD_MODEL)
}
public Event_CurWeapon(id)
{
// might not work for other mods
new weaponID = read_data(2)
// eg, if weapon is not ak then continue
if(weaponID != CSW_AK47)
return PLUGIN_CONTINUE
// this set's the view model (what you see when holding the gun)
entity_set_string(id, EV_SZ_viewmodel, VIEW_MODEL)
// this set's the player model (what you see when people holding the gun)
entity_set_string(id, EV_SZ_weaponmodel, PLAYER_MODEL)
return PLUGIN_CONTINUE
}
public fw_SetModel(entity, model[])
{
// check if its a valid entity or else we'll get errors
if(!is_valid_ent(entity))
return FMRES_IGNORED
// checks if it's the model we want to change
if(!equali(model, OLDWORLD_MODEL))
return FMRES_IGNORED
new className[33]
entity_get_string(entity, EV_SZ_classname, className, 32)
// dropped weapons map weapons c4 + grenades
if(equal(className, "weaponbox") || equal(className, "armoury_entity") || equal(className, "grenade"))
{
// set's the world model (what you see on the ground)
entity_set_model(entity, WORLD_MODEL)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
Code:
public Event_CurWeapon(id)
{
// might not work for other mods
new weaponID = read_data(2)
// eg, if weapon is not ak then continue
if(weaponID != CSW_AK47)
return PLUGIN_CONTINUE
// this set's the view model (what you see when holding the gun)
set_pev(id, pev_viewmodel, engfunc(EngFunc_AllocString, VIEW_MODEL))
// this set's the player model (what you see when people holding the gun)
set_pev(id, pev_weaponmodel, engfunc(EngFunc_AllocString, PLAYER_MODEL))
return PLUGIN_CONTINUE
}
public fw_SetModel(entity, model[])
{
// check if its a valid entity or else we get errors
if(!pev_valid(entity))
return FMRES_IGNORED
// checks if its the model we want to change
if(!equali(model, OLDWORLD_MODEL))
return FMRES_IGNORED
new className[33]
pev(entity, pev_classname, className, 32)
// dropped weapons map weapons c4 + grenades
if(equal(className, "weaponbox") || equal(className, "armoury_entity") || equal(className, "grenade"))
{
engfunc(EngFunc_SetModel, entity, WORLD_MODEL)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
For Fakemeta you don't need to allocate the string when using viewmodel2 or weaponmodel2.
Amended above example:
Code:
// this set's the view model (what you see when holding the gun)
set_pev(id, pev_viewmodel2, VIEW_MODEL)
// this set's the player model (what you see when people holding the gun)
set_pev(id, pev_weaponmodel2, PLAYER_MODEL)
Weapon ID reference
Code:
#define CSW_P228 1
#define CSW_SCOUT 3
#define CSW_HEGRENADE 4
#define CSW_XM1014 5
#define CSW_C4 6
#define CSW_MAC10 7
#define CSW_AUG 8
#define CSW_SMOKEGRENADE 9
#define CSW_ELITE 10
#define CSW_FIVESEVEN 11
#define CSW_UMP45 12
#define CSW_SG550 13
#define CSW_GALI 14
#define CSW_GALIL 14
#define CSW_FAMAS 15
#define CSW_USP 16
#define CSW_GLOCK18 17
#define CSW_AWP 18
#define CSW_MP5NAVY 19
#define CSW_M249 20
#define CSW_M3 21
#define CSW_M4A1 22
#define CSW_TMP 23
#define CSW_G3SG1 24
#define CSW_FLASHBANG 25
#define CSW_DEAGLE 26
#define CSW_SG552 27
#define CSW_AK47 28
#define CSW_KNIFE 29
#define CSW_P90 30
Example of changing the skin of the knife
Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
new VIEW_MODEL[] = "models/v_newKnife.mdl"
new PLAYER_MODEL[] = "models/p_newKnife.mdl"
new WORLD_MODEL[] = "models/w_knife.mdl"
new OLDWORLD_MODEL[] = "models/w_knife.mdl"
new PLUGIN_NAME[] = "Custom Knife Model"
new PLUGIN_AUTHOR[] = "Cheap_Suit"
new PLUGIN_VERSION[] = "1.0"
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
register_event("CurWeapon", "Event_CurWeapon", "be","1=1")
register_forward(FM_SetModel, "fw_SetModel")
}
public plugin_precache()
{
precache_model(VIEW_MODEL)
precache_model(PLAYER_MODEL)
precache_model(WORLD_MODEL)
}
public Event_CurWeapon(id)
{
new weaponID = read_data(2)
if(weaponID != CSW_KNIFE)
return PLUGIN_CONTINUE
set_pev(id, pev_viewmodel2, VIEW_MODEL)
set_pev(id, pev_weaponmodel2, PLAYER_MODEL)
return PLUGIN_CONTINUE
}
public fw_SetModel(entity, model[])
{
if(!is_valid_ent(entity))
return FMRES_IGNORED
if(!equali(model, OLDWORLD_MODEL))
return FMRES_IGNORED
new className[33]
entity_get_string(entity, EV_SZ_classname, className, 32)
if(equal(className, "weaponbox") || equal(className, "armoury_entity") || equal(className, "grenade"))
{
engfunc(EngFunc_SetModel, entity, WORLD_MODEL)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}



![[Bài 12: Thao tác với XML trong C#]
:putnam: XML là gì ?
XML (eXtensible Markup Langue) đóng một vai trò quan trọng trong .NET, đọc và ghi một file xml là những xử lý cơ bản chúng ta cần biết.
XML thường được sử dụng để lưu trữ thông tin chương trình, những thiết lập hay tùy chọn sẵn có của chương trình, chức năng hoàn toàn tương tự ini trong ngôn ngữ Autoit.
:putnam: Đọc XML file, tạo, xóa và ghi XML file
Để giảm tải thời gian đọc bài, mình sẽ minh họa bằng code mẫu và chú thích cho dễ hiểu :)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Xml;
namespace XML
{
class Program
{
static void Main(string[] args)
{
string contentXML = "<item>" +
"<name>Lang Tu</name>" +
"<name>Phat Bui</name>" +
"<name>IWanna Tam</name>" +
"<name>Duy Anh</name>" +
"</item>"; // Tạo một nội dung XMl
XmlDocument docXML = new XmlDocument(); // Tạo đối tượng XmlDocument
docXML.LoadXml(contentXML); // Load nội dung contentXML
string xpath = "//name"; // Đường dẫn của Node con "name"
XmlNode node = docXML.CreateNode(XmlNodeType.Element, "name", null); // Tạo một node mới bằng phương thức CreateNode
node.InnerText = "Yagami Raito"; // Gán nội dung cho Node con mới tạo
docXML.SelectSingleNode("item").AppendChild(node); // Thêm Node con mới tạo vào Node cha "item"
XmlNode name= docXML.SelectSingleNode(xpath); // Lấy ra Node con "name" đầu tiên.
XmlNodeList nameList = docXML.SelectNodes(xpath); // Lấy ra tất cả các Node con "name" hiện có.
foreach (XmlNode bl in nameList) // Truy xuất tất cả các Node con trong nameList
{
if (bl.InnerText == "Yagami Raito") bl.InnerText = "Yagami"; // Thay đổi nội dung Node con có nội dung là "Yagami Raito" thành "Yagami"
Console.WriteLine(bl.InnerText);
}
XmlTextWriter writer = new XmlTextWriter("data.xml", null); // Tạo đối tượng XmlTextWriter để lưu nội dung XML vào file "data.xml"
writer.Formatting = Formatting.Indented;
docXML.Save(writer); // Lưu nội dung docXML vào file "data.xml"
Console.ReadKey();
Process.Start("notepad.exe", "data.xml"); // Khởi tạo tiến trình để Edit tập tin "data.xml"
}
}
}](https://fbcdn-sphotos-f-a.akamaihd.net/hphotos-ak-xfp1/t1.0-9/q71/s480x480/1959242_358280617662599_3171359539971510513_n.jpg)
![[Bài 11: Làm việc với tập tin trong C#]
:putnam: Bạn có thể truy cập link dưới đây để tìm hiểu :
http://msdn.microsoft.com/en-us/library/System.IO(v=vs.110).aspx
Đầu tiên bạn nhớ khai báo thêm :
using System.IO;
namespace System.IO là vùng của các thư viện lớp dành cho những dịch vụ liên quan đến xuất nhập dữ liệu dựa trên tập tin.
Bạn cần tạo 1 file mới , di chuyển hoặc xóa một file hiện có .
Việc này có hai lớp thực hiện là File và Fileinfo.
:putnam: File và Directory : chỉ chứa các phương thức tĩnh (static) chúng chứa tất cả những phương thức để thao tác với file và thư mục
:putnam: Fileinfo và Directoryinfo : chứa các phương thức thể hiện (instance) , chúng chỉ thao tác trên 1 đối tượng cụ thể .
Phương thức thể hiện create của lớp File
if (!File.Exists(@"C:\tam.txt"))
{
Console.Write("file chua ton tai");
File.Create(@"C:\tam.txt");
}
else
Console.Write("trung file");
Kí hiệu @ trong khai báo chuỗi path phía trên là giúp C# hiểu kí tư ‘/’ là một kí hiệu của đường dẫn.
:putnam: Phương thức thể hiện create của lớp Fileinfo
Để sử dụng các phương thức cũng như thuộc tính của lớp FileInfo bạn cần khởi tạo đối tượng FileInfo cho nó.
FileInfo <Tên biến> = new FileInfo (string <Đường dẫn>);
FileInfo file = new FileInfo(@"C:\tam.txt");
if (!file.Exists)
{
file.Create();
}
else
Console.WriteLine("da ton tai");
:putnam: Sao chép 1 File
Dùng phương thức tĩnh File.Copy.
File.Copy(@"C:\tam.txt", @"C:\ta.txt", true);
Phương thức thể hiển Copyto.
FileInfo file = new FileInfo(@"C:\tam.txt");
file.CopyTo(@"C:\tamm.txt",true);
:putnam: Di chuyển 1 File
Dùng phương thức tĩnh Move của lớp File.
File.Move(@"C:\tam.txt", @"D:\tam.txt");
Dùng phương thức thể hiện MoveTo của lớp Fileinfo
FileInfo File = new FileInfo(@"C:\tam.txt");
File.MoveTo(@"D:\tam.txt");
Nếu bạn đang cần 1 cách tạo nhanh chóng hoặc di chuyển , sao chép file… thì nên sử dụng phương thức tĩnh . Nếu bạn đang thực hiện nhiều thao tác trên 1 file,
ví dụ :
bạn tạo lập sau đó di chuyển . thì hãy dùng Fileinfo.
Một vài lưu ý :
+ Nếu thư mục hoặc tập tin không tồn tại sẽ xảy ra lỗi ngoại lệ.
+ Nếu không có đường dẫn nào được cung cấp,File sẽ nằm tại thư mục đang làm việc hiện hành.Nếu user không có quyền ghi vào thư mục đang làm việc (chẳng hạn thư mục Program Files ), sẽ xảy ra lỗi ngoại lệ
:putnam: Thao tác các thuộc tính File
Để hiện thị các timestamp của một file,bạn có thể sử dụng hoặc là các phương thức tĩnh của lớp File , hoặc là các phương thức tĩnh của lớp Fileinfo.
Ví dụ về phương thức tĩnh File.
Console.WriteLine(File.GetCreationTime(@"C:\tam.txt"));
// GetCreationTime ngày và giờ tạo thư mục
Console.WriteLine(File.GetLastAccessTime(@"C:\tam.txt"));
// GetLastAccessTime thời gian truy xuất cuối của tập tin
Console.WriteLine(File.GetLastWriteTime(@"C:\tam.txt"));
// GetLastWriteTime thời gian ghi lần cuối của tập tin
Ví dụ phương thức thể hiện Fileinfo
FileInfo file = new FileInfo(@"C:\tam.txt");
Console.WriteLine(file.CreationTime);
// CreationTime ngày và giờ tạo thư mục
Console.WriteLine(file.LastAccessTime);
// LastAccessTime thời gian truy xuất cuối của tập tin
Console.WriteLine(file. LastWriteTime);
// LastWriteTime thời gian ghi lần cuối của tập tin
Chỉnh sửa các timestamp của 1 file , bạn có thể sử dụng hoặc là các phương thức tĩnh của lớp File , hoặc là các phương thức tĩnh của lớp Fileinfo.
Ví dụ về phương thức tĩnh File.
File.SetCreationTime(@"C:\tam.txt", DateTime.Parse(@"6,9,2014"));
// SetCreationTime chỉnh sửa ngày và giờ tạo thư mục
Các phương thức thể hiện cũng tương tự để chỉnh sửa thông tin 1 file.
FileInfo file = new FileInfo(@"C:\tam.txt");
DateTime dt = new DateTime(2014,6,13);
file.CreationTime = dt;
Hiện thị các thuộc của 1 file
FileInfo file = new FileInfo(@"C:\tam.txt");
Console.WriteLine(file.Attributes);
:putnam: Lựa chọn phương thức mở một File hay Stream để đọc/ghi
Đọc và viết vào files nói chung rất đơn giản; tuy nhiên , Điều này không phải bắt buộc biết các đối tượng File hoặc FileInfo. Thay vào đó chúng ta phải biết một số lớp trình bày nội dung chung gọi là stream.
Sử dụng các luồng(stream) file để thực hiện nhiều chức năng xử lý file khác nhau.Có 5 kiểu cơ bản về các thao tác luồng file dựng sẵn để các bạn sử dụng
+ FileStream
FileStream được sử dụng đọc và viết dữ liệu vào hoặc từ một file. Để khởi tạo một FileStream, bạn cần 4 phần sau:
file bạn muốn truy xuất .
Mode cho biết bạn muốn mở file như thế nào.
Access cho biết bạn muốn truy xuất file như thế nào – bạn định đọc hoặc viết file
share access khả năng truy xuất file.
FileMode Append, Create, CreateNew, Open, OpenOrCreate, or Truncate
FileAccess Read, ReadWrite, or Write
FileShare Inheritable, None, Read, ReadWrite, or Write
Để khởi tạo một stream ta dùng cách sau
FileStream file = new FileStream(@"C:\tam.txt",FileMode.Open,FileAccess.ReadWrite);
+ StreamWriter
Lớp này chứa các phương thức để chỉ ghi các kí tự hoặc dòng các ký tự.
Các phương thức :
Close Đóng stream đang đọc dữ liệu.
Peek Trả về ký tự kế tiếp trong stream mà không di chuyển cho trỏ dữ liệu.
Read Đọc một nhóm ký tự kế tiếp trong Stream.
ReadBlock Đọc một khối kí tự kế tiếp trong Stream.
ReadLine Đọc một dòng kế tiếp trong Stream.
ReadToEnd Đọc hết các kí tự trong Stream.
ví dụ :
FileStream file = new FileStream(@"C:\tam.txt", FileMode.Open);
StreamReader read = new StreamReader(file);
Console.WriteLine(read.ReadToEnd());
read.Close();
+ StreamWriter
Lớp này chứa các phương thức để chỉ ghi các kí tự hoặc các dòng ký tự.
Các phương thức :
Close Đóng stream đang ghi dữ liệu
Write Ghi dữ liệu vào stream
WriteLine Ghi dữ liệu vào stream và ngắt xuống dòng mới
FileStream file = new FileStream(@"C:\tam.txt",FileMode.Open);
StreamWriter write = new StreamWriter(file);
write.Write("767667");
write.Close();](https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-xpa1/t1.0-9/s526x395/1513179_540041836117936_7494643779528123877_n.jpg)
![[Bài 10: Thao tác với chuỗi trong C#]
:putnam: Thao tác với chuỗi là công việc thường ngày của hầu hết các lập trình viên C#. .NET Framework mang lại cho chúng ta nhiều công cụ hữu ích để thao tác với chuỗi
Điều đầu tiên cần lưu ý là chuỗi trong .NET là kiểu tham chiếu (reference type). Các kiểu tham chiếu sẽ được quản lý ở bộ nhớ heap trong .NET và chúng được quản lý bởi bộ thu gom rác của .NET (.NET Garbage Collector) và không phải như các kiểu giá trị (value type), chúng không được tự động hủy khi chúng không còn nằm trong phạm vi sử dụng.
Khai báo một chuỗi :
Cú pháp: string ten_bien;
Lưu ý rằng các biến kiểu string không có giá trị mặt định, do đó bạn cần phải quy định giá trị cho nó trước khi truy xuất hoặc sử dụng nó
Ví dụ :
string s = "Yagami Raito";
Console.WriteLine(s)
:putnam: Các ký tự Escape
Tương tự với ngôn ngữ C, các chuỗi C# có thể chứa các ký tự escape, các ký tự này sẽ định nghĩa cách chuỗi được in ra.
Các kỹ tự escape được bắt đầu bởi ‘\’ và theo sau là một ký tự
Dưới đây là một số ký tự escape thông dụng:
\’ Thêm vào một dấu nháy đơn
\” Thêm vào một dấu nháy kép
\\ Thêm vào ký tự xuyệt (‘\’)
\a Kích hoạt một cảnh báo hệ thống
\n Thêm một dòng mới
\r Chuyển qua đoạn văn mới
\t Thêm một tab
Ví dụ:
string s = "I am \'Yagami Raito \' ";
Console.WriteLine(s)
Kết quả xuất ra : I am ‘Yagami Raito ‘
:putnam: Các thao tác với chuỗi :
+ Phương thức ToString () : Dùng để chuyển đổi một đối tượng bất kỳ sang kiểu chuỗi
+ Chúng ta có thể nối các chuỗi với nhau một cách dễ dàng bằng cách sử dụng toán tử ‘+’
+ Trả về là độ dài của chuỗi (1 số nguyên dương) : str.Length
+ Nối chuỗi str2 sau chuỗi str1: string.Concat(s1, s2)
+ So sánh chuỗi str1 với chuỗi str2. Kiểu trả về là -1, 0, 1. (So sánh từng ký tự trong bảng mã ASCII) : string.Compare(str1, str2)
+ Thêm chuỗi str sau n ký tự của chuỗi s1 cần chèn : s1.Insert(n, str)
+ Thay thế chuỗi str1 bằng chuỗi str2 : s2 = s2.Replace(s2, s1)
+ Xóa khoảng trắng thừa 2 bên chuỗi : str = str.Trim()
+ IN HOA & chữ thường chuỗi str : string Upper = s1.ToUpper(); string Lower = s2.ToLower();](https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-xpf1/t1.0-9/10353655_357585961065398_4516503660562127584_n.jpg)
![[Bài 9: Thao tác với dữ liệu kiểu mảng trong C#]
:putnam: Mảng là tập hợp của các phần tử cùng dạng và cùng loại.Có thể truy xuất được từng phần tử thông qua chỉ số(index) của nó.
Trước khi tạo ra một mảng,đầu tiên bạn phải lựa chọn loại phần tử sẽ được thực hiện.Nó là nhóm của các con số,nhóm của các ký tự..v.v. Những thông tin này sẽ cho phép trình biên dịch biết được phải dành ra bao nhiêu không gian trống cho mỗi phần tử của nhóm sẽ yêu cầu.Bởi vì mỗi phần tử của nhóm sẽ chiếm một không gian trống cho mình.Điều này cũng giống như các biến thông thường mà chúng ta vẫn dùng.
Bạn phải chỉ rõ số lượng phần tử sẽ được tạo thành của nhóm.Để trình biên dịch có thể cấp phát đầy đủ số lượng không gian trống của bộ nhớ.Số lượng các phần tử của mảng được đặc trong dấu ngoặc vuông.
<kiểu dữ liệu> [] <tên mảng> = new <kiểu dữ liệu> [<số phần tử>];
Ngoài ra,bạn có thể sử dụng từ khóa var để tạo ra một mảng.
var <tên mảng> = new <số phần tử>;
Ví dụ:
using System;
class program
{
static void Main()
{
int [] _arrays = new int [3];
}
}
Ví dụ: Sử dụng từ khóa var
using System;
class program
{
static void Main()
{
var [] _arrays = new int [3];
}
}
:putnam: Khởi tạo một mảng
Khi tạo ra một mảng, các phẩn tử của mảng đó sẽ được khởi gán một giá trị nhất định.
Ví dụ:
Int 0 float 0,0 double 0,0 char ‘’ string Null
Các cách khởi tạo phần tử cho mảng:
Cách 1: Trong c# mỗi chỉ số tương ứng với phần tử đó để xác định vị trí của phần tử ở trong mảng
using System;
class program
{
static void Main()
{
var _arrays = new int[3];
_arrays[0] = 1;
_arrays[1] = 3;
_arrays[2] = 5;
}
}
Cách 2: Bạn có thể khởi tạo mảng khi khai báo nó:
Ví dụ:
using System;
class program
{
static void Main()
{
var[] _arrays = new int[3] { 1, 3, 5 };
}
}
Với cách khởi tạo kiểu này bạn có thể để trống phần phần số phần tử.
using System;
class program
{
static void Main()
{
var[] _arrays = new int[] { 1, 3, 5 };
}
}
:putnam: Truy cập các thành viên của mảng
Sau khi khởi tạo một mảng,thì mỗi thành viên đã có một giá trị.Khi đó bạn có thể truy cập vào bất kì thành viên nào của mảng để thao tác và thậm chí là thay đổi giá trị của nó.
Để truy cập vào các thành viên của mảng,bạn có thể sử dụng chỉ số của nó.
Console.WriteLine( _array[chỉ số] );
- Sử dụng vòng for: Dùng để truy cập vào tất cả các thành viên trong mảng bằng chỉ số.
using System;
public class program
{
static void Main()
{
int[] _arrays = new int[] { 12, 52, 6, 24, 64 };
for (var i = 0; i < 5; i++)
Console.WriteLine(_arrays[i]);
}
}
:putnam: Thao tác với mảng trong C#
+ Ta có thể tìm được chiều dài của mảng sau nhờ vào thuộc tính Length thí dụ sau :
int arrayLength = integers.Length
+ Nếu các thành phần của mảng là kiểu định nghĩa trước (predefined types), ta có thể sắp xếp tăng dần vào phương thức gọi là static Array.Sort() method:
Array.Sort(myArray);
+ Ta có thể đảo ngược mảng đã có nhờ vào the static Reverse() method:
Array.Reverse(myArray);
+ Nếu bạn muốn phần tử xuất hiện cuối cùng ta dùng Array.LastIndexOf()
+ Dùng phương thức IndexOf , Phương thức sẽ duyệt lần lượt từng phần tử trong mảng: IndexOf(Array array, object value);
+ Để thêm phần tử vào mảng bạn sử dụng phương thức Array.SetValue()
+ Một khi mảng được khởi tạo,bạn có thể truy cập vào từng thành viên của nó.Để hỗ trợ cho việc truy cập này Class Array cung cấp phương thức GetValue()
+ Trong khi sử dụng mảng.Có những lúc ta phải thay đổi kích thước của mảng để làm việc. Ta sử dụng phương thức Copy có trong Class Array : Copy(Array, Array, Int32) (…)
Bài viết tham khảo khác : http://yagarai.blogspot.com/2013/10/c-can-ban-mang-arrays.html](https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-xaf1/t1.0-9/10348206_357579407732720_4623566309823154775_n.jpg)
![[Bài 8 : Toán tử & ưu tiên toán tử trong C#]
:putnam: C# hỗ trợ các phép toán thong thường mà các bạn đã học từ mẫu giáo :v .Như :
Dấu cộng (+)
Dấu trừ (-)
Dấu nhân (*)
Dấu chia (/)
số dư (%) // 9 / 2 dư 1 9 % 2 = 1
Chúng được gọi là toán tử (operator) .
Vd: Console.WriteLine(8*4);
Không phải tất cả toán tử đều có thể áp dụng cho tất cả các kiểu dữ liệu.Các toán tử mà bạn có thể sử dụng trên một giá trị phụ thuộc vào kiểu giá trị đó.
Sử dụng toán tử cho kiểu chuỗi (string)
Vd :
Console.WriteLine("tam"*"ta"); // lỗi
Console.WriteLine("Thanh"+" Tam"); // Thanh Tam
:putnam: Quyền ưu tiên
Mình hiểu là cái gì trước cái gì sau :3
Vd : 7+2*9 // 25
(+) hay (*).Chắc chắn rằng rất quan trọng vì nó thay đổi hoàn toàn đáp số nhận được.
Trong C# ,các toán tử ( *, / , % ) có quyền ưu tiên hơn các toán tử ( + , - )
Thứ tự tính toán các phép toán ưu tiên từ trái sang phải.
Nếu bạn muốn thay đổi quyền ưu tiên phép toán bằng phép toán khác.
(2+3)*4 // dùng dấu “( )”
5*4=20
:putnam: Toán tử tăng và giảm
Khi sử dụng các biến số ta thường có thao tác là cộng một giá trị vào biến, trừ đi một
giá trị từ biến đó, hay thực hiện các tính toán thay đổi giá trị của biến sau đó gán giá trị mới vừa tính toán cho chính biến đó.
Biến ++ : tăng biến lên 1 đơn vị
Biến -- : giảm biến xuống 1 đơn vị
Vd:
int i = 1;
i++;
Console.WriteLine(i);
Nếu muốn tăng i thêm 100.Bạn có thể làm như sau :
i = i + 100 ;
viết gọn lại thành :
i +=100 ; // hoặc nhân i*=100 …
:putnam: Toán tử quan hệ
Những toán tử quan hệ được dùng để so sánh giữa hai giá trị, và sau đó trả về kết quả
là một giá trị logic kiểu bool (true hay false). Ví dụ toán tử so sánh lớn hơn (>) trả về giá trị là true nếu giá trị bên trái của toán tử lớn hơn giá trị bên phải của toán tử. Do vậy 5 > 2 trả về một giá trị là true, trong khi 2 > 5 trả về giá trị false.
So sánh bằng ==
Khác !=
Nhỏ hơn <
Lớn hơn >
Nhỏ hơn hoặc bằng <=
Lớn hơn hoặc bằng >=
Lưu ý: == là toán tử so sánh và = là phép gán .
:putnam: Tiền tố và hậu tố
Lệnh 1 : A=B++; // dấu ++ nằm liền sau biến gọi là hậu tố
Gán trước rồi tăng sau. Vd: A= 10 , B=11
Lệnh 2 : A=++B; // dấu ++ nằm liền trước biến gọi là tiền tố
Tăng trước rồi gán sau. Vd : A= 11, B=11
:putnam: Toán tử logic
Trong câu lệnh if mà chúng ta đã tìm hiểu trong phần trước, thì khi điều kiện là true
thì biểu thức bên trong if mới được thực hiện. Đôi khi chúng ta muốn kết hợp nhiều điều kiện
với nhau như: bắt buộc cả hai hay nhiều điều kiện phải đúng hoặc chỉ cần một trong các điều kiện đúng là đủ hoặc không có điều kiện nào đúng...C# cung cấp một tập hợp các toán tử logic để phục vụ cho người lập trình.
+ Phép toán And (&&) // toán tử và .. cả 2 điều kiện phải đúng
int x = 10;
int y = 20;
if (x == 10 && y== 20)
Console.WriteLine("dung");
else
Console.WriteLine("sai");
+ Phép toán OR ( || ) // toán tử hoặc .. 1 trong 2 điều kiện đúng
int x = 10;
int y = 5;
if (x == 10 || y== 20)
Console.WriteLine("dung");
else
Console.WriteLine("sai");
+ Phép toán Not ( ! ) // phủ định . Đối với toán tử not, biểu thức sẽ có giá trị đúng khi điều kiện trong ngoặc là sai, và ngược lại,
int x = 3;
if (!(x == 3))
Console.WriteLine("dung");
else
Console.WriteLine("sai");
:putnam: Toán tử ba ngôi
Hầu hết các toán tử đòi hỏi có một toán hạng như toán tử (++, --) hay hai toán hạng như (+,-,*,/,...). Tuy nhiên, C# còn cung cấp thêm một toán tử có ba toán hạng (?:). Toán tử này có cú pháp sử dụng như sau: ( ? : )
Công thức : (Điều_kiện)?(Biểu thức 1):(Biểu thức 2);
Toán tử này sẽ xác định giá trị của một biểu thức điều kiện, và biểu thức điều kiện này phải trả về một giá trị kiểu bool. Khi điều kiện đúng thìsẽ được thực hiện, còn ngược lại điều kiện sai thì sẽ được thực hiện. Có thể diễn giải theo ngôn ngữ tự nhiên thì toán tử này có ý nghĩa : “Nếu điều kiện đúng thì làm công việc thứ nhất, còn ngược lại điều kiện sai thì làm công việc thứ hai”.
Vd:
int i = 5;
string test = i < 0 ? "i be hon 0" : "i lon hon 0";
Console.WriteLine(test);
Tương tự
int i = 5;
string test;
if (i < 0)
{
test = "i be hon 0";
}
else
{
test = "i lon hon 0";
}
Tham khảo chi tiết http://yagarai.blogspot.com/2013/10/c-can-ban-toan-tu-operators.html èo](https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-xpa1/v/t1.0-9/1525273_536233046498815_3609976170701179566_n.jpg?oh=139f8fe67e716ffa384eb32971477eda&oe=5415F798&__gda__=1410276517_876a4db28dff06e251f2c353219475e8)
![[Bài 7: Câu lệnh điều kiện - Cấu trúc lặp trong C#]
Khi bạn đã từng học 1 ngôn ngữ lập trình nào đó trước khi đọc bài này thì chắc rằng không còn xa lạ gì nữa về
- Câu lệnh điều kiện .
- Cấu trúc lặp .
+ Câu lệnh điều kiện :
Khi bạn muốn chọn giữa việc thực thi 2 câu lệnh khác nhau. Phụ thuộc vào 1 kết quả .
Bạn có thể sử dụng câu lệnh if .
Công thức:
If (điều_kiện_để_chạy)
Câu lệnh 1
Else // nếu điều kiện không đúng để lệnh 1 chạy
Câu lệnh 2
Ví dụ :
Console.WriteLine("nhap so ");
int i=int.Parse(Console.ReadLine());
if (i%2==0)
Console.WriteLine("so chan");
else
Console.WriteLine("so le");
Console.ReadLine();
Ví dụ này kiểm tra số chẵn lẻ bằng điều kiện if…else…
- Phân tầng các câu lệnh if.
Nếu bạn có nhiều câu lệnh cần kiểm tra thì đây là 1 lựa chọn
Công thức :
If (điều_kiện_để_chạy_lệnh_1)
Câu lệnh 1
Else if (điều_kiện_để_chạy_lệnh_2)
Câu lệnh 2
Else if (điều_kiện_để_chạy_lệnh_3)
Câu lệnh 3
Else if (điều_kiện_để_chạy_lệnh_4)
Câu lệnh 4
Else if (điều_kiện_để_chạy_lệnh_N)
Câu lệnh N
Else //nếu tất cả đều sai
câu lệnh chạy
ví dụ:
Console.WriteLine("nhap so ");
int i=int.Parse(Console.ReadLine());
if (i==0)
Console.WriteLine("0");
else if(i==1)
Console.WriteLine("1");
else if (i == 2)
Console.WriteLine("2");
else if (i == 3)
Console.WriteLine("3");
else
Console.WriteLine("ngoai vung");
Console.ReadLine();
Câu lệnh switch.
Khi có quá nhiều điều kiện để kiểm tra thì câu lệnh if ..else.. trở nên rối và dài dòng.
Giải pháp của ta sẽ là switch
công thức :
switch (biểu thức điều kiện)
{
case (giá trị 1)
Các câu lệnh thực hiện
Break;
case (giá trị 2)
Các câu lệnh thực hiện
Break;
case (giá trị n)
Các câu lệnh thực hiện
Break;
default:
Các câu lệnh thực hiện mặc định
Break;
}
Bạn lưu ý : lệnh nhảy “Break;” bắt buộc phải có ở cuối câu lệnh như trên công thức và ví dụ dưới đây .
tt:;
Console.WriteLine("nhap so ");
int i=int.Parse(Console.ReadLine());
switch (i)
{
case 1:
Console.WriteLine("so 1");
break;
case 2:
Console.WriteLine("so 2");
break;
case 3:
Console.WriteLine("so 3");
break;
default:
goto tt;
}
Console.ReadLine();
Ở trên mình có sử dụng lệnh nhảy goto.nó sẽ nhảy đến tt:; tức là đầu chương trình trên ví dụ.
Lệnh nhảy goto là một lệnh nhảy đơn giản, cho phép chương trình nhảy vô điều kiện tới một vị trí trong chương trình thông qua tên nhãn. Tuy nhiên việc sử dụng lệnh goto thường làm mất đi tính cấu trúc thuật toán, việc lạm dụng sẽ dẫn đến một chương trình nguồn mà giới lập trình gọi là “mì ăn liền” rối như mớ bòng bong vậy. Hầu hết các người lập trình có kinh nghiệm đều tránh dùng lệnh goto. Sau đây là cách sử dụng lệnh nhảy
goto:
Tạo một nhãn
goto đến nhãn
Nhãn là một định danh theo sau bởi dấu hai chấm (:). Thường thường một lệnh goto gắn với một điều kiện nào đó.
Câu lệnh lặp :
C# cung cấp một bộ mở rộng các câu lệnh lặp, bao gồm các câu lệnh lặp for, while và do... while. Ngoài ra ngôn ngữ C# còn bổ sung thêm một câu lệnh lặp foreach.
Vòng lặp for:
Lặp với điều kiện.
Bạn có thể khởi tạo 1 biến trong vòng lặp for.biến đó sẽ được định phạm vi trong phần thân của câu lệnh for và biến mất khi câu lệnh for hoàn tất.bạn không thể sử dụng nó khi vòng lặp for đã kết thúc,có thể tái sử dụng biến đó cho vòng lặp khác .
công thức :
for ([ phần khởi tạo] ; [biểu thức điều kiện]; [bước lặp])
<Câu lệnh thực hiện>
Ví dụ :
for (int i = 0; i <= 10; i++)
{
Console.WriteLine(i);
}
Console.ReadLine();
Vòng lặp while:
Trong khi điều kiện đúng thì thực hiện các công việc này
Chạy đến khi nào sai thì thôi :3
Công thức :
while (Biểu thức)
<Câu lệnh thực hiện>
Ví dụ:
int i = 0;
while (i < 10)
{
Console.WriteLine(i);
i++;
}
Console.ReadLine();
Bạn nhớ phải đưa 1 lệnh để giá trị lặp có thể thay đổi từ true sang false. Để tránh vòng lặp này chạy vô tận. trong ví dụ trên mình sử dụng câu lệnh i++ để thực hiện
Vòng lặp do...while .
làm điều này trong khi điều kiện vẫn còn đúng
Các câu lệnh while và for đều có điều kiện ở đầu vòng lặp. điều này có nghĩa nếu biểu thức đánh giá thành false thì sẽ không chạy dù chỉ 1 lần. câu lệnh do thì khác. Điều kiện ở cuối chương trình cho phép nó đánh giá sau mỗi lần lặp lại . Do đó phần thân sẽ thực thi tối thiểu 1 lần.
Công thức:
do
{
Câu lệnh
}
while <điều kiện>.
ví dụ :
int i = 0;
do
{
Console.WriteLine(i);
i++;
}
while (i < 10);
Console.ReadLine();
Vòng lặp foreach:
Vòng lặp foreach cho phép tạo vòng lặp thông qua một tập hợp hay một mảng.
Do lặp dựa trên một mảng hay tập hợp nên toàn bộ vòng lặp sẽ duyệt qua tất cả các thành phần của tập hợp theo thứ tự được sắp. Khi duyệt đến phần tử cuối cùng trong tập hợp thì chương trình sẽ thoát ra khỏi vòng lặp foreach.
Công thức :
foreach ( <kiểu tập hợp> <tên truy cập thành phần > in < tên tập hợp>)
<Các câu lệnh thực hiện>
Ví dụ:
int[] a = { 6, 9, 96,69 };
foreach (int i in a)
{
Console.WriteLine(i);
}
Console.ReadLine();
Câu lệnh nhảy break và continue :
Khi đang thực hiện các lệnh trong vòng lặp, có yêu cầu như sau: không thực hiện các lệnh còn lại nữa mà thoát khỏi vòng lặp, hay không thực hiện các công việc còn lại của vòng lặp hiện tại mà nhảy qua vòng lặp tiếp theo. Để đáp ứng yêu cầu trên C# cung cấp hai lệnh nhảy là break và continue để thoát khỏi vòng lặp.
Break khi được sử dụng sẽ đưa chương trình thoát khỏi vòng lặp và tiếp tục thực hiện các lệnh tiếp ngay sau vòng lặp.
Continue ngừng thực hiện các công việc còn lại của vòng lặp hiện thời và quay về đầu vòng lặp để thực hiện bước lặp tiếp theo
Hai lệnh break và continue tạo ra nhiều điểm thoát và làm cho chương trình khó hiểu cũng như là khó duy trì. Do vậy phải cẩn trọng khi sử dụng các lệnh nhảy này.
Ví dụ :
int i = -7;
while (true)
{
Console.WriteLine(i);
i++;
if (i < 10)
continue;
else
break;
}
Console.WriteLine("thoát vòng lặp");
Console.ReadLine();
Bài viết tham khảo : http://yagarai.blogspot.com/2013/10/c-can-ban-cau-lenh-ieu-kien.html](https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-xpa1/t1.0-9/q71/s480x480/10347707_534577903330996_5307006232228899719_n.jpg)
