2013-12-10 6 views
1

Я пытаюсь использовать цикл, чтобы распечатать повторяющуюся песню, «этот старик» Первый стих: Этот старик, он играл один Он играл Knick -knack на моем эмпирическое Этот старик пришел домой качениюПовторения с помощью переключателя заявление внутри для цикла

Эта песня повторяется до десяти, варьируя два члена в курсив один -> два ++ и эмпирическое -> другой элемент, такой как обуви, колена и т.д. Вот мой код:

#include <cs50.h> 
#include <stdio.h> 
#include <string.h> 

string change1 (int i); 
int main (void) 
{ 
    for (int i = 1; ; 1 < 11; i++) 
    { 
     printf ("This old man, he played "); 
     change1(i); 
     printf("He played knick-knack on my %s\n\n", s1); 
    } 

    return 0; 
} 

string change1(int i) 
{ 
    string s1; 

    switch(i) 
    { 
     case 1: 
     { 
      printf("one\n"); 
      s1 = "thumb"; 
     } 
      break; 
     case 2: 
     { 
      printf("two\n"); 
      s1 = "shoe"; 
     } 
      break; 
     case 3: 
     case 4: 
     case 5: 
     case 6: 
     case 7: 
     case 8: 
     case 9: 
     case 10: 
     case 11: 
      printf("ill add these cases later"); 
    } 
} 

Это дает мне сообщение об ошибке: «control достигает конца функции non-void»


У меня также есть необъявленная переменная s1, но я объявила ее в функции.

+0

В конце 'change1()' нет возврата. –

+0

'change1' объявляется как возвращающая строку, но для этого нет инструкции' return'. И ваша функция 'main' никогда не объявляет или не присваивает' s1'. – Barmar

+0

Ваша петля для петли немного завинчена как заданная, ее не сравнивают с i, и она имеет дополнительный; –

ответ

0

В переменных C++ имеют объем. Переменная обычно видима внутри фигурных скобок, где она объявлена; вне этих скобок переменная не существует.

Вот почему вы не можете использовать s1 из change1 внутри цикла: вам необходимо вернуть значение (лучший выбор в вашей ситуации), или использовать переменную, которая находится в области видимости, в обоих change1 и main.

printf ("This old man, he played "); 
printf("He played knick-knack on my %s\n\n", change1(i)); 
... 
string change1 (int i) { 
    string s1; 
    switch (i) { 
     ... 
    } 
    return s1; 
} 

Обратите внимание, что вам не нужен переключатель заявление для осуществления change1: если код настолько равномерным, вы можете быть лучше с массивом:

const char *strings[] = {"thumb", "shoe", ...}; 
+0

Он работает в C ... по метке в любом случае ... –

+0

@BitFiddlingCodeMonkey Это странно - он использует 'string', откуда это взялось? Возможно, он неправильно указал вопрос, но они, возможно, также допустили ошибку с образцом кода. – dasblinkenlight

+0

Я догадываюсь, что вы никогда не сможете доверять тегу ... они точно так же, как утверждение работы, я полагаю ... иногда бессмысленны, иногда вводят в заблуждение ... –

0

change1 необходимо вернуть строку, на которой она была принята. И main должен присвоить возвращаемое значение переменной, потому что, поскольку первоначально написанная s1 является локальной для функции change1.

#include <cs50.h> 
#include <stdio.h> 
#include <string.h> 

string change1 (int i); 
int main (void) 
{ 
    for (int i = 1; ; 1 < 11; i++) 
     { 
      printf ("This old man, he played "); 
      string s1 = change1(i); 
      printf("He played knick-knack on my %s\n\n", s1); 
     } 
    return 0; 
} 

string change1 (int i) 
{ 
    string s1; 

    switch (i) 
     { 
     case 1: 
      { 
       printf("one\n"); 
       s1 = "thumb"; 
      } 
      break; 
     case 2: 
      { 
       printf("two\n"); 
       s1 = "shoe"; 
      } 
      break; 
     case 3: 
     case 4: 
     case 5: 
     case 6: 
     case 7: 
     case 8: 
     case 9: 
     case 10: 
     case 11: 
      printf("ill add these cases later"); 
     } 
    return s1; 
} 
+0

Является ли 'string'' typedef'ed 'char *'? –

+0

Я видел 'string', и я предположил, что это C++, я не заметил тега. – Barmar

-1

использовать оператор возврата в конце переключателя класса

return s1; 
+1

Больше, чем это необходимо ... –

2

Вы могли бы упростить вашу программу фактическая программа на C, а не C++

int main (void) 
{ 
    int i; 
    char* items[] = {"thumb", "shoe", "", "", "", "", "", "", "", ""}; 
    char* numbers[] = {"one", "two", "three","four","five","six","seven","eight","nine","ten"}; 
    for (i = 0; i < 10; i++) 
    { 
     printf ("This old man, he played %s\n", numbers[i]);  
     printf("He played knick-knack on my %s\n\n", items[i]); 
    } 
    return 0 
} 
+0

Очень чистый. Мне это нравится. –

+0

+1 нет необходимости в выключателе –

+0

очень хороший дизайн! Мне это тоже нравится. – dannylee

Смежные вопросы