Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 2 của 2

Chủ đề: Con trỏ / Mảng

  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Con trỏ / Mảng

    Mã:
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <math.h> 
    // Phần 1 : khai báo nguyên mẫu hàm
    // 1.Xây dụng hàm nhập mảng, có dữ liệu trả về; có tham số đầu vào
    int Nhap_n(int &n);
    // 2.Xây dựng hàm nhập mảng
    void NhapMang(int *a,int n );
    // 3.Xây dựng hàm xuất mảng
    void XuatMang(int *a,int n);
    // 4.Xây dựng hàm tính tổng, trả dử liệu Tong về
    int TinhTong(int *a,int n);
    // 5.Xây dựng hàm tính tổng các số nguyên tố trong mảng
    int TinhTong_SNT(int *a,int &n) ;
    // 6.Xây dựng hàm kiểm tra số nguyên tố
    int KiemTraSNT(int &SNT);
    // 7.Xây dựng hàm liệt kê các số nguyên tố co trong mảng đã nhập
    void LietKe_SNT(int *a,int &n);
    // 8.Xây dựng hàm kiểm tra tăng dần
    int KiemTraTang(int *a, int &n);
    // 9.Xây dựng hàm kiểm tra số lẻ và lớn hơn 100
    int KiemTraLe(int *a, int& n);
    // 10.Xây dựng hàm tìm số lớn nhất trong mảng
    int TimMax(int *a, int &n);
    // 11.Xây dựng ham tìm kiếm phần tử x
    int TimX (int *a, int &n, int &x);
    // 12.Xây dựng hàm đếm các phần tử chia hết cho 5 trong mảng các số nguyên.
    int Dem_ChiaHetCho5 (int *a, int &n );
    // 13.Xây dựng hàm hoán vi
    void HoanVi (int &a, int &b);
    // 14.Xây dựng hàm sắp xếp thứ tự mảng tăng dần
    void SapXepTang(int *a, int &n);
    // 15.Xây dựng hàm sắp xếp thứ tự mảng giảm dần
    void SapXepGiam(int *a, int &n);
    // 16.Xây dựng hàm tách mảng ra 2 phần
    void TachMang(int *a, int &n, int *v, int &m, int *u, int &l);
    // 17.Xây dưng hàm nối 2 mảng lại với nhau
    void NoiMang(int *v, int &m, int *u, int &l, int *z, int &h);
    // 18.Xây dựng hàm xét tính đối xứng của mảng
    int KtDoiXung(int *a,int &n);
    // 19.Xây dựng hàm thêm phân tử vào mảng, tại vi trí nhập vào
    void ThemPhanTu(int *&a,int &n,int ViTriThem, int PhanTuThem);
    // 20.Xây dựng hàm Xóa phần tử mảng
    void XoaPhanTu(int *&a,int &n,int ViTriXoa);
    
    // Phần 2 : Xây dựng các hàm đã khai báo
    // 1.Xây dụng hàm nhập mảng, có dữ liệu trả về; có tham số đầu vào
    int Nhap_n(int &n)
    {
    	do{
    		printf("
    nhap so luong phan tu cua mang n = ");
    		scanf("%d",&n);
    		if(n<0 )
    		{
    			printf("
     n khong hop le.Yeu cau kiem tra lai");
    		}
    	}while(n<0 );
    	return n;
    }
    // 2.Xây dựng hàm nhập mảng
    void NhapMang(int *a,int n )
    {
    	int temp;
    	printf("
    Nhap mang");
    	for (int i=0;i<n;i++)
        {
            printf("
    Nhap phan tu mang a[%d] = ",i);
            scanf("%d",&temp);
            if (temp==0)
                a[i]=NULL;
            else
                a[i]=temp;
        }
    }
    // 3.Xây dựng hàm xuất mảng
    void XuatMang(int *a,int n)
    {
    	printf("
    Xuat Mang");
    	for(int i = 0; i<n; i++)
    	{
    		printf("%5d",a[i]);
    	}
    
    	for (int i=0;i<n;i++)
        {  
    		if (a[i]!=NULL)
                printf("
    [%d]: %d",i,a[i]);
            else
                printf("
    [%d]: chua co du lieu",i);
    	}
    }
    // 4.Xây dựng hàm tính tổng, trả dử liệu Tong về
    int TinhTong(int *a,int n)
    {
    	int Tong = 0 ;
    	for(int i =0;i<n;i++)
    	{
    		Tong =Tong + a[i] ;
    	}
    	return Tong;
    }
    // 5.Xây dựng hàm tính tổng các số nguyên tố trong mảng
    int TinhTong_SNT(int *a,int &n) 
    {
        int Tong_SNT = 0;
        for(int i = 0; i < n; i++) 
    	{
            if(KiemTraSNT(a[i])) 
    			Tong_SNT += a[i];
        }
        return Tong_SNT;
    }
    // 6.Xây dựng hàm kiểm tra số nguyên tố
    int KiemTraSNT(int &SNT)
    {
    	if(SNT < 2) return 0;	// không phải SNT
    	for(int i=2;i<=sqrt((float)SNT);i++)
    	{
    		if(SNT %i == 0) return 0;	// không phải SNT
    	}
    	return 1;	// SNT: Sau khi kiểm tra tất cả 
    }
    // 7.Xây dựng hàm liệt kê các số nguyên tố co trong mảng đã nhập
    void LietKe_SNT(int *a,int &n)
    {
    	
    	int flag_KT = 0 ;
    	int j=0 ;
    	int *b ;
    	b = (int *)malloc(n*sizeof(int *)); // Cấp phát động cho con trỏ
    	for(int i = 0; i < n; i++) 
    	{
            if(KiemTraSNT(a[i])) 
    		{
               b[j++] = a[i];
    		   flag_KT++  ;
            }
        }
    
    	if(flag_KT)
    	{
    		printf("
     Co %d phan tu la SNT",flag_KT);
    		XuatMang(b,flag_KT);
    	}
    	else printf("
     Khong co phan tu la SNT trong mang");
    
    	free(b);
    }
    // 8.Xây dựng hàm kiểm tra tăng dần
    int KiemTraTang(int *a, int &n)
    {
    	for (int i = 0; i < n-1; i ++ )
    	if ( a[i] > a[i+1] ) // Vi phạm điều kiện tăng dần
    	{
    		return 0;
    		break;
    	}
    	return 1;
    }
    // 9.Xây dựng hàm kiểm tra số lẻ và lớn hơn 100
    int KiemTraLe(int *a, int& n)
    {
    	for (int i = 0; i < n; i ++ )
    	if ( a[i] % 2 != 0 && a[i]> 100 ) //Gặp phần tử thoả
    	{
    		return 1;
    		break;
    	}
    	return 0;
    }
    // 10.Xây dựng hàm tìm số lớn nhất trong mảng
    int TimMax(int *a, int &n)
    {
    	int max, i = 1;
    	max = a[0];
    	for (int i = 0; i < n; i ++ )
    	{
    		if ( *(a+i) > max )
    			max = *(a+i) ;
    	}
    	return max;
    }
    // 11.Xây dựng ham tìm kiếm phần tử x
    int TimX (int *a, int &n, int &x)
    {
    	for (int i = 0; i < n ; i ++)
    		if ( x==a[i] )
    		return i;
    	return -1;
    }
    // 12.Xây dựng hàm đếm các phần tử chia hết cho 5 trong mảng các số nguyên.
    int Dem_ChiaHetCho5 (int *a, int &n )
    {
    	int dem = 0;
    	for (int i = 0; i < n ; i++ )
    		if ( a[i] % 5 == 0 )
    			dem++;
    	return dem ;
    }
    // 13.Xây dựng hàm hoán vi
    void HoanVi (int &a, int &b)
    {
    	int tam = a;
    	a = b;
    	b = tam;
    }
    // 14.Xây dựng hàm sắp xếp thứ tự mảng tăng dần
    void SapXepTang(int *a, int &n)
    {
    	for (int i = 0; i < n-1 ; i++)
    		for (int j = i+1; j < n; j++)
    			if (a[i] > a [j])
    				HoanVi (a[i], a[j]);
    	printf("
     Mang sau khi sap xep Tang");
    	XuatMang(a,n);
    }
    // 15.Xây dựng hàm sắp xếp thứ tự mảng giảm dần
    void SapXepGiam(int *a, int &n)
    {
    	for (int i = 0; i < n-1 ; i++)
    		for (int j = i+1; j < n; j++)
    			if (a[i] < a [j])
    				HoanVi (a[i], a[j]);
    	printf("
     Mang sau khi sap xep giam");
    	XuatMang(a,n);
    }
    // 16.Xây dựng hàm tách mảng ra 2 phần
    void TachMang(int *a, int &n, int *v, int &m, int *u, int &l)
    {
    	int j=0;
    	for (int i=0; i<n; i++)
    	{
    		if ( i < m)
    			v[i]=a[i];
    		else 
    		{
    			u[j]=a[i];
    			j++;
    		}
    	}
    }
    // 17.Xây dưng hàm nối 2 mảng lại với nhau
    void NoiMang(int *v, int &m, int *u, int &l, int *z, int &h)
    {
    	h = m +l;
    	for(int i = 0; i<h; i++)
    		if(i<m)
    			z[i] = v[i];
    		else
    			z[i] = u[i-m];
    
    }
    // 18.Xây dựng hàm xét tính đối xứng của mảng
    int KtDoiXung(int *a,int &n) 
    {
        int i;
        for(i=0; i<n-1; i++)
            if(a[i]==a[n-1-i])
                return 1;
        return 0;
    }
    // 19.Xây dựng hàm thêm phân tử vào mảng, tại vi trí nhập vào
    void ThemPhanTu(int *&a,int &n,int ViTriThem, int PhanTuThem)
    {
    	////Gia tăng bộ nhớ thêm 1 ô nữa
    	//realloc(a,(n+1)*sizeof(int*));
    	for(int i=n; i>=ViTriThem +1; i--)
    	{
    		a[i] = a[i-1] ;
    	}
    	a[ViTriThem]= PhanTuThem ;
    	n++ ;
    }
    // 20.Xây dựng hàm Xóa phần tử mảng
    void XoaPhanTu(int *&a,int &n,int ViTriXoa)
    {
    	for(int i = ViTriXoa; i<n-1; i++ )
    	{
    		a[i] = a[i+1];
    	}
    	n-- ;
    	realloc(a,n*sizeof(int *));
    }
    // Xây dựng hàm chính
    void main()
    {
    	int n ;
    	n= Nhap_n(n);
    
    	int *a,*v, *u ,*z ; ;	// Khai báo con trỏ a
    	a = (int *)malloc(n*sizeof(int *)); // Cấp phát động cho con trỏ
    	v = (int *)malloc(n*sizeof(int *)); // Cấp phát động cho con trỏ
    	u = (int *)malloc(n*sizeof(int *)); // Cấp phát động cho con trỏ
    	z = (int *)malloc(n*sizeof(int *)); // Cấp phát động cho con trỏ
        if(a==NULL)
    	{
    		printf("
    Cap phat bo nho khong thanh cong!!!. Xin kiem tra lai");
    	}
    	else
    	{
    		
    		NhapMang(a,n );
    		XuatMang(a,n);
    
    		LietKe_SNT(a,n);
    
    		int flag_Doixing = KtDoiXung(a,n) ;
    // Kiểm tra tính đối xứng của mảng
    		switch (flag_Doixing)
    		{
    
    		case 1 : printf("
     Mang da nhap doi xung");
    			break;
    		default : printf("
     Mang da nhap khong doi xung!!!");
    			break;
    		}
    		
    		int Tong;
    		Tong = TinhTong(a,n);
    		printf("
    Tong_Mang = %d",Tong);
    
    		Tong = TinhTong_SNT(a,n);
    		printf("
    Tong_SNT =  %d",Tong);
    
    
    		int KT_Tang = KiemTraTang (a, n);
    		int flag_le = KiemTraLe(a, n);
    
    		
    		switch(KT_Tang)
    		{
    		case 0:	printf("
    Mang sap xep khong tang dan !!!"); 
    			break;
    		case 1:	printf("
    Mang sap xep tang dan");
    			break;
    		}
    
    		switch(flag_le)
    		{
    		case 0:	printf("
     Khong co phan tu le >100 !!!");
    			break;
    		case 1:	printf("
     Co phan tu le >100");
    			break;
    		}
    		int flag_Max = TimMax(a,n);
    		printf("
     Phan tu lon nhat trong mang la : %d ",flag_Max);
    
    
    		int flag_TimX,x ;
    		printf("
     Nhap phan tu can tim kiem x = ");
    		scanf("%d",&x);
    		flag_TimX = TimX(a,n,x);
    		if(flag_TimX ==-1) printf("
     Khong Tim thay phan tu x = %d can tim kiem",x);
    		else printf("
     Phan tu x = %d can tim kiem nam vi tri a[%d]",x,flag_TimX);
    		
    		int flag_demchiacho5 = Dem_ChiaHetCho5(a,n);
    		if(flag_demchiacho5)
    			printf("
     Co %d phan tu chia het cho 5",flag_demchiacho5);
    		else printf("
     Khong co phan tu nao chia het cho 5 !!!");
    
    		 //Tách mảng
    		int m,l;
    		do
    		{
    			printf("
     Nhap do dai cho mang v[], m [ %d-->%d ]: ",0,n);
    			scanf("%d",&m);
    			if(m < 0 || m>n)
    				printf("
     Yeu cau nhap lai m ");
    		}while (m < 0 || m>n);
    		printf("
     Do dai cua mang v[%d],",m);
    
    		do
    		{
    			printf("
     Nhap do dai cua mang u[],l [ %d-->%d ]: ",0,n-m);
    			scanf("%d",&l);
    			if(l < 0 || l > (n -m) )
    				printf("
     Yeu cau nhap lai l ");
    		}while (l < 0 || l > (n -m ) );
    		printf("
     Do dai cua mang u[%d] ",l);
    		TachMang(a, n, v, m, u, l);
    		printf("
     Xuat mang v ");
    		XuatMang(v,m);
    		printf("
     Xuat mang u ");
    		XuatMang(u,l);
    
    		 //Nối 2 mảng vừa tách
    		int h ;
    		printf("
     Noi mang v & u ");
    		NoiMang(v, m, u, l, z,h);
    		XuatMang(z,h);
    
    		int ViTriThem ,PhanTuThem ;
    		//Nhập vị trí cần thêm và giá trị phần tử cần thêm
    		do
    		{
    			printf("
    Nhap vao vi tri can them [%d-->%d]: ",0,n);
    			scanf("%d",&ViTriThem);
    			if(ViTriThem <0 || ViTriThem > n)
    			{
    				printf("
    Vi tri them khong hop le. Xin kiem tra lai!!!");
    			}
    		}while(ViTriThem <0 || ViTriThem > n);
    		printf("
    Nhap vap phan tu can them: ");
    		scanf("%d",&PhanTuThem);
    		ThemPhanTu(a,n,ViTriThem,PhanTuThem);
    		printf("
    Mang a sau khi them than tu %d ,Tai vi tri them a[%d]  :",PhanTuThem,ViTriThem);
    		XuatMang(a,n);
    		Tong = TinhTong(a,n);
    		printf("
    Tong mang sau khi them,Tong = %d",Tong);
    //Nhập trị trí muốn xóa nằm trong đoạn từ 0 đến n-1 ;
    		int ViTriXoa;
    		do
    		{
    			printf("
    Nhap vao vi tri xoa [%d-->%d]: ",0,n-1);
    			scanf("%d",&ViTriXoa);
    			if(ViTriXoa <0 || ViTriXoa > n-1)
    			{
    				printf("
    Vi tri xoa khong hop le. Xin kiem tra lai!!!");
    			}
    		}while(ViTriXoa <0 || ViTriXoa > n-1);
    		int PhanTuXoa = a[ViTriXoa];
    		XoaPhanTu(a,n,ViTriXoa);
    		printf("
    Mang a sau khi xoa phan tu %d,tai vi tri a[%d] : ",PhanTuXoa,ViTriXoa);
    		XuatMang(a,n);
    		Tong = TinhTong(a,n);
    		printf("
    Tong mang sau khi xoa,Tong = %d",Tong);
    
    		SapXepTang(a,n);
    		SapXepGiam(a,n);
    
    		printf("
     **** Ket Thuc Chuong Trinh *** 
    ");
    	}
    	free(a);
    	free(v);
    	free(u);
    	free(z);
        getch();
    }

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Các code trên chỉ sử dụng con trỏ để truyền mảng làm tham số cho hàm.
    Bên trong hàm, không có chỗ nào thực sự sử dụng con trỏ để duyệt mảng.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •