Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 27.09.2021
Сообщений: 59
1

Программа выделяет не совсем то, что надо

06.12.2021, 18:35. Показов 556. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Нам задали сделать программу, которая выделяет в программе C все заголовки функций. Я программу сделал, но почему-то вместо этого она выделяет совсем другое: не int main() и не void "Название функции"(аргументы) как требуется, а все #include и #define. Пытался исправить по-разному, но не выходит. Можете помочь найти мне ошибку и исправить? Надо до 11 числа сделать.

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
#include <stdio.h>
#include <locale.h>
#include <windows.h>
#define MAXL 1000
#define HEAD 18
#define MN 10
#define V 4
#define YES 1
#define NO 0
 
int main()
{
    setlocale(LC_ALL, "Rus");
    HANDLE hStdout;
    FILE* fpin;
    int i = 0;
    char line[MAXL];
    char *ptr;
    ptr = &line[i];
    int l = 1;
    int ms = 0;
    int vs = 0;
    char cl[HEAD] = { '#', 'i', 'n', 'c', 'l', 'u', 'd', 'e', ' ', '<', 's', 't', 'd', 'i', 'o', '.', 'h', '>'};
    char* cp;
    cp = &cl[i];
    int crash = 0;
    char mf[MN] = { 'i', 'n', 't', ' ', 'm', 'a', 'i', 'n', '(', ')' };
    char vf[V] = { 'v', 'o', 'i', 'd' };
 
    WORD ftc, ct; //Цвет текста заголовка
    
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    ftc = FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_GREEN;
    ct = FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
 
    SetConsoleTextAttribute(hStdout, ct);
    fopen_s(&fpin, "test.txt", "rt");
    if (fpin == NULL)
        return;
 
    while (!feof(fpin))
    {
        ptr = fgets(line, MAXL, fpin);
        if (ptr == NULL)
            break;
        //Проверка: это программа C или нет?
        if (l == 1) 
            for (i = 0; i < HEAD; i++)
            {
                if (*ptr != *cp)
                {
                    printf("Программа не на языке С!");
                    crash = YES;
                    break;
                }
            }
        if (crash == 1)
            break;
        else
            l++;
 
        //Метка для int main()
        for (i = 0; i < HEAD; i++)
        {
            if (*ptr == *cp)
            {
                SetConsoleTextAttribute(hStdout, ftc);
                vs = YES;
            }
            else
            {
                SetConsoleTextAttribute(hStdout, ct);
                break;
            }
        }
 
        //Метка для void...
        if (vs != 1)
            for (i = 0; i < V; i++)
            {
                if (*ptr == *cp)
                    SetConsoleTextAttribute(hStdout, ftc);
                else
                {
                    SetConsoleTextAttribute(hStdout, ct);
                    break;
                }
            }
        printf("%s", ptr);
    }
    printf("\n");
    SetConsoleTextAttribute(hStdout, 7);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.12.2021, 18:35
Ответы с готовыми решениями:

В описании дана программа. Что она делает? Она создает список с полем ключа и полем данных. Что надо сделать? Надо чтобы программа работала бесконечно
Вообщем нужно чтобы было так: Vvedite key: 1 Vvedite stroku: 11111 Key=1 Stroka=11111...

Программа делает не совсем то, что нужно
Задача выглядит так: Работа со строками. Одна строка - текст. Текст должен состоять из нескольких...

Программа выдает не совсем то,что требуется, почему?
Вот сама программа. Нужно, чтобы созданная матрица возводилась в квадрат, но возводится только...

Что делает эта программа? Совсем не могу понять сути её
var i: integer; s: string; g: boolean; x: integer; begin readln(s); i := 1; g...

13
Вездепух
Эксперт CЭксперт С++
12785 / 6663 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
06.12.2021, 19:10 2
Цитата Сообщение от renminone Посмотреть сообщение
C
1
2
3
            for (i = 0; i < HEAD; i++)
            {
                if (*ptr != *cp)
В чем смысл таких циклов в вашем коде (у вас их много)? Зачем вы много раз в цикле делаете одно и то же сравнение?

Цитата Сообщение от renminone Посмотреть сообщение
while (!feof(fpin))
Зачем проверяется условие !feof(fpin)?
0
0 / 0 / 0
Регистрация: 27.09.2021
Сообщений: 59
06.12.2021, 19:18  [ТС] 3
Данные циклы по моей теории проверяют строку на то, является ли она заголовком. И если да, то она должна окраситься в голубой цвет. Если нет, то окраска должна вернуться к исходной.

!feop(fpin) - нас так учат проверять файл, пока он не будет просканирован полностью.

Добавлено через 36 секунд
TheCalligrapher,
Данные циклы по моей теории проверяют строку на то, является ли она заголовком. И если да, то она должна окраситься в голубой цвет. Если нет, то окраска должна вернуться к исходной.

!feop(fpin) - нас так учат проверять файл, пока он не будет просканирован полностью.
0
Вездепух
Эксперт CЭксперт С++
12785 / 6663 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
06.12.2021, 19:22 4
Цитата Сообщение от renminone Посмотреть сообщение
Данные циклы по моей теории проверяют строку на то, является ли она заголовком. И если да, то она должна окраситься в голубой цвет. Если нет, то окраска должна вернуться к исходной.
Но для того, чтобы "проверить строку", нужно, наверное, проверить все ее символы, один за другим, так? А ваши циклы проверяют один и тот же символ снова и снова. Зачем? Почему?

Цитата Сообщение от renminone Посмотреть сообщение
!feop(fpin) - нас так учат проверять файл, пока он не будет просканирован полностью.
Не знаю, кто вас этому учил, но в вашей программе вообще не должно быть использования функции feof вообще. Одна не предназначена для этого.

Проверку "пока он не будет просканирован полностью" вы уже и так сделали своей проверкой

C
1
2
         if (ptr == NULL)
            break;
Все. Именно так это и делается. Никакого feof.
0
0 / 0 / 0
Регистрация: 27.09.2021
Сообщений: 59
06.12.2021, 19:30  [ТС] 5
TheCalligrapher,
1)Как можно исправить проверку строки, чтоб она корректно определяла заголовок функции и выделяла именно его?
2)Как можно заменить feof?
0
Вездепух
Эксперт CЭксперт С++
12785 / 6663 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
06.12.2021, 19:35 6
Цитата Сообщение от renminone Посмотреть сообщение
2)Как можно заменить feof?
Ее нужно выкинуть вообще. Ваш главный цикл должен выглядеть примерно так

C
1
2
3
4
5
6
7
for (;;)
{
  ptr = fgets(line, MAXL, fpin);
  if (ptr == NULL)
    break;
  ...
}
или

C
1
2
3
4
while ((ptr = fgets(line, MAXL, fpin)) != NULL)
{
  ...
}
Цитата Сообщение от renminone Посмотреть сообщение
1)Как можно исправить проверку строки,
В первую очередь возникает вопрос: а почему вы вообще пишете какие-то циклы руками? Вам по условию запрещено использовать готовые стандартные функции для сравнения строк?
0
0 / 0 / 0
Регистрация: 27.09.2021
Сообщений: 59
06.12.2021, 19:40  [ТС] 7
TheCalligrapher, по условию нет никаких запретов. Просто когда я делал эту часть, то это единственное, что пришло мне в голову + не особо хочется с динамическими массивами связываться.
0
0 / 0 / 0
Регистрация: 27.09.2021
Сообщений: 59
09.12.2021, 13:52  [ТС] 8
Кароче, я разобрался. Оказалось, я сглупил и не те указатели поставил, из-за чего красился #include<>, а не int main() с void abc(аргументы). Теперь всё работает как надо.
Если кому-то понадобится, держите рабочий код.
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
#include <stdio.h>
#include <locale.h>
#include <windows.h>
#define MAXL 1000
#define YES 1
#define NO 0
 
int main() {
    setlocale(LC_ALL, "Rus");
    HANDLE hStdout;
    FILE* fpin;
    int i = 0, l = 1, vs = 0, crash = 0; //i - шаг циклов. l - кол-во строк (необходимо только для триггера cl), crash - вылет.
    char line[MAXL];
    char cl[18] = { '#', 'i', 'n', 'c', 'l', 'u', 'd', 'e', ' ', '<', 's', 't', 'd', 'i', 'o', '.', 'h', '>' }; //Триггер наличия текста программы на C.
    char mf[10] = { 'i', 'n', 't', ' ', 'm', 'a', 'i', 'n', '(', ')' }; //Триггер основной функции
    char vf[4] = { 'v', 'o', 'i', 'd' }; //Триггер дополнительных функций
    char* ptr, *cp, *mp, *vp; //Указатели
    ptr = &line[i]; //Указатель на символ файла
    cp = &cl[i]; //Указатель на триггер cl
    mp = &mf[i]; //Указатель на триггер mf
    vp = &vf[i]; //Указатель на триггер vf
 
    WORD ftc, et; //Цвет текста заголовков и текста вывода ошибки.
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    ftc = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE; //Цвет текста функции
    et = FOREGROUND_INTENSITY | FOREGROUND_RED; //Цвет текста ошибки
 
    fopen_s(&fpin, "test.txt", "rt");
    if (fpin == NULL)
        return;
 
    while ((ptr = fgets(line, MAXL, fpin)) != NULL) {
        if (l == 1)     //Проверка: это программа C или нет?
            for (i = 0; i < 18; i++)
                if (*ptr != *cp) {
                    SetConsoleTextAttribute(hStdout, et);
                    printf("Программа не на языке С!");
                    crash = YES;
                    break; }
        if (crash == 1)
            break;
        else
            l++;
 
        for (i = 0; i < 10; i++) {      //Метка для int main()
            if (*ptr == *mp) {
                SetConsoleTextAttribute(hStdout, ftc);
                vs = YES; }
            else {
                SetConsoleTextAttribute(hStdout, 7);
                break; } }
 
        if (vs != 1)    //Метка для void...
            for (i = 0; i < 4; i++) {
                if (*ptr == *vp)
                    SetConsoleTextAttribute(hStdout, ftc);
                else {
                    SetConsoleTextAttribute(hStdout, 7);
                    break; } }
        printf("%s", ptr); }
    printf("\n");
    SetConsoleTextAttribute(hStdout, 7);
    return 0; }
0
Вездепух
Эксперт CЭксперт С++
12785 / 6663 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
09.12.2021, 19:35 9
Цитата Сообщение от renminone Посмотреть сообщение
Если кому-то понадобится, держите рабочий код.
???

Одни и те же ошибки. О каком "рабочем коде" может идти речь?

C
1
2
3
4
5
6
             for (i = 0; i < 18; i++)
                if (*ptr != *cp) {
                    SetConsoleTextAttribute(hStdout, et);
                    printf("Программа не на языке С!");
                    crash = YES;
                    break; }
Что делает этот цикл?

Тот же вопрос относится и ко всем остальным аналогичным циклам.
0
0 / 0 / 0
Регистрация: 27.09.2021
Сообщений: 59
09.12.2021, 20:54  [ТС] 10
TheCalligrapher, этот цикл проверяет, является ли содержимое в файле программой на языке Си. Следующие выделяют заголовки функции. Правда, я хотел переписать программу, чтоб она в 1 цикле она фиксировала местоположения начала и конца заголовков, а во 2 уже выводила обработанную информацию. Но всё же этот смог заработать.
Пруфы, что всё работает в файле. Единственный случай, когда не работает, это если первая строчка #define _CRT_SECURE_NO_WARNINGS. Я не знаю операцию, которая проверяет, чтоб только одно из 2 условий выполнялось.

Проверка.pdf
0
Вездепух
Эксперт CЭксперт С++
12785 / 6663 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
09.12.2021, 21:03 11
Цитата Сообщение от renminone Посмотреть сообщение
этот цикл проверяет, является ли содержимое в файле программой на языке Си.
Как он это проверяет? Этот цикл, как я уже говорил выше, 18 раз делает одно и то же сравнение if (*ptr != *cp) {. Каким образом это сравнение "проверяет, является ли содержимое в файле программой на языке Си"? И зачем его повторять 18 раз?

Цитата Сообщение от renminone Посмотреть сообщение
Пруфы, что всё работает в файле.
Вам показалось, из-за того, что вы плохо тестировали. Вы просто подобрали пример, на котором "как будто все работает".
0
Вездепух
Эксперт CЭксперт С++
12785 / 6663 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
09.12.2021, 21:12 12
Вот пример работы вашей программы на моем тестовом примере

Код
#vasya+lena=lubov

void func(int a[])
{
}

vereshagin, uhodi s barkasa!!!
 
int main() 
{
  return 0;
}

int vse_tlen;
Почему ваша программа выполнила подсветку, ведь согласно вашим критериям, это не программа на языке С? Она не начинается с #include <stdio.h>.

Почему подсвечены строки, которые не являются заголовками функций? Никакого void в подсвеченных строчках нет.
Изображения
 
0
0 / 0 / 0
Регистрация: 27.09.2021
Сообщений: 59
09.12.2021, 21:25  [ТС] 13
TheCalligrapher, тогда предлагайте свой вариант. Да и в дополнение скажу, что преподаватель у нас не дотошный.
0
Вездепух
Эксперт CЭксперт С++
12785 / 6663 / 1794
Регистрация: 18.10.2014
Сообщений: 16,854
09.12.2021, 21:31 14
Цитата Сообщение от renminone Посмотреть сообщение
Да и в дополнение скажу, что преподаватель у нас не дотошный.
Ваш вопрос озаглавлен "Программа выделяет не совсем то, что надо". Как видите, согласно моему примеру, ваша программа по-прежнему "выделяет не совсем то, что надо". Если вашего "не дотошного" преподавателя это устраивает, то тогда откуда вообще возник вопрос?

А вы вообще для кого все это делаете? Для себя - чтобы чему-то научиться? Или для преподавателя - чтобы отстал?

Цитата Сообщение от renminone Посмотреть сообщение
тогда предлагайте свой вариант.
Я вам указал на конкретное место в коде, которое приводит к этим ошибкам. Дальше дело за вами.
0
09.12.2021, 21:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2021, 21:31
Помогаю со студенческими работами здесь

Есть программа по кодированию и декодированию методом Хаффмана с помощью дерева, на я не совсем понимаю что здесь к чему!
Здравствуйте! Есть программа по кодированию и декодированию методом Хаффмана с помощью дерева, на я...

1 курс. Тема: одномерные массивы. Программа работает, но не совсем точно выполняет то, что требуется в задании. Не знаю, как исправить код
uses crt; const n = 10; type mas = array of integer; var a: mas; i: byte; ...

Не совсем работает как надо
&lt;?php session_start (); //- тут закомментируй если раньше стартуешь где ?&gt; &lt;!DOCTYPE html&gt;...

Ведется набор цифр и надо чтобы программа из него сама сообразило число. То есть что бы программа сама раскидывала их по разрядам.
Люди добрые, только начинаю программировать, пытаюсь освоить не очень простой язык С++. Есть такая...

Программа не делает то, что надо. Почему?
Сведения о книге состоят из фамилии автора, названия и года издания. Ввести набор из 12 таких...

надо получить равнобед.треугольник у меня код есть но там надо изменить что то,я не могу понять что
Вот по такому примеру надо нарисовать равнобедренный треугольник на турбо си ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru