Russian Qt Forum

Программирование => С/C++ => Тема начата: Anis от Май 22, 2011, 20:00



Название: Работа со строками
Отправлено: Anis от Май 22, 2011, 20:00
помогите с программой, пожалуйста, не могу понять почему она не работает  Непонимающий должно по введеным строкам (формат - имя и пять оценок через запятую) посчитать среднюю оценку и вывести в новый массив строк

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>

int main(int argc, char *argv[])
{

    float x,p; int i,j,n,z; char *p1,s[30][255],r[30][255];
    printf ("Введите количество студентов:\n");
    scanf ("%d",&n);
    fflush (stdin);
    printf ("Введите результаты:\n");
    for (i=0;i<n;i++)
            gets(s);
     for (i=0;i<n;i++)
    {
         x=0;
         j=0;
    while (j<strlen(s))
         {
        if (s[j]>='0' && s[j]<='5') {
            p=atof(&s[j]);
            x=x+p;
            j++;
        }
      i++;
    }
    x=x/5;
    sprintf (r,"%f",x);
    z=p1-s;
    strncpy(r,s,z);
     for (i=0;i<n;i++)
         printf ("%s",r);
     }
  fflush (stdin);
 getch ();
}


Название: Re: Работа со строками
Отправлено: LisandreL от Май 22, 2011, 20:13
Вы s объявили как двумерный массив, а обращаетесь как к одномерному.
Да и вообще это какой-то сборник жести, а не код.


Название: Re: Работа со строками
Отправлено: Anis от Май 22, 2011, 20:50
если обьявить как одномерный то ошибки лезут


Название: Re: Работа со строками
Отправлено: LisandreL от Май 22, 2011, 21:09
если обьявить как одномерный то ошибки лезут
Как раз если объявить как двумерный, то нелезут.
А если как одномерный, то всё компилируется (правда работать будет не так, как видимо задумывалось).
Цитировать
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>

int main(int argc, char *argv[])
{

    float x,p; int i,j,n,z; char *p1,s[255],r[255];
    printf ("Введите количество студентов:\n");
    scanf ("%d",&n);
    fflush (stdin);
    printf ("Введите результаты:\n");
    for (i=0;i<n;i++)
            gets(s);
     for (i=0;i<n;i++)
    {
         x=0;
         j=0;
    while (j<strlen(s))
         {
        if (s[j]>='0' && s[j]<='5') {
            p=atof(&s[j]);
            x=x+p;
            j++;
        }
      i++;
    }
    x=x/5;
    sprintf (r,"%f",x);
    z=p1-s;
    strncpy(r,s,z);
     for (i=0;i<n;i++)
         printf ("%s",r);
     }
  fflush (stdin);
 getch ();
}
Отсюда вывод - надо править не объявления, а обращения к массивам, циклы и т.п.


Название: Re: Работа со строками
Отправлено: kambala от Май 22, 2011, 21:39
как минимум надо использовать
Код
C
s[i]
вместо s (и соответственно
Код
C
s[i][j]
вместо s[j]),
Код
C
r[i]
вместо r и инициализировать чем-то p1

з.ы. как тут можно написать обращение к элементу массива с индексом i без тэга code?


Название: Re: Работа со строками
Отправлено: von_Manstein от Май 22, 2011, 22:54
Для начала каждое объявление - с новой строки, выделять пробелами, ибо С++ не чувствителен к форматированию.
Указатель инициализировать сразу.
Придерживаться одного стиля.

Как ни странно, это помогает исключать ошибки сразу же, не подключая отладчик, компилятор и форум. В таком месиве разобраться проблематично. Если бы было отформатировано нормально и в одном стиле - наверняка автор и сам бы нашёл ошибку. Тут попросту не видно сразу, какое обращение идёт к элементам массива.


Название: Re: Работа со строками
Отправлено: Igors от Май 23, 2011, 08:30
Как ни странно, это помогает исключать ошибки сразу же, не подключая отладчик, компилятор и форум. В таком месиве разобраться проблематично.
+1

Никто не отказывается помочь, просто в таком совершенно антисанитарном коде никто этого делать не хочет. Приложите усилия, тогда обсудим