• Thế Giới Giải Mã

    Bí ẩn nhân loại Leonardo Da Vinci

  • Thế Giới Giải Mã

    Anh hùng thầm lặng Nikola Tesla

  • Thế Giới Giải Mã

    Thần đèn Thomas Edison

  • Thế Giới Giải Mã

    Người thôi miên Adolf Hitler

Showing posts with label C. Show all posts
Showing posts with label C. Show all posts

19 July 2016

#define trong lập trình c là gì

Đây là từ khóa tiền xử lý, dùng để định nghĩa tên một hằng hoặc kiểu gì đó…. nó giúp code "nhanh gọn" hơn nhưng những beginner cũng đừng quá lạm dụng !

Có lẽ đã quen kiểu “#define PI 3.14…..” hoặc #define một giá trị nào đấy.
#define FOR(i,a,b) for (int i = a; i < b; i++)
Đây là một vòng lặp for và bạn có thể sử dụng nó đơn giản về sau bằng cú pháp: FOR(i,3,5); (chạy từ 3 -> 5) ….. hoặc FOR(i, 1, 100); (chạy từ 1->100)
#define for(i,n) for(int i=0;i<n; i++)
chạy từ 0 đến bé hơn n. dùng for(i, 5); tức sẽ cho chạy từ 0 đến <5. thay vì cứ phải code lại dài dòng, như vậy ngắn hơn phải không?
#define R1 return 1
thậm chí define cho cả giá trị trả về luôn.
#define CL(a,x) memset(x, a, sizeof(x));
nhìn hàm memset chắc cũng biết rồi nhỉ. (cần có thư viện string).
#define filein freopen("in.txt","r",stdin)
Có thể dùng cho cả thao tác mở file.(tất nhiên là đóng cũng được).
#define pr(x) printf("Case %d: ",x) in một số nguyên x bằng cú pháp pr(x);
#define sc(n) scanf("%d",&n) nhập một số nguyên n bằng cú pháp sc(n);
#define C1(x) cin >> x // gõ C1(x); có vẻ nhanh hơn cin >> x;
#define C2(x, y) cin >> x >> y // tương tự nhưng nhập 2 số
#define C3(x, y, z) cin >> x >> y >> z // nhập 3 số
nhập xuất thông thường..
#define pb push_back
push_back cũng ngắn hơn nhiều rồi.(cần có thư viện vector)
#define max(a, b) ((a) > (b) ? (a) : (b))
tìm max 2 số a và b bằng cú pháp max(a, b);
Và còn nhiều nữa……………….Nhưng để tìm max cho bất kỳ kiểu nào (int, float, double..) thì sao?
Bạn có nhớ template là gì? là một từ khóa của C++ đặc trưng cho việc tổng quát hóa việc xử lý với các kiểu dữ liệu khác nhau.
template <class T> inline T max(T a, T b){ return a > b ? a : b;}
tìm max 2 số a và b thì chỉ cần dùng cú pháp max(a, b); là xong
template<class T>T sq(T a){ return (a*a); }
// tính a^2 bằng cú pháp sq(a);
template<class T>T gcd(T a,T b){ return (b==0) ? a : gcd(b,a%b); }
// ước số chung lớn nhất của 2 số a, b bằng cú pháp gcd(a, b);
template<class T>T lcm(T a,T b){ return (a/gcd(a,b))*b; }
// ……….nhỏ nhất
template<class T>T Pow(T n,T p) { T res=n; for(T i=1;i<p; i++){ res *= n; } return res; }
// chỉ là một hàm Pow thôi.
template<class T>bool isPrime(T n){ for(T i=2; i*i<=n; i++){ if(n%i==0) return false; } return true; }
// kiểm tra số nguyên tố.
…………….. còn rất nhiều nữa và bạn có thể tự nghĩ ra. tham khảo thêm typedef
có thể một số không cần thiết lắm nhưng mục đích của bài này là giới thiệu cho bạn biết những “khả năng” của #define và template có thể làm được mà bạn chưa biết.

Từ khóa #define tiền xử lý, dùng để định nghĩa tên một hằng hoặc kiểu trong C

Ví dụ về #define FOR(i,a,b) for(int i = a; i < b; i++)
Java 2016
#include<conio.h>
#include<stdio.h>
#include<string.h>

#define FOR(i,a,b)  for(int i = a; i < b; i++)

float a[5][5] = //supervisor performance rating
{
 {0.013, 0.015, 0.017, 0.019, 0.021},
 {0.015, 0.017, 0.019, 0.021, 0.023},
 {0.017, 0.019, 0.021, 0.023, 0.027},
 {0.019, 0.021, 0.023, 0.025, 0.030},
 {0.021, 0.023, 0.025, 0.027, 0.040}
};
float PeerSalary[5] = {250,300,350,400,450};
typedef struct Employee
{
 int ID;
 char Name[30];
 int Peer;//peer performance rating
 int Sup;
 //float Salary = PeerSalary[Peer];
 
}Emp;
void OldAndNewSalary(Emp E[], int n){
 int count = 1;
 FOR(i,0,n)
 {
  printf("Employee %d : Old Salary : %.2f\n", count, PeerSalary[E[i].Peer]);
  float newSalary = PeerSalary[E[i].Peer] + PeerSalary[E[i].Peer]*a[E[i].Peer][E[i].Sup];
  printf("Employee %d : New Salary : %.2f\n", count, newSalary);
  count++;
 }
}

void in_it(Emp E[], int n)
{ 
 FOR(i,0,n)
 {
  printf("ID : \n"); scanf("%d", &E[i].ID);
  printf("Name : \n"); scanf("%s", &E[i].Name);
  printf("Peer performance rating (1-5) : \n"); scanf("%d", &E[i].Peer);
  printf("Supervisor performance rating (1-5) : \n"); scanf("%d", &E[i].Sup);
 } 
}

void inforEmp(Emp E[],int n)
{ FOR(i,0,n)
 {
  printf("ID : %d\n", E[i].ID); 
  printf("Name : %s\n", E[i].Name); 
  printf("Peer performance rating : %d\n", E[i].Peer);
  printf("Supervisor performance rating : %d\n", E[i].Sup);
 }
}

int meNu(int n)
{ printf("Chon chuc nang = ");
 scanf("%d", &n);
 if( n >= 1) return 1;
 else return 0;
}
int n;
int main()
{ 
 printf("Enter number Employee in Company : ");
 scanf("%d", &n);
 Emp E[10];
 while(true){
 int chose = meNu(n);
 switch(chose){
 case 1 : printf("Create table employee : \n");
   FOR(i,0,n)
   {
    in_it(E,n);
    inforEmp(E,n);
    OldAndNewSalary(E, n);
   } 
 case 0 : return 0;
 //default: printf("enter again");
  }
 }
 getch();
 return 0;
}
Hình ảnh code trên tool DEV C++

18 July 2016

khai báo tiền xử lý #define cho for trong lập trình C - #define for loop average

#define định nghĩa tên một hằng FOR trong lập trình C
C 2016
#include <conio.h> 
#include <stdio.h>
//#define la khai bao Hang ket thuc khong co dau ;
#define FOR(i, a, b) for (int i = a; i < b; i++)

int a[20];
int n;
double AVG(int n) {
  double sum = 0;
  FOR(i, 0, n) {
    printf(" Enter element A[%d] = ", i);
    scanf("%d", & a[i]);
  }
  FOR(i, 0, n) sum += a[i];
  return sum / n;
}

int main() {
  printf("Enter n = ", n);
  scanf("%d", & n);
  printf("AVG of array : %.4f\n", AVG(n));
  getch();
  return 0;
}
Cách trình bày thứ 2 - không có khai báo hằng #define
C 2016
#include <conio.h>
#include <stdio.h>

int a[20]; //Khai bao mang array kich thuoc 20
int n; //khai bao kieu int integer so nguyen
double AVG(int n) {
  double sum = 0; //Khai bao kieu double
  for (int i = 0; i < n; i++) {
    printf(" Enter element A[%d] = ", i);
    scanf("%d", & a[i]); //Nhap vao mang 'array' n lan so kieu int
  }
  for (int i = 0; i < n; i++) {
    sum += a[i]; //sum = sum+ a[i] cong vao bien sum
  }
  return sum / n; //ham AVG kieu double nen co return va tra gia tri sum/n
}

int main() {
  //Nhap tu ban phim so lan lap
  printf("Enter n = ", n);
  scanf("%d", & n);
  //In ra man hinh sau khi goi ham AVG(dua n vao ham) va nhan duoc ket qua sum/n
  printf("AVG of array : %.4f\n", AVG(n));
  getch(); //Co tac dung dung man hinh
  return 0;
}

17 July 2016

Con trỏ trong lập trình C - Hàm đổi chỗ dùng con trỏ trong lập trình C

Hàm đổi chỗ dùng con trỏ trong lập trình C
C 2016
#include<stdio.h>

//viet mot ham de trao doi hai gia tri va chuyen vao 2 so kieu int
void swap(int *num1, int *num2) {
   int temp; //khai bao bien luu tru
   temp = *num1;
   *num1 = *num2;
   *num2 = temp;
}
 
int main() {
   int num1, num2;  //Khai bao bien kieu int

   //Nhap vao so num1 va num2
   printf("Nhap so thu nhat: ");
   scanf("%d", &num1);
   printf("Nhap so thu hai: ");
   scanf("%d", &num2);
 
   swap(&num1, &num2); //goi ham doi cho

   //In ra man hinh   
   printf("\nSau khi doi cho:");
   printf("\nSo thu nhat: %d", num1);
   printf("\nSo thu hai: %d", num2);
 
   return (0);
}
Chú ý: Chương trình sẽ chạy từ trên xuống dưới swap chạy trước nên
phần In ra màn hình sẽ lấy giá trị của swap khi đã đổi chỗ 
Xem thêm bài sắp xếp tăng dần giảm dần bấm vào đây

15 July 2016

Create an array of 10,000 random interger number elements (array A) Tạo Radom Array Integer trong C

Create an array of 10,000 random interger number elements (array A)
=========================================================================
27212   23947   7446    19659   1052    5771    21256   11110   32057   10666
26250   12670   13145   3925    31148   5874    25774   7043    9429    5536
6763    20016   21858   23934   7301    2061    32655   3815    21174   30582
10139   12082   14024   20900   1575    19337   15376   11300   19424   15864
20537   2695    18525   18629   22851   29788   30794   31744   21706   10075

Tạo Radom với mảng Integer trong C
C 2016
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
int main()
{
 int i;
 int arraysize = 100; //cho chay 100 vong test!
 int numbers[arraysize]; //Khai bao mang kich thuoc 100
 srand(time(NULL));
 //Gan moi so Random vao mang thu i
 for(i=0; i<arraysize ; i++){
  numbers[i] = rand()%10000;
 }
 //In ra man hinh mang vua Random
 for (i=0;i< arraysize;i++)
 {
  printf("%d \t",numbers[i]);
 }
 return 0;
}

14 July 2016

Nhập số nguyên in ra số trung bình trong lập trình C

Example: Viết một chương trình cho phép user nhập vào tới 20 số nguyên (integers). In ra kết quả gồm số trung bình của các số nhập vào và số lượng số có giá trị nhỏ hơn giá trị trung bình này. Yêu cầu: dùng mảng các số nguyên để xử lý kết quả.
Nhập số nguyên in ra số trung bình và các số nhỏ hơn giá trị trung bình
C
#include < stdio.h >
  int main() {
    int n, num[20], i;
    float sum = 0.0, average;
    printf("Nhap n so phan tu: ");
    scanf("%d", & n);
    while (n > 20 || n <= 0) {
      printf("Error! Vui long nhap n trong khoang (1 to 20).\n");
      printf("Nhap lai n so phan tu:: ");
      scanf("%d", & n);
    }
    for (i = 0; i < n; ++i) {
      printf("%d. Enter number: ", i + 1);
      scanf("%d", & num[i]);
      sum += ((float) num[i]); //Ep kieu tu int sang float
    }

    average = sum / n;
    printf("\nAverage = %.2f \n", average);

    for (i = 0; i < n; i++) {
      if (((float) num[i]) < average) {
        printf("\nSo nho hon Average la: %f ", ((float) num[i]));
      }
    }
    return 0;
}

01 July 2016

Hàm sắp xếp mảng tăng dần trong lập trình C "Thuật toán nổi bọt"


Run demo: bấm vào đây

Hàm sắp xếp mảng tăng giảm dần trong lập trình C
C 2016
#include <stdio.h>
int a[100];  //Khai báo mảng array kích thước 100
int main() //Hàm thân chạy chương trình bắt buộc có
{
     int i,j,n,k;  //Khai báo biến kiểu int
     printf("Nhap so mang cua phan tu: "); //Hiển thị màn hình
     scanf("%d", &n);  //Nhập vào số lần lặp
     for (i = 0; i < n; i++) //vòng lặp for
     {
      printf("nhap phan tu thu %d: ", i + 1);
      scanf("%d", &a[i]); //Nhập vào mảng số i
     }
     for (i = 0; i < n-1;i++){
         for (j = i+1; j < n;j++){
             if (a[i]>a[j]) //Tăng dần or Giảm dần a[i]<a[j]
             {
                  k = a[i];  //k là biến tạm lưu giá trị
                  a[i] = a[j];  //thực hiện đổi chỗ lấy a[j]
                  a[j] = k;  //thực hiện đổi chỗ lấy a[i]
             }
         }
     }
     printf("mang sau khi da sap xep la:\n");
     for (i = 0; i < n; i++) {
          printf(" %d ", a[i]); //Mỗi lần lặp in ra mảng i
     }
}
Kiến Thức Cần Có:
1. Khai báo kiểu int ?
2. Khai báo kiểu Array mảng ? Mảng 1 chiều và mảng 2 chiều là gì?
3. printf là gì?
4. scanf là gì ?
5. Vòng lặp for là gì ?

Xem thêm: Hàm đổi chỗ dùng con trỏ trong lập trình C bấm vào đây

 

BACK TO TOP

Xuống cuối trang