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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 28.11.2008, 02:53   #1
ertar
 
Регистрация: 28.11.2008
Сообщений: 6
По умолчанию C,символы, указатели, динам.память

Может быть, кто-то подскажет, что не так в коде, что он не выводит результат поиска?((

Дан список слов. Вывести слова и их порядковые номера, состоящие из пяти букв; состоящие из семи букв; состоящие из четырех букв.

Код:
#include<stdlib.h>
#include<iostream.h>
#include<conio.h>
#include<fstream.h>
#include<string.h>
#define FILE_NAME "FAM.txt"

void inmas(char **&bp, int &jp);//ввод слов
void out(int n, char **p, int j);/* процедура вывода слов с опред. кол. букв*/

int i;

void main()
{
 clrscr();
 int j;
 char **b;
 inmas(b, j);
 out(4, b, j);
 out(5, b, j);
 out(7, b, j);
 getch();
 for(i = 0; i < j; i++) free(b[i]);
 free(b);
}

void inmas(char **&bp, int &jp)
{
 char z;
 fstream myf;
 myf.open(FILE_NAME, ios::in);
 while(!myf.eof())  //подсчет колличества элементов
 {
  myf >> z;
  jp++;
 }
 jp--;
 myf.close();
 myf.open(FILE_NAME, ios::in);
 bp = (char**)malloc(jp*sizeof(char*)); //выделение памяти
 for (i = 0; i < jp; i++)
 {
  bp[i] = (char*)malloc(20*sizeof(char));
  myf >> bp[i];
 }
 myf.close();
}

void out(int n, char **p, int jp)
{
 cout << "Fam s kolli4estvom bykv " << n << endl;
 for(i = 1; i < jp; i++)
   if (!strlen(p[i])==n) cout << p[i] << endl;
}
Исходные данные:
BATYT
KIROV
RAIF
MOLY
KIROVAS
KAZANYV
BGUDGA
KZARK
MON
ertar вне форума
Старый 28.11.2008, 10:07   #2
Ламер_001
Ну и что? :)
Форумчанин
 
Регистрация: 20.10.2008
Сообщений: 129
По умолчанию

j надо бы обнулять перед inmas
Учиться, учиться и еще раз учиться
Ламер_001 вне форума
Старый 28.11.2008, 19:33   #3
ertar
 
Регистрация: 28.11.2008
Сообщений: 6
По умолчанию

А зачем?0_о
и, не влияет на результат(
ertar вне форума
Старый 28.11.2008, 20:16   #4
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

j обязательно обнулять, иначе у вас неправильно считается кол-во слов. Если j при инициальзации равно (-4), что вполне может случиться - там вообще как повезёт, то кол-во слов у вас будет на 4 меньше, чем на самом деле.


Код:
while(!myf.eof())  //подсчет колличества элементов
 {
  myf >> z;
  jp++;
 }
z - char - один символ. Читает посимвольно, а не слова. Мне кажется это не то, что Вы хотели.


Код:
for(i = 1; i < jp; i++)
i = 0

Код:
if (!strlen(p[i])==n)
if (strlen(p[i])==n)

Последний раз редактировалось theos; 28.11.2008 в 20:19.
theos вне форума
Старый 28.11.2008, 22:41   #5
ertar
 
Регистрация: 28.11.2008
Сообщений: 6
По умолчанию

Код:
while(!myf.eof())  //подсчет колличества элементов
 {
  myf >> z;
  jp++;
 }
Да, это и вправду должно было бы быть подсчетом слов, а не символов. А можете подсказать как преобраховать символы в файле в строки?
с паскалем в этом плане было легче - там изначально char и string

Спасибо за остальные подсказки!!
ertar вне форума
Старый 30.11.2008, 00:26   #6
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Как только началось слово (буква), читайте буквы до пробельных символов. Как только встретили пробельный - слово кончилось. Потом читаете подряд все пробельные символы. Как только буква - значит снова началось слово. Проверить, является ли символ z пробельным можно так:
Код:
if(strchr(" \n\t",z)) // тут в строку напишите все символы, которые считаете пробельными
              // например знаки препинания
{
     ...
}

В C/C++ строкой является массив букв (например типа char), который оканчивается на символ с кодом 0. Так же можно использовать класс std::string. Тут объяснять всё не буду, тк это есть в любой приличной книжке или мануале.
theos вне форума
Старый 24.12.2008, 21:05   #7
ertar
 
Регистрация: 28.11.2008
Сообщений: 6
По умолчанию

Если кому-то понадобиться, вот рабочий вариант)) Сдала
Спасибо за помощь!!!

Код:
#include<stdlib.h>
#include<iostream.h>
#include<conio.h>
#include<fstream.h>
#include<string.h>
#define FILE_NAME "FAM.txt"

void inmas(char **&bp, int &jp);
void out(int n, char **p, int j);

int i;

void main()
{
 clrscr();
 int j=0;
 char **b;
 inmas(b, j);
 out(4, b, j);
 out(5, b, j);
 out(7, b, j);
 //getch();
for(i = 0; i < j; i++) free(b[i]);
 free(b);
 getch();

void inmas(char **&bp, int &jp)
{
 char z;
 fstream myf;
 myf.open(FILE_NAME, ios::in);
 while(!myf.eof())
 {
  myf >> z;
  jp++;
 }
 jp--;
 myf.close();
 myf.open(FILE_NAME, ios::in);
 bp = (char**)malloc(jp*sizeof(char*));
 for (i = 0; i < jp; i++)
 {
  bp[i] = (char*)malloc(20*sizeof(char));
  myf >> bp[i];
 }
 myf.close();
}

void out(int n, char **p, int jp)
{
 cout << "Fam s kolli4estvom bykv " << n << endl;
 for(i = 0; i < jp; i++)
   if (strlen(p[i])==n) cout << p[i] << endl;
}
ertar вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели JOFRIF Общие вопросы C/C++ 2 31.08.2008 18:34
Указатели Принц Общие вопросы C/C++ 2 08.06.2008 16:15
Указатели в Си Иллидан Общие вопросы C/C++ 7 20.02.2008 11:14
Указатели в функции. _LEON_ Общие вопросы C/C++ 4 04.02.2008 10:38
Указатели Си JET_FLASH Общие вопросы C/C++ 2 31.01.2008 23:02