01/10/2018, 16:59

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("
");
}
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 
 ", 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("
so nho nhat : %d 
 ",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 ạ

Trương Tấn Phát viết 19:00 ngày 01/10/2018
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]);
	}
}
Duy Duy viết 19:14 ngày 01/10/2018

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

NBQ viết 19:10 ngày 01/10/2018

void NhapMang(int a[max], int &n)

  • Trong C không có tham chiếu, chắc là bạn compile theo C++ (Trong C thì dùng con trỏ).

for (int i = 1; i<=n; i++)
{
printf("Nhap a[%d] : ", i);

  • Mảng bắt đầu từ phần tử a[0] chứ không phải a[1].

for (int i = 0; i <= n; i++)

  • 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 đã.

Duy Duy viết 19:12 ngày 01/10/2018

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

NBQ viết 19:06 ngày 01/10/2018

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);
}
NguyenXuanHung viết 19:01 ngày 01/10/2018

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.

Duy Duy viết 19:07 ngày 01/10/2018
#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

Duy Duy viết 19:02 ngày 01/10/2018

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);
}
NBQ viết 19:15 ngày 01/10/2018
void XuatMang(int a[], int n)
{
	for (int i = 1; i<=n; i++)
		printf("a[%d]=%d ",i, a[i]);
void smallest(int a[], int n)
{ 
	int min;
	min = a[1];
	for (int i = 1; i<=n; i++)
	{
		if (min&gt;a[i])
void largest(int a[], int n)
{ 
	
	int temp;
	temp = a[1];
	for (int i = 1; i<=n; i++)
	{
		if (temp&lt;a[i])
void soam(int a[], int n)
{
	for (int i = 1; i<=n; i++)
void last(int a[],int n) {
	for (int i = 1; i<=n; i++)
  • 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.
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));
  }
 }
  • 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);
	}
}
Duy Duy viết 19:07 ngày 01/10/2018

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

NBQ viết 19:13 ngày 01/10/2018

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.

Duy Duy viết 19:06 ngày 01/10/2018

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 ạ

Nguyễn Văn Vương viết 19:02 ngày 01/10/2018

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

NBQ viết 18:59 ngày 01/10/2018

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

Bài liên quan
0