Loading...
itonev avatar itonev 22 Точки

Здравейте,

Ако мога да ползвам темата и да задам въпрос.

Това е моята версия на програмата:

Всичко друго дефакто ми се получава с изключние на сортирането :)

Моя изход е exe,a ABBA

/* 
 * File:   06_palindrom.c
 * Author: mdv
 *
 * Created on November 1, 2015, 3:31 PM
 */

#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>

int main() {
    char* line = NULL;
    size_t size = 0;
    ssize_t len = getline(&line, &size, stdin);
    if (len == -1) {
        perror("Failed Reading");
        exit(1);
    }

    char** words = calloc(len * 2, sizeof (char*));
    if (!words) {
        printf("%s", strerror(errno));
        exit(1);
    }
    for (int i = 0; i < len + 2; i++) {
        words[i] = calloc(len + 10, sizeof (char));
        if (!words[i]) {
            printf("%s", strerror(errno));
            exit(1);
        }
    }
    char *token = strtok(line, ",.?!");
    int index = -1;
    int is_current_palindrom;
    while (token) {
        is_current_palindrom = 1;
        size_t token_len = strlen(token);
        for (int i = 0; i < token_len; i++) {
            if (token[i] != token[token_len - (i + 1)]) {
                is_current_palindrom = 0;
                break;
            }
        }
        if (is_current_palindrom) {
            index++;
            strcpy(words[index], token);
        }
        token = strtok(NULL, " ,.?!");
    }

    char* tmpbuff = calloc(100, sizeof (char));
     if (!tmpbuff) {
        printf("%s", strerror(errno));
        exit(1);
     }

    for (int i = 1; i < index; i++) {
        for (int j = 0; j < index; j++) {
            if (strcmp(words[j], words[j + 1]) < 0) {
                strcpy(tmpbuff, words[j]);
                strcpy(words[j], words[j + 1]);
                strcpy(words[j + 1], tmpbuff);
            }
        }
    }



    for (int i = 0; i <= index; i++) {
        printf(" %s,", words[i]);
    }

    //  free memory

    for (int i = 0; i < len + 2; i++) {
        free(words[i]);
    }

    free(words);
    free(line);
    free(tmpbuff);

    return 0;
}


 

0
itonev avatar itonev 22 Точки

IliqnK  сега разгледах задачата за копирането(тоест 7-ма). По условие там пише: Try doing it without a buffer, by returning a string created in the body of the function. Ти как тълкуваш това ? Ако правилно съм разбрал решението ти не ползваш ли точно буфер ?

0
IliqnK avatar IliqnK 30 Точки

 Try doing it without a buffer, by returning a string created in the body of the function. Does it work? Think why it does or it doesn't. How can you modify it to work/break it.

Това е по-условие, т.е. аз го разбирам опитай без буфер и после с буфер. Като гледах и сигнатурата при извикване на функцията си трябва и буфер според мен и затова съм го направил така. Може и да греша, но така ми се видя по-правилно.

0
IliqnK avatar IliqnK 30 Точки

Ако при if (strcmp(words[j], words[j + 1]) < 0), го направиш ">=", ще ти ги сортира на обратно, т.е "а, exe, ABBA". За да постигнеш желания резултат, трябва да ги проверяваш по lowercase например, а да промеяш местата с оригиналният стринг. Поне аз така съм го направил.

2
itonev avatar itonev 22 Точки

Понеже аз още си решвам моите си задачки по стрингове и понякога ги сравнявам с твоите.

И затова поетапно откривам нещо ново.

Та на задача 13 ред 9-ти имаш неволна грешка. 

Твоята функция не иска параметър, но ти и подаваш. 

Обаче тествах програмата - работи

Обяснението е, че вероятно компилаторът тихомълком игнорира параметъра.

Но ако си имал нещо друго на идея, ще ми е интересно да чуя

Визирам това 

char *read_line();

int main() 
{
    char *line;
    line = read_line(&line);
    printf("%s", line);
    
    free(line);
    
    return 0;
}

 

1
fristgerb avatar fristgerb 50 Точки

Празните скоби при декларация могат да бъдат използваните за предаване на неопределен брой аргументи към функция, която е дефинирана след повикванията към нея. Следния код се компилира и работи:

#include 

void print_args ();

int
main (int argc, char *argv[])
{
  print_args ();
  print_args (5);
  print_args (5, 10);
  print_args (5, 10, 15);
  print_args (5, 10, 15, 27);

  return 0;
}

void
print_args (int a, int b, int c)
{
  printf ("%d %d %d\n", a, b, c);
}

Горното е валиден и работещ код, като аргументите имат garbage стойности, когато не са подадени. Не знам дали се случва нещо нередно, ако са подадени повече аргументи от параметри.

Ако сложиш декларацията на функцията над повикванията към нея и използваш грешен брой аргументи, програмата вече няма да се компилира. Следното не работи:

#include 

void print_args ();

void
print_args (int a, int b, int c)
{
  printf ("%d %d %d\n", a, b, c);
}

int
main (int argc, char *argv[])
{
  print_args ();
  print_args (5);
  print_args (5, 10);
  print_args (5, 10, 15);
  print_args (5, 10, 15, 27);

  return 0;
}

Не мога да ти кажа в какви ситуации е добре да се ползва тази фунционалност и дали изобщо някога е добре. Май е само остатък от едно време и работи само за да има обратна съвместимост. Досега не съм виждал код който да се възползва от тези функционалност.

1
08/11/2015 11:02:44
fristgerb avatar fristgerb 50 Точки

Ето и моите решения: http://www.libtec.org/dev/softuni/11-characters_and_strings/

С Mercurial може да ги изтеглите така, в терминал, заедно с всички други мои домашни:

hg clone http://www.libtec.org/dev/softuni/

Този път не съм решавал бонус задачите, понеже губя интерес и вече не ми се решават подобни задачи.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.