16/1/15

Một số bài tập cơ bản về mảng một chiều

Hầu hết những bài tập dưới đây là rất cơ bản dành cho các bạn mới học Nhập môn lập trình tham khảo.

1. Viết hàm nhập mảng một chiều các số nguyên
Phải luôn luôn định trước số phần tử cần dùng cho mảng. Trong C/C++, mảng được đánh chỉ số từ 0.
Nếu là mảng các số thực chỉ việc thay int a[] thành float a[] và đổi mã đặc tả của hàm scanf trong vòng lặp thành %f.
Code C:
//Cách 1: Nhập n trong hàm nhập mảng
void InputArray1(int a[], int &n)
{
   printf("Nhập số phần tử: ");
   scanf("%d", &n);
   for(int i = 0; i < n; i++);
   {
      printf("A[%d] = ", i);
      scanf("%d", &a[i]);
   }
}

//Cách 2: Nhập n ngoài hàm nhập mảng
void InputArray2(int a[], int n)
{
   for(int i = 0; i < n; i++)
   {
      printf("A[%d] = ", i);
      scanf("%d", &a[i]);
   }
}

2. Viết hàm xuất mảng một chiều các số nguyên
Code C:
void OutputArray(int a[], int n)
{
   for(int i = 0; i < n; i++)
      printf("%d\t", a[i]);
}



3. Viết hàm tìm giá trị lớn nhất trong mảng nguyên một chiều
Code C:
int MaxOfArray(int a[], int n)
{
   int max = a[0];
   for(int i = 1; i < n; i++)
      if(a[i]>max)
         max = a[i];
   return max;
}

4. Viết hàm tìm chỉ số của phần tử có giá trị lớn nhất trong mảng nguyên một chiều
Code C:
int IndexOfMaxOfArray(int a[], int n)
{
   int index = 0;
   for(int i = 0; i < n; i++)
      if(a[i]>a[index])
         index = i;
   return index;
}

5. Viết hàm tìm giá trị trung bình của các phần tử chẵn trong mảng nguyên một chiều
Dùng một biến lưu tổng giá trị các phần tử chẵn và một biến đếm các phần tử chẵn, giá trị trung bình sẽ bằng tổng chia cho biến đếm.
Code C:
float AverageOfEvenOfArray(int a[], int n)
{
   float sum = 0;
   int dem = 0;
   for(int i = 0; i < n; i++)
      if(a[i]%2==0)
      {
         sum += a[i];
         dem++;
      }
   return sum / dem;
}

6. Viết hàm tìm số nguyên tố lớn nhất trong mảng nguyên một chiều
Trả về số nguyên tố lớn nhất nếu tìm được, trả về -1 nếu không tìm được.
Code C:
int MaxPrimeOfArray(int a[], int n)
{
   int max = -1;
   for(int i = 0; i < n; i++)
      if(IsPrime(a[i]) && a[i]>max)
         max = a[i];
   return max;
}

7. Viết hàm kiểm tra một mảng có là mảng đối xứng
Ví dụ: a[] = {1, 2, 3, 2, 1,}, b[] = {1, 4, 4, 1} là mảng đối xứng, c[] = {1, 2, 3, 3, 1} không là mảng đối xứng.
Trả về 1 nếu là mảng đối xứng, trả về 0 nếu không là mảng đối xứng.
Code C:
//Cách 1
int DoiXung(int a[], int n)
{
   for(int i = 0; i < n; i++)
      if(a[i] != a[n-1-i])
         return 0;
   return 1;
}

//Cách 2
int DoiXung(int a[], int n)
{
   for(int i = 0, j = n-1; i < j; i++, j--)
      if(a[i]!=a[j])
         return 0;
   return 1;
}

8. Viết hàm xoá một phần tử trong mảng nguyên một chiều
Code C:
void XoaPhanTu(int a[], int &n, int index)
{
   for(int i = index; i < n-1; i++)
      a[i] = a[i+1];
   n--;
}

9. Viết hàm xoá các phần tử giống nhau trong mảng sao cho mỗi phần tử trong mảng đều có giá trị khác nhau
Code C:
void XoaGiongNhau(int a[], int &n)
{
   for(int i = 0; i < n-1; i++)
      for(int j = i+1; j < n; )
      {
         if (a[i] == a[j])
            XoaPhanTu(a, n, j);
         else
            j++; //Xoá triệt để các số liền nhau rồi mới tăng j
      }
}




13 nhận xét:

  1. Làm sao để thao tác với mảng ban đầu (phần tử và thứ tự phần tử) như lúc ban đầu sau khi thao tác với một hàm. Vì sau khi thao tác với hàm thì mảng sẽ bị thay đổi, ví dụ như xóa phần tử. Mong bạn giúp đỡ. :)

    Trả lờiXóa
    Trả lời
    1. Nếu bạn truyền tên mảng vào hàm để thao tác thì coi như bạn đã truyền con trỏ đến mảng nên sao khi thao tác chắc chắn sẽ bị thay đổi.
      Cách đơn giản là bạn có thể tạo mảng copy trong hàm và thao tác với nó.
      Thân mến.

      Xóa
  2. A cho e hỏi luôn tiện với ạ?
    Tại sao đối số của hàm khai báo là: ví dụ:
    void doixung(int a[],int n)
    int *p
    doixung(p,n) => ok chạy
    a[?] không có chỉ số '?' .Tại sao lại có thể không cần chỉ số trong đó?
    Với trường hợp a[50] chẳng hạn ở trong hàm khi khai báo.
    void doixung(int a[50],int n)
    int *p;
    Trong trường hợp này khi gọi hàm lại không thể truyền được tham số dạng con trỏ ?
    doixung(p,n) => báo lỗi

    Trả lờiXóa
    Trả lời
    1. a[] trong void doixung(int a[], int n) là tham số hình thức. Vì vậy, nó phải tồn tại trước 1 mảng a[] bên ngoài rồi khi bạn truyền vào mới có thể chạy được.
      a[50] là một mảng tĩnh được cấp phát vùng nhớ nên khi bạn truyền vào có thể chạy được.
      p là một con trỏ chưa trỏ đến đâu cả, vì vậy phải cấp phát vùng nhớ cho p.
      int *p = new int[n]; //cấp phát vùng nhớ
      doixung(p,n); //OK, chạy được

      Xóa
  3. Nặc danh09:15 5/1/16

    Mấy bài tập này hữu ích quá . Tks ad nhiều nhé !

    Trả lờiXóa
  4. Ad thêm mấy bài chèn, xóa đầu, xóa đuôi, gộp mảng vào cho đủ bộ

    Trả lờiXóa
  5. viết hàm tăng 1 số 1 đơn vị thì viết sao ạ

    Trả lờiXóa
  6. Này chạy trên C++ hả ?

    Trả lờiXóa
  7. Em sai chỗ nào ạ : :((((
    /* Nhap và hien thi mot day so nguyen gom n phan tu
    tim va in ra so nguyen to lon nat co trong mang */

    #include
    #include
    #include
    #include
    void Nhap (int a[], int n)
    {

    for(int i = 0; i < n; i++)
    {
    printf("a[%d] = ", i);
    scanf("%d", &a[i]);
    }
    }
    void Hienthi(int a[], int n)
    {
    int i;
    printf("cac PT trong mang\n");
    for(i=0;i1;
    }
    }
    void SonguyentoMax (int a[], int n)
    {
    int i;
    int max = -1 ;
    printf(" So nguyen to lon nhat trong mang la : ");
    for ( i =0 ; i < n ; i ++)
    {


    if(KTNT(a[i]) && a[i] > max)
    {


    max = a[i];
    }
    printf("%d\t", a[i]);

    }
    int main()
    {
    int a[20];
    int n;
    int i;
    int max;
    printf("Nhap so phan tu: ");
    scanf("%d", &n);
    Nhap(a,n);
    Hienthi(a,n);
    SonguyentoMax(a,n);
    return 0;
    }

    Trả lờiXóa
    Trả lời
    1. Bạn sai ở chỗ "printf("%d\t", a[i]);" lệnh này dùng để in các phần tử trong mảng (do nằm trong vòng lặp), thiếu lệnh in ra giá trị max nên không thấy được kết quả.

      Xóa
  8. khong đúng với yêu cầu

    Trả lờiXóa