ESE 124 C Programming Fundamentals

Basic Setup

#include <stdio.h>

int main() {
    printf("Hello ESE 124!\n");
    return 0;
}
Common Errors:
Exercise: Modify the program to ask for the user's name and print "Hello, <name>!".
Solution
#include <stdio.h>

int main() {
    char name[50];
    printf("Enter your name: ");
    scanf("%49s", name);
    printf("Hello, %s!\n", name);
    return 0;
}

Data Types & ASCII

int age;
float temp;
char letter;
printf("ASCII of A is %d\n", 'A');
Common Errors:
Exercise: Print ASCII values of characters '0' through '9'.
Solution
#include <stdio.h>

int main() {
    for (char c = '0'; c <= '9'; c++) {
        printf("%c = %d\n", c, c);
    }
    return 0;
}

Control Statements

int x;
printf("Enter a number: ");
scanf("%d", &x);

if (x % 2 == 0) {
    printf("Even\n");
} else {
    printf("Odd\n");
}
Common Errors:
Exercise: Create a switch-case to print the day of the week for 1–7.
Solution
#include <stdio.h>

int main() {
    int d;
    scanf("%d", &d);
    switch (d) {
        case 1: printf("Monday\n"); break;
        case 2: printf("Tuesday\n"); break;
        case 3: printf("Wednesday\n"); break;
        case 4: printf("Thursday\n"); break;
        case 5: printf("Friday\n"); break;
        case 6: printf("Saturday\n"); break;
        case 7: printf("Sunday\n"); break;
        default: printf("Invalid\n");
    }
    return 0;
}

Arrays

int nums[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
    printf("%d ", nums[i]);
}
printf("\n");
Common Errors:
Exercise: Write a function to find the maximum value in an array.
Solution
int find_max(int a[], int n) {
    int mx = a[0];
    for (int i = 1; i < n; i++) {
        if (a[i] > mx) mx = a[i];
    }
    return mx;
}

int main() {
    int arr[] = {3, 7, 2, 9, 5};
    printf("Max = %d\n", find_max(arr, 5));
    return 0;
}

Functions

int add(int a, int b) {
    return a + b;
}

int main() {
    printf("Sum = %d\n", add(2, 3));
    return 0;
}
Common Errors:
Exercise: Implement a recursive function to compute factorial(n).
Solution
long factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

int main() {
    printf("5! = %ld\n", factorial(5));
    return 0;
}

Pointers

int x = 10;
int *p = &x;
printf("Value = %d\n", *p);
Common Errors:
Exercise: Write a function to swap two integers via pointers.
Solution
swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main() {
    int a = 5, b = 7;
    swap(&a, &b);
    printf("a=%d, b=%d\n", a, b);
    return 0;
}

Function Pointers

#include <stdio.h>

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main() {
    int (*op)(int, int);
    op = &add;
    printf("5 + 3 = %d\n", op(5, 3));
    op = ⊂
    printf("5 - 3 = %d\n", op(5, 3));
    return 0;
}
Common Errors:
Exercise: Write mul and divide, select via an array of pointers.
Solution
#include <stdio.h>

int mul(int a, int b) { return a * b; }
int divide(int a, int b) { return a / b; }

int main() {
    int (*ops[2])(int, int) = { &mul, ÷ };
    printf("6 * 7 = %d\n", ops[0](6, 7));
    printf("6 / 2 = %d\n", ops[1](6, 2));
    return 0;
}

File I/O

FILE *f = fopen("data.txt", "w");
fprintf(f, "Hello File\n");
fclose(f);
Common Errors:
Exercise: Read integers from input.txt until EOF and print their sum.
Solution
#include <stdio.h>

int main() {
    FILE *f = fopen("input.txt","r");
    if (!f) return 1;
    int sum=0, x;
    while (fscanf(f,"%d",&x)==1) sum += x;
    fclose(f);
    printf("Sum = %d\n", sum);
    return 0;
}

Bubble Sort

bubble(int a[], int n) {
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
            if (a[j] > a[j + 1]) {
                int tmp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = tmp;
            }
}
Common Errors:
Exercise: Implement insertion sort.
Solution
insertion(int a[], int n) {
    for (int i = 1; i < n; i++) {
        int key = a[i], j = i - 1;
        while (j >= 0 && a[j] > key) {
            a[j + 1] = a[j];
            j--;
        }
        a[j + 1] = key;
    }
}

Data Structures

Stack

#define MAX 10
int stack[MAX], top=-1;

push(int v) { stack[++top]=v; }
pop()    { return stack[top--]; }
Common Errors:

Queue

#define MAXQ 10
int queue[MAXQ], front=0, rear=-1, count=0;

enqueue(int v) {
    if (count0) {
        v=queue[front];
        front=(front+1)%MAXQ;
        count--;
    }
    return v;
}
ADT: separates interface from implementation so users call push, pop, enqueue, dequeue without seeing internals.
Exercise: Using the Queue ADT, enqueue [1,2,3,4,5] then dequeue all and print.
Solution
#include <stdio.h>>
#include "queue.h"

int main() {
    Queue *q = queue_create(5);
    for (int i=1; i<=5; i++) enqueue(q,i);
    for (int i=0; i<5; i++)
        printf("%d ", dequeue(q));
    printf("\n");
    queue_destroy(q);
    return 0;
}
Compile: gcc main.c queue.c -o a.exe

FSM: “FRFR” Detector (Mealy)

#include <stdio.h>>
#include <string.h>>

enum State { S0,S1,S2,S3,S4 };
enum In { F,R,X };

get_in(char c){
    if(c=='F')return F;
    if(c=='R')return R;
    return X;
}

int main() {
    State st=S0;
    char s[1000]; int cnt=0;
    State nxt[5][3] = {
        {S1,S0,S0},{S1,S2,S0},{S3,S0,S0},{S1,S4,S0},{S3,S0,S0}
    };
    int out[5][3] = {
        {0,0,0},{0,0,0},{0,0,0},{0,1,0},{0,0,0}
    };
    printf("Input: "); scanf("%s",s);
    for(int i=0;s[i];i++){
        int in=get_in(s[i]);
        cnt += out[st][in];
        st = nxt[st][in];
    }
    printf("FRFR count=%d\n",cnt);
    return 0;
}
Exercise: Adapt it to detect “RFRF” instead.
Solution
// Swap transitions and output bits for F↔R in nxt and out arrays.

Dynamic Memory Allocation

#include <stdio.h>>
#include <stdlib.h>>

int main() {
    int n=5;
    int *arr = malloc(n * sizeof *arr);
    for(int i=0;i
Exercise: Allocate 10 strings (20 chars each), read & print names.
Solution
#include <stdio.h>>
#include <stdlib.h>>

int main() {
    int n=10;
    char (*names)[20] = malloc(n * sizeof *names);
    for(int i=0;i
/>

Structures

struct Point { int x,y; };

int main() {
    struct Point p={10,20};
    printf("(%d,%d)\n",p.x,p.y);
    return 0;
}
Exercise: Define a Student struct (name,id,GPA), create & print one.
Solution
struct Student {
    char name[50];
    int id;
    double gpa;
};

int main() {
    struct Student s={"Alice",12345,3.8};
    printf("%s %d %.2f\n",s.name,s.id,s.gpa);
    return 0;
}

Bitwise Manipulation

unsigned a = 5;       // 0b0101
unsigned b = a << 1;  // 0b1010 == 10
unsigned c = a & 3;   // 0b0101 & 0b0011 == 1
printf("b=%u, c=%u\n", b, c);
Exercise: Write a function to check if the nᵗʰ bit of x is set.
Solution
is_bit_set(unsigned x, int n) {
    return (x >> n) & 1;
}

int main() {
    unsigned v=13; // 0b1101
    for(int i=0;i<4;i++){
        printf("bit %d of %u: %d\n", i, v, is_bit_set(v,i));
    }
    return 0;
}

Exam Resources