1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
1

Подсчёт количества чисел в строке

28.01.2013, 22:53. Показов 2946. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подсчитать количество чисел в первой строке из текстового файла:
код написала, всё хорошо считывается из текстового файла и выводится на экран, но увы с подсчётом чисел пока не получается реализовать алгоритм
В текстовом файле находятся например:
1-я строка : 0,1 0,2 0,3 0,4
2-я строка: 0,5 0,6 0,7 0,8 0,9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
    FILE *fp;
    int count=0;
    char ch;
    if((fp=fopen(argv[1],"r"))==NULL){
        printf("Takogo fayla nety!!!\n");
        return 0;
    }
    while((ch=getc(fp))!='\n'){
        printf("%c",ch);
        if(isdigit(ch) && !isdigit(ch+1) && (ch+1)!=',')
            count++;
    }
    printf("\nFayl %s imeet v 1 stroke %d chisel\n",argv[1],count);
    return 0;
}
Добавлено через 2 часа 35 минут
help
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2013, 22:53
Ответы с готовыми решениями:

Подсчёт количества слов в строке
Помогите разобраться в проблемке. Программа должна считывать текст из файла по слову и копировать...

Подсчёт количества знаков препинания в строке
Здравствуйте. Помогите пожалуйста написать простейший алгоритм подсчёта количества знаков...

Подсчёт количества символов в строке (cin.getline)
Здравствуйте! Задача такова: нужно подсчитать количество символов 'a' в строке. Помогите,...

Подсчёт количества выпадений чисел в массиве.
Имеется одноразрядный массив а с набором чисел в нем . Порядок чисел в массиве рандомный. То есть...

21
12 / 12 / 0
Регистрация: 28.12.2012
Сообщений: 41
28.01.2013, 23:00 2
Цитата Сообщение от melanu Посмотреть сообщение
(ch+1)
Тут вы не переходите к следующему элементу, а значение хранящиеся в ch увеличиваете на 1
0
250 / 232 / 46
Регистрация: 05.02.2010
Сообщений: 3,288
28.01.2013, 23:06 3
C++
1
2
3
4
5
6
7
char buff[bufLen];
fgets(buff, bufLen, f);
int count = 0;
for(int i = 0; i < bufLen; i++)  {
if(isdigit(buff[i]))
count++;
}
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
29.01.2013, 12:18  [ТС] 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char *argv[]){
    FILE *fp;
    if((fp=fopen(argv[1],"r"))==NULL){
        printf("Takogo fayla nety!!!\n");
        return 0;
    }
    char buff[128];
    fgets(buff, 128, fp);
    int count = 0;
    for(int i = 0; i < 128; i++)  {
        if(isdigit(buff[i]) && !isdigit(buff[i+1]) && (buff[i+1])!=',')
            count++;
    }
    printf("\nFayl %s imeet v 1 stroke %d chisel\n",argv[1],count);
    return 0;
}
Даже если так, то выдаёт 15 чисел в 1 строке, хотя их на самом деле 11, нужно сделать ограничение, чтобы считывало только первую строку.

Добавлено через 12 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char *argv[]){
    FILE *fp;
    int i=0;
    if((fp=fopen(argv[1],"r"))==NULL){
        printf("Takogo fayla nety!!!\n");
        return 0;
    }
    char buff[128];
    while((buff[i]=getc(fp))!='\n'){
        printf("%c",buff[i]);
    }
    fgets(buff, 128, fp);
    int count = 0;
    for(i = 0; i < strlen(buff); i++){
            if(isdigit(buff[i]) && !isdigit(buff[i+1]) && (buff[i+1])!=',')
                count++;
    }
    printf("\nFayl %s imeet v 1 stroke %d chisel\n",argv[1],count);
    return 0;
}
Вот так вот почему-то работает, но если в строке есть целые числа она их несчитает

Добавлено через 12 часов 46 минут
help me
0
11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127
29.01.2013, 13:19 5
У тебя проблема в том, что ты считываешь нифига не первую строку, а вторую =)
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
29.01.2013, 13:25  [ТС] 6
почему не 1-ую? на экран выводится же 1-ая строка
C++
1
2
3
while((buff[i]=getc(fp))!='\n'){
        printf("%c",buff[i]);
    }
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 13:37 7
Цитата Сообщение от melanu Посмотреть сообщение
почему не 1-ую? на экран выводится же 1-ая строка
Вы читаете строку посимвольно используя цикл while, как уже было продемонстрировано выше для этого есть специально функция fgets(), которая читает строку целиком.

Добавлено через 3 минуты
Цитата Сообщение от melanu Посмотреть сообщение
help me
Вам нужен код в стиле С (как у вас) или в стиле С++?
0
11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127
29.01.2013, 13:37 8
Цитата Сообщение от melanu Посмотреть сообщение
почему не 1-ую? на экран выводится же 1-ая строка
Работаю в visual 2010, поэжтому немного переделал Ваш код, а именно:

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
#include <stdio.h>
#include<conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
 
 
int main(int argc, char *argv[]){
    FILE *fp;
    int i=0;
    if((fp=fopen("input.txt","r"))==NULL){
        printf("Takogo fayla nety!!!\n");
        return 0;
    }
    char buff[128];
    while((buff[i]=getc(fp))!='\n'){
        printf("%c",buff[i]);
    }
    fgets(buff, 128, fp);
    int count = 0;
    for(i = 0; i < strlen(buff); i++){
        if(isdigit(buff[i]) && !isdigit(buff[i+1]) && (buff[i+1])!=',')
            count++;
    }
    printf("\nFayl imeet v 1 stroke %d chisel\n",count);
    getch();
    return 0;
}
И смотря на то, как я изменяю в файле строку два, меняется и число в консольки, то ест ьваше count.
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
29.01.2013, 13:49  [ТС] 9
Цитата Сообщение от xtorne21st Посмотреть сообщение
Вы читаете строку посимвольно используя цикл while, как уже было продемонстрировано выше для этого есть специально функция fgets(), которая читает строку целиком.

Добавлено через 3 минуты

Вам нужен код в стиле С (как у вас) или в стиле С++?
неважно с или с++

Добавлено через 3 минуты
Цитата Сообщение от Apelsin199 Посмотреть сообщение
Работаю в visual 2010, поэжтому немного переделал Ваш код, а именно:

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
#include <stdio.h>
#include<conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
 
 
int main(int argc, char *argv[]){
    FILE *fp;
    int i=0;
    if((fp=fopen("input.txt","r"))==NULL){
        printf("Takogo fayla nety!!!\n");
        return 0;
    }
    char buff[128];
    while((buff[i]=getc(fp))!='\n'){
        printf("%c",buff[i]);
    }
    fgets(buff, 128, fp);
    int count = 0;
    for(i = 0; i < strlen(buff); i++){
        if(isdigit(buff[i]) && !isdigit(buff[i+1]) && (buff[i+1])!=',')
            count++;
    }
    printf("\nFayl imeet v 1 stroke %d chisel\n",count);
    getch();
    return 0;
}
И смотря на то, как я изменяю в файле строку два, меняется и число в консольки, то ест ьваше count.
Да действительно работает со 2 строкой, но почему так?

Добавлено через 6 минут
C++
1
2
3
while((buff[i]=getc(fp))!='\n'){
        printf("%c",buff[i]);
    }
Если убрать этот фрагмент кода, то считает правильно
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 14:03 10
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 <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
 
int main(void)
{
    FILE *fp;
    int i = 0;
    char buff[128];
 
    if((fp=fopen("input.txt","r"))==NULL){
        perror("Takogo fayla nety!!!");
        exit(1);
    }
 
    fgets(buff, 128, fp);
    int count = 0;
    bool state = false;
 
    for(i = 0; i < strlen(buff); i++){
        if (isdigit(buff[i]))
            state = true;
        else if (state) {
            state = false;
            ++count;
        }
    }
 
    fclose(fp);
 
    printf("\nFayl imeet v 1 stroke %d chisel\n",count);
    return 0;
}
2
250 / 232 / 46
Регистрация: 05.02.2010
Сообщений: 3,288
29.01.2013, 14:05 11
Читаешь первую строку
Цитата Сообщение от melanu Посмотреть сообщение
C++
1
while((buff[i]=getc(fp))!='\n'){ printf("%c",buff[i]); }
Читаешь вторую
Цитата Сообщение от melanu Посмотреть сообщение
C++
1
fgets(buff, 128, fp);
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 14:08 12
Цитата Сообщение от m1Rr0r Посмотреть сообщение
Читаешь первую строку
Цитата Сообщение от melanu Посмотреть сообщение
if((fp=fopen("input.txt","r"))==NULL){ printf("Takogo fayla nety!!!\n"); return 0; }
Не вводите в заблуждение).
Вот чтение первой строки:
Цитата Сообщение от melanu Посмотреть сообщение
while((buff[i]=getc(fp))!='\n'){ printf("%c",buff[i])
0
11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127
29.01.2013, 14:11 13
Цитата Сообщение от melanu Посмотреть сообщение
Если убрать этот фрагмент кода, то считает правильно
Тогда у вас два варианта, уберите, и пользуйтесь кодом, который предоставил xtorne21st, или читайте, что делают функция fgets.
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
29.01.2013, 14:23  [ТС] 14
Цитата Сообщение от xtorne21st Посмотреть сообщение
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 <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
 
int main(void)
{
    FILE *fp;
    int i = 0;
    char buff[128];
 
    if((fp=fopen("input.txt","r"))==NULL){
        perror("Takogo fayla nety!!!");
        exit(1);
    }
 
    fgets(buff, 128, fp);
    int count = 0;
    bool state = false;
 
    for(i = 0; i < strlen(buff); i++){
        if (isdigit(buff[i]))
            state = true;
        else if (state) {
            state = false;
            ++count;
        }
    }
 
    fclose(fp);
 
    printf("\nFayl imeet v 1 stroke %d chisel\n",count);
    return 0;
}
Почему-то считает не совсем верно
0
11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127
29.01.2013, 14:27 15
Цитата Сообщение от melanu Посмотреть сообщение
Почему-то считает не совсем верно
Что именно не так? У меня вроде все правильно считает.
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
29.01.2013, 14:29  [ТС] 16
Я под себя чуть переделала чтоб было более понятно вот эти куски:
int state = 0;
state = 1;
state = 0;
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 14:30 17
Вот ради примера, такая же самая программа только на с++
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
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <string>
#include <cctype>
using namespace std;
 
int main()
{
    ifstream input_file("input.txt", ifstream::in);
    if (!input_file.good()) {
        cerr << "Coldn't open file.\n";
        exit(1);
    }
 
    string line;
    bool state = false;
    size_t count = 0;
 
    getline(input_file, line);
    for (size_t i = 0; i <= line.size(); ++i) {
        if (isdigit(line[i]))
            state = true;
        else if (state) {
            state = false;
            ++count;
        }
    }
 
    cout << "We have " << count << " digits into the first line.\n";
 
    input_file.close();
 
    return 0;
}
0
11 / 11 / 0
Регистрация: 04.11.2012
Сообщений: 127
29.01.2013, 14:32 18
state, это я как понимаю, флаг, который принемает два значения, поэтому лучше, такие вещи делать bool, а не int. Сделайте обратно.
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
29.01.2013, 14:33  [ТС] 19
Спасибо переделаю!
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
29.01.2013, 14:35 20
Цитата Сообщение от Apelsin199 Посмотреть сообщение
state, это я как понимаю, флаг, который принемает два значения, поэтому лучше, такие вещи делать bool, а не int. Сделайте обратно.
Ну это она просто под С затачивает. Хотя в С99 можно использовать bool смело включив заголовок <stdbool.h>
0
29.01.2013, 14:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2013, 14:35
Помогаю со студенческими работами здесь

подсчёт количества членов в наиболее длинной подпоследовательности из одинаковых чисел
Для последовательности чисел подсчитать количество членов в наиболее длинной подпоследовательности...

Подсчёт чисел в строке
Сразу к делу-пользователь вводит текст(числа, символы, ПРОБЕЛЫ).надо подсчитать сколько в тексте...

Подсчёт слов в строке. Подсчёт символов в словах строки
Начал изучение строк в С++. Решая задачу по поиску количества строк и количеству указанных символов...

Подсчет количества простых чисел в строке
Доброго времени суток. Необходимо написать программу, которая бы подсчитывала количество простых...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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