PDA

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



runandaide
18-11-2006, 15:05
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[i][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[i][j]
K++;
}

Hoabomby
18-11-2006, 17:58
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[i][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[i][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
}
}

red_strike
20-11-2006, 12:10
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 !

Xenogear
21-11-2006, 16:22
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ứ +_____+

red_strike
21-11-2006, 18:31
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 +_+ !

Xenogear
21-11-2006, 20:30
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ế

red_strike
22-11-2006, 17:11
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 +_ + !

Xenogear
22-11-2006, 23:25
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

red_strike
23-11-2006, 13:06
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 !

nothing_forever
23-11-2006, 15:55
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 .

Xenogear
23-11-2006, 16:47
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;
}

tomorrowneverdies
23-11-2006, 20:24
Cái thân đó là đổi chỗ 2 giá trị a[i] 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[i]<a[j])
{
a[i]=a[i]+a[j];
a[j]=a[i]-a[j];
a[i]=a[i]-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.

Xenogear
24-11-2006, 04:20
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 '______'

runandaide
24-11-2006, 08:11
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[i]);
if(mang[i]==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[i]<min)
min=mang[i];}
printf("\n min=%d",min);
printf("\nmoi ban nhap k:");
scanf("%d",&k);
//xoa
for(i=0;i<n;i++)
if(mang[i]==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[i]);
// 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[i]);



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ử

red_strike
24-11-2006, 16:50
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?

tomorrowneverdies
24-11-2006, 18:19
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.


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 ^^.

Xenogear
25-11-2006, 05:39
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 :))

tomorrowneverdies
25-11-2006, 08:53
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.

Xenogear
25-11-2006, 11:25
nếu dùng cách xếp mà thì làm thế nào để biết lúc dừng :-?

red_strike
25-11-2006, 14:28
Hay thật cách code cũng khó hơn Burble sort => chịu khó đọc kĩ lại vậy +_+ !

tomorrowneverdies
25-11-2006, 14:38
Dĩ nhiên là code khó hơn Bubble sort rồi, dễ hơn chắc ai cũng áp dụng, thường trong pascal có phần Examples sẽ có code của Quicksort viết sẵn, paste ra sử dụng thôi ^^, những thuật toán cao yêu cầu tốc độ chạy nhanh thì những thuật toán nhỏ này phải làm cho tốt ^^.
exchage radixsort với straight radixsort cũng rất nhanh, nhưng khá phức tạp, khó code, cái Quick sort là dễ code lắm rồi đó, chạy lại cực nhanh.
Nếu ai xử lý trên file ngoài thì dùng thuật toán sắp xếp vun đống, sắp xếp ngoài merge sort, rất là tốt ^^.
Thuật toán sắp xếp rất là nhiều, tìm kiếm cũng vậy, quan trọng là biết cách sử dụng và phát huy 1 cách hiệu quả các thuật toán đó thôi, dù gì đây cũng là những thuật toán nền, hầu như các bài toán đều sử dụng tới nó.

jumper
26-11-2006, 01:44
mấy bài này dễ òm à
chưa học c chưa biết
chứ pascal có mấy dòng T_T

red_strike
26-11-2006, 12:13
tomorrowneverdies - tên dài quá chẳng biết gọi tắt :D học những thứ này qua .... ???
Có thể trợ giúp RS vài điều về lập trình ko !

Xenogear
27-11-2006, 02:21
gọi tắt là tò mò =))
mấy thứ này đh năm thứ nhất học về lập trình hoặc học chung về máy tính là có mà :\

tomorrowneverdies
27-11-2006, 17:29
Em mới vào năm nhất học được mấy tuần "anh Xeno" :'>, cái này em học ở nhà á ^^. Thấy lập trình lên dạy thuật toán cơ bản là chính, còn chủ yếu mình ở nhà học nâng cao lên thôi, như vậy thấy hiệu quả hơn nhiều, học trên trường sao đủ thời gian tìm hiểu sâu +_+.

Xenogear
28-11-2006, 01:26
thì cũng mới đh năm thứ nhất mấy tuần chứ đâu :'>
căn bản mới vào học mà cố thể hiện khả năng là mấy bố cho điểm thấp tẹt vì k0 làm đúng theo chỉ dẫn ngay =))
thế nên cứ phải ... dạy gì thì biết nấy thôi =))

tomorrowneverdies
28-11-2006, 17:36
Chính xác, mới vào mà lộn xộn bon chen là tổ chức cho về với chúa ngay, mà thật ra mình đâu có biết gì nhỉ :'>, giờ nói thật quên hết thuật toán rồi, muốn làm lại phải coi lại chút mới làm được >"<.

Xenogear
29-11-2006, 02:46
http://upload.wikimedia.org/wikipedia/en/6/6a/Sorting_quicksort_anim.gif
hình mô tả quicksort :)) nhìn dễ hiểu hơn giải thích
chọn điểm bất kỳ, xếp tất cả các phần tử nhỏ hơn xuống mảng dưới, lớn hơn lên trên, tiếp tục làm đến khi nào mỗi mảng con chỉ có một phần tử thì thôi
đúng k0 nhỉ :-?

red_strike
29-11-2006, 16:15
Tấm ảnh GIF ở trên good thật ?
Có thể mô tả bằng lời rõ hơn ko ? +_+ em dốt quá !

Xenogear
29-11-2006, 16:30
theo tớ hiểu thì thế này:
thuật toán quicksort nó sắp xếp các phần tử trong 1 mảng bằng cách chọn 1 phần tử ngẫu nhiên làm phần tử gốc (trong hình nó chọn phần tử cuối cùng của mảng), rồi sắp tất cả các phần tử nhỏ hơn phần tử này vào một mảng phía dưới, các phần tử lớn hơn vào một mảng trên
rồi có 2 mảng rồi tiếp tục làm thế với từng mảng cho đến khi mỗi mảng chỉ còn một phần tử thì thôi
cái ảnh gif nó diễn tả cái này bằng lời, cái xọc nằm ngang chính là giá trị của phần tử đc chọn trong mảng
đang tìm hiểu mergesort ><
vẫn chưa hiểu được thuật toán của nó

red_strike
29-11-2006, 17:14
Bro ơi !
Dùng bảng mã Unicode chuẩn đi chứ Unicode của huynh viết chữ ra dấu lộn xộn lắm !
Có thể làm tấm ảnh này chậm lại 1 chút ko +_+ !

Xenogear
29-11-2006, 17:32
http://i3.photobucket.com/albums/y59/vvthanh/quicksort.gif
hình chậm lại rồi đấy,
để ý nhìn kỹ thì sẽ thấy thuật toán của nó
còn cái vụ dấu thì ... quen dùng unicode tổ hợp đâm ra nó thế =)) để chỉnh lại

Brianlam
29-11-2006, 21:17
Nếu mà quick sort hay nói chung cái gì sort cũng được (bao gồm cả quần sort luôn :D ) thì tui nghĩ mấy bác cứ kiếm thử cái giáo trì CTDL 1 của trường đại học nào đó , đọc vào là ok ngay mà

runandaide
29-11-2006, 21:22
Code:
chậc có toàn pro cho em bon chen zô kiếm ít kiến thức nha
có 1 bài tap

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void main()
{
int mang[10][10];
int i,j,n,m;
int max,min,tong,dem;
char kitu;

//tao bang 2 chieu nhap so hang so cot

do{
clrscr();
do{
printf("\nmoi ban nhap so hang:");
scanf("%d",&n);
printf("moi ban nhap so cot:");
scanf("%d",&m);
}while(n>10||n<3||m>10||m<3);

printf("cac phan tu ngau nhien trong mang:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
mang[i][j]=random(100)+1;
printf("a[%d][%d]=%d\t",i,j,mang[i][j]);


}
printf("\ncac gia tri co trong matrix:\n");
for(i=0;i<n;i++)
{for(j=0;j<m;j++)

printf("%4d",mang[i][j]);
printf("\n") ;}



//tim phan tu lon nhat
printf("\nphan tu lon nhat trong mang:");
int imax;
int jmax;
max=mang[0][0];
for( i=0;i<n;i++)
for( j=0;j<m;j++)
{
if(mang[i][j]>max)
{
max=mang[i][j];
imax=i;
jmax=j;
}
}
printf("a[%d][%d]=%d",imax,jmax,max);

//tim phan tu nho nhat
printf("\nphan tu nho nhat trong mang:");
int imin;
int jmin;
min=mang[0][0];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(mang[i][j]<min)
{ min=mang[i][j];
imin=i;
jmin=j;
}
}

printf("a[%d][%d]=%d",imin,jmin,min);

//tong cac phan tu trong ma tran
printf("\ntong cac phan tu trong matrix:");
tong=0 ;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
tong+=mang[i][j];//tong=tong+mang[i][j]

}
printf("=%d",tong);

//in ra cac phan tu tren duong cheo cua matrix

//in ra cac phan tu tren duong cheo trai>>phai tu tren xuong cua matrix
int tongcheo=0;
printf("\n cac phan tu tren duong cheo trai cua matrix:");
for(i=0;i<n;i++)
{
printf("\na[%d][%d]=%d\t",i,i,mang[i][i]);
}
printf("tong cua chung=");

for(i=0;i<n;i++)
{ tongcheo+=mang[i][i];

}
printf("=%d",tongcheo);

//in ra cac phan tu tren duong cheo phai>>trai tu tren xuong cua matrix

int tongcheo2=0;
printf("\n cac phan tu tren duong cheo phai cua matrix:");
for(i=0,j=m-1;i<n,j>=0;i++,j--)
{
printf("\na[%d][%d]=%d\t",i,j,mang[i][j]);
}
printf("tong cua chung=");

for(i=0,j=m-1;i<n,j>=0;i++,j--)
{ tongcheo2+=mang[i][j];

}
printf("=%d",tongcheo2);

//in cac phan tu chan
printf("\ncac phan tu chan trong matrix:");

for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(mang[i][j]%2==0)

printf("%4d",mang[i][j]);
}

//in cac phan tu le
printf("\n") ;
printf("\ncac phan tu le trong matrix:");

for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(mang[i][j]%2!=0)

printf("%4d",mang[i][j]);
}

//in cac giat tri xuat hien trong ma tran trong ma tran
int mangtam[100],t=0;
int kiemtra=1;

mangtam[0]=mang[0][0];
printf("\n") ;
printf("\ncac gia tri trong matrix:");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
mangtam[t]=mang[i][j];
t++;
}
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{ kiemtra=1;
for(t=1;t<i*n+j;t++)
if(mang[i][j]==mangtam[t])
{ kiemtra=0;
break;
}
if(kiemtra==1)
printf("%3d",mang[i][j]);

}
//ban co muon thoat chuong trinh ko
printf("\nban co muon lap lai truong trinh ko (y/n):");
kitu=getche();
if(kitu=='n'||kitu=='N')
exit(0);

}while(kitu=='y'||kitu=='Y');

getch();
}
giải thich lai cho em đoạn này được kô bà cô có giải thích rồi mà kó hiểu qá giờ quên mất tiêu làm lai với 1 bài khác thì kô mỡ công thức kô được vì quên mất thuật toán


//in cac giat tri xuat hien trong ma tran trong ma tran
int mangtam[100],t=0;
int kiemtra=1;

mangtam[0]=mang[0][0];
printf("\n") ;
printf("\ncac gia tri trong matrix:");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
mangtam[t]=mang[i][j];
t++;
}
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{ kiemtra=1;
for(t=1;t<i*n+j;t++)
if(mang[i][j]==mangtam[t])
{ kiemtra=0;
break;
}
if(kiemtra==1)
printf("%3d",mang[i][j]);

}

và còn bài nữaynếu muốn cho gái trị k vào vi trí đầu của mảng (man[0]) ta phải làm sao (bày thuật toán thôi nha để em tự làm) giai thích thuật toán luôn nha

Xenogear
29-11-2006, 21:25
sort với search quan trọng vì nó cần phải truy cập dữ liệu trong ổ cứng, mất thời gian nên càng dùng thuật toán có hiệu suất cao càng được lợi, dùng thuật toán dở hơi thì kể cả máy trâu bò chỉ cần sort 1 list có khoảng 1 triệu người thôi cũng mất cả năm vì thuật toán kém thường số lệnh nó tăng theo cấp số nhân, k0 cẩn thận thì bốc muối

//in cac giat tri xuat hien trong ma tran trong ma tran
int mangtam[100],t=0;
int kiemtra=1;

mangtam[0]=mang[0][0];
printf("\n") ;
printf("\ncac gia tri trong matrix:");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
mangtam[t]=mang[i][j];
t++;
}
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{ kiemtra=1;
for(t=1;t<i*n+j;t++)
if(mang[i][j]==mangtam[t])
{ kiemtra=0;
break;
}
if(kiemtra==1)
printf("%3d",mang[i][j]);

}
cái này là thuật toán dùng để in ra các phần tử trong mảng, kiểm tra các phần tử xem có trùng nhau không, tránh trường hợp in ra 2 giá trị giống nhau.
có mảng mangtam để chứa các phần tử trong mang 2 chiều để sau đó so sánh
nhưng mà cách này không cần thiết, nếu muốn thì so sánh một phần tử của mảng 2 chiều trực tiếp với các phần tử khác cũng được
đoạn code này "t=1;t<i*n+j;t++" là để tiết kiệm lệnh, chứ nếu để "t=1;t<100;t++" thì chương trình vẫn chạy được.
nếu muốn cho giá trị k vào đầu mảng thì 1 cách làm là dùng 1 loop để tăng tất cả các vị trí của phần tử lên 1 vd: phần tử [0] sẽ thành phần tử [1], phần tử [10] sẽ thành phần tử [11], sau đó gán giá trị k cho phần tử [0] lúc này đang rỗng
thế là xong ::)

red_strike
30-11-2006, 11:26
Nhưng mà RS thấy cái kiểm tra xem phần tử nào có giá trị nào trùng nhau ko để in ko bị trùng là ko cần thiết và cũng chẳng cần thiết !

vì trên thực tế trong nhiều người chí ít cũng có 1 vài info giống nhau => trùng ko in ra sao :D

Xenogear
30-11-2006, 11:45
có thể đấy là đầu bài bắt phải làm, cần thiết hay k0 đầu bài bảo cấm cãi =))
với cả các giá trị trong ma trận toàn là số, trùng nhau in ra cũng thừa

runandaide
30-11-2006, 14:08
chậc! đề bài bão in ra các giá trị trong mang thì nếu trùng nhau thì in 1 làn thôi chứ nhỡ có 10 giá trị trùng nhau thì in raq cả 10 à vậy thì sẽ dài dòng qá
^_^
còn chèn phần tử k nói thì hiểu nhưng mà chưa thử được ko bít phải thế này kô
{
a[i]=a[i+1];
k=a[0];
}
như thế này hả hay thêm vào biến đếm chưa thử à chỉ viết theo cảm nghĩ

Xenogear
30-11-2006, 14:17
tất nhiên là phải có 1 vòng lặp ở bên ngoài
và cái đoạn "k=a[0]" sai rồi
cái đấy phải để ra ngoài vòng lặp, thực ra để trong cũng được nhưng mỗi lần nó chạy là lại gán giá trị của k một lần <<-- phí phạm
với cả phải là a[0]=k chứ k0 phải k=a[0]

runandaide
30-11-2006, 14:31
^_^ tk bác để em về thữ
còn muốn trong ma phương vuông a[3][3] muốn sắp xếp số từ 1 dến 9 sao cho tong hàng ngang =15 hàng dọc=15 chéo =15 thì dieu kien của nó viết như thế nào cái bày cho em thêm ví dụ minh họa nha

Xenogear
30-11-2006, 15:02
bài toán đấy có thể giải bằng cách đặt giá trị các phần từ lần lượt là x1,x2,x3,y1,y2,y3,z1,z2,z3 như hình dưới

x1 | x2 | x3 = 15
------------
y1 | y2 | y3 = 15
------------
z1 | z2 | z3 = 15
=
15 15 15

và các hàng chéo bằng 15, tổng của x1+x2+x3+...+z2+z3 = 9(9+1)/2 = 45
9 ẩn 9 phương trình, giải trên máy tính thì giải bằng phương pháp khử đảm bảo ra kết quả =))