bài tập hay về mảng^_^ pó tay!

runandaide

Mr & Ms Pac-Man
Tham gia ngày
12/1/05
Bài viết
103
Reaction score
0
Giúp mình giải quyết bài tập cái hum vừa rồi học không tiếp thu được gì cả
Bái tập 1:
viết chương trình thực hiện các công việc sau:
khai báo mảng có tối đa 50 phần tử nguyên
nhập phần tử cho mảng đến khi nhập số 0 thì dừng
tìm phần tử nhõ nhất trong mảng
xoá giá trị có giá trị là k nhập từ bàn phím
sắp xếp phần tử tăng dần


bài tập 2:(bài tập nâng cao)
viết chương trình thực hiện
khai báo mảng 2 chiều có kiểu số nguyên
nhập số hàng ,số cột của mảng
phát sinh các số ngẫu nhiên trong khoảng tứ 1 đến 20,gán giá trị cho các phần tử của mảng
sắp xếp mảng theo thứ tự tăng dần ở từng hàng
khai báo mảng 1 chiều có kiểu dữ liệu số nguyên,hãy tiến hành đổ mảng 2 chiều trên vào mảng 1 chiều nơi khai báo
Gợi ý:
Phát sinh số ngẫu nhien sử dụng hàm random thư viện<stdlib.h>
mang[j]=random(20)+1;
hàm random tổng quát như sau:
random(n):phat sinh số ngẫu nhiên từ 0 đến n vì vậy muốn phát sinh số ngẫu nhiện từ k đến n thì viết như sau random(n)+k;
gợi ý:
k=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
Bước[k]=a[j]
K++;
}
 
Giúp mình giải quyết bài tập cái hum vừa rồi học không tiếp thu được gì cả
Bái tập 1:
viết chương trình thực hiện các công việc sau:
khai báo mảng có tối đa 50 phần tử nguyên
nhập phần tử cho mảng đến khi nhập số 0 thì dừng
tìm phần tử nhõ nhất trong mảng
xoá giá trị có giá trị là k nhập từ bàn phím
sắp xếp phần tử tăng dần


bài tập 2:(bài tập nâng cao)
viết chương trình thực hiện
khai báo mảng 2 chiều có kiểu số nguyên
nhập số hàng ,số cột của mảng
phát sinh các số ngẫu nhiên trong khoảng tứ 1 đến 20,gán giá trị cho các phần tử của mảng
sắp xếp mảng theo thứ tự tăng dần ở từng hàng
khai báo mảng 1 chiều có kiểu dữ liệu số nguyên,hãy tiến hành đổ mảng 2 chiều trên vào mảng 1 chiều nơi khai báo
Gợi ý:
Phát sinh số ngẫu nhien sử dụng hàm random thư viện<stdlib.h>
mang[j]=random(20)+1;
hàm random tổng quát như sau:
random(n):phat sinh số ngẫu nhiên từ 0 đến n vì vậy muốn phát sinh số ngẫu nhiện từ k đến n thì viết như sau random(n)+k;
gợi ý:
k=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
Bước[k]=a[j]
K++;
}


Đề bài thứ 2 của bạn mình ko hiểu lắm
_Nếu là phát sinh số ngẫu nhiên rồi là ngẫu nhiên thôi chứ sao lại có ngẫu nhiên từ k đến n ???
Thông thường thì nếu bài yêu cầu lấy số tự nhiên VD cho mảng có 50 phần tử thì nên random(500) nếu lấy = 50 thì sẽ có một số bị trùng nhau
_Còn đổ từ 2 mảng vào 1 mảng thì có quy luật gì ko ?
Đổ xen kẽ vào chẳng hạn ???

Còn cách giải cho xếp thứ tự tăng dần cho 1 hàng là :
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[j]<a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
//Bạn nhớ chú ý là toán tử gán = là gán từ phải sang trái chứ ko viết lung tung được đâu
}
}
 
Nhác đọc đề quá nên đem về nhà làm thử xem sao?
Có gì mai or mốt post lên cho hén !
 
phát sinh số ngẫu nhiên từ k đến n giống như kiểu chọn một số ngẫu nhiên giữa 5 và 10 thôi mà có gì đâu mà k0 hiểu :-?
các ngôn ngữ lập trình thường thì nó mặc định tạo ra một số ngẫu nhiên giữa 0 và một số n, nếu muốn tạo ra số ngẫu nhiên giữa k và n thì viết code cho chương trình tạo ra một loạt các số ngẫu nhiên từ 0 tới n-k rồi cộng k vào tất cả các số vừa được tạo ra là xong, nếu viết random(n)+k thì chương trình tự động làm việc này cho mình
mà lập trình = ngôn ngữ gì vậy nói ra mới viết code đc chứ +_____+
 
Dùng C !

Tớ làm đến đoạn xóa phần tử thì chịu (đoạn này lâu roài quên mất cách xóa)
Đoạn code sắp xếp nổi bọt thì chưa thuộc +_+ !
 
code C thì chưa học bao giờ nhưng mà thuật toán thì chắc cũng làm được :\
muốn xóa phần tử thì check xem phần tử nào có giá trị = k thì loại nó ra, đồng thời dồn các phần tử đứng sau phần tử đó xuống 1 bậc để cho mảng không có giá trị = null.
chắc là bài tập bắt làm như thế
 
Code bên C thì tui ngại nhất là chạy 1 lúc 2 cái lặp và vòng lặp lồng nhau ko biết có 2 cái đó trong này ko nữa +_ + !
 
Code bên C thì tui ngại nhất là chạy 1 lúc 2 cái lặp và vòng lặp lồng nhau ko biết có 2 cái đó trong này ko nữa +_ + !
mảng 2 chiều chắc chắn phải có vòng lặp lồng nhau còn gì nữa :))
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(a[j]<a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
//Bạn nhớ chú ý là toán tử gán = là gán từ phải sang trái chứ ko viết lung tung được đâu
}
}
trong đoạn này thì n là gì và m là gì thế '______'
muốn sắp xếp thì có 1 cách khác là chạy qua mảng 1 vòng, đếm xem từng phần tử có bao nhiêu phần tử khác nhỏ hơn phần tử này. số phần tử nhỏ hơn sẽ chính là số thứ tự của phần tử này, hồi trước hay dùng cách sắp xếp này
 
Ko rõ lắm thuật toán sắp xếp nổi bật nhất là nổi bọt => hình như ko phải đoạn code này !
 
thuật toán nổi bọt là bạn cho j chạy từ i .Tức là cho j=i
for(int j=i;j<=m,j++) khi đó số vòng lặp của bạn phải chạy ít hơn ...
còn bài 2 này không khác bài 1 là bao nhiêu
đối với bài 1 thì hai vòng với i,j<=n
còn bài 2 là i<=n và j<=m
còn giá trị bất kì chắc là tùy mình thôi
chủ yếu là sắp xếp dc .
 
tức là chỉ vòng lặp khác nhau thôi còn thân thì vẫn thế này à :\
if(a[j]<a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
 
Cái thân đó là đổi chỗ 2 giá trị a và a[j] cho nhau thôi, mà hoán vị a[j] và a[j+1] thì làm được gì cho đời +_+, biến i chạy từ 1->n-1, còn biến j chạy từ i->n được rồi. thích viết kiểu nào cũng được mà, có thể viết:
if(a<a[j])
{
a=a+a[j];
a[j]=a-a[j];
a=a-a[j];
}
Không dùng thêm tham số temp.
Mình khuyên các bạn nên dùng thuật toán Quick sort cho tất cả mọi bài toán, nó nhanh hơn nhiều so sới Bubble sort( gần như là nhanh nhất trong các thuật toán sắp xếp), mà thuật toán của nó cũng đơn giản, viết rất trực quan.
 
nếu lớn hơn thì đổi chỗ :\ sao k0 làm đc gì
chỉ tội cái cách đấy thì chạy nhiều lần quá thôi ++
thuật toán quick sort nó như thế nào '______'
 
bài tập 1:

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

void main()
{
int mang[50];
int i,j,n,min,k,thutu;
printf("nhap phan tu cho mang a:");
for(i=0;i<10;i++)
{printf("a[%d]=",i);
scanf("%d",&mang);
if(mang==0)break;
}n=i;//n luu tru so luong phan tu co trong mang
min=mang[0];
for(i=1;i<n;i++)

{ if(mang<min)
min=mang;}
printf("\n min=%d",min);
printf("\nmoi ban nhap k:");
scanf("%d",&k);
//xoa
for(i=0;i<n;i++)
if(mang==k)
{for(j=i;j<n;j++)
mang[j]=mang[j+1];
n--;}
//in lai mng khi xo k
printf("\nmang khi da xo phan tu trung k:");
for(i=0;i<n;i++)
printf("\n%d",mang);
// sap xep thu tu
for(i=n-1;i>0;i--)
for(j=0;j<i;j++)
{ if(mang[j]>mang[j+1])
{
thutu=mang[j];
mang[j]=mang[j+1];
mang[j+1]=thutu;
}

}
printf("\nthu tu tang dan cu mang:");
for(i=0;i<n;i++)
printf("%3d",mang);



getch();
}

các ban xem bài mình làm đúng kô,nếu bài mình còn thíu gì thì xin các pác giúp xíu
thuật toán quick sỏt nó như thế nào vậy
ai có thể giải = cách khác được thì pót lên cho mọi người xem thử
 
Bạn đặt code trong thẻ PHP đi (lúc copy) sẽ thấy dễ dàng để fix lỗi hơn !
Quick Sort là sắp xếp như thế nào?
 
sặc, Quick sort mà ko biết à ^^, sắp xếp có nhiều thuật toán như bubble sort (sắp xếp nổi bọt) <-cái này nhiều người xài, selection sort, shell sort, merge sort, quick sort.v.v.trong đó thuật toán quick sort là tương đối nhanh nhất, nhanh rất nhiều so với bubble sort bình thường, để bữa sau mình post thuật toán cho, hôm nay post hàm sắp xếp thôi.
Mã:
void quicksort(int a[],int l,int r)
{
     int i,j,x,y;
     i=l;
     j=r;
     x=a[(l+r)/2];
     do
     {
          while (a[i]<x)
               i=i+1;
          while (x<a[j])
               j=j-1;
          if (i<=j)
          {
               y=a[i];
               a[i]=a[j];
               a[j]=y;
               i=i+1;
               j=j-1;
          }
      } while (i>j);
      if (l<j)
           quicksort(a,l,j);
      if (i<r)
           quicksort(a,i,r);
}
đầu chương trình gọi hàm quicksort(a,1,n) (n là số phần tử của mảng).
Chạy thử với các input có từ 10.000 trở lên mới thấy sự khác biệt tốc độ của thuật toán quicksort và bubble sort và một số thuật toán khác ^^.
 
chắc phải ngồi đợi giải thích thuật toán thôi :))
ngồi đọc hiểu không nổi :))
 
Quicksort( thuật toán sắp xếp phân đoạn) là một phương pháp sắp xếp tốt nhật, nghĩa là dù dãy khóa thuộc kiểu dữ liệu có thứ tự nào, quicksort cũng có thể sắp xếp được mà không có một thuật toán sắp xếp nào nhanh hơn quicksort về mặt tốc độ trung bình. Người sáng lập ra nó là C.A.R Hoare.
Ý tưởng chủ đạo của phương pháp này có thể tóm tắt như sau: Sắp xếp dãy khóa k1,k2...kn thì có thể coi là sắp xếp đoạn từ chỉ số 1 tới chỉ số n trong dãy khóa đó. Để sắp xếp một đoạn trong dãy khóa, nếu đoạn đó có <=1 phần tử thì không cần phải làm gì cả, còn nếu dona59 đó có ít nhất 2 phần tử, ta chọn một khóa ngẫu nhiên của đoạn đó làm "chốt". Mọi khóa nhỏ hơn khóa chốt được xếp vào vị trí đúng trước chốt, mọi khóa lớn hơn khóa chốt được xếp vào vị trí đứng sau chốt. Sau phép hoán chuyển như vậy thì đoạn đang xét được chia thành 2 đoạn khác rỗng mà mọi khóa trong đoạn đầu đều <=chốt và mọi khóa trong đoạn sau đều >=chốt. Hay nói cách khác: Mỗi khóa trong đoạn đầu đều <=mọi khóa trong đoạn sau. Và vấn đề trở thành sắp xếp 2 đoạn mới tạo ra bằng phương pháp tương tự(đệ qui lại) có độ dài nhỏ hơn đoạn ban đầu.
Độ nhanh thuật toán đã được test với các thuật toán sắp xếp Shell sort, Heap sort, insertion sort, distribution counting sort, exchage radixsort, straight radixsort, merge sort, Bubble sort.
 
nếu dùng cách xếp mà thì làm thế nào để biết lúc dừng :-?
 
Hay thật cách code cũng khó hơn Burble sort => chịu khó đọc kĩ lại vậy +_+ !
 
Back
Top