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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Esc
4 / 4 / 1
Регистрация: 16.11.2009
Сообщений: 19
#1

Строки,ф-ии - C++

16.11.2009, 13:49. Просмотров 838. Ответов 10
Метки нет (Все метки)

Надо написать программку,которая будет считать кол-во вопросительных знаков,восклицательных и точек.Я это сделал,используя глобальные переменные,а надо без них + ф-ию открытия файла и считывание кол-ва необходимых элементов(ф-ия kolvo) надо разделить на две,т.е. чтобы одна ф-ия считывала данные из файла и сохраняла их,а другая уже обрабатывала.Помогите пожалуйста =)
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
#include "iostream.h"
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
#include "process.h"
#include "stdlib.h"
#include "fstream.h"
#include "iomanip.h"
#define N 255
FILE *f;      //
char **s;   //от этих глобальных переменных надо избавиться
int cc,i;     //
void kolvo(char ch,char *ss); //эту ф-ию надо разделить
void file(char *ss);
void el();
void fel();
void main()
{
clrscr();
char ch,*ff;
printf("Vvedite nazvanie file\n");
scanf("%s",ff);
file(ff);
printf("vvedite simvol,kol-vo kotorogo hotite nayti\n");
printf("'!'\n'?'\n'.'\ndrugoy simvol-exit\n");
printf("~~~~~~~~~~~~~~~~~~\n");
while(ch)
{
scanf("%1s",&ch);
if(ch!='!'&&ch!='?'&&ch!='.')
{
printf("exit!");
getch();
exit(1);
}
printf("kol-vo '%c' : ",ch);
kolvo(ch,ff);
fel();
}
getch();
}
 
void kolvo(char ch,char *ss) //-вот эту фи-ю надо разделить на две
{
char *ps;
int k,i=0,m=0,cc=0,buk=0;
int *bs;
f=fopen(ss,"r");
while (!feof(f))
{
k=0;ps=0;
ps=fgets(*s,N,f);
while (*ps)
{
if (*ps==ch)
k++; // к-кол-во символов,которое надо найти по условию задачи
if(*ps!='\n'&& *ps!='\0')
buk++;
ps++;
}
bs[i]=buk;// bs[i]-кол-во символов 
i++;
buk=0;
m=m+k;
}
cc=i; //сс-кол-во строк
fclose(f);
 printf("%d\n",m);
for (i=0;i<cc;i++)
{
s[i]=(char*)malloc(sizeof(char)*bs[i]); //выделяю память для i-ой строки под bs[i]-ое кол-во символов
}
}
 
void file(char *ss)
{
f=fopen(ss,"r");
if(!f)
{
clrscr();
printf("file ne nayden!");
getch();
exit(1);
}
}
 
void fel()
{
for (i=0;i<cc;i++)
free(s[i]);
}
ещё не уверен насчет выделения и освобождения памяти...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2009, 13:49     Строки,ф-ии
Посмотрите здесь:

Упорядочить строки массива в соответствии с ростом характеристики строки C++
C++ как сделать из строки массив из символов этой строки
C++ Рассортировать строки динамической матрицы по наибольшему элементу строки.
C++ Строки в файлах (вывести из каждой строки последнее слово)
Строки (Расположить слова строки в порядке, обратном исходному) C++
Строки. Вывести на печать то слово этой строки, которое по алфавиту предшествует всем другим C++
C++ Структуры и строки (как поменять значение строки в структуре?)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
16.11.2009, 19:30     Строки,ф-ии #2
у тебя жёское условие чтобы данные из файла были сохранены перед поиском знаков? или это ты сам так придумал? просто не шибко экономично процедуру сохранения делать, причём ещё постоянно довыделять память надо будет. можно просто читать фаил и всё вытягивать на ходу, это будет быстро и красиво.
Esc
4 / 4 / 1
Регистрация: 16.11.2009
Сообщений: 19
16.11.2009, 20:07  [ТС]     Строки,ф-ии #3
это мне мне так посоветовали(ассистентка препада) в принципе щас главное избавиться от глобальных переменных
TanT
эволюционирую потихоньку
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
16.11.2009, 20:43     Строки,ф-ии #4
ну так дык это всё меняет, щас посмотрю что можно сделать

Добавлено через 22 минуты
у меня получилось так, проверь не дублируется у тебя последний символ в файле?
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
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
 
int main()
{
//  clrscr();
    char ch, ff[100];
    int numQuery=0, numWow=0, numPoint=0;
    printf("Vvedite nazvanie file\n");
    scanf("%s",ff);
    FILE *f=fopen(ff,"r");
    if(!f)  {   /*clrscr();*/   printf("file ne nayden!"); getch(); exit(1); }
    
    while (!feof(f))
    {
        fscanf(f,"%c",&ch);
        if (ch=='?') ++numQuery;
        else
            if (ch=='!') ++numWow;
            else    
                if (ch=='.') ++numPoint;    
    } // end while (!feof(f))
 
    printf("\nnumber '?': %i\nnumber '!': %i\nnumber '.': %i",numQuery, numWow, numPoint);
    fclose(f);  
 
    getch();
    return 0;
}
Esc
4 / 4 / 1
Регистрация: 16.11.2009
Сообщений: 19
16.11.2009, 20:57  [ТС]     Строки,ф-ии #5
да,всё работает,только ведь мне надо сделать эту программу через ф-ии без использования глобальных переменных,с выделением памяти через маллок.Т.е. вот это запихнуть в ф-ию...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 FILE *f=fopen(ff,"r");
        if(!f)  {       /*clrscr();*/   printf("file ne nayden!"); getch();     exit(1); }
        
        while (!feof(f))
        {
                fscanf(f,"%c",&ch);
                if (ch=='?') ++numQuery;
                else
                        if (ch=='!') ++numWow;
                        else    
                                if (ch=='.') ++numPoint;        
        } // end while (!feof(f))
 
        printf("\nnumber '?': %i\nnumber '!': %i\nnumber '.': %i",numQuery, numWow, numPoint);
        fclose(f);
...выделить память и через другую ф-ию освободить.
TanT
эволюционирую потихоньку
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
16.11.2009, 21:20     Строки,ф-ии #6
посмотри внимательно не глотается ли последний символ файла
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
#include "stdlib.h"
#include "stdio.h"
#include "conio.h"
 
 
char * ReadFile(char * fileName)
{
    FILE *f=fopen(fileName,"r");
    if(!f)  {   /*clrscr();*/   printf("file ne nayden!"); getch(); exit(1); }
    
    int i=0;
    char *arr = (char *) malloc(sizeof(char));
    
 
    while (!feof(f))
    {
        arr = (char *) realloc(arr, (i+1)*sizeof(char));
        fscanf(f,"%c",&arr[i++]);
    } // end while (!feof(f))
    
    arr[i-1]='\0';
    //printf("\narr: %s", &arr[0]);
    fclose(f);  
    return arr;
}
 
int FindSimvol(char *text, char simvol)
{ // можно искать стандартной функцикцией, но мы заново коммунизм построим
    int i=0, cnt=0; 
    while(text[i]!='\0')
    {
        if (text[i++]==simvol) ++cnt;
        
    } 
    return cnt;
}
 
int main()
{
//  clrscr();
    char *text, ff[100];
    int numQuery=0, numWow=0, numPoint=0;
    printf("Vvedite nazvanie file\n");
    scanf("%s",ff);
    
    text=ReadFile(ff);
  
    printf("\nnumber '?': %i\nnumber '!': %i\nnumber '.': %i",
        FindSimvol(text,'?'), FindSimvol(text,'!'), FindSimvol(text,'.'));
    
    getch();
    return 0;
}
Esc
4 / 4 / 1
Регистрация: 16.11.2009
Сообщений: 19
16.11.2009, 21:27  [ТС]     Строки,ф-ии #7
нет,не глотается,поставил воскл знак последним,он его посчитал.Спасибо
А можно ещё узнать смысл 17 и 21 строки?в 32 строке мы перемещаем указатель в тексте и сравниваем,да?просто я пока не сталкивался с таким типом записи text[i++].
TanT
эволюционирую потихоньку
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
17.11.2009, 06:02     Строки,ф-ии #8
17ая строка - переопределение массива выделенной памяти, то есть найдя следующий элемент мы довыделяем память.
21- последний символ в массиве полученных данных я устанавливаю как '\0' - это спеуиальный символ, обозначающий конец строки, это избавляет меня от передачи в функции поиска количества элементов массива, я просто дохожу до этого символа и считаю что конец массива.

запись text[i++]. равносильна двум записям
text[i]
i=i+1;

я просто объеденил
Esc
4 / 4 / 1
Регистрация: 16.11.2009
Сообщений: 19
17.11.2009, 16:22  [ТС]     Строки,ф-ии #9
кстати,а ведь память ещё освободить надо
C++
1
2
3
4
void FreeMem(char *text)
{
       free(text);
}
так?
TanT
эволюционирую потихоньку
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
17.11.2009, 16:39     Строки,ф-ии #10
вообще так, но по завершению программы она сама освобождается и так как больше работы с памятью нету, я на это не заморачиваюсь.
но тут ты прав, я запамятовал
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2009, 17:09     Строки,ф-ии
Еще ссылки по теме:

C++ Вводятся 2 строки. Перевернуть обе строки, склеить и вывести
C++ Даны строки s, s0. Найти количество вхождений строки s0 в строку s
C++ Разместить текст первой строки по центру второй строки
Считать строки из файла, найти строки на определённую букву C++
C++ Получение переменных из строки, изменение строки, запись в файл

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

Или воспользуйтесь поиском по форуму:
Esc
4 / 4 / 1
Регистрация: 16.11.2009
Сообщений: 19
17.11.2009, 17:09  [ТС]     Строки,ф-ии #11
спасиб за помощь прога стала меньше и понятнее,не то что мой изначальный вариант...
Yandex
Объявления
17.11.2009, 17:09     Строки,ф-ии
Ответ Создать тему
Опции темы

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