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

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

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

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

16.11.2009, 13:49. Просмотров 846. Ответов 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]);
}
ещё не уверен насчет выделения и освобождения памяти...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2009, 13:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Строки,ф-ии (C++):

Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки - C++
Сгенерировать две произвольные строки и определить, является ли какое-либо слово первой строки частью второй строки. 1. Я дуб дубом,даже...

Добавить строки, начиная со строки К1 и до строки К2, в динамический массив строк - C++
Есть динамический массив строк. Заполняется, т.е. размер его уже известен будет. Но дальше нужно сделать задание: &quot;Добавить строки, начиная...

Удалить строки динамической матрицы, начиная со строки К1 и до строки К2 - C++
Сформировать динамический двумерный массив, заполнить его случайными числами и удалить строки, начиная со строки К1 и до строки К2 вот...

Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка содер-жится в ней - C++
Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка...

Ввести строки и через n символов первой строки вставить вторую строку, и так до конца строки - C++ Builder
Помогите исправить баг задача состоит в следующем :ввести строку и простроку тоесть две строки и надо через (n) символов первой строки...

Даны три строки. Определить можно ли из символов третьей строки получить первую и вторую строки - Java
Помогите пожалуйста! 1)Даны три строки. Определить можно ли из символов третьей строки получить первую и вторую строки. 2)Дана...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
16.11.2009, 19:30 #2
у тебя жёское условие чтобы данные из файла были сохранены перед поиском знаков? или это ты сам так придумал? просто не шибко экономично процедуру сохранения делать, причём ещё постоянно довыделять память надо будет. можно просто читать фаил и всё вытягивать на ходу, это будет быстро и красиво.
0
Esc
4 / 4 / 1
Регистрация: 16.11.2009
Сообщений: 19
16.11.2009, 20:07  [ТС] #3
это мне мне так посоветовали(ассистентка препада) в принципе щас главное избавиться от глобальных переменных
0
TanT
эволюционирую потихоньку
465 / 463 / 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;
}
1
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);
...выделить память и через другую ф-ию освободить.
0
TanT
эволюционирую потихоньку
465 / 463 / 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;
}
1
Esc
4 / 4 / 1
Регистрация: 16.11.2009
Сообщений: 19
16.11.2009, 21:27  [ТС] #7
нет,не глотается,поставил воскл знак последним,он его посчитал.Спасибо
А можно ещё узнать смысл 17 и 21 строки?в 32 строке мы перемещаем указатель в тексте и сравниваем,да?просто я пока не сталкивался с таким типом записи text[i++].
0
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
17.11.2009, 06:02 #8
17ая строка - переопределение массива выделенной памяти, то есть найдя следующий элемент мы довыделяем память.
21- последний символ в массиве полученных данных я устанавливаю как '\0' - это спеуиальный символ, обозначающий конец строки, это избавляет меня от передачи в функции поиска количества элементов массива, я просто дохожу до этого символа и считаю что конец массива.

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

я просто объеденил
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);
}
так?
0
TanT
эволюционирую потихоньку
465 / 463 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
17.11.2009, 16:39 #10
вообще так, но по завершению программы она сама освобождается и так как больше работы с памятью нету, я на это не заморачиваюсь.
но тут ты прав, я запамятовал
0
Esc
4 / 4 / 1
Регистрация: 16.11.2009
Сообщений: 19
17.11.2009, 17:09  [ТС] #11
спасиб за помощь прога стала меньше и понятнее,не то что мой изначальный вариант...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2009, 17:09
Привет! Вот еще темы с ответами:

Слить две строки, вставив символы одной строки между символами другой строки - Pascal
Строка a из n символов лексикографически меньше строки b из n символов, если существует такой индекс j, что aj &lt; bj, а для всех i &lt; j ai =...

Сравнить строки, первый несовпадающий элемент строки-приемника записать в регистр AL, строки-источника - в DL - Assembler
Помогите написать программу на ассемблерене совсем еще разобрался с этим задание: Ввести с клавиатуры две строки одноразрядных...

Определить длину строки. Если длина строки >6, удалить часть строки в { } скобках. - Turbo Pascal
Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши &quot;Ввод&quot;. Программа должна определить длину введенной...

Строки. Определить длину введенной строки, если длина кратна 4, то первая часть строки меняется местами со второй - Turbo Pascal
Ввести с клавиатуры строку символов.признак окончания ввода строки-нажатие клавиши ввод.Программа должна определить длину введенной строки...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.11.2009, 17:09
Ответ Создать тему
Опции темы

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