add initial c, cpp files
This commit is contained in:
47
c/isp-ws25/a2-vowels.c
Normal file
47
c/isp-ws25/a2-vowels.c
Normal file
@@ -0,0 +1,47 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define STRING_SIZE 30
|
||||
|
||||
void inputString(char user_input[])
|
||||
{
|
||||
printf("Please enter the string: ");
|
||||
fgets(user_input, STRING_SIZE, stdin);
|
||||
}
|
||||
|
||||
void countVowels(char user_input[], int vowels[])
|
||||
{
|
||||
int position = 0;
|
||||
while (user_input[position] != '\n')
|
||||
{
|
||||
if (user_input[position] == 'a' || user_input[position] == 'A') vowels[0]++;
|
||||
if (user_input[position] == 'e' || user_input[position] == 'E') vowels[1]++;
|
||||
if (user_input[position] == 'i' || user_input[position] == 'I') vowels[2]++;
|
||||
if (user_input[position] == 'o' || user_input[position] == 'O') vowels[3]++;
|
||||
if (user_input[position] == 'u' || user_input[position] == 'U') vowels[4]++;
|
||||
position++;
|
||||
}
|
||||
}
|
||||
|
||||
void printVowels(int vowels[])
|
||||
{
|
||||
printf("a: %d\n", vowels[0]);
|
||||
printf("e: %d\n", vowels[1]);
|
||||
printf("i: %d\n", vowels[2]);
|
||||
printf("o: %d\n", vowels[3]);
|
||||
printf("u: %d\n", vowels[4]);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char user_input[STRING_SIZE] = {'\0'};
|
||||
int vowels[5] = {0};
|
||||
|
||||
inputString(user_input);
|
||||
|
||||
countVowels(user_input, vowels);
|
||||
|
||||
printVowels(vowels);
|
||||
|
||||
return 0;
|
||||
}
|
||||
163
c/isp-ws25/a4-insert-in-sorted-list.c
Normal file
163
c/isp-ws25/a4-insert-in-sorted-list.c
Normal file
@@ -0,0 +1,163 @@
|
||||
/******************************************************************************
|
||||
Student Management Using Linked Lists
|
||||
|
||||
Task Description
|
||||
In this coding task, you will extend a student management system. The program already creates students and stores them in a sorted linked list. Your task is to implement the functionality of adding additional students into the sorted linked list. Some parts of the program are already implemented.
|
||||
|
||||
Key points:
|
||||
Already Implemented: The student struct is defined. Students are created in the main function and added manually into a linked list.
|
||||
Your task: The function insertSorted should insert a student into the existing linked list at the correct position.
|
||||
The linked list is sorted alphabetically by student names.
|
||||
|
||||
Hints:
|
||||
How to find the position to insert?
|
||||
Stop iterating over the linked list at the element before the one you want to insert.
|
||||
In the visualization above, we insert "Benedikt" after "Andreas" and before "Daniel". Stop at "Andreas" and change the pointers accordingly.
|
||||
Consider the case of adding the student in the middle of the linked list, but also at the end and at the head (index to insert = 0)
|
||||
Have a look at the testcases
|
||||
|
||||
Implement the following functions:
|
||||
|
||||
-> insertSorted(Student *list, Student *new_student)
|
||||
|
||||
This function takes two arguments:
|
||||
i) a pointer to the current list of students (list),
|
||||
ii) a pointer to the students to insert into the list.
|
||||
Add the student into the existing linked list at the correct position.
|
||||
The linked list is sorted alphabetically by name.
|
||||
The function should return the head of the linked list.
|
||||
|
||||
-> freeStudents(Student *list)
|
||||
|
||||
Free all students in the linked list.
|
||||
This is tested with valgrind checks at testcase 2 and 3.
|
||||
The function should not return anything.
|
||||
|
||||
Specifications
|
||||
Use dynamic memory allocation
|
||||
The program must compile and run without memory leaks/errors.
|
||||
Use the existing Linked List.
|
||||
You don't need to modify the structs or the print function.
|
||||
You don't have to consider the case where no more memory is available.
|
||||
*******************************************************************************/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
typedef struct Student
|
||||
{
|
||||
char name_[32];
|
||||
struct Student *next_;
|
||||
} Student;
|
||||
|
||||
Student* createStudent(char* name)
|
||||
{
|
||||
Student *s = malloc(sizeof(Student));
|
||||
if (!s) return NULL;
|
||||
strcpy(s->name_, name);
|
||||
s->next_ = NULL;
|
||||
return s;
|
||||
}
|
||||
|
||||
void printStudents(Student *list)
|
||||
{
|
||||
Student *cur = list;
|
||||
int index = 0;
|
||||
while (cur != NULL)
|
||||
{
|
||||
printf("%d: %s\n", index++, cur->name_);
|
||||
cur = cur->next_;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: write your code here
|
||||
Student *insertSorted(Student *list, Student *new_student)
|
||||
{
|
||||
Student *current = list;
|
||||
Student *previous = NULL;
|
||||
|
||||
while(current != NULL && strcmp(current->name_, new_student->name_) <= 0)
|
||||
{
|
||||
previous = current;
|
||||
current = current->next_;
|
||||
}
|
||||
|
||||
if(previous == NULL)
|
||||
{
|
||||
new_student->next_ = current;
|
||||
list = new_student;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_student->next_ = current;
|
||||
previous->next_ = new_student;
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
void freeStudents(Student *list)
|
||||
{
|
||||
if (!list) return;
|
||||
|
||||
freeStudents(list->next_);
|
||||
free(list);
|
||||
list = NULL;
|
||||
}
|
||||
// TODO: write your code here
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int test;
|
||||
printf("Enter tc: ");
|
||||
scanf("%d", &test);
|
||||
if(test == 1)
|
||||
{
|
||||
// test adding at the second and third position
|
||||
Student* s1 = createStudent("Andreas");
|
||||
Student* s2 = createStudent("Daniel");
|
||||
s1->next_ = s2;
|
||||
|
||||
Student* to_add1 = createStudent("Benedikt");
|
||||
Student* to_add2 = createStudent("Clemens");
|
||||
|
||||
s1 = insertSorted(s1, to_add1);
|
||||
s1 = insertSorted(s1, to_add2);
|
||||
printStudents(s1);
|
||||
//freeStudents(s1); // uncomment that after you implemented the function
|
||||
}
|
||||
else if(test == 2)
|
||||
{
|
||||
// test adding at same first character (T)
|
||||
Student* s1 = createStudent("Benjamin");
|
||||
Student* s2 = createStudent("Tanja");
|
||||
Student* s3 = createStudent("Thomas");
|
||||
s1->next_ = s2;
|
||||
s2->next_ = s3;
|
||||
|
||||
Student* to_add1 = createStudent("Toni");
|
||||
Student* to_add2 = createStudent("Tamim");
|
||||
|
||||
s1 = insertSorted(s1, to_add1);
|
||||
s1 = insertSorted(s1, to_add2);
|
||||
printStudents(s1);
|
||||
//freeStudents(s1); // uncomment that after you implemented the function
|
||||
}
|
||||
else if(test == 3)
|
||||
{
|
||||
// test adding in the beginning and end of the LL
|
||||
Student* s1 = createStudent("Lenon");
|
||||
Student* s2 = createStudent("Margarita");
|
||||
s1->next_ = s2;
|
||||
|
||||
Student* to_add1 = createStudent("Julia");
|
||||
Student* to_add2 = createStudent("Kilian");
|
||||
|
||||
s1 = insertSorted(s1, to_add1);
|
||||
s1 = insertSorted(s1, to_add2);
|
||||
printStudents(s1);
|
||||
//freeStudents(s1); // uncomment that after you implemented the function
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
25
cpp/exercism/01-basics/01-hello_world.cpp
Normal file
25
cpp/exercism/01-basics/01-hello_world.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
Instructions
|
||||
|
||||
The classical introductory exercise. Just say "Hello, World!".
|
||||
|
||||
"Hello, World!" is the traditional first program for beginning programming in a new language or environment.
|
||||
|
||||
The objectives are simple:
|
||||
|
||||
Modify the provided code so that it produces the string "Hello, World!".
|
||||
Run the test suite and make sure that it succeeds.
|
||||
Submit your solution and check it at the website.
|
||||
|
||||
If everything goes well, you will be ready to fetch your first real exercise.
|
||||
*/
|
||||
|
||||
#include "hello_world.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace hello_world {
|
||||
|
||||
string hello() { return "Goodbye, Mars!"; }
|
||||
|
||||
} // namespace hello_world
|
||||
77
cpp/exercism/01-basics/02-lasagna.cpp
Normal file
77
cpp/exercism/01-basics/02-lasagna.cpp
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
Instructions
|
||||
|
||||
Lucian's girlfriend is on her way home and he hasn't cooked their anniversary dinner!
|
||||
|
||||
In this exercise, you're going to write some code to help Lucian
|
||||
cook an exquisite lasagna from his favorite cookbook.
|
||||
|
||||
You have four tasks, all related to the time spent cooking the lasagna.
|
||||
|
||||
1. Define the expected oven time in minutes
|
||||
|
||||
Define the ovenTime() function that does not take any arguments
|
||||
and returns how many minutes the lasagna should be in the oven.
|
||||
According to the cookbook, the expected oven time is 40 minutes:
|
||||
|
||||
ovenTime();
|
||||
// => 40
|
||||
|
||||
2. Calculate the remaining oven time in minutes
|
||||
|
||||
Define the remainingOvenTime(int actualMinutesInOven) function that takes
|
||||
the actual minutes the lasagna has been in the oven as an argument and
|
||||
returns how many minutes the lasagna still has to remain in the oven,
|
||||
based on the expected oven time in minutes from the previous task.
|
||||
|
||||
remainingOvenTime(30);
|
||||
// => 10
|
||||
|
||||
3. Calculate the preparation time in minutes
|
||||
|
||||
Define the preparationTime(int numberOfLayers) function that takes the number
|
||||
of layers you added to the lasagna as an argument and returns how many minutes
|
||||
you spent preparing the lasagna, assuming each layer takes you 2 minutes to prepare.
|
||||
|
||||
preparationTime(2);
|
||||
// => 4
|
||||
|
||||
4. Calculate the elapsed time in minutes
|
||||
|
||||
Define the elapsedTime(int numberOfLayers, int actualMinutesInOven) function
|
||||
that takes two arguments:
|
||||
- first argument is number of layers you added to the lasagna
|
||||
- second argument is number of minutes the lasagna has been in the oven
|
||||
The function should return how many minutes you've worked on cooking the lasagna,
|
||||
which is the sum of the preparation time in minutes,
|
||||
and the time in minutes the lasagna has spent in the oven at the moment.
|
||||
|
||||
elapsedTime(3, 20);
|
||||
// => 26
|
||||
*/
|
||||
|
||||
// ovenTime returns the amount in minutes that the lasagna should stay in the
|
||||
// oven.
|
||||
int ovenTime() {
|
||||
return 40;
|
||||
}
|
||||
|
||||
/* remainingOvenTime returns the remaining
|
||||
minutes based on the actual minutes already in the oven.
|
||||
*/
|
||||
int remainingOvenTime(int actualMinutesInOven) {
|
||||
return ovenTime() - actualMinutesInOven;
|
||||
}
|
||||
|
||||
/* preparationTime returns an estimate of the preparation time based on the
|
||||
number of layers and the necessary time per layer.
|
||||
*/
|
||||
int preparationTime(int numberOfLayers) {
|
||||
return 2 * numberOfLayers;
|
||||
}
|
||||
|
||||
// elapsedTime calculates the total time spent to create and bake the lasagna so
|
||||
// far.
|
||||
int elapsedTime(int numberOfLayers, int actualMinutesInOven) {
|
||||
return preparationTime(numberOfLayers) + actualMinutesInOven;
|
||||
}
|
||||
113
cpp/exercism/01-basics/about.md
Normal file
113
cpp/exercism/01-basics/about.md
Normal file
@@ -0,0 +1,113 @@
|
||||
# About
|
||||
|
||||
To set off the C++ journey we are starting with variables, function calls, and comments.
|
||||
|
||||
## Comments
|
||||
|
||||
Comments come in two flavors: single- and multi-line.
|
||||
Everything that comes after `//` on the same line is ignored by the compiler.
|
||||
Multi-line comments are also known as C-style comments.
|
||||
They are surrounded by `/*` and `*/`.
|
||||
Anything that comes between these will be ignored as well.
|
||||
|
||||
## Variables
|
||||
|
||||
C++ is a typed language.
|
||||
All types need to be known at compile time, and you generally need to state them explicitly.
|
||||
A variable's type cannot change.
|
||||
An integer variable with the name `years` can be declared like this:
|
||||
|
||||
```cpp
|
||||
int years;
|
||||
```
|
||||
|
||||
It is good practice to initialize variables upon declaration.
|
||||
C++ offers different mechanisms to do so.
|
||||
The version with the curly braces is more in line with modern C++, but the equal-sign version is also very common.
|
||||
|
||||
```cpp
|
||||
int tomatoes{80};
|
||||
int potatoes = 40;
|
||||
```
|
||||
|
||||
~~~~exercism/caution
|
||||
C++ does allow using uninitialized variables.
|
||||
Until the variable is deliberately set, it is undefined and might contain anything.
|
||||
To avoid used-before-set errors and undefined behavior it is adviseable to **always initialize**.
|
||||
Undefined behavior can crash your program at the worst possible moment, while it was running fine previously.
|
||||
It cannot be stressed enough: avoid undefined behavior at all cost.
|
||||
~~~~
|
||||
|
||||
## Arithmetic Operations
|
||||
|
||||
Arithmetic operators like `*`, `+`, or `-` can be part of an expression like `3 * 2` or `tomatoes + potatoes`.
|
||||
|
||||
## Updating Variables
|
||||
|
||||
You can reassign variables, as long as they keep their type:
|
||||
|
||||
```cpp
|
||||
tomatoes = tomatoes - 5; // tomatoes is now 75
|
||||
potatoes = (32 * 2) + 11; // potatoes is now 75 as well
|
||||
```
|
||||
|
||||
## Functions
|
||||
|
||||
Functions have a name, a return type and a (possibly empty) parameter list.
|
||||
An example of a function named `always_fortyseven` that would always return 47 would look like this:
|
||||
|
||||
```cpp
|
||||
int always_fortyseven() {
|
||||
return 47;
|
||||
}
|
||||
```
|
||||
|
||||
Here is `vip_fee`, which has one parameter:
|
||||
```cpp
|
||||
int vip_fee(int standard_fee) {
|
||||
/*
|
||||
vip_fee calculates the vip fee based on the standard_fee.
|
||||
*/
|
||||
int vip_multi{3};
|
||||
return standard_fee * vip_multi;
|
||||
}
|
||||
```
|
||||
|
||||
Or `total_fee`, a function with three parameters and a call to another function.
|
||||
|
||||
```cpp
|
||||
int total_fee(int vips, int adults, int kids) {
|
||||
/*
|
||||
total_fee calculates the total price for a group of VIP and adult guests with kids.
|
||||
Kids get a flat discount on the standard fee.
|
||||
VIP guest fees are calculated by calling vip_fee.
|
||||
*/
|
||||
int standard_fee{30};
|
||||
int kids_discount{15};
|
||||
|
||||
int kids_total_fee = kids * (standard_fee - kids_discount);
|
||||
int vips_total_fee = vips * vip_fee(standard_fee);
|
||||
int adult_total_fee = adults * standard_fee;
|
||||
|
||||
return vips_total_fee + adult_total_fee + kids_total_fee;
|
||||
}
|
||||
```
|
||||
|
||||
Functions in C++ do not return the value of the last statement like in some other languages.
|
||||
The `return` keyword is required for the code to compile.
|
||||
|
||||
### Whitespace
|
||||
|
||||
Whitespace is used for formatting source code and includes spaces, tabs, or newlines.
|
||||
As the compiler ignores unnecessary whitespace, you can use it to structure your code.
|
||||
Smart use of whitespace can improve the readability of your code.
|
||||
There are different formatting standards, but these are all conventional and not enforced by the compiler.
|
||||
|
||||
```cpp
|
||||
// Formatting makes it easier to find bugs
|
||||
|
||||
int eggs_yolks = 3;
|
||||
int yeast = 15;
|
||||
|
||||
int flour=500;int sugar=200;// compact, but difficult to read
|
||||
```
|
||||
Reference in New Issue
Block a user