Lesson #8. Structures Linked Lists Command Line Arguments

Similar documents
C BOOTCAMP DAY 2. CS3600, Northeastern University. Alan Mislove. Slides adapted from Anandha Gopalan s CS132 course at Univ.

Chapter 6. Data Structure. /* start contains the address of the first node */ start = &elephant1; print_elephants( start ); return EXIT_SUCCESS;

Programming in C. Pointers and Arrays

Floating-point lab deadline moved until Wednesday Today: characters, strings, scanf Characters, strings, scanf questions clicker questions

High-performance computing and programming Intro to C on Unix/Linux. Uppsala universitet

Kurt Schmidt. October 30, 2018

Why arrays? To group distinct variables of the same type under a single name.

Lab Exam 1 D [1 mark] Give an example of a sample input which would make the function

EL2310 Scientific Programming

CMSC 313 COMPUTER ORGANIZATION & ASSEMBLY LANGUAGE PROGRAMMING PREVIEW SLIDES 14, SPRING 2013

CS113: Lecture 5. Topics: Pointers. Pointers and Activation Records

CMSC 313 COMPUTER ORGANIZATION & ASSEMBLY LANGUAGE PROGRAMMING LECTURE 13, FALL 2012

Linked-List Basic Examples. A linked-list is Linear collection of self-referential class objects, called nodes Connected by pointer links

High Performance Programming Programming in C part 1

Memory. What is memory? How is memory organized? Storage for variables, data, code etc. Text (Code) Data (Constants) BSS (Global and static variables)

C programming basics T3-1 -

CSE 230 Intermediate Programming in C and C++ Arrays, Pointers and Strings

Arrays and Pointers. CSE 2031 Fall November 11, 2013

Arrays and Pointers. Arrays. Arrays: Example. Arrays: Definition and Access. Arrays Stored in Memory. Initialization. EECS 2031 Fall 2014.

CSCI 171 Chapter Outlines

Subject: Fundamental of Computer Programming 2068

BIL 104E Introduction to Scientific and Engineering Computing. Lecture 14

Intermediate Programming, Spring 2017*

C programming for beginners

CSCI-243 Exam 1 Review February 22, 2015 Presented by the RIT Computer Science Community

From Java to C. Thanks to Randal E. Bryant and David R. O'Hallaron (Carnegie-Mellon University) for providing the basis for these slides

CSE 333 Lecture 7 - final C details

Compiling and Running a C Program in Unix

Recitation 2/18/2012

ECE 264 Exam 2. 6:30-7:30PM, March 9, You must sign here. Otherwise you will receive a 1-point penalty.

mith College Computer Science CSC352 Week #7 Spring 2017 Introduction to C Dominique Thiébaut

LSN 3 C Concepts for OS Programming

EECE.2160: ECE Application Programming Fall 2017 Exam 3 December 16, 2017

Dynamic memory allocation

A Fast Review of C Essentials Part I

Contents. A Review of C language. Visual C Visual C++ 6.0

EL2310 Scientific Programming

gcc hello.c a.out Hello, world gcc -o hello hello.c hello Hello, world

EL2310 Scientific Programming LAB2: C lab session. Patric Jensfelt, Andrzej Pronobis

CSci 4061 Introduction to Operating Systems. Programs in C/Unix

Program Organization and Comments

Tin học cơ sở 4$ Structures!

CS113: Lecture 7. Topics: The C Preprocessor. I/O, Streams, Files

Pointers (part 1) What are pointers? EECS We have seen pointers before. scanf( %f, &inches );! 25 September 2017

Dynamic memory allocation (malloc)

CSE 374 Programming Concepts & Tools

ch = argv[i][++j]; /* why does ++j but j++ does not? */

These problems are provided to you as a guide for practice. The questions cover important concepts covered in class.

CS 326 Operating Systems C Programming. Greg Benson Department of Computer Science University of San Francisco

Arrays and Pointers (part 2) Be extra careful with pointers!

In the case of the dynamic array, the space must be deallocated when the program is finished with it. free(x);

PROGRAMMAZIONE I A.A. 2017/2018

Arrays and Pointers (part 2) Be extra careful with pointers!

CS 261 Fall Mike Lam, Professor. Structs and I/O

Lecture 12 CSE July Today we ll cover the things that you still don t know that you need to know in order to do the assignment.

C Programming Basics II

CS 241 Data Organization Pointers and Arrays

Fundamentals of Programming. Lecture 12: C Structures, Unions, Bit Manipulations and Enumerations

CS16 Midterm Exam 2 E02, 10W, Phill Conrad, UC Santa Barbara Tuesday, 03/02/2010

Writing to and reading from files

Dynamic Memory Allocation

Pointers and File Handling

CS 0449 Sample Midterm

Question 1. Part (a) [2 marks] error: assignment of read-only variable x ( x = 20 tries to modify a constant) Part (b) [1 mark]

JTSK Programming in C II C-Lab II. Lecture 3 & 4

CS 237 Meeting 19 10/24/12

Self-referential Structures and Linked List. Programming and Data Structure 1

Understanding Pointers

C Language: Review. INFO High Performance Scientific Computing. 26 septembre 2017

Pointers. Part VI. 1) Introduction. 2) Declaring Pointer Variables. 3) Using Pointers. 4) Pointer Arithmetic. 5) Pointers and Arrays

Lectures 5-6: Introduction to C

Array Initialization

EM108 Software Development for Engineers

COP Programming Concepts Spring 1999 CLOSED BOOK Exam #1 100 Points NAME

Outline. Lecture 1 C primer What we will cover. If-statements and blocks in Python and C. Operators in Python and C

are all acceptable. With the right compiler flags, Java/C++ style comments are also acceptable.

Organization of a file

Ricardo Rocha. Department of Computer Science Faculty of Sciences University of Porto

Announcements. Strings and Pointers. Strings. Initializing Strings. Character I/O. Lab 4. Quiz. July 18, Special character arrays

ECE264 Spring 2013 Final Exam, April 30, 2013

(13-2) Dynamic Data Structures I H&K Chapter 13. Instructor - Andrew S. O Fallon CptS 121 (November 17, 2017) Washington State University

BLM2031 Structured Programming. Zeyneb KURT

CS 261 Data Structures. Introduction to C Programming

upper and lower case English letters: A-Z and a-z digits: 0-9 common punctuation symbols special non-printing characters: e.g newline and space.

CMSC 313 COMPUTER ORGANIZATION & ASSEMBLY LANGUAGE PROGRAMMING LECTURE 14, FALL 2012

CS16 Midterm Exam 1 E01, 10S, Phill Conrad, UC Santa Barbara Wednesday, 04/21/2010, 1pm-1:50pm

United States Naval Academy Electrical and Computer Engineering Department EC310-6 Week Midterm Spring AY2017

Lecture 04 Introduction to pointers

Arrays and Pointers in C. Alan L. Cox

CS 237 Meeting 18 10/22/12

C & Data Structures syllabus

Arrays. An array is a collection of several elements of the same type. An array variable is declared as array name[size]

Outline. Computer Memory Structure Addressing Concept Introduction to Pointer Pointer Manipulation Summary

20 Dynamic allocation of memory: malloc and calloc

CS1003: Intro to CS, Summer 2008

A3-R3: PROGRAMMING AND PROBLEM SOLVING THROUGH 'C' LANGUAGE

Subject: PROBLEM SOLVING THROUGH C Time: 3 Hours Max. Marks: 100

Review Topics. Final Exam Review Slides

CS201 - Lecture 1 The C Programming Language

CSE 303 Midterm Exam

Transcription:

Lesson #8 Structures Linked Lists Command Line Arguments

Introduction to Structures Suppose we want to represent an atomic element. It contains multiple features that are of different types. So a single variable or even an array are inadequate to represent it. The solution is a structure that allows us to aggregate variables of different types under one logical name.

Creating a new type By creating a structure, we create a new type of data. We know about int, double and char, let's create a new type called struct element. struct element { char name [10]; char symbol [5]; double atom_weight; int atom_number; }

Creating a new type The declaration of new types usually happens before the main program, just after the preprocessor directives so that the new types are known in all the functions of the program. Inside a function though, it is necessary, as for the other usual types to declare variables.

Declaring variables int a, b[3]; struct element e1, e2, e3, e[50]; are all valid declarations To fill the values into the components, we use the. (dot) operator. Components (dotted variables) behave exactly like regular variables. strcpy (e1.name, "hydrogen"); strcpy (e1.symbol, "H"); e1.atom_number = 1; e1.atom_weight = 1.00794;

The typedef Construct The typedef construct provides the possibility to define synonyms to built-in or user-defined data types. For instance, by having typedef int age; defined after the preprocessor directives, I create a new type age that is exactly like an integer. So I will be able to declare a variable age x; where x will be in reality an integer. I could also use typedef struct element ele; and for now on, we would be able to declare variables with ele only: ele e5;

typedef + struct Quite often we combine the structure definition with the user-defined data type alias associated with it. typedef struct element { char name [10]; char symbol [5]; double atom_weight; int atom_number; }ele;

Placing values in structured variables 1. We can declare and initialize and the same time: ele e6 = {"hydrogen", "H", 1.00794, 1}; The order must reflect the structure definition. 2. We can fill the variables by assignment (see three slides back). 3. We can ask the user or read from a file.ex: scanf ("%lf", &e2.atom_weight); fscanf (in, "%s", e2.symbol); gets (e2.name); fgets (e3.name, sizeof(e3.name), in);

Structures and functions When a structured variable is passed as an input to a function, all of its component values are copied into the components of the function's corresponding formal parameters. Unlike arrays that require pointers to be passed to functions, structures can be passed by value. Of course you can use pointers also if you need multiple results, like we have seen before.

Structures and functions Let's have a function that prints out a report on the element. void print_element (ele e) { printf ("Name: %s\n", e.name); printf ("Symbol: %s\n", e.symbol); printf ("Weight: %.1lf\n", e.atom_weight); printf ("Atomic Number: %d\n", e.atom_number); } In the main it would be called like print_element (e1);

Structures and functions Let's have a function that compares two elements by comparing the two atomic numbers. It returns true if they are identical. int compare_elements (ele e1, ele e2) { int equal; equal = e1.atom_number == e2.atom_number; return (equal); } In the main it would be called like compare_elements (e1, e[4]);

Structures and functions Let's have a function that fills a structure from the keyboard and then returns it back to the main. ele read_element (void) { ele e; printf ("Enter the name, symbol, atomic weight and atomic number separated by spaces: "); scanf ("%s%s%lf%d",e.name, e.symbol, &e.atom_weight, &e.atom_number); return (e); } In the main it would be called like e1 = read_element( );

Structures, functions, and pointers Let's have a function that does exactly the same thing as the previous one except that it will read two elements and use a pointer parameter for the extra "fake result." ele read_element (ele* eptr) Before going further we need to understand the order of pointer operations. If a pointer variable of type ele is called eptr then to fill its atomic number component, for example, we would be tempted to use scanf ( %d, &*eptr.atom_number); (notice that eptr is a pointer, the element itself is *eptr). That would be a mistake, however, as we will see on the next slide.

Structures, functions, and pointers The scanf statement on the previous slide is not correct because the dot (.) operator is always processed before the star (*) operator. That would result in accessing the atomic number of a pointer (eptr.atom_number) instead of the atomic number of an element. Therefore we need to use scanf ("%d", &(*eptr).atom_number); instead. There is a short cut in C for (*eptr)., it is eptr->, therefore, we can use scanf ("%d", &eptr->atom_number); as an alternative.

Structures and functions Now let's see the function: ele read_element2 (ele* eptr) { ele e; printf ("Enter the name, symbol, atomic weight and number separated by spaces: "); scanf ("%s%s%lf%d",e.name, e.symbol, &e.atom_weight, &e.atom_number); } printf ("Enter the name, symbol, atomic weight and number separated by spaces: "); scanf ("%s%s%lf%d",eptr->name, eptr->symbol, &eptr->atom_weight, &eptr->atom_number); return (e); In the main it would be called like e1 = read_element2(&e2);

Linked Lists A list is a finite sequence, with order taken into account. A linked list consists of ordered nodes like N1, N2, N3,...Nn together with the address of the first node N1. Each node has several fields, one of which is an address field.

Linked Lists The address field of N1 contains the address of N2, the address field of N2, the address of N3, and so on... The address field of Nn is a NULL address. In the following example, the variable start contains the address of the first node. Each node has two fields, the first contains an integer indicating the position of the node in the list, the second field contains the address of the next node. start 1 2 3

Example of a linked list To declare a linked list, we need to declare a structure where the last component will be a pointer to a variable of the structured type itself. Let's define a list of elephants. Notice that the next component is a pointer to a struct ELEPHANT. The other component store the animal's name and weight. typedef struct ELEPHANT { char name [10]; int weight; struct ELEPHANT* next; }elephant;

Example of a linked list Next, let's declare variables to store our list nodes and the start of the list. /* the nodes - ready to contain 3 elephant names */ elephant eleph1, eleph2, eleph3; /* the start variable - pointer to an elephant node */ elephant* start;

Example of a linked list Let's fill now the elephants' names and weight: strcpy (eleph1.name, "Edna"); strcpy (eleph2.name, "Elmer"); strcpy (eleph3.name, "Eloise"); eleph1.weight = 4500; eleph2.weight = 6000; eleph3.weight = 4750; start eleph1 eleph2 eleph3 "Edna" 4500 "Elmer" 6000 "Eloise" 4500

Example of a linked list Next, let's link all these elephants together and build the linked list. start = &eleph1; eleph1.next = &eleph2; eleph2.next = &eleph3; eleph3.next = NULL; start eleph1 eleph2 eleph3 "Edna" 4500 "Elmer" 6000 "Eloise" 4500

Example of a linked list Finally, let's use our linked list. We will print out the names of all the elephants in it. We will use a a variable p (elephant* p;) as a travelling variable through the list (not unlike the i variable we used to travel though an array). count = 1; /* to count the elephants */ /* the list loop */ for (p = start; p!= NULL; p = p->next) { printf ("Elephant #%d is %s.\n", count, p->name); count = count + 1; }

Linked Lists and functions Linked lists can of course be sent to functions. Let's have a function that accepts a list of elephants and returns 1 if an elephant weighing more than 5000kg can be found in the list. int find5000 (elephant* ptr) { int found = 0; for (p = start; p!= NULL; p = p->next) if (ptr->weight > 5000) found = 1; return (found); } find5000 (start); would return 1.

Lists and dynamic allocation So far we knew in advance the number of elephants in the list. But what if we didn't? Let's now have a function named get_elephants that will fill the list from user input. Since we do not know how many elephants the user will enter, we will use dynamic allocation for every node. In the main program, in that case, only the start variable will be declared and all the nodes will be dynamically allocated and filled with values in the function. The function will be called this way: start = get_elephants ( );

Lists and dynamic allocation elephant* get_elephants (void) { elephant *current, *first; int response; /* create first node */ first = (elephant*)calloc(1,sizeof(elephant)); current = first; printf("elephant name? "); scanf ("%s", current->name); printf("elephant weight? "); scanf ("%d", &current->weight); printf("\nadd another? (y=1/n=0)"); scanf ("%d", &response) cont...

Lists and dynamic allocation while (response) /*while response is 1 (yes) */ { /* allocate node and change current pointer */ current->next = (elephant *)calloc (1,sizeof(elephant)); current = current->next; /* fill node */ printf("elephant name? "); scanf ("%s", current->name); printf("elephant weight? "); scanf ("%d", &current->weight); } printf("\nadd another? (y=1/n=0)"); scanf ("%d", &response); cont...

Lists and dynamic allocation } current->next = NULL; return (first); start Now can you think how to: Add a node at the end of a linked list? Add a node at the beginning? Insert a node between two nodes? Delete a node? eleph1 eleph2 eleph3 "Edna" 4500 "Elmer" 6000 "Eloise" 4500 See ihypress.net/programming/c/10.php for more examples.

int main (void)? All proper C main programs begin with int main (void). A main program is actually a function that takes arguments from the operating system and returns an integer (0). So far, we did not use any arguments in the main program because we did not send anything to the program from the operating system. That is why we used void as the sole argument for the main function. If we want to send information from the operating system to the program, we need to have commandline arguments.

Command-line arguments The main program can have two commandline arguments: 1. argc: an integer, representing the number of arguments (always at least 1). 2. argv: an array of strings containing the arguments themselves. All arguments coming from the operating system are strings. So instead of int main (void), the program header becomes int main (int argc, char* argv[ ])

Using command-line arguments #include <stdio.h> int main (int argc, char* argv[]) { } int i; /* argument 0 identifies the program */ printf ("%s\n",argv[0]); /* the other arguments */ for (i = 1; i < argc; ++i) printf("%s ", argv[i]); return (0);

The Command Line Now that we have seen how command-line arguments are processed by C programs, let's see now how to send the command lines. Command lines are not written in C, they are direct text commands to the operating system. To access the OS commands in Windows XP or Vista, we use Start > Run > cmd

The Command Line Better still, we can use the command mode directly from Quincy. Tools > Options > Run > Prompt each time... Then, when we run the program, we will be prompted for the command line. Let's run the program from two slides back. argv[0] argv[1] to argv[5]

Numerical arguments / atoi() What if we needed to send numerical values into the command line? Since command line arguments are strings, we will need to convert those strings to numbers. For that we will need two new functions (need to include stdlib.h). The atoi() function converts a string into an integer, and returns that integer. The string must of course some sort of number, and atoi() will stop reading from the string as soon as a nonnumerical character has been read (+ and are considered numerical at the beginning of the string). atoi("45.78"); will return the integer 45.

Numerical arguments / atof() The function atof() converts a string into a double, then returns that value. The string must start with a valid number, but can be terminated with any nonnumerical character, other than E or e (+ and are considered numerical at the beginning of the string). atof( "42.57" ); will return the double 42.57. atof( "45.3e3" ); will return the double 45300.0. See ihypress.net/programming/c/12.php for more examples.

The End