Hiển thị các bài đăng có nhãn Mảng 1 chiều. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Mảng 1 chiều. Hiển thị tất cả bài đăng

Thứ Năm, 24 tháng 5, 2012

Kiểm tra số chính phương trong mảng 1 chiều

Trước hết, chúng ta sẽ tìm hiểu khái niệm về số chính phương. Số chính phương là gì? Số chính phương là một số mà tự nó là căn bậc hai của một số tự nhiên khác, hay nói rõ hơn thì số chính phương là bình phương của một số tự nhiên.
Ví dụ: 289 là một số chính phương vì 289 = 17 bình phương.

Thuật toán Pascal dưới đây sẽ giúp tìm số chính phương trong mảng 1 chiều.

  uses crt;
  type ArrInt = array[1..250] of integer;  
  Var n,i,x : integer;
         a: ArrInt;
  BEGIN
   clrscr;
   write('Nhap so phan tu: ');
   readln(n);
   for i:=1 to n do
   begin
     write('Phan tu thu ',i,'= ');
     readln(a[i]);
   end;
   writeln('Cac so chinh phuong co trong mang:');
   for i:=1 to n do
   begin
    x:=trunc(sqrt(a[i]));
     if sqr(x)=a[i] then
       write(a[i]:4);
   end;
   readln;
  END.  

Trong đó lệnh hàm sqrt để lấy căn và hàm trunc để lấy phần nguyên.

Thứ Bảy, 28 tháng 4, 2012

In ra màn hình pascal phần tử có dạng '3 mũ k cộng 2'

Viết chương trình nhập mảng 1 chiều có N phần tử. In ra màn hình các phần tử có dạng 3k+2 (k=0,1,2,3...).
Ý tưởng: Viết hàm kiểm tra xem phần tử a[i] có dạng 3^k+2 hay không.


uses crt;
var b,j,i,x:integer;
a:array[1..100] of integer;


Function gt(k:integer):longint;
 var j:integer;s:longint;
  begin
s:=1;
     for j:=1 to k do
           s:=s*3;
gt:=s;
end;

{-------------------------------------}

Function kt(x:integer):boolean;
 var i,j,k:integer;s:longint;
  begin
kt:=false;

s:=1;
k:=0;

 Repeat
  inc(k);
gt(k);

Until gt(k)>=x-2;
if gt(k)=x-2 then kt:=true;
end;

{---------------------------------}

begin
 clrscr;
     Write('Nhap so phan tu= ');readln(x);
     For i:=1 to x do begin
      write('a[',i,']= ');
      readln(a[i]);
       end;
 For i:=1 to x do
   if kt(a[i]) then write(a[i],' ');writeln;
   readln
   end.

Thứ Ba, 24 tháng 4, 2012

Xóa các phần tử trùng nhau trong mảng 1 chiều (pascal)

Nhập vào mảng 1 chiều gồm 1 dãy số nguyên N phần tử. Hãy xóa các phần tử trùng nhau trong mảng và in kết quả ra màn hình. Ý tưởng: Duyệt mảng 1 chiều bằng 2 biến, nếu phát phát hiện phần tử nào trùng thì xóa phần tử ấy ra khỏi mảng.


Program Bo_so_trung;
   Const
      Max=100;
   Var
   a:Array[1..Max] Of Integer;
   i,j,k,n:Integer;
Begin
   Writeln('XOA BO CAC SO TRUNG NHAU');
   Writeln('------------------------');
   Writeln;
   Write('-Nhap so phan tu mang: ');
   Readln(n);
   For i:=1 To N Do
      Begin
         Write('-Phan tu A[',i,']= ');
         Readln(a[i]);
      End;
   i:=2;
   While i <= N Do
      Begin
         j:=1;
         While a[j] <> a[i] Do
            j:=j+1;
         If j < i Then
            Begin
               For k:=i to n-1 Do
                  a[k]:= a[k+1];
               n:=n-1;
            End
         Else
            i:=i+1;
      End;
   Writeln;
   Write('-Mang con lai: ');
   For i:=1 to n Do
      Write(a[i]:8);
   Writeln;
   Writeln('   Bam phim <Enter> de ket thuc ');
   Readln
End.

Thứ Năm, 19 tháng 4, 2012

Xóa 1 phần tử trong mảng 1 chiều

Viết CT nhập từ bàn phím mảng 1 chiều và xóa 1 phần tử của mảng có n phần tử.

var
  n,i,q,k,p:integer;
  a,b:array [1..1000] of integer;
begin
  write('n= ');readln(n);
  for i:=1 to n do
    begin
      write('a[',i,']= ');
      readln(a[i]);
    end;
  write('Xoa pt co vi tri la: ');readln(p);
  q:=0;
  for i:=1 to n do
    if q<>p then
      begin
        inc(q);
        b[q]:=a[i];
      end;
  writeln('Mang sau khi xoa la: ');
  for i:=1 to q do
    write(b[i],' ');
  readln
end.

Nhập thêm 1 phần tử vào mảng 1 chiều

Viết chương trình nhập vào một mảng A gồm N số nguyên và nhập thêm vào một số nguyên X.

var
  n,i,q,k,p,:integer;
  a,b:array [1..1000] of integer;
begin
  write('n= ');readln(n);
  for i:=1 to n do
    begin
      write('a[',i,']= ');
      readln(a[i]);
    end;
  write('-Chen pt va vi tri cua pt do: ');readln(k,p);
  q:=0;
  for i:=1 to n do
    begin
    inc(q);
    if q=p then begin
      b[q]:=k;
      inc(q);
    end;
    b[q]:=a[i];
  end;
  writeln('-Mang sau khi chen la: ');
  for i:=1 to q do
    write(b[i],' ');
  readln
end.

Tìm các số mà tổng bình phương bằng chính nó

Đề bài: Cho dãy a1, a2, a3....a100 là dãy số nguyên gồm 4 chữ số có nghĩa. Đưa ra màn hình tất cả các số thỏa mãn điều kiện tổng bình phương các chữ số của nó bằng chính nó.


USES crt;
VAR a:ARRAY[1..100] OF INTEGER;
    n,m,i,j,h,k,l:INTEGER;
BEGIN    
    clrscr;
    FOR i:=1 TO 100 DO
    BEGIN
        a[i]:=random(8999)+1000;
    END;  
    writeln('Cac so ma tong binh phuong cac chu so bang no la:');
    FOR i:=1 TO 100 DO
    BEGIN
        m:=a[i] MOD 10;
        n:=a[i] DIV 1000;
        h:=(a[i] DIV 100)-n*10;
        l:=((a[i] MOD 100)-m) DIV 10;
        IF (a[i]= m*m+n*n+h*h+l*l) THEN write(a[i],',');
    END;
    readln      
END.

Thứ Hai, 16 tháng 4, 2012

Tìm bội chung nhỏ nhất của N số (ví dụ: mảng 1 chiều)

Như trong bài viết Tìm UCLN và BCNN đã trình bày cách tìm tuy nhiên chỉ áp dụng với trường hợp 2 số. Bài toán ra là tìm BCNN của mảng 1 chiều, vậy sẽ phải viết chương trình như thế nào?

Bội số chung nhỏ nhất (The Least Common Multiple hay Lowest Common Multiple) của một nhóm các số nguyên, gọi tắt là LCM, là số nhỏ nhất mà có thể chia hết cho tất cả các số đó. Có nhiều giải pháp để tìm LCM của hai số nguyên, một trong những giải pháp dễ dàng nhất là dùng thuật giải Euclid. Cho hai số nguyên a và b, chúng ta có công thức LCM(a, b) = (a x b) / GCD(a, b). Như vậy quá trình tính toán sẽ thông qua các bước sau:
  1. Bước 1. Sử dụng thuật toán Euclid để tìm ước chung lớn nhất GCD (a, b)
  2. Bước 2. Tính giá trị a x b.
  3. Bước 3. Chia kết quả bước 2 cho kết quả bước 1 chúng ta được giá trị LCM cần tìm.
Để tìm LCM của n số chúng ta đầu tiên chọn ra 2 số rồi tính LCM của chúng, sau đó lấy thêm số khác để tính LCM của LCM mới tìm được và số mới chọn ra, cứ như thế cho tới khi nào hết n số. Ví dụ tìm LCM của 2, 3 và 5. Đầu tiên ta tính LCM(2, 3) = 6. Sau đó tìm LCM(6, 5) = 30.

uses crt;
var x, y, i, n, ucln, bcnn: longint;
  a: array[1..100] of integer;
function h_ucln(x,y:integer):integer;
begin
 while x<>y do
  if x>y then
   x:=x-y
  else
   y:=y-x;
 h_ucln:=x;
end;
begin
 clrscr;
 repeat
  write('Nhap N (N>=2): ');
  readln(n);
 until(n>=2);
 for i:=1 to n do
 begin
  write('Phan tu thu ',i,' = ');
  readln(a[i]);
 end;
 ucln:=h_ucln(a[1],a[2]);
 bcnn:=(a[1]*a[2]) div ucln;
 for i:=3 to n do
 begin
  ucln:=h_ucln(bcnn,a[i]);
  bcnn:=(bcnn*a[i]) div ucln;
 end;
 writeln('bcnn la: ',bcnn);
 readln;
end.

Thứ Năm, 12 tháng 4, 2012

Kiểm tra cấp số cộng trong pascal

Nhập dãy số gồm N số nguyên (N<100). Xác định xem đó có phải dãy số có tính chất là cấp số cộng hay không.

uses crt;
  Var
  A:array[1..100] of integer;
  i,n,d: integer;
  CS: boolean;
  BEGIN
  clrscr;
  repeat
  Write(' Nhap vao so nguyen duong N <=100 : ');
  readln(N);
  Until (n>1) and (n<=100);
  For i:=1 to n do
     begin
     repeat
     write('A[',i,'] = ');
     readln(A);
     until abs(A)<=1000;
     end;
     d:=abs(A[2]-A[1]);
     CS:=True;
     For i:=2 to n do
         IF (abs(A-A[i-1])<>d) then  
                                   begin
                                    CS:=False;
                                    break;
                                   end;
     IF CS then writeln('Day la cap so cong ')
           else writeln(' Day ko phai la cap so cong ');
     readln;
  END.

Thứ Ba, 6 tháng 3, 2012

Mảng thay vì kiểu bản ghi

Viết ra File HOSO.TXT bao gồm các thông tin của n HS (thông tin bao gồm STT, Tên và Năm vào học) vs n và thông tin hs nhập từ bàn phím, không cần xếp tên HS theo thứ tự ABC. Sau đó in ra Tên màn hình các HS có năm vào học là 2000.
Yêu cầu: Áp dụng các kiến thức về File, Array... Không sử dụng bản ghi

Uses crt;
Const
  max=100;
Var
  F:Text;
  a:array[1..max] of integer;
  ten:array[1..max] of string;
  n,i:integer;
BEGIN
  Clrscr;
  Write('Nhap so hoc sinh:');
  Readln(n);
  Assign(F,'HOSO.TXT');
  Rewrite(F);
  For i:=1 to n do
    Begin
      Writeln('Nhap thong tin ve hoc sinh thu ',i,':');
      Write('Nhap ten cua hoc sinh thu ',i,':');
      Readln(ten[i]);
      Write('Nhap nam vao hoc cua hoc sinh thu ',i,':');
      Readln(a[i]);
      Writeln;
      Writeln(F,'Hoc sinh thu ',i,', ten la:',ten[i],' vao hoc nam:',a[i]);
    End;
  Close(F);
  Writeln('Danh sach cac hoc sinh vao hoc nam 2000:');
  For i:=1 to n do
    If a[i]=2000 then writeln('Hoc sinh thu ',i,', ten la:',ten[i]);
  Write('Done !');
END.

Thứ Sáu, 24 tháng 2, 2012

Tính tổng chỉ sổ cột hàng chẵn trong mảng 2 chiều

Lập chương trình nhập mảng 2 chiều m hàng n côt. tính và in ra màn hình tổng các phần tử có chỉ số hàng chẵn, chỉ số cột lẹ M, N được nhập từ bàn phím.


Var a:array[1..100,1..100] of integer;
    i,j,m,n:integer;
Begin
  Write('Nhap so hang va cot');readln(m,n);
  For i:=1 to m do
  For j:=1 to n do
  begin
    write('A[',i,',',j,']=');readln(a[i,j]);
  end;
  i:=2;j:=1;
  While i<=m do
  begin
  While j<=n do
   begin
    write('A[',i',',j,']='a[i,j],'   '); j:=j+2;
   end;
  i:=i+2;
  end;
  Readln;
End.

Đảo ngược mảng 1 chiều

Lập chương trình thực hiện đảo ngược mảng số đó.

Var a:array[1..100] of integer;
    n,i:integer;
Begin
  write('Do dai cua mang can nhap?');readln(n);
  For i:=1 to n do
  begin
    write('Phan tu thu ',i,'=?');readln(a[i])
  end;
  writeln('Mang dao nguoc la :');
  For i:=n downto 1 do write(a[i]:5);
  Readln;
End.

Đếm số nguyên tổ trong mảng 1 chiều

Trong bài viết trước, Code Pascal đã giới thiệu cách xác định tính nguyên tố của 1 số được nhập vào từ bàn phím. Mở rộng đề bài ra thành đếm số nguyên tố trong dãy số N được nhập vào từ bàn phím cũng không quá khó.

Có rất nhiều cách để giải bài toán này, cách dưới đây tuy không bám sát vào cách làm trong bài viết Kiểm tra số nguyên tổ trong pascal nhưng cũng khá dễ hiểu.

var i,j,n:Integer;
    A:array[1..50] of Integer;
begin
      write('nhap n:');
      readln(n);
      for i:=1 to n do
      begin
            write('nhap a[',i,'] ');
            readln(a[i]);
      end;
      j:=1;
      for i:=1 to n do
            if a[i]>1 then
            begin
                 repeat
                       inc(j);
                 until (a[i] mod j=0);
                 if j>(a[i] div 2) then inc(d);
                 j:=1;
            end;
      write('Co ',d,' so ngto trog day');
      readln;
end.

Thứ Năm, 23 tháng 2, 2012

Phân loại lứa tuổi

Nhập họ tên và năm sinh của người và cho biết người này thuộc lứa tuổi nào: sơ sinh, nhi đồng, thiếu niên, thanh niên, trung niên, người lớn tuổi. Biết rằng:
+ Sơ sinh tuổi từ 0->0
+ Nhi đồng tuổi từ 2->9
+ Thiếu niên tuổi từ 10->15
+ Thanh niên tuổi 16->32
+ Trung niên tuổi từ 33 -> 50
+ Người già tuổi từ 50 trở lên


uses crt;var
a:array[1..100] of longint;
i,n:longint;
begin
clrscr;
write('nhap so nguoi:');
readln(n);
for i:=1 to n do
begin
write('nhap tuoi cua nguoi thu ',i,':');
readln(a[i]);
end;
for i:=1 to n do
begin
write('nguoi thu',i,':');
case a[i] of
0:writeln('tre so sinh');
2..9:writeln('nhi dong');
10..5:writeln('thieu nien');
16..32:writeln('thanh nien');
33..50:writeln('trung nien');
Else writeln('nguoi gia');
end;
end;
readln;
end. 

Thứ Tư, 22 tháng 2, 2012

Sắp xếp mảng 1 chiều

Viết chương trình nhập vào một mảng gồm N số nguyên. Sắp xếp lại mảng theo thứ tự tăng dần và in kết quả ra màn hình.

Ý tưởng:
Cho biến i chạy từ 1 đến N-1, đồng thời cho biến j chạy từ i+1 đến N: Nếu A[i]>A[j] thì đổi chổ A[i], A[j].

Dưới đây là thuật toán sắp xếp mảng 1 chiều:

Uses Crt;
Type Mang = ARRAY[1..50] Of Integer;
Var A:Mang;
N,i,j,Tam:Integer;
Begin
{Nhập mảng}
Write('Nhap N='); Readln(N);
For i:=1 To N Do
Begin
Write('A[',i,']='); Readln(A[i]);
End;
{Sắp xếp}
For i:=1 To N-1 Do
For j:=i+1 To N Do
If A[i]>A[j] Then
Begin
Tam:=A[i]; A[i]:=A[j]; A[j]:=Tam;
End;
{In kết quả ra màn hình}
Writeln('Ket qua sau khi sap xep:');
For i:=1 To N Do Write(A[i]:5);
Readln;
End.

Tìm giá trị lớn nhất mảng 1 chiều

Đề bài: Viết chương trình tìm giá trị lớn nhất của một mảng chứa các số nguyên gồm N phần tử.

Ý tưởng:
- Cho số lớn nhất là số đầu tiên: Max:=a[1].
- Duyệt qua các phần tử a[i], với i chạy từ 2 tới N: Nếu a[i]>Max thì thay Max:=a[i];

Uses Crt;
Type Mang = ARRAY[1..50] Of Integer;
Var A:Mang;
N,i,Max:Integer;
Begin
Write('Nhap N='); Readln(N);
For i:=1 To N Do
Begin
Write('A[',i,']='); Readln(A[i]);
End;
Max:=A[1];
For i:=2 To N Do
If Max<A[i] Then Max:=A[i];
Writeln('Phan tu lon nhat cua mang:', Max);
Readln;
End.

Thứ Năm, 16 tháng 2, 2012

Tính trung bình cộng các số dương, âm nhập vào từ mảng 1 chiều trong Pascal

Viết chương trình nhập số nguyên N (0 < N ≤ 10 000) và mảng a gồm N số nguyên. Tính và in ra trung bình cộng của các số âm, số dương trong a. Không tính số 0.

Ví dụ : a[] = {1, -6, 0, 3, -1}. Trung bình cộng là -0.75

PROGRAM tbc_am_duong_mang;
USES crt;
VAR a:ARRAY[1..100] OF REAL;
    i,n,x,y:INTEGER;
    tongam,tongduong,tba,tbd:REAL;
BEGIN
    clrscr;
    write('So phan tu cua day n= ');readln(n);
    FOR i:=1 TO n DO
        BEGIN
            write('Nhap phan tu a[',i,']: ');
            readln(a[i]);
        END;
   
    tongam:=0; x:=0;
    FOR i:=1 TO n DO
    IF a[i]<0 THEN
        BEGIN tongam:=tongam+a[i];
              x:=x+1;
        END;
    tba:=tongam/x;
    write('TB cong cac so am la: ',tba:5:1);
   
    writeln;
   
    tongduong:=0; y:=0;
    FOR i:=1 TO n DO
    IF a[i]>0 THEN
        BEGIN tongduong:=tongduong+a[i];
              y:=y+1;
        END;
    tbd:=tongduong/y;
    write('TB cong cac so duong la: ',tbd:5:1);
   
    readln;
END.  

Chủ Nhật, 12 tháng 2, 2012

Bài 4: Mảng trong Pascal

1. Mảng 1 chiều:

- Có thể hiểu nôm na: Mảng 1 chiều là dãy số hữu hạn.
vd: nhiệt độ mỗi ngày trong tuần (tháng/năm), cấp số cộng, cấp số nhân...

- Chỉ số của mảng:
vd: Xét mảng: 10 20 30 5 6 7
là một dãy các số tự nhiên bất kì có 6 phần tử mà
phần tử thứ 1 là 10
phần tử thứ 2 là 20
phần tử thứ 3 là 30
phần tử thứ 4 là 5
phần tử thứ 5 là 6
phần tử thứ 6 là 7


Lưu ý!
Xét dãy: Ti Suu Dan Mao Thin Ti Ngo Mui Than Dau Tuat Hoi
cũng được coi là mảng 1 chiều, trong đó:
  • Phần tử 1 là Ti
  • Phần tử 2 là Suu
  • Phần tử 3 là Dan
  • Phần tử 4 là Mao
  • Phần tử 5 là Thin
  • ...

- Cách tham chiếu đến mảng: A[i] với i là chỉ số phân tử trong mảng.
vd: Vẫn xét mảng 10 20 30 5 6 7
A[1]=10; A[2]=20; A[3]=30; A[4]=50; A[5]=6; A[7]=7

- Cách khai báo mảng: Có 2 cách khai báo:
  • Khai báo trực tiếp: Thường thì cách khai báo trực tiếp được dùng nhiều hơn vì nó ngắn gọn.

var <tên mảng>:array[kiểu chỉ số] of <kiểu phần tử>; 

vd:
a:array[1..100] of integer;
b,c:array[1..250] of integer;
  • Khai báo gián tiếp:
type <tên kiểu mảng>=array[kiểu phần tử] of <kiểu chỉ số>;
var <tên mảng>:<tên kiểu mảng>;

vd:
type mang=array[1..100] of integer;
var a,b,c:mang;

- Cách nhập/xuất mảng 1 chiều:
var a:array[1..100] of integer;
    n,i:integer; 
begin
    {Nhập số phần tử mảng}
     writeln('Nhap so phan tu cua mang:'); readln(n); 
    {Nhập mảng}
     for i:=1 to n do 
        begin
            write('A[',i,']='); readln(A[i]);
        end; 
    {Xuất mảng}
     for i:=1 to n do
        writeln(A[i]);
end.



2. Mảng 2 chiều:

- Khái niệm: Nếu mảng 1 chiều là dãy thì mảng 2 chiều là bảng các phần tử cùng kiểu (bảng các số).

- Tham chiếu: Vì mảng 2 chiều là bảng nên sẽ cần chỉ số hàng và chỉ số cột: A[i,j] với i là chỉ số hàng, j là chỉ số cột.

- Khai báo: Tương tự như mảng 1 chiều nhưng thêm chỉ số cột.

- Cách nhập/xuất mảng 2 chiều:
var A:array[1..50,1..50] of Integer;
      i,j,N,Max,k,c,M:Integer;
begin
     write('So hang cot:');readln(N,M);Max:=0;
     for i:=1 to N do
      for j:=1 to M do
       begin
            write('A[',i,',',j,']=');readln(A[i,j]);
       end;
     for i:=1 to N do
       begin
            for j:=1 to M do
            write(A[i,j]);
       end;
end.


Tổng hợp và biên tập

Bài đăng phổ biến