Bài tập C về mảng 1 chiều

tìm số âm lớn nhất
int soamlonnhat(int a[],int n) //tra ve so am lon nhat ? k phai tra ve vi tri dau nha
{
int soamlonnhat = 1;
for (int i=0;i<n;i++)
{
if (a[i]<0) { soamlonnhat = a[i];break;}

if (soamlonnhat = 1)
return 1 ; //khong co so am lon nhat
}
for (int j=i;j<n;j++)

if ((a[j]<0) && (a[j]>soamlonnhat)) soamlonnhat = a[j];

return soamlonnhat;

Thắt mắt là khí mình nhập mảng mình phải nhập mảng đầu tiên A[0]=số âm thì nó mới tiềm số âm nhỏ nhất còn nhập mảng đầu tiên (A[0]= số dương) thì nó ko tìm cho kết quả là 1 luôn ai fix dùm mình thank nhiều ( đầu năm làm đều tốt vận may nhân khắp mà)

Còn tìm số dương nhỏ nhất (cũng giống ý tưởng trên ai sữa dùm mình) thank nhiều

Phản hồi 1:

ah bạn huynguyen oi ở phía trên mình cũng đã nói là nó hơi dài nhưng theo mình nghĩ cách của mình nó dễ hiểu hơn một chút.có gì bạn bỏ qua cho đó chỉ là ý kiến của mình thui.mà cho mình hỏi sao giải thuật không hiệu quả.Bạn có thể chỉ ra chỗ không hiệu quả không để mình có thể sửa.cám ơn bạn nhiều.Bởi theo mình nghĩ nếu tách riêng bài ra hai phần thì khi cần mình có thể gọi lại hàm đó để giải quyết còn các bạn thì viết dính chùm lại hết thì khi cần sao gọi lại được.

Phản hồi 2:

int i = 0, t;
while ((i < n) && (a[i] >= 0)) ++i; //xac dinh so am dau tien
if (i = n) cout <<"Day so ko co so am."; // day ko co so am
else{
t = a[i];
for (int j = i+1; j < n; ++j) //vong lap tim so am lon nhat
if ((a[j] < 0) && (a[j] > t))
t = a[j];
cout <<"So am lon nhat: " <<t;
}

Mình thử chạy hàm của bạn. nó báo lỗi là cần phải trả về giá trị. bạn có thể fix lại ko

Mình làm như vậy nhưng kết quả vẫn ko chính xác

int i = 0, t;
while ((i < n) && (a[i] >= 0)) ++i; //xac dinh so am dau tien
if (i = n) cout <<"Day so ko co so am."; // day ko co so am
else{
t = a[i];
for (int j = i+1; j < n; ++j) //vong lap tim so am lon nhat
if ((a[j] < 0) && (a[j] > t))
t = a[j];
cout <<"So am lon nhat: " <<t;
} return t;
có đúng là trả về giá trị t hay là giá trị khác
thank! gà lắm mấy bác đừng chửi tội nghiệp

Phản hồi 3:

@whitemouse : khi bạn học lập trình nhiều và có kinh nghiệm thì bạn sẽ thấy code càng ngắn xúc tích càng dễ hiểu và dễ sửa chữa hơn >> tiết kiệm bộ nhớ, hiệu quả. Chỉ tách ra trong trường hợp các bài tập lớn chia thành các lớp module mà giải quyết thôi .
Còn bài tập trong topic này thì không có yêu cầu cao cho nên làm như bạn cũng đúng nhưng mà nếu ông thầy chấm điểm thì bạn sẽ không được điểm tối đa đâu :D

Đúng là code càng ngắn càng xúc tích,đễ hiểu thì tốt, nhưng chưa chắc ngắn đã tiết kiệm bộ nhớ đâu bạn. nhiều chương trình viết thêm vài dòng lệnh đôi khi lại chạy nhanh hơn đó

Phản hồi 4:

/*dau tien phai xac dinh so am dau tien trong mang*/
float amdautien (float a[], int n)
{
for (int i=0;i<n;i++)
{
if (a[i]<0)
return a[i];
}
rutern 0;
}
/*bat dau tim so am lon nhat(phuong phap dat linh canh)*/
float amlonnhat (float a[], int n)
{
float max=amdautien(a,n);
if (max=0)
return 0;
else
{
for(int ii=o;i<n;i++)
if((a[i]<0)&&(a[i]>max))
max=a[i];
}

return max;
}

Phản hồi 5:

Sao lại không nhỉ? Duyệt từ đầu, nếu thấy một số <0 nào đó thì nó sẽ là số âm đầu tiên chứ?. Nếu duyệt đến hết mảng mà chẳng thấy một số <0 nào thì kết luận: "Làm gì có số âm nào mà bảo tìm số âm lớn nhất?? " Hì hì

Ặc, bác Dreaminess ko hiểu ý của em rồi, Pete chỉ nói chung chung là so sánh số âm đang xét với số trước đó
* Cách tìm số âm lớn nhất trong mảng :
1. Quét từng phần tử
2. Kiểm tra nó có âm hay không ?
3. Nếu là số âm thì so sánh nó với số trước đó.
4. Sau mỗi lần so sánh gán giá trị vào một biến ( biến này phải là số âm nhỏ nhất trong khoảng xác định )
5. Trả lại giá trị số âm lớn nhất đó.

Cái giải thuật này thiếu nên em mới hỏi Pete câu đó chứ đâu phải em ko biết, giải thuật của em có đầy đủ mà bác.

Phản hồi 6:

Sai nhiều .. Không có logic .
* Cách tìm số âm lớn nhất trong mảng :
1. Quét từng phần tử
2. Kiểm tra nó có âm hay không ?
3. Nếu là số âm thì so sánh nó với số trước đó.
4. Sau mỗi lần so sánh gán giá trị vào một biến ( biến này phải là số âm nhỏ nhất trong khoảng xác định )
5. Trả lại giá trị số âm lớn nhất đó.

Have Fun :D !

* Số dương tương tự

Phản hồi 7:

void hoanvi(int &a,int&b)
{
int tam=a;
a=b;
b=tam;
}
void ammax(int n ,int a[100])
{
int max;
for (int i=0;i<n;i++)
{
for (int j=i+1;j<n;j++)
if((a[i]>=0)&&(a[j]<0))
hoanvi(a[i],a[j]);
}
max=a[0];
for(int k=1;k<n;k++)
{
if((a[k]>max)&&(a[k]<0))
max=a[k];
}
printf("am max la : %d",max);
getch();
}


vậy là xong rồi đó bạn , đầy đủ

Phản hồi 8:

/*dau tien phai xac dinh so am dau tien trong mang*/
float amdautien (float a[], int n)
{
for (int i=0;i<n;i++)
{
if (a[i]<0)
return a[i];
}
rutern 0;
}
/*bat dau tim so am lon nhat(phuong phap dat linh canh)*/
float amlonnhat (float a[], int n)
{
float max=amdautien(a,n);
if (max=0)
return 0;
else
{
for(int ii=o;i<n;i++)
if((a[i]<0)&&(a[i]>max))
max=a[i];
}

return max;
}
Sửa/Xóa bài viết

Phản hồi 9:

Cam on ban rat nhieu .Minh se rut kinh nghiem.Hehehehehe.

Phản hồi 10:

Em thấy ý của pete97 đầy đủ rồi

"biến này phải là số âm nhỏ nhất trong khoảng xác định"

Ta hoàn toàn có thể lấy giá trị đầu tiên là số âm nhỏ nhất mà biến đó có thể biểu diễn được ví dụ :-32768 đối với int. Duyệt qua từng phần tử :
+ Kiểm tra xem có âm hay không
- Nếu có và bằng -32768 thì chọn luôn làm số nhỏ nhất và thoát
- Nếu có và không bằng thì số ấy cho biến

Phản hồi 11:

@huynguyen : thuật giải của mình chẳng thiếu gì cả ... Đọc lại nhé : 2. Kiểm tra từng phần tử xem có âm hay không chắc chắn phải đưa ra số đầu tiên chứ ( ngoại trừ trường hợp toàn =0 hoặc >0 ) . 3. " Số trước đó " =>cái này phải hiểu là số âm vì đi tìm số âm cơ mà .

Đọc kĩ lại nhé :D .. 5 ý của mình logic với nhau đấy:D

Phản hồi 12:

Mình thử chạy hàm của bạn. nó báo lỗi là cần phải trả về giá trị. bạn có thể fix lại ko
Hàm mình viết là hàm void, đâu có cần trả về giá trị, chắc là bạn đặt kiểu cho hàm là int hay gì đó rồi. Bạn đặt tên hàm thế này: void TimSoAm() là được rồi. Nếu dùng C thì hình như là void TimSoAm(void) thì phải, mình ko có học C nên cũng ko nhớ rõ, còn C++ thì viết void TimSoAm() là đủ rồi.

Phản hồi 13:

Mình tìm số âm lớn nhất trong mảng bằng cách này, các bạn xem code luôn nha

int timsoamlonnhat(int a, int n)
{
int max = 0;
for(int i = 0 ; i < n; i++)
{
if(a[i] < 0)
{
if(a[i] < max || max == 0)
max = a[i];
}
}
return max;
// trả về 0 nếu không có phần tử âm
}

Phản hồi 14:

minh co cach lam bai loai nay don gian hon mot chut.minh se khoi tao hai mang.mang tim so nguyen lon nhat.va mot mang la mang so nguyen am lon nhat.No hoi dai nhung minh nghi dai nhung ma no chat che hon.

Lần sau viết bài có dấu nghen bạn, dùng 2 mảng thì tốn tài nguyên -> giải thuật ko hiệu quả.

Phản hồi 15:

@whitemouse : khi bạn học lập trình nhiều và có kinh nghiệm thì bạn sẽ thấy code càng ngắn xúc tích càng dễ hiểu và dễ sửa chữa hơn >> tiết kiệm bộ nhớ, hiệu quả. Chỉ tách ra trong trường hợp các bài tập lớn chia thành các lớp module mà giải quyết thôi .
Còn bài tập trong topic này thì không có yêu cầu cao cho nên làm như bạn cũng đúng nhưng mà nếu ông thầy chấm điểm thì bạn sẽ không được điểm tối đa đâu :D

Phản hồi 16:

Pete thiếu 1 điều, làm sao xác định số âm đầu tiên để so sánh với các số sau đó, Đây là giải thuật của mình:

Sao lại không nhỉ? Duyệt từ đầu, nếu thấy một số <0 nào đó thì nó sẽ là số âm đầu tiên chứ?. Nếu duyệt đến hết mảng mà chẳng thấy một số <0 nào thì kết luận: "Làm gì có số âm nào mà bảo tìm số âm lớn nhất?? " Hì hì

Phản hồi 17:

minh co cach lam bai loai nay don gian hon mot chut.minh se khoi tao hai mang.mang tim so nguyen lon nhat.va mot mang la mang so nguyen am lon nhat.No hoi dai nhung minh nghi dai nhung ma no chat che hon.

int lonnhat(int a[],int n)
{
int lc=a[0];
for(int i=0;i<n;i++)
if(lc<a[i])
lc=a[i];
return lc;
}
int amlonnhat(int a[],int n)
{
int x=lonnhat(a,n);
for(int i=0;i<n;i++)
if(a[i]==x && a[i]<0)
return lc;
return -1;//truong hop nay la trong mang khong co so am nao lon nhat
}

Phản hồi 18:

* Cách tìm số âm lớn nhất trong mảng :
1. Quét từng phần tử
2. Kiểm tra nó có âm hay không ?
3. Nếu là số âm thì so sánh nó với số trước đó.
4. Sau mỗi lần so sánh gán giá trị vào một biến ( biến này phải là số âm nhỏ nhất trong khoảng xác định )
5. Trả lại giá trị số âm lớn nhất đó.

Pete thiếu 1 điều, làm sao xác định số âm đầu tiên để so sánh với các số sau đó, Đây là giải thuật của mình:
int i = 0, t;
while ((i < n) && (a[i] >= 0)) ++i; //xac dinh so am dau tien
if (i = n) cout <<"Day so ko co so am."; // day ko co so am
else{
t = a[i];
for (int j = i+1; j < n; ++j) //vong lap tim so am lon nhat
if ((a[j] < 0) && (a[j] > t))
t = a[j];
cout <<"So am lon nhat: " <<t;
}

Phản hồi 19:

Tôi thấy ý của Hailoc là tối ưu nhất rồi. Trong việc lập trình người ta gọi đây là kỹ thuật "Lính Canh".

Các phần tử của mảng của bạn có kiểu gì thì nó cũng có giá trị nhỏ nhất của kiểu ấy, chẳng hạn với kiểu int16 là -32767. Khi đó ta dùng 1 biến kiểu long int16 chứa giá trị (mà ta giả vờ là số âm ban đầu) là -32768. Sau đó làm như bình thường, sau một hồi tìm kiếm mải mê suốt từ đầu đến cuối mảng mà giá trị âm lớn nhất vẫn là -32768 thì ta biết rằng không có số âm trong dãy.

Các bác thông cảm, dạo này em lười viết code. Dành cho các bạn mới học C thể hiện ý tưởng để luyện kỹ năng vậy. :D

bài tập c++ về mảng 2 chiều xem chi tiết »

bài tập c++ về mảng 2 chiều, các bạn chỉ giúp??? xem chi tiết »

[c] về mảng 1 chiều xem chi tiết »

bài tập c về mảng và xâu. giúp mình với? xem chi tiết »

bài tập c về mảng xem chi tiết »

bài tập c++ | xác định 1 điểm nằm trong hay ngoài đa giác | kiểm tra số fibonaci??? xem chi tiết »

xin tài liệu về mảng 1 chiều trong c ? xem chi tiết »

bài tập c++ về struct trong quản lý lương. nhờ các bạn tham khảo xem chi tiết »

hàm về mảng 1 chiều: kiểm tra số nguyên tố trong mảng xem chi tiết »

bài tập c về con trỏ:quản lí kho hàng xem chi tiết »

con trỏ trên c | chuyển mảng 1 chiều thành 2 chiều? xem chi tiết »

bài tập c về struct và file: thống kê bán sách! xem chi tiết »

bài tập c về kiểu structure để quản lý đăng ký biển số, chạy không đúng? xem chi tiết »

bài tập c về bài toán tháp hà nội. xem chi tiết »

code về mảng 1 chiều không chạy được xem chi tiết »

bài tập c++ về chuỗi, xử lý một vài phương thức thông dụng xem chi tiết »

bài tập c về liệt kê các phần tử của xâu( kiểu giống hoán vị) xem chi tiết »

một số bài tập c về vòng lặp(mong mọi người giúp đỡ) xem chi tiết »

bài tập c++ về danh sách liên kết. mong anh em cđv giúp đỡ xem chi tiết »

cần giúp bài tập c++ về xâu kí tự xem chi tiết »

cần hướng dẫn về mảng 1 chiều xem chi tiết »

giúp e 1 số bài tập c về số nguyên tố xem chi tiết »

[ solved ]cần giúp giùm về mảng 1 chiều xem chi tiết »

giúp mình bài tập c về sổ địa chỉ cá nhân xem chi tiết »

bài tập c++ về class xem chi tiết »

bài tập c về hàm và mảng xem chi tiết »

lập trình c++ | bài tập c++ về con trỏ. ai có cho mình xin một số bài thực hành? xem chi tiết »

bài tập c về môi trường đô thị. giúp mình với? xem chi tiết »

bài tập c++ về struct. xin được giúp đỡ? xem chi tiết »