Discuss the good, the bad and the ugly aspects of their code.
Please be gentle in any criticism - we are all learning!
Do you have any questions? Have you learned anything that would be useful to share with the rest of the tutorial?
What are its inputs and output and what do they mean?
Describe a function that will allocate memory for a struct and assign a pointer to the result.
What is the input to free and how does it help it do what it needs to do?
Discuss why these are extremely dangerous, one of the worst causes of bugs in C programs and a major source of security vulnerabilities.
What does dcc --leak-check do?
struct node *list_append(struct node *list1, struct node *list2);As usual, struct node has this definition:
struct node { int data; struct node *next; };It should not create (malloc) any new list elements.
It should just change the appropriate next field in the first list.
struct node { int data; struct node *next; };
See list_empty.c and list.h for this weeks linked list tute questions, and test_list.c for autotests. Alternatively download all three files as tut_list_files.zip.
struct node *copy(struct node *head);It should call malloc to create a new linked list of the same length and which contains the same data.
int identical(struct node *head1, struct node *head2);
int ordered(struct node *head);
The new linked list should also be in strictly increasing order. It should include only elements found in both lists.
set_intersection should call malloc to create the nodes of the new linked list.
set_intersection should have this prototype:
struct node *set_intersection(struct node *set1, struct node *set2);
The new linked list should also be in strictly increasing order. Elements found in both lists should only occur once in the new linked list.
set_union should call malloc to create the nodes of the new linked list.
set_union should have this prototype:
struct node *set_union(struct node *set1, struct node *set2);
Your tutor may still choose to cover some of the questions time permitting.
struct node *merge_sorted(struct node *list1, struct node *list2);
It should not create (malloc) any list elements. It should change the appropriate next fields to combined the lists.
Implement this function both iteratively (using a while/for loop) and recursively.
struct node *strings_to_list(int len, char *strings[]);Assume the strings contain only digit characters,
It might be called like this:
char *powers[] = {"2", "4", "8", 16"}; struct node *head = strings_to_list(4, powers);
Assume, a command line argument of "-" separates the arguments to be converted.
struct node *insert_ordered(int item, struct node *list);It should create (malloc) just 1 list element and change the appropriate next field in the list to insert it.
Implement this function.
double ff[] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6}; double *fp = &ff[0];
What are the similarities between ff
and
fp
? What are the differences?
char s[] = "Hello World!"; char *cp = s; char *cp2 = &s[8];
What is the output when the following statements are executed?
printf("%s\n", cp); printf("%c\n", *cp); printf("%c\n", cp[6]); printf("%s\n",cp2); printf("%c\n",*cp2);
int non_decreasing(int n, int a[n])which checks whether items in an array are sorted in non-decreasing order. (i.e. a[i] ≥ a[i-1], for 0<i<N). Your function should returns 1 if the items are in non-decreasing order, 0 otherwise.
int find_index(int x, int n, int a[n])which takes two integers x and n together with an array a[] of n integers and searches for the specified value within the array. Your function should return the smallest index k such that a[k] is equal to x (or -1 if x does not occur in the array).
c
in the string s. It returns
NULL if the character cannot be found.
char *strrchr(char s[], char c)
Use this function from the math.h library:
double fabs(double x);
multiply.c
that performs addition or
multiplication of integers, as follows. Your program should
continually read integers from the user until end-of-input is
encountered. Then it should print either the sum or the product of the
input numbers. The program behaviour is controlled by either of the
following command-line arguments:
-add, -multiply
. If the wrong command-line argument(s)
are supplied your program should do nothing.
thirteen_stdin.c
which reads 2 integers
from standard input and then prints all integers divisible by 13
between those numbers.
Your program should behave like this:
./a.out Enter start: 10 Enter finish: 42 13 26 39
Your program should behave like this:
./a.out 10 42 13 26 39
If error checking was required - what checking would you add to the programs from the previous 2 questions?
median.c
which reads integers until
end-of-input is reached. It should then print the median (middle) of
the integers. If there are an even number of integer you can print
either of the two middle integers.
Assume the numbers of integer is > 0 and < 1000.
Assume the integer are entered in sorted (non-decreasing) order.
Your program should behave like this:
./a.out 1 2 4 8 16 5 numbers read. Median was 4
./a.out 16 8 2 1 4 5 numbers read. Median was 4
Since the length of the array is variable you should not create additional arrays, nor assume a maximum array length. You may write extra functions in answering this question. Your function should have the following prototype:
int distinct_nums(int size, int nums[size]);Running the function with the following input:
int nums[] = {7,3,1,4,7,3,6,5,3}; int num_distinct = distinct_nums(9, nums);Should return the value 6 and the first six elements of the array should be changed to: {7,3,1,4,6,5}
int remove_char(char str[], char c)
For example "carpark" and "carpet" have a common prefix length of 4.
// text - the array of strings // array_size - the number of strings in the array // num_chars - print out any strings in the array with more than this number // of characters void print_if_longer(int array_size, char text[array_size][MAX_LEN], int num_chars);
int x = -9; int *p1 = &x; int *p2; p2 = p1; printf("%d\n", *p2); *p2 = 10; printf("%d\n",x);
int x = -9; int y = 0; while (x != 0){ y = y - 1; x = x + 1; } printf("%d\n", x); printf("%d\n",y);
int i = -7; int j = 0; while (i != 0){ j = j - i; i = i + 1; } printf("%d\n", i); printf("%d\n",j);
char goals[] = "All your goals belong to us."; char *a, *b, *c; a = goals + 5; b = &goals[10]; c = goals + (b - goals) + (b - a);The fragment is valid C. It executes without error. Indicate clearly and exactly what the following expressions evaluate to:
a == goals
a > goals
goals > c
c - b
goals - a
a[0] != b[0]
*c
goals[a - goals] == *a
c[a - b]
int i = 0; int j = 0; char *s = "ceded"; while (s[i] != '\0') { j = j + s[i] - 'a'; i = i + 1; } printf("%d %d\n", i, j);The fragment is valid C. It executes without error. Indicate clearly and exactly what output will be printed.
void sum_prod(int len, int nums[len], int *sum, int *product);