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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2022, 20:03   #1
phorzheim
Пользователь
 
Регистрация: 08.11.2022
Сообщений: 14
По умолчанию Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа

Написать программу, которая считывает текст из файла и выводит на экран только
строки, содержащие двузначные числа
phorzheim вне форума Ответить с цитированием
Старый 10.11.2022, 20:42   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
	sub	esp, 16
	xor	edx, edx
	xor	ecx, ecx
	mov	ebx, file_name
	mov	eax, 5
	int	128
	test	eax, eax
	js	.error0

	mov	edi, 2
	mov	esi, esp
	xor	edx, edx
	mov	[esp + 8], eax
	xor	ecx, ecx
	mov	ebx, eax
	mov	eax, 140
	int	128
	test	eax, eax
	jz	.error1
	cmp	[esp + 4], 0
	jnz	.error2

	xor	ebx, ebx
	mov	eax, 45
	int	128
	mov	ecx, [esp]
	test	eax, eax
	js	.error3
	mov	[esp + 12], eax
	lea	ebx, [eax + ecx]
	cmp	ebx, eax
	jc	.error4
	mov	eax, 45
	int	128
	test	eax, eax
	js	.error5

	xor	edi, edi
	mov	esi, esp
	xor	edx, edx
	xor	ecx, ecx
	mov	ebx, [esp + 8]
	mov	eax, 140
	push	dword [esp]
	int	128
	pop	dword [esp]
	test	eax, eax
	js	.error6

	mov	edx, [esp]
	mov	ecx, [esp + 12]
	mov	ebx, [esp + 8]
	mov	eax, 3
	int	128
	cmp	eax, edx
	jnz	.error7

	mov	ebx, [esp + 8]
	mov	eax, 6
	int	128

	mov	esi, [esp + 12]
	mov	ecx, [esp]
	mov	edx, esi

  .loop:
	lods	byte [esi]
	cmp	al, 13
	jz	.eoln
	cmp	al, 10
	jz	.eoln
	cmp	esi, ecx
	jc	.loop
	jmp	.quit

  .eoln:
	lea	ebx, [esi - 1]
	cmp	esi, ecx
	je	.line
	cmp	byte [esi], 13
	jz	.skip
	cmp	byte [esi], 10
	jnz	.line

  .skip:
	lods	byte [esi]

  .line:
	cmp	byte [edx], '-'
	jz	.sign
	mov	eax, ebx
	sub	eax, edx
	cmp	eax, 2
	ja	.next
	mov	ax, [edx]
	jmp	.test

  .sign:
	mov	eax, ebx
	sub	eax, edx
	cmp	eax, 3
	ja	.next
	mov	ax, [edx + 1]

  .test:
	cmp	al, '0'
	jc	.next
	cmp	al, '9'
	ja	.next
	cmp	ah, '0'
	jc	.next
	cmp	ah, '9'
	ja	.next
	push	ecx
	push	ebx
	mov	ecx, edx
	mov	edx, ebx
	mov	ebx, 1
	sub	edx, ecx
	mov	eax, 4
	int	128
	pop	ebx
	pop	ecx

  .next:
	mov	edx, esi
	cmp	esi, ecx
	jc	.loop

  .quit:
	mov	ebx, [esp + 12]
	mov	eax, 45
	int	128

	add	esp, 16
	xor	ebx, ebx
	mov	eax, 1
	int	128

  struc ERRSTR txt& { label .
	mov	edx, .#_len
	mov	ecx, .#_msg
	jmp	.#_skp
   label .#_msg byte
   db txt
   .#_len = ( $ - . )
   db 0 
   label .#_skp }

  .error7	ERRSTR "Ошибка чтения файла!"
	jmp	@f

  .error6	ERRSTR "Ошибка доступа к файлу!"

  @@:
	push	ecx
	push	edx
	mov	ebx, [esp + 20]
	mov	eax, 45
	int	128
	pop	edx
	pop	ecx
	jmp	@f

  .error5	ERRSTR "Не возможно выделить память!"
	jmp	@f

  .error4	ERRSTR "Не достаточно памяти!"
	jmp	@f

  .error3	ERRSTR "Ошибка выделения памяти!"
	jmp	@f

  .error2	ERRSTR "Файл слишком длинный!"
	jmp	@f

  .error1	ERRSTR "Нет данных о длине файла!"

  @@:
	push	ecx
	push	edx
	mov	ebx, [esp + 16]
	mov	eax, 6
	int	128
	pop	edx
	pop	ecx
	jmp	.error

  .error0	ERRSTR "Не могу открыть файл!"

  .error:
	add	esp, 16

	mov	ebx, 1
	mov	eax, 4
	int	128

	mov	ebx, 1
	mov	eax, 1
	int	128

  file_name db 'input.txt'
Это будет по длиннее, но вроде без опечаток.

Последний раз редактировалось macomics; 10.11.2022 в 20:51.
macomics вне форума Ответить с цитированием
Старый 11.11.2022, 04:55   #3
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

phorzheim, если надо на C++, то можно так:
Код:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

bool is_non_zero_digit(char elem) {
  return ('1' <= elem) && (elem <= '9');
}

bool is_digit(char elem) {
  return ('0' <= elem) && (elem <= '9');
}

bool contains_2_digit_number(const char* text) {
  int pos = 0;
  for (;;) {
    while ((text[pos] != '\0') && !is_non_zero_digit(text[pos])) {pos++;}
    if (text[pos] == '\0') {break;} // если дошли до конца текста
    int start = pos; // дошли до ненулевой цифры
    pos++; // пропускаем первую цифру
    while (is_digit(text[pos])) {pos++;} // пропускаем остальные цифры
    int digits_count = pos - start;
    if (digits_count == 2) {
      return true;
    }
  }
  return false;
}

int main() {
  ifstream file("data.txt");
  if (file.fail()) {
    cerr << "Cannot open file." << endl;
    return 1;
  }
  while (!file.eof()) {
    string line;
    getline(file, line);
    if (contains_2_digit_number(line.c_str())) {
      cout << line << endl;
    }
  }
  return 0;
}
Текст «01» не считается двузначным числом. Текст «-10» считается двузначным числом.
Пётр Седов вне форума Ответить с цитированием
Старый 26.11.2022, 16:49   #4
phorzheim
Пользователь
 
Регистрация: 08.11.2022
Сообщений: 14
Печаль

Но нужен С#
phorzheim вне форума Ответить с цитированием
Старый 26.11.2022, 21:31   #5
Areostar
Пользователь
 
Регистрация: 19.12.2007
Сообщений: 50
По умолчанию

Цитата:
Сообщение от phorzheim Посмотреть сообщение
Но нужен С#
А что не понятно? как фаил читать или как строки парсить? У гугла спрашивать пробывали?
Areostar вне форума Ответить с цитированием
Старый 26.11.2022, 22:21   #6
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

phorzheim, на C# можно так:
Код:
using System;
using System.IO;

class program {
  static void Main() {
    string[] lines = File.ReadAllLines("data.txt");
    foreach (string line in lines) {
      if (contains_2_digit_number(line)) {
        Console.WriteLine(line);
      }
    }
    Console.ReadKey();
  }

  static bool contains_2_digit_number(string text) {
    int text_len = text.Length;
    int pos = 0;
    for (;;) {
      while ((pos < text_len) && !is_non_zero_digit(text[pos])) {pos++;}
      if (pos == text_len) {break;} // если дошли до конца текста
      int start = pos; // дошли до ненулевой цифры
      pos++; // пропускаем первую цифру
      while ((pos < text_len) && is_digit(text[pos])) {pos++;} // пропускаем остальные цифры
      int digits_count = pos - start;
      if (digits_count == 2) {
        return true;
      }
    }
    return false;
  }

  static bool is_non_zero_digit(char elem) {
    return ('1' <= elem) && (elem <= '9');
  }

  static bool is_digit(char elem) {
    return ('0' <= elem) && (elem <= '9');
  }
}
Пётр Седов вне форума Ответить с цитированием
Старый 27.11.2022, 02:25   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Пётр Седов, а знаки минусов в обоих программах не обрабатываете (т.е. отрицательные двухначные числа обе ваши программы не воспринимают совсем).
macomics вне форума Ответить с цитированием
Старый 27.11.2022, 03:08   #8
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

macomics, отрицательные двузначные числа обрабатываются правильно в обеих программах.
Код:
assert(contains_2_digit_number("-10"));
И я об этом даже специально написал:
Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
Текст «-10» считается двузначным числом.
Пётр Седов вне форума Ответить с цитированием
Старый 27.11.2022, 04:08   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тогда проверьте на ввод --010 или 0-0010

Не будем даже трогать abc-10
macomics вне форума Ответить с цитированием
Старый 27.11.2022, 04:18   #10
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

macomics, проверил:
Код:
assert(contains_2_digit_number("--010"));
assert(contains_2_digit_number("0-0010"));
assert(contains_2_digit_number("abc-10"));
Во всех 3-ёх случаях функция возвращает true. Я именно так и задумывал, чтобы начальные нули не учитывались. Если автора вопроса (phorzheim) что-то не устраивает, могу переделать.
Пётр Седов вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу, которая считывает текст из файла и выводит на экран сначала предложения, начинающиеся с однобуквенных слов, а denis121 C# (си шарп) 4 15.06.2013 12:22
Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа FredPerry Паскаль, Turbo Pascal, PascalABC.NET 1 26.05.2012 08:17
написать программу, которая считывает текст из файла и выводит на экран только те предложения, состоящие из заданного ко VovaMazur Помощь студентам 0 24.09.2011 14:51
программа, которая считывает текст из файла и выводит на экран только предложения, не содержащие запятых shadowfiend C++ Builder 2 09.05.2011 21:48
Написать программу, которая считывает текст из файла и выводит на экран все его предложения в обратном по avic Общие вопросы C/C++ 1 22.12.2010 12:41