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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2014, 12:18   #1
Nikolay625
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
По умолчанию Си строку в вектор

Помогите, вот написал часть кода для преобразования строки char в вектор int. Допустим я ввел с консоли строку 12 23 34 45 мне надо преобразовать её в вектор vect[12][23][45][56], первое число преобразует, но последующие не меняются, так и выводит первое число три раза(все printf для проверки).
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char str[50];
	char str1[10];
	int i, j, n, m, s, k,t;
	int vect[50]; 
	int diap[50];
									
	printf("\nLabortornaya rabota 7_2");
	printf("\nVariant #12");
	printf("\nMR-12-1-1");
	printf("\nShabaldin Nikolay\n");

	printf("\nVvedite stroku simvolov:\n");	//ввод исходных данных
	printf("\n str=");						
	gets(str);
	printf("\n%s", str);
	
	n = strlen(str);	//длина строки
	s=m=t=0;
	for (i=0; i<n; i++)
	{
		if (str[i]==' ')
		{
			for(j=m;j<i;j++)
			{
				k=0;
				str1[k]=str[j];  \\ДУМАЮ ПРОБЛЕМ ЗДЕСЬ
				k++;
				printf("\n%s", str1);
			}
		vect[s]=atoi(str);
		s++;
		m=i+1;
		t++;
		strcpy(str1,"");
		}
	}
	
	printf("\n%d", vect[0]);
	printf("\n%d", vect[1]);
	printf("\n%d", vect[2]);
	getch();
	return 0;
}
Nikolay625 вне форума Ответить с цитированием
Старый 02.06.2014, 13:02   #2
Nikolay625
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
По умолчанию

часть проблемы решил, переместив char str1[10] перед вторым For. каждый раз строка обнуляется, но в этом присвоении str1[k]=str[j] строка str1 каждый раз становится равной str[j], а не прибавляется следующий элемент
Nikolay625 вне форума Ответить с цитированием
Старый 02.06.2014, 13:13   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А можно узнать что это за вектор такой: vect[12][23][45][56]
?
Т.е. что имеется ввиду под этим описаловом.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.06.2014, 13:32   #4
Nikolay625
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
По умолчанию

эммм... вектор как вектор, ну или одномерный массив, если вы об этом
Nikolay625 вне форума Ответить с цитированием
Старый 02.06.2014, 13:49   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну просто по моему понимаю vect[12][23][45][56] это четырехмерный массив. А никак не вектор.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.06.2014, 13:54   #6
Nikolay625
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
По умолчанию

vect[0]=12; vect[1]=23; vect[2]=45; vect[3]=56 пойдет?
Nikolay625 вне форума Ответить с цитированием
Старый 02.06.2014, 13:57   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Терь ясно.
А набор будет фиксированный? Или через пробел может быть сколько угодно чисел?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.06.2014, 14:03   #8
Nikolay625
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
По умолчанию

вот скрин консоли
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char str[50];
	char str1[10];
	int i, j, n, m, s, k,t;
	int vect[50]; 
	int diap[50];
									
	printf("\nLabortornaya rabota 7_2");
	printf("\nVariant #12");
	printf("\nMR-12-1-1");
	printf("\nShabaldin Nikolay\n");

	printf("\nVvedite stroku simvolov:\n");	//ввод исходных данных
	printf("\n str=");						
	gets(str);
	printf("\n%s", str);
	
	n = strlen(str);	//длина строки
	s=m=t=0;
	for (i=0; i<n; i++)
	{
		if (str[i]==' ')
		{
			char str1[10];
			for(j=m;j<i;j++)
			{
				k=0;
				str1[k]=str[j];
				k++;
				printf("\n%s", str1);
			}
		vect[s]=atoi(str1);
		printf("\n--%d", vect[s]);
		s++;
		m=i+1;
		t++;
		//strcpy(str1,"");
		}
	}
	
	printf("\n+%d", vect[0]);
	printf("\n+%d", vect[1]);
	printf("\n+%d", vect[2]);
	getch();
	return 0;
}
максимум 20 символов в str
Лабу делаю
"
Строка состоит из натуральных чисел, разделенных пробелом, и диапазонов чисел (начальное число-тире-конечное число). Удалить из строки все числа, входящие в эти диапазоны. Оставшиеся числа вывести на экран по возрастанию (диапазоны не выводить).

Входные данные:
15 9 2 5 3-6 1 3 7-10

Выходные данные:
1 2 15
"

во, k не в том месте обнулял
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char str[50];
	char str1[10];
	int i, j, n, m, s, k,t;
	int vect[50]; 
	int diap[50];
									
	printf("\nLabortornaya rabota 7_2");
	printf("\nVariant #12");
	printf("\nMR-12-1-1");
	printf("\nShabaldin Nikolay\n");

	printf("\nVvedite stroku simvolov:\n");	//ввод исходных данных
	printf("\n str=");						
	gets(str);
	printf("\n%s", str);
	
	n = strlen(str);	//длина строки
	s=m=t=0;
	for (i=0; i<n; i++)
	{
		if (str[i]==' ')
		{
			k=0;
			char str1[10];
			for(j=m;j<i;j++)
			{
				
				str1[k]=str[j];
				k++;
				printf("\n%s", str1);
			}
		vect[s]=atoi(str1);
		printf("\n--%d", vect[s]);
		s++;
		m=i+1;
		t++;
		strcpy(str1,"");
		}
	}
	
	printf("\n+%d", vect[0]);
	printf("\n+%d", vect[1]);
	printf("\n+%d", vect[2]);
	getch();
	return 0;
}
но от куда берутся эти левые символы?
Изображения
Тип файла: jpg Screenshot_2.jpg (23.8 Кб, 54 просмотров)
Тип файла: jpg Screenshot_3.jpg (19.9 Кб, 46 просмотров)

Последний раз редактировалось Stilet; 02.06.2014 в 14:28.
Nikolay625 вне форума Ответить с цитированием
Старый 02.06.2014, 14:26   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Так погодь погодь... Вот я бы извернулся так:
Код:
// pop.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
	int vec[50]={0},i=1,n=0;
	char c;
	for(int j=0;i;j++) {
		i=scanf("%d",&vec[j]);
		scanf("%c",&c);
		n++;
		if(c=='.') break;
	}

	for(int j=0;n;j++,n--) 
		printf("%d\n",vec[j]);
	getchar();getchar();
	return 0;
}
Это как раз введение чисел в строку, а потом развод их по вектору. Единственное условие - строка введенных чисел должна оканчиваться на точку, чтоб цикл вода завершился. Может будешь от такого метода отталкиваться?
Просто твое разведение строки мну цуцут шокируетЪ. Уж не обижайся )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.06.2014, 17:28   #10
Nikolay625
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
По умолчанию

Почти доделал своего "франкенштейна" осталось только вектор обратно преобразовать в строку, не подскажите как?
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	char str[50];
	char str1[10];
	int i, j, n, m, s, k,t, d, v, tmp, max, min;
	int vect[50]; 
	int diap[50];
	int vect2[50]={0};
									
	printf("\nLabortornaya rabota 7_2");
	printf("\nVariant #12");
	printf("\nMR-12-1-1");
	printf("\nShabaldin Nikolay\n");

	printf("\nVvedite stroku simvolov:\n");	//ввод исходных данных
	printf("\n str=");						
	gets(str);
	printf("\n%s", str);
	
	n = strlen(str);	//длина строки
	d=s=m=t=0;
	for (i=0; i<n; i++)
	{
	if (str[i]==' ')
		{
			k=0;
			char str1[10]="aaaaaaaaaa";
			for(j=m;j<i;j++)
			{
				
				str1[k]=str[j];
				k++;
				printf("\n%s", str1);
			}
		vect[s]=atoi(str1);
		if (str[m-1]=='-')
		{
			diap[d]=vect[s];
			d++;
		}
		printf("\n--%d", vect[s]);
		s++;
		m=i+1;
		t++;
		
		
		}
	if (str[i]=='-')
		{
			k=0;
			char str1[10]="aaaaaaaaaa";
			for(j=m;j<i;j++)
			{
				
				str1[k]=str[j];
				k++;
				printf("\n%s", str1);
			}
		diap[d]=atoi(str1);
		printf("\n--%d", vect[s]);
		m=i+1;
		d++;

		}

	}
max=diap[0]; //Находим минимум и максимум среди чисел диапозона
min=diap[0];
for (i=0;i<d;i++)
	{
		if (diap[i]>max)
			max=diap[i];
		else
			min=diap[i];
	}
v=0; //Находим числа не входящие в диапозон
for (i=0;i<t;i++)
	{
		if (vect[i]<min)
		{
			vect2[v]=vect[i];
			v++;
			
		}
		if (vect[i]>max)
		{
			vect2[v]=vect[i];
			v++;
			
		}
	}

for(i=v-1;i>=1;i--)//Сортируем получ вектор по возрастанию
        for(j=0;j<i;j++)
        {
            if(vect2[j]>vect2[j+1])
            {// меняем местами элементы
            tmp=vect2[j];
            vect2[j]=vect2[j+1];
            vect2[j+1]=tmp;
            }
        }


		
		
	for (i=0; i<t; i++)
	printf("\n+%d", vect[i]);
	for (i=0; i<d;i++)
		printf("\n++%d", diap[i]);
		for (i=0; i<v;i++)
		printf("  \n%d", vect2[i]);
printf("\nmax=%d", max);
printf("\nmin=%d", min);
	getch();
	return 0;
}
Изображения
Тип файла: jpg Screenshot_4.jpg (45.3 Кб, 62 просмотров)
Nikolay625 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
процедуры и функции : Дан вектор A(n). Построить вектор B(n), i-ый элемент которого равен среднему арифметическому (Паскаль) vladicvladic123 Помощь студентам 2 04.12.2013 14:56
Дан вектор А(n). Получить новый вектор путем умножения элементов стоящих за максимальным элементом на минимальный элемент вектора pavel215 Паскаль, Turbo Pascal, PascalABC.NET 1 02.04.2013 14:30
Двунаправленный линейный список строк. Вставить строку, удалить строку и заменить строку tarasman11 Паскаль, Turbo Pascal, PascalABC.NET 4 05.07.2012 20:27
Копировать строку фильтрованного списка в другую книгу, на последнюю пустую строку Gvaridos Microsoft Office Excel 11 24.11.2010 00:48
Как при нажатии на строку в Listbox передавать нажатую строку в переменную Михаил Юрьевич Общие вопросы Delphi 5 16.03.2009 12:59