Bài 5 : Mảng Trong C (Arrays)

1012

Mảng một chiều trong C

  • Mảng :
    • Là một nhóm các vùng nhớ liền nhau
    • Cùng tên và cùng kiểu dữ liệu
  • Truy cập vào từng phần tử của mảng
  • Tên mảng và thứ tự trong mảng

Arrayname[position number]

  • Phần tử đầu tiên có thứ tự là 0
  • chẳng hạn mảng c có n phần tử

> c[0], c[1]… c[n-1]

Ví dụ: mảng một chiều trong c gồm 10 phần tử

c[0] c[1] c[2] c[3] c[4] c5] c[6] c[7] c[8] c[19]
  • Mỗi phần tử của mảng như một biến bình thường
c[0] = 3;
printf("%d", c[0] );
  • Chỉ số của các phần tử có thể là hằng số, có thể là biểu thức có kiểu rời rạc
  • Ví dụ nếu x = 3 thì  c[5-2], c[3], c[x] là tương đương nhau
  • Thường dùng một biến kiểu rời rạc làm chỉ số chạy qua các phần tử của mảng

Khai báo mảng trong c

  • Khi khai báo mảng cần chỉ ra
    • „ Kiểu của các phần tử
    • „ Tên mảng
    • „ Số lượng phần tử

arrayType arrayName[ numberofElements ]

int c[10];
float myArray[3284];

  • Khai báo các mảng cùng kiểu
    • Giống như khai báo các biến cùng kiểu
    • Ví dụ :  int b[100], x[27];
  • Khai báo mảng  có giá trị khởi đầu
    • Ví dụ : int n[5] = {1, 2, 3, 4, 5 };
  • Nếu không đủ thì các phần tử bên phải nhất nhận giá trị khởi tạo là 0
    • int n[5] = {1} phần tử đầu tiên nhận giá trị 1, các phần tử còn lại nhận giá trị 0
  • Nếu số lượng giá trị nhiều hơn số phần tử => lỗi
  • Nếu không chỉ định số phần tử thì số lượng các giá trị khởi đầu sẽ là số phần tử của mảng
    • int n[] = { 1, 2, 3, 4, 5 }; mảng n có  5 phần tử

Ví dụ cơ bản mảng trong c: 

/* example 1 */
#include <stdio.h>
int main(void) /* hàm chính bắt đầu chương trình */
{
   int n[ 10 ]; /* tên mảng n có 10 phần tử */
   int i;
/* khởi tạo các phần tử mảng */
   for (i = 0; i < 10; i ++) { /* dùng vòng for để gán giá trị cho các phần tử */
   n[i] = 0; /* đặt các phần tử i từ 0 */
   }
   printf("%s%13s", "element", "value");
   for ( i = 0;i < 10; i++ ){ /* dùng vòng for để đưa các phần tử ra màn hình */
    printf("%7d%13d \n", i ,n[i] );
   }
return 0;
}
/* example 2 */
#include<stdio.h>
int main(void)
{ 
 /* khởi tạo mảng có giá trị khởi đầu */
 int n[10] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37}; /* gán giá trị khởi đầu */
 int i;
 printf("%s%13s\n","element","value");
 for(i = 0;i < 10; i++){
  printf("%7d%13d\n",i , n[i]);
}
return 0;
}

Ví Dụ 3 : Viết chương trình nhập vào n số nguyên. Tính và in ra trung bình cộng

#include <stdio.h>
#include <conio.h>
void main(void)
{

   int ia[50], i, in, isum = 0;
   printf("Nhap vao gia tri n: ");
   scanf("%d", &in);
   /* Nhap du lieu vao mang */
   for(i = 0; i < in; i++)
   {
       printf("Nhap vao phan tu thu %d: ", i + 1);
       scanf("%d", &ia[i]); //Nhap gia tri cho phan tu thu i
   }
   /* Tinh tong gia tri cac phan tu */
   for(i = 0; i < in; i++)
       isum += ia[i]; /* cong don tung phan tu vao isum */
   printf("Trung binh cong: %.2f\n", (float) isum/in);
   getch();

}

Ví dụ 4 : Có 4 loại tiền 1, 5, 10, 25 và 50 đồng. Hãy viết chương trình nhập vào số tiền sau đó cho biết số số tiền trên gồm mấy loại tiền, mỗi loại bao nhiêu tờ

#include <stdio.h>
#include <conio.h>
#define MAX 5
void main(void)
{
      int itien[MAX] = {50, 25, 10, 5, 1}; /*Khai bao va khoi tao mang voi 5 phan tu */
      int i , isotien, ito;
      printf("Nhap vao so tien: ");
      scanf("%d", &isotien); /* Nhap vao so tien */
      for (i = 0; i < MAX; i++)
      {
         ito = isotien/itien[i]; /* Tim so to cua loai tien thu i */
         printf("%4d to %2d dong\n", ito, itien[i]);
         isotien = isotien%itien[i]; /*So tien con lai sau khi da loai tru cac loai tien da co*/
      }
      getch();
}

Truyền mảng cho hàm

  • Khi tham số của 1 hàm là mảng, thì tham số này thuộc kiểu tham biến biến
    • Tên của mảng chính là địa chỉ của phần tử đầu tiên trong mảng„
    • Truyền mảng cho hàm thông qua tên của mảng

int myArray[24];
myFunction(myArray,24);

  • Truyền một phần tử của mảng cho hàm => truyền theo tham biến trị.   myArrray[3]
  • Khai báo hàm có tham biến là mảng

Void modifyArrray( int b[], int arraySize);
int b[] có thể viết int[]; int arraySize có thể viết là int

Ví du :

/* Example 5:Passing arrays and individual array elements to functions */
#include<stdio.h>
#define SIZE 5 /* sử dụng define khai báo số lượng phần tử và không có dấu ";" */

void modifyArray( int b[], int size);
void modifyElement( int e);

int main(void)
{
  int a[ Size ] = { 0, 1, 2, 3, 4 }; 
  int i;
  printf("Effects of passing entire array by reference:\n\nThe values of the original array are:\n");
  for (i = 0; i < size; i++){
    printf("%3d", a[i]);
  }
  printf("\n");
  modifyArray(a, size);
  printf("The values of the modified array are: \n");
  for ( i = 0; i < size; i++){
    printf("%3d", a[i]);
  }
  printf("\n\nEffects of passing array element by value: \n\nThe value of a[3] is %d\n", a[3]);
  modifyElement(a[3]);
  printf(" The value of a[3] is %d\n", a[3]);
  return 0;
}
/* in function modifyArray, "b" points to the original array "a" in memory */
void modifyArray(int b[], int size)
{
  int j;
/* multiply each array element by 2*/
  for(j =0;j < size; j++){
     b[j] *= 2;
  }
}
/* in function modifyElenment, "e" is a local copy of array element a[3] passed form main */
void modifyElement(int e)
{
  /* multiply parameter by 2*/
  printf("value in modifyElement is %d\n", e *= 2);
}

mang-array

Mảng kí tự trong c

  • C không có kiểu xâu kí tự (string), mảng kí tự cũng có thể thay thế cho xâu kí tự
  • Có thể nhập và xuất một mảng kí tự như 1 xâu, mảng kí tự kết thúc bằng kí tự đặc biệt “\0”
  • Khai báo
    •  char string1[] = “first”;
    • „ char string1[] = { ‘f’, ‘i’, ‘r’, ‘s’, ‘t’, ‘\0’ };
  • „ Nhập mảng kí tự, có thể sử dụng lệnh scanf()
  • Ví dụ : scanf(“%s”, string1 );
/* example 6 : Treating character arrays as strings */
#inclue<stdio.h>
int main(void)
{
  char string1[20]; /* reserves 20 characters */
  char string2[] = "string literal"; /* reserves 15 characters */
  int i;
/* read string from user into array string1 */
  printf("Enter a string: ");
  scanf("%s", string1); /* input ended by whitespace character */
  printf("string1 is : %s\string2 is : %s\n string1 with spaces between character is :\n",string1, string2);
  for (i = 0;string1[i] !='0'; i++){
   printf("%c",string1[i]);
}
  printf("\n")'
  return 0;
}

Mảng nhiều chiều trong C

  • Mảng hai chiều được hình dung như 1 ma trận kích thước n x m (n – số dòng, m – số cột). Số lượng phần tử của mảng là n x m.
  • Khai báo  kieu_mang ten_mang[so_dong][so_cot];
  • Khai báo có giá trị khởi đầu

int b[2][2] = {{1,2}, {3,4}};

  • „ Nếu các giá trị ko đủ, thì các phần tử còn lại được gán
    bằng 0

int b[2][2] ={{1}, {3,4}}

  • Truy cập đến một phần tử : ten_mang[chi_so_dong][chi_so_cot]

Chú ý: KHÔNG dùng b[i,j] mà phải dùng b[i][j]

  • Đối với mảng từ hai chiều trở lên, cũng được khai báo và sử dụng theo cách trên
  • Chẳng hạn mảng ba chiều:  int A[10][10][10]
  • Truy cập các phần tử: A[i][j][k]
  • Có thể quan niệm mảng nhiều chiều là mảng của mảng

mang-cua-mang

Ví dụ : Viết chương trình nhập vào 1 ma trận số nguyên n x n. In ra ma trận vừa nhập vào và in theo chiều ngược lại của mỗi dòng .

#include <stdio.h>
#include <conio.h>
#define MAX 50;
void main(void)
{
   int ia[MAX][MAX], i, j, n;
   printf("Nhap vao cap ma tran: ");
   scanf("%d", &n);
   /* Nhap du lieu vao ma tran */
     for (i = 0; i < n; i++)
     for (j = 0; j < n; j++)
     {
        printf("Nhap vao phan tu ia[%d][%d]: ", i + 1, j + 1);
        scanf("%d", &ia[i][j]);
     }
   /* In ma tran */
   for (i = 0; i < n; i++)
   {
     for (j = 0; j < n; j++)
        printf("%3d ", ia[i][j]);
      printf("\n"); /* xuống dòng để in hàng kế tiếp */
    }
    printf("\n"); /*Tao khoang cach giua 2 ma tran */
    /* In ma tran theo thu tu nguoc */
    for (i = 0; i< n; i++)
    {
      for (j = n-1; j >= 0 j--)
      printf("%3d ", ia[i][j]);
      printf("\n"); /* xuống dòng để in hàng kế tiếp */
     }
getch();
}

Nguồn : lập trình c

No votes yet.
Please wait...

BÌNH LUẬN