Task 2 is done
This commit is contained in:
parent
23eff9e484
commit
cd08e7ba3a
20 changed files with 453 additions and 0 deletions
42
2025.05.23/02Ex/Makefile
Normal file
42
2025.05.23/02Ex/Makefile
Normal 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
83
2025.05.23/02Ex/io_node.c
Normal 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
12
2025.05.23/02Ex/io_node.h
Normal 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
67
2025.05.23/02Ex/main.c
Normal 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
14
2025.05.23/02Ex/node.h
Normal 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
20
2025.05.23/02Ex/solve.c
Normal 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
8
2025.05.23/02Ex/solve.h
Normal 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
16
2025.05.23/02Ex/status.h
Normal 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
39
2025.05.23/tests/file_test.sh
Executable 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
|
||||
|
13
2025.05.23/tests/inputs/input_1.txt
Executable file
13
2025.05.23/tests/inputs/input_1.txt
Executable file
|
@ -0,0 +1,13 @@
|
|||
pffbvlv
|
||||
ajinkzj
|
||||
ujfehpd
|
||||
ntncamuam
|
||||
kgjb
|
||||
gfdnncjrop
|
||||
fwi
|
||||
zzzzzzz
|
||||
zzzzzzz
|
||||
wpfa
|
||||
udjjxc
|
||||
zzzzzzz
|
||||
jsmk
|
8
2025.05.23/tests/inputs/input_10.txt
Executable file
8
2025.05.23/tests/inputs/input_10.txt
Executable file
|
@ -0,0 +1,8 @@
|
|||
aaa
|
||||
aaa
|
||||
bbb
|
||||
bbb
|
||||
ccc
|
||||
ccc
|
||||
ccc
|
||||
ddd
|
10
2025.05.23/tests/inputs/input_2.txt
Executable file
10
2025.05.23/tests/inputs/input_2.txt
Executable file
|
@ -0,0 +1,10 @@
|
|||
aaa
|
||||
wvr
|
||||
dseeky
|
||||
dseekyz
|
||||
dseekyzz
|
||||
ioeenuz
|
||||
qptsadk
|
||||
scpgynd
|
||||
xqovzvmxvr
|
||||
xqovzvmxvrz
|
7
2025.05.23/tests/inputs/input_3.txt
Executable file
7
2025.05.23/tests/inputs/input_3.txt
Executable file
|
@ -0,0 +1,7 @@
|
|||
aaa
|
||||
ccc
|
||||
bbb
|
||||
ddd
|
||||
bbb
|
||||
eee
|
||||
ddd
|
9
2025.05.23/tests/inputs/input_4.txt
Executable file
9
2025.05.23/tests/inputs/input_4.txt
Executable file
|
@ -0,0 +1,9 @@
|
|||
aaa
|
||||
ccc
|
||||
bbb
|
||||
bbb
|
||||
eee
|
||||
ddd
|
||||
fff
|
||||
ddd
|
||||
ccc
|
8
2025.05.23/tests/inputs/input_5.txt
Executable file
8
2025.05.23/tests/inputs/input_5.txt
Executable file
|
@ -0,0 +1,8 @@
|
|||
a
|
||||
ab
|
||||
abc
|
||||
abcd
|
||||
abcde
|
||||
abc
|
||||
abb
|
||||
ac
|
8
2025.05.23/tests/inputs/input_6.txt
Executable file
8
2025.05.23/tests/inputs/input_6.txt
Executable file
|
@ -0,0 +1,8 @@
|
|||
aaa
|
||||
aaa
|
||||
bbb
|
||||
bbb
|
||||
ccc
|
||||
ccc
|
||||
ccc
|
||||
ddd
|
10
2025.05.23/tests/inputs/input_7.txt
Executable file
10
2025.05.23/tests/inputs/input_7.txt
Executable file
|
@ -0,0 +1,10 @@
|
|||
aaa
|
||||
aaa
|
||||
bbb
|
||||
ccc
|
||||
ddd
|
||||
eee
|
||||
fff
|
||||
ggg
|
||||
hhh
|
||||
hhh
|
7
2025.05.23/tests/inputs/input_8.txt
Executable file
7
2025.05.23/tests/inputs/input_8.txt
Executable file
|
@ -0,0 +1,7 @@
|
|||
aaa
|
||||
ccc
|
||||
bbb
|
||||
ddd
|
||||
bbb
|
||||
eee
|
||||
ddd
|
9
2025.05.23/tests/inputs/input_9.txt
Executable file
9
2025.05.23/tests/inputs/input_9.txt
Executable file
|
@ -0,0 +1,9 @@
|
|||
aaa
|
||||
ccc
|
||||
bbb
|
||||
bbb
|
||||
eee
|
||||
ddd
|
||||
fff
|
||||
ddd
|
||||
ccc
|
63
2025.05.23/tests/main_test.sh
Executable file
63
2025.05.23/tests/main_test.sh
Executable 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 "Тест завершен"
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue