Upload files to 'Exercise 1 - Stack (Week 2)'
This commit is contained in:
parent
22345553f0
commit
0336a17252
78
Exercise 1 - Stack (Week 2)/Ex1.cpp
Normal file
78
Exercise 1 - Stack (Week 2)/Ex1.cpp
Normal file
@ -0,0 +1,78 @@
|
||||
/*******************************************************************************************************
|
||||
|
||||
The following code is the output produced from the Lab 1 literate program
|
||||
|
||||
This is produced by taking the code from section 1 and substituting the named code chunks into this.
|
||||
|
||||
This process is repeated until all the chunk references are filled.
|
||||
|
||||
For example:
|
||||
the reference <The main program 3> is replaced with the code in section 3:
|
||||
|
||||
int main( )
|
||||
{
|
||||
<Variables of main 4>
|
||||
<Open and validate the input File 6>
|
||||
<Read the File into the stack 8>
|
||||
<Pop the words from the stack 10>i
|
||||
<Finish up 11>
|
||||
}
|
||||
|
||||
Where chunks have the same name they are collected in the order they appear into the final code.
|
||||
|
||||
This means that I can write the program in an order that makes sense as it is read and still get a
|
||||
program that compiles and executes.
|
||||
|
||||
For more detailed explanations see the cwebman pdf file.
|
||||
|
||||
*******************************************************************************************************/
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
using namespace std;
|
||||
void push(char word[]);
|
||||
char*pop();
|
||||
bool isEmpty();
|
||||
const int STACK_SIZE= 100;
|
||||
const int WORD_SIZE= 20;
|
||||
char stack[STACK_SIZE][WORD_SIZE];
|
||||
int top= 0;
|
||||
int main()
|
||||
{
|
||||
char filename[20];
|
||||
ifstream fin;
|
||||
char word[WORD_SIZE];
|
||||
cerr<<"Please enter the name of the input file: ";
|
||||
cin>>filename;
|
||||
fin.open(filename);
|
||||
if(!fin)
|
||||
{
|
||||
cerr<<"Error opening file "<<filename<<". Program will exit."<<endl;
|
||||
return 0;
|
||||
}
|
||||
while(fin>>word){
|
||||
push(word);
|
||||
}
|
||||
while(!isEmpty())cout<<pop()<<endl;
|
||||
}
|
||||
void push(char word[])
|
||||
{
|
||||
if(top==STACK_SIZE)return;
|
||||
int i= 0;
|
||||
do
|
||||
{
|
||||
stack[top][i]= word[i];
|
||||
i++;
|
||||
}
|
||||
while(word[i]);
|
||||
top++;
|
||||
return;
|
||||
}
|
||||
char*pop()
|
||||
{
|
||||
return stack[--top];
|
||||
}
|
||||
bool isEmpty()
|
||||
{
|
||||
return top==0;
|
||||
}
|
BIN
Exercise 1 - Stack (Week 2)/Ex1.pdf
Normal file
BIN
Exercise 1 - Stack (Week 2)/Ex1.pdf
Normal file
Binary file not shown.
BIN
Exercise 1 - Stack (Week 2)/Ex1_Prof_Solution.pdf
Normal file
BIN
Exercise 1 - Stack (Week 2)/Ex1_Prof_Solution.pdf
Normal file
Binary file not shown.
185
Exercise 1 - Stack (Week 2)/ex1.c
Normal file
185
Exercise 1 - Stack (Week 2)/ex1.c
Normal file
@ -0,0 +1,185 @@
|
||||
/* License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html
|
||||
*
|
||||
* Exercise 1 - Implementing a Stack (Week 2)
|
||||
* Name: Manish
|
||||
* Student Login: *****
|
||||
*
|
||||
* Compile as:
|
||||
* $ gcc -std=c11 -Wall -o ex1 ex1.c
|
||||
*/
|
||||
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
// 20 character + 1 for null-terminating character '\0'
|
||||
char stack[1000][21];
|
||||
const size_t stack_size = 1000;
|
||||
const size_t word_len = 20;
|
||||
size_t stack_index = 0; // index pointer to 0 implies empty
|
||||
|
||||
|
||||
void push(char * string);
|
||||
char* pop();
|
||||
char* top();
|
||||
bool isEmpty();
|
||||
void input_line(char* string[], size_t *size);
|
||||
void readline(FILE* file, char* string[], size_t *size);
|
||||
// void input_word(char* string[], size_t *size);
|
||||
// void readword(FILE* file, char* string[], size_t *size);
|
||||
void baseread(
|
||||
FILE* file,
|
||||
char* string[],
|
||||
size_t *size,
|
||||
const char * terminating_characters);
|
||||
|
||||
|
||||
int main (void)
|
||||
{
|
||||
printf("Enter file name: ");
|
||||
char* filename;
|
||||
size_t filename_len = 0;
|
||||
input_line(&filename, &filename_len);
|
||||
|
||||
FILE* file = fopen(filename, "r");
|
||||
if (!file)
|
||||
{
|
||||
perror(filename);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// Read and push words to stack
|
||||
char word[word_len+1];
|
||||
size_t index;
|
||||
char c;
|
||||
while(!feof(file) && !ferror(file))
|
||||
{
|
||||
index = 0;
|
||||
while(
|
||||
(c = fgetc(file)) != EOF
|
||||
&& !ferror(file)
|
||||
&& memchr("\n\r ", c, 4) == NULL)
|
||||
{
|
||||
if (index < word_len)
|
||||
{
|
||||
word[index++] = c;
|
||||
}
|
||||
}
|
||||
word[index] = '\0';
|
||||
|
||||
if (index > 0) // non-empty string
|
||||
{
|
||||
push(word);
|
||||
}
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
|
||||
// Print and pop words from stack
|
||||
while(!isEmpty())
|
||||
{
|
||||
printf("%s ", pop());
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void push(char * string)
|
||||
{
|
||||
if (stack_index < stack_size)
|
||||
{
|
||||
strcpy(stack[stack_index++], string);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
char* pop()
|
||||
{
|
||||
if (!isEmpty())
|
||||
{
|
||||
return stack[--stack_index];
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
char* top()
|
||||
{
|
||||
if (!isEmpty())
|
||||
{
|
||||
return stack[stack_index-1];
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
bool isEmpty()
|
||||
{
|
||||
return stack_index <= 0;
|
||||
}
|
||||
|
||||
|
||||
inline void input_line(char* string[], size_t *size)
|
||||
{
|
||||
readline(stdin, string, size);
|
||||
}
|
||||
|
||||
|
||||
inline void readline(FILE* file, char* string[], size_t *size)
|
||||
{
|
||||
baseread(file, string, size, "\n\r");
|
||||
}
|
||||
|
||||
|
||||
// inline void input_word(char* string[], size_t *size)
|
||||
// {
|
||||
// readword(stdin, string, size);
|
||||
// }
|
||||
|
||||
|
||||
// inline void readword(FILE* file, char* string[], size_t *size)
|
||||
// {
|
||||
// baseread(file, string, size, "\n\r ");
|
||||
// }
|
||||
|
||||
|
||||
// Used only for receiving filename
|
||||
void baseread(
|
||||
FILE* file,
|
||||
char* string[],
|
||||
size_t *size,
|
||||
const char * terminating_characters)
|
||||
{
|
||||
size_t term_chars_len = strlen(terminating_characters);
|
||||
size[0] = 32;
|
||||
*string = malloc(size[0]);
|
||||
// 1 reserved for null-terminating character '\0'
|
||||
size_t memory_free = *size - 1;
|
||||
size_t str_index = 0;
|
||||
char c;
|
||||
while ((c = fgetc(file)) != EOF
|
||||
&& !ferror(file)
|
||||
&& memchr(terminating_characters, c, term_chars_len) == NULL)
|
||||
{
|
||||
if (--memory_free <= 0)
|
||||
{
|
||||
memory_free = *size;
|
||||
*size *= 2;
|
||||
*string = realloc(*string, *size);
|
||||
if (!*string)
|
||||
{
|
||||
perror("ERROR: Not enough memory to read entire stdin");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
string[0][str_index++] = c;
|
||||
}
|
||||
string[0][str_index++] = '\0';
|
||||
*size = str_index;
|
||||
*string = realloc(*string, *size); // free extra memory
|
||||
}
|
Loading…
Reference in New Issue
Block a user