In ra số lớn nhất trong mảng

#include<stdio.h>
#include<conio.h>

#define max 100 
void NhapMang(int a[max], int &n);
void XuatMang(int a[max], int n);
int largest(int a[max], int n);
void smallest(int a[max], int n);
int main()
{
	int a[max];
	int n;
	NhapMang(a, n);
	XuatMang(a, n);
	largest(a, n);
	smallest(a, n);
	return 0;
}
void NhapMang(int a[max], int &n)
{
	printf("Nhap so luong phan tu : ");
	scanf("%d", &n);
	for (int i = 1; i<=n; i++)
	{
		printf("Nhap a[%d] : ", i);
		scanf("%d", a + i);
	}
}
void XuatMang(int a[max], int n)
{
	for (int i = 1; i<=n; i++)
		printf("a[%d]=%d ",i, a[i]);
	printf("\n");
}
void soam(int a[max], int n)
{
	for (int i = 1; i <= n; i++)
	{
		if (a[i]%2==0 && a[i]<20)
		{
			printf("cac so chan nho hon 20: %d \n ", a[i]);
		}
	}
}  
void last(int a[max],int n) {
	for (int i = 1; i <= n; i++)
	{
		if (i == n )
		{
			printf("gia phan tu cuoi cung trong mang a[%d]=%d ",i, a[i]);
		}
	}
}
int largest(int a[max], int n)
{ 
    int temp;
    temp = a[0];
    for (int i = 0; i <= n; i++)
    {
        if (temp < a[i])
        {
            temp = a[i];
        }
    }
    printf("so lon nhat la %d ",temp);

} /*0 1 2 3 4 */
void smallest(int a[max], int n)
{ 
	int min;
	min = a[0];
	for (int  i = 1; i <= n; i++)
	{
		if (min>a[i])
		{
			min= a[i];

		}
	}
	printf("\nso nho nhat : %d \n ",min);
}

em suy nghĩ mãi vẫn biết tại sao nó không in ra đúng số lớn nhất !!! mọi người giúp em với ạ

void NhapMang(int a[max], int &n)
{
	printf("Nhap so luong phan tu : ");
	scanf("%d", &n);
	for (int i = 1; i&lt;=n; i++)
	{
		printf("Nhap a[%d] : ", i);
// a + i là gì thế?
		scanf("%d", a + i); // scanf("%d", a[i]);
	}
}

a[i] cũng giống a+i thôi bác nó mình mình đã khai bao a là mảng rồi mình cộng i vào thì nó cũng hiểu là a[i]
bác xem giúp bài của em nó in ra số nhỏ nhất thì đc nhưng mà in ra số lớn nhất sai mình k biết nó sai từ cái nào

  • Trong C không có tham chiếu, chắc là bạn compile theo C++ (Trong C thì dùng con trỏ).
  • Mảng bắt đầu từ phần tử a[0] chứ không phải a[1].
  • Duyệt mảng thế này là duyệt quá kích thước của mảng rồi, i đếm từ i = 0, đến i < n thôi.

Bạn cứ sửa hết lỗi đi đã.

1 Like

mình đã sửa nhưng ,mà
void NhapMang(int a[max], int &n) không sử dụng tham chiếu thì giá trị lớn nhất thì nó auto bằng 1 mình đã sử dụng con trỏ mà vẫn không dc

Con trỏ dùng được chứ, bạn cứ post code bạn đã sửa lại dùng con trỏ lên đây xem thử vấn đề ở đâu.

Reference
#include<stdio.h>
#include<conio.h>

#define max 100 
void NhapMang(int a[max], int *n);
void XuatMang(int a[max], int n);
int largest(int a[max], int n);
void smallest(int a[max], int n);
int main()
{
	int a[max];
	int n;
	NhapMang(a, &n);
	XuatMang(a, n);
	largest(a, n);
	smallest(a, n);
	return 0;
}
void NhapMang(int a[max], int *n)
{
	printf("Nhap so luong phan tu : ");
	scanf("%d", n);
	for (int i = 0; i < *n; i++)
	{
		printf("Nhap a[%d] : ", i);
		scanf("%d", a + i);
	}
}
void XuatMang(int a[max], int n)
{
	for (int i = 0; i < n; i++)
		printf("a[%d]=%d ", i, a[i]);
	printf("\n");
}
void soam(int a[max], int n)
{
	for (int i = 0; i < n; i++)
	{
		if (a[i]%2==0 && a[i]<20)
		{
			printf("cac so chan nho hon 20: %d \n ", a[i]);
		}
	}
}  
void last(int a[max],int n) {
	for (int i = 0; i < n; i++)
	{
		if (i == n )
		{
			printf("gia phan tu cuoi cung trong mang a[%d]=%d ",i, a[i]);
		}
	}
}
int largest(int a[max], int n)
{ 
    int temp;
    temp = a[0];
    for (int i = 1; i < n; i++)
    {
        if (temp < a[i])
        {
            temp = a[i];
        }
    }
    printf("so lon nhat la %d ",temp);

} /*0 1 2 3 4 */
void smallest(int a[max], int n)
{ 
	int min;
	min = a[0];
	for (int  i = 1; i < n; i++)
	{
		if (min>a[i])
		{
			min= a[i];
		}
	}
	printf("\nso nho nhat : %d \n ",min);
}

Vì lúc nhập mảng bạn cho vòng lặp chạy từ 1 nên a[0] mang giá trị rác.Trong hàm largest temp=a[0] và cho vòng lặp chạy từ 0 nên sau vòng lặp max=a[0]=giá trị rác.Bạn có thể sửa bằng cách lúc nhập mảng cho i chạy từ 0 hoặc trong hàm largest gán temp=a[1] và for(int i=1;i<=n;i++) là được.

#include<stdio.h>
#include<conio.h>
#define max 100 
void NhapMang(int a[], int n);
void XuatMang(int a[], int n);
void soam(int a[], int n);
void last(int a[], int n);
void largest(int a[], int n);
void smallest(int a[], int n);
int main()
{
	
	int n;
	int a[n];
	NhapMang(a,n);
	XuatMang(a, n);
	soam(a, n);
	last(a, n);
	largest(a, n);
	smallest(a, n);
	return 0;
}
void NhapMang(int a[], int n)
{
	printf("Nhap so luong phan tu : ");
	scanf("%d", &n);
	int *p;
	p=&a[n];
	for (int i = 1; i<=n; i++)
	{
		printf("Nhap a[%d] : ", i);
		scanf("%d",*(p+n));
	}
}
void XuatMang(int a[], int n)
{
	for (int i = 1; i<=n; i++)
		printf("a[%d]=%d ",i, a[i]);
	printf("\n");
}
void soam(int a[], int n)
{
	for (int i = 1; i <= n; i++)
	{
		if (a[i]%2==0 && a[i]<20)
		{
			printf("cac so chan nho hon 20: %d \n ", a[i]);
		}
	}
}  /* 
   1 2 3 4 5  */
void last(int a[],int n) {
	for (int i = 1; i <= n; i++)
	{
		if (i == n )
		{
			printf("gia phan tu cuoi cung trong mang a[%d]=%d ",i, a[i]);
		}
	}
}
void largest(int a[], int n)
{ 
	
	int temp;
	temp = a[1];
	for ( int i = 1; i <= n; i++)
	{
		if (temp<a[i])
		{
			temp= a[i];
		}
	}
	printf("\nso lon nhat : %d ", temp);

} /*0 1 2 3 4 */
void smallest(int a[], int n)
{ 
	int min;
	min = a[1];
	for (int  i = 1; i <= n; i++)
	{
		if (min>a[i])
		{
			min= a[i];

		}
	}
	printf("\nso nho nhat : %d \n ",min);
}

mình làm theo con trỏ thế này bạn xem giúp mình !
nó auto ra số lớn nhất nhỏ nhất là 0
nó còn k xuất ra giá trị trong hàm last với soam

mình cảm ơn bạn mình sửa dc r ^^
nhưng mà đó là khi mình làm tham chiếu mượn c++ khi làm về con trỏ c thuần thì nó không in ra đúng số nhất nhỏ nhất còn
nó còn k xuất ra giá trị hàm last và soam
bạn coi giúp mình

#include<stdio.h>
#include<conio.h>
#define max 100 
void NhapMang(int a[], int n);
void XuatMang(int a[], int n);
void soam(int a[], int n);
void last(int a[], int n);
void largest(int a[], int n);
void smallest(int a[], int n);
int main()
 {

int n;
int a[n];
NhapMang(a,n);
XuatMang(a, n);
soam(a, n);
last(a, n);
largest(a, n);
smallest(a, n);
return 0;
}
 void NhapMang(int a[], int n)
 {
printf("Nhap so luong phan tu : ");
scanf("%d", &n);
int *p;
    p=&a[n];
for (int i = 1; i<=n; i++)
{
	printf("Nhap a[%d] : ", i);
	scanf("%d",*(p+n));
  }
 }
  void XuatMang(int a[], int n)
{
for (int i = 1; i<=n; i++)
	printf("a[%d]=%d ",i, a[i]);
printf("\n");
 }
     void soam(int a[], int n)
{
for (int i = 1; i <= n; i++)
{
	if (a[i]%2==0 && a[i]<20)
	{
		printf("cac so chan nho hon 20: %d \n ", a[i]);
	   }
   }
  }    
     void last(int a[],int n) {
    for (int i = 1; i <= n; i++)
   {
	  if (i == n )
	     {
		printf("gia phan tu cuoi cung trong mang a[%d]=%d ",i, a[i]);
	    }
      }
      }
        void largest(int a[], int n)
     { 

       int temp;
       temp = a[1];
       for ( int i = 1; i <= n; i++)
     {
	if (temp<a[i])
	{
		temp= a[i];
	}
}
printf("\nso lon nhat : %d ", temp);

   } /*0 1 2 3 4 */
 void smallest(int a[], int n)
 { 
int min;
min = a[1];
for (int  i = 1; i <= n; i++)
{
	if (min>a[i])
	{
		min= a[i];

	}
}
printf("\nso nho nhat : %d \n ",min);
}
  • Chương trình của bạn vẫn chưa sửa hết các ý mà mình đã đề cập ở comment trước.
  • Nói riêng về hàm này: Bạn dùng sai con trỏ rồi, khi gán p=&a[n] nghĩa là bạn gán cho con trỏ p trỏ tới địa chỉ (a + n) chứ không phải là vị trí đầu tiên của mảng a. Ở đây thay vì dùng tham chiếu int &n thì bạn có thể dùng con trỏ int *n. Ví dụ:
void NhapMang(int a[max], int *n)
{
	printf("Nhap so luong phan tu : ");
	scanf("%d", n);
	for (int i = 0; i < *n; i++)
	{
		printf("Nhap a[%d] : ", i);
		scanf("%d", a + i);
	}
}

sao làm n mà không phải là &n

Tại vì hàm scanf yêu cầu đối số là địa chỉ trong khi đó n là con trỏ vốn có giá trị là một địa chỉ rồi nên mình truyền vào là n thay vì …&n.

mà sao phải cho i từ 0 -> n
nếu cho từ 1 <= n thì
vd : n=3 thì i từ 0 1 2 thì cũng có 3 phần tử
n=3 thì i từ 1 2 3 thì cũng có 3 phần tử
bạn giải thích giúp mình với ạ

Bác tham khảo clip của boss nha , em cũng học boss
Nếu bác cho từ 1 thì nó sẽ bỏ qua phần tử đầu ( như ví dụ của bác là số 0 ) và nó đẻ thêm 1 số rác ở cuối mảng vì n =3 mà mảng có mỗi 3 phần tử , bác cho n = 3 là vượt mảng rồi

1 Like

Bạn có thể tham khảo về mảng ở đây: https://www.youtube.com/watch?v=9b2D-7ybkrk

Nhập n trong hàm main ấy , truyền tham số vào còn nhập bảo sao ko sai , muốn thì truyền số 0 vào hàm rồi nhập lại nhìn cho nó củ chuối (hàm nhập ấy)

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?