CS 2505 Computer Organization I Test 1. Do not start the test until instructed to do so!

Similar documents
Do not start the test until instructed to do so!

CS 2505 Computer Organization I Test 1. Do not start the test until instructed to do so! printed

CS 2505 Computer Organization I Test 1. Do not start the test until instructed to do so! printed

CS 2505 Computer Organization I Test 1. Do not start the test until instructed to do so! printed

CS 2505 Computer Organization I

CS 2505 Computer Organization I

CS 2505 Computer Organization I Test 1. Do not start the test until instructed to do so! printed

CS 2505 Computer Organization I Test 1. Do not start the test until instructed to do so! Solution. printed

Do not start the test until instructed to do so!

Do not start the test until instructed to do so!

Pointer Casts and Data Accesses

Do not start the test until instructed to do so!

gcc o driver std=c99 -Wall driver.c everynth.c

Do not start the test until instructed to do so!

CS 2506 Computer Organization II Test 1. Do not start the test until instructed to do so! printed

Do not start the test until instructed to do so!

CS 2506 Computer Organization II

CS 2505 Computer Organization I Test 1

A function is a named piece of code that performs a specific task. Sometimes functions are called methods, procedures, or subroutines (like in LC-3).

CS 3114 Data Structures and Algorithms READ THIS NOW!

Each line will contain a string ("even" or "odd"), followed by one or more spaces, followed by a nonnegative integer.

CS 2505 Computer Organization I Test 2. Do not start the test until instructed to do so! printed

printf( Please enter another number: ); scanf( %d, &num2);

Lecture 05 I/O statements Printf, Scanf Simple statements, Compound statements

CS 2505 Computer Organization I Test 2. Do not start the test until instructed to do so! printed

CS 2505 Computer Organization I Test 1

CS 2506 Computer Organization II Test 1

Stream Model of I/O. Basic I/O in C

Post Experiment Interview Questions

CS 3114 Data Structures and Algorithms Test 1 READ THIS NOW!

CS 2505 Computer Organization I Test 2. Do not start the test until instructed to do so! printed

CS 2505 Computer Organization I Test 2. Do not start the test until instructed to do so! printed

Solution READ THIS NOW! CS 3114 Data Structures and Algorithms

Creating a String Data Type in C

Solution printed. Do not start the test until instructed to do so! CS 2604 Data Structures Midterm Spring Instructions:

Here is a C function that will print a selected block of bytes from such a memory block, using an array-based view of the necessary logic:

gcc o driver std=c99 -Wall driver.c bigmesa.c

Solution printed. Do not start the test until instructed to do so! CS 2604 Data Structures Midterm Summer I Instructions:

Supporting Class / C++ Lecture Notes

Running a C program Compilation Python and C Variables and types Data and addresses Functions Performance. John Edgar 2

static CS106L Spring 2009 Handout #21 May 12, 2009 Introduction

In our first lecture on sets and set theory, we introduced a bunch of new symbols and terminology.

CS 2506 Computer Organization II Test 2

Here's how you declare a function that returns a pointer to a character:

CSE 12 Abstract Syntax Trees

CS 2506 Computer Organization II Test 2. Do not start the test until instructed to do so! printed

Chapter 1 Getting Started

struct _Rational { int64_t Top; // numerator int64_t Bottom; // denominator }; typedef struct _Rational Rational;

CS103 Spring 2018 Mathematical Vocabulary

CSE 333 Autumn 2014 Midterm Key

CS 2506 Computer Organization II Test 2. Do not start the test until instructed to do so! printed

Programming in C++ Prof. Partha Pratim Das Department of Computer Science and Engineering Indian Institute of Technology, Kharagpur

Have examined process Creating program Have developed program Written in C Source code

A shell can be used in one of two ways:

Here is a C function that will print a selected block of bytes from such a memory block, using an array-based view of the necessary logic:

CSE 303 Midterm Exam

CS 1044 Program 6 Summer I dimension ??????

Permission and Ownership

Casting in C++ (intermediate level)

You will provide an implementation for a test driver and for a C function that satisfies the conditions stated in the header comment:

CSE143 Notes for Monday, 4/25/11

Lecture 04 Introduction to pointers


A brief introduction to C programming for Java programmers

Linked Lists. What is a Linked List?

CSE 142/143 Unofficial Commenting Guide Eric Arendt, Alyssa Harding, Melissa Winstanley

PROFESSOR: Last time, we took a look at an explicit control evaluator for Lisp, and that bridged the gap between

1 Getting used to Python

CS 2506 Computer Organization II


Lecture 6. Statements

CS 3214 Computer Systems. Do not start the test until instructed to do so! printed

Function Call Stack and Activation Records

Module 10A Lecture - 20 What is a function? Why use functions Example: power (base, n)

CS 3114 Data Structures and Algorithms DRAFT Project 2: BST Generic

Introduction to Programming in C Department of Computer Science and Engineering. Lecture No. #17. Loops: Break Statement

// file2.c. // file1.c #include <stdio.h> int A1 = 42; // 1.1 static int B1; // 1.2. int A2 = 12; // 2.1 int B2; // 2.2. extern int A2; // 1.

Do not start the test until instructed to do so!

// Initially NULL, points to the dynamically allocated array of bytes. uint8_t *data;

5.6.1 The Special Variable this

Given that much information about two such rectangles, it is possible to determine whether they intersect.

READ THIS NOW! Failure to read and follow the instructions below may result in severe penalties. Do not start the test until instructed to do so!

The Stack, Free Store, and Global Namespace

CS102: Standard I/O. %<flag(s)><width><precision><size>conversion-code

The four laws of programs

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

Programming Data Structures and Algorithms Prof. Shankar Balachandran Department of Computer Science Indian Institute of Technology, Madras

MITOCW watch?v=sdw8_0rdzuw

MITOCW watch?v=4dj1oguwtem

Shell Scripting. Todd Kelley CST8207 Todd Kelley 1

A Capacity: 10 Usage: 4 Data:

M.EC201 Programming language

Final CSE 131B Spring 2004

C0MP1911 Final Exam 1337 Computing 1

Lecture 3: C Programm

Final Exam. COMP Summer I June 26, points

COMP-202 Unit 2: Java Basics. CONTENTS: Using Expressions and Variables Types Strings Methods

My Favorite bash Tips and Tricks

MARKING KEY The University of British Columbia MARKING KEY Computer Science 260 Midterm #2 Examination 12:30 noon, Thursday, March 15, 2012

Singly linked lists in C.

Transcription:

Instructions: Print your name in the space provided below. This examination is closed book and closed notes, aside from the permitted one-page formula sheet. No calculators or other electronic devices may be used. The use of any such device will be interpreted as an indication that you are finished with the test and your test form will be collected immediately. Answer each question in the space provided. If you need to continue an answer onto the back of a page, clearly indicate that and label the continuation with the question number. If you want partial credit, justify your answers, even when justification is not explicitly required. There are 7 questions, some with multiple parts, priced as marked. The maximum score is 100. When you have completed the test, sign the pledge at the bottom of this page and turn in the test. If you brought a fact sheet to the test, write your name on it and turn it in with the test. Note that either failing to return this test, or discussing its content with a student who has not taken it is a violation of the Honor Code. Do not start the test until instructed to do so! Name Solution printed Pledge: On my honor, I have neither given nor received unauthorized aid on this examination. signed A 1

xkcd.com In the key, I've written answers in blue and explanatory commentary (that I wouldn't have expected as part of your answer) in green. A 2

1. Suppose that the PATH variable for your Linux user account is currently set to be:./:/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin:~/bin You've written a C program to provide a customized version of the standard ls command (which is located in the directory /bin). You want to install the executable for your custom program so that whenever you type the name of your executable program it will be executed by default, instead of the standard ls, but you want the standard version of ls to also be available. You may assume that (possibly aside from the standard ls) there are no other executables on the system with the same name as your version. You may not modify the PATH variable unless there is no other way to achieve the given goal. a) [6 points] Suppose that you've named the executable for your program ls (arguably a bad decision), and you have root permissions, so you can modify the contents of any of the directories shown above. Describe ONE place you could you put your executable to achieve your goal. Key fact: when you enter the name of a program as a command, the shell looks for a matching executable file, checking the directories in the path in the order they're listed in the PATH variable. The directories in the path are, in order: /usr/local/bin /bin /sbin /usr/bin /usr/sbin ~/bin./ doesn't really count it doesn't name a particular directory, but rather it refers to the one that you are currently in, which could be any directory on the system. So, you must put your executable in a directory that's in the path before /bin. Putting it into./ doesn't make sense (unless you only use one directory on your system). Therefore, you would have to install your executable in /usr/local/bin. You could add some other directory to the path, before /bin, and install your executable there, but the instructions are to avoid that unless it's necessary to modify the path. b) [6 points] Reconsider part a), with the restriction that you cannot modify any of the directories that are directly under the root directory. Now it gets a bit more restrictive, but you can still use /usr/local/bin. That wasn't the intent of the question... I should have said you could only modify directories that belonged to your user account. In that case, you'd have to change the path; the simplest solution then would have been to move ~/bin to be earlier in the path list. A 3

c) [6 points] Reconsider part b), but now you've decided to name your executable myls instead of ls. The difference now is that you can just put your executable into ~/bin or any other directory in the path (but not./ or directly under the root), since there aren't any other executables on the system named myls. So, possible answers would include all of the directories listed in the discussion of part a). A 4

2. Suppose that your user id is johokie and that a listing (ls l) of the contents of your current working directory provides the following information: [CentOS tmp 1234]$ ls l total 32 -r-------- 1 johokie academic 7 2011-09-03 11:56 data.txt -rw-rw-rw- 1 johokie academic 512 2011-09-03 11:56 results.txt -rwx--x--x 1 johokie academic 9045 2011-09-03 11:50 newton -rwxr----x 1 johokie academic 8734 2011-09-03 11:35 raphson List the Linux command(s) you would use to accomplish each of the following goals, in a minimal fashion. That is, there should be no other rights granted or removed unless it is unavoidable. Assume the commands will be entered in the current working directory whose contents are shown above. The parts are independent; i.e., you start with the initial settings shown above. a) [5 points] Allow only the owner and members of the group academic to read and write data.txt. chmod u+w,g+rw data.txt or chmod 660 data.txt b) [5 points] Prevent the group and others from modifying the contents of the file results.txt. chmod go-w results.txt or chmod 644 results.txt c) [8 points] Write a bash function that will swap the contents of two files. The command could be invoked as: swap data.txt results.txt There should be no additional side effects from this command, so any temporary files created should be cleaned up, etc. You do not need to verify that either file exists. Something like this would work: swap () { mv $1 temp mv $2 $1 mv temp $2 Most people lost points for not writing the code inside of a function or if the function they wrote wasn't generic, i.e. only working with results.txt and data.txt. A 5

3. Analyze the C function given below. Be sure to pay careful attention to the comments. The function is syntactically correct, but the logic of the design is not entirely valid. /** Determines the larger of two integers, and communicates that value * to the caller. */ void max(int x, int y, int bigger) { if ( x >= y ) { bigger = x; else { bigger = y; a) [6 points] Explain clearly why the given implementation will not achieve the stated goals. Parameters are passed by value, so max() is working with a copy of the caller's variables. Therefore, assigning a value to bigger within max() is just modifying a variable that's local to max(), and there's no way for the caller to be aware of that. There were a number of bogus answers, including: "max() doesn't return a value", "max() has a return type of void", etc. TRUE, but that doesn't explain WHY nothing is communicated to the caller. It's obvious the programmer is trying to use the parameter bigger to communicate a value to the caller why does that not work? if x == y the function will return x, which is not bigger than y TRUE, but not relevant. Both the Java and C libraries define max() and min() functions that do precisely what this function is trying to do. If you want to know which of two values is bigger, and the values are the same, then that's the biggest value under consideration. b) [6 points] Write a corrected version of the function that will achieve the stated goals. You may make any changes you like, as long as you don't use any file-scoped variables. Aside from using file-scoped variables (banned) or pointers (not covered yet), the only way to fix this is to have the function return a value to the caller: /** Determines the larger of two integers, and communicates that value * to the caller. */ int max(int x, int y) { if ( x >= y ) { return x; else { return y; A 6

(Since there's no use for the third parameter, it should be eliminated.) There were a number of incorrect versions of this. The most common was to call printf() and write the bigger value to standard output. That does not "communicate that value to the caller". What IS the caller? It's another C function, not a human. A 7

4. For each part of this question, write a declaration in the code below that will achieve the desired goal. Label each declaration with a comment indicating which part of the question it goes with. static int B; int D; // part b ("static" makes it private to the file) // part d (file-scoped, so has static duration by default) int F() { while (... ) { A significant number of answers used bogus modifiers, like: static int C; // part c intern, internal, global public, private, final This isn't about Java! int G() { int A; // part a a) [3 points] I want an integer variable named A that can be accessed anywhere in the body of the function G(), but nowhere else. For A to be accessible throughout the body of G() but nowhere else, A must be declared at the beginning of the body of G() (or be a formal parameter in G() but that was irrelevant). It would be OK for A to be static. b) [3 points] I want an integer variable named B that can be accessed from within F() and G(), but not from outside the file containing them. To be accessed from both F() and G(), B must be declared at file scope. To NOT be accessible from outside the file, B must be declared as static. c) [3 points] I want an integer variable named C that can only be accessed within the while loop in F(), and that retains its value between calls to F(). To be accessible only within the loop in F(), C must be declared inside that loop. To retain its value between calls, C must be declared as static. d) [3 points] I want an integer variable named D that can be accessed from within F() and G(), and outside the file, and that retains its value persistently as long as the program is running. As in part b), D must be declared at file scope. But now, we want D to be accessible outside the file, so D cannot be static. A 8

5. [14 points] Implement the C function described below. Be sure to note the restrictions, violating the restrictions will result in a very low score. /* Each call computes and returns a number in the Fibonacci sequence. * The Fibonacci sequence is defined by the recurrence: * F n = F n-1 + F n-2 * with seed values F 0 = 1 and F 1 = 1 * * Example usage: * Fib() = 1 // first call * Fib() = 1 // second call * Fib() = 2 // etc... * Fib() = 3 * Fib() = 5 * * Restrictions: * - does not use global variables. * - does not use any additional libraries. * - does not make any use of character variables or arrays. * - does not read input or write output. */ uint32_t Fibo() { // This is the most straightforward solution; there are simpler ways to implement this. static uint32_t count = 0; static uint32_t f1 = 1, f2 = 1; uint32_t current; if(count < 2) { current = 1; count++; else { current = f1 + f2; f2 = f1; f1 = current; return current; You really needed to use static variables here. Per the stated restrictions, if you created global variables, or rewrote the function signature, then you lost most of the points. I suggest you also read the extra information at the end of Q7 regarding uninitialized variables in C, they don't start out as NULL or 0, etc. A 9

6. Analyze the short C program given below: #include <stdio.h> int main() { int a = 42; int b = 27; if ( a = b ) f(a, a); else f(a, b); // used "=" instead of "==" for comparison // calling f() w/o a prior declaration return 0; void f(int x, int y) { printf("the sum of %d and %d is %d.\n", x, y, x + y); When this code is compiled with -Wall, gcc will issue warnings about two different issues (but, curiously, no error messages). Explain why each warning will be issued (what's going on in the code), and how to fix it. Be specific but brief. You don't have to discuss the warnings in the order the compiler would issue them. [6 points] Warning 1: The programmer evidently erred in writing the if-test, using assignment instead of equality. It's legal code, but suspicious, hence the warning. We see this is a logic error from the code in the clauses of the if-then statement. The fix is obvious, replace "=" with "==". [6 points] Warning 2: The programmer failed to write a declaration for f(). Functions must be declared before they are called. The compiler encounters the first call to f(), does not see a declaration, and therefore issues an implicit declaration warning. It's a warning (unfortunately) because the compiler will infer a declaration for f() and proceed. The compiler also issues a warning because it assumes the return type is int, and then sees the definition of f() with a return type of void. There were lots of incorrect suggestions here, including: need braces around the if/else clauses --- nope, not even in Java; if there are not braces, the body of the if/else is just the next single statement the else clause will never be executed --- true, but there's no warning for that in C f() should have a return type of int ---??? A 10

the use of an expression, x + y, as a parameter to printf() is not allowed --- if so, that would cause an error message, not a warning; but it's perfectly legal, and entirely unobjectionable, to use an expression as a parameter in a function call the format specifier %d expects a value of type double --- nope the "." after the "%d" is not legal, having something to do with specifying the number of digits to print after the decimal point (precision) --- nope, it's just putting a period at the end of the sentence that's going to be printed. there's no return at the end of the body of f() --- yep, and it's not required; there's an implied return at the end of a function body, and that's also true in Java A 11

7. [14 points] Implement a C function that will read IP addresses and port numbers from a file and sum them. Below is a sample input file: 128.255.77.11:22 124.55.88.99:458 127.33.47.84: Each IP address is represented by 4 integers (between 0 and 255) separated by periods, followed by a colon, and then there may or may not be a port number (between 0 and 65535). The colon will always be there even if the port number is not. If the port number is not included you can assume a default value of 22. Given the above input file, your function will print the following: 128 + 255 + 77 + 11 + 22 = 493 124 + 55 + 88 + 99 + 458 = 824 127 + 33 + 47 + 84 + 22 = 313 You should use this code as a starting point: const unsigned int MAX_LINE_LENGTH = 101; /* Pre: * filename is a valid file. * Post: * The function prints the results as described above. * Returns: * The number of IP addresses read from the file. */ uint32_t read_file(char * filename) { char Line[MAX_LINE_LENGTH]; FILE * Input = fopen(filename, "r"); unsigned int a, b, c, d, p; uint32_t count = 0; while (fgets(line, MAX_LINE_LENGTH, Input)!= NULL ) { p = 22; if(sscanf(line, "%u.%u.%u.%u:%u", &a, &b, &c, &d, &p) >= 4) { unsigned int sum = a + b + c + d + p; printf("%u + %u + %u + %u + %u = %u\n", a, b, c, d, p, sum); count++; return count; A 12

Here some things to consider for both this question and future C questions on tests: Enough of you forgot about sscanf (or some other scanf variant, I was forgiving here) and instead decided to try and parse the string yourself using C strings or arrays. If I saw something I thought would work in C I gave credit for it, the problem is most people who did this used Java/Python while trying to pass it off as C. There are a lot features in Java that don't exist in C. Arrays and strings don't know how long they are, you can't use operators like +=, you can't just cast a character to a number, parseint() isn't a function supported by C. If you write a Java specific solution for part/all of a question, you shouldn't expect to receive credit for those parts. Uninitialized variables in C don't have a default value, when you declare variable without a value it can be anything. Sometimes you get "lucky" (is it lucky if bugs are hidden?) and the initial value is something sensible like 0, but this is not always the case. You can't assume int x; will create a variable with starting value 0, it could be 0, but that's just luck of the draw, it could also be -2129034. Unless you are talking about pointers you really shouldn't be using NULL. Variables are not references or pointers by default in C, they are just values. Variables without a value are not NULL; see the above bullet. NULL "is an integral constant expression that evaluates to zero" [www.cplusplus.com]. So it's 0, nothing more. Semantically, it's poor form to use NULL in place of 0 (though I don't think many of you were actually doing this intentionally) for normal variables, and comparing a standard integer with NULL will result in a compiler warning. A 13