Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2016, 12:02   #1
Evgenijj4
 
Регистрация: 02.11.2016
Сообщений: 3
Вопрос Не могу разобраться в указателях

Код:
#include <iostream>
#include <stdio.h>
using namespace std;
//подсчет кол-ва согласных в слове
int cntsogl(char *s)
{
    int n=0;
    for(int i=0;s[i];i++)
        if(strchr("бвгджзйклмнпрстфхцчшщБВГДЖЗЙКЛМНПРСТФХЦЧШЩВСDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz",s[i]))
            n++;
 
    return n;
}
 
int desc (const void * a, const void * b)
{
    char *pa=*((char**)a);
    char *pb=*((char**)b);
  return strlen(pb)-strlen(pa);
}
int nsogl (const void * a, const void * b)
{
    char *pa=*((char**)a);
    char *pb=*((char**)b);
  return cntsogl(pa)-cntsogl(pb);
}
 
int main()
{
    setlocale(LC_ALL,"Russian");
    cout << "Файл: ";
    char fn[100];
    cin >> fn;
    char w[100];
    char **words=NULL;
    FILE *f=fopen(fn,"r");
    int nw=0;
    while(!feof(f))
    {
        if(fscanf(f,"%s",w)==1)
        {
            words=(char**)realloc(words,(nw+1)*sizeof(char*)); //память
            words[nw]=new char[strlen(w+1)]; //выделение памяти
            strcpy(words[nw],w); // Функция strcpy возвращает указатель на строку, в которую скопированы данные
            nw++;
        }
 
    }
    fclose(f);
    //сортировка по убыванию длины
    qsort(words,nw,sizeof(char*),desc); //выделение памяти
    cout << "Самые длинные слова:" << endl;
    //выводим 3 самых длинных слова
    for(int i=0;i<(nw<3?nw:3);i++)
    {
        cout << words[i] << endl;
    }
    system("pause");
    //сортируем по кол-ву согласных
    qsort(words,nw,sizeof(char*),nsogl); //выделение памяти
    cout << "В порядке возрастания кол-ва согласных:" << endl;
    for(int i=0;i<nw;i++)
    {
        cout << words[i] << endl;
    }
 
    system("pause");
    return 0;
}
Программа ищет 3 самых длинных слова в текстовом файле, затем записывает слова в порядке возрастания согласных букв. Выделил красным часть кода, в которой не могу разобраться. Просьба разобрать их. Язык c++
Evgenijj4 вне форума Ответить с цитированием
Старый 27.12.2016, 12:40   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

А что вас там смутило то? Берется указатель, который передали. Зная, что на самом нам передали указатель на "строку", приводим и делаем, что надо.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу разобраться Виктор27 Общие вопросы C/C++ 6 22.11.2013 22:21
Не могу разобраться Rammstalex Паскаль, Turbo Pascal, PascalABC.NET 2 07.06.2013 21:02
не могу разобраться! Apsalon Microsoft Office Excel 1 28.12.2010 18:54
необходимо сделать стек на указателях с использованием ООП TROXEVASIN Общие вопросы Delphi 14 22.10.2007 23:56