Week 6 Class activities

advertisement
http://www.comp.nus.edu.sg/~cs1010/
WEEK 6
Class Activities
© NUS
CS1010 (AY2015/6 Semester 2)
Week6 - 2
Week 6: Pointers & Arrays
Pointers
 Tracing Pointers
 Choose the Correct Codes
 Incrementing a Pointer
Arrays




Exercise #1: Reversing an Array
Exercise #2: Missing Digits
Exercise #3: Modularising “Missing Digits” program
Exercise #4: Set Containment – Take home if time
runs out
© NUS
CS1010 (AY2015/6 Semester 2)
Tracing Pointers (1/2)
 Trace the code below manually to obtain the outputs.
 Compare your outputs with your neighbours.
int a = 8, b = 15, c = 23;
int *p1, *p2, *p3;
Week6_TracePointers.c
p1 = &b;
p2 = &c;
p3 = p2;
printf("1: %d %d %d\n", *p1, *p2, *p3);
*p1 *= a;
while (*p2 > 0) {
*p2 -= a;
(*p1)++;
}
printf("2: %d %d %d\n", *p1, *p2, *p3);
printf("3: %d %d %d\n", a, b, c);
Week6 - 3
© NUS
CS1010 (AY2015/6 Semester 2)
Tracing Pointers (2/2)
a
8
int a = 8, b = 15, c = 23;
int *p1, *p2, *p3;
Week6 - 4
p1
b
p2
15
120
121
122
123
p1 = &b;
p2 = &c;
p3 = p2;
printf("1: %d %d %d\n", *p1, *p2, *p3);
*p1 *= a;
while (*p2 > 0) {
*p2 -= a;
(*p1)++;
}
printf("2: %d %d %d\n", *p1, *p2, *p3);
printf("3: %d %d %d\n", a, b, c);
p3
c
23
15
7
-1
1: 15 23 23
2: 123 -1 -1
3: 8 123 -1
© NUS
CS1010 (AY2015/6 Semester 2)
Week6 - 5
Choose the Correct Codes
 Pick the correct codes to read a value into the float
variable var.
(A)
(B)
float var;
scanf("%f", var)
(C)
float var;
float *p;
p = &var;
scanf("%f", p)
float var;
scanf("%f", &var)
(D)
float var;
float *p;
p = &var;
scanf("%f", &p)
© NUS
CS1010 (AY2015/6 Semester 2)
Week6 - 6
Incrementing a Pointer
 If p is a pointer variable, what does it mean by p = p + 1
(or p++)?
Unit 3 Exercise #1:
int a, *ap;
int takes up 4 bytes
float b, *bp; float takes up 4 bytes
char takes up 1 byte
char c, *cp;
double d, *dp; double takes up 8 bytes
Week6_IncrementPointers.c
ap = &a; bp = &b; cp = &c; dp = &d;
printf("%p %p %p %p\n", ap, bp, cp,
ffbff62c ffbff628
ap++; bp++; cp++; dp++;
printf("%p %p %p %p\n", ap, bp, cp,
ffbff630 ffbff62c
ap += 3;
printf("%p\n", ap); ffbff63c
dp);
ffbff627 ffbff618
dp);
ffbff628 ffbff620
© NUS
CS1010 (AY2015/6 Semester 2)
Week6 - 7
Exercise #1: Reversing an Array
 Write a program Week6_ReverseArray.c to read a list of
numbers (at most 10 of them) into the array, reverse the
array and print its elements.
 We will write everything in the main() function for now.
 An incomplete program Week6_ReverseArray.c is given.
 Sample run:
Enter size of array (<=10): 5
Enter 5 elements: 1 -2 3 8 6
After reversing: 6 8 3 -2 1
© NUS
CS1010 (AY2015/6 Semester 2)
Week6 - 8
Exercise #2: Missing Digits (1/3)
 Write a program Week6_MissingDigits.c to read in a
positive integer and list out all the digits that do not
appear in the input number.
 We will write everything in the main() function. (You will
modularise it in exercise #3.)
 Sample run:
Enter a number: 73015
Missing digits in 73015: 2 4 6 8 9
 Recall: How do we extract individual digits from an
integer?
© NUS
CS1010 (AY2015/6 Semester 2)
Week6 - 9
Exercise #2: Missing Digits (2/3)
 Where does the array come in?
 Hint…  (Let you THINK first before giving out the hint)
Input: 73105
0
false
true
Create an array called found, with
10 elements, each element
represents a digit.
1
false
true
2
false
3
false
4
false
That is, found[0] is about digit 0,
found[1] about digit 1, …, found[9]
about digit 9.
5
false
6
false
7
false
8
false
How do you use this array?
9
false
true
true
true
© NUS
CS1010 (AY2015/6 Semester 2)
Week6 - 10
Exercise #2: Missing Digits (3/3)
Show this only after students
have attempted it themselves.
int main(void) {
int number, i;
int found[10] = {0} // found[i]=0 means digit i is missing
printf("Enter a number: ");
scanf("%d", &number);
printf("Missing digits in %d: ", number);
Key idea
while (number > 0) {
found[number%10] = 1; // found digit in input number
number /= 10;
}
for (i = 0; i < 10; i++) {
if (!found[i])
printf("%d ", i);
}
printf("\n");
return 0;
}
Week6_MissingDigits.c
© NUS
CS1010 (AY2015/6 Semester 2)
Week6 - 11
Exercise #3: Modularising Exercise #2
 Let’s re-write our program Week6_MissingDigits.c into
Week6_MissingDigitsModular.c
 Objective: Passing array to a function
 The program should contain a function called
analyseNumber() that takes in a number and analyse
what are the missing digits in that number
 What is/are the parameter(s)?
 The program should also contain a function called
printMissingDigits() to print out all the missing digits
 What is/are the parameter(s)?
© NUS
CS1010 (AY2015/6 Semester 2)
Week6 - 12
Exercise #4: Set Containment
 Consider two arrays, arrA and arrB, of int values, where their
sizes are sizeA and sizeB respectively.
 Write a function
int isSubset(int arrA[], int sizeA, int arrB[], int sizeB)
to determine if the set arrA is a subset of the set arrB.
 The function returns 1 if arrA is a subset of arrB, or 0 otherwise.
You may assume there are no duplicate numbers in each set.
 Example: If arrA[ ] = {14, 5, 1, 9} and arrB[ ] = {2, 9, 3, 14, 5, 6,
1}
 isSubset(arrA, 4, arrB, 7) returns 1
 isSubset(arrA, 4, arrB, 6) returns 0
 An incomplete program Week6_SetContainment.c is given.
Complete the program. This is your take-home exercise. Also
mounted on CodeCrunch
© NUS
CS1010 (AY2015/6 Semester 2)
Things-To-Do

Revise


PE1



This Wednesday!
Refer to CS1010 website “PE” page for details
Preparation for next week


Chapter 6: Numeric Arrays
Multi-dimensional arrays
Continue to do practice exercises on
CodeCrunch
Week6 - 13
© NUS
CS1010 (AY2015/6 Semester 2)
End of File
Week6 - 14
Download