Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 2744, средняя оценка - 4.89
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
#1

Задачи для тренировки и лучшего понимания - C++

15.07.2010, 05:53. Просмотров 348083. Ответов 1272
Метки нет (Все метки)

Ребят. Кто-нибудь может дать задачу для тренировки? Приблизительно по всему курсу С++. Буду благодарен за сложную задачу, но которую способен сделать новичок-любитель. Затраты сил-времени не важно. Главное, чтобы это было интересно и не слишком рутинно. + Если найдется человек который даст задачу просьба помогать с кодом, который я буду себя скидывать. Не переписывать за меня, но указывать на ошибки и желательно объяснять. Заранее спасибо.

Список задач, решение которых присутствует в данной теме:
41
Лучшие ответы (59)
Сообщение: #857841 Сообщение: #857861 Сообщение: #858352 Сообщение: #859371 Сообщение: #860160 Сообщение: #860255 Сообщение: #860259 Сообщение: #860317 Сообщение: #860368 Сообщение: #860466 Сообщение: #860508 Сообщение: #860720 Сообщение: #861091 Сообщение: #862174 Сообщение: #862617 Сообщение: #867259 Сообщение: #870298 Сообщение: #872053 Сообщение: #876456 Сообщение: #880114 Сообщение: #882889 Сообщение: #884418 Сообщение: #886414 Сообщение: #886989 Сообщение: #887733 Сообщение: #888464 Сообщение: #888487 Сообщение: #888941 Сообщение: #888947 Сообщение: #889040 Сообщение: #889450 Сообщение: #889587 Сообщение: #891772 Сообщение: #891790 Сообщение: #891862 Сообщение: #897758 Сообщение: #897782 Сообщение: #906325 Сообщение: #907991 Сообщение: #943672 Сообщение: #943700 Сообщение: #967735 Сообщение: #1053777 Сообщение: #1054209 Сообщение: #1083853 Сообщение: #1083928 Сообщение: #1131058 Сообщение: #1131359 Сообщение: #1273743 Сообщение: #1275465 Сообщение: #1276743 Сообщение: #1279215 Сообщение: #1282583 Сообщение: #1309088 Сообщение: #1315633 Сообщение: #1366395 Сообщение: #1550164 Сообщение: #1603678 Сообщение: #1604364
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2010, 05:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задачи для тренировки и лучшего понимания (C++):

Прошу примеров для понимания INDY - C++ Builder
Уважаемые коллеги и братья по интересу. Прошу примеров использования Indy UDP Server (TIdUDPServer) и Indy UDP Client (TIdUDPClient) для...

Ищу примеры для понимания взаимодействия Callback + event - C++ WinAPI
Господа, подкиньте плиз какой-нибудь пример для понимания взаимодействия Callback+event С самими Callback функциями вроде разобрался, а...

Элементарные программы, для лучшего понимания языка... - C++
Здравствуйте. Вот сегодня решил что пора изучать с++. Есть пару задач. Начал решать и уже на первой запоролся( суть в том чтобы определить...

Нужны задачи для тренировки - C++
Здравствуйте киньте пожалуйста задания по с++ для человека начинающего изучать Turbo с++

Нужны задачи для тренировки - C++
Киньте задачки на классы......а то в самоучителе, по которому я учу Сишку....приведены задачки, касающиеся только математики.....сами...

Нужны простые задачи для тренировки - C++
Добрый день всем:) Наверное подобных тем как я тут сотни,но всё же. Начал изучать С++(так как необходим для универа)в дальнейшем...

1272
Evg
Эксперт CАвтор FAQ
17937 / 6166 / 411
Регистрация: 30.03.2009
Сообщений: 16,929
Записей в блоге: 27
08.08.2010, 15:41 #631
Цитата Сообщение от nikkka Посмотреть сообщение
Ведья там у меня все token-ы разделены пробелами, а значит и отличать их легче...
Это некий кривой подход. Понятно, что в процессе обучения этого достаточно для понимания общих принципов. Но это некое теоретическое программирование. Практическое заключается в том, что в реальной жизни у тебя ничто и никогда не будет разделено пробелами. И никто тебе не гарантирует, что выражение всегда будет корректным. Например, если подать что-то типа "a++++b", то скорее всего твоя программа загнётся, а было бы гораздо полезнее, если бы она выдала ошибку. И не просто выдала, а ещё и показала место. Ведь когда ты ошибаешься при написании программы компилятор тебе показывает место ошибки. А если бы компилятор просто говорил что "у тебя где-то есть ошибка" или вообще молча умирал, то такой компилятор нужно просто выбросить на помойку
1
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
08.08.2010, 15:47 #632
Как создать массив указателей-на-char?
0
Evg
Эксперт CАвтор FAQ
17937 / 6166 / 411
Регистрация: 30.03.2009
Сообщений: 16,929
Записей в блоге: 27
08.08.2010, 15:50 #633
C
1
char* a[10];
1
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
08.08.2010, 15:51 #634
Evg, а выделить память под него не надо??
0
MikeSoft
Эксперт С++
3800 / 1776 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
08.08.2010, 15:53 #635
nikkka, это массив указателей.
Если у вас уже есть реальный объект, можно выполнить присваивание и не выделять память.
Если нужно создать новые объекты, то выделение необходимо.
1
Evg
Эксперт CАвтор FAQ
17937 / 6166 / 411
Регистрация: 30.03.2009
Сообщений: 16,929
Записей в блоге: 27
08.08.2010, 15:58 #636
Цитата Сообщение от nikkka Посмотреть сообщение
Evg, а выделить память под него не надо??
Когда задаёшься подобными вопросами с указателями, то мысленно представь себе такой код.

C
1
2
3
4
5
6
7
8
9
10
/* С точки зрения хранения данных указатель ничем не отличается от другого
 * типа, а потому чтобы звёздочка не смущала, сделаем некий "абстрактный" тип */
typedef type char*;
 
/* Массив из 10 элементов нашего абстрактного типа. Работать с ним так же,
 * как и с массивом int'ов - объявили и всё, а память компилятор выделит */
type a[10];
 
/* Вместо "type" подставляем "char*" и получаем то же самое, но без typedef'а */
char* a[10];
1
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
08.08.2010, 16:09 #637
MikeSoft, Evg, ну вот, смотрите. Я хочу разбить данную строку на отдельные слова (последовательности символов без пробела) и загнать каждое слово в соответствуещий элемент массива. Но программа застревает... В чем дело??
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>
#include <conio.h>
int main()
{
    int sizee=0;
    std::string s=" a bc def ghik ";
    for(int j=0;j<s.length();j++)
        if(s[j]==' ')
            sizee++;
    char *c[sizee-1];
    int k=0;
    int isfree=0;
    for(int i=0;i<s.length();i++)
    {
        if(s[i]==' ')
        {
            k=i+1;
            while(s[k]!=' ')
            {    
                c[isfree][k+1-i]=s[k];
                k++;
            }
            isfree++;
        }
    }
    for(int l;l<sizee-1;l++)
        std::cout<<c[l]<<"\n";
    getch();
    return 0;
}
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
08.08.2010, 16:16 #638
nikkka, а зачем было писать свой класс для работы со стеком?

Добавлено через 2 минуты
Цитата Сообщение от nikkka Посмотреть сообщение
загнать каждое слово в соответствуещий элемент массива.
забудь про массивы, используй std::vector(а лучше std::list).
0
MikeSoft
Эксперт С++
3800 / 1776 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
08.08.2010, 16:32 #639
nikkka, проблема в том, что память для хранения не была выделена.
Вот вам небольшой примерчик по выделению:
Выделение динамической памяти для двумерного массива.

Тема о разбиении строки на слова уже поднималась: Разделить строку на слова., разбить строку в массив, http://www.cyberforum.ru/cpp-beginne...ead109904.html
1
easybudda
Модератор
Эксперт CЭксперт С++
9663 / 5613 / 952
Регистрация: 25.07.2009
Сообщений: 10,776
08.08.2010, 16:36 #640
Цитата Сообщение от nikkka Посмотреть сообщение
Я хочу разбить данную строку на отдельные слова (последовательности символов без пробела) и загнать каждое слово в соответствуещий элемент массива.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <sstream>
#include <list>
#include <algorithm>
#include <iterator>
    
int main(){
    std::string str;
    
    while ( true ){
        std::cout << "\nString: ";
        std::getline(std::cin, str);
        if ( str.empty() )
            break;
        std::istringstream ist(str);
        std::list<std::string> list;
        std::copy(std::istream_iterator<std::string>(ist), std::istream_iterator<std::string>(), std::back_inserter(list));
        std::cout << "List of tokens:" << std::endl;
        std::copy(list.begin(), list.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    }
    
    return 0;
}
2
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
08.08.2010, 16:52 #641
Опять! Теперь череез простую матрицу...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <string>
#include <conio.h>
int main()
{
    int sizee=0;
    std::string s=" a bc def ghik ";
    for(int j=0;j<s.length();j++)
        if(s[j]==' ')
            sizee++;
    char c[sizee-1][10];
    int k=0;
    int isfree=0;
    for(int i=0;i<s.length();i++)
    {
        if(s[i]==' ')
        {
            k=i+1;
            std::cout<<s[k];
            while(s[k]!=' ')
            {    
                c[isfree][k+1-i]=s[k];
                k++;
            }
            isfree++;
        }
    }
    for(int l;l<sizee-1;l++)
        std::cout<<c[l]<<"\n";
    getch();
    return 0;
}
1
easybudda
Модератор
Эксперт CЭксперт С++
9663 / 5613 / 952
Регистрация: 25.07.2009
Сообщений: 10,776
08.08.2010, 17:15 #642
Цитата Сообщение от nikkka Посмотреть сообщение
Опять! Теперь череез простую матрицу...
На С++ по-моему незачем так делать... вот на С с массивом:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define DELIM " \t\n"
    
int main(void){
    char buf[BUFSIZ], **array, * p;
    int cnt, i;
    
    while ( 1 ){
        printf("\nString: ");
        if ( ! fgets(buf, BUFSIZ, stdin) ){
            perror("fgets");
            exit(1);
        }
        if ( *buf == '\n' )
            break;
        
        array = NULL;
        cnt = 0;
        for ( p = strtok(buf, DELIM); p; p = strtok(NULL, DELIM) ){
            if ( ( array = (char**)realloc(array, sizeof(char*) * (cnt + 1)) ) == NULL ){
                perror("realloc");
                exit(1);
            }
            if ( ( array[cnt++] = strdup(p) ) == NULL ){
                perror("strdup");
                exit(1);
            }
        }
        if ( ! array || ! cnt ){
            fprintf(stderr, "No words found!\n");
            exit(1);
        }
        printf("*** %d words:\n", cnt);
        for ( i = 0; i < cnt; ++i )
            printf("%s\n", array[i]);
        
        for ( i = 0; i < cnt; ++i )
            free(array[i]);
        free(array);
    }
    
    exit(0);
}
1
Evg
Эксперт CАвтор FAQ
17937 / 6166 / 411
Регистрация: 30.03.2009
Сообщений: 16,929
Записей в блоге: 27
08.08.2010, 17:28 #643
nikkka, ты объявил массив указателй, но указатели у тебя все неинициализированы (т.е. память под них не выделена). В процессе нарезки на токены ты должен найти в строке позицию начала токена, затем позицию конца токена, после чего ты можешь вычислить длину строки для токена, после этого нужно заказать память такого размера и только потом скопировать в эту память значение токена

Это что касается того, что ты сейчас написал. Но в реальной жизни у тебя не будет разделения пробелами. Т.е. при твоём подходе ты не сможешь вычислить "2+3", потому как у тебя это одним токеном запишется.

На первом этапе можно, например, считать, что пробелы у нас быть должны. При таком ограничении можно тренироваться по части построения всех этих польских записей. Если с ними ты уже разобрался, то для тебя это уже пройденный этап, а потому надо думать о правильной реализации грамматического анализатора (нарезалки токенов). Если с польскими записями ещё не разобрался - работай пока при условии, что есть пробелы, а с аккуратной (а точнее, правильной) реализацией парсера будешь думать потом

Добавлено через 48 секунд
Я писал про пост #657. А тут ты скорее всего NULL-терминатор потерял
1
nikkka
Мат в 32 хода
235 / 170 / 8
Регистрация: 10.09.2009
Сообщений: 1,096
08.08.2010, 17:31 #644
Цитата Сообщение от Evg Посмотреть сообщение
А тут ты скорее всего NULL-терминатор потерял
чегой?
0
Evg
Эксперт CАвтор FAQ
17937 / 6166 / 411
Регистрация: 30.03.2009
Сообщений: 16,929
Записей в блоге: 27
08.08.2010, 17:32 #645
Цитата Сообщение от nikkka Посмотреть сообщение
чегой?
В строках 20-24 ты формируешь массив char'ов. Чтобы он нормально мог трактоваться как строка, в конец надо ещё налепить символ '\0'
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2010, 17:32
Привет! Вот еще темы с ответами:

Какая база требуется для понимания C++? - C++
Доброго времени суток! Возникло желание научиться работать в Си, но одолели смутные сомнения. Каюсь, ничего сложнее Pascal ABC в школьные...

Нужен пример рекурсивной функции для понимания ее назначения и практической пользы - C++
Не могу понять пользу рекурсии, может ли кто привести код в пример.

Киньте задачки для тренировки - C++
Хочу порешать задачки по C++......нужны либо книжки с задачками - либо ваши примеры.....желательно (если книжки) - чтобы там и решение...

Дайте задания для тренировки - C++
День добрый. Учу C++. Я уверен, что тут есть люди которые с ним отлично знаком и работают. Можете ли вы накидать заданий, возможно из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
645
Yandex
Объявления
08.08.2010, 17:32
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru