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

Морзянка... - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Зачем нужные поразрядные операции. Книга Павловская, Щупак http://www.cyberforum.ru/cpp-beginners/thread47754.html
Решаю задачу из учебника Павловская, Щупак. С++. Программироание на языке высокого уровня. Структурное программирование. Практикум. Часть 1. Семинар 2. Задача 1. стр. 44. Задачу см. в привязанном файле. Кажется, я решила задачу, программа работает. Но мне не понятно, зачем авторы пишут про поразрядные операции И и ИЛИ. Мне удалось обойтись без них. Может кто-нибудь объяснить, почему речь идет...
C++ проблемы с памятью.... с алгоритмом вроде все нормально но вот происходит такая вещи при определенном действии выдается сообщение которое на скриншоте.... потом высвечивается вот эта строка int Put_Reis(FILE *f_reis, MAP *new_marsh,char*tek_data,int num) { int i, j, reis_count,reis_max,chislo_int,god_int,mesyac_int; char chislo, god,mesyac,tmp,dat_update; LIST_REIS *reis=new LIST_REIS; ... http://www.cyberforum.ru/cpp-beginners/thread47753.html
Матрица.Поиск точки C++
У меня есть матрица 25 х 80.Есть функция,которая принимает ссылку на матрицу и текущее расположение(координаты точки). Мне нужно найти данную точку(т.е. отдельный класс создан). Обзор видимости 5 клеток во всех направлениях у текущей точки.Не могу подробно объяснить,рисунок внизу. Мне нужно найти точку данного типа.Причем лучше алгоритм такой,чтобы найти ближайшую точку. У меня есть класс...
C++ Перегрузка + для строк
есть задача перегрузить = и + таким образом чтобы: строка1=срока2+строка3 с = проблем нет. а вот при перегрузке + выдает ошибку при доступе к закрытым данным //STRING2.H #ifndef STRING2_H #define STRING2_H #include <iostream.h> class String
C++ Как подключить к проекту новый файл с функцией http://www.cyberforum.ru/cpp-beginners/thread47701.html
Есть работающий проект на C++ (dll) Хочу в Visual Studio 2008 создать в проекте отдельный файл и в этом файле создать свою функцию которую можно было бы вызывать из существующих файлов Я создал в проекте новый Пустой файл .cpp написал там свою функцию прописал в существующем файле проекта #include "noviy_fail.cpp" но при определении функции в новом фале выскакивают ошибки из существующих...
C++ Выход по ESC Приветствую вас уважаемые "чатлане"! .Пишет вам "пацак". Я начал с Borland C++ 3.1. Наверное все очень просто на самом деле, но как и у всех начинающих ...Есть инструкция - вывод символа на экран и в порт rs-232,которая зацикливается d бесконечным цикле.Внимание вопрос..- Подскажите, как сделать,чтобы программа завершалась только по нажатию клавиши ESC? void main (void) { ... подробнее

Показать сообщение отдельно
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9384 / 5434 / 916
Регистрация: 25.07.2009
Сообщений: 10,428
21.08.2009, 03:34  [ТС]     Морзянка...
Цитата Сообщение от snake32 Посмотреть сообщение
easybudda, я читал книгу (Автор: Джоэл Спольски "Джоэл о программировании") где автор, один из разработчиков MS Excel, призывает не пользоватся строками типа ASCIIZ. Ведь каждая ф-ия работающая с таким типом, будь то strlen или strcat должна пробежаться по всему массиву символов в поисках нуля, что очень накладно выходит. В этом плане Паскалевсий тип string выглядит более привлекательнее, тк там уже "за ранее" известно сколько символов в строке, но как и везде есть свои минусы длина строки не может быть длинее 255 символов.

Я не знаю, может есть нечто среднее среди С-ишным char* и Паскалевским string-ом. Наверняка придумано куча классов.
Да вот и я о том же. Работать-то оно работает, но как-то накладных расходов много... А на счёт паскалевских строк - так строка может и меньше 255 символов быть. Так или иначе, а длинну как-то получать прийдётся. У меня ещё вариант был ввести переменную, которая длинну mstr считает, но проблема решается только частично, да и корявенько оно как-то...
Вспомнил - в паскале как-раз первый байт длинну строки и определяет... Да, надо будет и тут что-то похожее придумывать...

Добавлено через 11 часов 12 минут 0 секунд
...И лучше выдумать не смог! (с)

Так, наверное, быстрее будет:
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <stdio.h>
#include <ctype.h>
#include <string.h>
 
/* Транслятор азбуки морзе. Версия 0.04b */
 
typedef struct {
    int len;
    char *str;
} Str_t;
 
/* Str_t Str(char *) Возвращает структуру Str_t. str - указатель на существующую строку, тупо копируется */
Str_t Str(char *str){
    Str_t s;
    s.len = strlen(str);
    s.str = str;
    
    return s;
}
 
/* Str_t *catStr(Str_t *target, const Str_t *source) Дописывает source.str в конец target.str. target.str должна быть достаточно большой,
чтобы вместить source.str. Ноль в конце строки неявно копируется. 
target.len увеличивается на source.len */
Str_t *catStr(Str_t *target, const Str_t *source){
    char *tt; /* target tail */
    char *ss; /* source start */
    
    tt = target->str + target->len;
    ss = source->str;
    while ( *tt++ = *ss++ )
        ;
    target->len += source->len;
    
    return target;
}
    
 
/* str2morse - перевод строки в морзянку. str - исходная строка, mstr - конвертированная, max - макс. длинна конвертированной строки 
для наглядности между "буквами" вставляется пробел, между "словами" три пробела */
char *str2morse(char *str, char *mstr, int max){
    static Str_t letters[] = { {2, ".-"}, {4, "-..."}, {4, "-.-."}, {3, "-.."}, {1, "."}, {4, "..-."}, {3, "--."}, {4, "...."}, {2, ".."},
        {4, ".---"}, {3, "-.-"}, {4, ".-.."}, {2, "--"}, {2, "-."}, {3, "---"}, {4, ".--."}, {4, "--.-"}, {3, ".-."}, {3, "..."}, {1, "-"}, 
        {3, "..-"}, {4, "...-"}, {3, ".--"}, {4, "-..-"}, {4, "-.--"}, {4, "--.."} };
    static Str_t digits[] = { {5, "-----"}, {5, ".----"}, {5, "..---"}, {5, "...--"}, {5, "....-"}, {5, "....."}, {5, "-...."}, {5, "--..."}, 
        {5, "---.."}, {5, "----."} };
    static Str_t space = {1, " "};
    int c;
    int index;
    Str_t s;
    
    *mstr = '\0';
    s = Str(mstr);
    while ( *str ){
        /* Вставить пробел, если не первый символ */
        if ( s.len > 0 ) {
            if ( s.len + space.len < max )
                catStr(&s, &space);
            else 
                break;
        }   
        
        c = toupper(*str);
        /* Если с - буква */
        if ( c >= 'A' && c <= 'Z' ){
            index = c - 'A';
            if ( s.len + letters[index].len < max ) 
                catStr(&s, &letters[index]);
            else 
                break;
        }
        /* Если с - цифра */
        else if ( c >= '0' && c <= '9' ){
            index = c - '0';
            if ( s.len + digits[index].len < max ) 
                catStr(&s, &digits[index]);
            else 
                break;
        }
        /* Если с - пробел */
        else if ( c == ' ' ) {
            if ( s.len + space.len < max )
                catStr(&s, &space);
            else 
                break;
        }   
        
        str++;
    }
 
    return mstr;
}
 
int main(){
    char text[BUFSIZ];
    char morse[BUFSIZ];
    
    while ( fgets(text, BUFSIZ, stdin) ) {
        if ( str2morse(text, morse, BUFSIZ) == NULL ) {
            fprintf(stderr, "Can't convert string!\n");
            return 1;
        }
        else {
            printf("%s\n", morse);
        }
    }
    
    printf("Good bye!\n");
    return 0;
}
 
Текущее время: 02:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru