K08 Δομές Δεδομένων και Τεχνικές Προγραμματισμού
Κώστας Χατζηκοκολάκης
In most programming languages whitespace is ignored
The exact style is not important, no need to be “dogmatic” about it
But it is very important to be consistent
// C++ style
// στα Ελληνικά
void foo() {
int a = 1; // μικρά comments στην ίδια γραμμή
}
Ctrl-/
in VS Code)// Στην ίδια γραμμή με την εντολή που τα ανοίγει
void foo() {
for(unsigned int i = 0; i < ...; i++) {
...
}
// Για μικρές εντολές το παρακάτω είναι ok (χωρίς κατάχρηση)
if(condition)
do_something();
}
One tab for each level
Alternative option: 4 spaces
Don't mix the two
// Το * κολλητά με τον τύπο (όχι με το όνομα)
int* foo(char* param) {
int* pointer = &var;
...
}
Conceptually, int*
is a type.
// Μία δήλωση ανά γραμμή, επαναλαμβάνουμε τον τύπο
// Επίσης, δηλώνουμε μεταβλητές στο σημείο και το scope που χρειάζονται!
void foo() {
int var1 = 1;
int var2 = 3;
...
int var3 = 3; // δε χρειάζεται πιο πάνω
if(condition) {
int var4 = 4; // var4 ορατό μόνο μέσα στο if
...
}
for(unsigned int i = 0; i < N; i++) { // i ορατό μόνο μέσα στο for
int var5 = 5;
...
}
}
lowercase_with_underscores
CamelCase
UPPERCASE
a
, b
, c
, …)// ADTList.h
// Οι σταθερές αυτές συμβολίζουν εικονικούς κόμβους στην αρχή/τέλος.
#define LIST_BOF (ListNode)0
#define LIST_EOF (ListNode)0
// Λίστες και κόμβοι αναπαριστώνται από τους τύπους List και ListNode, αντίστοιχα.
typedef struct list* List;
typedef struct list_node* ListNode;
// Δημιουργεί και επιστρέφει μια νέα λίστα.
List list_create(DestroyFunc destroy_value);
// Προσθέτει έναν νέο κόμβο __μετά__ τον node με περιεχόμενο value.
void list_insert_next(List list, ListNode node, Pointer value);
// Αφαιρεί τον __επόμενο__ κόμβο από τον node.
void list_remove_next(List list, ListNode node);
main
Advantages
git push
)#include "acutest.h" // Απλή βιβλιοθήκη για unit testing
#include "stats.h"
void test_find_min(void) {
int array[] = { 3, 1, -1, 50 };
TEST_ASSERT(stats_find_min(array, 4) == -1);
TEST_ASSERT(stats_find_min(array, 3) == -1);
TEST_ASSERT(stats_find_min(array, 2) == 1);
TEST_ASSERT(stats_find_min(array, 1) == 3);
TEST_ASSERT(stats_find_min(array, 0) == INT_MAX);
}
void test_find_max(void) {
int array[] = { 3, 1, -1, 50 };
TEST_ASSERT(stats_find_max(array, 4) == 50);
TEST_ASSERT(stats_find_max(array, 3) == 3);
TEST_ASSERT(stats_find_max(array, 2) == 3);
TEST_ASSERT(stats_find_max(array, 1) == 3);
TEST_ASSERT(stats_find_max(array, 0) == INT_MIN);
}
// Λίστα με όλα τα tests προς εκτέλεση
TEST_LIST = {
{ "find_min", test_find_min },
{ "find_max", test_find_max },
{ NULL, NULL } // τερματίζουμε τη λίστα με NULL
};
lcov
: a test coverage tool for Csample-project
cd tests
make coverage
firefox coverage/index.html
valgrind ./program