PDA

Показать полную графическую версию : Прошу помочь найти ошибку в программе.


Sox
04-12-2005, 12:38
Всем привет! :)
У меня вот возник такой вопрос, на который я уже совершенно не знаю ответа....
я как бы занимаюсь в данное время изучением программирования на языке С с использованием массивов и на данном этапе передо мной встал такой вопрос:
необходимо написать программу:
Вводится ряд Т, состоящий из символов, затем вводятся значения символов u и v. Программа заменяет в ряду Т значения символа u на значения символа v и наоборот, значения символа v на значения символа u. Т.о. формируется ряд Q, который и выводится на экран. Как я понял, Т, Q, u, v - это все массивы. Все это выглядит примерно так:
T= asdafgfh
v=a;
u=f;
Q=fsdfagah
Ну и написал я как бы соответствующую программу:

#include <stdio.h>
int main()
{
char T[10], Q[10], v[1], u[1];//* u, v - это у нас массивы, состоящие из 1-ого элемента*//
char temp[10];
int i=0;

{ printf("Enter T: ", T[10]);
scanf("%s", &T[10]);
T[10]=temp[10];//* отправляем полученный ряд Т во временную папку temp*//
temp[10]=Q[10];//*как бы присваиваем ряду Q значения ряда Т, т.е. т.о. ряд Q у нас формируется из символов ряда T*// }
printf("Please, enter u:", u[1]);
scanf ("%s", & u[1]);
printf("Please, enter v:", v[1]);
scanf ("%s", & v[1]);
do { Q[i]=0;//* Определяем i-тый элемент ряда Q*// }
while ((i=i+1)<=10);
do { temp[i]=0;//*Определяем i-тый элемент ряда temp (Q=T=temp)*// }
while ((i=i+1)<=10);
for(i = 0; i<=10; ++i)
if(Q[i]==u[1])
{ Q[i]==v[1]; }
else
{ Q[i]==temp[i]; }//*Если и-тый элемент равен значению u, меняем его на значение v, в противном случае он равен своему прежнему значению, взятому из temp*//
if (Q[i]==v[1])
{ Q[i]==u[1]; }
else
{ Q[i]==temp[i]; }//* то же самое, только теперь с v*//
Q[10]==Q[1]&&Q[2]&&Q[3]&&Q[4]&&Q[5]&&Q[6]&&Q[7]&&Q[8]&&Q[9];
{ printf("Q=10.0 %s/n",Q[10]);
}


Вот только программа эта не работает... она запускается, запрашивает введение T, u, v, а потом просто выдает ошибку segmentation fault. Кто-нибудь может подсказать почему? Спасибо.... :)

Sox
04-12-2005, 14:00
Ну вооот... уже 11 человек сюда посмотрели и никто ничего не ответил.... что, неужели это ТАК сложно?

Zippy
04-12-2005, 15:56
&T[10] что за туфта?
может попробовать просто scanf("%s", T);
Кстати, и зачем необходимо использовать массив из одного!! элемента???
Потом непонятно зачем нужно два цикла?
Может я чего-то не догоняю, но прога кривая
Остальное лень разбирать, хоть бы пост оформил по нормальному...

Duddits
04-12-2005, 16:15
Не понял,зачем тебе u и v как массивы???
Что за извращение иметь массив содержащий одно значение??
К тому же когда обращаешься к первому элементу массива,то надо v[0] ато так ты вылетаешь за границы массива.
ПО крайней мере если писать под винду то это так
Под Никсы не писал никогда

mar
04-12-2005, 17:19
Duddits
первый элемент массива зависит не от ОС, а от спецификации языка C =) И он действительно 0-ой - Вы абсолютно правы.
Sox
ну собственно, ребята уже поотвечали. Внесу свои 5 копеек вроде бы не по прямому вопросу, нео имхо по теме. Есть разные способы выяснять, что в программе где сломалось, - можно использовать специальные среды разработки, позволяющие пошаговую трассировку и обозначение точек останова. А можно в простейших случаях и для небльших программ сделать это вручную:
Если программа валится, попробуйте выяснить где именно. Для этого можно пошагово с первых строчек ставить printf результата на этот момент (или значение какой-либо переменной) и выход из фуенции/программы. Таким образом в маленькой программе очень быстро находится непотребное =) место. Дальше смотрится на него пристально и думается в чем ошибка :) Если не придумывается, - пишется сюда :)
ps а код, действительно надо оформлять так, чтоб его можно было читать (со всеми отступами и по всем правилам). В этом форуме для этого служит тег-контейнер [code]

Sox
04-12-2005, 17:32
Zippy
Ну так я и говорю о том, что прога кривая и прошу написать как это дело исправить... а то я и сам не догоняю этого...я же не писал, что прошу найти ошибку в нормально работающей программе вроде бы.... и чем не нравится оформление поста? Я пробовал использовать тег вставки кода на форуме, но оформление от этого только хуже...
Нет, вариант scanf("%s", T) не прокатывает...
массивы с одним значением нужны чтобы их сравнивать с элементами ряда.
Если оставить их как просто u, v... то будет ошибка в сравнении.... переменной с массивом...

Sox
04-12-2005, 17:36
mar
Ну собственно мне мало че понятно из их ответов... можно попросить как бы чтобы ответы содержали какие-либо конкретные указания для компилятора, что и как он должен делать... в сущности ведь программа достаточно простая... и для человека, который действительно разбирается в этом вопросе не должно составить труда объяснить мне как начинающему как исправить эту программу в таком ключе, чтобы она заработала...а то она отказывается...

mar

насколько я слышал от других, что-то неверно в самом алгоритме действий... чтобы знающий человек мог понять что неверно, я и снабдил его соответствующими комментами...
Там щас ответ получается Q=10.0 (null)/n
Мне это не нравится...
Еще я не знаю как вообще получить Q - как его в конце посчитать? Тот метод, который я использую, не проходит...

Zippy
04-12-2005, 17:48
Sox
Воспользуйся советом mar Если программа валится, попробуйте выяснить где именно. Для этого можно пошагово с первых строчек ставить printf результата на этот момент... А также воспользуйся контейнером code...

Вот проанализоровал, что получили:
1. T[10]=temp[10];//* отправляем полученный ряд Т во временную папку temp*// возможно вываливается здесь, используй функцю strcpy, кажись так называется для копирования одной строки в другую, а этим оператором у тебя 11 элемент массива Т равен 11 элементу temp
2. temp[10]=Q[10]; см п.1
3. printf("Enter T: ", T[10] ) - неправильно, T[10] зачем, если у тебя нет в строке соответствующего %flag?
4. printf("Please, enter u:", u[1]); и printf("Please, enter v:", v[1]); см п.3
5. замени scanf("%s", T), и весь ввод данных в таком же духе...
6. После ввода всех данных выведи то что ты ввел и проверь, что данные введены правильно.
7. Да и вообще как твоя прога компилится, объясни??
8. На счет массива из одного элемента, не проще так:
chat u, v;
if(Q[i] == u)
9. про циклы я уж молчу, ничего не понятно

Zippy
04-12-2005, 17:52
что-то неверно в самом алгоритме действий гыгы, по-моему там асболютно все неверно!!! :)

Sox
04-12-2005, 17:53
Duddits
Я не к элементу массива обращаюсь, а к самому массиву... U и v - это массивы, содержащие какой-либо символ...если можно все это сделать без использования массивов, то попрошу показать как... :)

Sox
04-12-2005, 17:54
Zippy
Щас посмотрим... http://www.forum.oszone.net/images/smilies/new/smile.gif

Zippy
04-12-2005, 18:15
Вот код:
#include <stdio.h>
#include <string.h>
#define N 10

void main()
{
char T[ N ], Q[ N ]; // Объявляем массивы
char v, u, tmp; // Заменяемые символы
int i = 0; // счетчик
int lenQ = 0; // Длина строки


// Вводим данные
printf( "Enter T: " );
scanf( "%s", T );
printf( "\nPlease, enter u:" );
scanf ( "\n%1s", &u );
printf( "\nPlease, enter v:" );
scanf ( "\n%1s", &v );

// Выводим полученные данные
printf( "\nYou entered: T=%s, u=%c, v=%c", T, u, v );

// Копируем Т в Q
strcpy( Q, T );

// Получаем и выводим длину строки
lenQ = strlen( Q );
printf( "\nLength T: %d\n", lenQ );

// Пробегаем в цикле по строке
for( i = 0; i < lenQ; i++ )
{
tmp = Q[ i ];
if( tmp == u )
Q[ i ] = v;
if( tmp == v )
Q[ i ] = u;
}
// Выводим результат
printf( "\nResult Q: %s", Q );
}

Результат:
Enter T: asdafgfh
Please, enter u:a
Please, enter v:f
You entered: T=asdafgfh, u=a, v=f
Length T: 8
Result Q: fsdfagah


C тебя пиво!!! :)

Sox
04-12-2005, 18:17
Щас потестим... если заработает, кидай адрес, пришлю!
:)
На первый взгляд выглядит неплохо! :)

Zippy
04-12-2005, 18:21
Хм, странный здесь контейнер code, куда он все пробелы мои дел в начале каждой строки? Да и еще это полоса прокрутки, неудобно с ней...

Sox
04-12-2005, 19:12
Zippy
И правда работает!
Кидай свой адрес куда-нибудь, такая помощь не может остаться без вознаграждения...
:)

Duddits
05-12-2005, 08:47
mar
Ну скорее зависит от компиллятора имхо.....




© OSzone.net 2001-2012