IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Помогите решить задачу на работу со строками в СИ, Turbo C++
Vitali4
сообщение 15.04.2007 13:38
Сообщение #1





Группа: Пользователи
Сообщений: 1
Пол: Мужской
Реальное имя: Виталий

Репутация: -  0  +


Текст такой:
Исходная строка содержит сведения о человеке: фамилию, инициалы, год рождения, рост в см. Эти сведения отделены друг от друга пробелами. Например:
Иванов И.И. 1976 187
И.И. Иванов 187 1976
187 И.И. 1976 Иванов и т. п.
Нужно вывести эти сведения на экран в следующем виде:
Иванов И.И. 1976 года рождения имеет рост 187 см.


Начал решать самым дубовым способом, вот что получилось:
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
 main ()

 {
   unsigned char s[80], f[30], in[4], year[4], r[3];
   int k=0, a=0, b=0, c=0, q=0;
  //заставка
    printf("\n\nАвтор: \nВиталий\nCтудент группы Р-16062 \nЕкатеринбург 2007\n\n");
    printf("\nИсходная строка содержит сведения о человеке: фамилию,\nинициалы, год рождения, рост в сантиметрах.");
    printf("\nЭти сведения расположены в произвольном порядке,\nотделены друг от друга пробелами.\n\nНапример:");
    printf("\nИванов И.И. 1976 187\nИ.И. Иванов 187 1976\n187 И.И. 1976 Иванов и т.п.\n\nВывести эти сведения на экран в следующем виде:\n");
    printf("Иванов И.И. 1976 года рождения имеет рост 187 см.");
    printf("\n\nВведите исходную строку....\n");
  //ввод исходных данных
    gets(s);

  //Ищем кол-во символов в фамилии...
     for (int l=0; l<80; l++) if ((s[l]>=160 && s[l]<=175) || (s[l]>=224 && s[l]<=239)) q=q+1;
     cout<<q;
  //Находим фамилию, инициалы, год рождения и рост и копируем их во вспомогательные массивы
     for (int i=0; i<80; i++)

       if ((s[i]>=128 && s[i]<=159) && ((s[i+1]>=160 && s[i+1]<=175) || (s[i+1]>=224 && s[i+1]<=239)))

	  { for (int j=i; j<i+q; j++)
	    {
	     f[k]=s[j];
	     k++;
	    }
	   f[k]=0;
	   break;
	  }

  /*   for (i=0; i<80; i++)

       if (s[i]>=128 && s[i]<=159 && s[i+1]==46)

	  { for (int j=i; s[j]!=' '; j++)
	     {
	      in[a]=s[j];
	      a++;
	     }
	    in[a]=0;
	    break;
	  }
  */
     for (i=0; i<80; i++)

       if (s[i]==49 && (s[i+3]>=48 && s[i+3]<=57))

	  { for (int j=i; s[j]!=' '; j++)
	     {
	      year[b]=s[j];
	      b++;
	     }
	    year[b]=0;
	    break;
	  }

   /*  for (i=0; i<80; i++)

       if (s[i]>=49 && (s[i+2]>=48 && s[i+2]<=57))

	  { for (int j=i; s[j]!=' '; j++)
	     {
	      r[c]=s[j];
	      c++;
	     }
	    break;
	  }
   */
//вывод данных

    puts(f);
//    cout<<" ";
//    puts(in);
//    cout<<" ";
//    puts(year);
//    cout<<" года рождения имеет рост ";
  //  puts(r);
//    cout<<" см.";

    getche();

    return 0;
 }

это работает с ощибками: Вместе с фамилией выдается еще несколько ненужных символов, иногда программа зависает, не правильно определяются Дата рождения и Рост.

Помоготи пожалуйста!

Заранее благодарен
Vitaliy
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.04.2007 15:12
Сообщение #2


Гость






#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
int main () {

  unsigned char s[80], f[30], in[5];
  char *p;
  int n, year, r;

  // заставка
    printf("\n\nАвтор: \nВиталий\nCтудент группы Р-16062 \nЕкатеринбург 2007\n\n");
    printf("\nИсходная строка содержит сведения о человеке: фамилию,\nинициалы, год рождения, рост в сантиметрах.");
    printf("\nЭти сведения расположены в произвольном порядке,\nотделены друг от друга пробелами.\n\nНапример:");
    printf("\nИванов И.И. 1976 187\nИ.И. Иванов 187 1976\n187 И.И. 1976 Иванов и т.п.\n\nВывести эти сведения на экран в следующем виде:\n");
    printf("Иванов И.И. 1976 года рождения имеет рост 187 см.");
    printf("\n\nВведите исходную строку....\n");
  // ввод исходных данных

  gets(s);
  p = strtok(s, " ");
  while(p) {
    n = atoi(p);
    if(n) {

      if(n > 300) year = n;
      else r = n;

    }
    else {

      if(strchr(p, '.')) strcpy(in, p);
      else strcpy(f, p);

    }
    p = strtok(NULL, " ");

  }
  while(p);
  printf("%s %s %4d года рождения имеет рост %3d см.", f, in, year, r);
  getche();

  return 0;
}

Так?

Если что-то непонятно, спрашивай...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 28.07.2025 5:49
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"