Вызов функции в C - PullRequest
       1

Вызов функции в C

2 голосов
/ 26 марта 2011

Вот мой код

#include<stdio.h>

orders_char(int c1, int c2, int c3);

void orders_char(int c1, int c2, int c3)
{

        if(c1 < c2)
                if(c2 < c3)
                        printf("Ordered characters are: %c %c %c", c1, c2, c3);
                else if(c3 < c2 && c1 < c3)
                        printf("Ordered characters are: %c %c %c", c1, c3, c2);
        else if(c2 < c1
                if(c1 < c3)
                        printf("Ordered characters are: %c %c %c", c2, c1, c3);
                else if(c3 < c1 && c3 < c2)
                        printf("Ordered characters are: %c %c %c", c3, c2, c1);
        else if(c1 > c3)
                if (c3 < c2 && c2 > c1)
                        printf("Ordered characters are: %c %c %c", c3, c1, c2);
                else if(c3 > c2 && c2 < c1)
                        printf("Ordered characters are: %c %c %c", c2, c3, c1);


    return;
}

int main(void)
{

        char c1, c2 ,c3;
        int i = 65;

        printf("Please enter 3 capital letters with no spaces: \n");
        scanf("%c%c%c", &c1, &c2, &c3);
        orders_char(c1, c2, c3);
        return 0;
}

Но я получаю ошибки:

8.7.c:3: warning: data definition has no type or storage class
8.7.c:6: error: conflicting types for 'orders_char'
8.7.c:3: error: previous declaration of 'orders_char' was here
8.7.c:6: error: conflicting types for 'orders_char'
8.7.c:3: error: previous declaration of 'orders_char' was here
8.7.c: In function `orders_char':
8.7.c:14: error: syntax error before "if"

Ответы [ 11 ]

4 голосов
/ 26 марта 2011

Вы действительно должны использовать { } для своих if выражений.Я запускаю ваш код через форматтер, и он ясно показывает, что if и else if не работают так, как вы хотите, чтобы они работали.

РЕДАКТИРОВАТЬ:

  • у вас естьво многих случаях - есть только шесть возможных порядков сортировки для трех переменных
  • , которые вы используете для символа char, в то время как это работает, это не приятно - лучше использовать char для символов.
4 голосов
/ 26 марта 2011
void orders_char(int c1, int c2, int c3);

Потому что без ничего, по умолчанию используется int.

До встречи, Беко

Отредактировано:

Кстати, вам нужна скобка в строке

else if(c2 < c1

Кроме того, вы не совпадаете с другими.Остальное всегда будет совпадать с ближайшим if.Итак:

if(a>b)
  if(b>c)
    printf("a>b>c");
else
  printf("a<=b");  // <<== wrong! This else matches with if(b>c)

Вам нужно поставить несколько скобок:

if(a>b)
{
  if(b>c)
    printf("a>b>c");
}
else
  printf("a<=b");  // <<== right! This else matches with if(a>b)

Берегите себя.

3 голосов
/ 26 марта 2011

Я вижу две ошибки:

One:

orders_char(int c1, int c2, int c3);

должно быть

void orders_char(int c1, int c2, int c3);

Если вы не укажете тип возвращаемого значения функции, компилятор примет int. Поэтому позже он жалуется, когда видит функцию, возвращающую void, что вы не можете решить.

Два:

else if(c2 < c1

отсутствует закрывающая скобка.

2 голосов
/ 26 марта 2011

Другое всегда связывается с ближайшим предшествующим непревзойденным if. Отступы не показывают, что на самом деле здесь происходит.

if (condition)
    if (condition2)
       Something;
    else if (condition3)
        SomethingElse;
    else if (condition4)
        DoMore;

- это то, что на самом деле происходит в коде. Чтобы работать так, как вам хочется, вам нужно написать это так:

if (condition)
{
    if (condition2)
       Something;
    else if (condition3)
        SomethingElse;
 }
 else if (condition4)
    DoMore;
1 голос
/ 26 марта 2011

C использует значения ASCII при сравнении символов.Достойная диаграмма ASCII находится здесь:

http://www.elec -intro.com / logic-ascii

Значения для SAR - 83, 65, 82. Итак, ваш первыйif в основном:

if (83 < 65)

Что, очевидно, неверно.Так что - ни один из ваших printfs не попадет и ничего не будет выведено.Самый быстрый способ сортировки чисел - это выполнить серию перестановок:

char temp = c1;

if(c1 > c2)
{
    temp = c1; 
    c1 = c2;
    c2 = temp;
}

if(c2 > c3)
{
   temp = c2;
   c2 = c3;
   c3 = temp;
}

if(c1 > c3)
{
   temp = c1;
   c1 = c3;
   c3 = temp;
}

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

1 голос
/ 26 марта 2011

Конечно, ничего не вернется.

Вы не выполняете первое условие if:

if (c1 < c2) {
   //all your code is here
}
1 голос
/ 26 марта 2011

Справа вверху:

orders_char(int c1, int c2, int c3);

void orders_char(int c1, int c2, int c3)
{ //...

вы сначала объявляете, а затем определяете функцию.

Но в вашем объявлении отсутствует тип возврата (первое предупреждение), и компилятор по умолчанию будетвозвращая int, и, как таковая, отличается от определения (первая ошибка).

Обычно компиляторы c будут выдавать каскад сообщений об ошибках, поэтому вам следует смотреть только на первое (иливозможно два) при чтении сообщений об ошибках.

0 голосов
/ 10 октября 2012

Это довольно сложный код для нахождения последовательности, когда вы можете просто развернуть пузырьковую сортировку (и, прежде чем кто-либо нападет на использование пузырьковой сортировки, вы должны знать, что в некоторых случаях это вполне приемлемо, например, гдеданные уже в основном отсортированы, или если набор данных невелик - в этих случаях он может очень часто превосходить другие виды):

#include <stdio.h>

void orders_char(int c1, int c2, int c3) {
    int tmp;

    // Unrolled bubble sort for three elements.

    if (c1 > c2) { tmp = c1; c1 = c2; c2 = tmp; }
    if (c2 > c3) { tmp = c2; c2 = c3; c3 = tmp; }
    if (c1 > c2) { tmp = c1; c1 = c2; c2 = tmp; }

    printf("Ordered characters are: %c %c %c\n", c1, c2, c3);
}

int main (void) {
    char c1, c2 ,c3;
    printf("Please enter 3 capital letters with no spaces: \n");
    scanf("%c%c%c", &c1, &c2, &c3);
    orders_char(c1, c2, c3);
    return 0;
}

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

Если вы закомментируете строку приглашения (printf вmain()) и выполните следующий скрипт, вы увидите, что он работает для всех входных данных:

pax> for i in abc acb bac bca cab cba ; do
...>     echo $i | ./sort3
...> done
Ordered characters are: a b c
Ordered characters are: a b c
Ordered characters are: a b c
Ordered characters are: a b c
Ordered characters are: a b c
Ordered characters are: a b c
0 голосов
/ 26 марта 2011

Гораздо более простая реализация:

#include <stdio.h>
#include <stdlib.h>

void orders_char (int c1, int c2, int c3);

int compare (const void * a, const void * b)
{
    return ( *(int*)a - *(int*)b );
}

void orders_char (int c1, int c2, int c3)
{
    int a[] = {c1, c2, c3};
    qsort(a, 3, sizeof(int), compare);
    printf("Ordered characters are: %c %c %c\n", a[0], a[1], a[2]);
}

int main (void)
{
    char c1, c2, c3;
    int i = 65;

    printf("Please enter 3 capital letters with no spaces: \n");
    scanf("%c%c%c", &c1, &c2, &c3);
    orders_char(c1, c2, c3);
    return 0;
}

Как правило, нет смысла пытаться перестраивать существующие алгоритмы.Лучше узнать, какие из них использовать сразу.

Конечно, есть и лучшие способы реализовать вышесказанное, но это очень просто и быстро.

0 голосов
/ 26 марта 2011

Без обид, но это базовые навыки отладки. Сначала убедитесь, что символы появляются так, как вы ожидаете, возможно, с помощью printf () перед вызовом orders_char (). Во-вторых, вы должны использовать std :: sort () для того, что вы пытаетесь сделать.

std :: vector vC; vC.push_back (с1); vC.push_back (с2); vC.push_back (с3); станд :: сортировать (vC.begin (), vc.end ());

Или что-то подобное. Вы можете искать std :: sort () в вашем любимом браузере.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...