ECE551 Midterm Version 1

Similar documents
ECE551 Midterm Version 2

ECE551 Midterm. There are 7 questions, with the point values as shown below. You have 75 minutes with a total of 75 points. Pace yourself accordingly.

ECE551 Midterm Version 1

ECE 551D Spring 2018 Midterm Exam

ECE 551D Spring 2018 Midterm Exam

Signature: ECE 551 Midterm Exam

C mini reference. 5 Binary numbers 12

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

Procedural Programming

ECE264 Fall 2013 Exam 3, November 20, 2013

Lecture 05 Pointers ctd..

MARKS: Q1 /20 /15 /15 /15 / 5 /30 TOTAL: /100

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

Procedural Programming & Fundamentals of Programming

Pointers, Arrays, and Strings. CS449 Spring 2016

CSE 333 Midterm Exam Sample Solution 7/28/14

Characters and Strings

Midterm Examination # 2 Wednesday, March 18, Duration of examination: 75 minutes STUDENT NAME: STUDENT ID NUMBER:

Student Number: Instructor: Reid Section: L5101 (6:10-7:00pm)

Student Number: Instructor: Reid Section: L0101 (10:10-11:00am)

o Code, executable, and process o Main memory vs. virtual memory

Dynamic memory. EECS 211 Winter 2019

CSC209H Lecture 3. Dan Zingaro. January 21, 2015

ECE264 Spring 2014 Exam 2, March 11, 2014

ESC101N: Fundamentals of Computing End-sem st semester

CSCI 6610: Intermediate Programming / C Chapter 12 Strings

8. Characters, Strings and Files

This code has a bug that allows a hacker to take control of its execution and run evilfunc().

ECE264 Spring 2013 Exam 1, February 14, 2013

CSC209H Lecture 4. Dan Zingaro. January 28, 2015

ECE264 Spring 2013 Final Exam, April 30, 2013

Lecture07: Strings, Variable Scope, Memory Model 4/8/2013

Main Program. C Programming Notes. #include <stdio.h> main() { printf( Hello ); } Comments: /* comment */ //comment. Dr. Karne Towson University

Lecture 8 Dynamic Memory Allocation

TI2725-C, C programming lab, course

Course organization. Course introduction ( Week 1)

CSCI 171 Chapter Outlines

File IO and command line input CSE 2451

C programming basics T3-1 -

Midterm Examination # 2 Wednesday, March 19, Duration of examination: 75 minutes STUDENT NAME: STUDENT ID NUMBER:

Student Number: Instructor: Reid Section: L0201 (12:10-1:00pm)

211: Computer Architecture Summer 2016

Kurt Schmidt. October 30, 2018

Carnegie Mellon. C Boot Camp. September 30, 2018

The University of Calgary. ENCM 339 Programming Fundamentals Fall 2016

Understanding Pointers

Q1: /20 Q2: /30 Q3: /24 Q4: /26. Total: /100

Midterm Review. What makes a file executable? Dr. Jack Lange 2/10/16. In UNIX: Everything is a file

SYSTEM AND LIBRARY CALLS. UNIX Programming 2015 Fall by Euiseong Seo

Quiz 0 Review Session. October 13th, 2014

Reading Assignment. Strings. K.N. King Chapter 13. K.N. King Sections 23.4, Supplementary reading. Harbison & Steele Chapter 12, 13, 14

Getting Started. Project 1

Memory Allocation in C C Programming and Software Tools. N.C. State Department of Computer Science

CSE 333 Midterm Exam July 24, Name UW ID#

Dynamic Memory. Dynamic Memory Allocation Strings. September 18, 2017 Hassan Khosravi / Geoffrey Tien 1

Fundamentals of Programming & Procedural Programming

SOFTWARE Ph.D. Qualifying Exam Fall 2017

Carnegie Mellon. C Boot Camp. Oct 6th, Jack Biggs Raghav Goyal Nikhil Jog

Memory Management. CSC215 Lecture

Creating a String Data Type in C

Actually, C provides another type of variable which allows us to do just that. These are called dynamic variables.

CS1003: Intro to CS, Summer 2008

PRINCIPLES OF OPERATING SYSTEMS

20 Dynamic allocation of memory: malloc and calloc

Jacobs University Bremen February 7 th, 2017 Dr. Kinga Lipskoch. Practice Sheet. First Name:... Last Name:... Matriculation Number:...

Q1: /8 Q2: /30 Q3: /30 Q4: /32. Total: /100

CSci 4061 Introduction to Operating Systems. Input/Output: High-level

Character Strings. String-copy Example

CS201- Introduction to Programming Current Quizzes

C: Pointers, Arrays, and strings. Department of Computer Science College of Engineering Boise State University. August 25, /36

Midterm Exam Nov 8th, COMS W3157 Advanced Programming Columbia University Fall Instructor: Jae Woo Lee.

ECE264 Fall 2013 Exam 2, October 24, 2013

Winter 2017 March 2, 2017 CS107 2 nd Midterm Examination

Mid-term Exam. Fall Semester 2017 KAIST EE209 Programming Structures for Electrical Engineering. Name: Student ID:

PLEASE HAND IN UNIVERSITY OF TORONTO Faculty of Arts and Science

a) Write the signed (two s complement) binary number in decimal: b) Write the unsigned binary number in hexadecimal:

CSCI-1200 Data Structures Spring 2016 Lecture 6 Pointers & Dynamic Memory

cc -o build/test_translate build/test_translate.o b... $

Computer Programming: Skills & Concepts (CP) Strings

Dynamic memory allocation

File Access. FILE * fopen(const char *name, const char * mode);

CSCI 2212: Intermediate Programming / C Storage Class and Dynamic Allocation

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

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

Mid-term Exam. Fall Semester 2017 KAIST EE209 Programming Structures for Electrical Engineering. Name: Student ID:

Computer Organization & Systems Exam I Example Questions

The assignment requires solving a matrix access problem using only pointers to access the array elements, and introduces the use of struct data types.

Introduction to C Language (M3-R )

CSE 333 Midterm Exam July 24, 2017 Sample Solution

Quiz 0 Answer Key. Answers other than the below may be possible. Multiple Choice. 0. a 1. a 2. b 3. c 4. b 5. d. True or False.

CSE 303 Midterm Exam

Strings. Arrays of characters. Pallab Dasgupta Professor, Dept. of Computer Sc & Engg INDIAN INSTITUTE OF TECHNOLOGY

Both parts center on the concept of a "mesa", and make use of the following data type:

CSC 209H1 S 2012 Midterm Test Duration 50 minutes Aids allowed: none. Student Number: # 1: / 6

ECE264 Fall 2013 Exam 1, September 24, 2013

Quick review of previous lecture Ch6 Structure Ch7 I/O. EECS2031 Software Tools. C - Structures, Unions, Enums & Typedef (K&R Ch.

Carnegie Mellon. C Boot Camp. June 15, Fernando Yinglan Zach Kevin

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

CSC209H1S Day Midterm Solutions Winter 2010

Programs in memory. The layout of memory is roughly:

Transcription:

Name: ECE551 Midterm Version 1 NetID: There are 7 questions, with the point values as shown below. You have 75 minutes with a total of 75 points. Pace yourself accordingly. This exam must be individual work. You may not collaborate with your fellow students. You may not use any external resources. I certify that the work shown on this exam is my own work, and that I have neither given nor received improper assistance of any form in the completion of this work. Signature: # Question Points Earned Points Possible 1 Concepts 7 2 Reading Code 4 3 Fixing Valgrind Errors 10 4 Coding 1: Recursion 10 5 Coding 2: Strings 14 6 Coding 3: Arrays 12 7 Coding 4: A Program 18 Total 75 Percent 100 The next two pages contains some reference (an abbreviated version of the man pages) for common, useful library functions. 1

char * strchr(const char *s, int c); The strchr function locates the first occurrence of c (converted to a char) in the string pointed to by s. It returns a pointer to the located character, or NULL if the character does not appear in the string. char * strdup(const char *s1); The strdup function allocates sufficient memory for a copy of the string s1, does the copy, and returns a pointer to it. The pointer may subsequently be used as an argument to the function free. If insufficient memory is available, NULL is returned. size_t strlen(const char *s); The strlen function computes the length of the string s and returns the number of characters that precede the terminating \0 character. int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n); The strcmp and strncmp functions lexicographically compare the null-terminated strings s1 and s2. The strncmp function compares not more than n characters. Because strncmp is designed for comparing strings rather than binary data, characters that appear after a \0 character are not compared. These functions return an integer greater than, equal to, or less than 0, according as the string s1 is greater than, equal to, or less than the string s2. The comparison is done using unsigned characters. char *strstr(const char *s1, const char *s2); The strstr function locates the first occurrence of the null-terminated string s2 in the null-terminated string s1. If s2 is an empty string, s1 is returned; if s2 occurs nowhere in s1, NULL is returned; otherwise a pointer to the first character of the first occurrence of s2 is returned. void * malloc(size_t size); The malloc function allocates size bytes of memory and returns a pointer to the allocated memory. void * realloc(void *ptr, size_t size); The realloc function creates a new allocation of size bytes, copies as much of the old data pointed to by ptr as will fit to the new allocation, frees the old allocation, and returns a pointer to the allocated memory. If ptr is NULL, realloc is identical to a call to malloc for size bytes. void free(void *ptr); The free function deallocates the memory allocation pointed to by ptr. If ptr is a NULL pointer, no operation is performed. int fgetc(file *stream); The fgetc function obtains the next input character (if present) from the stream pointed at by stream, or EOF if stream is at end-of-file. 2

char * fgets(char * str, int size, FILE * stream); The fgets function reads at most one less than the number of characters specified by size from the given stream and stores them in the string str. Reading stops when a newline character is found, at end-of-file or error. The newline, if any, is retained. If any characters are read and there is no error, a \0 character is appended to end the string. Upon successful completion, it returns a pointer to the string. If end-of-file occurs before any characters are read, it returns NULL. ssize_t getline(char ** linep, size_t * linecapp, FILE * stream); The getdelim() function, delimited by the character delimiter. The getline function reads a line from stream, which is ended by a newline character or end-of-file. If a newline character is read, it is included in the string. The caller may provide a pointer to a malloced buffer for the line in *linep, and the capacity of that buffer in *linecapp. These functions expand the buffer as needed, as if via realloc. If linep points to a NULL pointer, a new buffer will be allocated. In either case, *linep and *linecapp will be updated accordingly. This function returns the number of characters written to the string, excluding the terminating \0 character. The value -1 is returned if an error occurs, or if end-of-file is reached. void * memcpy(void * dst, const void *src, size_t n); The memcpy function copies n bytes from memory area src to memory area dst. 3

Question 1 Concepts [7 pts] For all parts of this question, assume that integers and floats occupy 4 bytes and doubles and pointers occupy 8 bytes. 1. If p is declared as int * p;, and the numerical value of p is 0x8704bc, then what is the numerical value of p+5? (a) 0x8704c1 (b) 0x8704cc (c) 0x8704d0 (d) 0x8704d5 (e) None of the above 2. Suppose I declare a pointer int * const * * q;. The const makes which of the following read only? (a) q (b) *q (c) **q (d) ***q (e) None of the above 3. The fact that you can call qsort to sort an array without seeing the code (or even knowing the algorithm) for qsort is an example of: (a) The Everything is a Number principle (b) Abstraction (c) The Seven Item Limit (d) Top-Down Design (e) None of the above 4. When should you call perror? (a) Anytime you want to print an error message (b) Anytime you want to print an error message longer than 80 characters (c) Anytime you want to print an error message shorter than 80 characters (d) When you want to print an error message that includes a description of the current value of errno. (e) None of the above 4

5. Which of the following accurately describes when a memory leak occurs? (a) When a pointer to the heap is set to NULL without freeing it. (b) When a pointer to the heap goes out of scope without freeing it. (c) When you call malloc, but then later do not free the resulting pointer. (d) When the last pointer to a block is set to point elsewhere or is destroyed. (e) None of the above 6. If you are debugging a program with gdb, and you accidentally step into the function printf, how would you continue execution until this function returns? (a) continue (b) break (c) finish (d) break printf (e) None of the above 7. If you are doing Step 3, and you find it difficult to see a pattern, what should you do? (a) Ask a project lead or instructor to further specify the problem (b) Test your algorithm on a new example (c) Repeat Steps 1 and 2 on different examples (d) Find a source of domain knowledge (e) None of the above 5

Question 2 Reading Code [4 pts] What is the output of the following code? #include <stdio.h> #include <stdlib.h> void f (int v, int * p, int ** q) { v = v % 2; int temp = (v+1) % 2; p[v] = p[temp]; p = q[v]; q[v] = q[temp]; q[temp] = p; int main(void) { int * data[2]; for (int i =0 ; i < 2; i++) { data[i] = malloc(2 * sizeof(*data[i])); for (int j = 0; j < 2; j++) { data[i][j] = i*2+j; f(data[0][0], data[1], data); for (int i =0 ; i < 2; i++) { for (int j = 0; j < 2; j++) { printf("data[%d][%d]=%d\n", i, j,data[i][j]); free(data[i]); return EXIT_SUCCESS; 6

Question 3 Fixing Valgrind Errors [10 pts] A C programmer wrote the following buggy code to read in a file, reverse the order of the lines, and then print the lines in that reversed order. 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) { 5 char * line = NULL; 6 size_t sz = 0; 7 char ** allstrings=null; 8 size_t n =0; 9 while(getline(&line, &sz, stdin)>=0) { 10 allstrings = realloc(allstrings, (n+1)*sizeof(**allstrings)); 11 allstrings[n] = line; 12 n++; 13 14 free(line); 15 for (size_t i = 0; i < n/2; i++) { 16 size_t j = n-i; 17 char * temp = allstrings[i]; 18 allstrings[i] = allstrings[j]; 19 allstrings[j] = temp; 20 21 for (size_t i= 0; i < n; i++) { 22 printf("%s", allstrings[i]); 23 24 free(allstrings); 25 return EXIT_SUCCESS; 26 7

Error 1 The first problem is: Invalid write of size 8 at 0x400711: main (broken.c:11) Address 0x5205140 is 0 bytes inside a block of size 1 alloc d at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4C2FDEF: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4006F5: main (broken.c:10) This problem can be correctly fixed by: A. Changing line 7 to initialize allstrings with an appropriate call to malloc, instead of with NULL. B. Changing the first argument of realloc on line 10 to *allstrings, instead of allstrings. C. Changing the first argument of realloc on line 10 to &allstrings, instead of allstrings. D. Changing the operand of sizeof on line 10 to *allstrings instead of **allstrings. E. None of the above specify what to do instead: Error 2 After correctly fixing the first problem, the next error is: Invalid read of size 8 at 0x4007A2: main (broken.c:18) Address 0x52062e0 is 0 bytes after a block of size 208 alloc d at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4006FD: main (broken.c:10) This problem can be correctly fixed by: A. Changing the loop condition of the for loop on line 15 from i < n/2 to i < n/2-1 B. Changing the initialization of j on line 16 from n-i to n-i+1. C. Changing the initialization of j on line 16 from n-i to n-i-1. D. Adding if (j >= n) {break; between lines 16 and 17. E. None of the above specify what to do instead: 8

Error 3 After correctly fixing the first two problems, the next error is: Invalid read of size 1 at 0x4E88CC0: vfprintf (vfprintf.c:1632) by 0x4E8F898: printf (printf.c:33) by 0x40080D: main (broken.c:22) Address 0x5204040 is 0 bytes inside a block of size 120 free d at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x40074B: main (broken.c:14) Block was alloc d at at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4EA89E7: getdelim (iogetdelim.c:62) by 0x40073A: main (broken.c:9) This problem can be correctly fixed by: A. Removing line 14 (free(line);) B. Changing line 14 to if (n==0) { free(line); C. Inserting line = strdup(""); between lines 12 and 13 D. Inserting line = NULL between lines 12 and 13 E. None of the above specify what to do instead: Error 4 After correctly fixing the first three errors, the code runs, but leaks memory: 3,120 bytes in 26 blocks are definitely lost in loss record 1 of 1 at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4EA89E7: getdelim (iogetdelim.c:62) by 0x400742: main (broken.c:9) This error can be corrected by: A. Inserting free(allstrings[j]); between lines 19 and 20. B. Inserting free(temp); between lines 19 and 20. C. Inserting free(allstrings[i]); between lines 22 and 23. D. Inserting free(allstrings[n]); between line 14 and 15. E. None of the above specify what to do instead: 9

Question 4 Coding 1: Recursion [10 pts] For this problem, you will write a function to sum an array of doubles (where n is the size of the array) using both iteration, and then tail recursion. First, write this using iteration (sumarrayiter), then implement an equivalent function using tail recursion (sumarraytail). For the tail recursive function, you should write a helper in the space indicated. double sumarrayiter(double * tosum, size_t n) { //YOUR CODE GOES HERE:Iterative //Write a helper function here double sumarraytail(double * tosum, size_t n) { //YOUR CODE GOES HERE: Tail Recursive 10

Question 5 Coding 2: Strings [14 pts] For this question, you will implement the strstr function, as it behaves in the C library. You MAY NOT USE ANY C LIBRARY FUNCTIONS to implement this. The strstr function locates the first occurrence of the string s2 in the string s1, and returns a pointer to it. If s2 does not appear in s1, strstr returns NULL. For example, strstr( cabcdec, cd ) would return a pointer to the character at index 3 in cabcdec as that is where the substring cd is found. You may assume that neither s1 nor s2 is NULL. char * strstr(const char *s1, const char *s2) { //YOUR CODE GOES HERE 11

Question 6 Coding 3: Arrays [12 pts] For this problem, you are going to write finddiagonalword, which takes a const char * const * letters, two size_ts, r which specifies how many rows are in letters, and c, which specifies how many columns in letters, and a const char * word. This function finds the location of word in letters on a left-top to rightbottom diagonal. It returns the row and column of the first occurrence that x y z q it finds as a loc_t, as declared below. If word does not occur on a left-top a b c d to right-bottom diagonal, this function returns a loc_t with both values j o b s set to (size_t)-1 (that is, -1 cast as size_t). For example, if letters were the ones shown to the right and word is "aop" then your algorithm would y z p n return row=1 and col=0. If word is jobs, your algorithm would return row=-1 col=-1 since jobs is not found on a diagonal. struct loc_tag { size_t row; size_t col; ; typedef struct loc_tag loc_t; loc_t finddiagonalword(const char * const * letters, size_t r, size_t c, const char * word) { //YOUR CODE GOES HERE 12

Question 7 Coding 4: A Program [18 pts] For this problem, you are going to write a program which takes one command line argument the name of an input file to read reads all the lines in it, and prints each unique line. If an identical line appears twice in the file, your program should print only the first occurrence. For example, given apple banana apple cat Banana b a n a n a banana Your program should print apple banana cat Banana b a n a n a Note that this program only consider strings the same if they are exactly the same (differences in case and spacing matter). For this problem, you may assume: The correct number of command line arguments are given fopen, fclose, malloc, and realloc always succeed. You should write your answer on the next page 13

#include <stdio.h> #include <stdlib.h> #include <string.h> //YOUR CODE GOES HERE 14