tek4

[Lập trình C từ 0 đến 1] Bài 20. Mảng trong C

by - September. 21, 2021
Kiến thức
Học
C/C++
<h1>[Lập tr&igrave;nh C từ 0 đến 1] B&agrave;i 20. Mảng trong C</h1> <p>B&agrave;i viết &ldquo;[Lập tr&igrave;nh C từ 0 đến 1] B&agrave;i 20. Mảng trong C&rdquo; l&agrave; b&agrave;i viết tiếp theo nằm trong series hướng dẫn học lập tr&igrave;nh C của <a href="../../../" target="_blank" rel="noopener">tek4.vn</a>.</p> <p>Độc giả c&oacute; thể tham khảo c&aacute;c b&agrave;i viết kh&aacute;c trong series b&agrave;i viết n&agrave;y&nbsp;<a href="../../../lap-trinh-c-co-ban-den-nang-cao/" target="_blank" rel="noopener">tại đ&acirc;y</a></p> <p>B&agrave;i viết n&agrave;y sẽ cung cấp đến độc giả về kh&aacute;i niệm về mảng, mảng trong C l&agrave; c&aacute;i g&igrave;. Trong loạt b&agrave;i hướng dẫn [Lập tr&igrave;nh C từ 0 đến 1], IDE được sử dụng l&agrave; Code::Blocks</p> <p>Ta c&oacute; b&agrave;i to&aacute;n t&igrave;m số lớn nhất trong 2 số a, b nhập từ b&agrave;n ph&iacute;m, ta chỉ việc gọi 1 lệnh if v&agrave; khai b&aacute;o 2 biến a, b. Vậy nếu cho 3 số th&igrave; sao, qu&aacute; dễ ta lại d&ugrave;ng 3 biến a,b,c v&agrave; c&acirc;u lệnh rẽ nh&aacute;nh. Vậy 10 biến th&igrave; sao? C&oacute; phải bạn đang nghỉ &agrave; thế th&igrave; d&ugrave;ng 2 biến 1 biến max v&agrave; 1 biến đọc gi&aacute; trị v&agrave;o cũng rất dễ. Vậy nếu đề b&agrave;i cho 100 số v&agrave; bắt sắp xếp từ lớn đến nhỏ th&igrave; sao. L&uacute;c đ&oacute; sẽ rất kh&oacute; khăn cho việc ch&uacute;ng ta l&agrave;m vậy n&ecirc;n c&oacute; một kh&aacute;i niệm kh&aacute;c trong C gi&uacute;p ta l&agrave;m việc đ&oacute; l&agrave; kh&aacute;i niệm "<strong>mảng</strong>"</p> <h2 class="cap1">1. KH&Aacute;I NIỆM</h2> <p>L&agrave; một tập hợp nhiều biến c&oacute; c&ugrave;ng kiểu dữ liệu v&agrave; c&ugrave;ng t&ecirc;n, khi đ&oacute; mỗi phần tử của mảng được truy xuất th&ocirc;ng qua chỉ số.</p> <h2 class="cap1">2. C&Aacute;CH KHAI B&Aacute;O</h2> <h3 class="cap2">2.1. &ETH;ể khai b&aacute;o mảng ta d&ugrave;ng c&uacute; ph&aacute;p sau</h3> <p>&nbsp;</p> <blockquote> <p>&lt;kiểu dữ liệu&gt; &lt;t&ecirc;n mảng&gt; &lt;Danh s&aacute;ch c&aacute;c chiều của mảng&gt;;</p> </blockquote> <p>&nbsp;</p> <h3 class="cap2">2.2. C&aacute;c v&iacute; dụ</h3> <p>&nbsp;</p> <h4>V&iacute; dụ 1:</h4> <dir>int a[11],b[1][2];</dir> <p>D&ograve;ng lệnh tr&ecirc;n khai b&aacute;o hai mảng, mảng a l&agrave; mảng một chiều c&oacute; 10 phần tử thuộc kiểu int, mảng b l&agrave; mảng hai chiều ( 3 d&ograve;ng, 2 cột ) c&oacute; 6 phần tử thuộc kiểu int.</p> <p>&nbsp;</p> <h4>V&iacute; dụ 2:</h4> <dir>float c[100], d[5][7];</dir> <p>D&ograve;ng lệnh tr&ecirc;n khai b&aacute;o hai mảng, mảng c l&agrave; mảng một chiều c&oacute; 100 phần tử thuộc kiểu số thực float, mảng d l&agrave; mảng hai chiều ( 5 d&ograve;ng, 7 cột ) c&oacute; 35 phần tử thuộc kiểu float.</p> <p>&nbsp;</p> <h2 class="cap1">3. CHỈ SỐ CỦA MẢNG</h2> <h3 class="cap2">3.1. Kiểu dữ liệu của chỉ số</h3> <dir>Chỉ số của mảng phải l&agrave; một gi&aacute; trị kiểu int kh&ocirc;ng vượt qua k&iacute;ch thước của mảng, chỉ số của mảng bắt đầu từ 0.</dir> <p>&nbsp;</p> <h3 class="cap2">3.2. V&iacute; dụ</h3> <dir>V&iacute; dụ: int a[5];</dir> <p>/*Gồm 5 phần tử tương ứng c&aacute;c chỉ số từ 0...4 (a[0],a[1],a[2],a[3],a[4]) */</p> <p>&nbsp;</p> <h2 class="cap1">4. LẤY &ETH;ỊA CHỈ CỦA PHẦN TỬ MẢNG</h2> <h3 class="cap2">4.1. C&uacute; ph&aacute;p</h3> <dir>Chỉ lấy được địa chỉ của c&aacute;c phần tử thuộc mảng một chiều th&ocirc;ng qua to&aacute;n tử &amp; theo c&uacute; ph&aacute;p: &amp;t&ecirc;n_biến[i] (i l&agrave; chỉ số của mảng).</dir> <p>&nbsp;</p> <h3 class="cap2">4.2. C&aacute;c điểm cần lưu &yacute;</h3> <dir>Ch&uacute; &yacute;: T&ecirc;n của mảng sẽ chứa địa chỉ đầu của mảng,v&iacute; dụ: c&oacute; int a[10] th&igrave; a=&amp;a[0]</dir> <p>&nbsp;</p> <h2>5. NHẬP XUẤT DỮ LIỆU CHO C&Aacute;C PHẦN TỬ MẢNG</h2> <h3>5.1. Nhập xuất trực tiếp</h3> <p>Khuyến nghị chỉ sử dụng được với mảng một chiều v&agrave; mảng hai chiều c&oacute; c&aacute;c phần tử kiểu int.</p> <p><strong>V&iacute; dụ&nbsp; :&nbsp;</strong>nhập xuất dữ liệu cho một mảng một chiều (kiểu int).</p> <table width="70%"> <tbody> <tr> <td width="100%"> <pre class="EnlighterJSRAW" data-enlighter-language="c"># include &lt;stdio.h&gt; # include &lt;conio.h&gt; void main () /* Ham chinh */ { int a[5]; int i; clrscr(); /*Nhập dữ liệu*/ for (i=0;i&lt;5;i++) { printf("\na[%d]",i); scanf("%d",&amp;a[i]); /*nhập trực tiếp bằng ph&eacute;p lấy&nbsp;địa chỉ*/ } /*&ETH;ưa c&aacute;c kết quả ra m&agrave;n h&igrave;nh*/ for (i=0;i&lt;5;i++) printf("%d ",a[i]); getch(); }</pre> <p>&nbsp;</p> </td> </tr> </tbody> </table> <p>&nbsp;</p> <h3>5.2. Nhập xuất gi&aacute;n tiếp</h3> <p>Nhập gi&aacute;n tiếp,&nbsp;<strong>sử dụng tốt với cả mảng một chiều, cũng như&nbsp;đa chiều</strong>.</p> <p><strong>V&iacute; dụ:&nbsp;</strong>Nhập, xuất dữ liệu cho mảng hai chiều (kiểu số thực(float)).</p> <table width="70%"> <tbody> <tr> <td width="100%"> <pre class="EnlighterJSRAW" data-enlighter-language="c"># include &lt;stdio.h&gt; # include &lt;conio.h&gt; void main () /* Ham chinh */ { float temp,a[3][3]; int i,j; clrscr(); /*Nhập dữ liệu */ for (i=0;i&lt;3;i++) for (j=0;j&lt;3;j++) { printf("\na[%d][%d]",i,j); scanf("%f",&amp;temp); /*Nhập gi&aacute;n tiếp th&ocirc;ng qua biến temp*/ a[i][j]=temp; /*G&aacute;n gi&aacute; trị của temp cho phần tử mảng*/ } /*&ETH;ưa gi&aacute; trị c&aacute;c phần tử ra m&agrave;n h&igrave;nh*/ for (i=0;i&lt;3;i++) { printf("\n"); for (j=0;j&lt;3;j++) printf("%.2f ",a[i][j]); } getch(); }</pre> <p>&nbsp;</p> </td> </tr> </tbody> </table> <h2>6.MỘT SỐ VẤN &ETH;Ề LI&Ecirc;N QUAN</h2> <h3><strong>6.1.Biến, mảng nội</strong></h3> <h4>Kh&aacute;i niệm</h4> <p>L&agrave; c&aacute;c biến (mảng) khai b&aacute;o b&ecirc;n trong th&acirc;n của một h&agrave;m.</p> <h4>Thời gian tồn tại</h4> <p>Từ l&uacute;c m&aacute;y bắt&nbsp;đầu l&agrave;m việc với h&agrave;m cho&nbsp;đến khi h&agrave;m&nbsp;đ&oacute; kết th&uacute;c. Vậy c&aacute;c biến, mảng nội khai b&aacute;o trong h&agrave;m main tồn tại trong suốt thời gian l&agrave;m việc của chương tr&igrave;nh.</p> <h4>Phạm vi sử dụng</h4> <p>C&aacute;c biến (mảng) nội của một h&agrave;m chỉ c&oacute; t&aacute;c dụng b&ecirc;n trong h&agrave;m m&agrave; n&oacute;&nbsp;được khai b&aacute;o.</p> <h4>&nbsp;Qui tắc khởi&nbsp;đầu khi khai b&aacute;o mảng nội</h4> <p>Muốn khởi&nbsp;đầu cho một mảng nội,&nbsp;<strong><em>phải sử dụng to&aacute;n tử g&aacute;n</em></strong></p> <p>V&iacute; dụ minh họa</p> <p>V&iacute; dụ 1:</p> <table width="70%"> <tbody> <tr> <td width="100%"> <pre class="EnlighterJSRAW" data-enlighter-language="c">/*Minh họa mảng số một chiều, khởi&nbsp;đầu cho một mảng nội */ #include &lt;stdio.h&gt; void main() { int a[3]={10,20,30};&nbsp;/*Khởi&nbsp;đầu mảng một chiều với 3 phần tử, nằm trong th&acirc;n h&agrave;m main()*/ /*&ETH;ưa c&aacute;c kết quả ra m&agrave;n h&igrave;nh*/ printf("Noi dung cua a[0] =&gt; %d\n",a[0]); printf("Noi dung cua a[1] =&gt; %d\n",a[1]); printf("Noi dung cua a[2] =&gt; %d\n",a[2]); }</pre> <p>&nbsp;</p> </td> </tr> <tr> <td width="100%"> <p>Kết quả:</p> <p>Noi dung cua a[0] =&gt;10</p> <p>Noi dung cua a[1] =&gt;20</p> <p>Noi dung cua a[2] =&gt;30</p> </td> </tr> </tbody> </table> <p>V&iacute; dụ 2:</p> <table width="70%"> <tbody> <tr> <td width="100%"> <pre class="EnlighterJSRAW" data-enlighter-language="c">/* Chương tr&igrave;nh minh họa mảng hai chiều, khỏi&nbsp;đầu cho một mảng nội */ #include &lt;stdio.h&gt; void main() { static int a[2][3] = { {10, 20, 30}, {11, 21, 31} };&nbsp;/*Khởi&nbsp;đầu mảng hai chiều với 2 h&agrave;ng, 3 cột trong th&acirc;n h&agrave;m main()*/ int hang; int cot; /*&ETH;ưa c&aacute;c kết quả ra m&agrave;n h&igrave;nh*/ for(hang = 0; hang &lt; 2; hang++) { for(cot = 0; cot &lt; 3; cot++) printf("%5d",a[hang][cot]); printf("\n\n"); } }</pre> <p>&nbsp;</p> </td> </tr> <tr> <td width="100%"> <p>Kết quả:</p> <p>10 20 30</p> <p>11 21 31</p> </td> </tr> </tbody> </table> <p>Biến, mảng nội chưa khởi&nbsp;đầu th&igrave; gi&aacute; trị của n&oacute; ho&agrave;n to&agrave;n kh&ocirc;ng x&aacute;c&nbsp;định.</p> <h3>6.2.Biến, mảng ngoại</h3> <h4>&nbsp;Kh&aacute;i niệm</h4> <p>L&agrave; c&aacute;c biến (mảng) khai b&aacute;o b&ecirc;n ngo&agrave;i c&aacute;c h&agrave;m.</p> <h4>&nbsp;Thời gian tồn tại</h4> <p>Tồn tại trong suốt thời gian l&agrave;m việc của chương tr&igrave;nh.</p> <h4>&nbsp;Phạm vi sử dụng</h4> <p>Phạm vi hoạt&nbsp;động của c&aacute;c biến (mảng) ngoại l&agrave; từ vị tr&iacute; n&oacute;&nbsp;được khai b&aacute;o cho đến&nbsp;cuối chương tr&igrave;nh.</p> <h4>&nbsp;C&aacute;c qui tắc khởi&nbsp;đầu khi khai b&aacute;o mảng ngoại</h4> <p>C&aacute;c biến, mảng ngoại c&oacute; thể khởi&nbsp;đầu (một lần) v&agrave;o l&uacute;c dịch chương tr&igrave;nh bằng c&aacute;ch sử dụng c&aacute;c biểu thức hằng. Nếu kh&ocirc;ng&nbsp;được khởi đầu, m&aacute;y sẽ g&aacute;n cho n&oacute; gi&aacute; trị kh&ocirc;ng.</p> <h3>V&iacute; dụ:</h3> <pre class="EnlighterJSRAW" data-enlighter-language="c">char sao=*; int a=6*45; long b 24*3*2467; float x=32.5; float y[6]={3.2,0,5.1,23,0,41}; int z[3][2]= { {25,31}, {46,54}, {93,81} }; void main() { }</pre> <p>&nbsp;</p> <p>Khi khởi&nbsp;đầu một mảng c&oacute; thể kh&ocirc;ng cần chỉ ra k&iacute;ch thước (số phần tử ) của n&oacute;. Khi đ&oacute; m&aacute;y sẽ d&agrave;nh cho mảng một khoảng nhớ&nbsp;đủ để thu nhận danh s&aacute;ch gi&aacute; trị khởi đầu.</p> <h4>V&iacute; dụ</h4> <pre class="EnlighterJSRAW" data-enlighter-language="c">float a[]={2,5.1,15}; int t[][4]= { {5,6,7,8}, {1,12,15,6} };</pre> <p>&nbsp;</p> <p>Khi chỉ ra k&iacute;ch thước của mảng, th&igrave; k&iacute;ch thước n&agrave;y cần kh&ocirc;ng nhỏ hơn k&iacute;ch thước của bộ khởi&nbsp;đầu.</p> <h4>V&iacute; dụ</h4> <pre class="EnlighterJSRAW" data-enlighter-language="c">float bt[8]={6.2,5.1,15}; int h[6][4]= { {5,6,7,8}, {1,12,15,6}, {0,2,5,9} };</pre> <p>&nbsp;</p> <p>&ETH;ối với mảng hai chiều c&oacute; thể khởi&nbsp;đầu theo hai c&aacute;ch sau (số gi&aacute; trị khởi đầu tr&ecirc;n mỗi mảng c&oacute; thể kh&aacute;c nhau):</p> <pre class="EnlighterJSRAW" data-enlighter-language="c">float a[][3]= { {5}, {1.2,2,3.6}, {-6.9} &nbsp;};</pre> <p>&nbsp;</p> <p>hoặc :</p> <pre class="EnlighterJSRAW" data-enlighter-language="c">int h[10][4]= { {5}, {1,12,15,6}, {9,10} {1,2,3,4} };</pre> <p>&nbsp;</p> <h4>Bộ khởi&nbsp;đầu của một mảng char c&oacute; thể:</h4> <ul> <li>l&agrave; danh s&aacute;ch c&aacute;c hằng k&iacute; tự;</li> <li>l&agrave; một hằng x&acirc;u k&iacute; tự.</li> </ul> <p><strong>V&iacute; dụ:</strong></p> <pre class="EnlighterJSRAW" data-enlighter-language="c">char name[]={h,a,n,g,\0}; char name[]="hang"; char name[10]= {h,a,n,g,\0}; char name[10]="hang";</pre> <p>Chương tr&igrave;nh minh họa</p> <table width="70%"> <tbody> <tr> <td> <pre class="EnlighterJSRAW" data-enlighter-language="c">/*Chương trinh minh họa qui tắc khởi đầu biến mảng ngoại*/ # include &lt;stdio.h&gt; int a=41, t[][3]={ {25,30,40}, {145,83,10} }; /*Khởi đầu biến a v&agrave; mảng hai chiều t kiểu int*/ float y[8]={-45.8,32.5}; /*Khởi đầu mảng một chiều y kiểu float*/ float x[10][2]={ {-125.3,48.9}, {145.6,83.5} }; /*Khởi đầu mảng hai chiều x kiểu float*/ char n1[]={T,e,k,\0}; char n2[]="Tek"; char n3[10]={T,e,k,\0}; char n4[10]="tek"; /*Khởi đầu một mảng char theo bốn c&aacute;ch*/ void main() { /*In c&aacute;c kết quả ra m&agrave;n h&igrave;nh*/ printf("\na=%6d,t(1,2)=%6d,t(1,1)=%6d",a,t[1][2],t[1][1]); printf("\ny(0)=%8.2f, y(1)=%8.2f",y[0],y[1]); printf("\nx(1,1)=%8.2f, x(2,0)=%8.2f",x[1][1],x[2][0] ); printf("\n\n%8s%8s%8s%8s",n1,n2,n3,n4 ); }</pre> <p>&nbsp;</p> </td> </tr> <tr> <td> <p>Kết quả thực hiện chương tr&igrave;nh</p> <p>a=41, t(1,2)=10,t(1,1)=83</p> <p>y(0)= -45.8, y(1)= 32.5</p> <p>x(1,1)=83.50, x(0,2)=0.00</p> <p>Tek Tek Tek Tek</p> </td> </tr> </tbody> </table> <p>Ch&uacute;ng ta sẽ kết th&uacute;c &ldquo;[Lập tr&igrave;nh C từ 0 đến 1] B&agrave;i 20. Mảng trong C&rdquo; trong series [Lập tr&igrave;nh C từ 0 đến 1] ở đ&acirc;y. H&atilde;y c&ugrave;ng đ&oacute;n xem &ldquo; B&agrave;i 21. Con trỏ trong C v&agrave; địa chỉ bộ nhớ&rdquo;.</p> <p>H&atilde;y để lại b&igrave;nh luận v&agrave; theo d&otilde;i series b&agrave;i viết: &ldquo;<a href="../../../tu-khoa/lap-trinh-c-tu-0-den-1/">Lập tr&igrave;nh C từ 0 đến 1</a>&rdquo; để tiếp tục cập nhật những th&ocirc;ng tin mới nhất.</p>