Task 2 is done

This commit is contained in:
AZEN-SGG 2025-05-18 19:39:04 +03:00
parent 23eff9e484
commit cd08e7ba3a
20 changed files with 453 additions and 0 deletions

42
2025.05.23/02Ex/Makefile Normal file
View file

@ -0,0 +1,42 @@
WFLAGS = -fstack-protector-all -W -Wall -Wextra -Wunused \
-Wempty-body -Wlogical-op -Wold-style-declaration -Wmissing-parameter-type \
-Wignored-qualifiers -Winit-self -Wshadow -Wtype-limits \
-Wpointer-arith -Wformat-security -Wmissing-format-attribute -Wformat=1 \
-Wdeclaration-after-statement -Wbad-function-cast -Wnested-externs \
-Wmissing-prototypes -Wmissing-declarations -Wold-style-definition \
-Wcast-align -Werror -pedantic -pedantic-errors -Wfloat-equal \
-Wwrite-strings -Wno-long-long -std=gnu99 -Wstrict-prototypes \
-Wmissing-field-initializers -Wpointer-sign
LDFLAGS = -std=gnu99 -mfpmath=sse -O3
LDLIBS = -lm
ifeq ($(OS),Windows_NT)
EXE = exe
CLEAN = del
LDLIBS += -lssp
else
EXE = out
CLEAN = rm -f
endif
TARGET = a02.$(EXE)
OBJ = main.o solve.o io_node.o
%.o: %.c
gcc $(WFLAGS) $(LDFLAGS) -c $< -o $@
$(TARGET): $(OBJ)
gcc $^ -o $@ $(LDLIBS)
# Отладочная сборка (gdb)
gdb: LDFLAGS = -std=gnu99 -mfpmath=sse -g -O0
gdb: clean $(TARGET)
# Профилировочная сборка (gprof)
prof: LDFLAGS += -pg
prof: LDLIBS += -pg
prof: clean $(TARGET)
clean:
$(CLEAN) *.o *$(EXE)

83
2025.05.23/02Ex/io_node.c Normal file
View file

@ -0,0 +1,83 @@
#include "io_node.h"
#include "node.h"
#include "status.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int get_length (node * head)
{
node *curr;
int i = 0;
for (curr = head; curr; curr=curr->next)
i++;
return i;
}
void delete_list (node * head)
{
node *curr, *next;
for (curr = head; curr; curr = next) {
next = curr->next;
free(curr->string);
free(curr);
}
}
io_status read_list (node **list, const char *filename)
{
FILE *fp = 0;
char *string, buf[LEN_STR];
node *head, *lunit, *unit;
head = lunit = unit = NULL;
if (!(fp = fopen(filename, "r")))
return ERR_OPEN;
while (fgets(buf, LEN_STR, fp))
{
unit = (node *)malloc(sizeof(node));
if (!unit) {
fclose(fp);
delete_list(head);
return ERR_MEM;
}
unit->next = NULL;
buf[strcspn(buf, "\n")] = '\0';
string = strdup(buf);
if (!string) {
fclose(fp);
free(unit);
delete_list(head);
return ERR_MEM;
}
unit->string = string;
if (!lunit)
head = unit;
else
lunit->next = unit;
lunit = unit;
}
*list = head;
fclose(fp);
return SUCCESS;
}
void print_list (node *head, const int p)
{
for (int i = 0; head && i < p; head = head->next, i++)
printf("%s\n", head->string);
}

12
2025.05.23/02Ex/io_node.h Normal file
View file

@ -0,0 +1,12 @@
#ifndef IO_NODE_H
#define IO_NODE_H
#include "node.h"
#include "status.h"
int get_length (node * head);
void delete_list (node * head);
io_status read_list (node **list, const char *filename);
void print_list (node *head, const int p);
#endif

67
2025.05.23/02Ex/main.c Normal file
View file

@ -0,0 +1,67 @@
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <float.h>
#include "solve.h"
#include "node.h"
#include "io_node.h"
#include "status.h"
/* ./a01.out p filename */
int main (int argc, char *argv[])
{
node *head;
char *name;
double t;
int p, res, task = 2;
io_status ret;
if (
!((argc == 3) &&
sscanf(argv[1], "%d", &p) == 1 &&
argv[2])
) {
fprintf(stderr, "Usage: %s p filename\n", argv[0]);
return -1;
}
name = argv[2];
ret = read_list(&head, name);
do {
switch (ret) {
case SUCCESS:
continue;
case ERR_OPEN:
fprintf (stderr, "%s '%s'!\n", ERR_MSG_OPEN, name);
break;
case ERR_READ:
fprintf (stderr, "%s '%s'!\n", ERR_MSG_READ, name);
break;
case ERR_MEM:
fprintf (stderr, "%s!\n", ERR_MSG_MEM);
break;
}
delete_list(head);
return -2;
} while (0);
print_list(head, p);
t = clock();
res = t2_solve(head);
t = (clock() - t) / CLOCKS_PER_SEC;
delete_list(head);
if (res < 0) {
fprintf (stderr, "%s : Task = %d Undefined error Elapsed = %.2f\n", argv[0], task, t);
return -3;
} else {
fprintf (stdout, "%s : Task = %d Result = %d Elapsed = %.2f\n", argv[0], task, res, t);
return 0;
}
}

14
2025.05.23/02Ex/node.h Normal file
View file

@ -0,0 +1,14 @@
#ifndef NODE_H
#define NODE_H
#define LEN_STR 1234
struct _node;
typedef struct _node
{
char *string;
struct _node *next;
} node;
#endif

20
2025.05.23/02Ex/solve.c Normal file
View file

@ -0,0 +1,20 @@
#include "solve.h"
#include "node.h"
#include <string.h>
int t2_solve (node *head)
{
char *last = head->string;
int count = 1;
for (head = head->next; head; head = head->next)
{
if (strcmp(head->string, last) > 0)
count++;
last = head->string;
}
return count;
}

8
2025.05.23/02Ex/solve.h Normal file
View file

@ -0,0 +1,8 @@
#ifndef SOLVE_H
#define SOLVE_H
#include "node.h"
int t2_solve (node *head);
#endif

16
2025.05.23/02Ex/status.h Normal file
View file

@ -0,0 +1,16 @@
#ifndef STATUS_H
#define STATUS_H
#define ERR_MSG_MEM "Error: Not enough memory"
#define ERR_MSG_OPEN "Error: Cannot open file"
#define ERR_MSG_READ "Error: Cannot read file"
typedef enum
{
SUCCESS,
ERR_OPEN = -1,
ERR_READ = -2,
ERR_MEM = -3
} io_status;
#endif

39
2025.05.23/tests/file_test.sh Executable file
View file

@ -0,0 +1,39 @@
script_name="$(basename "$0")"
script_path="$(realpath "$0")"
script_dir="$(dirname "$script_path")"
maxpr="100"
mkdir -p tests
if [ -f Makefile ]; then
echo "Компиляция..."
make clean
make
fi
outlog="$(pwd)/tests/out_$script_name.log"
errlog="$(pwd)/tests/err_$script_name.log"
rm -f "$outlog" "$errlog"
echo "Тест запущен..."
for npr in {1..7} ; do
num=$(printf "%02d" "$npr")
prog="a$num.out"
if [ -f $prog ]; then
for ntst in {1..10} ; do
cmd="./$prog $maxpr $script_dir/inputs/input_$ntst.txt"
echo "$cmd"
eval "$cmd"
done
fi
done >$outlog 2>$errlog
echo "Тест записан в $outlog"
echo "Ошибки записаны в $errlog"
echo "Тест завершен"
make clean

View file

@ -0,0 +1,13 @@
pffbvlv
ajinkzj
ujfehpd
ntncamuam
kgjb
gfdnncjrop
fwi
zzzzzzz
zzzzzzz
wpfa
udjjxc
zzzzzzz
jsmk

View file

@ -0,0 +1,8 @@
aaa
aaa
bbb
bbb
ccc
ccc
ccc
ddd

View file

@ -0,0 +1,10 @@
aaa
wvr
dseeky
dseekyz
dseekyzz
ioeenuz
qptsadk
scpgynd
xqovzvmxvr
xqovzvmxvrz

View file

@ -0,0 +1,7 @@
aaa
ccc
bbb
ddd
bbb
eee
ddd

View file

@ -0,0 +1,9 @@
aaa
ccc
bbb
bbb
eee
ddd
fff
ddd
ccc

View file

@ -0,0 +1,8 @@
a
ab
abc
abcd
abcde
abc
abb
ac

View file

@ -0,0 +1,8 @@
aaa
aaa
bbb
bbb
ccc
ccc
ccc
ddd

View file

@ -0,0 +1,10 @@
aaa
aaa
bbb
ccc
ddd
eee
fff
ggg
hhh
hhh

View file

@ -0,0 +1,7 @@
aaa
ccc
bbb
ddd
bbb
eee
ddd

View file

@ -0,0 +1,9 @@
aaa
ccc
bbb
bbb
eee
ddd
fff
ddd
ccc

63
2025.05.23/tests/main_test.sh Executable file
View file

@ -0,0 +1,63 @@
script_name="$(basename "$0")"
iter="1000"
eps="1e-14"
if [ "$#" -ne 1 ]; then
echo "Не указан как параметр номер программы"
exit 1
fi
num=$(printf "%02d" "$1")
prog="a$num.out"
mkdir -p tests
if [ -f Makefile ]; then
echo "Компиляция..."
make clean
make
fi
if [ ! -f $prog ]; then
echo "Отсутствует исполняемый файл... [$prog]"
echo "Завершение..."
exit 2
fi
outlog="$(pwd)/tests/out_a${num}_$script_name.log"
errlog="$(pwd)/tests/err_a${num}_$script_name.log"
rm -f "$outlog" "$errlog"
echo "Тест запущен..."
i=2
for (( k = 3 ; k < 7; k++ )); do
for (( a = -100 ; a < -40 ; a++ )); do
for (( b = -9 ; b < 10 ; b++ )); do
x="$(echo "$a / 10" | bc -l)"
y="$(echo "$b / 10" | bc -l)"
cmd="./$prog $poly_deg $x $y $eps $iter $k"
echo "$cmd"
echo "$i $(eval "$cmd")"
((i+=2))
done
done
for (( a = -9 ; a < 10 ; a++ )); do
for (( b = 11 ; b < 100 ; b++ )); do
x="$(echo "$a / 10" | bc -l)"
y="$(echo "$b / 10" | bc -l)"
cmd="./$prog $poly_deg $x $y $eps $iter $k"
echo "$cmd"
echo "$i $(eval "$cmd")"
((i+=2))
done
done
done >$outlog 2>$errlog
echo "Тест записан в $outlog"
echo "Ошибки записаны в $errlog"
echo "Тест завершен"