Thứ Ba, 25 tháng 12, 2007

Lập trình C#

if-else statement
Câu lệnh if lựa chọn một câu lệnh để thực hiện dựa trên giá trị của biểu thức có kiểu Boolean.

Cấu trúc:

if (expression) statement1 [else statement2]

Trong đó expression : biểu thức trả về giá trị theo kiểu boole (đúng, sai) hoặc là một kiểu chứa đựng toán tử là true và false

statement1 : những dòng lệnh được thực hiện nếu biểu thức đúng

statement2 : những dòng lệnh được thực hiện nếu biểu thức là sai

Ví dụ 1:

if (x > 10) if (y > 20) Console.Write("Statement_1"); else Console.Write("Statement_2");

Ví dụ 2

if (x > 10) { if (y > 20) Console.Write("Statement_1"); } else Console.Write("Statement_2");

C# Switch Statement
C trúc điều khiển Switch. Là một cấu trúc điều khiển chương trình lựa chọn nhiều điều khiện bằng cách gán giá trị cho nhưng điều kiện case bên trong thân của nó.

Cấu trúc:

switch (expression) { case constant-expression: statement jump-statement [default: statement jump-statement] }

Trong đó:

expression: một số nguyên hoặc chuỗi biểu thức

statement: là những câu lệnh đi kèm để thực hiện nếu điều khiển được chuyển đến case hoặc default.

jump-statement: chuyển điều khiển chương trình ra ngoài thân vòng lạp

caseconstant-expression: điều khiển được chuyển đến một điều kiện case tùy theo giá trị của nó

Ví dụ:

using System; class SwitchTest { public static void Main() { Console.WriteLine("Coffee sizes: 1=Small 2=Medium 3=Large"); Console.Write("Please enter your selection: "); string s = Console.ReadLine(); int n = int.Parse(s); int cost = 0; switch(n) { case 1: cost += 25; break; case 2: cost += 25; goto case 1; case 3: cost += 50; goto case 1; default: Console.WriteLine("Invalid selection. Please select 1, 2, or 3."); break; } if (cost != 0) Console.WriteLine("Please insert {0} cents.", cost); Console.WriteLine("Thank you for your business."); } }

C# For statement - Vòng lặp For
Vòng lặp For thực hiện một câu lệnh hoặc nhóm những câu lệnh một cách lập lại đến khi biểu thức điều kiện trả về giá trị sai (false).

Cấu trúc

for ([initializers]; [expression]; [iterators]) statement

initializers: khởi động bộ đếm (số lần lặp).

expression: biểu thức điều khiện có giá trị theo kiểu boolean.

iterators: câu lệnh gia tăng hoặc giảm số lần lặp

statement: những câu lệnh được thực thi

Ví dụ

using System; public class ForLoopTest { public static void Main() { for (int i = 1; i <= 5; i++) Console.WriteLine(i); } }

Giá trị trả về:

1 2 3 4 5

While statement - Câu lệnh while
Câu lệnh white thực hiện một câu lệnh hoặc một nhóm những câu lệnh đến khi biểu thức điều kiện trả về giá trị false.

Cấu trúc

while (expression) statement

trong đó

expression
Một biểu thức có giá trị trả về là bool, dùng để kiểm tra điều kiện lặp.
statement
Những câu lệnh được thực thi

(*) Chú ý: dùng biểu thức điều kiện lặp để số lần lặp là hữa hạn, tránh trường hợp lọc vô hạn.

Ví dụ:

using System;
class WhileTest
{
  public static void Main()
  {
     int n = 1;

     while (n < 6)
     {
        Console.WriteLine("Current value of n is {0}", n);
        n++;
     }
  }
}

Trả về

Current value of n is 1
Current value of n is 2
Current value of n is 3
Current value of n is 4
Current value of n is 5
Do...white statement - Vòng lặp do...while
Câu lệnh đo thực thi một câu lệnh hay nhóm câu lệnh một cách lặp lại đến khi biểu thức điều kiện lặp trả về false.
Cấu trúc
do statement while (expression);

trong đó

expression
Một biểu thực trả về giá trị có kiểu boolean (đúng, sai), biểu thức này kiểm tra điều kiện lặp
statement
Câu lệnh để được thực thi.

Chú ý

Không giống như câu lệnh while, thân của vòng lặp do được thực hiện ít nhất một lần.

Ví dụ:

using System;
public class TestDoWhile
{
  public static void Main ()
  {
     int x;
     int y = 0;

     do
     {
        x = y++;
        Console.WriteLine(x);
     }

     while(y < 5);
  }  
}

Trả về

0
1
2
3
4

Ví dụ:

Chú ý trong ví dụ này, mặc dầu điều kiện lặp trả về false, nhưng vòng lập cũng được thực hiện một lần.

using System;
class DoTest {
  public static void Main()
  {
     int n = 10;
     do
     {
        Console.WriteLine("Current value of n is {0}", n);
        n++;
     } while (n < 6);
  }
}
Current value of n is 10
Variables - Biến trong C#
Biến biểu trưng cho những vùng bộ nhớ, Mỗi biến được đặt bởi một kiểu dữ liệu để lưu trữ dữ liệu tương ứng.

Một biến phải được khai báo trước khi nó có thể chứa dữ liệu.

Các loại biến

C# định nghĩa có 7 kiểu biến, bao gồm: static variables, instance variables, array elements, value parameters, reference parameters, output parameters, and local variables.

Ví dụ sau sẽ miêu tả 7 kiểu biến đó. class A { public static int x; int y; void F(int[] v, int a, ref int b, out int c) { int i = 1; c = a + b++; } } x là một static variable, y là một instance variable, v[0] là một array element, a là một tham số truyền theo giá trị(value parameter), b là một tham số truyền theo địa chỉ(reference parameter), c là một tham số output, và i là một biến cục bộ.

Hiện thực khái niệm hướng đối tượng (OOP) trong C#
Bài này sẽ giúp bạn hiểu về cách thực thi OOP trong C#, ở phần 1, các bạn sẽ được tiếp cận định nghĩa khái niệm Lớp, Hàm tạo, hàm hủy.

Những nội dung trong phần này tổng kết hóa những điểm quan trọng nhất về khái niệm OOP trong C#. Nội dung bao gồm

  • Định nghĩa lớp, đối tượng
  • Hàm tạo (Constructor), hàm hủy (Destructor)
  • Function Overloading.
  • Thừa kế trong lập trình C#.
  • Overriding Method.
  • Polymorphism
  • Abstract Class trong C#
  • Namespaces
  • Enumerators

Lớp (class) trong C#

Class

Một Class là một khái niệm mô tả cho những thực thể có chung tính chất và hành vi. Class định nghĩa những thuộc tính và hành vi được dùng cho những đối tượng của lớp đó. Do đó có thể nói Class là một khuôn mẫu cho các đối tượng.

Công thức để tạo một class

AccessModifier class className

{

// thân class

}

Đối tượng (Objects)

Đối tượng là một đại diện, hay có thể nói là một sản phẩm của một class. Tất cả các đối tượng đều có chung những thuộc tính và hành vi mà class định nghĩa. Cách tạo đối tượng giống như cách tạo một biến có kiểu dữ liệu là Class.

Ưu điểm của việc sử dụng Class và Đối tượng

Có một số những ưu điểm của việc sử dụng Class và đối tượng trong phát triển phần mềm. Những ưu điểm nổi bật nhất được liệt kê như sau:

  • Duy trì code bằng việc mô hình hóa
  • Đóng gói những sự phức tạp trong mã lênh từ người dùng
  • Khả năng sử dụng lại
  • Cung cấp đơn kế thừa để thực thi nhiều phương thức.

Hàm tạo (Constructors) và hàm hủy (Destructors) trong C#

Constructors

Constructors là những hàm đặc biệt cho phép thực thi, điều khiển chương trình ngay khi khởi tạo đôi tượng. Trong C#, Constructors có tên giống như tên của Class và không trả lại giá trị.

Ví dụ

class Library

{

private int ibooktypes;

//Constructor

public Library()

{

ibooktypes = 7;

}

public Library(int value)

{

ibooktypes = value;

}

}

Destructors

Là một hàm đặc biệt được sử dụng để làm sạch bộ nhớ. Cách khai báo giống như Constructor nhưng không có tham số và được bắt đầu bằng dấu “~”.

Ví dụ

class Library

{

private int ibooktypes;

//Constructor

public Library()

{

ibooktypes = 7;

}

public Library(int value)

{

ibooktypes = value;

}

~ Library()

{

//thực thi câu lệnh

}

}

Phần 2: Function Overloading

Method Overloading xuất hiện khi trong một class có từ hai hàm có cùng tên. Có hai kiểu Method Overloading:

  • Function Overloading dựa trên số lượng tham số truyền vào
  • Function Overloading dựa trên kiểu giá trị tham số truyền vào.

Ví dụ

class Library

{

// Function Overloading

public void insertbooks(int id)

{

//

}

public void insertbooks(int id, int type)

{

//

}

public void insertbooks(string id, int type)

{

//

}

}

Ba hàm insertbooks ở trên là một ví dụ về function overloading trong lập trình C#. Trong khi hàm thứ nhất và thứ 2 là overloading theo số lượng tham số, và hàm thứ 3 với hàm thứ 2 là overloading theo kiểu tham số truyền vào.

Phần 3 : Thừa kế
Một trong những ưu điểm nổi bật của lập trình hướng đối tượng đó là thừa kế, đó là sự sử dụng lại những thuộc tính và hành vi của một lớp. Có hai kiểu kế thừa trong lập trình, đơn kế thừa và đa kế thừa.

Một trong những ưu điểm nổi bật của lập trình hướng đối tượng đó là thừa kế, đó là sự sử dụng lại những thuộc tính và hành vi của một lớp. Có hai kiểu kế thừa trong lập trình, đơn kế thừa và đa kế thừa.

C# cung cấp mô hình đơn kế thừa.

Ví dụ về kế thừa trong C#.

/* Ví dụ về thừa kế trong lậ trình C# */

using System;

using System.Collections.Generic;

using System.Text;

namespace __OOP_Inheritance

{

class Program

{

static void Main(string[] args)

{

Dog objDog = new Dog(4);

objDog.displayProperties();

Chicken objChicken = new Chicken(2);

objChicken.displayProperties();

Console.Read();

}

}

class Animal

{

protected int ifoots;

protected string sName;

protected void setFoot(int ival)

{

ifoots = ival;

}

protected void setName(string sVal)

{

sName = sVal;

}

public void displayProperties()

{

Console.WriteLine(sName + " have " + ifoots.ToString()+ " foots");

}

}

class Dog : Animal

{

public Dog(int ival)

{

setName("Dog");

ifoots = ival;

}

}

class Chicken : Animal

{

public Chicken(int ival)

{

setName("Chicken");

setFoot(ival);

}

}

}

Ở ví dụ trên, Dog và Chicken là hai lớp kế thừa từ lớp Animal, do đó các thuộc tính như số chân, ifoots và tên sName đương nhiên xuất hiện trong hai lớp này và cho phép sử dụng. Tương tự, các hàm như setName(), setFoot(), displayProperties() tại lớp Animal cũng được kế thừa xuống hai lớp Dog và Chicken. Do đó ta có thể gọi những hàm này, và kết quả hiển thị khi gọi hàm displayProperties() theo đối tượng objDog và objChicken là khác nhau.

phần 4 : tính đa hình - Polymorphism
Tính đa hình hay polymorphism là một trong những nét tạo nên đặc điểm nổi bật của OOP, bài viết này là một ví dụ về tính đa hình rõ nhất trong lập trình OOP với C#

Xét ví dụ sau đây: using System;

using System.Collections.Generic;

using System.Text;

namespace __OOP_polymorphism

{

class Program

{

static void Main(string[] args)

{

Child objchild = new Child();

Console.WriteLine("Result is " + objchild.methodA().ToString());

Console.Read();

}

}

class Parent

{

public int methodA()

{

return methodB() * methodC();

}

public virtual int methodB()

{

return 1;

}

public int methodC()

{

return 2;

}

}

class Child : Parent

{

public override int methodB()

{

return 3;

}

}

}

Kết quả chạy trương trình

6

Như bình thường của mô hình kế thừa, kết quả trả về khi gọi hàm methodA() từ đối tượng của lớp Child phải là “Result is 2”. Nhưng trong kết quả trên, kết quả là “Result is 6”. Kết quả này do hàm methodB() tại lớp Child đã override hàm methodB() tại lớp Parent.

Vậy ta có thể khái quá Polymorphism như sau:

  • Polymorphism không chỉ đơn giản là overriding, mà nó là overrding thông minh.
  • Khác biệt giữ Overriding và Polymorphism đó là trong Polymorphism, sự quyết định gọi hàm được thực hiện khi chương trình chạy.

Lập trình C

Bài 1 Lệnh khai báo thư viện vd : #include Thư viện stdio.h là thư viện chuẩn trong C các bạn có thể biết thêm 1 số thư viện khác như thư viện dùng đẻ xử lý chuỗi ký tự thư viện dùng để cấp phát bộ nhớ cái nì quên rồi ai biết thì trích dùm tôi, lâu rồi nên quên nhưng tôi nhớ là khai báo thư viện này thì sử dụng được lệnh clrscr(); Khai báo hàm : * Có 2 kiểu khai báo hàm : void main() <=== hàm không trả về giá trị vd: #include void main() { printf("Test test test"); } kiểu khai báo thứ 2 : int main() <=== hàm trả về giá trị kiểu int vd: #include int main { int a; printf("\n Nhap gia tri"); scanf("%d",&a); return(a); } Tiếp theo ta học đến phần kiểu dự liệu cơ bản: * int Kích thước :16 bit Khoảng giá trị : -32768->32767 * float Kích thước : 32 bit Khoảng giá trị :6 ký số, ví dụ như 6,55555 * char Kích thước : 8bit Khoảng giá trị : -128 ->127 Chương tiếp ???? Biến và Hằng. Biến: trong C biến là một vùng nhớ có tên dùng để lưu trữ các giá trị khi tính toán, các giá trị của biến có thể thay đổi trong suốt thời gian chương trình thực thi. các thuộc tính của biến gồm có kiểu dữ lệu của biến (type), TênBiến (name),và Miền giá trị (Domain).Các kiểu dữ liệu của biến và miền giá trị đã được giới thiệu ở trên. để khai báo một biến ta thực hiện cú pháp sau:
Code:
          type name[=giá trị khởi tạo];
[=giá trị khởi tạo] có thể có hoặc không. ví dụ:
Code:
          int a;
       long b=10;
Ta có thể khai báo nhiều biến có cùng kiểu dữ liệu trên cùng một dòng. ví dụ:
Code:
        int a,b=10,c,d;
Hằng: là một vùng nhớ có tên giống như biến, tuy nhiên giá trị của hằng là không thay đổi suốt chương trình. Để khai báo một hằng ta dùng từ khóa const với cú pháp như sau:
Code:
 const type name=giátrị;
Lưu ý: giá trị của hằng phải xác định trong câu khai báo hằng. ví dụ:
Code:
const float pi=3.14;
Chương tiếp theo Các phép tóan trong C Phép gán = Phép tóan này dùng để gán một giá trị cho một biến với cú pháp sau:
Code:
     dest=source;
với dest phải là một biến. source là biến hay là một hằng số bất kỳ. ví dụ:
Code:
      int a,b=10;
   const int c=12;
   a=b; //ok a=10.
   a=11;//ok a=11.
  11=a;//false 11 không phải là biến.
  c=12;// false c là một hằng số không thể thay đổi được.
Các phép tóan đại số: Phép tóan cộng + ví dụ:
Code:
    int a=0,b=1,c=2;
 a=12+1;   //lấy 12+1=13 rồi gán cho a, kết quả(kq) a=13.
 a=b+c;    //lấy biến giá trị b cộng giá tri c tức 1+2 rồi gán cho a, kq a=3.
 a=c+10;  //lấy biến c cộng 10 rồi gán cho a, kq a=12.
 a=a+10;  //lấy biến a cộng 10 rồi gán cho a,kq a=12+10=22.
 a=a+a;   //lấy biến a cộng cho a rồi gán cho a,kq=22+22=44.
Chương trình sau cho phép bạn nhập vào 2 số và in kết quả phép tính cộng hai số ra màn hình.
Code:
#include
#include
 int main()
 {
    float a,b,c;
     printf("Chuong trinh tinh tong hai so\n")
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%f",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%f",&b);
     c=a+b;
     printf("\nKet Qua của phep cong: %f+%f=%f",a,b,c);
     return 0;
 }
Phép toán nhân *
Code:
    inta,b;
 a=2*20; //lấy 2 nhân với 20 rồi gán vào cho a, kết quả (kq) a=40.
 b=a*2;  //lấy a=40 nhân với 2 rồi gán vào b, kq b=80.
 a=a*a; // lấy a=40 nhân với a=40 rồi gán lại cho a, kq a=1600
Chương trình sau cho phép bạn nhập hai số sau đó in ra kết quả tích của hai số đó.
Code:
#include
#include
 int main()
 {
    float a,b,c;
     printf("Chuong trinh tinh tich hai so\n")
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%f",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%f",&b);
     c=a*b;
     printf("\nKet Qua của phep nhan: %f*%f=%f",a,b,c);
     return 0;
 }
[b]Phép toán chia /[b] Phép chia số nguyên: kết quả của phép toán là lấy phần nguyên của phép toán. Ví dụ: 5/2 ta được 2 dư 1. Kết quả(kq) ta được 2. Chú ý: Phép toán này chỉ thực được hiện trên tập số nguyên. Vậy: Nếu ta có n=a*b+c thì phép toán chia nguyên của n/b=a và n/a=b. Chương trình sau sẽ cho phép nhập vào hai số sau đó lấy phần nguyên của kết quả phép chia.
Code:
#include
#include
 int main()
 {
    int a,b,c;
     printf("Chuong trinh tinh tong hai so\n");
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%d",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%d",&b);
     c=a/b;
     printf("\nKet Qua của phép chia nguyên: %d-%d=%d",a,b,c);
     return 0;
 }
Phép toán chia đối với số thực Phép toán này có kết quả như ta chia một số thực bình thường kết quả sẽ là một số thực như 5/2=2.5.
Code:
#include
#include
 int main()
 {
    float a,b,c;
     printf("Chuong trinh tinh tong hai so\n");
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%f",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%f",&b);
     c=a/b;
     printf("\nKet Qua của phep chia so thuc: %f / %f=%f",a,b,c);
     return 0;
 }
Phép toán lấy phần dư của phép chia số nguyên % (phép toán mode) Như tôi đã nói như trên nếu n=a*b+c. ta có n/a=b và n/b=a là phép toán chia nguyên còn n%a=c hay n%b=c là phép toán lấy phần dư của phép chia nguyên. ví dụ ta có 5/2 được 2 dư 1 thì 5%2 sẽ được 1.
Code:
#include
#include
 int main()
 {
    int a,b,c;
     printf("Chuong trinh tinh tong hai so\n");
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%d",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%d",&b);
     c=a%b;
     printf("\nKet Qua của phép chia nguyên: %d %% %d=%d",a,b,c);
     return 0;
 }
Các phép toán luận lý Các phép toán luận lý có hai kết quả trả về là đúng hay sai, giá trị đúng là 1, giá trị sai là 0. Phép toán so sánh bằng == Phép so sánh hai biểu thức A và B ký hiệu A==B là một mệnh đề. Mệnh đề này có giá trị là đúng(bằng 1) nếu biểu thức A bằng biểu thức B, ngược lại mệnh đề này sẽ có giá trị false (bằng 0).
Code:
   int a,b;
a=1;
b=2;
b==a;//có giá trị là sai (0)
a==1;//có giá trị là đúng (1)
2==b;//có giá trị là đúng.
2==2;//có giá trị là đúng.
Ta có thể lấy giá trị của kết quả phép toán so sánh bằng cách gán giá trị trả về của phép so sánh vào một biến cụ thể.
Code:
     int a;
  a=(1==2);//Mệnh đề 1==2 là một mệnh đề sai,a sẽ được gán kết quả là a=0.
  a=(a==0);//mệnh đề a==0 là một mệnh đề đúng do đó kết quả a=1.
Chương trình cho phép bạn nhập vào 2 số và in ra giá trị đúng sai của biểu thức so sánh hai số.
Code:
#include
#include
 int main()
 {
    int a,b,c;
     printf("Chuong trinh tinh tong hai so\n");
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%d",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%d",&b);
     c=(b==a);
     printf("\nKet Qua cua phep so sanh: (%d == %d)=%d",a,b,c);
     return 0;
 }
Phép so sánh không bằng != Phép so sánh A!=B là một mệnh đề, mệnh đề này đúng(bằng 1) khi A khác B (hay A không bằng B) và có giá trị sai (bằng 0) khi A==B.
Code:
   int a,b;
a=1;
b=2;
1!=2; //Mệnh đề 1 khác 2 có giá trị đúng (1).
a!=b;//Mệnh đề a khác b có giá trị đúng.
2!=b;//Mệnh đề 2 khác b có giá trị sai (0).
Ta có thể lưu giá trị của phép so sánh không bằng vào biến.
Code:
    inta;
 a=(1!=2);//1 khác 2 là một mệnh đề đúng do đó biến a sẽ có giá trị 1.
 a=(1!=a);//1 khác a (a=1) là một mệnh đề sai do đó biến a sẽ có giá trị là 0.
Chương trình cho phép bạn nhập vào hai số, in ra giá trị đúng sai của phép toán so sách khác nhau giữa hai số.
Code:
#include
#include
 int main()
 {
    int a,b,c;
     printf("Chuong trinh tinh tong hai so\n");
     printf("Ban hay nhap vao so thu nhat :");
     scanf("%d",&a);
     printf("Ban hay nhap vao so thu hai :");
     scanf("%d",&b);
     c=(b!=a);
     printf("\nKet Qua cua phep so sanh: (%d != %d)=%d",a,b,c);
     return 0;
 }
Phép toán so sánh lớn hơn >, lớn hơn bằng >=, nhỏ hơn <>
Code:
   1>2;     //Mệnh đề(MĐ) có giá trị Sai.
1>=2;   //MĐ có giá trị Sai.
1<2;>
Phép toán Or || Cho A B là các mệnh đề mệnh phép toán A or B (A||B) có kết quả là một mệnh đề, và mệnh đề này chỉ sai khi và chỉ khi A và B cùng là hai mệnh đề sai. Ta có bảng chân trị sau:
Code:
     A \ B  0  1
    0    0  1
    1    1  1
ví dụ:
Code:
    (1<2)||(1==2); 1="=" 1="=" 1="=" 1="=" 1="=">
Phép toán and && Hai mệnh đề A và B, phép toán and hai mệnh đề A và B (A&&B) là một mệnh đề,mệnh đề này có giá trị là đúng khi và chỉ khi A và B là hai mệnh đề đúng. bảng chân trị
Code:
      A/B   0   1
    0    0   0
    1    0   1
ví dụ:
Code:
   int a;
a=(1==1)&&(0<1); 1="=" a="1;" a="(1">2)&&(1==1);// Do mệnh đề 1>2 là mệnh đề sai nên kết quả a=0;
Các cấu trúc điều khiển trong C Cấu trúc tuần tự: Gọi A B là hai đoạn mã trong C.
Code:
     A;
    B;
Thì theo cấu trúc tuần tự đoạn mã A sẽ được thực thi trước sau đó mới tới đoạn mã B. Ví dụ minh họa việc thực hiện tuần tự các câu lệnh trong C.
Code:
#include
     int main(){
          int i;
          printf("Ban nhap vao mot so nguyen");
          scanf("%d",&1);
          printf("So nguyen cua ban vua nhap co gia tri la %d",i);
          return 0;
     }
Thứ thực hiện câu lệnh tuần tự sẽ lệnh khai báo biến i --> lệnh printf nhắc nhap so nguyen -->lệnh scanf cho phep nhan bien i-->printf xuất số nguyên và cuối cùng là lệnh return 0. Cấu trúc lệnh rẻ nhánh Cấu trúc if , if else Cấu trúc if có dạng như sau:
Code:
  if(A)
{
          S1;
}
Với cấu trúc trên nhóm lệnh S1 chỉ được thực hiện khi và chỉ khi MệnhĐềA có đạt giá trị đúng.
Code:
#include
int main(){
    int a,abs;
    printf("Ban hay nhap vao mot so");
   scanf("%d",&a);
  asb=a;
   if(a<0)
   {
           abs=-1*a;
   }
   printf("|%d|=%d",a,asb);
return 0;
}
Với chương trình trên cho phép bạn nhập vào một số và tính trị tuỵêt đối của số vừa nhập. nếu bạn nhập vào a=2 là một số dương thì a<0 là một mệnh đề sai câu lệnh asb=-1*a sẽ không được thực hiện lúc này asb sẽ bằng a=2. khi bạn nhập a=-2 lúc này mệnh đề a<0 là đúng câu lệnh abs=-1*a sẽ đựơc thực hịên và abs sẽ bằng 2. Các điều lưu ý nếu mệnh đề A không phải là một mệnh đề mà là một giá trị nào đó ví dụ if(2) hay if(2-2) thì các câu lệnh trong if chỉ được thực hiện khi giá trị tính toán trong ngọăc khác không. do đó ở đây các bạn sẽ gặp một lỗi rất phiền tóai là mệnh đề A là một câu so sánh mà bạn lại viết sai như sau: Thay vì bạn viết a==b bạn lại viết a=b bạn sẽ gặp rắc rối như sau:
Code:
  inta,b;
 a=1;
 b=2;
 if(a=b)
{
    printf("a va b bang nhau vi:%d=%d",a,b);
}
ở đây bạn thấy ý muốn của tôi là so sánh a có bằng b không nếu bằng xuất ra câu trong if. Nếu đúng theo suy nghĩ thì câu xuất ra sẽ không được xuất tuy nhiên, tôi lại viết sai là a=b tức gán a bằng b câu kết thúc câu lệnh này a=2 và là một số khác không nên câu lệnh trong if vẫn được thực hiện.
Cấu trúc if else Cú pháp của cấu trúc này như sau:
Code:
   if(A)
   {
        S1;
   }
   else
  {
        S2;
   }
Thứ tự thực hiện của cấu trúc này như sau: Nếu mệnh đề A là một mềnh đề đúng hay giá trị của A là khác 0(Nếu A không phải là mệnh đề) thì nhóm lệnh S1 được thực hiện ngược lại thì lệnh S2 sẽ được thực hiện. Chương trình Giải Phương trình dạng Ax+B=0;
Code:
#include
int main()
{
  float  A,B;
  printf("Ban nhap vao theo yeu cau sau:\n");
  printf("Nhap vao he so A=");
  scanf("%f",&A);
  printf("Nhap vao he so B=");
  scanf("%f",&B);
  if(A==0) //Nếu bạn nhập A bằng 0 thì khối lệnh trong if được thực hiện.
  {
        if(B==0)// trường hợp này A==0 và B==0 pt có vô số nghiệm
        {
            
             printf("Phương trình trên có vô số nghiệm");
        }
        else //trường hợp này A==0 và B!=0 pt sẽ vô nghiệm
       {
            printf("Phuong trinh trên vô nghiệm");
       }
  }
  else //trường hợp này A!=0 nghịêm pt là -B/A
  {
      printf("phuong trinh tren co nghiem x=%f",-B/A);
  }

  return 0;
}
Cấu trúc switch : Dạng :
Code:
switch(biến/biểu thức) {
case  : Lệnh 1;
                      break;
case  : Lệnh 2;
                        break;
......
case  : lệnh n;
                        break;
[default] :lệnh(n+1);
}
cấu trúc này nhằm kiểm tra biến/biểu thức nếu thuộc 1 trong các trường hợp có giá trị i thì thực hiênh lệnh i. Nếu không thì mặc định sẽ thực hiện lệnh (n+1).
Vòng lặp. Cấu trúc lặp với while
Code:
    while(A)
   {
           S;
   }
Cấu trúc while sẽ làm việc như sau: Trong khi Mệnh đề A còn đúng hay giá trị A khác 0(nếu A không phải mệnh đề) thì câu lệnh S sẽ được thực hiện. Câu lệnh S sẽ được thực hiện lặp đi lặp lại đến khi A sai hay khác 0. Đọan mã tính giai thừa của một số.
Code:
 #include

   int main()
  {
     long i=1,kq=1,n;
     printf("Ban muon tinh giai thua cua so nao ? n=");
     scanf("%d",&n);
     while(i<=n)
      {
        kq=kq*i;
        i++;
      }
    printf("ket qua %d!=%d",n,kq);
    return 0;
  }
do ............while()
Code:
   do
  {
     S;
  }while(A)
cấu trúc này tương tự như cấu trúc sau;
Code:
     S;
    while(A)
   {
      S;
   }
Tức lệnh S sẽ được thực hiện sau đó nếu Mệnh đề A là một mệnh đề đúng hay là một giá trị khác 0 thì lệnh S tiếp tục thực hiện. Và chỉ thóat khỏi vòng while khi A là mệnh đề sai hay có giá trị là 0.
Cấu trúc lặp với for() Vòng lặp for có dạnh như sau:
Code:
 for(X,Y,Z)
{
       S;
}
Vòng lặp này rất khó giải thích tuy nhiên thông thường chúng được thực hiện với ý nghĩa như sau:
Code:
int i;
 for(i=1;i<10;i=i+1)
 {
       S;
 }
thao tác thực hịên: Đầu tiên X được thực hịên sau đó nếu Y là một mệnh đề đúng hay có giá trị khác 0 thì S sẽ được thực hiện sau đó Z sẽ được thực hiện. Và S sẽ được thực hịên đến khi Y sai hay Y có giá trị 0. Nếu như vậy tại sao tôi lại nói là khó giải thích vì for có thể có những trường hợp sau:
Code:
   for(X;Y;)
  for(X;;)
  for(;;)
tức thiếu 1 trong X,Y,Z, hay thiếu hết(nhưng phải có đủ 2 dấu 2 chấm) thì vẫn không bị coi là lỗi cú pháp. Ví dụ
Code:
#include

int main()
{
 for(;;)
 {
   break;

 }
 return 0;
}
tuy nhiên việc này là vô nghĩa ta không nên sử dụng theo kiểu này. Ví dụ trương trình tính giai thừa của một số nguyên:
Code:
#include
int main()
{
   unsigned int n, i;
   unsigned long kq=1;

   printf("Ban nhap vao so nguyen duong");
   scanf("%d",&n);
   if (n<0 )
        return 1;
   for(i=1;i<=n;i++)
   {
       kq=kq*i;
   }
  
   printf("ket qua %d!= %d",n,kq);
   return 0;
}
Câu lệnh break Các bạn đã thấy tác dụng của break trong phần cấu trúc switch, ngòai ra break còn có tác dụng là thóat khỏi vòng lặp ngay lập tức. ví dụ đọan code sau cho phép bạn nhập một dãy các ký tự kết thúc là phím enter.
Code:
  char ch;
  while(1)
 {
      ch=getchar();
      if(ch==13) break;
 }
Bạn thấy đó while(1){,,,,,,} là một vòng lặp không ngừng tuy nhiên ta có thể cho nó ngừng bằng lệnh beak; Biến Trỏ Định nghĩa: Biến trỏ là một biến dùng để chứa địa chỉ của biến khác. Để khai báo một biến trỏ ta có cú pháp sau:
Code:
KDL *TênBiến;
ví dụ:
Code:
int *x;
Ta nói x là một biến trỏ chứa địa chỉ của một biến có kiểu DKL là int (hay trỏ tới một biến có kiểu dữ liệu int). Do biến trỏ chỉ chứa địa chỉ của biến khác nên độ lớn của nó thường là 2 byte bất kể nó chứa địa chỉ của biến có kiểu dữ liệu nào.
Code:
   int *a;
  double *b;
  if(sizeof(a)==sizeof(b))
 {
          printf("hai bien nay co kich thuong bang nhau");
 }
Để sử dụng biến trỏ này ta phải trỏ nó tới một biến, bằng cách gán địa chỉ của biến cần trỏ tới vào biến trỏ với tóan tử lấy địa chỉ &
Code:
TênBiếnTrỏ=&TênBiếnThường;
Ví dụ:
Code:
int *ptr;
int a=1;
ptr=&a;
Ta có thể thay đổi để biến trỏ đang trỏ tới biến này sang trỏ tới một biến khác.
Code:
int *ptr;
int a=1,b=2;
ptr=&a;
//..............
ptr=&b;
ta có thể vừa khai báo vừa trỏ tới một biến khác
Code:
int a;
int *ptr=&a;
Cách sử dụng biến trỏ: để biết cách làm việc của biến trỏ ta lưu ý một số phép toán như sau: & phép toán này đặt trước một biến thường dùng để lấy địa chỉ của biến. * phép toán này được đặt trước biến trỏ dùng để lấy nội dung của biến mà biến trỏ trỏ tới. ví dụ:
Code:
int a=2,*b=&a;
printf("Noi dung cua bien a la :%d",*b);
ví dụ trên tôi đã dùng biến trỏ b trỏ đến biến a và thông qua tóan tử * tôi truy cập được nội dung của biến a. Ngòai ra ta còn có thể thông qua tóan tử * để sửa đổi nội dung của biến mà con trỏ đang trỏ tới.
Code:
int a=2,*ptr=&a;
*ptr=3;
printf("Noi dung cua bi thay doi bang:%d",a);
ví dụ trên ta sẽ nhận được a=3; do ta đã dùng * thông qua ptr truy cập và sử đổi nội dung của biến a. Đến đây các bạn vẫn chưa thấy hết tinh hoa của con trỏ phần tiếp theo tôi sẽ mở rộng vấn đề con trỏ thêm. Có rất nhiều người nói nếu bạn là một lập trình viên C mà không nắm hết con trỏ tức là bạn chưa biết gì về C. Hẹn gặp lại.
Mối tương quan giữa biến trỏ và mảng Khi ta khai báo một mảng thì tên mảng chính là tên biến trỏ và biến trỏ này luôn trỏ đến vị trí ô nhớ đầu tiên của mảng. Và biến trỏ này là biến trỏ hằng tức nó luôn trỏ tới vị trí đầu tiên của mảng, ta không thể thay đổi cho biến trỏ này trỏ đến biến khác.
Code:
int a[5]={1,2,3,4,5};
printf("giá trị a[0] là: %d",*a);
Ta có thể dùng biến trỏ để trỏ đến bất cứ phần từ nào trong mảng
Code:
int*ptr;
ptr=a;
printf("gia tri a[0] là:%d",*ptr);
tại sao tôi không dùng ptr=&a; như tôi đã đề cập ở trên a là một hằng con trỏ luôn chứa địa chỉ của biến a[0], do để ptr trỏ đến phần tử đầu tiên của mảng ta chỉ cần gán ptr=a;tức ptr=&a[0], nếu bạn thích thì bạn cũng co thể viết lại là ptr=&a[0]. Và từ đây ptr có thể thao tác tương tự như là một mảng để lấy giá trị của phần tử thứ i trong a thông qua ptr ta chỉ vịêc viết ptr[i].
Code:
int a[5]={1,2,3,4,5}
int *ptr=a;
for(int i=0;i<5;i++)
   printf("%d",ptr[i]);
Cộng biến trỏ với một số nguyên Khi ta cộng biến trỏ tới một số nguyên tức ta đã thay đổi cho biến trỏ tham chiếu tới một biến khác. Còn biến trỏ này trỏ tới đâu ta có công thức tính như sau: Đầu tiên ta khai báo một biến trỏ sau đó cho nó trỏ tới một biến.
Code:
KDL *ptr, x; //KDL :kiểu dữ liệu
ptr=&x;
khi ta thực hiện phép toán cộng ptr với một biến nguyên i tức
Code:
ptr=ptr+i
thì lúc này ptr sẽ tham chiếu tới vùng nhớ có địa chỉ là ptr+sizeof(KDL)*i; Vùng nhớ này nếu ta không biết nó là gì thì không nên thay đổi giá trị của nó rất nguy hiển cho chương trình. Ví dụ:
Code:
#include

int main()
{
 int *ptr,a;
 ptr=&a;
 printf("ptr hien tai dang chi toi dia chi la %d",ptr);
 printf("\nDo lon cua kieu du lieu la %d byte",sizeof(a));
 ptr=ptr + 2;
 printf("\nSau khi cong 2 vao thi ptr chi toi dia chi la %d",ptr);

 
  return 0;

}
Như tôi đã nói ở trên khi ta làm thay đổi giá trị của một biến trỏ đến bằng phép toán cộng tức ta đã cho biến trỏ tham chiếu tới một vùng nhớ mới ta sẽ gặp nguy hiểm nếu không xác định được biến trỏ đang trỏ tới đâu vậy câu hỏi đặt ra là phép toán cộng cho biến trỏ sẽ giúp được gì cho chúng ta? Thông thường phép toán này làm việc với một biến trỏ, trỏ đến mảng sẽ có hiệu lực rất hay. Ví dụ khi ta khai báo một mảng a 7 phần tử và một biến trỏ , chỉ đến ô nhớ đầu của a như sau:
Code:
int a[7], *ptr=a;
for(int i=0;i<7;i++)
   a[i]=i;
giả sử biến int có giá trị là 2 byte(mỗi trình biên dịch sẽ có độ lớn của kiêu int khác nhau) và lúc này địa chỉ của a[0] là 8 thì ptr sẽ là 8 và ta nếu ta có phép toán :
Code:
ptr=ptr+1;
tức ptr sẽ trỏ đến địa chỉ ptr+sizeof(int)*1 tức ptr=10 đây chính là điạ chỉ của a[1]. xét ví dụ sau thông qua biến trỏ ptr để khởi gán các giá trị cho mảng a;
Code:
#include

int main()
{
   int a[7], *ptr=a,i;
   printf("mang a ban dau co gia tri la:");
   for(i=0;i<7;i++)
   {
         printf("%d ",a[i]);
    }
 
   for(i=0;i<7;i++)
   {
       *ptr=i;
         ptr++;
   }
   printf("\nNoi dung cua mang a sau khi khoi tao  la");
   for(i=0;i<7;i++)
   {
         printf("%d ",a[i]);
    }
 return 0;
}
Điều chú ý giữa biến trỏ và mảng khi ta khai báo một mảng
Code:
int a[9];
Code:
thì câu lệnh: a[i]=i[a] với i là một số nguyên.
Chứng minh :
giả sử a[i]=i[a] (1)
do trình biên dịch hiểu a[k]=*(a+k)
do đó (1) <==> *(a+i)=*(i+a) Đẳng thức đúng./
Do đó ta có ví dụ chương trình sau:
Code:
#include
int main()
{
 int a[10],i;
 for(i=0;i<10;i++)
     i[a]=i;

 printf("Noi dung cua mang a la :");
 for(i=0;i<10;i++)
     printf("  %d", a[i]);

return 0;
}