Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
1

Вопросы по C++

10.10.2011, 20:26. Показов 1742. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
У меня появилось несколько вопросов по C++, был бы рад, если бы Вы помогли бы мне хотя бы из одним из них.

1) Как узнать количество строк в файле;
2) Как узнать количество символов в файле;
3) Как узнать количество символов в отдельной строке файла;
4) Как считать каждую строку в отдельный массив символов (char);
5) Есть строка с N-ым количемством чисел, записаных через пробел. Нужно узнать их количество, создать массив с таким же количеством элементов и скопировать эти числа в получившийся массив;
6) Как узнать количесво цифр в числе;
7) Как узнать сумму цифр в числе.

Заранее большое спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2011, 20:26
Ответы с готовыми решениями:

Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились
Кто знает ребят подскажите в чем проблема, есть метод обновляющий текст в TextView (всего 6...

Qt Вопросы
Подскажите, пожалуйста в С# есть Tool Strip Menu(типа кнопочки вверху окна например Файл, Правка,...

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

Вопросы по БД
Все привет! Начал как бы заниматься программированием и возникли некоторые вопросы с БД. Первый...

16
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
10.10.2011, 20:30 2
Цитата Сообщение от zago-vlad Посмотреть сообщение
1) Как узнать количество строк в файле;
посчитать вхождения '\n'
Цитата Сообщение от zago-vlad Посмотреть сообщение
2) Как узнать количество символов в файле;
переместится в конец файла, а потом посмотреть чему равен seekg
Цитата Сообщение от zago-vlad Посмотреть сообщение
3) Как узнать количество символов в отдельной строке файла;
считать символы до вхождения '\n'
Цитата Сообщение от zago-vlad Посмотреть сообщение
4) Как считать каждую строку в отдельный массив символов (char);
getline в помощь
1
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
10.10.2011, 20:34  [ТС] 3
Gepar, спасибо за помощь, с четвёртым разобрался, а можешь привести примеры кода с первого по третье?
0
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.10.2011, 00:21 4
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
#include <stdio.h>
long  fileSize(FILE* fp);
int  fileLine(FILE* fp);
int  fileLineSizeAt(FILE* fp, int index);
 
int main(void) {
   FILE* fp = fopen("D:\\config.ini", "r");
   if(! fp)
      return 1;
   printf("file   size: %d\n",   fileSize(fp) );  // вывести размер файла
   printf("file  lines: %d\n",   fileLine(fp) );  // вывести кол-во строк в файле
   printf("line length: %d\n", fileLineSizeAt(fp, 2) );  // вывести размер 3-ей строки
   fclose(fp);
   getchar();
   return 0;
}
 
// размер файла в байтах
long  fileSize(FILE* fp) {
    long cnt;
    fseek(fp, 0L, SEEK_END);
    cnt = ftell(fp);
    return cnt;
}
 
// кол-во строк в файле
int  fileLine(FILE* fp) {
   long cnt = 0L;
   char ch  = 0;
   fseek(fp, 0L, SEEK_SET);
   while(fscanf(fp, "%*[^\n]%c", &ch) == 1) 
         cnt++;
   return cnt;
}
 
// размер строки по-индексу начало индекса с нуля как и массив
int  fileLineSizeAt(FILE* fp, int index) {
   long pos;
   char ch  = 0;    
   rewind(fp);
   for(int i = 0; i < index && ! feof(fp); i++) 
        fscanf(fp, "%*[^\n]%c", &ch);
   if(! feof(fp)) {
         pos = ftell(fp);
         fscanf(fp, "%*[^\n]%c", &ch);
         return ftell(fp) - pos - 2L; //(2-\n\r)
    }
    return 0L;
}
2
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
11.10.2011, 05:45 5
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от zago-vlad
2) Как узнать количество символов в файле;
открыть его в двоичном режиме и считывать символы, пока не встретится конец файла

Цитата Сообщение от xAtom
C++
1
2
3
4
5
6
7
// размер файла в байтах
long  fileSize(FILE* fp) {
    long cnt;
    fseek(fp, 0L, SEEK_END);
    cnt = ftell(fp);
    return cnt;
}
fseek() с SEEK_END к двоичному потоку применять нельзя
ftell() для текстовых потоков возвращает индикатор файловой позиции (какое-то число, которое равно чему-то)
3
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
11.10.2011, 08:32  [ТС] 6
Спасибо! С вопросами 1-4 разобрался!
А как быть с вопросами 5-7?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
11.10.2011, 09:32 7
6)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int ndigits(int n);
 
int main(void)
{
    printf("%d %d %d\n", ndigits(12345), ndigits(0), ndigits(123));
    printf("%d %d %d\n", ndigits(-12345), ndigits(0), ndigits(-123));
    return 0;
}
 
int ndigits(int n)
{
    if (n == 0)
        return 0;
    return 1 + ndigits(n / 10);
}
Код
[guest@localhost tests]$ .ansi t.c -o t
[guest@localhost tests]$ ./t
5 0 3
5 0 3
[guest@localhost tests]$
для нуля возвращает ноль цифр

Добавлено через 10 минут
7)
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
 
#include <stdio.h>
 
int sumdigits(int n);
 
int main(void)
{
    printf("%d %d %d\n", sumdigits(12345), sumdigits(0), sumdigits(123));
    printf("%d %d %d\n", sumdigits(-12345), sumdigits(0), sumdigits(-123));
    return 0;
}
 
int sumdigits(int n)
{
    int neg, v;
    
    if (n == 0)
        return 0;
    neg = 0;
    if (n < 0) {
        neg = 1;
        n = -n;
    }
    v = n % 10 + sumdigits(n / 10);
    return neg ? -v : v;
}
Код
[guest@localhost tests]$ .ansi t.c -o t
[guest@localhost tests]$ ./t
15 0 6
-15 0 -6
[guest@localhost tests]$
Добавлено через 11 минут
5)
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
 
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    const char *s = "1234 5678 91011 12";
    int n, offset, tmp;
    int *arr, i;
    
    n = offset = 0;
    while (sscanf(s + offset, "%*d%n", &tmp) == 0) {
        offset += tmp;
        n++;
    }
    
    printf("%d\n", n);
    
    arr = (int *) malloc(n * sizeof(int));
    if (arr == NULL)
        return 1;
 
    i = offset = 0;
    while (sscanf(s + offset, "%d%n", arr + i, &tmp) == 1) {
        offset += tmp;
        i++;
    }
    
    for (i = 0; i < n; i++)
        printf("%d%s", arr[i], (i + 1 < n) ? " " : "\n");
    
    free(arr);
    return 0;
}
Код
[guest@localhost tests]$ .ansi t.c -o t
[guest@localhost tests]$ ./t
4
1234 5678 91011 12
[guest@localhost tests]$
1
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
11.10.2011, 10:22  [ТС] 8
А как быть с пятым?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
11.10.2011, 10:55 9
чего ?
0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
11.10.2011, 11:00 10
Цитата Сообщение от zago-vlad Посмотреть сообщение
А как быть с пятым?
Считывайте по символу и проверяйте является ли он цифрой, если точно знаете что они идут через пробел то проверяйте каждый второй символ.
C++
1
2
3
4
    int count;
    char ch=file.get();
    if (isdigit(ch))
     count++;
Потом создадите массив размера count и закинете туда свои числа.
Хотя это некрасивый вариант и можно схитрить: узнать количество символов в строке, разделить число на 2 и создать массив такого размера куда при первом проходе строки и помещать уже цифры
1
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 13:27 11
А как понимать это выражение в fscanf:

Цитата Сообщение от xAtom Посмотреть сообщение
"%*[^\n]%c"
Звёздочка - понятно, прочтённый символ никуда не сохраняется. А что такое [^\n] ?

Добавлено через 4 минуты
Gepar, в числе-то может быть не одна цифра. + ещё floating-point, вроде 12.4 или 4e8
0
13 / 8 / 1
Регистрация: 12.01.2010
Сообщений: 106
11.10.2011, 18:40  [ТС] 12
Цитата Сообщение от accept Посмотреть сообщение
чего ?
Сорри, просматривал тему когда ты еще не добавил решения пятого, а потом зашел обратно через полчаса и, не заметив то, что ты написал решение пятого, написал:
"А как быть с пятым?"

Добавлено через 7 минут
И еще один вопрос:
как узнать самое большое число в массиве?
0
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 18:43 13
Цитата Сообщение от zago-vlad Посмотреть сообщение
как узнать самое большое число в массиве?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int array[8];
 
// ..
 
int i;
 
int max = array[0];
 
for( i = 0; i < 8; i++ )
{
   if( array[i] > max )
      max = array[i];
}
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
11.10.2011, 19:45 14
Цитата Сообщение от talis Посмотреть сообщение
А как понимать это выражение в fscanf:
C
1
"%*[^\n]%c"
Звёздочка - понятно, прочтённый символ никуда не сохраняется. А что такое [^\n] ?
[^\n] - считать последовательность символов, пока не встретиться '\n', поскольку перед квадратными скобками звездочка, значит игнорировать эти символы. %c - считываем сам '\n'.
Все вместе:
C
1
2
 while(fscanf(fp, "%*[^\n]%c", &ch) == 1) 
         cnt++;
считается кол-во строк в файле.

Я обычно вместо gets() пишу такую конструкцию:
C
1
scanf("%[^\n]*%c", str);
считываем строку до символа '\n' и удаляем его из потока.

Не по теме:

Хотя конечно это просто "чтоб запутать потенциального противника":D

2
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 19:48 15
Кстати, пока не забыл: есть ли в си аналог std :: istream :: putback( char ch ) ?
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
11.10.2011, 19:53 16
ungetc(), оно?
1
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2011, 19:55 17
Угу, оно, спасибо.
0
11.10.2011, 19:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2011, 19:55
Помогаю со студенческими работами здесь

Вопросы
Ребята, никто не писал никогда код на С++, связанный с имитационным моделированием? Просто, дали,...

Вопросы по с/с++
Хотелось бы узнать , есть ли сайты по с\с++ которые содержат только вопросы и ответы по всем темам....

Вопросы :)
1) Подскажите, пожалуйста, как подсчитать позицию моего сайта в разных поисковиках по определенному...

Вопросы по C++
Пожалуй начну) Можно ли в С++, обьявить определенному элементу массива определенное значение, как...


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

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