<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Samandar Komilov</title>
    <description>The latest articles on DEV Community by Samandar Komilov (@samandar_komilov).</description>
    <link>https://dev.to/samandar_komilov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1057470%2Faa5939cb-bfb6-4be2-9a10-d9a32e7a3f33.jpeg</url>
      <title>DEV Community: Samandar Komilov</title>
      <link>https://dev.to/samandar_komilov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/samandar_komilov"/>
    <language>en</language>
    <item>
      <title>Database Dizaynda Kalitlar: Hamma Joyda Kalit! 🗝</title>
      <dc:creator>Samandar Komilov</dc:creator>
      <pubDate>Sat, 21 Sep 2024 20:46:23 +0000</pubDate>
      <link>https://dev.to/samandar_komilov/database-dizaynda-kalitlar-hamma-joyda-kalit-5e36</link>
      <guid>https://dev.to/samandar_komilov/database-dizaynda-kalitlar-hamma-joyda-kalit-5e36</guid>
      <description>&lt;p&gt;🇺🇿 Database Dizayn desa miyaga eng birinchi nima keladi? Diagrammalar, bog'lamlar, jadvallar va hokazo shundaymi? Lekin menimcha kalitlar tasavvur qilinishi ham noto'g'ri bo'lmaydi. Chunki aynan kalitlar orqali biz database'da ma'lumotlarning yagonaligini ta'minlay olamiz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn8m80grr5hl6pqnnedu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn8m80grr5hl6pqnnedu.png" alt="Kalitlar" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;❓ &lt;strong&gt;O'zi aslida Database Design nima va u bizga nimaga kerak?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Database dizayn bizga o'zi nimani xohlayotganini o'zi ham bilmagan klientning noaniq va o'ta abstrakt g'oyalarini bir qolipga solib, tartiblab, maqsadli va ishlatsa bo'ladigan bir model ko'rinishiga olib kelishga yordam beradi. Uning yordamida ma'lumotlar takrorlanishi, jadvallar o'rtasidagi ortiqcha bog'liqliklar, noaniqliklardan xalos bo'lish mumkin. Shuningdek to'g'ri dizayn qilingan database keyinchalik kengaytirilishi ham osonroq va muammosi kamroq bo'ladi.&lt;/p&gt;

&lt;p&gt;🤔 &lt;strong&gt;Xo'sh yaxshi, xalq tushundi. Unda kalitlarni nima aloqasi bor?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yaxshi savol. Yuqorida aytdik, database dizayn ma'lumotlar tartibli bo'lishi, yagonaligi, ortiqcha bog'liqliklar bo'lmasligi va hokazolarni ta'minlaydi dedik. Albatta database design bu general atama, demak bu ishlarni ichkarida kimlardir qilishi kerak. Va shu "ishchi"lardan biri bu kalitlardir.&lt;/p&gt;

&lt;p&gt;Kalitlarning bir qancha turlari bor. Nomlari ingliz tilida "takoy" bo'lsa ham, o'zi uncha vahimali emas. Ba'zilarini o'zingiz bilmagan holda ishlatgansiz. Hozir shulardan 10 tasini (agar hammasi shu bo'lsa) ko'rib chiqamiz. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Superkey&lt;/li&gt;
&lt;li&gt;Candidate Key&lt;/li&gt;
&lt;li&gt;Primary Key&lt;/li&gt;
&lt;li&gt;Alternate Key&lt;/li&gt;
&lt;li&gt;Unique Key&lt;/li&gt;
&lt;li&gt;Surrogate Key&lt;/li&gt;
&lt;li&gt;Natural Key&lt;/li&gt;
&lt;li&gt;Composite Key &amp;amp; Compound Key&lt;/li&gt;
&lt;li&gt;Foreign Key&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;⏳ Nega bunaqa g'alati tartib? Birinchi Primary va Foreignkeylar emasmi, eng osonlari shularku? Wait for it...)&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣ Superkey
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Super kalit&lt;/strong&gt; kalitlar ichidagi eng katta to'plam. Ma'lumotlar jadvalidagi bitta qatorni bir to'plam deb hisoblasak, superkey uning barcha qism to'plamlaridan iborat to'plam, faqat bitta sharti bor. Har bir qism to'plam ushbu qatorni yagonaligini ta'minlashi kerak. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpj1g9f1bo5oznwvdzrf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpj1g9f1bo5oznwvdzrf.png" alt="Superkey example 1" width="681" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu jadvalda qaysi ustun qatorlarning yagonaligini ta'minlaydi? Albatta &lt;code&gt;id&lt;/code&gt; ustuni. Qiziq, faqat shu ustunmikin..?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Superkey 1: {id}
Superkey 2: {id, email}
Superkey 3: {id, Phone}
Superkey 4: {id, email, name}
Superkey 5: {id, email, phone, name}
Superkey 6: {email, phone}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yo'q! Qatorni yagonaligini ta'minlay oladigan barcha to'plamlar superkey bo'lishi mumkin. Xususan, &lt;code&gt;id&lt;/code&gt; qatnashgan barcha to'plamlar aniq superkey bo'la oladi, chunki &lt;code&gt;id&lt;/code&gt; ni o'zi bir superkey. &lt;/p&gt;

&lt;p&gt;Shuningdek, &lt;code&gt;email&lt;/code&gt; va &lt;code&gt;phone&lt;/code&gt; juftligi ham uniqueness berishi mumkin (O'ylab ko'ringchi nega?). Lekin e'tibor beraylik, masalan &lt;code&gt;{email, name}&lt;/code&gt; qism to'plami superkey bo'la olmaydi, sababi xuddi shu email va name bilan boshqa odam bo'lishi mumkin (aslida yemay qoldi example, juda bo'lmasa email o'rniga country deb tasavvur qiling).&lt;/p&gt;

&lt;h2&gt;
  
  
  2️⃣ Candidate Key
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Nomzod kalit&lt;/strong&gt; - sodda aytganda eng minimal superkey. Superkeylar to'plamlari ichidagi eng kichik qism to'plam. Bizning yuqoridagi holatda &lt;code&gt;{id}&lt;/code&gt; bir vaqtda superkey hamda candidate key, chunki u eng minimal superkey. Lekin &lt;code&gt;{id, email}&lt;/code&gt; candidate key emas, sababi unda bitta redundant ustun mavjud. Ammo agar &lt;code&gt;{email}&lt;/code&gt; ustuni yagonaligi ta'minlansa, rostdan ham emaillar takrorlanmas bo'lsa, bu qism to'plam ham candidate key bo'lishi mumkin.&lt;/p&gt;

&lt;h2&gt;
  
  
  3️⃣ Primary Key
&lt;/h2&gt;

&lt;p&gt;Database dizayner bir vaqtning o'zida superkey va candidate key bo'lgan qism to'plamlar (ustunlar) orasidan eng mos va qulay birini tanlaydi va u &lt;strong&gt;asosiy kalit&lt;/strong&gt; bo'ladi. Asosiy kalit bo'lish shartlari:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;qatorning yagonaligini ta'minlay olishi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NOT NULL&lt;/code&gt; bo'lishi&lt;/li&gt;
&lt;li&gt;har bir jadvalda faqatgina bitta Primary Key bo'lishi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Asosiy kalit sifatida auto-incremented integerlar, yoki UUID kabi maxsus generatsiya qilingan idlar ishlatilishi mumkin. Ularning ham turlari bor (surrogat va tabiiy) va birozdan keyin bunga to'xtalamiz.&lt;/p&gt;

&lt;h2&gt;
  
  
  4️⃣ Alternate Key
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Muqobil Kalit&lt;/strong&gt; - Primary Key sifatida tanlanmagan barcha kandidat kalitlar muqobil kalit bo'ladi. &lt;/p&gt;

&lt;p&gt;Aytaylik, jadvalimizda bir nechta Unique ustunlar bor:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1n3qsllu2uyza98ttsg6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1n3qsllu2uyza98ttsg6.png" alt=" " width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;U holda ularning faqat bittasi Primary Key bo'la oladi, va tabiiyki qolgani &lt;code&gt;unique=True&lt;/code&gt; bo'lsa-da, muqobil darajasida qoladi.&lt;/p&gt;

&lt;h2&gt;
  
  
  5️⃣ Unique Key
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Unique Key&lt;/strong&gt; - deyarli Primary Key, faqat bitta sharti bor: &lt;code&gt;NULL&lt;/code&gt; qiymatlarni ham qabul qila oladi. Ya'ni, qatorning shu ustunida ma'lumot bo'sh bo'lishi mumkin. &lt;/p&gt;

&lt;p&gt;Rostdan ham-da, masalan &lt;code&gt;email&lt;/code&gt; ustunini biz Unique Key desak bo'ladi, sababi hamma user ham birdan emailini kiritmasligi mumkin. Natijada o'sha katakda bo'sh ma'lumot, &lt;code&gt;NULL&lt;/code&gt; turadi.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Primary Key bir vaqtda Unique Key bo'lishi mumkin, lekin Unique Key bir vaqtda Primary Key bo'la olmaydi.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  6️⃣ Surrogate Key
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sun'iy Kalit&lt;/strong&gt; - default holatda har bir jadval uchun avtomatik yaratiladigan kalit bo'lib, har bir ustunni yagonaligini ta'minlaydi. Lekin u o'z nomi bilan surrogat, ya'ni haqiqiy hayotda hech nimani anglatmaydi. &lt;br&gt;
Masalan, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;IDsi 329 bo'lgan foydalanuvchi layk bosdi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bu yerda 329 nima ma'noni anglatadi? Hech nimani! U shunchaki 329-user 328-, 330- va boshqa barcha userlardan boshqa user ekanini bildiradi xolos. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxh6fkbrtyln3u4vguwi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxh6fkbrtyln3u4vguwi.png" alt=" " width="797" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mazkur rasmda ham ko'rish mumkinki, &lt;code&gt;order_id&lt;/code&gt; surrogat kalit, sababi u faqat uniqueness ta'minlash uchun va &lt;code&gt;SERIAL&lt;/code&gt; tipida turibdi.&lt;/p&gt;

&lt;h2&gt;
  
  
  7️⃣ Natural Key
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tabiiy Kalit&lt;/strong&gt; - jadvaldagi haqiqiy hayotda nimadir ma'no bildiradigan ustun kalit sifatida tanlanishi. Ya'ni bu holatda kalit qandaydir muhim ma'lumotni o'zida saqlaydi, yuqoridagi sun'iy kalitdan farqli ravishda. Masalan,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Emaili &lt;a href="mailto:mematibash@gmail.com"&gt;mematibash@gmail.com&lt;/a&gt; bo'lgan foydalanuvchi layk bosdi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bu yerda biz foydalanuvchi emailini bilyapmiz va agar istasak unga xabar yuborishimiz ham mumkin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05v1b6rrf0e44g5yqojj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05v1b6rrf0e44g5yqojj.png" alt=" " width="797" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu rasmda esa Primary Key sifatida auto-increment integer emas, balki 17 talik char tanlangan va u ma'lum ma'noni anglatadi. Aniqki, bu tabiiy kalit deb atalishi mumkin.&lt;/p&gt;

&lt;h2&gt;
  
  
  8️⃣ Composite Key &amp;amp; Compound Key
&lt;/h2&gt;

&lt;p&gt;Ko'pincha bu ikki atama bir xil ma'noda ishlatiladi. Sodda tushunsak, jadvaldagi bir necha ustunni birlashtirib, bitta kalit sifatida olish. Xususiy holatlarda bu atamalar boshqa-boshqa ma'no anglatishi mumkin, masalan biri ManyToMany jadvallarda ishlatilsa boshqasi ForeignKey qatnashmagan ustunlardan iborat paytlarda ishlatiladi. Lekin biz uncha chuqur kirmay turamiz. &lt;/p&gt;

&lt;p&gt;Quyidagi &lt;code&gt;StudentCourse&lt;/code&gt; jadvali misolida ko'raylik:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frga042rhq9icytelr0yg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frga042rhq9icytelr0yg.png" alt="Composite example 1: StudentCourse table" width="442" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu holatda &lt;code&gt;{StudentID, CourseID}&lt;/code&gt; qism to'plami Composite Key bo'lishi mumkin, chunki u har bir student qaysi kursga qatnashganini yagona tartibda aniqlab bera oladi. Shuningdek, e'tibor beraylikki, bu jadval ManyToMany bog'lami uchun ochilgan "o'rtakash" jadvaldir. Ya'ni, &lt;code&gt;Student&lt;/code&gt; va &lt;code&gt;Course&lt;/code&gt; jadvallari o'rtasidagi ManyToMany bog'lamni mazkur jadval ta'minlab turibdi.&lt;/p&gt;

&lt;h2&gt;
  
  
  9️⃣ Foreign Key
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tashqi Kalit&lt;/strong&gt; - bir jadvalni boshqasi bilan bog'laydigan kalit. Bu ustunda boshqa bir jadvalning asosiy kaliti joylashadi va shu orqali ikki jadvalning o'zaro bog'lami ta'minlanadi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frwozudncleq7y4k20y5a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frwozudncleq7y4k20y5a.png" alt=" " width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rasmda ko'rish mumkinki, &lt;code&gt;customer_id&lt;/code&gt; ustuni integer tipida bo'lsa-da, boshqa &lt;code&gt;customer&lt;/code&gt; nomli jadvalning shu nomdagi Primary Key ustuniga reference qilib turibdi. Va aynan shu narsa jadvallar o'rtasida virtual relationship, ko'rinmas ip hosil qiladi.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;🏁 Shunday qilib bugun database dizaynda doim ishlatiladigan, qayerga qarasa ham topsa bo'ladigan kalitlar mavzusi haqida gaplashdik. Umid qilamanki, bu o'zimga ham o'qiganlarga ham foydali bo'ldi. E'tiboringiz uchun rahmat!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>Understanding SQL Joins and Grouping using Set Theory</title>
      <dc:creator>Samandar Komilov</dc:creator>
      <pubDate>Sat, 13 Jul 2024 10:13:12 +0000</pubDate>
      <link>https://dev.to/samandar_komilov/understanding-sql-joins-and-grouping-using-set-theory-i58</link>
      <guid>https://dev.to/samandar_komilov/understanding-sql-joins-and-grouping-using-set-theory-i58</guid>
      <description>&lt;p&gt;🏁 In the world of databases, SQL joins are fundamental operations that allow us to combine data from multiple tables based on related columns. While SQL joins might seem daunting at first, they are conceptually rooted in Set Theory — a branch of mathematics that deals with collections of objects and operations on them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsxjyuowq406mi4xknspe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsxjyuowq406mi4xknspe.png" alt="Types of Joins in SQL" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This post aims to demystify SQL joins by exploring their relationship with set theory concepts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understanding Tables as Sets:&lt;/strong&gt; In SQL, each table can be seen as a set of rows (records). Just as in set theory, these rows are unique unless explicitly defined otherwise.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Types of Joins:&lt;/strong&gt; SQL offers several types of joins—such as inner joins, left joins, right joins, and outer joins—each serving a specific purpose in combining data from multiple tables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set Operations Analogies:&lt;/strong&gt; We'll delve into how SQL joins correspond to set operations. For instance, an inner join can be likened to the intersection of two sets, where only the common elements (rows) are retained.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Visualizing Joins:&lt;/strong&gt; Using practical examples and diagrams, we'll visualize how data from different tables intersects or combines based on join conditions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By the end of this post, you'll have a clearer understanding of SQL joins not just as technical database operations, but as logical extensions of set theory principles. &lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Tables as Sets
&lt;/h2&gt;

&lt;p&gt;Each table consists of some number of rows and columns, we know. In each row, there are a number of elements equal to the number of columns. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdz6tepxl55q9wn5gzjn7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdz6tepxl55q9wn5gzjn7.png" alt="Sample table" width="800" height="652"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For instance, in this table, there are 4 rows with 3 elements each (3 columns). Each row is considered as a &lt;strong&gt;tuple&lt;/strong&gt; in set theory and the table is a &lt;strong&gt;set of tuples&lt;/strong&gt; of elements:&lt;br&gt;
&lt;code&gt;K = {(1, Polat, 45), (2, Memati, 40), (3, Abdulhey, 39), (4, Cahit, 35)}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;So, I hope we got the point. Now, let's move onto the JOINS.&lt;/p&gt;
&lt;h2&gt;
  
  
  Types of Joins
&lt;/h2&gt;

&lt;p&gt;There are various sources that tell distinct information about the exact number of Joins. We'll consider the following Join types:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;INNER JOIN&lt;/li&gt;
&lt;li&gt;LEFT (OUTER) JOIN&lt;/li&gt;
&lt;li&gt;RIGHT (OUTER) JOIN&lt;/li&gt;
&lt;li&gt;FULL (OUTER) JOIN&lt;/li&gt;
&lt;li&gt;CROSS JOIN (Cartesian Product)&lt;/li&gt;
&lt;li&gt;ANTI LEFT JOIN&lt;/li&gt;
&lt;li&gt;ANTI RIGHT JOIN&lt;/li&gt;
&lt;li&gt;ANTI OUTER JOIN&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  INNER JOIN
&lt;/h2&gt;

&lt;p&gt;An inner join returns only the rows (tuples) that have matching values in both tables (sets). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flrnr23j7jlip8g4v7mld.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flrnr23j7jlip8g4v7mld.png" alt="Inner Join" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In set theory terms, it performs an &lt;strong&gt;intersection&lt;/strong&gt; of two sets. Let's say, we are inner joining A and B tables, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inner Join = A ∩ B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It would be clearer if we consider elementwise, yeah? So, say we have these sets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A = {(1, 'Pusat'), (2, 'Zaza'), (3, 'Murad')}
B = {(1, 'HR'), (2, 'IT'), (4, 'Sales')}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the inner join on the 1st element (employeeID) of these 2 sets will be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A ∩ B = {(1, 'Pusat', 'HR'), (2, 'Zaza', 'IT')}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But &lt;code&gt;'Murad'&lt;/code&gt; and &lt;code&gt;'Sales'&lt;/code&gt; have different IDs, so they are not present in inner join result.&lt;/p&gt;

&lt;h2&gt;
  
  
  LEFT (OUTER) JOIN
&lt;/h2&gt;

&lt;p&gt;A left outer join returns all the rows from the left table (set), along with the matching rows from the right table (set). If there is no match, the result is NULL from the right table. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftllg3kiyaxio4gse6y8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftllg3kiyaxio4gse6y8e.png" alt="Left Outer Join" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In set theory, it can be thought of as including all elements from the left set and the intersection with the right set:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Left Outer Join = A ∪ (A ∩ B)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In terms of the above example sets, the resulting left outer join set will be like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A ∪ (A ∩ B) = {(1, 'Pusat', 'HR'), (2, 'Zaza', 'IT'), (3, 'Murad', NULL)}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because, the result is all the matching rows (tuples) plus the other tuples on the left set. Due to the absence of Department for &lt;code&gt;Murad&lt;/code&gt;, &lt;code&gt;NULL&lt;/code&gt; will be saved.&lt;/p&gt;

&lt;h2&gt;
  
  
  RIGHT (OUTER) JOIN
&lt;/h2&gt;

&lt;p&gt;A right outer join returns all the rows from the right table (set), along with the matching rows from the left table (set). If there is no match, the result is NULL from the left table. This is similar to the left join but includes all elements from the right set.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7og7gxg53ex7njfvjlk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7og7gxg53ex7njfvjlk.png" alt="Right Outer Join" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In set theory, it can be thought of as including all elements from the right set and the intersection with the left set:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Right Outer Join = B ∪ (A ∩ B)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In terms of the above example sets, the resulting right outer join set will be like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;B ∪ (A ∩ B) = {(1, 'Pusat', 'HR'), (2, 'Zaza', 'IT'), (4, NULL, 'Sales')}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because, the result is all the matching rows (tuples) plus the other tuples on the right set. Due to the absence of Name for &lt;code&gt;Sales&lt;/code&gt;, &lt;code&gt;NULL&lt;/code&gt; will be saved.&lt;/p&gt;

&lt;h2&gt;
  
  
  FULL (OUTER) JOIN
&lt;/h2&gt;

&lt;p&gt;A full outer join returns all the rows when there is a match in either table (set). If there is no match, the result is NULL on the side that does not have a match. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4vkgupm8amcuq7smkcy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4vkgupm8amcuq7smkcy.png" alt="Full Outer Join" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In set theory, it is the &lt;strong&gt;union&lt;/strong&gt; of both sets, including their intersection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Full Outer Join = (A ∪ B) ∪ (A ∩ B)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In terms of the above example sets, the resulting right outer join set will be like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;B ∪ (A ∩ B) = {(1, 'Pusat', 'HR'), (2, 'Zaza', 'IT'), (3, 'Murad', NULL), (4, NULL, 'Sales')}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is like the sum of 2 above cases, but the matching rows participate only once in the result set.&lt;/p&gt;

&lt;h2&gt;
  
  
  CROSS JOIN (Cartesian Product)
&lt;/h2&gt;

&lt;p&gt;A cross join produces the Cartesian product of two tables, meaning it combines each row from the first table with every row from the second table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fl1pmcr6xajjj8x10pm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fl1pmcr6xajjj8x10pm.png" alt="Cross Join" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In set theory, there is a cartesian product operation: &lt;code&gt;A × B&lt;/code&gt;.&lt;br&gt;
In terms of the above example sets, the result becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A × B = {(1, 'Pusat', 1, 'HR'), (1, 'Pusat', 2, 'IT'), ...}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The list is too long (3×3 elements), hence I left only a few of them, but you got the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  ANTI LEFT JOIN
&lt;/h2&gt;

&lt;p&gt;Returns rows from the left table (A) that do not have matching rows in the right table (B).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvffj8cyusp0jvxxx8gy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvffj8cyusp0jvxxx8gy.png" alt="Anti Left Join" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In set theory, this operation is similar to finding elements in set A that are not in set B, denoted as &lt;code&gt;A ∖ B&lt;/code&gt;. The result according to the example sets above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A ∖ B = {(3, 'Murad')}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ANTI RIGHT JOIN
&lt;/h2&gt;

&lt;p&gt;Returns rows from the right table (B) that do not have matching rows in the left table (A).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zvurl5m34h0kum9kr2z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zvurl5m34h0kum9kr2z.png" alt="Anti Right Join" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In set theory, this operation is similar to finding elements in set B that are not in set A, denoted as &lt;code&gt;B ∖ A&lt;/code&gt;. The result according to the example sets above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;B \ A = {(4, 'Sales')}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ANTI FULL JOIN
&lt;/h2&gt;

&lt;p&gt;Returns rows that do not have matching rows in either table (A or B).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkw2n1tixx5d3pirvluww.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkw2n1tixx5d3pirvluww.png" alt="Anti Full Join" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In set theory, this operation corresponds to the symmetric difference of sets A and B, denoted as &lt;code&gt;A Δ B&lt;/code&gt;. The result according to the example sets above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A Δ B = {(3, 'Murad', NULL), (4, NULL, 'Sales')}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enough with Joins, now let's start considering Group By in terms of set theory and with examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  GROUP BY
&lt;/h2&gt;

&lt;p&gt;Sooon...&lt;/p&gt;




&lt;p&gt;🏁 &lt;em&gt;As everything in databases are constructed using mathematical concepts under the hood, it is so essential to understand the database operations using set theory operations and imagine how it is working. To study Set Theory, which is a branch of Discrete Mathematics, I recommend taking this MIT course:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openlearninglibrary.mit.edu/courses/course-v1:OCW+6.042J+2T2019/course/" rel="noopener noreferrer"&gt;https://openlearninglibrary.mit.edu/courses/course-v1:OCW+6.042J+2T2019/course/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Today, I tried to help giving the idea as I can, thanks for your attention!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>sql</category>
      <category>database</category>
    </item>
    <item>
      <title>Preprocessors and Macros in C</title>
      <dc:creator>Samandar Komilov</dc:creator>
      <pubDate>Sun, 01 Oct 2023 13:32:22 +0000</pubDate>
      <link>https://dev.to/samandar_komilov/preprocessors-and-macros-in-c-2920</link>
      <guid>https://dev.to/samandar_komilov/preprocessors-and-macros-in-c-2920</guid>
      <description>&lt;p&gt;👉 Today, I am going to consider one of the most essential but least common topics in C/C++ world - Preprocessors and Macros.&lt;/p&gt;

&lt;p&gt;Preprocessors are programs that process the source code &lt;u&gt;before compilation&lt;/u&gt;. There are a number of steps between writing and executing a program in C. Let us have a look at these steps before we actually start familiarizing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmc3v06ppcnwketyndjr8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmc3v06ppcnwketyndjr8.png" alt="How C program works" width="751" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Source code written by programmers is stored in a file &lt;code&gt;program.c&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;It is then processed by preprocessors and an expanded source code file is generated &lt;code&gt;program.i&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Expanded file is compiled by the compiler and an object code file is generated &lt;code&gt;program.obj&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The linker links this object code file to the object code of the library functions to generate the executable file &lt;code&gt;program.exe&lt;/code&gt;. &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Preprocessor Directives
&lt;/h2&gt;

&lt;p&gt;Preprocessor programs provide preprocessor directives that tell the compiler to preprocess the source code before compiling. All of these preprocessor directives begin with a &lt;code&gt;#&lt;/code&gt; (hash) symbol.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ Remember that the &lt;code&gt;#&lt;/code&gt; symbol only provides a path to the preprocessor, and a command such as &lt;code&gt;include&lt;/code&gt; is processed by the preprocessor program. For example, &lt;code&gt;#include&lt;/code&gt; will include the code or content of the specified file in your program.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The following table lists all directives:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3986taybg612wy6oqoyi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3986taybg612wy6oqoyi.png" alt="Preprocessor Directives" width="800" height="699"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are 3 Main Types of Preprocessor Directives:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Macros&lt;/li&gt;
&lt;li&gt;File Inclusion&lt;/li&gt;
&lt;li&gt;Conditional Compilation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's now consider each of these directives in detail with many subtleties. &lt;/p&gt;

&lt;h2&gt;
  
  
  1. Macros
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;macro&lt;/strong&gt; is a piece of code in a program that is replaced by the value of the macro. Macro is defined by #define directive. Whenever a macro name is encountered by the compiler, it replaces the name with the definition of the macro. We use it always, you know, when we declare static arrays like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define MAX 100    // Macro

int main()
{
    int array[MAX];  // Declaring array
    printf("The value of MAX" is "%d", MAX);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, there are many other types of macros that probably you have not used yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.1. Object-like Macros&lt;/strong&gt;&lt;br&gt;
An &lt;strong&gt;object-like macro&lt;/strong&gt; is a simple identifier that will be replaced by a code fragment. It is called object-like because it looks like an object in code that uses it. It is popularly used to replace a symbolic name with numerical/variable represented as &lt;strong&gt;constant&lt;/strong&gt;. Just now we illustrated the example above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.2. Chain Macros&lt;/strong&gt;&lt;br&gt;
Macros inside macros are termed as &lt;strong&gt;chain macros&lt;/strong&gt;. In chain macros first of all parent macro is expanded then the child macro is expanded. Below is the illustration of a Chain Macro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define INSTAGRAM FOLLOWERS
#define FOLLOWERS 500

int main()
{
    printf("Cristiano Ronaldo has "%dM" followers on Instagram", INSTAGRAM);
    return 0;
}

// Output: Cristiano Ronaldo has 500M followers on Instagram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;1.3. Multi-line Macros&lt;/strong&gt;&lt;br&gt;
An object-like macro could have a multi-line. So to create a multi-line macro you have to use backslash-newline. Below is the illustration of multiline macros:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define ELE 1, \
            2, \
            3

int main()
{
    int arr[] = { ELE };
    printf("Elements of Array are:\n");
    for (int i = 0; i &amp;lt; 3; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

// Output: Elements of Array are: 1  2  3 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;1.4. Function-like Macros&lt;/strong&gt;&lt;br&gt;
These macros are the same as a function call. It replaces the entire code instead of a function name. &lt;strong&gt;Pair of parentheses immediately after the macro name is necessary.&lt;/strong&gt; If we put a space between the macro name and the parentheses in the macro definition, then the macro &lt;u&gt;will not work&lt;/u&gt;. A function-like macro is only lengthened if and only if its name appears with a pair of parentheses after it. If we don’t do this, the function pointer will get the address of the real function and lead to a &lt;strong&gt;&lt;em&gt;syntax error&lt;/em&gt;&lt;/strong&gt;.&lt;br&gt;
Below is the illustration of function-like macros:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define min(a, b) (((a) &amp;lt; (b)) ? (a) : (b))

int main()
{
    int a = 18;
    int b = 76;
    printf("Minimum value between %d and %d is %d\n", a, b, min(a, b));

    return 0;
}

// Output: Minimum value between 18 and 76 is 18
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. File Inclusion
&lt;/h2&gt;

&lt;p&gt;This type of preprocessor directive tells the compiler to include a file in the source code program. The &lt;code&gt;#include&lt;/code&gt; preprocessor directive is used to include the header files in the C/C++ program. There are 2 types of files that can be included by developer:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Standard Header Files&lt;/strong&gt;&lt;br&gt;
The standard header files contain definitions of pre-defined functions like &lt;code&gt;printf()&lt;/code&gt;, &lt;code&gt;scanf()&lt;/code&gt;, etc. These files must be included to work with these functions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;file_name&amp;gt;

// &amp;lt; and &amp;gt; brackets tell the compiler to look for standard directory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. User-defined Header Files&lt;/strong&gt;&lt;br&gt;
When a program becomes very large, it is a good practice to divide it into smaller files and include them whenever needed. These types of files are user-defined header files. These files can be included as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include "file_name"

// The double quotes ( ” ” ) tell the compiler to search for the header file in the source file’s directory.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Conditional Compilation
&lt;/h2&gt;

&lt;p&gt;It is a type of directive that helps to compile a specific portion of the program or to skip the compilation of some specific part of the program &lt;u&gt;based on some conditions&lt;/u&gt;. There are the following preprocessor directives that are used to insert conditional code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#if&lt;/code&gt; Directive&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#ifdef&lt;/code&gt; Directive&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#ifndef&lt;/code&gt; Directive&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#else&lt;/code&gt; Directive&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#elif&lt;/code&gt; Directive&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#endif&lt;/code&gt; Directive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#ifdef macro_name
    statement1;
    statement2;
    statement3;
    .
    .
    .
    statementN;
#endif
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the macro with the name &lt;code&gt;macro_name&lt;/code&gt; is defined, then the block of statements will execute normally, but if it is not defined, the compiler will simply skip this block of statements.&lt;/p&gt;

&lt;p&gt;Actually, there is 2 more derivatives are available, but as they are not commonly used and &lt;code&gt;#pragma&lt;/code&gt; is not even supported by GCC compilers, I think there is no point to show them.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Interesting Facts
&lt;/h2&gt;

&lt;p&gt;That's all about Preprocessors and Macros. Now, let's have fun by learning some gripping facts about them.&lt;/p&gt;

&lt;p&gt;1️⃣ Macros can take function like arguments, the arguments are &lt;u&gt;not checked for data type&lt;/u&gt;. For example, the following macro &lt;code&gt;INCREMENT(x)&lt;/code&gt; can be used for &lt;code&gt;x&lt;/code&gt; of any data type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define INCREMENT(x) ++x
int main()
{
    char* ptr = "Embedded";
    int x = 10;
    printf("%s ", INCREMENT(ptr)); // pointer to string is moved by 1 character
    printf("%d", INCREMENT(x));
    return 0;
}

// Output: mbedded  11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2️⃣ The macro arguments are &lt;u&gt;not evaluated&lt;/u&gt; before macro expansion. For example, consider the following program:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define MULTIPLY(a, b) a* b

int main()
{
    // The macro is expanded as 2 + 3 * 3 + 5, not as 5*8
    printf("%d", MULTIPLY(2 + 3, 3 + 5));
    return 0;
}

// Output: 16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This problem can be solved as shown below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define MULTIPLY(a, b) (a) * (b)

int main()
{
    // The macro is expanded as (2 + 3) * (3 + 5), as 5*8
    printf("%d", MULTIPLY(2 + 3, 3 + 5));
    return 0;
}

// Output: 40
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3️⃣ The tokens passed to macros can be concatenated using operator &lt;code&gt;##&lt;/code&gt; called Token-Pasting operator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define merge(a, b) a##b
int main()
{
    printf("%d ", merge(12, 34));
}

// Output: 1234
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4️⃣ A token passed to macro can be converted to a string literal by using &lt;code&gt;#&lt;/code&gt; before it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#define get(a) #a

int main()
{
    // Memati is changed to "Memati"
    printf("%s", get(Memati)); // Note: Memati is not a string here!
}

Output: Memati
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5️⃣ The macros with arguments should be avoided as they cause problems sometimes. And Inline functions should be preferred as there is type checking parameter evaluation in inline functions. From C99 onward, inline functions are supported by C language also. &lt;/p&gt;

&lt;p&gt;For example consider the following program. From first look the output seems to be 1, but it produces 36 as output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

#define square(x) x* x
int main()
{
    // Expanded as 36/6*6
    int x = 36 / square(6);
    printf("%d", x);
    return 0;
}

// Output: 36
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But we can write this code as follows to get the expected result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

#define square(x) (x * x)
int main()
{
    // Expanded as 36/(6*6)
    int x = 36 / square(6);
    printf("%d", x);
    return 0;
}

// Output: 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6️⃣ There are some standard macros which can be used to print program file &lt;code&gt;__FILE__&lt;/code&gt;, Date of compilation &lt;code&gt;__DATE__&lt;/code&gt;, Time of compilation &lt;code&gt;__TIME__&lt;/code&gt; and Line Number in C code &lt;code&gt;__LINE__&lt;/code&gt;. Below is an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main()
{
    printf("Current File :%s\n", __FILE__);
    printf("Current Date :%s\n", __DATE__);
    printf("Current Time :%s\n", __TIME__);
    printf("Line Number :%d\n", __LINE__);
    return 0;
}

// Output: Current File :/usr/share/IDE_PROGRAMS/C/other/081c548d50135ed88cfa0296159b05ca/081c548d50135ed88cfa0296159b05ca.c
Current Date :Sep  4 2019
Current Time :10:17:43
Line Number :8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Today, we completed discussing about Preprocessors and Macros in C. It turns out that although pieces of code with #s and &amp;lt;&amp;gt;s seems "negligible", they play really fundamental role in any C program. &lt;/p&gt;

&lt;p&gt;The only one very vital topic is lasting: Bit Manipulation! &lt;br&gt;
&lt;strong&gt;🏁 That's it for now. Thank you!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>c</category>
      <category>cpp</category>
    </item>
    <item>
      <title>✅ Algorithm Correctness haqida</title>
      <dc:creator>Samandar Komilov</dc:creator>
      <pubDate>Tue, 08 Aug 2023 20:02:01 +0000</pubDate>
      <link>https://dev.to/samandar_komilov/algorithm-correctness-haqida-1ei7</link>
      <guid>https://dev.to/samandar_komilov/algorithm-correctness-haqida-1ei7</guid>
      <description>&lt;p&gt;&lt;em&gt;❗️ Disclaimer: Mazkur maqola Steven Skienaning "Algorithm Design Manual" kitobidan UZ-EN aralash tilda konspekt sifatida yozilgandir. Iltimos, xato-kamchilik ko'rsangiz kommentda feedback qoldiring.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;👉 Biz hozirgacha aynan algoritm haqida ko'p fikr yuritdik, hayotiy misollar orqali tasavvurga ega bo'ldik. Biroq bu approach qaysidir ma'noda siz-u bizda &lt;em&gt;"Algoritm universal narsa ekan. Hamma narsa algoritm ekan"&lt;/em&gt; degan sodda tushunchani shakllantirgan bo'lsa ajab emas. Lekin aslida rostdan ham shundaymi? &lt;br&gt;
Algoritmlar ishlashiga qarab yaxshi va yomon turlarga bo'linadi. Yaxshi algoritmning 3 xil asosiy xususiyati mavjud:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;correct&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;efficient&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;easy to implement&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kitobning dastlabki chapterida &lt;strong&gt;correctness&lt;/strong&gt; haqida so'z boradi va biz ham maqola davomida mazkur jihatga e'tibor qaratamiz. &lt;/p&gt;

&lt;p&gt;📏 7-sinfda geometriya darslaridan "teorema" va "aksioma" atamalariga duch kelgansiz-a? Algoritmlarda ham xuddi shu kabi struktura ishlar ekan:&lt;br&gt;
&lt;strong&gt;Algoritm&lt;/strong&gt; - qabul qilishi mumkin bo'lgan har qanday input uchun har doim to'g'ri natija chiqaradigan steplar ketma-ketligi algoritmdir.&lt;br&gt;
&lt;strong&gt;Heuristic&lt;/strong&gt; - kamida 1 ta shunday input instance topiladiki *algoritm noto'g'ri output chiqaradi va bu heuristic deyiladi.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrvbsqmx6b5d1jd2820o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcrvbsqmx6b5d1jd2820o.png" alt=" " width="757" height="145"&gt;&lt;/a&gt;&lt;br&gt;
Keling bir misol orqali tushunib olsak. &lt;br&gt;
❓ &lt;em&gt;Aytaylik bir aktyorga rasmdagi kabi kinolardan takliflar kelgan. Har bir kino qancha davom etishidan qat'iy nazar bir xil pul to'laydi. Aktyor qanday algoritm orqali kinolarni tanlasa eng ko'p pul ishlay oladi?&lt;/em&gt;&lt;br&gt;
✅ Hah, osonku degandirsiz. Ehtimol har safar eng birinchi boshlanadigan kinolarni tanlab borish kerakdir? Ha siz haqsiz va.. nohaqsiz! Agar holat quyidagi rasm kabi bo'lsachi?&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5s8lplnqffex6yv4optm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5s8lplnqffex6yv4optm.png" alt=" " width="514" height="187"&gt;&lt;/a&gt;&lt;br&gt;
E'tibor bering, agar birinchi boshlanadiganni tanlasak, boshqa hech bir kinoni tanlay olmaymiz!&lt;br&gt;
Yaxshi, demak ko'proq pul topish uchun kino qisqaroq bo'lishi kerak. Demak eng qisqa kinolarni tanlab ketaversak bo'lmaydimi? Ok, siz aytgandek bo'laqolsin:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fydn8ctnfkte3rceqc2v1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fydn8ctnfkte3rceqc2v1.png" alt=" " width="514" height="187"&gt;&lt;/a&gt;&lt;br&gt;
Bu holatda esa eng qisqasini tanlash eng optimal yechim bo'lmaydi. Demak bu ikki ehtimoliy yechimlar algoritm bo'la olmaydi, ular heuristicdir. Yechim esa &lt;u&gt;greedy algorithm&lt;/u&gt; usulida bo'ladi. Ya'ni, eng tez tugaydigan kinolarni tanlab boramiz. Mazkur holatda kinolar qay tartibda joylashishidan qat'iy nazar baribir biz eng optimal yechimga ega bo'lamiz. Buni esa algoritm deb tushunish mumkin.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Mantiqan to'g'ri algoritmlar osongina xato bo'lishi mumkin.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Xo'sh, demak biz algoritm degan hamma ketma-ketlik ham to'g'ri bo'lavermas ekan. Mayli, lekin uni to'g'ri ekanini qanday aniqlash mumkin? Buning uchun bizga maxsus tool kerak va bu &lt;strong&gt;isbot&lt;/strong&gt; deb ataladi. &lt;br&gt;
Proper matematik isbot 3 ta asosiy qismdan tashkil topadi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;isbot qilinishi kerak bo'lgan narsa haqida aniq tavsif&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;isbotning bir qismi sifatida foydalanish mumkin bo'lgan, to'g'ri deb olinadigan farazlar to'plami&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;mazkur farazlardan isbot tomon olib boradigan mulohazalar zanjiri&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Osonroq tushunadigan bo'lsak, bu xuddi biror matematik masalani yechayotganimizda masala nimani so'rayotganini aniqlab, foydalanish mumkin bo'lgan formulalarni topib, zanjir tarzida formuladan yechimga qarab yurishga o'xshaydi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expressing Algorithms
&lt;/h2&gt;

&lt;p&gt;Algoritm haqida uning har bir qadami haqida aniq tavsif bo'lmasa fikr qilish imkonsizdir. Demak, biz albatta qandaydir usulda algoritmni ta'riflab berishimiz shart. Buni ham 3 xil usul yoxud tilda amalga oshirish mumkin:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- English&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Pseudocode&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Programming language&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Har birining o'z ustunlik va kamchiliklari bor: English ko'proq natural, lekin aniqligi past. Java, C++ kabi dasturlash tillari aniq, lekin tushunish qiyin. Pseudocode esa oltin o'rtalikda - uni yozish ham o'qish ham tushunish ham oson, hamda hech qanday syntax errorlar mavjud emas. Ammo pseudocode yozishda ham eng muhim narsa aniqlik ekanini unutmaslik shart, zero ko'pgina xatoliklar psevdokodni chiroyli qilaman deb aniqlikni kamayishi va ideaning buzilishi ortidan hosil bo'ladi.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Har qanday algoritmning yuragi aniq g'oyadan iborat.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Algoritmning to'g'riligini ko'rsatish uchun bizga uning ta'rifidan tashqari yechilayotgan muammoning ham aniq tavsifi kerak bo'ladi. Bular:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;barcha ruxsat etilgan input instancelar to'plami&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;barcha talab etilgan outputlar to'plami&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shu ikki narsa qanchalik noaniq bo'lsa, muammo ham shunchalik well-specified holatidan uzoqlashib general bo'lib boradi. Bu esa o'z navbatida muammoga yechim topishning qiyinlashishi va hatto imkonsiz qilishi mumkin.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Generalized problem uchun hech qanday efficient algoritm mavjud emas.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Demak, hatto muammo umumiy bo'lsa ham uning miqyosini qisqartirgan holda yechim topish algoritm dizaynning eng asosiy texnikalaridan biridir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstrating Incorrectness
&lt;/h2&gt;

&lt;p&gt;🖋 Yana matematikaga qaytamiz. Biror ayniyatni xato ekanini isbotlash uchun qanday harakat qilardik, eslaysizmi? Bitta bo'lsa ham holat topishga harakat qilardikki ayniyat xato bo'lsin, shundaymi? &lt;br&gt;
Algoritm noto'g'ri ekanini isbotlashning ham usuli shunday: xato natija beradigan instance, ya'ni &lt;strong&gt;counter-example&lt;/strong&gt; topishdir. Yaxshi counter-example quyidagi xususiyatlarga ega bo'ladi:&lt;br&gt;
&lt;strong&gt;- Verifiability&lt;/strong&gt;: 1) shu example kiritilganda algoritm chiqaradigan natijani hisoblash; 2) algoritm xato ekanini isbotlash uchun bundan yaxshiroq natija borligini ko'rsatish.&lt;br&gt;
&lt;strong&gt;- Simplicity&lt;/strong&gt;: algoritm nima uchun xato ekanini aniq va oddiy holda ko'rsata olish.&lt;/p&gt;

&lt;p&gt;Shu o'rinda kitobda counter-example topish uchun bir necha maxsus texnika va maslahatlar keltirilgan, biroq ularga to'xtalmay oldinga o'tamiz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Induction and Recursion
&lt;/h2&gt;

&lt;p&gt;Ba'zida algoritm xato ekanini counter-example usuli bilan ham ko'rsata olmaymiz. Lekin bu ham algoritm to'g'ri ekanini anglatmas ekan. Bizga baribir isbot zarur va odatda bu matematik induksiya metodi orqali amalga oshiriladi.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Rekursiya aslida matematik induksiyadir.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ha adashmadingiz, aynan shunday. Bir o'ylab ko'ring-a, har ikkisi uchun quyidagicha umumiyliklar mavjud:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- base case (like 1 or 2)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Divide and Conquer metodi: muammoni sub-muammolarga ajratish&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Progressive approach&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agar siz rekursiya va matematik induksiya haqida yaxshi bilsangiz, menimcha ma'noni tushundingiz.&lt;/p&gt;

&lt;p&gt;Tez orada davomini yozaman...&lt;/p&gt;




&lt;p&gt;🏁 &lt;em&gt;Xulosa qiladigan bo'lsak, bizga algoritm tuyulgan hamma ketma-ketlik ham aslida unday bo'lmasligi mumkin ekan. Algoritm to'g'riligini isbotlash Algoritm dizaynning eng muhim fundamental bilimlaridan ekanligi tushunildi. E'tiboringiz uchun rahmat!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
    </item>
    <item>
      <title>C da Struct, Union va Enum</title>
      <dc:creator>Samandar Komilov</dc:creator>
      <pubDate>Fri, 14 Jul 2023 12:07:39 +0000</pubDate>
      <link>https://dev.to/samandar_komilov/c-da-struct-union-va-enum-184j</link>
      <guid>https://dev.to/samandar_komilov/c-da-struct-union-va-enum-184j</guid>
      <description>&lt;p&gt;Bugun C dasturlash tilining muhim qismlaridan bo'lgan Strukturalar, Birlashmalar va Enumlar haqida gaplashamiz.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;👉 Struct&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Struct bu user-defined data turi bo'lib, bir necha turdagi ma'lumotlarni bir turga jamlash uchun ishlatilishi mumkin. Struct xuddi Object oriented tillardagi Classlarga o'xshab ketadi, biroq ba'zi farqlari mavjud. Struct dasturda ishlatilishidan oldin e'lon qilinishi shart. Odatda &lt;code&gt;main()&lt;/code&gt; dan ham tashqarida e'lon qilish maslahat beriladi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Maqolada Student misolida beriladi.
struct Student {
    char name[100];
    int  matricula;
    ...
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mazkur blok &lt;strong&gt;struktura prototipi&lt;/strong&gt; deb ataladi va biz unga &lt;u&gt;instance&lt;/u&gt; hosil qilmagunimizcha xotiradan joy olmaydi. &lt;br&gt;
Buni biz shu struktura tipidagi o'zgaruvchi e'lon qilish orqali amalga oshirishimiz mumkin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Student {
    char name[100];
    int matricula;
    ...
} student1, student2;

struct Student student3, student4;
// 2 xil usulda struktura o'zgaruvchilari hosil qilindi.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Struktura memberlariga &lt;strong&gt;dot operator (.)&lt;/strong&gt; orqali access qilinadi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;student1.matricula;
student3.name;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❗️ Struktura memberlariga declaration paytida qiymat berish mumkin emas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Student {
   char name[100] = "Abdulxay"; 
   int matricula = 28;
   // Compile error!
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sababi yuqorida aytganimizdek, struct e'lon qilinganda xotiradan joy olmaydi toki shu turdagi o'zgaruvchi e'lon qilinmaguncha. O'zgaruvchi memberlarini initialize qilishning 3 xil usuli mavjud:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 1-usul

// String holatida strcpy ishlatilishi shart!
strcpy(student1.name, "Hikmet");
student1.matricula = 26;

// 2-usul
struct Student student2 = {"Erhan",27};

// 3-usul
struct Student student3 = {.name = "Zaza", .matricula = 22};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;- typedef&lt;/strong&gt;&lt;br&gt;
⌛️ Ba'zida struktura nomi uzun bo'lib ketadi va bu vaqtni bekorga sarf qilishi mumkin. Shu holatda &lt;code&gt;typedef&lt;/code&gt; keywordini ishlatish maqsadga muvofiq:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;typedef struct Student {
    char name[100];
    int  matricula;
    ...
} student_t;

student_t winner = {"Memati", 30};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yerda yangi &lt;code&gt;student_t&lt;/code&gt; derived type bo'yicha o'zgaruvchi e'lon qilinmoqda. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Nested structures&lt;/strong&gt;&lt;br&gt;
OOP mavjud tillarda Class ichida Class ochish mumkin bo'lgani kabi C da ham struct ichida struct ochish mumkin. Buning ham 2 xil usuli bor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 1. Embedded Nesting
struct Wolves {
    char name[100];
    struct Team team {
        int no;
        int power;
        ...
    }
    ...
}

// 2. Separate Nesting
struct Team {
    int no;
    int power;
    ...
}

struct Wolves {
    char name[100];
    struct Team team;
    ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nested memberlarga access qilish ham dot operator yordamida amalga oshadi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wolve1.team.no;
wolve2.team.power;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nested holatida bir necha struktura alohida e'lon qilinsa-da, qiymat faqat Parent strukturaga beriladi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Wolves wolve1 = {.name="Jahid", .team.no = 1, .team.power = 100};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;- Structure Pointers&lt;/strong&gt;&lt;br&gt;
Biz boshqa turlarga qilganimiz kabi strukturaga ham pointer berishimiz mumkin. Bu aslida juda efficient usul bo'lib, funksiya argumentiga struct o'rniga uning pointeri kiritilishi buning bir misoli.&lt;br&gt;
Struktura pointeri yordamida struct memberlariga access qilish biroz murakkab (&lt;em&gt;ptr.field), shu sabab **arrow operator (-&amp;gt;)&lt;/em&gt;* yordamida osonlashtirilgan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Point {
    int x, y;
};

struct Point nuqta = {1,2};
struct Point* ptr = &amp;amp;nuqta;

// Pointer yordamida strukturaga access qilish
printf("%d %d",ptr-&amp;gt;x, ptr-&amp;gt;y);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;- Self-referential Structures&lt;/strong&gt;&lt;br&gt;
O'z-o'ziga murojaat qiluvchi strukturalarni tushunish bizga Data Structures tomon yo'l ochadi. Chunki bu tushuncha ustiga Linked List, Tree, Graph kabi ma'lumot tuzilmalari qurilgan. &lt;br&gt;
O'z-o'ziga murojaat qiluvchi - o'z turidagi boshqa o'zgaruvchilarning adresini/pointerini ham saqlaydigan struct o'zgaruvchilari. Buni misol bilan ko'rish yaxshiroq:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;typedef struct Node {
    char name[50];
    int no;
    struct Node* next;
} node_t;

int main()
{
    node_t node1 = { "N1", 1, NULL };
    node_t node2 = { "N2", 2, NULL };

    // node2 ning adresini node1.next ga tenglash
    node1.next = &amp;amp;node2;

    // node1 ga pointer
    node_t *ptr1 = &amp;amp;node1;

    // node1 yordamida node2 ga access qilish
    printf("node2.name: %s\nnode2.no: %d", ptr1-&amp;gt;next-&amp;gt;name,
           ptr1-&amp;gt;next-&amp;gt;no);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ko'rib turganimizdek, node1.next = &amp;amp;node2; orqali node2 ning adresi node1 da saqlanmoqda. Linked Listda ham idea shunday to'g'rimi, ya'ni o'zidan keyingi element adresini saqlashi kerak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Structure Padding&lt;/strong&gt;&lt;br&gt;
❓ Bir savol tug'iladi, struct xotirada qanday joy egallaydi?&lt;br&gt;
✅ 32 bitli kompilyator uchun protsessor bir vaqtning o'zida faqat 4 baytni o'qiy oladi. Shu tufayli bunday kompilyatorda, xotira 4 baytlik bloklarga bo'lingan bo'ladi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dzl4t8ro8touvcygxrc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dzl4t8ro8touvcygxrc.png" alt="Struct padding" width="640" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keling bir misol ko'raylik. Berilgan rasmda quyidagi struct qurilgan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct student 
{
       int id1;
       int id2;
       char a;
       char b;
       float percentage;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yerda &lt;code&gt;int&lt;/code&gt; uchun 4 bayt, har bir belgi uchun 1 bayt. Ko'rib turganingizdek, 2 ta belgi faqat 2 bayt xotirani ajratadi va protsessor avtomatik ravishda boshqa 2 baytni bo'sh qoldirib, keyingi 4 baytlik blokga o'tadi. Bu &lt;strong&gt;Struct padding&lt;/strong&gt; deb ataladi.&lt;/p&gt;

&lt;p&gt;Shunday qilib struct bo'yicha kirish qismi tugadi. Endi Union va Enum haqida fikr yuritamiz.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;👉 Union&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Union ham user-defined data type va syntax jihatdan 100% struct bilan bir xil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;typedef struct {
    int x;
    float y;
    char z;
} str_t;

typedef union {
    int x;
    float y;
    char z;
} uni_t;

// Memberlarga access qilish
uni_t uni1.x = 4;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu ikki tuzilmaning farqi xotiradan oladigan joyda seziladi. Struktura memberlari alohida locationlarga joylashadi, Union esa barcha o'zgaruvchilar bir locationga joylashadi. Keling, o'xshatish uchun bir stupid html example keltiraman:&lt;br&gt;
Struct - input:checkbox&lt;br&gt;
Union - select&lt;br&gt;
Ya'ni, strukturada bir necha memberlar "tanlanishi" mumkin, unionda esa faqat bittasi "tanlanadi".&lt;/p&gt;

&lt;p&gt;Strukturaning o'lchami undagi barcha memberlar o'lchamlari yig'indisiga teng bo'lsa, Unionda esa ularning eng kattasi. Buni isbotlash uchun yuqoridagi struct va unionning o'lchamlarini topamiz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
int main(){
    printf("Size of struct: %lu\n", sizeof(str_t));
    printf("Size of union: %lu\n", sizeof(uni_t));

    return 0;
}

// Returns 12 and 4 respectively
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Demak, struct uchun:&lt;br&gt;
&lt;code&gt;4 (int) + 4 (float) + 1 (char) + 3 (struct padding) = 12&lt;/code&gt;&lt;br&gt;
bo'lsa, union uchun:&lt;br&gt;
&lt;code&gt;max(4 (int), 4 (float), 1 (char)) = 4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;❓ Xo'sh, Union qanday hollarda ishlatiladi?&lt;br&gt;
Buni bir misol bilan tushuntiramiz. Tasavvur qiling, bir o'yin yasayapmiz va unda characterlar bor. Character odam bo'lishi ham robot bo'lishi ham mumkin. Agar u odam bo'lsa, uning shaxsiyati, agar robot bo'lsa ichidagi dasturi haqidagi ma'lumotlar bo'lishi kerak. Aynan shu qismda Union bizga kerak bo'ladi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;typedef struct {
    char *name;
    bool isRobot;
    union {
        char *personality;
        int firmware_version;
    }
} character;

void print_character(character* c){
    printf("Character is : %s",c-&amp;gt;name);
    if (c-&amp;gt;isRobot){
        printf("Version: %d", c-&amp;gt;firmware_version);
    } else{
        printf("Personality: %s", c-&amp;gt;personality);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Demak union orqali biz xuddiki dropdown menu vazifasini C da bajaryapmiz. Bu usul &lt;em&gt;memory-efficient&lt;/em&gt; ham hisoblanadi.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;- Enum&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Enumeration (yoxud perebor) user-defined data type bo'lib, o'zbek tilida "sanab chiqish, hisoblash" kabi ma'nolarda keladi. Ushbu data type integral konstantalardan iborat bo'ladi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum Size {
    Small,
    Medium,
    Large,
    ExtraLarge
};

int main(){
    enum Size shoeSize;
    shoeSize = Small;

    printf("Shoe Size is : %d", shoeSize);

    return 0;
};

// outputs 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu yerda ko'rishimiz mumkinki, biz define qilgan nomlarga enum o'zi raqam - state qo'yib berar ekan. &lt;code&gt;Small&lt;/code&gt; keywordi birinchi turgani uchun unda &lt;code&gt;state=0&lt;/code&gt; bo'ladi. Biz shunchaki ularni raqamlab chiqsak va indeks bo'yicha chaqirsak ham bo'lar edi, lekin dastur readability va osonligi jihatdan enumeration bizga qulayroq. Quyidagi rasmda yanada batafsil tanishish mumkin:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosaaxcxkkwlpw6itzaj1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosaaxcxkkwlpw6itzaj1.png" alt="Enum" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🏁 &lt;em&gt;Xulosa qilib aytadigan bo'lsak, Struct, Union va Enum tiplari barchasi user-defined hisoblanadi va turli holatlarda ishlatiladi. Ular ichida eng muhimi Struct bo'lib, uni "C ning Classi" deyish mumkin.&lt;br&gt;
Bu maqolamiz DSA ga kirish oldidan oxirgi fundamental bilimlar haqida bo'ldi. E'tiboringiz uchun rahmat!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>c</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Dinamik xotira | Dynamic Memory allocation</title>
      <dc:creator>Samandar Komilov</dc:creator>
      <pubDate>Mon, 10 Jul 2023 18:56:52 +0000</pubDate>
      <link>https://dev.to/samandar_komilov/dinamik-xotira-dynamic-memory-allocation-n1n</link>
      <guid>https://dev.to/samandar_komilov/dinamik-xotira-dynamic-memory-allocation-n1n</guid>
      <description>&lt;p&gt;👉 Keling, avvalo Memory Allocation o'zi nima ekanligi haqida biroz so'z yuritsak.&lt;br&gt;
&lt;strong&gt;Memory allocation&lt;/strong&gt; deb dastur ishlashi uchun kompyuter tezkor xotirasi (RAM)dan talab etilgan miqdorda resurs/joy ajratish jarayoni tushuniladi. Xotira ajratishning 2 xil turi mavjud:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Static Memory Allocation&lt;/strong&gt;&lt;br&gt;
Mazkur jarayon dastur kompilyatsiya bo'layotgan paytda amalga oshadi (Compile-time allocation). Sababi bunda Stack xotiradan joy ajratiladi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Dynamic Memory Allocation&lt;/strong&gt;&lt;br&gt;
Bu jarayon esa dastur ishlashni boshlagan paytda amalga oshadi (Run-time allocation). Sababi bunda Heap xotiradan joy ajratiladi. (Stack va Heap haqida keyingi maqolalarda batafsil so'z yuritamiz)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flo3aq1om0fh3jqqt0r0b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flo3aq1om0fh3jqqt0r0b.png" alt="Stack and Heap memory" width="676" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;C dasturlash tilida Dinamik xotiradan joy ajratish uchun &lt;code&gt;&amp;lt;stdlib.h&amp;gt;&lt;/code&gt; kutubxonasining 4 ta funksiyasidan foydalaniladi.&lt;/p&gt;
&lt;h2&gt;
  
  
  - malloc()
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;malloc()&lt;/code&gt; yoxud "memory allocation" funksiyasi belgilangan data type va o'lcham bo'yicha dinamik xotiradan joy ajratadi. Quyida bir misol ko'ramiz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int main() {
    int n;

    int* ptr;
    ptr = (int*) malloc(n * sizeof(int));

    if (ptr == NULL) {
        printf("Xotirada joy ajratilmadi.\n");
        exit(0);
    }

    // Pointerni dinamik array sifatida ishlatish
    for (int j = 0; j &amp;lt; n; ++j) {
        ptr[j] = j + 1;
    }

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dasturning maqsadi &lt;code&gt;n&lt;/code&gt; ta integer uchun dinamik xotiradan joy ajratish. Lekin bu yerda &lt;code&gt;sizeof()&lt;/code&gt; nega kerak? Sababi har bir ma'lumot turi xotirada turlicha joy egallaydi va biz shulardan &lt;code&gt;n&lt;/code&gt; tasiga joy ochish uchun uning o'lchamini aniqlashimiz shart: &lt;code&gt;n * sizeof(&amp;lt;data_type&amp;gt;)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1dbr1z7hv4ko2qz8eqjm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1dbr1z7hv4ko2qz8eqjm.jpg" alt="Memory allocation for fundamental data types" width="655" height="217"&gt;&lt;/a&gt;&lt;br&gt;
Yaxshi, o'lchamni aniqladik, &lt;code&gt;malloc()&lt;/code&gt; bizga joy ajratdi. Lekin &lt;code&gt;(int*)&lt;/code&gt; yana nimasi?! &lt;br&gt;
&lt;strong&gt;Void pointer&lt;/strong&gt; - hech qayerga point qilmaydigan pointer. Ya'ni hech bir data turidagi o'zgaruvchining addressini qaytarmaydi. &lt;code&gt;malloc()&lt;/code&gt; xotiradan joy ajratgach, shu joydagi 1-baytga nisbatan aynan &lt;u&gt;void pointer&lt;/u&gt; qaytaradi. Chunki dastur bu joyga biz qaysi turdagi o'zgaruvchini saqlamoqchi ekanimizni bilmaydi. Natijada bu vazifani qo'lda bajarishimiz kerak bo'ladi va buni biz &lt;em&gt;type-casting&lt;/em&gt; yoxud &lt;code&gt;(&amp;lt;data_type&amp;gt;*)&lt;/code&gt; yordamida bajaramiz.&lt;br&gt;
Finally, ajratilgan joyning 1-baytiga nisbatan integer pointerni &lt;code&gt;ptr&lt;/code&gt; o'zgaruvchisiga assign qilamiz. Endi aynan shu o'zgaruvchi yordamida bu dinamik xotiraga access qilish mumkin bo'ladi. Dasturning oxirida esa tekshirib ko'ryapmiz: agar &lt;code&gt;malloc()&lt;/code&gt; o'zidan &lt;code&gt;NULL&lt;/code&gt; qaytarsa yoxud xotiradan joy ajratmasa dasturni o'chirib foydalanuvchini ogohlantirsin.&lt;/p&gt;

&lt;p&gt;✅ Bonus sifatida Dinamik array tushunchasiga ham to'xtalamiz. Eng qiziq joyi nima bilasizmi? Hozir ko'rgan pointerimiz bir vaqtda array vazifasini bajaradi😄. Yuqoridagi kodning so'ngi blokida ko'rish mumkinki, biz pointerga array kabi access qilyapmiz, chunki &lt;code&gt;ptr[j] = *(ptr+j)&lt;/code&gt; o'rinli.&lt;/p&gt;
&lt;h2&gt;
  
  
  - calloc()
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;calloc()&lt;/code&gt; yoxud "contiguous allocation" deyarli &lt;code&gt;malloc()&lt;/code&gt; bilan bir xil, shu 2 ta nuqtadan tashqari:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;u har bir ajratilgan xotira blokining qiymatini 0 ga tenglashtirib chiqadi;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;malloc()&lt;/code&gt; dan farqli ravishda 2 ta argument qabul qiladi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyl81c9gfd10g73gtxsm2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyl81c9gfd10g73gtxsm2.png" alt="malloc() and calloc()" width="625" height="344"&gt;&lt;/a&gt;&lt;br&gt;
Quyida bir misol ko'ramiz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int main() {
    int n;

    int* ptr;
    ptr = (int*) calloc(n, sizeof(int));

    if (ptr == NULL) {
        printf("Xotirada joy ajratilmadi.\n");
        exit(0);
    }

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Haqiqatan ham e'tibor bersak, bu funksiyada &lt;code&gt;n&lt;/code&gt; va &lt;code&gt;sizeof(int)&lt;/code&gt; vergul bilan ajratiladi, ya'ni alohida 2 ta argument sifatida.&lt;/p&gt;

&lt;h2&gt;
  
  
  - free()
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;free()&lt;/code&gt; funksiyasi dinamik xotiradan ajratilgan joyni bo'shatish uchun ishlatiladi. Yuqoridagi 2 funksiya ham o'zi band qilgan joyni avtomatik tarzda bo'shatmagani tufayli bu funksiyaga ehtiyoj sezamiz. Ayniqsa, cheklangan xotira bilan ishlashda bu funksiya juda qo'l keladi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int main()
{
    int n;
    int *ptr1, *ptr2;

    ptr1 = (int*) malloc(n * sizeof(int));
    ptr2 = (int*) calloc(n, sizeof(int));

    if (ptr1 == NULL || ptr2 == NULL) {
        printf("Xotirada joy ajratilmadi.\n");
        exit(0);
    }

    free(ptr1);
    free(ptr2);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ko'rinib turibdiki, &lt;code&gt;free()&lt;/code&gt; yagona argument - ajratilgan xotiraga nisbatan pointer qabul qiladi va o'sha xotirani bo'shatadi.&lt;/p&gt;

&lt;h2&gt;
  
  
  - realloc()
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;realloc()&lt;/code&gt; yoxud "re-allocation" funksiyasi oldin &lt;code&gt;malloc()&lt;/code&gt; yoki &lt;code&gt;calloc()&lt;/code&gt; yordamida ajratilgan xotiraning taqsimotini dinamik ravishda o'zgartirish uchun ishlatiladi. Masalan oldin 4 ta integer uchun joy ajratilgan edi, endi esa 6 ta uchun ajratishimiz kerak. Quyida mazkur misolni ko'ramiz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;

int main()
{
    int n;
    int *ptr1, *ptr2;

    n = 4;
    ptr = (int*) malloc(n * sizeof(int));

    if (ptr == NULL) {
        printf("Xotirada joy ajratilmadi.\n");
        exit(0);
    }

    n = 6;
    ptr = realloc(ptr, n * sizeof(int));

    if (ptr == NULL) {
        printf("Xotirada joy ajratilmadi.\n");
        exit(0);
    }

    free(ptr);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;realloc()&lt;/code&gt; ishlash jarayonida avvalgi 4 ta integer uchun ajratilgan joyni saqlab qoladi va unga yana 2 ta qo'shib, 6 ta integerlik joy hosil qiladi. Agar xotirada buning uchun joy yetarli bo'lmasa, funksiya &lt;code&gt;NULL&lt;/code&gt; qaytaradi. Shu sabab bu funksiyani ham xatolikka tekshirish maqsadga muvofiqdir.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Qo'shimcha: Dynamic Strings!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Odatda string ham static holatda bo'ladi, ammo biz uni &lt;code&gt;malloc()&lt;/code&gt; funksiyasi yordamida boshqarishimiz mumkin. Bu ham xuddi yuqorida ko'rgan dinamik array bilan bir xil, sababi string aslida "charlar arrayi" hisoblanadi. &lt;br&gt;
Shuningdek, stringni copy qilish uchun biz &lt;code&gt;strcpy()&lt;/code&gt; ni ishlatar edik. Dinamik string uchun esa &lt;code&gt;strdup()&lt;/code&gt; ishlatiladi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#include &amp;lt;string.h&amp;gt;

...

char *name;

char input[30];
scanf("%s", input);

name = strdup(input);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sababi bu funksiya avtomatik tarzda &lt;code&gt;malloc()&lt;/code&gt; ham qiladi hamda o'lcham berilmagan dinamik string uchun kerakli joyni ochadi.&lt;/p&gt;




&lt;p&gt;🏁 &lt;em&gt;Dinamik xotira mavzusi C dasturlash tilining eng muhim qismlaridan biri hisoblanadi. Mazkur bilimni yaxshi bilish uning ustiga Data Strukturalar ilmini erkin qurish imkonini beradi.&lt;br&gt;
📌 Maqolani foydali deb topgan bo'lsangiz uni share qilishingiz mumkin. E'tiboringiz uchun rahmat!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>c</category>
      <category>algorithms</category>
    </item>
  </channel>
</rss>
