Table of contents
- Structures
- Calculate the next Date and year
- function and structure
- Binary Number system
- Binary to decimal
- binary to decimal (বিকল্প)
- Bitwise operator
- bit shifting operator
- (Recap) how to group number by inputs
- (Recap) How to find min and max from an Array
- Function
- (Recap) Pointer এন্ড pointer to pointer
- (Recap) Array with pointer
- (Recap) const pointer
- (Recap) pointer in function
- (Recap) delete element from an array
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
left shifting
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;
}