basic C programming notes for personal understanding Part 2

basic C programming notes for personal understanding Part  2

Structures

#include <stdio.h>
struct Date{
  int day, month, year;
};

int main(){
  struct Date Date1, Date2;

  printf("pleas enter 1st person day month year");
  scanf("%d %d %d", &Date1.day, &Date1.month, &Date1.year);
  printf("pleas enter 2nd person day month year");
  scanf("%d %d %d", &Date2.day, &Date2.month, &Date2.year);

  if (Date1.day == Date2.day && Date1.month == Date2.month && Date1.year == Date2.year){
    return printf("spacial birthday");
  }
  return printf("not spacial birthday");
  return 0;
}
#include <stdio.h>
struct Date{
  int day, month, year;
};

int main(){
  struct Date today = {31, 5, 2004}; // inline declare
  // today.day = 31;
  // today.month = 5;
  // today.year = 2004; // এভাবেও করা যাবে  । 
  today.year++; // updating year
  //================ ৩টা ভেলু কে একবারে আপডেট করতে চাইলে //====================
  today = (struct Date){12, 4, 3004};
  printf("%d-%d-%d\n", today.day, today.month, today.year);

  return 0;
}

Calculate the next Date and year

note: I want to do when a user gives input I want to see the next date, and if this date is the last date of the year then I want to show what's the next year date

#include <stdio.h>
struct Date
{
  int day, month, year;
};
int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{
  struct Date start;
  printf("inter day month year");
  scanf("%d %d %d", &start.day, &start.month, &start.year);
  struct Date nextDate = start;

  if (nextDate.day != daysInMonth[nextDate.month - 1]) {
    nextDate.day++;
  } else if (nextDate.month != 12) {
    nextDate.day = 1;
    nextDate.month++;
  } else {
    nextDate.day = 1;
    nextDate.month = 1;
    nextDate.year++;
  }
  printf("next day = %d, month = %d, year = %d\n", nextDate.day, nextDate.month, nextDate.year);
  return 0;
}
// ইনপুটঃ 31 5 2004

এখন আমি চাচ্ছি যে ইউজার বলে দিবে যে কত তারিখ থেকে কত তারিখ পর্যন্ত তারিখ দেখতে চাচ্ছে । আমাদের কাজ হবে সেটা করে দেখানো ।

#include <stdio.h>
struct Date { // type declaration 
  int day, month, year;
};

int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int main(){
  struct Date start;
  int days;
  printf("enter start date\n");
  scanf("%d %d %d", &start.day, &start.month, &start.year);
  printf("how many days you want");
  scanf("%d", &days);
  struct Date nextDate = start;
  for (size_t i = 0; i < days; i++) {
    if (nextDate.day != daysInMonth[nextDate.month - 1]) {
      nextDate.day++;
    } else if (nextDate.month != 12) {
      nextDate.day = 1;
      nextDate.month++;
    } else {
      nextDate.day = 1;
      nextDate.month = 1;
      nextDate.year++;
    };
    printf("next day = %d, month = %d, year = %d\n", nextDate.day, nextDate.month, nextDate.year);
  }
  return 0;
}
/* input:
enter start date
31 05 2004
how many days you want 100
*/

function and structure

এখন আমরা চাচ্ছি যে একটা তারিখ ইনপুট হিসেবে আসবে সেটা এই বছরের প্রথম দিন কিনা

#include <stdio.h>
#include <stdbool.h>
struct Date{ // type declaration  
  int day, month, year;
};
bool isFirstDay(struct Date date) {
  return date.day == 1 && date.month == 1;
};
int main(){
  struct Date date = {1, 2, 2004};
  if (isFirstDay(date)){
    printf("happy new year");
  } else {
    printf("enjoy this year, best of luck");
  }
  return 0;
}

Binary Number system

goto : https://advanced-ict.info/interactive/binary.html

1234 = 1000 + 200 + 30 + 4
     =      1 × 1000 || 10^3 
        +   2 × 100  || 10^2
        +   3 × 10   || 10^1
        +   4 × 10   || 10^0
                     || 👆 এগুলোতে বেস ১০ ধরা হচ্ছে মানে দশমিক সিস্টেম । আপনি অক্টাল বা অন্য নাম্বার সিস্টেম ধরতে  পারেন

Binary to decimal

#include <stdio.h>
#include <string.h>
unsigned int binaryToInt(char str[]){ // unsigned work for positive number
  int len = strlen(str);
  unsigned int ans = 0;
  for (int i = len - 1, p2 = 1; i >= 0; i--, p2 *= 2){ // উল্টা দিলে লুপ চালাচ্ছি কারণ সংখ্যা পদ্ধতিতে ডান দিকে less segnificant digit থাকে আর বাম দিলে most segnificant digit থাকে । এই ক্ষেত্রে ছোট থেকে বড়তে জাওয়াটা বুদ্ধিমানের কাজ তাই এমনটা করা ।/ 
    int bit = str[i] - '0'; // অ্যাসকি ভেলু টা বাদ দিলে আমাদের আকচুয়াল ভেলু পাওয়া যাবে । 
    // printf("%d %d %d\n", i, p2, bit);
    if (bit == 1){ // এখানে ০ নেওয়া হল না কারণ ০ এঁর সাথে কিছু গুন হলেতো ০  এ থেকে যাবে  
      ans += p2;
    }
  };
  return ans;
}
int main(){
  printf("%d\n", binaryToInt("1010"));
  return 0;
}

binary to decimal (বিকল্প)

#include <stdio.h>
#include <string.h>
unsigned int binaryToInt(char str[]){
  // unsigned work for positive number
  int len = strlen(str);
  unsigned int ans = 0;
  for (int i = 0; i < len; i++){
    int bit = str[i] - '0';
    // printf("%d × %d = %d +%d = %d\n", ans, 2, (ans * 2), bit, (ans * 2 + bit));
    ans = ans * 2 + bit;
    /*
      এখানে লুপটা যেহেতু সামনের দিকে  চলতেছে তাই যদি আমরা এরকম একটা ব্যাপার করলে আমরা আমাদের উত্তর পেয়ে যাব
     */
  }
  printf("%d\n", ans);
}
int main(){
  binaryToInt("1234");
  return 0;
}

Bitwise operator


/*
==========================AND (sign: &)==================================
  10 --> 0 0 0 0 1 0 1 0
  35 --> 0 0 1 0 0 0 1 1
             AND
   2 --> 0 0 0 0 0 0 1 0
==========================OR (sign: | )==================================
  10 --> 0 0 0 0 1 0 1 0
  35 --> 0 0 1 0 0 0 1 1
           OR
     --> 0 0 1 0 1 0 1 1
===============XOR (exclusive or -->sign: ^ )==================================
                      0 1 --> 1
                      1 0 --> 1
                      0 0 --> 0
                      1 1 --> 0
               ----->যেভাবে কাজ করে<-----

  10 --> 0 0 0 0 1 0 1 0
  35 --> 0 0 1 0 0 0 1 1
            XOR
     --> 0 0 1 0 1 0 0 1
==========================NOT( sign: ~ )==================================
                          সব বিটকে উল্টাই দেয় । 
      35 --> 0 0 1 0 0 0 1 1
  NOT 35 --> 1 1 0 1 1 1 0 0    
*/

bit shifting operator

  1. left shifting

  2. right shifting

      35 --> 0 0 1 0 0 0 1 1
  RS 35  --> 0 0 0 1 0 0 0 1  // ১ ঘর ডানে সরে গেছে । শুরুতে ০ আসবে [sign: >>]
  LS 35  --> 0 1 0 0 0 1 1 0  // এক ঘর বামে সরে গেছে । শেষে ০ আসবে  [sign: <<]

(Recap) how to group number by inputs


/*inputs syntax
    please enter size5
    enter indexes1
    enter indexes1
    enter indexes2
    enter indexes3
    enter indexes1
output:
    value->1 ,count- 3
    value->2 ,count- 1
    value->3 ,count- 1
*/
int main(){
  int size;
  printf("please enter size"); scanf("%d", &size);
  int num[size];
  for (int i = 0; i < size; i++){
    printf("enter indexes"); scanf("%d", &num[i]);
  }
  int count[11] = {0};
  for (int i = 0; i < size; i++){
    int val = num[i];  count[val]++;
  }
  for (int val = 0; val <= 10; val++){
    if (count[val] > 0) {
      printf("value->%d ,count- %d\n", val, count[val]);
    }
  }
  return 0;
}

(Recap) How to find min and max from an Array

int main(){
  int num[6] = {20,1,1000,-3,};
  int max = num[0], min = num[0];
  for (int i = 0; i < sizeof(num) / sizeof(num[0]); i++){
    int val = num[i];
    if (val > max) {
      max = val;
    };
    if (val < min){
      min = val;
    };
  }
  printf("max = %d, min = %d\n", max, min);
  return 0;
}

Function

I think you know about it

(Recap) Pointer এন্ড pointer to pointer

int main(){
  int a = 100;
  int *p = &a;
  int **q = &p;
  int ***x = &q;
  printf("%p %p\n", &a, a);
  printf("%p %p\n", &p, p);
  printf("%p %p\n", &q, q);
  printf("%p %p\n", &x, x);
  return 0;
}
/* এখানে খেয়াল করলে দেখা যাবে একজনের এড্রেস আর একজন হোল্ড করে আছে । একে পয়েন্টার টু পয়েন্টার বলে .
   এখানে যেকোনো কাওকে আপডেট করলে সকলে চেঞ্জ হয়ে যাবে । কারণ মেমোরি এড্রেস চেঞ্জ হয়ে যাচ্ছে । 
0x16d6daf28 0x64
0x16d6daf20 0x16d6daf28
0x16d6daf18 0x16d6daf20
0x16d6daf10 0x16d6daf18  */

(Recap) Array with pointer

int main(){
  int a[4] = {100, 987, 90897};
  printf("%d %d %d\n", *a, *(a + 1), *(a + 2)); // 100 987 90897
                    // 👆 এই কাজ টাই আমরা এইভাবে করি ।
  printf("%d %d %d\n", a[0], a[1], a[2]);       // 100 987 90897
  return 0;
}

(Recap) const pointer

int main(){
  int a = 100;
  const int *p = &a; // value চেঞ্জ করা যাবে না  এড্রেস চেঞ্জ করা যাবে 
  const int * const p = &a; // value চেঞ্জ করা যাবে না  এড্রেস চেঞ্জ করা যাবে না 
  *p = 200; // 🚫 এটা করতে দিবে  না ভালু চেঞ্জ 
  int b = 200;
  p = &b; // 🚫 এটা করতে দিবে  না address change 
  printf("a = %d\n", a);
  return 0;
}

(Recap) pointer in function

যখন আমরা একটা function এ প্যাঁরামিটার হিসেবে কোণ ভেলু পাছ করি তখন সেটা pass by value হিসেবে পাস করি (মানে একটা কপি পাঠাই) । সেখানে এই ভেলুর কোণ চেঞ্জ হলেও সেটা মেইন ভেলুর উপর প্রভাব ফেলে না ।

তবে যখন আমরা একটা ফাংশনে প্যাঁরামিটার হিসেবে এড্রেস পাঠাই তখন টাকে চেঞ্জ করলে সেটা মেইন ভেলুতে প্রভাব ফেলে .

: pass by value :

int example(int a){ a = 200; return 0;}
int main(){
  int a = 100; example(a);
  printf("a = %d\n", a); // not changed value 
  return 0;
}

: pass by address :

int example(int *a) { *a = 200; return 0; }
int main(){
  int a = 100; example(&a);
  printf("a = %d\n", a); // i will changed 100 to 200 because we send address
  return 0;
}

(Recap) delete element from an array

void delete_element(int *a, int n, int pos){
  for (int i = pos + 1; i < n; i++){
    a[i - 1] = a[i]; } }
int main() {
  int arr[6] = {1, 2, 3, 4, 5, 6};
  int pos;
  scanf("%d", &pos);
  delete_element(arr, 6, pos);
  printf("ans");
  for (int i = 0; i < 5; i++) { printf("%d", arr[i]); }
  return 0;
}

Did you find this article valuable?

Support Rashedul Islam by becoming a sponsor. Any amount is appreciated!