Let Us C.pdf
Document Details
Tags
Full Transcript
Let Us C Fourteenth Edition Yashavant Kanetkar i Dedicated to baba Who couldn’t be here to see this day... ii About the Author Through his books and Quest Video Courseware DVDs on C, C++, Data Structures, VC++,.NET, Embedded Systems, etc. Yashavant Kanet...
Let Us C Fourteenth Edition Yashavant Kanetkar i Dedicated to baba Who couldn’t be here to see this day... ii About the Author Through his books and Quest Video Courseware DVDs on C, C++, Data Structures, VC++,.NET, Embedded Systems, etc. Yashavant Kanetkar has created, moulded and groomed lacs of IT careers in the last two decades. Yashavant’s books and Quest DVDs have made a significant contribution in creating top-notch IT manpower in India and abroad. Yashavant’s books are globally recognized and millions of students / professionals have benefitted from them. Yashavant's books have been translated into Hindi, Gujarati, Japanese, Korean and Chinese languages. Many of his books are published in India, USA, Japan, Singapore, Korea and China. Yashavant is a much sought after speaker in the IT field and has conducted seminars/workshops at TedEx, IITs, RECs and global software companies. Yashavant has recently been honored with the prestigious “Distinguished Alumnus Award” by IIT Kanpur for his entrepreneurial, professional and academic excellence. This award was given to top 50 alumni of IIT Kanpur who have made significant contribution towards their profession and betterment of society in the last 50 years. In recognition of his immense contribution to IT education in India, he has been awarded the "Best.NET Technical Contributor" and "Most Valuable Professional" awards by Microsoft for 5 successive years. Yashavant holds a BE from VJTI Mumbai and M.Tech. from IIT Kanpur. iii Acknowledgments Let Us C has become an important part of my life. I have created and nurtured it for last decade and half. While doing so, I have received, in addition to the compliments, a lot of suggestions from students, developers, professors, publishers and authors. So much have their inputs helped me in taking this book up to its fourteenth edition that ideally I should put their names too on the cover page. In particular, I am indebted to Manish Jain who had a faith in this book idea, believed in my writing ability, whispered the words of encouragement and made helpful suggestions from time to time. I hope every author gets a publisher who is as cooperative, knowledgeable and supportive as Manish. The Fourteen editions of this book saw several changes and facelifts. During this course many people helped in executing programs and spotting bugs. I trust that with their collective acumen, all the programs in this book would run correctly. I value the work that they did a lot. Any errors, omissions or inconsistencies that remain are, alas, my responsibility. I thank Dada, Ammi—my parents, Seema—my wife, Aditya, Anuj—my sons for enduring the late nights, the clicking keyboard, and mostly for putting up with yet another marathon book effort. Thinking of a book cover idea is one thing, putting it into action is a different cup of tea. This edition’s cover idea has been implemented by Jayant. Many thanks to him. And finally my heartfelt gratitude to the countless students who made me look into every nook and cranny of C. I want to remain in their debt. It is only because of them that Let Us C is now published from India, Singapore, USA, Japan, Korea and China in multiple languages. iv Preface In this I have reorganized the contents of the book in a major way. After going through the thirteenth edition several times I decided to realign all the chapters in such a manner that if a C programming course is taught using Let Us C, it can roughly be finished in 23 lectures of one hour each, with one chapter's contents devoted to one lecture. I hope this would make the learning path trouble-free. Some end-of-chapter exercises in the book needed a second look to make them more practical. That also stands done now. Many readers told me that they have immensely benefitted from the inclusion of the chapter on Interview FAQs. I have improved this chapter further. The rationale behind this chapter is simple—ultimately all the readers of Let Us C sooner or later end up in an interview room where they are required to take questions on C programming. I now have a proof that this chapter has helped to make that journey smooth and fruitful. All the programs present in the book are available in source code form at www.kicit.com/books/letusc/sourcecode. You are free to download them, improve them, change them, do whatever with them. If you wish to get solutions for the Exercises in the book they are available in another book titled ‘Let Us C Solutions’. If you want some more problems for practice they are available in the book titled ‘Let Us C Workbook’. As usual, new editions of these two books have also been launched along with 14th edition of Let Us C. If you like ‘Let Us C’ and want to hear the complete video-recorded lectures created by me on C language (and other subjects like C++, VC++, C#, Java,.NET, Embedded Systems, etc.), then you can visit http://quest.ksetindia.com for more details. ‘Let Us C’ is as much your book as it is mine. So if you feel that I could have done certain job better than what I have, or you have any suggestions about what you would like to see in the next edition, please drop a line to [email protected]. Countless Indians have relentlessly worked for close to two decades to successfully establish “India” as a software brand. At times, I take secret pleasure in seeing that a Let Us C has contributed in its own little way in shaping so many careers that have made the “India” brand acceptable. v Recently I was presented with “Distinguished Alumnus Award” by IIT Kanpur. It was great to figure in a list that contained Narayan Murthy, Chief Mentor, Infosys, Dr. D. Subbarao, former Governor, Reserve Bank of India, Dr. Rajeev Motwani of Stanford University, Prof. H. C. Verma, Mr. Som Mittal President of NASSCOM, Prof. Minwalla of Harvard University, Dr. Sanjay Dhande former Director of IIT Kanpur, Prof. Arvind and Prof. Sur of MIT USA and Prof. Ashok Jhunjhunwala of IIT Chennai. I think Let Us C amongst my other books has been primarily responsible for helping me get the “Distinguished Alumnus” award. What was a bit surprising was that almost all who were present knew about the book already and wanted to know from me what it takes to write a book that sells in millions of copies. My reply was—make an honest effort to make the reader understand what you have to say and keep it simple. I don’t know how convincing was this answer, but well, that is what I have been doing with this book in all its previous thirteen editions. I have followed the same principle with this edition too. All the best and happy programming! Yashavant Kanetkar vi Contents 1. Getting Started 1 What is C? 2 Getting Started with C 3 The C Character Set 4 Constants, Variables and Keywords 4 Types of C Constants 5 Rules for Constructing Integer Constants 6 Rules for Constructing Real Constants 7 Rules for Constructing Character Constants 8 Types of C Variables 8 Rules for Constructing Variable Names 8 C Keywords 9 The First C Program 10 Form of a C Program 11 Comments in a C Program 11 What is main( )? 12 Variables and their Usage 13 printf( ) and its Purpose 14 Compilation and Execution 15 Receiving Input 15 Summary 17 Exercise 18 2. C Instructions 21 Types of Instructions 22 Type Declaration Instruction 22 Arithmetic Instruction 23 Integer and Float Conversions 26 Type Conversion in Assignments 27 Hierarchy of Operations 28 Associativity of Operators 31 Control Instructions 32 Summary 32 Exercise 33 3. Decision Control Instruction 39 Decisions! Decisions! 40 The if Statement 40 The Real Thing 44 vii Multiple Statements within if 45 The if-else Statement 47 Nested if-elses 49 Forms of if 50 Summary 51 Exercise 51 4. More Complex Decision Making 57 Use of Logical Operators 58 The else if Clause 61 The ! Operator 66 Hierarchy of Operators Revisited 66 A Word of Caution 67 The Conditional Operators 69 Summary 71 Exercise 71 5. Loop Control Instruction 81 Loops 82 The while Loop 82 Tips and Traps 85 More Operators 88 Summary 90 Exercise 90 6. More Complex Repetitions 95 The for Loop 96 Nesting of Loops 101 Multiple Initializations in the for Loop 102 The break Statement 102 The continue Statement 104 The do-while Loop 105 The Odd Loop 107 Summary 109 Exercise 110 7. Case Control Instruction 117 Decisions using switch 118 The Tips and Traps 121 switch versus if-else Ladder 126 The goto Keyword 126 viii Summary 129 Exercise 129 8. Functions 135 What is a Function? 136 Why use Functions? 142 Passing Values between Functions 143 Scope Rule of Functions 147 Order of Passing Arguments 148 Using Library Functions 149 One Dicey Issue 150 Return Type of Function 150 Summary 151 Exercise 151 9. Pointers 157 Call by Value and Call by Reference 158 An Introduction to Pointers 158 Pointer Notation 159 Back to Function Calls 164 Conclusions 167 Summary 167 Exercise 168 10. Recursion 173 Recursion 174 Recursion and Stack 178 Summary 181 Exercise 181 11. Data Types Revisited 183 Integers, long and short 184 Integers, signed and unsigned 186 Chars, signed and unsigned 187 Floats and Doubles 188 A Few More Issues… 191 Storage Classes in C 192 Automatic Storage Class 193 Register Storage Class 194 Static Storage Class 195 External Storage Class 198 ix A Few Subtle Issues 201 Which to Use When 202 Summary 203 Exercise 204 12. The C Preprocessor 211 Features of C Preprocessor 212 Macro Expansion 212 Macros with Arguments 216 Macros versus Functions 220 File Inclusion 221 Conditional Compilation 223 #if and #elif Directives 226 Miscellaneous Directives 227 #undef Directive 227 #pragma Directive 227 The Build Process 230 Preprocessing 231 Compilation 231 Assembling 232 Linking 233 Loading 234 Summary 235 Exercise 235 13. Arrays 239 What are Arrays? 240 A Simple Program using Array 241 More on Arrays 244 Array Initialization 244 Array Elements in Memory 244 Bounds Checking 245 Passing Array Elements to a Function 245 Pointers and Arrays 247 Passing an Entire Array to a Function 254 The Real Thing 255 Summary 256 Exercise 257 14. Multidimensional Arrays 267 Two-Dimensional Arrays 268 x Initializing a Two-Dimensional Array 269 Memory Map of a Two-Dimensional Array 270 Pointers and Two-Dimensional Arrays 271 Pointer to an Array 273 Passing 2-D Array to a Function 274 Array of Pointers 277 Three-Dimensional Array 279 Summary 281 Exercise 281 15. Strings 291 What are Strings 292 More about Strings 293 Pointers and Strings 297 Standard Library String Functions 298 strlen( ) 299 strcpy( ) 301 strcat( ) 304 strcmp( ) 305 Summary 306 Exercise 306 16. Handling Multiple Strings 311 Two-Dimensional Array of Characters 312 Array of Pointers to Strings 314 Limitation of Array of Pointers to Strings 317 Solution 318 Summary 319 Exercise 319 17. Structures 323 Why use Structures? 324 Declaring a Structure 326 Accessing Structure Elements 329 How Structure Elements are Stored? 329 Array of Structures 330 Additional Features of Structures 332 Uses of Structures 341 Summary 341 Exercise 342 xi 18. Console Input/Output 351 Types of I/O 352 Console I/O Functions 353 Formatted Console I/O Functions 353 sprintf( ) and sscanf( ) Functions 361 Unformatted Console I/O Functions 362 Summary 365 Exercise 365 19. File Input/Output 371 Data Organization 372 File Operations 372 Opening a File 373 Reading from a File 375 Trouble in Opening a File 375 Closing the File 377 Counting Characters, Tabs, Spaces, … 377 A File-Copy Program 378 Writing to a File 380 File Opening Modes 380 String (Line) I/O in Files 381 The Awkward Newline 383 Record I/O in Files 384 Text Files and Binary Files 387 Record I/O Revisited 389 Database Management 392 Low-Level File I/O 398 A Low-Level File-Copy Program 399 I/O under Windows 403 Summary 403 Exercise 404 20. More Issues In Input/Output 413 Using argc and argv 414 Detecting Errors in Reading/Writing 417 Standard I/O Devices 419 I/O Redirection 419 Redirecting the Output 420 Redirecting the Input 421 Both Ways at Once 422 Summary 423 xii Exercise 423 21. Operations On Bits 425 Bit Numbering and Conversion 426 Bit Operations 429 One’s Complement Operator 431 Right Shift Operator 433 Left Shift Operator 436 Utility of Left Shift Operator 437 Bitwise AND Operator 438 Utility of AND Operator 439 Bitwise OR Operator 442 Bitwise XOR Operator 443 The showbits( ) Function 444 Bitwise Compound Assignment Operator 445 Summary 445 Exercise 446 22. Miscellaneous Features 451 Enumerated Data Type 452 Uses of Enumerated Data Type 453 Are Enums Necessary? 455 Renaming Data Types with typedef 456 Typecasting 457 Bit Fields 459 Pointers to Functions 461 Functions Returning Pointers 463 Functions with Variable Number of Arguments 465 Unions 468 Union of Structures 473 Utility of Unions 474 The volatile Qualifier 476 Summary 476 Exercise 477 23. C Under Linux 481 What is Linux? 482 C Programming Under Linux 483 The ‘Hello Linux’ Program 483 Processes 484 Parent and Child Processes 485 xiii More Processes 488 Zombies and Orphans 490 One Interesting Fact 492 Communication using Signals 492 Handling Multiple Signals 495 Blocking Signals 497 Event Driven Programming 500 Where do you go from here? 505 Summary 505 Exercise 506 24. Interview FAQs 509 Appendix A – Compilation and Execution 529 Appendix B – Precedence Table 537 Appendix C – Chasing the Bugs 541 Appendix D – ASCII Chart 549 Periodic Tests I to IV 555 Index 567 xiv xv 1 Getting Started What is C? Getting Started with C The C Character Set Constants, Variables and Keywords Types of C Constants Rules for Constructing Integer Constants Rules for Constructing Real Constants Rules for Constructing Character Constants Types of C Variables Rules for Constructing Variable Names C Keywords The First C Program Form of a C Program Comments in a C Program What is main( )? Variables and their Usage printf( ) and its Purpose Compilation and Execution Receiving Input Summary Exercise 1 2 Let Us C B efore we can begin to write serious programs in C, it would be interesting to find out what really is C, how it came into existence and how does it compare with other programming languages. In this chapter, we would briefly outline these issues. Four important aspects of any language are the way it stores data, the way it operates upon this data, how it accomplishes input and output, and how it lets you control the sequence of execution of instructions in a program. We would discuss the first three of these building blocks in this chapter. What is C? C is a programming language developed at AT & T’s Bell Laboratories of USA in 1972. It was designed and written by a man named Dennis Ritchie. In the late seventies C began to replace the more familiar languages of that time like PL/I, ALGOL, etc. No one pushed C. It wasn’t made the ‘official’ Bell Labs language. Thus, without any advertisement, C’s reputation spread and its pool of users grew. Ritchie seems to have been rather surprised that so many programmers preferred C to older languages like FORTRAN or PL/I, or the newer ones like Pascal and APL. But, that’s what happened. Possibly why C seems so popular is because it is reliable, simple and easy to use. Moreover, in an industry where newer languages, tools and technologies emerge and vanish day in and day out, a language that has survived for more than three decades has to be really good. An opinion that is often heard today is—“C has been already superseded by languages like C++, C# and Java, so why bother to learn C today”. I seriously beg to differ with this opinion. There are several reasons for this. These are as follows: (a) C++, C# or Java make use of a principle called Object Oriented Programming (OOP) to organize the program. This organizing principle has lots of advantages to offer. But even while using this organizing principle you would still need a good hold over the language elements of C and the basic programming skills. So it makes more sense to first learn C and then migrate to C++, C# and Java. Though this two-step learning process may take more time, but at the end of it you will definitely find it worth the trouble. (b) Major parts of popular operating systems like Windows, UNIX, Linux and Android are written in C. This is because even today when it Chapter 1: Getting Started 3 comes to performance (speed of execution) nothing beats C. Moreover, if one is to extend the operating system to work with new devices one needs to write device driver programs. These programs are exclusively written in C. (c) Mobile devices like Smartphones and Tablets have become rage of today. Also, common consumer devices like microwave ovens, washing machines and digital cameras are getting smarter by the day. This smartness comes from a microprocessor, an operating system and a program embedded in these devices. These programs not only have to run fast but also have to work in limited amount of memory. No wonder that such programs are written in C. With these constraints on time and space, C is the language of choice while building such operating systems and programs. (d) You must have seen several professional 3D computer games where the user navigates some object, like say a spaceship and fires bullets at the invaders. The essence of all such games is speed. Needless to say, such games won’t become popular if they take a long time to move the spaceship or to fire a bullet. To match the expectations of the player the game has to react fast to the user inputs. This is where C language scores over other languages. Many popular gaming frameworks (like DirectX) have been built using C language. (e) At times one is required to very closely interact with the hardware devices. Since C provides several language elements that make this interaction feasible without compromising the performance, it is the preferred choice of the programmer. I hope that these are very convincing reasons why you should adopt C as the first, and a very important step, in your quest for learning programming. Getting Started with C Communicating with a computer involves speaking the language the computer understands, which immediately rules out English as the language of communication with computer. However, there is a close analogy between learning English language and learning C language. The classical method of learning English is to first learn the alphabets used in the language, then learn to combine these alphabets to form words, which, in turn, are combined to form sentences and sentences are combined to form paragraphs. 4 Let Us C Learning C is similar and easier. Instead of straight-away learning how to write programs, we must first know what alphabets, numbers and special symbols are used in C, then how using them, constants, variables and keywords are constructed, and finally, how are these combined to form an instruction. A group of instructions would be combined later on to form a program. This is illustrated in the Figure 1.1. Steps in learning English language: Alphabets Words Sentences Paragraph Steps in learning C language: Alphabets Constants Digits Variables Instructions Program Special symbols Keywords Figure 1.1 The C Character Set A character denotes any alphabet, digit or special symbol used to represent information. Figure 1.2 shows the valid alphabets, numbers and special symbols allowed in C. Alphabets A, B, ….., Y, Z a, b, ….., y, z Digits 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Special symbols ~‘!@#%^&*()_-+=|\{} []:;"',.?/$ Figure 1.2 Constants, Variables and Keywords The alphabets, digits and special symbols when properly combined form constants, variables and keywords. Let us now understand the meaning of each of them. A constant is an entity that doesn’t change, whereas, a variable is an entity that may change. A keyword is a word that carries special meaning. Chapter 1: Getting Started 5 In any C program we typically do lots of calculations. The results of these calculations are stored in computer’s memory. Like human memory, the computer’s memory also consists of millions of cells. The calculated values are stored in these memory cells. To make the retrieval and usage of these values easy, these memory cells (also called memory locations) are given names. Since the value stored in each location may change, the names given to these locations are called variable names. Let us understand this with the help of an example. Consider the memory locations shown in Figure 1.3. Here 3 is stored in a memory location and a name x is given to it. Then we have assigned a new value 5 to the same memory location x. This would overwrite the earlier value 3, since a memory location can hold only one value at a time. x 3 x 5 Figure 1.3 Since the location whose name is x can hold different values at different times x is known as a variable (or a variable name). As against this, 3 or 5 do not change, hence are known as constants. In programming languages, constants are often called literals, whereas, variables are called identifiers. Now that we understand the constants and the variables, let us see what different types of constants and variables exist in C. Types of C Constants C constants can be divided into two major categories: (a) Primary Constants (b) Secondary Constants These constants are further categorized as shown in Figure 1.4. 6 Let Us C C Constants Primary Constants Secondary Constants Integer Constant Array Real Constant Pointer Character Constant Structure Union Enum. Etc. Figure 1.4 At this stage, we would restrict our discussion to only Primary constants, namely, Integer, Real and Character constants. Let us see the details of each of these constants. For constructing these different types of constants, certain rules have been laid down. These rules are as under: Rules for Constructing Integer Constants (a) An integer constant must have at least one digit. (b) It must not have a decimal point. (c) It can be either positive or negative. (d) If no sign precedes an integer constant, it is assumed to be positive. (e) No commas or blanks are allowed within an integer constant. (f) The allowable range for integer constants is -2147483648 to +2147483647. Truly speaking, the range of an Integer constant depends upon the compiler. For compilers like Visual Studio, gcc, it is -2147483648 to +214748364, whereas for compilers like Turbo C or Turbo C++ the range is -32768 to +32767. Ex.: 426 +782 -8000 -7605 Chapter 1: Getting Started 7 Rules for Constructing Real Constants Real constants are often called Floating Point constants. The real constants could be written in two forms—Fractional form and Exponential form. Following rules must be observed while constructing real constants expressed in fractional form: (a) A real constant must have at least one digit. (b) It must have a decimal point. (c) It could be either positive or negative. (d) Default sign is positive. (e) No commas or blanks are allowed within a real constant. Ex.: +325.34 426.0 -32.76 -48.5792 The exponential form is usually used if the value of the constant is either too small or too large. It, however, doesn’t restrict us in any way from using exponential form for other real constants. In exponential form the real constant is represented in two parts. The part appearing before ‘e’ is called mantissa, whereas the part following ‘e’ is called exponent. Thus 0.000342 can be written in exponential form as 3.42e-4 (which in normal arithmetic means 3.42 x 10-4). Following rules must be observed while constructing real constants expressed in exponential form: (a) The mantissa part and the exponential part should be separated by a letter e or E. (b) The mantissa part may have a positive or negative sign. (c) Default sign of mantissa part is positive. (d) The exponent must have at least one digit, which must be a positive or negative integer. Default sign is positive. (e) Range of real constants expressed in exponential form is -3.4e38 to 3.4e38. Ex.: +3.2e-5 8 Let Us C 4.1e8 -0.2E+3 -3.2e-5 Rules for Constructing Character Constants (a) A character constant is a single alphabet, a single digit or a single special symbol enclosed within single inverted commas. (b) Both the inverted commas should point to the left. For example, ’A’ is a valid character constant whereas ‘A’ is not. Ex.: 'A' 'I' '5' '=' Types of C Variables A particular type of variable can hold only the same type of constant. For example, an integer variable can hold only an integer constant, a real variable can hold only a real constant and a character variable can hold only a character constant. The rules for constructing different types of constants are different. However, for constructing variable names of all types, the same set of rules applies. These rules are given below. Rules for Constructing Variable Names (a) A variable name is any combination of 1 to 31 alphabets, digits or underscores. Some compilers allow variable names whose length could be up to 247 characters. Still, it would be safer to stick to the rule of 31 characters. Do not create unnecessarily long variable names as it adds to your typing effort. (b) The first character in the variable name must be an alphabet or underscore ( _ ). (c) No commas or blanks are allowed within a variable name. (d) No special symbol other than an underscore (as in gross_sal) can be used in a variable name. Ex.: si_int m_hra pop_e_89 Chapter 1: Getting Started 9 Since, the maximum allowable length of a variable name is 31 characters, an enormous number of variable names can be constructed using the above-mentioned rules. It is a good practice to exploit this abundant choice in naming variables by using meaningful variable names. Thus, if we want to calculate simple interest, it is always advisable to construct meaningful variable names like prin, roi, noy to represent Principle, Rate of interest and Number of years rather than using the variables a, b, c. The rules for creating variable names remain same for all the types of primary and secondary variables. Naturally, the question follows... how is C able to differentiate between these variables? This is a rather simple matter. C compiler is able to distinguish between the variable names by making it compulsory for you to declare the type of any variable name that you wish to use in a program. This type declaration is done at the beginning of the program. Examples of type declaration statements are given below. Ex.: int si, m_hra ; float bassal ; char code ; C Keywords Keywords are the words whose meaning has already been explained to the C compiler (or in a broad sense to the computer). There are only 32 keywords available in C. Figure 1.5 gives a list of these keywords for your ready reference. A detailed discussion of each of these keywords would be taken up in later chapters wherever their use is relevant. auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while Figure 1.5 10 Let Us C The keywords cannot be used as variable names because if we do so, we are trying to assign a new meaning to the keyword, which is not allowed. Some C compilers allow you to construct variable names that exactly resemble the keywords. However, it would be safer not to mix up the variable names and the keywords. Note that compiler vendors (like Microsoft, Borland, etc.) provide their own keywords apart from the ones mentioned in Figure 1.5. These include extended keywords like near, far, asm, etc. Though it has been suggested by the ANSI committee that every such compiler-specific keyword should be preceded by two underscores (as in __asm ), not every vendor follows this rule. The First C Program Once armed with the knowledge of variables, constants & keywords, the next logical step would be to combine them to form instructions. However, instead of this, we would write our first C program now. Once we have done that we would see in detail the instructions that it made use of. The first program is very simple. It calculates simple interest for a set of values representing principal, number of years and rate of interest. # include int main( ) { int p, n ; float r, si ; p = 1000 ; n=3; r = 8.5 ; si = p * n * r / 100 ; printf ( "%f\n" , si ) ; return 0 ; } Chapter 1: Getting Started 11 Let us now understand this program in detail. Form of a C Program Form of a C program indicates how it has to be written/typed. There are certain rules about the form of a C program that are applicable to all C programs. These are as under: (a) Each instruction in a C program is written as a separate statement. (b) The statements in a program must appear in the same order in which we wish them to be executed. (c) Blank spaces may be inserted between two words to improve the readability of the statement. (d) All statements should be in lower case letters. (e) C has no specific rules for the position at which a statement is to be written in a given line. That’s why it is often called a free-form language. (f) Every C statement must end with a semicolon ( ; ). Thus ; acts as a statement terminator. Comments in a C Program Comments are used in a C program to clarify either the purpose of the program or the purpose of some statement in the program. It is a good practice to begin a program with a comment indicating the purpose of the program, its author and the date on which the program was written. Here are a few things that you must remember while writing comments in a C program: (a) Comment about the program should be enclosed within. Thus, the first two statements in our program are comments. (b) Sometimes it is not very obvious as to what a particular statement in a program accomplishes. At such times it is worthwhile mentioning the purpose of the statement (or a set of statements) using a comment. For example: si = p * n * r / 100 ; (c) Any number of comments can be written at any place in the program. For example, a comment can be written before the 12 Let Us C statement, after the statement or within the statement as shown below. si = p * n * r / 100 ; si = p * n * r / 100 ; si = p * n * r / 100 ; (d) The normal language rules do not apply to text written within. Thus we can type this text in small case, capital or a combination. This is because the comments are solely given for the understanding of the programmer or the fellow programmers and are completely ignored by the compiler. (e) Comments cannot be nested. This means one comment cannot be written inside another comment. For example, */ is invalid. (f) A comment can be split over more than one line, as in, Such a comment is often called a multi-line comment. (g) ANSI C permits comments to be written in the following way: // Calculation of simple interest // Formula What is main( )? main( ) forms a crucial part of any C program. Let us understand its purpose as well as its intricacies. (a) main( ) is a function. A function is nothing but a container for a set of statements. In a C program there can be multiple functions. To begin with, we would concentrate only on those programs which have only one function. The name of this function has to be main( ), it cannot be anything else. All statements that belong to main( ) are enclosed within a pair of braces { } as shown below. Chapter 1: Getting Started 13 int main( ) { statement 1 ; statement 2 ; statement 3 ; } (b) The way functions in a calculator return a value, similarly, functions in C also return a value. main( ) function always returns an integer value, hence there is an int before main( ). The integer value that we are returning is 0. 0 indicates success. If for any reason the statements in main( ) fail to do their intended work we can return a non-zero number from main( ). This would indicate failure. (c) Some compilers like Turbo C/C++ even permit us to return nothing from main( ). In such a case we should precede it with the keyword void. But this is non-standard way of writing the main( ) function. We would discuss functions and their working in great detail in Chapter 8. Variables and their Usage We have learnt constants and variables in isolation. Let us understand their significance with reference to our first C program. (a) Any variable used in the program must be declared before using it. For example, int p, n ; float r, si ; si = p * n * r / 100 ; (b) In the statement, si = p * n * r / 100 ; * and / are the arithmetic operators. The arithmetic operators available in C are +, -, * and /. C is very rich in operators. There are as many as 45 operators available in C. Surprisingly there is no operator for exponentiation... a slip, which can be forgiven considering the fact that C has been developed by an individual, not by a committee. 14 Let Us C printf( ) and its Purpose C does not contain any instruction to display output on the screen. All output to screen is achieved using readymade library functions. One such function is printf( ). Let us understand this function with respect to our program. (a) Once the value of si is calculated it needs to be displayed on the screen. We have used printf( ) to do so. (b) For us to be able to use the printf( ) function, it is necessary to use #include at the beginning of the program. #include is a preprocessor directive. Its purpose will be clarified in Chapter 8. For now, use it whenever you use printf( ). (c) The general form of printf( ) function is, printf ( "", ) ; can contain, %f for printing real values %d for printing integer values %c for printing character values In addition to format specifiers like %f, %d and %c, the format string may also contain any other characters. These characters are printed as they are when printf( ) is executed. (d) Given below are some more examples of usage of printf( ) function: printf ( "%f", si ) ; printf ( "%d %d %f %f", p, n, r, si ) ; printf ( "Simple interest = Rs. %f", si ) ; printf ( "Principal = %d \nRate = %f", p, r ) ; The output of the last statement would look like this... Principal = 1000 Rate = 8.500000 What is ‘\n’ doing in this statement? It is called newline and it takes the cursor to the next line. Therefore, you get the output split over two lines. ‘\n’ is one of the several Escape Sequences available in C. These are discussed in detail in Chapter 18. Right now, all that we Chapter 1: Getting Started 15 can say is ‘\n’ comes in handy when we want to format the output properly on separate lines. (e) printf( ) can not only print values of variables, it can also print the result of an expression. An expression is nothing but a valid combination of constants, variables and operators. Thus, 3, 3 + 2, c and a + b * c – d all are valid expressions. The results of these expressions can be printed as shown below. printf ( "%d %d %d %d", 3, 3 + 2, c, a + b * c – d ) ; Note that 3 and c also represent valid expressions. Compilation and Execution Once you have written the program you need to type it and instruct the machine to execute it. To type your C program you need another program called Editor. Once the program has been typed it needs to be converted to machine language instructions before the machine can execute it. To carry out this conversion we need another program called Compiler. Compiler vendors provide an Integrated Development Environment (IDE) which consists of an Editor as well as the Compiler. There are several IDEs available in the market targeted towards different operating systems and microprocessors. Details of which IDE to use, how to procure, install and use it are given in Appendix A. Please go through this appendix and install the right IDE on your machine before you try rest of the programs in this book. Receiving Input In the program discussed above we assumed the values of p, n and r to be 1000, 3 and 8.5. Every time we run the program we would get the same value for simple interest. If we want to calculate simple interest for some other set of values then we are required to make the relevant changes in the program, and again compile and execute it. Thus the program is not general enough to calculate simple interest for any set of values without being required to make a change in the program. Moreover, if you distribute the EXE file of this program to somebody he would not even be able to make changes in the program. Hence it is a good practice to create a program that is general enough to work for any set of values. 16 Let Us C To make the program general, the program itself should ask the user to supply the values of p, n and r through the keyboard during execution. This can be achieved using a function called scanf( ). This function is a counter-part of the printf( ) function. printf( ) outputs the values to the screen whereas scanf( ) receives them from the keyboard. This is illustrated in the program given below. # include int main( ) { int p, n ; float r, si ; printf ( "Enter values of p, n, r" ) ; scanf ( "%d %d %f", &p, &n, &r ) ; si = p * n * r / 100 ; printf ( "%f\n" , si ) ; return 0 ; } The first printf( ) outputs the message ‘Enter values of p, n, r’ on the screen. Here we have not used any expression in printf( ) which means that using expressions in printf( ) is optional. Note the use of ampersand (&) before the variables in the scanf( ) function is a must. & is an ‘Address of’ operator. It gives the location number (address) used by the variable in memory. When we say &a, we are telling scanf( ) at which memory location should it store the value supplied by the user from the keyboard. The detailed working of the & operator would be taken up in Chapter 6. Note that a blank, a tab or a new line must separate the values supplied to scanf( ). A blank is created using a spacebar, tab using the Tab key and new line using the Enter key. This is shown below. Ex.: The three values separated by blank: 1000 5 15.5 Ex.: The three values separated by tab: Chapter 1: Getting Started 17 1000 5 15.5 Ex.: The three values separated by newline: 1000 5 15.5 So much for the tips. How about writing another program to give you a feel of things. Here it is... # include int main( ) { int num ; printf ( "Enter a number" ) ; scanf ( "%d", &num ) ; printf ( "Now I am letting you on a secret...\n" ) ; printf ( "You have just entered the number %d\n", num ) ; return 0 ; } Summary (a) Constant is an entity whose value remains fixed. (b) Variable is an entity whose value can change during course of execution of the program. (c) Keywords are special words whose meaning is known to the Compiler. (d) There are certain rules that must be followed while building constants or variables. (e) The three primary constants and variable types in C are integer, float and character. (f) We should not use a keyword as a variable name. (g) Comments should be used to indicate the purpose of the program or statements in a program. (h) Comments can be single line or multi-line. 18 Let Us C (i) Input/output in C can be achieved using scanf( ) and printf( ) functions. Exercise [A] Which of the following are invalid C constants and why? ’3.15’ 35,550 3.25e2 2e-3 ‘eLearning’ "show" ‘Quest’ 23 4652 [B] Which of the following are invalid variable names and why? B’day int $hello #HASH dot. number totalArea _main( ) temp_in_Deg total% 1st stack-queue variable name %name% salary [C] State whether the following statements are True or False: (a) C language has been developed by Dennis Ritchie. (b) Operating systems like Windows, UNIX, Linux and Android are written in C. (c) C language programs can easily interact with hardware of a PC / Laptop. (d) A real constant in C can be expressed in both Fractional and Exponential forms. (e) A character variable can at a time store only one character. (f) The maximum value that an integer constant can have varies from one compiler to another. (g) Usually all C statements are written in small case letters. (h) Spaces may be inserted between two words in a C statement. (i) Spaces cannot be present within a variable name. (j) C programs are converted into machine language with the help of a program called Editor. (k) Most development environments provide an Editor to type a C program and a Compiler to convert it into machine language. (l) int, char, float, real, integer, character, char, main, printf and scanf all are keywords. Chapter 1: Getting Started 19 [D] Match the following: (a) \n Literal (b) 3.145 Statement terminator (c) -6513 Character constant (d) ’D’ Escape sequence (e) 4.25e-3 Input function (f) main( ) Function (g) %f, %d, %c Integer constant (h) ; Address of operator (i) Constant Output function (j) Variable Format specifier (k) & Exponential form (l) printf( ) Real constant (m) scanf( ) Identifier [E] Point out the errors, if any, in the following programs: (a) int main( ) { int a, float b, int c ; a = 25 ; b = 3.24 ; c = a + b * b – 35 ; } (b) */ #include int main( ) { int a = 35 ; float b = 3.24 ; printf ( "%d %f %d", a, b + 1.5, 235 ) ; } (c) #include int main( ) { int a, b, c ; scanf ( "%d %d %d", a, b, c ) ; } (d) #include 20 Let Us C int main( ) { int m1, m2, m3 printf ( "Enter values of marks in 3 subjects" ) scanf ( "%d %d %d", &m1, &m2, &m3 ) printf ( "You entered %d %d %d", m1, m2, m3 ) ; } [F] Attempt the following: (a) Ramesh’s basic salary is input through the keyboard. His dearness allowance is 40% of basic salary, and house rent allowance is 20% of basic salary. Write a program to calculate his gross salary. (b) The distance between two cities (in km.) is input through the keyboard. Write a program to convert and print this distance in meters, feet, inches and centimeters. (c) If the marks obtained by a student in five different subjects are input through the keyboard, write a program to find out the aggregate marks and percentage marks obtained by the student. Assume that the maximum marks that can be obtained by a student in each subject is 100. (d) Temperature of a city in Fahrenheit degrees is input through the keyboard. Write a program to convert this temperature into Centigrade degrees. (e) The length and breadth of a rectangle and radius of a circle are input through the keyboard. Write a program to calculate the area and perimeter of the rectangle, and the area and circumference of the circle. (f) Paper of size A0 has dimensions 1189 mm x 841 mm. Each subsequent size A(n) is defined as A(n-1) cut in half parallel to its shorter sides. Thus paper of size A1 would have dimensions 841 mm x 594 mm. Write a program to calculate and print paper sizes A0, A1, A2, … A8. 2 C Instructions Types of Instructions Type Declaration Instruction Arithmetic Instruction Integer and Float Conversions Type Conversion in Assignments Hierarchy of Operations Associativity of Operators Control Instruction in C Summary Exercise 21 22 Let Us C A program is nothing but a set of instructions. The program behaves as per the instructions that we give in it. Different instructions help us achieve different tasks in a program. In the last chapter we saw how to write simple C programs. In these programs knowingly or unknowingly we have used instructions to achieve the intended purpose of the program. In this chapter we would explore the instructions that we have used in these programs. Types of Instructions There are basically three types of instructions in C: (a) Type Declaration Instruction – This instruction is used to declare the type of variables used in a C program. (b) Arithmetic Instruction – This instruction is used to perform arithmetic operations on constants and variables. (c) Control Instruction – This instruction is used to control the sequence of execution of various statements in a C program. Since, the elementary C programs would usually contain only the type declaration and the arithmetic instructions; we would discuss only these two instructions at this stage. The control instruction would be discussed in detail in the subsequent chapters. Type Declaration Instruction This instruction is used to declare the type of variables being used in the program. Any variable used in the program must be declared before using it in any statement. The type declaration statement is written at the beginning of main( ) function. Ex.: int bas ; float rs, grosssal ; char name, code ; There are several subtle variations of the type declaration instruction. These are discussed below: (a) While declaring the type of variable we can also initialize it as shown below. int i = 10, j = 25 ; float a = 1.5, b = 1.99 + 2.4 * 1.44 ; Chapter 2: C Instructions 23 (b) The order in which we define the variables is sometimes important sometimes not. For example, int i = 10, j = 25 ; is same as int j = 25, i = 10 ; However, float a = 1.5, b = a + 3.1 ; is alright, but float b = a + 3.1, a = 1.5 ; is not. This is because here we are trying to use a before defining it. (c) The following statements would work int a, b, c, d ; a = b = c = 10 ; However, the following statement would not work int a = b = c = d = 10 ; Once again we are trying to use b (to assign to a) before defining it. Arithmetic Instruction A C arithmetic instruction consists of a variable name on the left hand side of = and variable names and constants on the right hand side of =. The variables and constants appearing on the right hand side of = are connected by arithmetic operators like +, -, *, and /. Ex.: int ad ; float kot, deta, alpha, beta, gamma ; ad = 3200 ; kot = 0.0056 ; deta = alpha * beta / gamma + 3.2 * 2 / 5 ; 24 Let Us C Here, *, /, -, + are the arithmetic operators. = is the assignment operator. 2, 5 and 3200 are integer constants. 3.2 and 0.0056 are real constants. ad is an integer variable. kot, deta, alpha, beta, gamma are real variables. The variables and constants together are called ‘operands’. While executing an arithmetic statement the operands on right hand side are operated upon by the ‘arithmetic operators’ and the result is then assigned, using the assignment operator, to the variable on left-hand side. A C arithmetic statement could be of three types. These are as follows: (a) Integer mode arithmetic statement – In this statement all operands are either integer variables or integer constants. Ex.: int i, king, issac, noteit ; i=i+1; king = issac * 234 + noteit - 7689 ; (b) Real mode arithmetic statement – In this statement all operands are either real constants or real variables. Ex.: float qbee, antink, si, prin, anoy, roi ; qbee = antink + 23.123 / 4.5 * 0.3442 ; si = prin * anoy * roi / 100.0 ; (c) Mixed mode arithmetic statement – In this statement some operands are integers and some operands are real. Ex.: float si, prin, anoy, roi, avg ; int a, b, c, num ; si = prin * anoy * roi / 100.0 ; avg = ( a + b + c + num ) / 4 ; Chapter 2: C Instructions 25 Though Arithmetic instructions look simple to use, one often commits mistakes in writing them. Let us take a closer look at these statements. Note the following points carefully: (a) C allows only one variable on left-hand side of =. That is, z = k * l is legal, whereas k * l = z is illegal. (b) In addition to the division operator C also provides a modular division operator. This operator returns the remainder on dividing one integer with another. Thus the expression 10 / 2 yields 5, whereas, 10 % 2 yields 0. Note that the modulus operator (%) cannot be applied on a float. Also note that on using % the sign of the remainder is always same as the sign of the numerator. Thus -5 % 2 yields –1, whereas, 5 % -2 yields 1. (c) An arithmetic instruction is at times used for storing character constants in character variables. char a, b, d ; a = 'F' ; b = 'G' ; d = '+' ; When we do this, the ASCII values of the characters are stored in the variables. ASCII codes are used to represent any character in memory. For example, ASCII codes of ‘F’ and ‘G’ are 01000110 and 01000111. ASCII values are nothing but the decimal equivalent of ASCII codes. Thus ASCII values of ‘F’ and ‘G’ are 70 and 71. (d) Arithmetic operations can be performed on ints, floats and chars. Thus the statements, char x, y ; int z ; x = 'a' ; y = 'b' ; z=x+y; are perfectly valid, since the addition is performed on the ASCII values of the characters and not on characters themselves. The ASCII values of ‘a’ and ‘b’ are 97 and 98, and hence can definitely be added. 26 Let Us C (e) No operator is assumed to be present. It must be written explicitly. In the following example, the multiplication operator after b must be explicitly written. a = c.d.b(xy) usual arithmetic statement a=c*d*b*(x*y) C statement (f) There is no operator in C to perform exponentiation operation. Exponentiation has to be carried out as shown below: # include # include int main( ) { float a ; a = pow ( 3.0, 2.0 ) ; printf ( "%f", a ) ; } Here pow( ) function is a standard library function. It is being used to raise 3.0 to the power of 2.0. The pow( ) function works only with real numbers, hence we have used 3.0 and 2.0 instead of 3 and 2. #include is a preprocessor directive. It is being used here to ensure that the pow( ) function works correctly. We would learn more about standard library functions in Chapter 6 and about preprocessor in Chapter 8. You can explore other mathematical functions like abs( ), sqrt( ), sin( ), cos( ), tan( ), etc., declared in math.h on your own. Integer and Float Conversions In order to effectively develop C programs, it will be necessary to understand the rules that are used for the implicit conversion of floating point and integer values in C. These are mentioned below. Note them carefully. (a) An arithmetic operation between an integer and integer always yields an integer result. (b) An operation between a real and real always yields a real result. Chapter 2: C Instructions 27 (c) An operation between an integer and real always yields a real result. In this operation the integer is first promoted to a real and then the operation is performed. Hence the result is real. I think a few practical examples shown in Figure 2.1 would put the issue beyond doubt. Operation Result Operation Result 5/2 2 2/5 0 5.0 / 2 2.5 2.0 / 5 0.4 5 / 2.0 2.5 2 / 5.0 0.4 5.0 / 2.0 2.5 2.0 / 5.0 0.4 Figure 2.1 Type Conversion in Assignments It may so happen that the type of the expression on right hand side and the type of the variable on the left-hand side of an assignment operator may not be same. In such a case, the value of the expression is promoted or demoted depending on the type of the variable on left- hand side of =. For example, consider the following assignment statements. int i ; float b ; i = 3.5 ; b = 30 ; Here in the first assignment statement, though the expression’s value is a float (3.5), it cannot be stored in i since it is an int. In such a case, the float is demoted to an int and then its value is stored. Hence what gets stored in i is 3. Exactly opposite happens in the next statement. Here, 30 is promoted to 30.0 and then stored in b, since b being a float variable cannot hold anything except a float value. Instead of a simple expression used in the above examples, if a complex expression occurs, still the same rules apply. For example, consider the following program fragment. float a, b, c ; int s ; 28 Let Us C s = a * b * c / 100 + 32 / 4 - 3 * 1.1 ; Here, in the assignment statement, some operands are ints whereas others are floats. As we know, during evaluation of the expression, the ints would be promoted to floats and the result of the expression would be a float. But when this float value is assigned to s it is again demoted to an int and then stored in s. Observe the results of the arithmetic statements shown in Figure 2.2. It has been assumed that k is an integer variable and a is a real variable. Arithmetic Instruction Result Arithmetic Instruction Result k=2/9 0 a=2/9 0.0 k = 2.0 / 9 0 a = 2.0 / 9 0.222222 k = 2 / 9.0 0 a = 2 / 9.0 0.222222 k = 2.0 / 9.0 0 a = 2.0 / 9.0 0.222222 k=9/2 4 a=9/2 4.0 k = 9.0 / 2 4 a = 9.0 / 2 4.5 k = 9 / 2.0 4 a = 9 / 2.0 4.5 k = 9.0 / 2.0 4 a = 9.0 / 2.0 4.5 Figure 2.2 Note that though the following statements give the same result, 0, the results are obtained differently. k=2/9; k = 2.0 / 9 ; In the first statement, since both 2 and 9 are integers, the result is an integer, i.e. 0. This 0 is then assigned to k. In the second statement 9 is promoted to 9.0 and then the division is performed. Division yields 0.222222. However, this cannot be stored in k, k being an int. Hence it gets demoted to 0 and then stored in k. Hierarchy of Operations While executing an arithmetic statement that has multiple operators, there might be some issues about their evaluation. For example, does the expression 2 * x - 3 * y correspond to (2x)-(3y) or to 2(x-3y)? Similarly, does A / B * C correspond to A / (B * C) or to (A / B) * C? To answer these questions satisfactorily, one has to understand the ‘hierarchy’ of operations. The priority or precedence in which the Chapter 2: C Instructions 29 operations in an arithmetic statement are performed is called the hierarchy of operations. The hierarchy of commonly used operators is shown in Figure 2.3. Priority Operators Description 1st * / % Multiplication, Division, Modular division 2nd + - Addition, Subtraction 3rd = Assignment Figure 2.3 Now a few tips about usage of operators in general. (a) Within parentheses the same hierarchy as mentioned in Figure 2.3 is operative. Also, if there are more than one set of parentheses, the operations within the innermost parentheses would be performed first, followed by the operations within the second innermost pair and so on. (b) We must always remember to use pairs of parentheses. A careless imbalance of the right and left parentheses is a common error. Best way to avoid this error is to type ( ) and then type an expression inside it. A few examples would clarify the issue further. Example 2.1: Determine the hierarchy of operations and evaluate the following expression, assuming that i is an integer variable: i=2*3/4+4/4+8-2+5/8 Stepwise evaluation of this expression is shown below: i=2*3/4+4/4+8-2+5/8 i=6/4+4/4+8-2+5/8 operation: * i=1+4/4+8-2+5/8 operation: / i = 1 + 1+ 8 - 2 + 5 / 8 operation: / i=1+1+8-2+0 operation: / i=2+8-2+0 operation: + i = 10 - 2 + 0 operation: + i=8+0 operation : - i=8 operation: + 30 Let Us C Note that 6 / 4 gives 1 and not 1.5. This so happens because 6 and 4 both are integers and therefore 6 / 4 must evaluate to an integer. Similarly 5 / 8 evaluates to zero, since 5 and 8 are integers and hence 5 / 8 must return an integer value. Example 2.2: Determine the hierarchy of operations and evaluate the following expression, assuming that kk is a float variable: kk = 3 / 2 * 4 + 3 / 8 Stepwise evaluation of this expression is shown below: kk = 3 / 2 * 4 + 3 / 8 kk = 1 * 4 + 3 / 8 operation: / kk = 4 + 3 / 8 operation: * kk = 4 + 0 operation: / kk = 4 operation: + Note that 3 / 8 gives zero, again for the same reason mentioned in the previous example. All operators in C are ranked according to their precedence. And mind you, there are as many as 45 odd operators in C, and these can affect the evaluation of an expression in subtle and unexpected ways if we aren't careful. Unfortunately, there are no simple rules that one can follow, such as “BODMAS” that tells algebra students in which order does an expression evaluate. We have not encountered many out of these 45 operators, so we won’t pursue the subject of precedence any further here. However, it can be realized at this stage that it would be almost impossible to remember the precedence of all these operators. So a full-fledged list of all operators and their precedence is given in Appendix A. This may sound daunting, but when its contents are absorbed in small bites, it becomes more palatable. So far we have seen how arithmetic statements written in C are evaluated. But our knowledge would be incomplete unless we know how to convert a general algebraic expression to a C statement. C can handle any complex algebraic expressions with ease. Some examples of algebraic expressions and their equivalent C expressions are shown in Figure 2.4. Chapter 2: C Instructions 31 Algebraic Expression C Expression axb-cxd a*b-c*d (m+n)(a+b) (m+n)*(a+b) 3x2 + 2x + 5 3*x*x+2*x+5 abc (a+b+c)/(d+e) d e 2 BY x 2*b*y/(d+1)-x/3*(z+y) d 1 3( z y ) Figure 2.4 Associativity of Operators When an expression contains two operators of equal priority the tie between them is settled using the associativity of the operators. All operators in C have either Left to Right associativity or Right to Left associativity. Let us understand this with the help of a few examples. Consider the expression a = 3 / 2 * 5 ; Here there is a tie between operators of same priority, that is between / and *. This tie is settled using the associativity of / and *. Both enjoy Left to Right associativity. Therefore firstly / operation is done followed by *. Consider one more expression. a=b=3; Here both assignment operators have the same priority. So order of operations is decided using associativity of = operator. = associates from Right to Left. Therefore, second = is performed earlier than first =. Consider yet another expression. z=a*b+c/d; Here * and / enjoys same priority and same associativity (Left to Right). Compiler is free to perform * or / operation as per its convenience, since no matter which is performed earlier, the result would be same. 32 Let Us C Appendix B gives the associativity of all the operators available in C. Note that the precedence and associativity of all operators is predetermined and we cannot change it. Control Instructions As the name suggests, the ‘Control Instructions’ enable us to specify the order in which the various instructions in a program are to be executed by the computer. In other words, the control instructions determine the ‘flow of control’ in a program. There are four types of control instructions in C. They are: (a) Sequence Control Instruction (b) Selection or Decision Control Instruction (c) Repetition or Loop Control Instruction (d) Case Control Instruction The Sequence control instruction ensures that the instructions are executed in the same order in which they appear in the program. Decision and Case control instructions allow the computer to take a decision as to which instruction is to be executed next. The Loop control instruction helps computer to execute a group of statements repeatedly. In the following chapters we are going to discuss these instructions in detail. Summary (a) Instructions in a program control the behavior/working of the program. (b) A C program can contain three types of instructions—Type declaration instruction, Arithmetic instruction, Control instruction. (c) An expression may contain any sequence of constants, variables and operators. (d) An expression is evaluated based on the hierarchy or precedence of operators. (e) Operators having equal precedence are evaluated using associativity of operators. (f) Associativity of all operators is either left to right or right to left. Chapter 2: C Instructions 33 Exercise [A] Point out the errors, if any, in the following C statements: (a) x = ( y + 3 ) ; (b) cir = 2 * 3.141593 * r ; (c) char = ‘3’ ; (d) 4 / 3 * 3.14 * r * r * r = vol_of_sphere ; (e) volume = a3 ; (f) area = 1 / 2 * base * height ; (g) si = p * r * n / 100 ; (h) area of circle = 3.14 * r * r ; (i) peri_of_tri = a + b + c ; (j) slope = ( y2 – y1 ) ÷ ( x2 – x1 ) ; (k) 3 = b = 4 = a ; (l) count = count + 1 ; (m) char ch = '25 Apr 12' ; [B] Evaluate the following expressions and show their hierarchy. (a) ans = 5 * b * b * x - 3 * a * y * y - 8 * b * b * x + 10 * a * y ; (a = 3, b = 2, x = 5, y = 4 assume ans to be an int) (b) res = 4 * a * y / c - a * y / c ; (a = 4, y = 1, c = 3, assume res to be an int) (c) s = c + a * y * y / b ; (a = 2.2, b = 0.0, c = 4.1, y = 3.0, assume s to be an float) (d) R = x * x + 2 * x + 1 / 2 * x * x + x + 1 ; (x = 3.5, assume R to be an float) [C] Indicate the order in which the following expressions would be evaluated: (a) g = 10 / 5 /2 / 1 ; (b) b = 3 / 2 + 5 * 4 / 3 ; (c) a = b = c = 3 + 4 ; (d) x = 2 – 3 + 5 * 2 / 8 % 3 ; (e) z = 5 % 3 / 8 * 3 + 4 34 Let Us C (f) y = z = -3 % -8 / 2 + 7 ; [D] Convert the following algebraic expressions into equivalent C statements: ( x 3 ) x3 (a) Z ( y 4)( y 5) 2v 6.22 ( c d ) (b) R gv 7.7b ( xy + a ) / c - 0.8 + 2b (c) A= ( x + a ) (1 / y ) 12 x 3 8 x 2 x 8 (d) X 4x 4 x 8x 8x [E] What will be the output of the following programs: (a) # include int main( ) { int i = 2, j = 3, k, l ; float a, b ; k=i/j*j; l=j/i*i; a=i/j*j; b=j/i*i; printf ( "%d %d %f %f\n", k, l, a, b ) ; return 0 ; } (b) # include int main( ) { int a, b, c, d ; a=2%5; b = -2 % 5 ; c = 2 % -5 ; d = -2 % -5 ; printf ( "a = %d b = %d c = %d d = %d\n", a, b, c, d ) ; Chapter 2: C Instructions 35 return 0 ; } (c) # include int main( ) { float a = 5, b = 2 ; int c, d ; c=a%b; d=a/2; printf ( "%d\n", d ) ; return 0 ; } (d) # include int main( ) { printf ( "nn \n\n nn\n" ) ; printf ( "nn /n/n nn/n" ) ; return 0 ; } (e) # include int main( ) { int a, b ; printf ( "Enter values of a and b" ) ; scanf ( " %d %d ", &a, &b ) ; printf ( "a = %d b = %d", a, b ) ; return 0 ; } [F] State whether the following statements are True or False: (a) * or /, + or – represents the correct hierarchy of arithmetic operators in C. (b) [ ] and { } can be used in Arithmetic instructions. (c) Hierarchy decides which operator is used first. (d) In C, Arithmetic instruction cannot contain constants on left side of =. (e) In C ** operator is used for exponentiation operation. 36 Let Us C (f) % operator cannot be used with floats. [G] Fill in the blanks: (a) In y = 10 * x / 2 + z ; operation will be performed first. (b) If a is an integer variable, a = 11 / 2 ; will store in a. (c) The expression, a = 22 / 7 * 5 / 3 ; would evaluate to. (d) The expression x = -7 % 2 - 8 would evaluate to. (e) If d is a float the operation d = 2 / 7.0 would store in d. [H] Attempt the following: (a) If a five-digit number is input through the keyboard, write a program to calculate the sum of its digits. (Hint: Use the modulus operator ‘%’) (b) If a five-digit number is input through the keyboard, write a program to reverse the number. (c) If lengths of three sides of a triangle are input through the keyboard, write a program to find the area of the triangle. (d) Write a program to receive Cartesian co-ordinates (x, y) of a point and convert them into polar co-ordinates (r, ). Hint: r = sqrt ( x2 + y2 ) and tan-1 ( y / x ) (e) Write a program to receive values of latitude (L1, L2) and longitude (G1, G2), in degrees, of two places on the earth and output the distance (D) between them in nautical miles. The formula for distance in nautical miles is: D = 3963 cos-1 ( sin L1 sin L2 + cos L1 cos L2 * cos ( G2 – G1 ) ) (f) Wind chill factor is the felt air temperature on exposed skin due to wind. The wind chill temperature is always lower than the air temperature, and is calculated as per the following formula: wcf = 35.74 + 0.6215t + ( 0.4275t - 35.75 ) * v0.16 where t is the temperature and v is the wind velocity. Write a program to receive values of t and v and calculate wind chill factor (wcf). (g) If value of an angle is input through the keyboard, write a program to print all its Trigonometric ratios. Chapter 2: C Instructions 37 (h) Two numbers are input through the keyboard into two locations C and D. Write a program to interchange the contents of C and D. (i) Consider a currency system in which there are notes of seven denominations, namely, Re. 1, Rs. 2, Rs. 5, Rs. 10, Rs. 50, Rs. 100. If a sum of Rs. N is entered through the keyboard, write a program to compute the smallest number of notes that will combine to give Rs. N. 38 Let Us C 3 Decision Control Instruction Decisions! Decisions! The if Statement The Real Thing Multiple Statements within if The if-else Statement Nested if-elses Forms of if Summary Exercise 39 40 Let Us C W e all need to alter our actions in the face of changing circumstances. If the weather is fine, then I will go for a stroll. If the highway is busy, I would take a diversion. If the pitch takes spin, we would win the match. If you join our WhatsApp group, I would send you interesting videos. If you like this book, I would write the next edition. You can notice that all these decisions depend on some condition being met. C language too must be able to perform different sets of actions depending on the circumstances. C has three major decision making instructions—the if statement, the if-else statement, and the switch statement. A fourth, somewhat less important structure is the one that uses conditional operators. In this chapter, we will explore if and the if- else statement. Conditional operators would be dealt with in Chapter 4 and switch statement in Chapter 7. Decisions! Decisions! In the programs written in Chapters 1 and 2, we have used sequence control instruction in which the various statements are executed sequentially, i.e., in the same order in which they appear in the program. In fact, to execute the instructions sequentially, we don’t have to do anything at all. That is, by default, the instructions in a program are executed sequentially. However, in serious programming situations, seldom do we want the instructions to be executed sequentially. Many a time, we want a set of instructions to be executed in one situation, and an entirely different set of instructions to be executed in another situation. This kind of situation is dealt with in C programs using a decision control instruction. As mentioned earlier, a decision control instruction can be implemented in C using: (a) The if statement (b) The if-else statement (c) The conditional operators Now let us learn each of these and their variations in turn. The if Statement C uses the keyword if to implement the decision control instruction. The general form of if statement looks like this: if ( this condition is true ) execute this statement ; Chapter 3: Decision Control Instruction 41 The keyword if tells the compiler that what follows is a decision control instruction. The condition following the keyword if is always enclosed within a pair of parentheses. If the condition, whatever it is, is true, then the statement is executed. If the condition is not true, then the statement is not executed; instead the program skips past it. But how do we express the condition itself in C? And how do we evaluate its truth or falsity? As a general rule, we express a condition using C’s ‘relational’ operators. The relational operators allow us to compare two values to see whether they are equal to each other, unequal, or whether one is greater than the other. Figure 3.1 shows how they look and how they are evaluated in C. this expression is true if x == y x is equal to y x != y x is not equal to y xy x is greater than y x = y x is greater than or equal to y Figure 3.1 The relational operators should be familiar to you except for the equality operator == and the inequality operator !=. Note that = is used for assignment, whereas, == is used for comparison of two quantities. Here is a simple program that demonstrates the use of if and the relational operators. # include int main( ) { int num ; printf ( "Enter a number less than 10 " ) ; scanf ( "%d", &num ) ; if ( num < 10 ) printf ( "What an obedient servant you are !\n" ) ; 42 Let Us C return 0 ; } On execution of this program, if you type a number less than 10, you get a message on the screen through printf( ). If you type some other number the program doesn’t do anything. The flowchart given in Figure 3.2 would help you understand the flow of control in the program. START PRINT Enter a num less than 10 INPUT num No is Yes num < 10 PRINT What an obedient servant you are ! STOP Figure 3.2 To make you comfortable with the decision control instruction, one more example has been given below. Study it carefully before reading further. To help you understand it easily, the program is accompanied by an appropriate flowchart shown in Figure 3.3. Example 3.1: While purchasing certain items, a discount of 10% is offered if the quantity purchased is more than 1000. If quantity and price per item are input through the keyboard, write a program to calculate the total expenses. Chapter 3: Decision Control Instruction 43 START dis = 0 INPUT qty, rate No is Yes qty > 1000 dis = 10 tot = qty * rate – qty * rate * dis / 100 PRINT tot STOP Figure 3.3 # include int main( ) { int qty, dis = 0 ; float rate, tot ; printf ( "Enter quantity and rate " ) ; scanf ( "%d %f", &qty, &rate) ; if ( qty > 1000 ) dis = 10 ; tot = ( qty * rate ) - ( qty * rate * dis / 100 ) ; printf ( "Total expenses = Rs. %f\n", tot ) ; 44 Let Us C return 0 ; } Here is some sample interaction with the program. Enter quantity and rate 1200 15.50 Total expenses = Rs. 16740.000000 Enter quantity and rate 200 15.50 Total expenses = Rs. 3100.000000 In the first run of the program, the condition evaluates to true, as 1200 (value of qty) is greater than 1000. Therefore, the variable dis, which was earlier set to 0, now gets a new value 10. Using this new value, total expenses are calculated and printed. In the second run, the condition evaluates to false, as 200 (the value of qty) isn’t greater than 1000. Thus, dis, which is earlier set to 0, remains 0, and hence the expression after the minus sign evaluates to zero, thereby offering no discount. Is the statement dis = 0 necessary? The answer is yes, since in C, a variable, if not specifically initialized, contains some unpredictable value (garbage value). The Real Thing We mentioned earlier that the general form of the if statement is as follows: if ( condition ) statement ; Here the expression can be any valid expression including a relational expression. We can even use arithmetic expressions in the if statement. For example all the following if statements are valid. if ( 3 + 2 % 5 ) printf ( "This works" ) ; if ( a = 10 ) printf ( "Even this works" ) ; if ( -5 ) Chapter 3: Decision Control Instruction 45 printf ( "Surprisingly even this works" ) ; Note that in C a non-zero value is considered to be true, whereas a 0 is considered to be false. In the first if, the expression evaluates to 5 and since 5 is non-zero it is considered to be true. Hence the printf( ) gets executed. In the second if, 10 gets assigned to a so the if is now reduced to if ( a ) or if ( 10 ). Since 10 is non-zero, it is true hence again printf( ) goes to work. In the third if, -5 is a non-zero number, hence true. So again printf( ) goes to work. In place of -5 even if a float like 3.14 were used it would be considered to be true. So the issue is not whether the number is integer or float, or whether it is positive or negative. Issue is whether it is zero or non-zero. Multiple Statements within if It may so happen that in a program we want more than one statement to be executed if the expression following if is satisfied. If such multiple statements are to be executed, then they must be placed within a pair of braces, as illustrated in the following example: Example 3.2: The current year and the year in which the employee joined the organization are entered through the keyboard. If the number of years for which the employee has served the organization is greater than 3, then a bonus of Rs. 2500/- is given to the employee. If the years of service are not greater than 3, then the program should do nothing. # include int main( ) { int bonus, cy, yoj, yos ; printf ( "Enter current year and year of joining " ) ; scanf ( "%d %d", &cy, &yoj ) ; yos = cy - yoj ; if ( yos > 3 ) { 46 Let Us C bonus = 2500 ; printf ( "Bonus = Rs. %d\n", bonus ) ; } return 0 ; } Observe that here the two statements to be executed on satisfaction of the condition have been enclosed within a pair of braces. If a pair of braces is not used, then the C compiler assumes that the programmer wants only the immediately next statement after the if to be executed on satisfaction of the condition. In other words, we can say that the default scope of the if statement is the immediately next statement after it. Figure 3.4 would help you understand the flow of control in the program. START INPUT cy, yoj yos = cy - yoj No is Yes yos > 3 bonus = 2500 PRINT bonus STOP Figure 3.4 Chapter 3: Decision Control Instruction 47 The if-else Statement The if statement by itself will execute a single statement, or a group of statements, when the expression following if evaluates to true. It does nothing when the expression evaluates to false. Can we execute one group of statements if the expression evaluates to true and another group of statements if the expression evaluates to false? Of course! This is what is the purpose of the else statement that is demonstrated in the following example: Example 3.3: In a company an employee is paid as under: If his basic salary is less than Rs. 1500, then HRA = 10% of basic salary and DA = 90% of basic salary. If his salary is either equal to or above Rs. 1500, then HRA = Rs. 500 and DA = 98% of basic salary. If the employee's salary is input through the keyboard write a program to find his gross salary. # include int main( ) { float bs, gs, da, hra ; printf ( "Enter basic salary " ) ; scanf ( "%f", &bs ) ; if ( bs < 1500 ) { hra = bs * 10 / 100 ; da = bs * 90 / 100 ; } else { hra = 500 ; da = bs * 98 / 100 ; } gs = bs + hra + da ; printf ( "gross salary = Rs. %f\n", gs ) ; return 0 ; } 48 Let Us C Figure 3.5 would help you understand the flow of control in the program. START INPUT bs No is Yes bs < 1500 hra = 500 hra = bs * 10 / 100 da = bs * 98 / 100 da = bs * 90 / 100 gs = bs + hra + da PRINT gs STOP Figure 3.5 A few points worth noting about the program... (a) The group of statements after the if upto and not including the else is called an ‘if block’. Similarly, the statements after the else form the ‘else block’. (b) Notice that the else is written exactly below the if. The statements in the if block and those in the else block have been indented to the right. This formatting convention is followed throughout the book to enable you to understand the working of the program better. (c) Had there been only one statement to be executed in the if block and only one statement in the else block we could have dropped the pair of braces. Chapter 3: Decision Control Instruction 49 (d) As with the if statement, the default scope of else is also the statement immediately after the else. To override this default scope, a pair of braces, as shown in the above example, must be used. Nested if-elses It is perfectly alright if we write an entire if-else construct within either the body of the if statement or the body of an else statement. This is called ‘nesting’of ifs. This is shown in the following program: # include int main( ) { int i ; printf ( "Enter either 1 or 2 " ) ; scanf ( "%d", &i ) ; if ( i == 1 ) printf ( "You would go to heaven !\n" ) ; else { if ( i == 2 ) printf ( "Hell was created with you in mind\n" ) ; else printf ( "How about mother earth !\n" ) ; } return 0 ; } Note that the second if-else construct is nested in the first else statement. If the condition in the first if statement is false, then the condition in the second if statement is checked. If it is false as well, then the final else statement is executed. You can see in the program how each time a if-else construct is nested within another if-else construct, it is also indented to add clarity to the program. Inculcate this habit of indentation; otherwise, you would end up writing programs which nobody (you included) can understand easily at a later date. Note that whether we indent or do not indent the 50 Let Us C program, it doesn’t alter the flow of execution of instructions in the program. In the above program, an if-else occurs within the ‘else block’ of the first if statement. Similarly, in some other program, an if-else may occur in the ‘if block’ as well. There is no limit on how deeply the ifs and the elses can be nested. Forms of if The if statement can take any of the following forms: (a) if ( condition ) do this ; (b) if ( condition ) { do this ; and this ; } (c) if ( condition ) do this ; else do this ; (d) if ( condition ) { do this ; and this ; } else { do this ; and this ; } (e) if ( condition ) { if ( condition ) do this ; else { do this ; Chapter 3: Decision Control Instruction 51 and this ; } } else do this ; (f) if ( condition ) do this ; else { if ( condition ) do this ; else { do this ; and this ; } } Summary (a) There are three ways for taking decisions in a program. First way is to use the if-else statement, second way is to use the conditional operators and third way is to use the switch statement. (b) The condition associated with an if statement is built using relational operators , =, == and !=. (c) The default scope of if statement is only the next statement. So, to execute more than one statement they must be written in a pair of braces. (d) An ‘if block’ need not always be associated with an ‘else block’. However, an ‘else block’ must always be associated with an if. (e) An if-else statement can be nested inside another if-else statement. Exercise [A] What will be the output of the following programs: (a) # include int main( ) { 52 Let Us C int a = 300, b, c ; if ( a >= 400 ) b = 300 ; c = 200 ; printf ( "%d %d\n", b, c ) ; return 0 ; } (b) # include int main( ) { int a = 500, b, c ; if ( a >= 400 ) b = 300 ; c = 200 ; printf ( "%d %d\n", b, c ) ; return 0 ; } (c) # include int main( ) { int x = 10, y = 20 ; if ( x == y ) ; printf ( "%d %d\n", x, y ) ; return 0 ; } (d) # include int main( ) { int x = 3 ; float y = 3.0 ; if ( x == y ) printf ( "x and y are equal\n" ) ; else printf ( "x and y are not equal\n" ) ; return 0 ; } (e) # include int main( ) { Chapter 3: Decision Control Instruction 53 int x = 3, y, z ; y = x = 10 ; z = x < 10 ; printf ( "x = %d y = %d z = %d\n", x, y, z ) ; return 0 ; } (f) # include int main( ) { int i = 65 ; char j = ’A’ ; if ( i == j ) printf ( "C is WOW\n" ) ; else printf ( "C is a head