Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Помогите решить задачу на работу со строками в СИ

Автор: Vitali4 15.04.2007 17:38

Текст такой:
Исходная строка содержит сведения о человеке: фамилию, инициалы, год рождения, рост в см. Эти сведения отделены друг от друга пробелами. Например:
Иванов И.И. 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®;
// cout<<" см.";

getche();

return 0;
}

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

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

Заранее благодарен
Vitaliy

Автор: volvo 15.04.2007 19:12

#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;
}

Так?

Если что-то непонятно, спрашивай...