Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование в *nix (http://forum.oszone.net/forumdisplay.php?f=35)
-   -   Прошу помочь найти ошибку в программе. (http://forum.oszone.net/showthread.php?t=57465)

Sox 04-12-2005 12:38 379666

Прошу помочь найти ошибку в программе.
 
Всем привет! :)
У меня вот возник такой вопрос, на который я уже совершенно не знаю ответа....
я как бы занимаюсь в данное время изучением программирования на языке С с использованием массивов и на данном этапе передо мной встал такой вопрос:
необходимо написать программу:
Вводится ряд Т, состоящий из символов, затем вводятся значения символов 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 379673

Ну вооот... уже 11 человек сюда посмотрели и никто ничего не ответил.... что, неужели это ТАК сложно?

Zippy 04-12-2005 15:56 379695

Цитата:

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

Duddits 04-12-2005 16:15 379698

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

mar 04-12-2005 17:19 379717

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

Sox 04-12-2005 17:32 379726

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

Sox 04-12-2005 17:36 379728

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

mar

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

Zippy 04-12-2005 17:48 379732

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 379733

Цитата:

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

Sox 04-12-2005 17:53 379734

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

Sox 04-12-2005 17:54 379735

Zippy
Щас посмотрим...

Zippy 04-12-2005 18:15 379741

Вот код:
Код:

#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 379743

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

Zippy 04-12-2005 18:21 379745

Хм, странный здесь контейнер code, куда он все пробелы мои дел в начале каждой строки? Да и еще это полоса прокрутки, неудобно с ней...

Sox 04-12-2005 19:12 379756

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

Duddits 05-12-2005 08:47 379888

mar
Ну скорее зависит от компиллятора имхо.....


Время: 18:54.

Время: 18:54.
© OSzone.net 2001-