Skip to content

12.20 Lab10

introduction-to-computer-science-laboratory-10.pdf

Sequences can have same element and have the order

  1. Finish the exercises present in the tutorial.

  2. Identify the issues in the following C programs. Then fix the programs, avoiding the use of global variables while maintaining the original intended functionality:

    A.

    #include <stdio.h>
    int n;
    int i;
    int prime = 1;
    void isPrime() {
        i = 2;
        while(i < n && prime) 
            if(n % 1 == 0) {
                prime = 0;
            }
            i++;
        }
    }
    int main() {
        scanf("%d", &n);
        isPrime();
        if(prime) {
            printf("The number %d is prime\n", n);
        } 
        else {
            printf("The number %d is not prime\n", n);
        }
        return 0;
    }
    

    Corrected:

    #include <stdio.h>
    
    int isPrime(int n) {
        int i = 2;
        int prime = 1;
        if(n <= 1) {
            prime = 0;
            return prime;
        }
        else if(n == 2) {
            prime = 1;
            return prime;
        }
        while(i < n && prime) {
            if(n % i == 0) {
                prime = 0;
                return prime;
            }
            i++;
        }
        return prime;
    }
    
    int main() {
        int n;
        scanf("%d", &n);
        int prime = isPrime(n);
        if(prime) {
            printf("The number %d is prime\n", n);
        } 
        else {
            printf("The number %d is not prime\n", n);
        }
        return 0;
    }
    

    B.

    #include <stdio.h>
    #define MAX_SIZE 100
    int evens;
    int odds;
    int arr[MAX_SIZE];
    int size;
    int result;
    int i;
    int n;
    void isEven() {
        if(n % 2 == 0) {
            result = 1;
        } else {
            result = 0;
        }
    }
    void moreEvens() {
        for (i = 0; i < size; i++) {
            n = arr[i];
            isEven();
            if(result == 1) {
                evens++;
            } else {
                odds++;
            }
        }
        result = evens > odds;
    }
    int main() {
        scanf("%d", &size);
        for(i = 0; i < size; i++)
            scanf("%d", &arr[i]);
        i = 0;
        evens = 0;
        odds = 0;
        moreEvens();
        if(result) {
            printf("There is more evens than odds\n");
        } else {
            printf("There is more or equal odds than evens\n");
        }
        return 0;
    }
    

    Corrected:

    #include <stdio.h>
    #define MAX_SIZE 100
    
    int isEven(int n, int result) {
        if (n % 2 == 0) {
            result = 1;
            return result;
        }
        else {
            result = 0;
            return result;
        }
    }
    
    int moreEvens(int size, int result,int arr[]) {
        int evens = 0;
        int odds = 0;
        for (int i = 0; i < size; i++) {
            int n = arr[i];
            result = isEven(n, result);
            if (result == 1) 
                evens++;
            else
                odds++;
        }
        result = (evens > odds);
        return result;
    }
    
    int main() {
        int size;
        int result;
        int arr[MAX_SIZE];
        scanf("%d", &size);
        for (int i = 0; i < size; i++)
            scanf("%d", &arr[i]);
        result = moreEvens(size, result, arr);
        if (result)
            printf("There is more evens than odds\n");
        else
            printf("There is more or equal odds than evens\n");
        return 0;
    }
    
  3. For the following C functions over arrays, add the const​ modifier where it is needed.

    A.

    void loadArray(int a[], int size) {
        for(int i = 0; i < size; i++) {
            a[i] = i;
        }
    }
    

    No need to add const

    B.

    void copy(int a[], int b[], int size) {
        for(int i = 0; i < size; i++) {
            b[i] = a[i];
        }
    }
    

    Corrected

    void copy(const int a[], int b[], int size) {
        for(int i = 0; i < size; i++) {
            b[i] = a[i];
        }
    }
    

    C.

    void powArray(int a[], int size) {
        for(int i = 0; i < size; i++) {
            a[i] = a[i] * a[i];
        }
    }
    

    No need

    D.

    void sumArrays(int a[], int b[], int c[], int size) {
        for(int i = 0; i < size; i++) {
            c[i] = a[i] + b[i];
        }
    }
    

    Corrected:

    void sumArrays(const int a[],const int b[], int c[], int size) {
        for(int i = 0; i < size; i++) {
            c[i] = a[i] + b[i];
        }
    }
    
  4. Implement a C function that, given 2 strings, determines if they are equal or not. Then write a main function that takes 2 strings from standard input and calls the previously defined function.

    #include <stdio.h>
    
    int isEqual(char str1[], char str2[]) {
        for(int i = 0; str1[i] != '\0' || str2[i] != '\0'; i++) {
            if(str1[i] != str2[i]) 
                return 0;
        }
        return 1;
    }
    
    
    int main() {
        char str1[1000];
        char str2[1000];
        fgets(str1, 1000, stdin);
        fgets(str2, 1000, stdin);
        if(isEqual(str1, str2))
            printf("Yes, they are equal!");
        else
            printf("No, they are not euqal!");
    }
    
  5. Design a function that, given a string, calculates its length. Write a main function that takes as input a string from the command line and calculates the string’s length.

    #include <stdio.h>
    
    int length(char str[]) {
        int i;
        for(i = 0; str[i] != '\0'; i++) {}
        return i - 1;
    }
    
    int main() {
        char str[1000];
        fgets(str, 1000, stdin);
        int len = length(str);
        printf("%d", len);
    }
    
  6. Write a function that, given a string s​, calculates the reverse of s​ and stores it in the same string. This function cannot use additional arrays. Afterward, write a main function that takes a string from standard input, prints it, and prints the reverse of the input.

    #include <stdio.h>
    
    int length(char str[]) {
        int i;
        for(i = 0; str[i] != '\0'; i++) {}
        return i - 1;
    }
    
    void reverse(char str[]) {
        char temp;
        for(int i = 0; i < length(str) - i - 1; i++) {
            temp = str[length(str) - i - 1];
            str[length(str) - i - 1] = str[i];
            str[i] = temp;
        }
    }
    
    int main() {
        char str[1000];
        fgets(str, 1000, stdin);
        reverse(str);
        printf("%s", str);
    }
    
  7. Write a C function that calculates the power of 2 using an array. This array must have a length of (n + 1)​ for every n​. Then write a main function that takes n​ as input from the command line and calculates the power of 2.

    #include<stdio.h>
    #include<stdlib.h> 
    
    void initial(int str[], int size) {
        for(int i = 0; i < size; i++) {
            str[i] = 2;
        }
    }
    
    int powt(int str[], int size) {
        int result = 1;
        for(int i = 0; i < size; i++) {
            result *= str[i];
        }
        return result;
    }
    
    int main(int argc, char *argv[]) {
        int size = atoi(argv[1]);
        int str[size];
        initial(str, size);
        printf("%d", powt(str, size));
    }
    

Insert sort

#include <stdio.h>
#include <assert.h>
#define FALSE 0
#define TRUE 1
/* inserts the element at position index into
  Its sorted position in the sorted subarray
  Seq[0 .. index - 1].
  Precondition: index is a valid position of the array
  The subarray seq[0..index-1] is sorted.
 */
void sorted_insert(int seq[], int index) {
    assert (index >= 0);
    if (index > 0 && seq[index] < seq[index - 1]) {
        int aux = seq[index];
        seq[index] = seq[index - 1];
        seq[index - 1] = aux;
        sorted_insert(seq, index - 1);
    }
}
/* prints array contents from position lower to 
   Position upper - 1 */
void print_array(int seq[], int lower, int upper) {
    printf("{");
    for (int i = lower; i < upper - 1; i++) {
        printf("%d, ", seq[i]);
    }
    printf("%d}\n", seq[upper - 1]);
}
/* Sorts an array seq.
 * Precondition: size is >= 0, and is the size
 * of the array. 
 */
void sort(int seq[], int size) {
    if(size > 1) {
        sort(seq, size - 1);
        sorted_insert(seq, size - 1);
    }
/*     for (int i = 1; i < size; i++) {
        sorted_insert(seq, i);
    } */
}
int main() {
    int seq[11] = {1, 2, 33, 4, 5, 3, 6, 7, 8, 59, 25};
    print_array(seq, 0, 11);
    sort(seq, 11);
    print_array(seq, 0, 11);
    return 0;
}

image

image