What is dictionary? How to add and remove elements in dictionary? In Python, a dictionary is a built-in data type that allows you to store and retrieve data in a key-value format. It is an unordered collection of items where each item consists of a key and its corresponding value. Dictionaries are also sometimes referred to as associative arrays or hash maps in other programming languages. To add elements to a dictionary, you can assign a value to a new or existing key. Here's an example: # Creating an empty dictionary my_dict = {} # Adding elements to the dictionary my_dict["key1"] = "value1" my_dict["key2"] = "value2" my_dict["key3"] = "value3" In the above example, the keys `"key1"`, `"key2"`, and `"key3"` are added to the dictionary `my_dict`, and their corresponding values `"value1"`, `"value2"`, and `"value3"` are assigned to them. You can also add elements to a dictionary using the `update()` method. This method allows you to add multiple key-value pairs at once by providing a dictionary or an iterable of key-value pairs. Here's an example: my_dict = {} # Adding elements using update() my_dict.update({"key1": "value1", "key2": "value2"}) To remove elements from a dictionary, you can use the `del` keyword followed by the key you want to remove. Here's an example: my_dict = {"key1": "value1", "key2": "value2", "key3": "value3"} # Removing an element from the dictionary del my_dict["key2"] In the above example, the element with the key `"key2"` is removed from the dictionary `my_dict` using the `del` statement. Alternatively, you can use the `pop()` method to remove an element from the dictionary and retrieve its value at the same time. This method takes the key as an argument and returns the corresponding value. Here's an example: my_dict = {"key1": "value1", "key2": "value2", "key3": "value3"} # Removing and retrieving an element from the dictionary using pop() value = my_dict.pop("key2") In the above example, the element with the key `"key2"` is removed from the dictionary `my_dict` using the `pop()` method, and its corresponding value is assigned to the variable `value`. It's important to note that when removing elements from a dictionary, you need to provide a valid key. Trying to remove a key that doesn't exist will result in a `KeyError` unless you handle it using error handling techniques like `tryexcept` blocks. What is a list? Explain accessing and removing of elements from list with example. In Python, a list is a built-in data type that allows you to store and manage a collection of items. It is an ordered sequence of elements, where each element can be of any data type. Lists are mutable, meaning you can modify them by adding, removing, or changing elements. To create a list, you can enclose a comma-separated sequence of values within square brackets []. Here's an example: my_list = [1, 2, 3, "hello", True] Accessing elements in a list: You can access individual elements in a list by using square brackets and the index of the element. Python uses zero-based indexing, which means the first element has an index of 0. Here's an example: my_list = [10, 20, 30, 40, 50] print(my_list[0]) # Output: 10 print(my_list[2]) # Output: 30 print(my_list[-1]) # Output: 50 (accessing the last element using negative index) Removing elements from a list: Using the `remove()` method: my_list = [10, 20, 30, 40, 50] my_list.remove(30) # Remove the element with value 30 print(my_list) # Output: [10, 20, 40, 50] Using the `pop()` method: my_list = [10, 20, 30, 40, 50] removed_element = my_list.pop(2) # Remove the element at index 2 print(removed_element) # Output: 30 print(my_list) # Output: [10, 20, 40, 50] Explain different data types supported by Python. Python supports several built-in data types 1. Numeric Types: - Integer (`int`): Represents whole numbers, such as 1, 2, -5, etc. - Float (`float`): Represents decimal numbers, such as 3.14, -0.5, etc. - Complex (`complex`): Represents numbers with both real and imaginary parts, such as 3 + 2j, -1 - 4j, etc. 2. Boolean Type: - Boolean (`bool`): Represents truth values, either `True` or `False`. Used for logical operations and conditional statements. 3. Sequence Types: - String (`str`): Represents a sequence of characters, such as "Hello", 'Python', etc. Immutable, meaning they cannot be changed after creation. - List (`list`): Represents an ordered collection of items enclosed in square brackets []. Items can be of different types and are mutable. - Tuple (`tuple`): Represents an ordered collection of items enclosed in parentheses (). Similar to lists, but immutable. 4. Mapping Type: - Dictionary (`dict`): Represents a collection of key-value pairs enclosed in curly braces {}. Keys are unique and used to access corresponding values. Mutable. 5. Set Types: - Set (`set`): Represents an unordered collection of unique elements enclosed in curly braces {}. Duplicate elements are automatically removed. - FrozenSet (`frozenset`): An immutable version of a set. Once created, its elements cannot be modified. 6. Sequence Types for Binary Data: - Bytes (`bytes`): Represents a sequence of bytes. Immutable. - Bytearray (`bytearray`): Represents a mutable sequence of bytes. 7. Other Types: - None (`NoneType`): Represents the absence of a value or a null value. - Range (`range`): Represents a sequence of numbers. Used for generating a sequence of numbers efficiently. These are the fundamental data types in Python. Additionally, Python allows you to define and work with custom data types using classes and objects, making it a versatile language for various programming needs. Write python program using function to find greatest of three numbers by passing numbers as argument. def find_greatest(num1, num2, num3): # Compare num1 and num2 if num1 >= num2: greatest = num1 else: greatest = num2 # Compare greatest with num3 if num3 > greatest: greatest = num3 return greatest # Test the function num1 = int(input("Enter the first number: ")) num2 = int(input("Enter the second number: ")) num3 = int(input("Enter the third number: ")) result = find_greatest(num1, num2, num3) print("The greatest number is:", result) Explain for loop in python with its syntax and example. In Python, a `for` loop is used to iterate over a sequence (such as a string, list, tuple, or dictionary) or other iterable objects. It allows you to repeatedly execute a block of code for each item in the sequence. The syntax of a `for` loop in Python is as follows: for item in sequence: # Code block to be executed for each item Example For for loop: fruits = ["apple", "banana", "cherry"] for fruit in fruits: print(fruit) Output: apple banana cherry List down types of operators in Python. Explain relational operators. In Python, there are several types of operators that perform different operations on operands. The common types of operators in Python are: 1. Arithmetic Operators: Perform arithmetic operations on numeric operands, such as addition (+), subtraction (-), multiplication (*), division (/), modulus (%), exponentiation (**), and floor division (//). 2. Assignment Operators: Assign values to variables, such as =, +=, -=, *=, /=, %=, **=, and //=. 3. Comparison Operators (Relational Operators): Compare values and return a boolean result (True or False). These operators include == (equal to), != (not equal to), > (greater than), < (less than), >= (greater than or equal to), and <= (less than or equal to). 4. Logical Operators: Perform logical operations on boolean values or expressions. The logical operators are and (logical AND), or (logical OR), and not (logical NOT). 5. Bitwise Operators: Perform bitwise operations on binary representations of integers. These operators include & (bitwise AND), | (bitwise OR), ^ (bitwise XOR), ~ (bitwise NOT), << (left shift), and >> (right shift). 6. Membership Operators: Check if a value exists within a sequence. The membership operators are in and not in. 7. Identity Operators: Compare the identity of objects. The identity operators are is and is not. 8. Unary Operators: Perform operations on a single operand. Examples include - (unary negation), + (unary plus), and not (unary logical NOT). 9. Ternary Operator: A conditional operator that provides a concise way to write conditional expressions. It has the syntax `value_if_true if condition else value_if_false`. Relational Operators (Comparison Operators): - `==` (Equal to): Returns `True` if the operands are equal, `False` otherwise. - `!=` (Not equal to): Returns `True` if the operands are not equal, `False` otherwise. - `>` (Greater than): Returns `True` if the left operand is greater than the right operand, `False` otherwise. - `<` (Less than): Returns `True` if the left operand is less than the right operand, `False` otherwise. - `>=` (Greater than or equal to): Returns `True` if the left operand is greater than or equal to the right operand, `False` otherwise. - `<=` (Less than or equal to): Returns `True` if the left operand is less than or equal to the right operand, `False` otherwise. Here's an example that demonstrates the usage of relational operators: x=5 y = 10 print(x == y) # False print(x != y) # True print(x > y) # False print(x < y) # True print(x >= y) # False print(x <= y) # True In this example, we compare the values of variables `x` and `y` using different relational operators. The result of each comparison is printed, indicating whether the comparison is `True` or `False` based on the conditions specified by the relational operators. Write a program for array creation using Numpy in Python . import numpy as np # Creating a 1-dimensional array arr1 = np.array([1, 2, 3, 4, 5]) print("1-D array:") print(arr1) print() # Creating a 2-dimensional array arr2 = np.array([[1, 2, 3], [4, 5, 6]]) print("2-D array:") print(arr2) print() # Creating a 3-dimensional array arr3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print("3-D array:") print(arr3) print() Output: 1-D array: [1 2 3 4 5] 2-D array: [[1 2 3] [4 5 6]] 3-D array: [[[1 2] [3 4]] [[5 6] [7 8]]] Write a program in Python to calculate uppercase and lowercase letters in string "Welcome to MITWPU" def count_uppercase_lowercase(string): uppercase_count = 0 lowercase_count = 0 for char in string: if char.isupper(): uppercase_count += 1 elif char.islower(): lowercase_count += 1 return uppercase_count, lowercase_count input_string = "Welcome to MITWPU" upper_count, lower_count = count_uppercase_lowercase(input_string) print("Uppercase letters count:", upper_count) print("Lowercase letters count:", lower_count) Output: Uppercase letters count: 5 Lowercase letters count: 11 Draw and Explain Architecture of Computer System. A computer system is basically a machine that simplifies complicated tasks. It should maximize performance and reduce costs as well as power consumption.The different components in the Computer System Architecture are Input Unit, Output Unit, Storage Unit, Arithmetic Logic Unit, Control Unit etc. A diagram that shows the flow of data between these units is as follows − The input data travels from input unit to ALU. Similarly, the computed data travels from ALU to output unit. The data constantly moves from storage unit to ALU and back again. This is because stored data is computed on before being stored again. The control unit controls all the other units as well as their data. Details about all the computer units are − • Input Unit The input unit provides data to the computer system from the outside. So, basically it links the external environment with the computer. It takes data from the input devices, converts it into machine language and then loads it into the computer system. Keyboard, mouse etc. are the most commonly used input devices. • Output Unit The output unit provides the results of computer process to the users i.e it links the computer with the external environment. Most of the output data is the form of audio or video. The different output devices are monitors, printers, speakers, headphones etc. • Storage Unit Storage unit contains many computer components that are used to store data. It is traditionally divided into primary storage and secondary storage.Primary storage is also known as the main memory and is the memory directly accessible by the CPU. Secondary or external storage is not directly accessible by the CPU. The data from secondary storage needs to be brought into the primary storage before the CPU can use it. Secondary storage contains a large amount of data permanently. • Arithmetic Logic Unit All the calculations related to the computer system are performed by the arithmetic logic unit. It can perform operations like addition, subtraction, multiplication, division etc. The control unit transfers data from storage unit to arithmetic logic unit when calculations need to be performed. The arithmetic logic unit and the control unit together form the central processing unit. • Control Unit This unit controls all the other units of the computer system and so is known as its central nervous system. It transfers data throughout the computer as required including from storage unit to central processing unit and vice versa. The control unit also dictates how the memory, input output devices, arithmetic logic unit etc. should behave. Explain RAM and ROM with its types. RAM (Random Access Memory) and ROM (Read-Only Memory) are two types of computer memory that serve different purposes in storing and accessing data. Here's an explanation of RAM and ROM along with their types: 1. RAM (Random Access Memory): - RAM is a type of computer memory that is used for temporary storage of data that is actively being processed by the computer's CPU (Central Processing Unit). - It is volatile memory, meaning that its contents are lost when the computer is powered off or restarted. - RAM provides fast read and write access, allowing the CPU to quickly retrieve and modify data. - It is organized in a random access manner, meaning that any memory location can be accessed directly, regardless of its physical location. - RAM is used to store program instructions, data being processed, and temporary variables. - Types of RAM: - DRAM (Dynamic Random Access Memory): It is the most common type of RAM used in modern computers. It requires constant refreshing of data, which consumes more power but offers higher density and lower cost. - SRAM (Static Random Access Memory): It is faster and more expensive than DRAM. It does not require refreshing and is used for cache memory in CPUs and other high-performance applications. 2. ROM (Read-Only Memory): - ROM is a type of computer memory that stores data that is permanently written during manufacturing and cannot be modified or erased by normal computer operations. - It is non-volatile memory, meaning that its contents are retained even when the computer is powered off or restarted. - ROM is used to store firmware, BIOS (Basic Input/Output System), and other essential system instructions. - It provides read-only access, meaning that data can only be read from ROM and not written or modified. - Types of ROM: - PROM (Programmable Read-Only Memory): It can be programmed by the user once to store data permanently. - EPROM (Erasable Programmable Read-Only Memory): It can be erased and reprogrammed using special equipment. - EEPROM (Electrically Erasable Programmable Read-Only Memory): It can be erased and reprogrammed electrically, usually at a byte level. - Flash Memory: It is a type of EEPROM that can be electrically erased and reprogrammed in blocks or sectors. It is commonly used in memory cards, USB drives, and solid-state drives (SSDs). In summary, RAM is used for temporary storage of data actively processed by the computer, while ROM stores permanent data and instructions that are essential for the computer's operation. RAM is volatile and provides fast read/write access, while ROM is non-volatile and provides read-only access. Explain Signed And Unsigned Data representation with example. Signed and unsigned data representation are two ways of representing numerical values in computer systems. They differ in how they interpret the most significant bit (MSB) of the binary representation. Here's an explanation of signed and unsigned data representation with examples: 1. Signed Data Representation: - In signed data representation, the MSB is used as a sign bit to indicate the positive or negative sign of a number. - The remaining bits represent the magnitude of the number. - The most common signed representation is two's complement, where the sign bit of 0 represents a positive number and 1 represents a negative number. - Example: In an 8-bit signed representation, the binary value "10000001" represents -127, where the MSB (1) indicates a negative sign, and the remaining bits (00000001) represent the magnitude. 2. Unsigned Data Representation: - In unsigned data representation, all bits in the binary value are used to represent the magnitude of a number. - There is no sign bit in unsigned representation, so all values are interpreted as positive. - Example: In an 8-bit unsigned representation, the binary value "10000001" represents 129. Since there is no sign bit, the entire binary value is considered the magnitude of the number. Signed data representation allows for the representation of both positive and negative numbers, using the MSB as a sign indicator. Unsigned data representation, on the other hand, is used when only positive values are needed, utilizing all bits for magnitude. List different programming paradigms and explain Imperative Paradigm. There are several programming paradigms, each providing a different approach to structuring and organizing code. Some of the commonly recognized programming paradigms include: 1. Imperative Paradigm: - The imperative paradigm focuses on describing the steps or procedures to perform in order to solve a problem. - It emphasizes explicit statements and instructions that modify the program's state. - The programmer specifies the sequence of actions to be executed and how the program's state changes with each action. - Key characteristics of the imperative paradigm include variables, assignments, loops, and conditionals. - Examples of imperative programming languages include C, Python, Java, and Pascal. The Imperative Paradigm can be further divided into two subcategories: 1.1. Procedural Programming: - Procedural programming is a subset of the imperative paradigm that focuses on breaking down a problem into a sequence of procedures or functions. - It uses a modular approach, dividing the program into smaller reusable procedures that can be called as needed. - The program's control flow is based on procedure calls and returns. - Examples of procedural programming languages include C, Fortran, and Pascal. 1.2. Object-Oriented Programming (OOP): - Object-oriented programming is another subset of the imperative paradigm that emphasizes the organization of code around objects, which are instances of classes. - It encapsulates data and methods into objects, providing a way to model real-world entities and their interactions. - The program's structure is based on classes and objects, with inheritance, polymorphism, and encapsulation as key concepts. - Examples of object-oriented programming languages include Java, C++, Python, and Ruby. In summary, the imperative paradigm focuses on describing step-by-step procedures and modifying the program's state explicitly. It includes procedural programming and object-oriented programming as its subcategories. Imperative programming languages provide control structures such as variables, assignments, loops, and conditionals to specify the desired sequence of actions to solve a problem. Write algorithm and draw flowchart to find the largest no. between 3 numbers entered by user. Sure! Here's the algorithm and a simple flowchart to find the largest number among three numbers entered by the user: Algorithm: 1. Start 2. Input A,B,C 3. If (A>B) and (A>C) then print “A is greater”. Else if (B>A) and (B>C) then print “B is greater”. Else print “C is greater”. 4. Stop Flowchart: This algorithm and flowchart will help you find the largest number among the three numbers entered by the user. Explain top down design approach and its advantages. Top-down design, also known as stepwise refinement, is a problem-solving approach that involves breaking down a complex problem or task into smaller, more manageable sub-problems. The process starts with a high-level view of the problem and gradually drills down to finer details, addressing each subproblem in a hierarchical manner. Advantages of Top-Down Design: One of the key advantages of the top-down design approach is modularity. By breaking down a problem into smaller modules or functions, it promotes code reusability and maintainability. Each module focuses on solving a specific subproblem, allowing for easier debugging, testing, and updates without impacting the entire system. Another advantage is abstraction and decomposition. Top-down design enables abstraction by hiding implementation details and providing a higher-level view of the problem. It decomposes the problem into manageable chunks, making it easier to understand and tackle. This promotes code readability and enhances collaboration among team members. Division of labor is facilitated by top-down design. Different team members can work on separate modules simultaneously, increasing productivity and speeding up the development process. Each module can be developed independently and integrated later, promoting parallel development. Testing and debugging are simplified with top-down design. Each module can be tested individually, making it easier to identify and isolate errors. This approach reduces the time and effort required for testing, as issues can be localized to specific modules. Scalability is also an advantage of top-down design. As the problem or system grows, additional layers of modules can be added, accommodating increased complexity while maintaining the overall structure. In summary, top-down design offers advantages such as modularity, abstraction, division of labor, ease of testing and debugging, and scalability. It promotes code reusability, readability, and collaboration, making it an effective approach for tackling complex problems and developing maintainable software systems. Convert Decimal number to Binary : 1972 11110110100 Convert IEEE 754 32-bit single precision floating point to its equivalent decimal value, 1000 1000 1000 1000 1000 1000 0000 0000 Detail the following with examples a. Imperative Paradigm b. Object-Oriented Paradigms c. Functional Paradigms a. Imperative Paradigm: Imperative programming is a programming paradigm that focuses on describing step-by-step instructions to solve a problem. In this paradigm, programs are composed of statements that modify the program state, such as changing variable values or executing control structures like loops and conditionals. The emphasis is on how to achieve the desired outcome by specifying the exact sequence of operations. Example: # Imperative Paradigm example in Python def calculate_sum(n): sum = 0 for i in range(1, n+1): sum += i return sum result = calculate_sum(5) print(result) # Output: 15 b. Object-Oriented Paradigm: Object-oriented programming (OOP) is a programming paradigm that organizes code into objects, which are instances of classes. It focuses on modeling realworld entities as objects that have properties (attributes) and behaviors (methods). Encapsulation, inheritance, and polymorphism are key concepts in this paradigm. OOP allows for modular and reusable code by providing mechanisms such as class definitions, object instantiation, and message passing between objects. Example: # Object-Oriented Paradigm example in Python class Rectangle: def __init__(self, width, height): self.width = width self.height = height def calculate_area(self): return self.width * self.height rect = Rectangle(5, 3) area = rect.calculate_area() print(area) # Output: 15 c. Functional Paradigm: Functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions. It emphasizes immutability, pure functions (functions that produce the same output for the same input and have no side effects), and higher-order functions (functions that can accept other functions as arguments or return functions as results). In functional programming, the focus is on expressing computations as a series of function applications and avoiding mutable state and data. Example: # Functional Paradigm example in Python def calculate_sum(numbers): return sum(numbers) numbers_list = [1, 2, 3, 4, 5] result = calculate_sum(numbers_list) print(result) # Output: 15 Define the following system software and provide their significance in the execution of a C Program. a. Compiler b. Linker c. Loader a. Compiler: A compiler is a system software that translates the source code of a program written in a high-level programming language (like C) into machine code or executable code that can be directly executed by the computer. It performs various tasks such as lexical analysis, syntax analysis, semantic analysis, optimization, and code generation. The compiler ensures that the program is translated correctly and efficiently, taking into account the programming language's rules and syntax. Significance in the execution of a C program: The compiler is crucial in the execution of a C program because it translates the human-readable high-level code into machine-readable low-level code. It checks the syntax and semantics of the code, detects errors, and generates efficient machine code. Without a compiler, programmers would need to write programs directly in machine language, which is tedious and error-prone. The compiler allows for portability as the same source code can be compiled and executed on different platforms. b. Linker: The linker is a system software that combines multiple object files generated by the compiler into a single executable program. It resolves references between different object files, resolves dependencies, and creates the final executable file that can be loaded and executed by the operating system. Significance in the execution of a C program: The linker plays a vital role in the execution of a C program by resolving external references and generating the final executable file. It combines the object code from various source files and libraries, resolves function and variable references between them, and creates a unified program. It also performs tasks like memory allocation, symbol resolution, and relocation. Without a linker, it would be challenging to manage and combine different modules of a program, and the program would not be able to execute as a complete entity. c. Loader: The loader is a system software that loads the executable program generated by the linker into memory and prepares it for execution. It allocates memory space for the program, resolves external references, sets up the execution environment, and transfers control to the starting point of the program. Significance in the execution of a C program: The loader is essential in the execution of a C program as it is responsible for loading the program into memory and preparing it for execution. It allocates the necessary memory space, resolves any external references to libraries or shared objects, and sets up the initial execution context. The loader ensures that the program's code and data are properly placed in memory, making them accessible to the processor. Without a loader, the program would not be able to run as it needs to be loaded into memory for execution. Discuss steps for Software Development Life Cycle. The Software Development Life Cycle (SDLC) is a systematic approach to software development that consists of a series of well-defined steps or phases. The following are the typical steps involved in the SDLC: 1. Requirements Gathering: In this initial phase, the project team interacts with stakeholders to gather and document their requirements, expectations, and constraints. This involves understanding the problem to be solved and the desired features and functionalities of the software. 2. Analysis and Design: Once the requirements are gathered, the project team analyzes them to identify the system's overall architecture and design. This phase involves creating high-level and detailed designs, defining data structures, and specifying the software components and their interactions. 3. Implementation: In this phase, the actual coding of the software takes place. Programmers write the code based on the design specifications and best coding practices. The implementation phase may involve multiple iterations and testing to ensure the code is functional and meets the requirements. 4. Testing: The software undergoes various types of testing to identify and fix any defects or issues. This includes unit testing (testing individual components), integration testing (testing the interaction between components), system testing (testing the complete system), and user acceptance testing (testing by end users). 5. Deployment: Once the software is tested and approved, it is deployed to the production environment. This involves installing the software on the target systems and making it available to users. 6. Maintenance and Support: After deployment, the software requires ongoing maintenance and support. This includes addressing bugs, implementing enhancements or new features, and providing technical assistance to users. 7. Evaluation: The final step involves evaluating the software's performance and success in meeting the initial objectives and requirements. This evaluation helps identify areas for improvement and provides feedback for future projects. Write an algorithm and draw flowchart for Fibonacci series. Algorithm: Step 1: START Step 2: Declare variable n1, n2, sum, n, i Step 2: Initialize variables: n1 = 0, n2 = 1, i = 2 Step 3: Read n Step 4: Repeat this step until i <= n: sum = n1 + n2 print sum n1 = n2 n2 = sum i = i + 1 Step 5: STOP Discuss/Explain all 4 Positional Number System. Binary Number System. Decimal Number System. Octal Number System. Hexadecimal Number System " B) Solve the following 1) Convert binary (10010)2 to decimal 2) Convert decimal (1234)10 to binary Positional number systems are numerical systems in which the value of a digit depends on its position or place within the number. There are several positional number systems, but the most commonly used ones are the decimal system, binary system, octal system, and hexadecimal system. Here's an explanation of each of these systems: 1. Decimal System: The decimal system, also known as the base-10 system, is the most widely used positional number system. It uses ten digits from 0 to 9. Each digit's value is determined by its position in the number, starting from right to left, with each position representing a power of 10. For example, the number "123" in decimal represents (1 * 10^2) + (2 * 10^1) + (3 * 10^0), which equals 100 + 20 + 3, resulting in 123. 2. Binary System: The binary system, also known as the base-2 system, is commonly used in computer science and digital electronics. It uses only two digits: 0 and 1. Each digit's value is determined by its position in the number, starting from right to left, with each position representing a power of 2. For example, the binary number "1011" represents (1 * 2^3) + (0 * 2^2) + (1 * 2^1) + (1 * 2^0), which equals 8 + 0 + 2 + 1, resulting in the decimal value 11. 3. Octal System: The octal system, also known as the base-8 system, uses eight digits: 0 to 7. Similar to the other positional systems, each digit's value is determined by its position in the number, starting from right to left, with each position representing a power of 8. For example, the octal number "34" represents (3 * 8^1) + (4 * 8^0), which equals 24 + 4, resulting in the decimal value 28. 4. Hexadecimal System: The hexadecimal system, also known as the base-16 system, uses sixteen digits: 0 to 9 and A to F. The additional six symbols (A, B, C, D, E, F) are used to represent values from 10 to 15. Each digit's value is determined by its position in the number, starting from right to left, with each position representing a power of 16. For example, the hexadecimal number "1F" represents (1 * 16^1) + (15 * 16^0), which equals 16 + 15, resulting in the decimal value 31. In summary, the decimal system is the most familiar system to us, while binary, octal, and hexadecimal systems are widely used in computer science and digital electronics due to their compatibility with binary representation and ease of conversion. Convert binary (10010)2 to decimal (10010)₂ = (1 × 2⁴) + (0 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰) = (18)₁₀ Convert decimal (1234)10 to binary What are the types of pre-processor directives? Explain any two in detail. Preprocessor directives are special instructions in programming languages that are processed by the preprocessor before the actual compilation of the code. These directives provide instructions to the preprocessor to perform certain actions such as including or excluding code segments, defining constants, and performing text substitution. The types of preprocessor directives can vary depending on the programming language. Let's discuss two common preprocessor directives: 1. #include Directive: The #include directive is used to include external files or libraries into the source code. It allows you to reuse code or import pre-defined libraries that contain useful functions or definitions. This directive is commonly used in C and C++ programming languages. The syntax for the #include directive is as follows: #include <header_file> or #include "header_file" The angle brackets `< >` are used for system header files, while double quotation marks `" "` are used for user-defined header files. For example, if you want to use the `stdio.h` header file, which provides input/output functions, you can include it in your code using the #include directive: #include <stdio.h> This directive tells the preprocessor to replace the #include line with the content of the `stdio.h` file during the compilation process. It allows you to access functions like `printf()` and `scanf()` defined in the `stdio.h` file. 2. #define Directive: The #define directive is used to define constants or macros in the code. It allows you to assign a name to a constant value or to define a macro that can be used throughout the code. The syntax for the #define directive is as follows: #define identifier replacement_text The identifier is the name you want to assign to the constant or macro, and the replacement_text is the value or expression you want to associate with the identifier. For example, suppose you want to define a constant named `PI` with the value 3.14159. You can use the #define directive as follows: #define PI 3.14159 After defining this directive, every occurrence of `PI` in your code will be replaced with the value 3.14159 during the preprocessing stage. This allows you to use `PI` in calculations or assignments without having to remember or manually replace the value throughout the code. Another common use of the #define directive is to define macros. Macros are like functions or code snippets that are expanded inline during preprocessing. They are typically used for code reuse and to avoid repetitive code. For example, you can define a macro to calculate the square of a number: #define SQUARE(x) ((x) * (x)) With this macro definition, you can use `SQUARE` in your code to calculate the square of a number: int result = SQUARE(5); // result will be 25 During the preprocessing stage, the macro `SQUARE(5)` will be expanded to `((5) * (5))`, resulting in the value 25. State the importance of File Inclusion. Explain the significance of two types of including a header file. File inclusion, specifically the inclusion of header files, is an important aspect of programming. It allows you to reuse code, define data structures, and access functions or macros defined in external files. The significance of including header files can be understood through two types: system header files and user-defined header files. 1. System Header Files: System header files are provided by the programming language or the underlying operating system. They contain definitions and declarations of standard functions, constants, and data types that are commonly used in programming. Including system header files is significant for the following reasons: a. Accessing Standard Libraries: System header files provide access to standard libraries that contain pre-implemented functions and data structures. By including these files, you can use the functions and data types defined in those libraries without having to redefine them in your code. For example, the `stdio.h` header file provides access to standard input/output functions like `printf()` and `scanf()`. b. Ensuring Portability: System header files ensure portability of code across different platforms and compilers. They provide consistent and standardized interfaces for system functions and data types, enabling code compatibility across different systems. c. Defining Constants and Macros: System header files often define constants and macros that are essential for programming tasks. These constants and macros can be used to enhance code readability and simplify complex operations. For example, the `limits.h` header file defines constants such as `INT_MAX` and `CHAR_BIT` that represent the maximum values of integer types and the number of bits in a character, respectively. 2. User-Defined Header Files: User-defined header files are created by the programmer to organize and modularize their code. They contain function declarations, structure definitions, constants, and macros specific to a particular project or codebase. Including user-defined header files offers the following benefits: a. Code Organization and Modularity: User-defined header files allow you to separate the interface (function declarations, structure definitions, and constant definitions) from the implementation (actual code) of a module or component. This promotes code organization and modularity, making it easier to manage and maintain large projects. b. Code Reusability: By including user-defined header files, you can reuse code across multiple source files or projects. The header file serves as a central repository for common code elements, which can be included in different source files to avoid code duplication and improve code maintenance. c. Encapsulation and Abstraction: User-defined header files provide a mechanism for encapsulating implementation details and exposing only the necessary interface to other parts of the code. By including a header file that contains only function prototypes or structure definitions, you can hide the internal details of the implementation, promoting encapsulation and abstraction principles. In summary, including header files, whether system-provided or user-defined, is crucial for code reuse, organization, and modularity. System header files provide access to standard libraries and ensure portability, while user-defined header files facilitate code organization, reusability, and encapsulation. By leveraging file inclusion, programmers can build robust and maintainable codebases. A general store manager wants to calculate the total sum of purchased items. Which type of looping structure would be most appropriate and why? Support the answer with code snipppet. Note: Number items is not known beforehand. When the number of items is not known beforehand, the most appropriate looping structure to calculate the total sum of purchased items is a "do-while" loop. The "do-while" loop ensures that the loop body is executed at least once, and then it continues to iterate as long as a specific condition is met. This structure allows the store manager to input the price of each item until they decide to stop. Here's an example code snippet using a "do-while" loop to calculate the total sum of purchased items: #include <stdio.h> int main() { int totalSum = 0; int itemPrice; printf("Enter the price of each item (enter 0 to finish):\n"); do { printf("Price: "); scanf("%d", &itemPrice); totalSum += itemPrice; } while (itemPrice != 0); printf("Total sum of purchased items: %d\n", totalSum); return 0; } A water tank stores 'X' litres of water. Write a c code to show how many hours are needed to empty the tank if water is drawn at rate of 2 litres per hour. Hint: Use repeated subtraction and division #include <stdio.h> int main() { int tankCapacity; int hours = 0; printf("Enter the capacity of the water tank in liters: "); scanf("%d", &tankCapacity); while (tankCapacity > 0) { tankCapacity -= 2; hours++; } printf("The tank will be emptied in %d hours.\n", hours); return 0; } In this code, the user is prompted to enter the capacity of the water tank in liters. The while loop continues until the tank capacity becomes zero or negative. Within each iteration of the loop, 2 liters are subtracted from the tank capacity, and the hours counter is incremented. Once the tank capacity reaches zero or becomes negative, the loop terminates, and the program displays the total number of hours needed to empty the tank. Write a c code to print the following pattern: 1 22 333 4444 #include <stdio.h> int main() { int rows; printf("Enter the number of rows: "); scanf("%d", &rows); for (int i = 1; i <= rows; i++) { for (int j = 1; j <= i; j++) { printf("%d ", i); } printf("\n"); } return 0; } Output: 1 22 333 4444 Describe the following terms with example:(i)Keyword (ii) Identifier (iii)Variable (iv) Constant (v) Operator (i) Keyword: Keywords are reserved words in a programming language that have predefined meanings and cannot be used as identifiers. They represent fundamental language constructs and serve specific purposes in the code. Examples of keywords in C programming language include "if," "for," "while," "int," "float," and "return." For instance, the keyword "if" is used to specify a conditional statement, and "int" is used to declare an integer variable. (ii) Identifier: Identifiers are names used to identify variables, functions, or other entities in a program. They are created by the programmer and should follow certain naming rules and conventions. An identifier can consist of letters, digits, and underscores, starting with a letter or an underscore. For example, in the statement "int count = 0;", "count" is an identifier representing a variable that holds integer values. (iii) Variable: A variable is a named storage location in a program that can hold a value. It is used to store and manipulate data during program execution. Variables have a specific data type (e.g., int, float, char) and can be assigned values that can change throughout the program. For instance, in the statement "int age = 25;", "age" is a variable of type int that stores the value 25. (iv) Constant: A constant is a fixed value that does not change during program execution. It represents a literal or symbolic value that remains constant throughout the program. Constants can be of various types, such as numeric constants (e.g., 10, 3.14), character constants (e.g., 'A', '$'), or string constants (e.g., "Hello"). For example, in the statement "const float PI = 3.14159;", "PI" is a constant of type float with a value of 3.14159. (v) Operator: Operators are symbols or keywords that perform specific operations on operands to produce a result. They are used to manipulate variables and constants in expressions. Examples of operators include arithmetic operators (+, -, *, /), relational operators (>, <, ==), logical operators (&&, ||), and assignment operators (=). For instance, in the expression "result = num1 + num2;", the "+" operator performs addition on the variables "num1" and "num2" and assigns the result to the variable "result". Write a program to add, subtract, multiply and divide two numbers, accepted from user by using switch case. #include <stdio.h> int main() { int num1, num2; char operator; double result; printf("Enter the first number: "); scanf("%d", &num1); printf("Enter the second number: "); scanf("%d", &num2); printf("Enter an operator (+, -, *, /): "); scanf(" %c", &operator); switch (operator) { case '+': result = num1 + num2; printf("Sum: %d\n", (int)result); break; case '-': result = num1 - num2; printf("Difference: %d\n", (int)result); break; case '*': result = num1 * num2; printf("Product: %d\n", (int)result); break; case '/': if (num2 != 0) { result = (double)num1 / num2; printf("Quotient: %lf\n", result); } else { printf("Error: Division by zero is not allowed.\n"); } break; default: printf("Error: Invalid operator.\n"); break; } return 0; } Write a program to calculate sum of all the odd numbers between 1 to 20 #include <stdio.h> int main() { int sum = 0; for (int i = 1; i <= 20; i++) { if (i % 2 != 0) { sum += i; } } printf("Sum of odd numbers between 1 to 20: %d\n", sum); return 0; } Describe the structure of C Program The structure of a C program typically consists of several components that work together to define the behavior and execution flow of the program. The basic structure of a C program includes the following components: 1. Preprocessor Directives: These directives are instructions to the preprocessor, which performs certain text manipulations before the actual compilation of the program. They typically start with a `#` symbol, such as `#include` for including header files or `#define` for defining constants. 2. Main Function: Every C program must have a `main` function, which serves as the entry point of the program. The program execution starts from the `main` function and follows the instructions written within it. 3. Variable and Data Declarations: This section includes the declaration of variables and data types that will be used in the program. It is good practice to declare all variables at the beginning of the program or within the scope where they are needed. 4. Statements and Expressions: This section contains the actual instructions and logic of the program. It includes statements such as assignments, control flow statements (e.g., `if`, `else`, `switch`, `while`, `for`), and function calls. 5. Functions: Besides the `main` function, C programs often define additional functions to organize code and perform specific tasks. Functions can be defined before or after the `main` function, but they need to be declared before they are used. 6. Comments: Comments are used to provide explanations, document the code, or disable certain sections temporarily. They are not executed by the compiler and serve as notes to improve code readability and maintainability. Write a program to take input as a number and reverse it by while loop: #include <stdio.h> int main() { int number, reversedNumber = 0, remainder; printf("Enter a number: "); scanf("%d", &number); while (number != 0) { remainder = number % 10; reversedNumber = reversedNumber * 10 + remainder; number /= 10; } printf("Reversed number: %d\n", reversedNumber); return 0; } Write a program to calculate area and perimeter of rectangle. Accept the length and breadth value from the user #include <stdio.h> int main() { float length, breadth, area, perimeter; printf("Enter the length of the rectangle: "); scanf("%f", &length); printf("Enter the breadth of the rectangle: "); scanf("%f", &breadth); area = length * breadth; perimeter = 2 * (length + breadth); printf("Area of the rectangle: %.2f\n", area); printf("Perimeter of the rectangle: %.2f\n", perimeter); return 0; } Answer the following a) What is function prototype? b) What's the need for a function prototype in a C Program? s c) What would happen if my C program uses printf() call and it does not include the stdio.h header file? d) With a C code snippet that includes any standard header file and one function from it being used in the snippet? For (d) - WRITE ONLY A SNIPPET, NOT the FULL C CODE a) Function prototype is a declaration of a function that provides information about the function's name, return type, and parameters. It defines the function's interface to the rest of the program, allowing the compiler to perform type checking and ensure proper usage of the function. b) The need for a function prototype in a C program is to inform the compiler about the existence and signature of a function before it is used or called. This allows the compiler to perform type checking, verify the number and types of function arguments, and ensure that the function is used correctly. Without a function prototype, the compiler may assume default function behavior, leading to potential errors or unexpected results. c) If a C program uses the `printf()` function without including the `stdio.h` header file, it would result in a compiler error. This is because the `printf()` function is declared in the `stdio.h` header file, and the compiler needs to know the function's declaration in order to correctly interpret the program. By including the appropriate header file, the compiler knows the function's declaration and can perform proper type checking and compilation. d) Here's a C code snippet that includes the `stdlib.h` header file and uses the `rand()` function from it: #include <stdlib.h> int main() { int randomNumber = rand(); return 0; } In this snippet, the `stdlib.h` header file is included using the `#include` preprocessor directive. The `rand()` function is then used to generate a random number and assign it to the `randomNumber` variable. Note that this is just a snippet and not a complete program. Given the statement - ""Function parameters and local variables are 'LOCAL' in scope and these parameters and local variables are inaccessible outside the function (when the function is not executing)."" The given statement is partially correct. Function parameters and local variables have a local scope, meaning they are accessible only within the function in which they are defined. They are not accessible outside of the function, i.e., in the global scope or in other functions. Let's break down the statement to understand it better: "Function parameters and local variables are 'LOCAL' in scope": This means that function parameters and variables declared inside a function are limited to that specific function's scope. They exist and can be accessed only within the function block. "These parameters and local variables are inaccessible outside the function (when the function is not executing)": This states that once the function execution is completed, the function parameters and local variables cease to exist, and they cannot be accessed or referenced from outside the function. In C programming, local variables and function parameters have block scope, which means they are visible and accessible only within the block of code where they are declared. As soon as the program execution moves outside the block (in this case, the function), the local variables and parameters are no longer accessible. However, it's important to note that global variables, which are declared outside of any function, have a global scope and can be accessed from any part of the program. Unlike local variables, global variables retain their values even when the function execution ends. To summarize, function parameters and local variables are local in scope, meaning they are accessible only within the function block where they are defined and cannot be accessed outside of it. Write in 6-8 lines, your arguments to support the statement given above." Write a short note on the ""main"" function in any C program. Write a code snippet (not the full C program) in support for your answer. The main function is a crucial part of any C program as it serves as the entry point for program execution. Here are a few key points about the main function: 1. Entry Point: The main function is the first function that gets executed when the program starts running. It is mandatory in every C program. 2. Return Type: The main function has a return type of `int`. It typically returns an integer value indicating the exit status of the program. 3. Parameters: The main function can accept two parameters: `argc` (argument count) and `argv` (argument vector). These parameters are used to pass command-line arguments to the program. 4. Execution Flow: The statements within the main function define the execution flow of the program. It can contain variable declarations, function calls, and control flow statements. 5. Global Scope: The main function is defined at the global scope of the program, making it accessible from any part of the program. 6. Operating System Interaction: The operating system typically calls the main function when the program is executed. It provides the command-line arguments to the program through the `argc` and `argv` parameters. #include <stdio.h> int main(int argc, char *argv[]) { int num = 10; printf("Hello, world!\n"); printf("The value of num is: %d\n", num); return 0; } In this snippet, the main function is defined with the `int` return type and takes the `argc` and `argv` parameters. Inside the main function, there is a variable declaration (`int num = 10`) and two printf statements to display messages. The function returns 0 at the end. Note that this is just a snippet and not a complete program. What is a problem? Explain six problem solving steps. A problem is a discrepancy or a gap between the current state (what is) and the desired state (what should be). It is a situation where there is an obstacle or challenge that needs to be addressed or resolved. Problems can occur in various aspects of life and require effective problem-solving skills to find solutions. Here are six problem-solving steps that can be applied to tackle problems: 1. Identify and Define the Problem: The first step is to clearly understand the problem by identifying and defining it. Clearly articulate what the problem is, its causes, and its impact. This step helps in gaining a thorough understanding of the problem. 2. Analyze the Problem: Once the problem is defined, analyze it by gathering relevant information, data, or facts. Break down the problem into smaller components and identify patterns or trends. This analysis helps in gaining insights and identifying possible solutions. 3. Generate Potential Solutions: Brainstorm and generate a list of potential solutions or strategies to address the problem. Encourage creativity and consider various approaches. Quantity is important at this stage, and all ideas should be considered without judgment. 4. Evaluate and Select the Best Solution: Evaluate each potential solution by considering its feasibility, effectiveness, and potential impact. Analyze the pros and cons of each solution and select the one that is most likely to solve the problem effectively. 5. Implement the Solution: Once the best solution is identified, create a plan of action and implement the chosen solution. Break down the solution into smaller steps and allocate necessary resources. Take proactive measures to put the solution into action. 6. Evaluate the Results: After implementing the solution, evaluate its effectiveness and assess the outcomes. Determine if the problem has been resolved and if the desired state has been achieved. If the solution is not successful, reassess and iterate through the problem-solving process. By following these steps, individuals can approach problems systematically, analyze them thoroughly, and arrive at effective solutions. It is important to note that problem-solving is an iterative process, and flexibility is required to adapt and refine the approach as needed. Explain steps in software development life cycle. The Software Development Life Cycle (SDLC) is a structured process followed by software development teams to create high-quality software. It consists of several phases, each with its own set of activities and deliverables. Here are the typical steps involved in the SDLC: 1. Requirement Gathering: In this initial phase, the software development team interacts with stakeholders to gather and understand the requirements of the software. This involves identifying the needs, constraints, and goals of the project. 2. System Analysis: Once the requirements are gathered, the team analyzes them to define the system's functionalities, behavior, and scope. This phase involves creating system specifications, defining user workflows, and identifying potential challenges. 3. Design: In this phase, the system's architecture and design are planned. The team creates a high-level design that outlines the software's structure, modules, interfaces, and data flow. Detailed designs for each component are also created. 4. Coding: The actual coding or implementation of the software takes place in this phase. Programmers write the code based on the design specifications. Coding standards and best practices are followed to ensure maintainability and readability. 5. Testing: Once the coding is complete, the software is tested for defects, errors, and performance issues. Different types of testing, such as unit testing, integration testing, and system testing, are conducted to ensure the software meets the defined requirements. 6. Deployment: After successful testing, the software is deployed to the production environment or made available to end-users. This phase involves preparing the infrastructure, installing the software, configuring it, and ensuring its smooth operation. 7. Maintenance: Once the software is deployed, it enters the maintenance phase. During this phase, bug fixes, updates, and enhancements are made based on user feedback and changing requirements. Ongoing support and monitoring of the software are also carried out. It's important to note that the SDLC is not always a linear process, and iterative or agile approaches may involve overlapping phases. The specific methodologies and tools used in each phase may vary based on the project requirements and organizational practices. Write a program to swap two numbers using pointers. #include <stdio.h> void swap(int *num1, int *num2) { int temp = *num1; *num1 = *num2; *num2 = temp; } int main() { int num1, num2; printf("Enter value for num1: "); scanf("%d", &num1); printf("Enter value for num2: "); scanf("%d", &num2); printf("Before swapping: num1 = %d, num2 = %d\n", num1, num2); swap(&num1, &num2); printf("After swapping: num1 = %d, num2 = %d\n", num1, num2); return 0; } Write an algorithm to check number entered by user is even or odd. Explain the difference between static scope and dynamic scope in C with example. Static scope, also known as lexical scope, refers to the visibility and accessibility of variables based on their position in the source code. In static scope, variable bindings are determined at compile-time. The scope of a variable is defined by the block in which it is declared, and it remains fixed throughout the program's execution. Example of static scope: #include <stdio.h> void func1() { int x = 10; printf("Value of x inside func1: %d\n", x); } void func2() { printf("Value of x inside func2: ???\n"); } int main() { int x = 5; func1(); func2(); printf("Value of x inside main: %d\n", x); return 0; } Dynamic scoping is a concept found in some other programming languages like Lisp or Perl. It determines variable bindings based on the calling context during runtime rather than the lexical structure of the program. Here's an example in Perl to demonstrate dynamic scoping: sub func1 { local $x = 10; # Using 'local' for dynamic scoping func2(); } sub func2 { print "Value of x inside func2: $x\n"; } $x = 5; func1(); print "Value of x outside all functions: $x\n"; To summarize, static scope in C is determined at compile-time, based on the structure of the program, while dynamic scope refers to variable binding resolution based on the program's execution path at runtime. Write a short note on life time of variables. The lifetime of a variable in a programming language refers to the duration during which the variable exists in the memory and retains its value. The lifetime of a variable is determined by its scope, storage class, and the point at which it is created and destroyed within a program. Here are some key points regarding the lifetime of variables: 1. Scope: The scope of a variable defines where it is accessible and visible within the program. Variables can have local scope, function scope, block scope, or global scope. The lifetime of a variable is typically tied to its scope. When the scope of a variable ends, the variable is destroyed, and its memory is freed. 2. Storage Classes: The storage class of a variable determines its lifetime and storage location. In C, variables can have different storage classes like automatic, static, register, and external. Each storage class has different rules for variable lifetime. For example, automatic variables have a lifetime tied to their enclosing block, while static variables have a lifetime that spans the entire program execution. 3. Creation and Destruction: Variables are created when they are declared or initialized, and they are destroyed when they go out of scope or when the program terminates. The moment of creation and destruction can vary depending on the variable's scope and storage class. 4. Dynamic Memory Allocation: In some programming languages, variables can be dynamically allocated using memory management functions like `malloc` or `new`. The lifetime of dynamically allocated variables is controlled by the programmer and typically lasts until they are explicitly deallocated using `free` or `delete`. Understanding the lifetime of variables is crucial for efficient memory management and avoiding issues like memory leaks or accessing variables after they have been destroyed. It is essential to properly manage variable lifetimes to ensure correct and predictable behavior in a program. Overall, the lifetime of a variable encompasses its creation, usage, and destruction, and it is influenced by factors such as scope, storage class, and memory management techniques used in the programming language. What is a function? Why we use functions in C language? Give an example. In C, a function is a named block of code that performs a specific task. It is a self-contained unit that can be called from other parts of the program to perform a particular operation. Functions help in organizing code, promoting code reuse, and improving the modularity and readability of programs. Here are some reasons why we use functions in C: 1. Code Modularity: Functions allow us to break down a program into smaller, manageable units. Each function focuses on a specific task, making the code easier to understand and maintain. It promotes code modularity, as different parts of the program can be developed and tested independently. 2. Code Reusability: By encapsulating a specific functionality in a function, we can reuse the same code in multiple places within a program or even in different programs. Instead of duplicating code, we can call the function whenever that functionality is needed, reducing redundancy and improving efficiency. 3. Abstraction and Encapsulation: Functions provide a level of abstraction, allowing us to use a function without knowing the internal details of its implementation. This simplifies the complexity of the program and makes it easier to reason about. Encapsulation ensures that the details of a function are hidden, and only the interface (function signature) is exposed, enhancing information hiding and data protection. Example: #include <stdio.h> // Function to calculate the sum of two numbers int sum(int a, int b) { return a + b; } int main() { int num1, num2; printf("Enter two numbers: "); scanf("%d %d", &num1, &num2); int result = sum(num1, num2); // Function call printf("The sum of %d and %d is %d\n", num1, num2, result); return 0; } In this example, the `sum` function is defined to calculate the sum of two numbers. It takes two parameters (`a` and `b`) and returns their sum. The `main` function prompts the user to enter two numbers, calls the `sum` function, and stores the result in the `result` variable. Finally, it prints the sum to the console. By using the `sum` function, we achieve code modularity and reusability. We can call the `sum` function from different parts of the program whenever we need to calculate the sum of two numbers, without duplicating the addition logic. This promotes cleaner code and reduces errors. What is recursion in C? Explain with example. Recursion in C is a programming technique where a function calls itself directly or indirectly to solve a problem. It allows a problem to be solved by breaking it down into smaller instances of the same problem. Here's an example to illustrate recursion in C: #include <stdio.h> // Recursive function to calculate the factorial of a number int factorial(int n) { // Base case: factorial of 0 is 1 if (n == 0) return 1; // Recursive case: factorial of n is n multiplied by factorial of (n-1) return n * factorial(n - 1); } int main() { int number; printf("Enter a positive integer: "); scanf("%d", &number); // Call the factorial function recursively int result = factorial(number); printf("The factorial of %d is %d\n", number, result); return 0; } In this example, we have a recursive function `factorial` that calculates the factorial of a given number `n`. The factorial of 0 is defined as 1, which serves as the base case for the recursion. Recursion is useful for solving problems that can be divided into smaller subproblems with the same structure. It provides an elegant and concise way to solve such problems by breaking them down into simpler cases. However, it's important to ensure that the recursive function has a base case to avoid infinite recursion. Write python program to find whether a given character is present in a string or not. In case it is present print the index at which it is present. Do not use built in string method. def find_character(string, character): for i in range(len(string)): if string[i] == character: return i return -1 # Main program string = input("Enter a string: ") character = input("Enter a character: ") index = find_character(string, character) if index != -1: print(f"The character '{character}' is present at index {index} in the string.") else: print(f"The character '{character}' is not present in the string.") What is difference between ‘break’ and ‘continue’ statement in Python? Explain with example. In Python, `break` and `continue` are two flow control statements that alter the execution of loops, such as `for` and `while`. The main difference between `break` and `continue` is as follows: 1. `break` statement: When encountered inside a loop, the `break` statement immediately terminates the loop, and the program execution continues with the next statement after the loop. 2. `continue` statement: When encountered inside a loop, the `continue` statement skips the rest of the current iteration and moves to the next iteration, without executing the remaining statements within the loop for that particular iteration. Here's an example that demonstrates the difference between `break` and `continue`: # Example using break statement for num in range(1, 6): if num == 4: break print(num) # Output: 1 2 3 # Example using continue statement for num in range(1, 6): if num == 3: continue print(num) # Output: 1 2 4 5 In the first example, the `break` statement is used to terminate the loop when `num` becomes 4. As a result, the program execution immediately exits the loop, and the remaining numbers (4 and 5) are not printed. In the second example, the `continue` statement is used to skip the iteration when `num` becomes 3. When `num` is 3, the `print` statement is skipped, and the program moves to the next iteration. Hence, the number 3 is not printed in the output. Both `break` and `continue` statements can be useful in controlling the flow of a loop based on specific conditions. `break` is typically used to exit a loop prematurely when a certain condition is met, while `continue` is used to skip certain iterations and proceed to the next iteration.