From b558aaa76dc56a1f31e10ff816df15217672cc5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B0=D0=B2=D0=B5=D0=BB=20=D0=A0=D0=BE=D0=B4=D0=B8?= =?UTF-8?q?=D0=BE=D0=BD=D0=BE=D0=B2?= Date: Fri, 28 Nov 2025 18:58:15 +0700 Subject: [PATCH] proxmos --- procxmos/.env | 4 + procxmos/manip.sh | 178 ++++++++++ procxmos/manip.sh~ | 178 ++++++++++ procxmos/test.sh | 47 +++ procxmos/test.sh~ | 47 +++ proglabs/lab10/func.c~ | 558 ++++++++++++++++++++++++++++++ proglabs/lab9/func/.get.c.swp | Bin 12288 -> 0 bytes proglabs/lab9/func/.massive.c.swp | Bin 12288 -> 0 bytes proglabs/lab9/prog | Bin 0 -> 47264 bytes 9 files changed, 1012 insertions(+) create mode 100644 procxmos/.env create mode 100755 procxmos/manip.sh create mode 100755 procxmos/manip.sh~ create mode 100755 procxmos/test.sh create mode 100755 procxmos/test.sh~ create mode 100644 proglabs/lab10/func.c~ delete mode 100644 proglabs/lab9/func/.get.c.swp delete mode 100644 proglabs/lab9/func/.massive.c.swp create mode 100755 proglabs/lab9/prog diff --git a/procxmos/.env b/procxmos/.env new file mode 100644 index 0000000..039d3d4 --- /dev/null +++ b/procxmos/.env @@ -0,0 +1,4 @@ +USERNAME=iv522s18@freeipa +PASSWORD='513218Az!' +ADDR=91.196.245.217 + diff --git a/procxmos/manip.sh b/procxmos/manip.sh new file mode 100755 index 0000000..2bf1504 --- /dev/null +++ b/procxmos/manip.sh @@ -0,0 +1,178 @@ +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Load the .env file that lives beside the script +set -a # automatically export assignments +source "${SCRIPT_DIR}/.env" +set +a + +# ---- login ---- +login=$(curl -s -k -d "username=${USERNAME}&password=${PASSWORD}" \ + "https://${ADDR}:8006/api2/json/access/ticket") +echo "=== LOGIN RESPONSE ===" +echo "$login" +echo "======================" + +# Extract ticket & CSRF +TICKET=$(echo "$login" | grep -o '"ticket":"[^"]*' | cut -d'"' -f4) +CSRF=$(echo "$login" | grep -o '"CSRFPreventionToken":"[^"]*' | cut -d'"' -f4) + +echo "Ticket: $TICKET" +echo "CSRF : $CSRF" +echo "-------------------" + +# ------------------------------------------------- +# Helper: wait for a Proxmox task to finish +# ------------------------------------------------- +wait_task() { + local upid="$1" + local timeout=${2:-40} # seconds (default 2 min) + local interval=2 + local elapsed=0 + + while (( elapsed < timeout )); do + result=$(curl -s -k \ + -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/nodes/${ADDR}/tasks/${upid}/status") + status=$(echo "$result" | jq -r '.data.status') + exitstatus=$(echo "$result" | jq -r '.data.exitstatus') + + if [[ "$status" == "stopped" ]]; then + if [[ "$exitstatus" == "OK" ]]; then + return 0 + else + echo "Task $upid finished with error: $exitstatus" >&2 + return 1 + fi + fi + + sleep "$interval" + (( elapsed += interval )) + done + + echo "Task $upid timed out after $timeout seconds" >&2 + return 1 +} +# ------------------------------------------------- + +force_stop_vm_ssh() { + local vmid=$1 + local node=$2 # e.g. pve01 + + # SSH to the node (assumes key‑based auth or passwordless login) + ssh root@"${node}" bash </dev/null | awk '{print \$1}') + [[ -n "\$pid" ]] && kill -9 "\$pid" + rm -f "\$lock" + fi + + # Stop the VM + qm stop "${vmid}" + # Wait until it reports stopped + while qm status "${vmid}" | grep -q running; do sleep 1; done +EOF + echo "VM $vmid on node $node is now stopped." +} + +while true; do + echo "Select an option:" + echo "1) get nodes" + echo "2) get vm" + echo "3) create vm" + echo "4) power vm" + echo "5) delete vm" + echo "6) Exit" + printf "Enter choice [1-6]: " + + read choice +case $choice in + 1) +# Show only VM IDs and names +curl -s -k -b "PVEAuthCookie=${TICKET}" -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/cluster/resources?type=vm" | +jq '.data[] | {vmid, name, status, node}' + + ;; + 2) + curl -s -k -b "PVEAuthCookie=${TICKET}" -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/cluster/resources?type=vm" | jq . + ;; + 3) + echo "PrintID:" + read id + echo "PintNAME:" + read name + curl -k -X POST \ + -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + -d "vmid=${id}&name=${name}&memory=2048&net0=virtio,bridge=vmbr0" \ + https://${ADDR}:8006/api2/json/nodes/${ADDR}/qemu + ;; + 4) + echo "PrintID:" + read id + curl -k -X POST \ + -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + https://${ADDR}:8006/api2/json/nodes/${ADDR}/qemu/${id}/status/start + ;; + 5) + echo "PrintID:"; read id + + # ------------------------------------------------- + # 1️⃣ Find the node that actually hosts the VM + # ------------------------------------------------- + VM_INFO=$(curl -s -k -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/cluster/resources?type=vm") + VM_NODE=$(echo "$VM_INFO" | jq -r --arg id "$id" \ + '.data[] | select(.vmid == ($id|tonumber)) | .node') + if [[ -z "$VM_NODE" ]]; then + echo "Could not locate VM $id" + continue + fi + echo "VM $id is on node $VM_NODE" + + # ------------------------------------------------- + # 2️⃣ Stop the VM via API and wait for the task + # ------------------------------------------------- + stop_resp=$(curl -s -k -X POST \ + -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/nodes/${VM_NODE}/qemu/${id}/status/stop") + stop_upid=$(echo "$stop_resp" | jq -r '.data') + echo "Stop task UPID: $stop_upid" + + if ! wait_task "$stop_upid"; then + echo "Failed to stop VM $id – aborting delete." + continue + fi + echo "VM $id is now stopped." + + # ------------------------------------------------- + # 3️⃣ Destroy the VM via API and wait for the task + # ------------------------------------------------- + destroy_resp=$(curl -s -k -X POST \ + -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/nodes/${VM_NODE}/qemu/${id}/destroy") + destroy_upid=$(echo "$destroy_resp" | jq -r '.data') + echo "Destroy task UPID: $destroy_upid" + + if wait_task "$destroy_upid"; then + echo "VM $id successfully removed." + else + echo "Failed to destroy VM $id." + fi + ;; + 6) + echo "Goodbye!"; exit 0 + ;; + *) + echo "Invalid choice, try again." + ;; + esac +done diff --git a/procxmos/manip.sh~ b/procxmos/manip.sh~ new file mode 100755 index 0000000..fb92c03 --- /dev/null +++ b/procxmos/manip.sh~ @@ -0,0 +1,178 @@ +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Load the .env file that lives beside the script +set -a # automatically export assignments +source "${SCRIPT_DIR}/.env" +set +a + +# ---- login ---- +login=$(curl -s -k -d "username=${USERNAME}&password=${PASSWORD}" \ + "https://${ADDR}:8006/api2/json/access/ticket") +echo "=== LOGIN RESPONSE ===" +echo "$login" +echo "======================" + +# Extract ticket & CSRF +TICKET=$(echo "$login" | grep -o '"ticket":"[^"]*' | cut -d'"' -f4) +CSRF=$(echo "$login" | grep -o '"CSRFPreventionToken":"[^"]*' | cut -d'"' -f4) + +echo "Ticket: $TICKET" +echo "CSRF : $CSRF" +echo "-------------------" + +# ------------------------------------------------- +# Helper: wait for a Proxmox task to finish +# ------------------------------------------------- +wait_task() { + local upid="$1" + local timeout=${2:-120} # seconds (default 2 min) + local interval=2 + local elapsed=0 + + while (( elapsed < timeout )); do + result=$(curl -s -k \ + -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/nodes/${ADDR}/tasks/${upid}/status") + status=$(echo "$result" | jq -r '.data.status') + exitstatus=$(echo "$result" | jq -r '.data.exitstatus') + + if [[ "$status" == "stopped" ]]; then + if [[ "$exitstatus" == "OK" ]]; then + return 0 + else + echo "Task $upid finished with error: $exitstatus" >&2 + return 1 + fi + fi + + sleep "$interval" + (( elapsed += interval )) + done + + echo "Task $upid timed out after $timeout seconds" >&2 + return 1 +} +# ------------------------------------------------- + +force_stop_vm_ssh() { + local vmid=$1 + local node=$2 # e.g. pve01 + + # SSH to the node (assumes key‑based auth or passwordless login) + ssh root@"${node}" bash </dev/null | awk '{print \$1}') + [[ -n "\$pid" ]] && kill -9 "\$pid" + rm -f "\$lock" + fi + + # Stop the VM + qm stop "${vmid}" + # Wait until it reports stopped + while qm status "${vmid}" | grep -q running; do sleep 1; done +EOF + echo "VM $vmid on node $node is now stopped." +} + +while true; do + echo "Select an option:" + echo "1) get nodes" + echo "2) get vm" + echo "3) create vm" + echo "4) power vm" + echo "5) delete vm" + echo "6) Exit" + printf "Enter choice [1-6]: " + + read choice +case $choice in + 1) +# Show only VM IDs and names +curl -s -k -b "PVEAuthCookie=${TICKET}" -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/cluster/resources?type=vm" | +jq '.data[] | {vmid, name, status, node}' + + ;; + 2) + curl -s -k -b "PVEAuthCookie=${TICKET}" -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/cluster/resources?type=vm" | jq . + ;; + 3) + echo "PrintID:" + read id + echo "PintNAME:" + read name + curl -k -X POST \ + -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + -d "vmid=${id}&name=${name}&memory=2048&net0=virtio,bridge=vmbr0" \ + https://${ADDR}:8006/api2/json/nodes/${ADDR}/qemu + ;; + 4) + echo "PrintID:" + read id + curl -k -X POST \ + -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + https://${ADDR}:8006/api2/json/nodes/${ADDR}/qemu/${id}/status/start + ;; + 5) + echo "PrintID:"; read id + + # ------------------------------------------------- + # 1️⃣ Find the node that actually hosts the VM + # ------------------------------------------------- + VM_INFO=$(curl -s -k -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/cluster/resources?type=vm") + VM_NODE=$(echo "$VM_INFO" | jq -r --arg id "$id" \ + '.data[] | select(.vmid == ($id|tonumber)) | .node') + if [[ -z "$VM_NODE" ]]; then + echo "Could not locate VM $id" + continue + fi + echo "VM $id is on node $VM_NODE" + + # ------------------------------------------------- + # 2️⃣ Stop the VM via API and wait for the task + # ------------------------------------------------- + stop_resp=$(curl -s -k -X POST \ + -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/nodes/${VM_NODE}/qemu/${id}/status/stop") + stop_upid=$(echo "$stop_resp" | jq -r '.data') + echo "Stop task UPID: $stop_upid" + + if ! wait_task "$stop_upid"; then + echo "Failed to stop VM $id – aborting delete." + continue + fi + echo "VM $id is now stopped." + + # ------------------------------------------------- + # 3️⃣ Destroy the VM via API and wait for the task + # ------------------------------------------------- + destroy_resp=$(curl -s -k -X POST \ + -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/nodes/${VM_NODE}/qemu/${id}/destroy") + destroy_upid=$(echo "$destroy_resp" | jq -r '.data') + echo "Destroy task UPID: $destroy_upid" + + if wait_task "$destroy_upid"; then + echo "VM $id successfully removed." + else + echo "Failed to destroy VM $id." + fi + ;; + 6) + echo "Goodbye!"; exit 0 + ;; + *) + echo "Invalid choice, try again." + ;; + esac +done diff --git a/procxmos/test.sh b/procxmos/test.sh new file mode 100755 index 0000000..8097cd6 --- /dev/null +++ b/procxmos/test.sh @@ -0,0 +1,47 @@ +set -euo pipefail +set -x # optional: keep for debugging + +# ------------------------------------------------------------------ +# Determine the directory that contains this script (handles symlinks) +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Load the .env file that lives beside the script +set -a # automatically export assignments +source "${SCRIPT_DIR}/.env" +set +a +# ------------------------------------------------------------------ + +echo "ADDR = ${ADDR}" +echo "USERNAME = ${USERNAME}" +echo "PASSWORD = ${PASSWORD}" + +# ---- login ---- +login=$(curl -s -k -d "username=${USERNAME}&password=${PASSWORD}" \ + "https://${ADDR}:8006/api2/json/access/ticket") +echo "=== LOGIN RESPONSE ===" +echo "$login" +echo "======================" + +# Extract ticket & CSRF +TICKET=$(echo "$login" | grep -o '"ticket":"[^"]*' | cut -d'"' -f4) +CSRF=$(echo "$login" | grep -o '"CSRFPreventionToken":"[^"]*' | cut -d'"' -f4) + +echo "Ticket: $TICKET" +echo "CSRF : $CSRF" +echo "-------------------" + +if [[ -n "$TICKET" && -n "$CSRF" ]]; then + vmlist=$(curl -s -k -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/cluster/resources?type=vm") + echo "=== VM LIST RAW ===" + echo "$vmlist" + echo "====================" + if command -v jq >/dev/null 2>&1; then + echo "=== VM LIST FORMATTED ===" + echo "$vmlist" | jq . + fi +else + echo "Login failed – no ticket/CSRF token." +fi + diff --git a/procxmos/test.sh~ b/procxmos/test.sh~ new file mode 100755 index 0000000..8097cd6 --- /dev/null +++ b/procxmos/test.sh~ @@ -0,0 +1,47 @@ +set -euo pipefail +set -x # optional: keep for debugging + +# ------------------------------------------------------------------ +# Determine the directory that contains this script (handles symlinks) +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Load the .env file that lives beside the script +set -a # automatically export assignments +source "${SCRIPT_DIR}/.env" +set +a +# ------------------------------------------------------------------ + +echo "ADDR = ${ADDR}" +echo "USERNAME = ${USERNAME}" +echo "PASSWORD = ${PASSWORD}" + +# ---- login ---- +login=$(curl -s -k -d "username=${USERNAME}&password=${PASSWORD}" \ + "https://${ADDR}:8006/api2/json/access/ticket") +echo "=== LOGIN RESPONSE ===" +echo "$login" +echo "======================" + +# Extract ticket & CSRF +TICKET=$(echo "$login" | grep -o '"ticket":"[^"]*' | cut -d'"' -f4) +CSRF=$(echo "$login" | grep -o '"CSRFPreventionToken":"[^"]*' | cut -d'"' -f4) + +echo "Ticket: $TICKET" +echo "CSRF : $CSRF" +echo "-------------------" + +if [[ -n "$TICKET" && -n "$CSRF" ]]; then + vmlist=$(curl -s -k -b "PVEAuthCookie=${TICKET}" \ + -H "CSRFPreventionToken: ${CSRF}" \ + "https://${ADDR}:8006/api2/json/cluster/resources?type=vm") + echo "=== VM LIST RAW ===" + echo "$vmlist" + echo "====================" + if command -v jq >/dev/null 2>&1; then + echo "=== VM LIST FORMATTED ===" + echo "$vmlist" | jq . + fi +else + echo "Login failed – no ticket/CSRF token." +fi + diff --git a/proglabs/lab10/func.c~ b/proglabs/lab10/func.c~ new file mode 100644 index 0000000..782b168 --- /dev/null +++ b/proglabs/lab10/func.c~ @@ -0,0 +1,558 @@ +#include "head.h" + + +int queryinput(int *x, int *inquery, int *query){ + setlocale(LC_ALL, ""); + + //INPUT------------------------------------------------- + wint_t ch; + *inquery = 0; + while((ch=getwchar())!=L'\n'&&ch!=L'\t'&&ch!=L' '&&*inquery= L'а' && sym <= L'я') || + (sym >= L'А' && sym <= L'Я')) + { + x[0]++; + c++; + continue; + } + if (sym >= L'0' && sym <= L'9') + { + x[1]++; + c++; + continue; + } + if (sym > 32 && sym <= 47) { + x[sym - 28]++; + c++; + continue; + } + if (sym > 58 && sym <= 64) { + x[sym - 38]++; + c++; + continue; + } + x[33]++; + c++; + } + //________________________________________________________ + + + return 0; +} + +void func1 (char **f, int *x,int inquery, int *query){ + switch(funcReturn(f[2])){ + case 1://Определяет среднюю длину слова в тексте + { + if(x[32]){ + x[30]/=x[31]; + printf("\n\tСредняя длинна слова - %d",x[30]); + } + else{ + x[30]+=inquery; + x[31]++; + } + break; + } + + case 2://Подсчитывает количество слов, длина которых не превышает 5 символов. + { + if(x[32]){ + printf("\n\tВсего слов <5 букв - %d",x[30]); + } + else if(inquery<5)x[30]++; + break; + } + + case 3://Определяет количество букв после первого и до последнего слова. + { + if(x[31]); + else {x[30]-=x[0];x[31]=1;} + if(x[32]){x[30]+=x[0];printf("\n\tКолл-во букв после 1 и до последнего слова - %d",x[30]);} + break; + } + case 4://Удаляет первую букву каждого слова и выводит результат. + { + if(x[32]); + else + put(x,1,inquery,query); + break; + } + + case 5://определяет, сколько в заданном тексте слов, начинающихся с буквы,заданной пользователем. + { + if(x[32]) + printf("\n\t Слов начинающихся на %c - %d",f[4][0],x[30]); + else + if(query[0]==f[3][0])x[30]++; + break; + } + case 6://находит сумму всех цифр в введенном предложении. (если в тексте нетцифр, добавить) предусмотреть обработку шаблонов (12word, wo12rd,word12) + { + if(x[32]) + printf("\n\t Найти сумму всех цифр - %d",x[31]); + else + for(int i=0;i=L'0'&&query[i]<=L'9'){ + x[30]=(x[30]*100)+(query[i]-L'0'); + } + } + x[31]+=x[30]; + x[30]=0; + break; + } + + case 7:// вставляет восклицательный знак в конце каждой строки текста. + { + if(x[32]); + else{ + if(query[inquery-1]==L'\n'){ + if(query[inquery-2]==L'!'||query[inquery-2]==L'?'||query[inquery-2]==L'.'||query[inquery-2]==L',') + query[inquery-2]=L'!'; + else {query[inquery-1]=L'!';query[inquery]=L'\n';} + x[L'!'-28]++;inquery++;} + put(x,0,inquery,query); + } + break; + } + + case 8://проверяет заканчивается ли каждая строка точкой и добавляет ее при необходимости, считает сколько точек было добавлено + { + if(x[32]); + else{ + if(query[inquery-1]==L'\n'){ + if(query[inquery-2]==L'!'||query[inquery-2]==L'?'||query[inquery-2]==L'.'||query[inquery-2]==L',') + query[inquery-2]=L'.'; + else {query[inquery-1]=L'.';query[inquery]=L'\n';} + x[L'!'-28]++;inquery++;} + put(x,0,inquery,query); + } + break; + } + + case 9://определяет сколько раз в введенной строке встречается слово,заданное пользователем. + { + if(x[32]) + printf("\n\t Слово %s встречается - %d раз",f[4],x[30]); + else{ + if(last(inquery,query))inquery--; + x[30]+=strquery(f[3],query);} + break; + } + + case 10://подсчитывает количество букв в каждом втором слове. + { + x[34] = x[0] - x[33]; + if(x[32]){ + x[31]=x[33]-x[31]; + printf("\n\t Сумма букв в четных словах - %d",x[31]); + } + else{ + if(x[30]%2==0) + x[31]+=x[34]; + x[33]+=x[33]; + x[30]++; + } + break; + } + } +} + +void func2 (char **f, int *x,int inquery, int *query,int *ch){ + switch(funcReturn(f[2])){ + case 1: //Подсчитывает, сколько слов начинается с последней буквы первого слова. + { + if(x[32]){ + printf("\n\t Количество букв начинающихся с %c - %d",x[32],x[34]); + } + else if(!(x[31])){x[31]=0;x[33]=query[inquery-1];} + else{if (query[0]==x[33]){x[34]++;}} + break; + } + case 2: //Подсчитывает, сколько слов имеют указанную пользователем длину. + { + if(x[32])printf("\n\t Слов имеющих указанную длинну - %d",x[30]); + else{ + if(last(inquery,query))inquery--; + if(strquery(f[3],query))x[30]++; + } + break; + } + case 3: //Печатает самое длинное слово в тексте. + { + if(x[32]){printf("\n\t");} + else{ + if(x[31]1){ + x[30]=x[2]; + x[31]=x[3]; + x[33]=x[4]; + put(x,0,inquery,query); + break; + } + } + } + break; + } + case 7: //Вычисляет количество слов между первой и последней запятой во введенном тексте + { + if(x[32]){printf("\n\tКолличество слов между первой и последней запятой - %d",x[34]);} + else{ + if(x[L','-28]>0){ + x[31]+=inquery; + if(x[L','-28]>x[33]){ + x[34]+=x[31]; + x[33]=x[31]; + x[31]=0; + } + } + } + break; + } + case 8: //Находит два соседних слова, начинающихся с большой буквы + { + if(x[28]); + else{ + if(*query>=L'А'&&*query<=L'Я'){ + x[35]++; + if(x[35]==2){ + x[30]=x[2]; + x[31]=x[3]; + x[33]=x[4]; + x[35]=0; + printf("\n\t"); + put(x,0,x[34],ch); + printf(" - "); + put(x,0,inquery,query); + printf(" | Находятся друг за другом"); + } + for(int i = 0;iтевирП + { + put(x,inquery-1,0,query); + break; + } + case 2: //Делит слово на два и меняет начало с концом. Пример: жук -> кжу,солнце -> нцесол + { + put(x,0,inquery/2,query); + put(x,inquery/2,inquery,query); + break; + } + case 3: //После каждой гласной буквы вставляется буква L'c' и гласная повторяется. Пример: кот ->косот. + { + int alph[20] = {L'а',L'и',L'е',L'ё',L'о',L'у',L'ы',L'э',L'ю',L'я', + L'А',L'И',L'Е',L'Ё',L'О',L'У',L'Ы',L'Э',L'Ю',L'Я'}; + for(int i = 0;i121620, обработать только буквы. + { + x[25]=-1; + for(int i = 0;i= L'а' && query[i] <= L'я'){ + x[25] = (query[i] - L'а') + 1; + if(query[i]>=alphabet[8])x[25]++;} + else if (query[i] == L'ё') + x[25] = 7; + else if (query[i] >= L'А' && query[i] <= L'Я'){ + x[25] = (query[i] - L'А') + 1; + if(query[i]>=alphabet[41])x[25]++;} + else if (query[i] == L'Ё') + x[25] = 7; + if(x[25]!=-1){printf("%d",x[25]);x[25]=-1;} + } + put(x,40,40,query); + break; + } + case 5: //Заменяет буквы верхнего регистра на буквы нижнего и наоборот. Пример: Привет -> пРИВЕТ. + { + for(int i = 0;i32){ + query[i]=alphabet[i-33]; + + } + } + } + put(x,0,inquery,query); + break; + } + /*case 6: //Заменяет буквы на их двоичное представление из таблицы ASCII.Пример: кот ->101010101010111011100010 + { + break; + }*/ + case 7: /*Заменяет букву на заданное смещение в пределах алфавита (шифр + Цезаря), смещение задаётся параметром и может быть положительным или + отрицательным. Пример: кот 3 -> нсх, кот -3 -> злп*/ + { + while(f[3][x[35]]>=L'0'&&f[3][x[35]]<=L'9'){ + x[34] = (x[34]*10)+(f[3][x[35]]-L'0'); + x[35]++; + } + for(int i = 0;i33)x[34]-=33; + if(j+x[34]>=33)x[34]-=33; + query[i]=alphabet[j+x[34]]; + } + + else if(query[i]==alphabet[j]&&j>32){ + while(x[34]>33)x[34]-=33; + if(j+x[34]>=66)x[34]-=33; + query[i]=alphabet[j+33+x[34]]; + } + } + } + put(x,0,inquery,query); + break; + } + case 8: //Делит слово на два и оставляет большую часть. Пример: жук -> к, солнце -> сол + { + if(inquery%2!=0)x[34]=1; + else x[34]=0; + for (int i = 0; i<(inquery/2)+x[34];i++) + x[35] +=query[i]; + for (int i = (inquery/2)+x[34]; ix[36]) + put(x,0,(inquery/2)+x[34],query); + else + put(x,(inquery/2)+x[34],inquery,query); + break; + } + case 9: //Делит слово на два и оставляет меньшую часть. Пример: жук -> жу, солнце -> нце + { + if(inquery%2!=0)x[34]=1; + else x[34]=0; + for (int i = 0; i<(inquery/2)+x[34];i++) + x[35] +=query[i]; + for (int i = (inquery/2)+x[34]; ikot, жук -> zhuk + { + int translit[43]={ + L'a',L'b',L'v',L'g',L'd',L'e' , L'y',/**/L'o' , L'z',/**/L'h' , L'z',L'i',L'y',L'k',L'l',L'm',L'n',L'o', + L'p',L'r',L's',L't',L'u',L'f',L'h',L'c' , L'c',/**/L'h' , L's',/**/L'h' , L's',/**/L'h',/**/L'c',/**/L'h', + L'\'',L'y',L'\'',L'e',L'e' , L'y',/**/L'u' , L'y',/**/L'a'}; + + for(int i =0;i>inquery;i++){ + if( + (query[i] >= alphabet[0] && query[i] <= alphabet[5]) || + (query[i] >= alphabet[8] && query[i] <= alphabet[23]) || + (query[i] >= alphabet[27] && query[i] <= alphabet[30]) || + (query[i] >= alphabet[0+33] && query[i] <= alphabet[5+33]) || + (query[i] >= alphabet[8+33] && query[i] <= alphabet[23+33]) || + (query[i] >= alphabet[27+33] && query[i] <= alphabet[30+33])) + { + query[i]=translit[i]; + } + else if (query[i] != alphabet[26] || query[i] != alphabet[26+33]) + { + for(int z = 0;zinquery) + for(;i>inquery;i--) + printf("%lc",query[i]); + + if(x[30]!=x[2]){putwchar(L'\n');} + if(x[31]!=x[3]){putwchar(L'\t');} + if(x[33]!=x[4]){putwchar(L' ');} + x[30]=x[2]; + x[31]=x[3]; + x[33]=x[4]; +} + + +void printcount(int *x){ + int sum = 0; + printf("\nStatistic"); + printf("\n\t \"Symb\" - [ammount]\n"); + printf("\n\t \"Letters\" - [%d]",x[0]); + printf("\n\t \"Digits\" - [%d]",x[1]); + printf("\n\t \"\\n\" - [%d]",x[2]); + printf("\n\t \"\\t\" - [%d]",x[3]); + printf("\n\t \"space\" - [%d]",x[4]); + + for (int i = 33; i <= 47; i++) { + if (x[i-28] > 10) + printf("\n\t \"%c\" - [%d]", i, x[i-28]); + else + sum+=x[i-28]; + } + + for (int i = 58; i <= 64; i++) { + if(x[i-38]>10) + printf("\n\t \"%c\" = [%d]", i, x[i-32]); + else + sum+=x[i-38]; + } + + printf("\n\t other - [%d]",sum+x[33]); +} + + +int str(char *a, char *b) { + int i = 0; + while(a[i] != L'\0' && b[i] != L'\0') { + if(a[i] != b[i]) return 0; + i++; + } + return a[i] == b[i]; +} + + +int strquery(char *a, int *b){ + + return 0; +} + + +int funcReturn(char *f){ + int swt=0; + if(str(f,"1"))swt=1; + if(str(f,"2"))swt=2; + if(str(f,"3"))swt=3; + if(str(f,"4"))swt=4; + if(str(f,"5"))swt=5; + if(str(f,"6"))swt=6; + if(str(f,"7"))swt=7; + if(str(f,"8"))swt=8; + if(str(f,"9"))swt=9; + if(str(f,"10"))swt=10; + return swt; +} diff --git a/proglabs/lab9/func/.get.c.swp b/proglabs/lab9/func/.get.c.swp deleted file mode 100644 index 0612ead9a4c882328f854b0ca4a8f0938a178822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2O>E;t7>1_^30T-4u?ViyuIitpNo*%=5|Zh%pk1*@dtg~OEM1{EaT-gh6UBDx z(C%{N3Y_2q2yx|%khmZrB;dk}}CldSYk3nQz{C$MaQH z>sl{ey+)g5i{Ls(NcB4Pe|+$B@@az*e|Oz+LK{#2ef9RnmRxlmmC~z-dx-Y;n{ttSr;> zkG^>Ksnkg2fO0@Npd3&RC1>b|uz=z-+ zkbqm@X|M|J2j86`R2)+fMfcHQIu7Jy+0M3E4;0#y-|C}P^Z}0>7 z27CcN26uo5u7Qi72_6II!71=NygCFQfVaVI&;_@^4R9IM0r#{9)TJCy4k!nd1IhvA z!2iI3+l1npcu_nFsMQkR@b8MDP$K_OvhW@Ar*}v6?Bz*=a`^DHv|t?-y$( zV|qz9MM@r;4`1x)o109xbWM{3eY4HX;yiDEG%@@jqCRERZc)EoYx%{Zxi7Lq zPJz#vPMEd{)goG{AnpY{BQeeW{xA*)SeaB_vRkRFxwwLRbY7{c;F_2?ndw2s1hZ8F z-AtHH^)#?I@Q0p($jm`=nWZypTC&XatpLm950o$0ZLiA(>~X(eiLwa_Ze}@Oa?~RH zhMeJa#}zIV+_h|oSUA!Uu>!fQX$!9=cX`Ute;h}YF{(eKn-^-EM)9lOf6j=v2MM-gdMH=2#w(ROU5XsUl&x+oDQ0o zad1F|eG58J8^z9MK`Wb#@>(oH@EXM}FGPeEi{2)yI(&&yn=eLmNK2!5jDyhM4!j;6 zj)HBx%%VJHKYREKiMIvDP4S7%KN diff --git a/proglabs/lab9/func/.massive.c.swp b/proglabs/lab9/func/.massive.c.swp deleted file mode 100644 index 7e1664d0aa6b971239d044e78b29336b7f13ed7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2O>Y}T7{{lG(iBLk;J}G8Y!tkHiDSD|O5+$6p-NODid2cW#1YzEkK+lOU29+B zRG}0h5I2zE3P;3&6B2hMDBSo0AP%S%2PE19AE5kab|-%6u9J#W&`k8pYImM_=9&NV z%&eo>uDyO`m0qmY2-;afez{8dA2T<}!{-U%yB8Xbu)ZX^rnSzXU#nMn->N#HQw_Nt z#t{#zK|C?&J>_sw*&ICR2mY38+2JC7U0m$Op0l`Pg(2T%RcFGBzSRn71s+&|IO;Ae z&64wty4>n>#&h(kCtrJDH+q0pKr5gX&@ARt3$}gCkgrO5d@F_|Es_M z?>s@s-{42^1-Joh@DjKL3~&z?9>Y4& zA!`M+0$PFpkpkBVMZ1pk8Z8{~$myAT#eK5t^9~hXF*CUr(Y*>CI6W(PJECSO{mxl& zfUbbU19kWR}b{z_R1J#d6>einK-jX5ul` zNQ@e7*?xsZevjy7Zpf$u|A={f(V};>P4^=#Ged9Laksm{H>W!n!?DnE`EWCc(yC22 zlZ%3;@VIhy?F|%%@SoQXU)UByJzBwJ`m-D&x}z-OKT4%4dfk|)$jOjIVfpR~w#XC_ zx_%(H7e^V?nta7>@^U%H9u8TnRYNbCoJ-v2Ynk68#>tHBCl!z+c)I<_x{jbYOt3U~ zmkT6f!mK8P81%TyOozGdi(-{ocIuhR!sS35EMf?CEYI^JYBOr{tt}SN`HoRR36_w7 zh5D3ai3N!{hqhCvmXo!p98;>-ie)q1W($Q{Vahb4sjef{FUVA9PL*W3o|oyQ8*6gJ zahJUxSqnQSytZST&)XFdU`}M2^DA{%lkXPOD_%d2mT6wahm56`>iEo=EOYCL1Mtn9 zRru)49CZJpmAtCd(gUa|3wxrPlxS_5~jr2mOFM^3bQ>X%g|pZamUl)YN$HRu%puROhz^y?D(BD zKx`wy9^zaiOdOVp>-2L*I}$&s)NQZrZBQ8^0!;I8P^v0{86RinxaYWWhfza({;Bp1 F@-HKpSiJxM diff --git a/proglabs/lab9/prog b/proglabs/lab9/prog new file mode 100755 index 0000000000000000000000000000000000000000..d5e6ebdefbc729e6f7348a2dec97aea3990e26f4 GIT binary patch literal 47264 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 Q=PXg!xhoE`do2I|0T(*86951J literal 0 HcmV?d00001