Exercicios Programação

Já fiz mais ou menos o que disseste...ficou assim:

Código:
//combinações de letras
#include <iostream>
using namespace std;
int increment (char arr[], int n)
{
    if (n>0)
    {
    for (int x='A'; x<='Z'; x++)
    {
    arr[n]=x;
    }
    return 1;
    }
    else
    return 0;
}
int main()
{
    int n;
    cout << "Este programa cria palavras com n letras" << endl;
    cout << "\nIntroduza o numero de letras:";
    cin >> n;
    char arr[n+1];
    for (int y=0; y <= n; y++)
    {
        arr[y]='A';
    }
    arr[n]=0;
    do printf("%s\n", arr);
    while ( increment (arr, n-1));
    cin.get();
    cin.get();
    return 0;
}

Na função main penso que já esteja tudo e na função increment também já pus return 1 e return 0 como disseste. Agora vendo a função tenho vários problemas, primeiro porque tenho um ciclo infinito e segundo porque a função increment vai guardando na mesma posição todas as letras e só depois é que volta á função main, logo só vai mostrar a letra A e na ultima posição a letra Z, ou seja com 3 letras faz sempre AAZ, AAZ, AAZ...e assim infinitamente.

Quanto á recursividade também não sei como é que a hei-de fazer, mas já percebi a ideia do Aparicio, quanto a incrementar qual posição (ou seja já percebi o quê que faz o n na função increment).
 
Quanto ao main, no for escusas de preencher com 'A' até y <= n, basta y < n visto que a seguir dás outro valor ao n.
Outra forma de preencher o array: memset( arr, 'A', n );

A função increment continua a ter ali um for para nada.

Primeiro tens que implementar o principal da função que é incrementar o array na posição n.
Depois acrescentas os restantes casos, quando a posição a incrementar é 'Z' ou o array é "ZZZ".
 
Quanto ao main, no for escusas de preencher com 'A' até y <= n, basta y < n visto que a seguir dás outro valor ao n.
Outra forma de preencher o array: memset( arr, 'A', n );

A função increment continua a ter ali um for para nada.

Primeiro tens que implementar o principal da função que é incrementar o array na posição n.
Depois acrescentas os restantes casos, quando a posição a incrementar é 'Z' ou o array é "ZZZ".

Desde o início que, de facto, achei que aquele for não estava a fazer nada, mas nesse caso como é que faço para que a função incremente a posição n do array...eu preciso que a função incremente algo.
 
Tão simples como arr[n]++;

Agora se arr[n] for igual a 'Z' já não o incrementas, igualas a 'A' e chamas a função para incrementar a próxima posição, n - 1.
 

Testa este código:

Código:
#include <stdio.h>

int main () {
    int x = 0;
    while (1) {
          x=(x+1)%26;
          printf("%d\n",x);
          getchar();
          }
    return 0;
}

O operador % permite que se defina um "limite superior" que o valor da variável x pode tomar. Penso que isso se pode adaptar às trocas de letras no array. Acho que era isto que o Neptune queria dizer.
 
Eu por acaso pensei que com "módulos" ele se estivesse a referir a módulos de programação e não ao módulo matemático :P
 
Testa este código:

Código:
#include <stdio.h>

int main () {
    int x = 0;
    while (1) {
          x=(x+1)%26;
          printf("%d\n",x);
          getchar();
          }
    return 0;
}
O operador % permite que se defina um "limite superior" que o valor da variável x pode tomar. Penso que isso se pode adaptar às trocas de letras no array. Acho que era isto que o Neptune queria dizer.

Era exactamente ao módulo matemático que me estava a referir ;)
 
Estou a a perceber a ideia, mas não estou a ver como fica mais simples.

Tinha esta função para incrementar:
Código:
int inc( char *s, int n )
    {
    if( s[n]++ == 'Z' )
        {
        if( n == 0 ) return 0;
        s[n] = 'A';
        return inc( s, n - 1 );
        }
    return 1;
    }
Utilizando o módulo para incrementar:
Código:
int inc( char *s, int n )
    {   
    if( ( s[n] = ( (s[n] - 'A' + 1 ) % 26 + 'A' ) ) == 'A' )
        {
        if( n == 0 ) return 0;
        return inc( s, n - 1 );
        }
    return 1;
    }
Assim não se têm de mudar implicitamente de 'Z' para 'A' mas têm que se verificar se muda na mesma para incrementar a próxima posição.
 
Exercícios básicos de Python

Olá, andei uns tempos com a nóia de aprender Python e tive algumas dificuldades pois a programação é uma disciplina prática e exercícios na net pra se praticar é boca. Portanto fiz alguns para praticar e disponibilizei-os no Ipernithy, estão aqui: http://www.ipernity.com/doc/52242
 
Estou com problemas a fazer um exercicio de c++ (bastante simples).

O programa deveria permitir fazer o seguinte:

What is your first name? Betty Sue
What is your last name? Yew
What letter grade do you deserve? B
What is your age? 22
Name: Yew, Betty Sue
Grade: C
Age: 22

Os inputs estou a negrito.

O que eu fiz foi o seguinte:

Código:
//Exercicio 1 do capitulo 4
#include <iostream>
using namespace std;
char ajusta (char);
int main()
{
    cout << "What is your first name? ";
    char first_name[30];
    cin.get(first_name, 30);
    cout << "\nWhat is your last name? ";
    char name[20];
    cin >> name;
    cout << "\nWhat letter grade do you deserve? ";
    char grade[2];
    cin >> grade;
    cout << "\nWhat is your age? ";
    int age;
    cin >> age;
    
    char new_grade[2];
    [COLOR=red]new_grade = ajusta(grade);  //da-me erro nesta linha
[/COLOR]    cout << "\nName: " << name << ", " << first_name << endl;
    cout << "Grade: " << new_grade << endl;
    cout << "Age: " << age;
    cin.get();
    cin.get();
    return 0;
}
char ajusta (char nota)
{
     if (nota[0] == 'A)
     return 'B;
     else if (nota[0] =='B)
     return 'C;
     else
     return 'D;
}

A linha que me dá erro está assinalada. O meu problema é que ao inserir uma nota (que só pode ser A, B ou C) ele deve incrementar a letra uma unidade...como são poucas letras não há grandes problemas, mas não deveria fazer assim.

Mas o que gostava mesmo que me explicassem era porquê que dá erro, uma vez que estou atratar duas variaveis do mesmo tipo (char).


Cumps
 
A tua função ajusta têm erros.

Para escrever um carácter é 'A' e não 'A.
Depois tens que te decidir se queres que a nota seja um carácter ou um array de 2 caracteres, porque nuns sítios utilizas uma coisas ou noutros outra, por exemplo declaras nota como um carácter e depois tens nota[0] que se utilizaria para devolver o 1º carácter de um array.
 
A tua função ajusta têm erros.

Para escrever um carácter é 'A' e não 'A.
Depois tens que te decidir se queres que a nota seja um carácter ou um array de 2 caracteres, porque nuns sítios utilizas uma coisas ou noutros outra, por exemplo declaras nota como um carácter e depois tens nota[0] que se utilizaria para devolver o 1º carácter de um array.


A parte de declarar 'A em vez de 'A' é hábito de scheme :D
Quanto ao resto já resolvi, declarei as variaveis como um unico caracter em vez de um array.

Obrigado pela ajuda.


Já agora outra duvida. Se em vez de uma variavel usasse um array para guardar o caracter teria de ser char arr[2]; porque necessito de uma posição para guardar o caracter e outra para guardar o caracter nulo, não é?
 
O problema é que não são duas variáveis do mesmo tipo. A tua função ajusta retorna um char e recebe também um char como argumento, e tua variável grade é um array de chars.

Código:
//Exercicio 1 do capitulo 4
#include <iostream>
using namespace std;
char ajusta (char);
int main()
{
    cout << "What is your first name? ";
    char first_name[30];
    cin.get(first_name, 30);
    cout << "\nWhat is your last name? ";
    char name[20];
    cin >> name;
    cout << "\nWhat letter grade do you deserve? ";
    char grade;
    cin >> grade;
    cout << "\nWhat is your age? ";
    int age;
    cin >> age;
    
    char new_grade;
    new_grade = ajusta(grade);  //da-me erro nesta linha
    cout << "\nName: " << name << ", " << first_name << endl;
    cout << "Grade: " << new_grade << endl;
    cout << "Age: " << age;
    cin.get();
    cin.get();
    return 0;
}
char ajusta (char nota)
{
     if (nota == 'A')
     return 'B';
     else if (nota =='B')
     return 'C';
     else
     return 'D';
}
edit: demorei muito :D

EDIT2: já agora, fazer isso com ints e strings era muito mais fácil e bonito :P
 
Já agora outra duvida. Se em vez de uma variavel usasse um array para guardar o caracter teria de ser char arr[2]; porque necessito de uma posição para guardar o caracter e outra para guardar o caracter nulo, não é?

Se fosses utilizar esse array com uma função que espera uma string como printf("%s",string)" então precisavas do null no fim, mas como só vais aceder ao primeiro carácter não haverá problema em não por o null, no máximo será má prática.

Pegando no código do sir_atmc já corrigido, como cada carácter têm um valor numérico podes fazer simplesmente assim:

Código:
char ajusta (char nota)
{
    return nota + 1;
}
 
Se fosses utilizar esse array com uma função que espera uma string como printf("%s",string)" então precisavas do null no fim, mas como só vais aceder ao primeiro carácter não haverá problema em não por o null, no máximo será má prática.

Neste caso eu iria precisar, porque se fizesse um array iria por: cout << arr; Eu percebi o que querias dizer...obrigado.

Pegando no código do sir_atmc já corrigido, como cada carácter têm um valor numérico podes fazer simplesmente assim:

Código:
char ajusta (char nota)
{
    return nota + 1;
}

Bem me parecia que tinha de dar para fazer de outra maneira, muito mais simples, porque no livro que estou a ler ainda não cheguei á parte dos if's, e fazer como eu fiz dá muito trabalho.


EDIT: Tenho de fazer o mesmo exercicio, mas em vez de usar array's de caracteres tenho de usar string's (da classe string). O meu problema é que não consigo obter mais do que uma palavra...Se usar:
cin.get(sring, 32); //por exemplo ou
cin.getline(string, 32); //dá-me um erro estranho nesta linha.

Não percebo porquê, porque já declarei as variaveis como string's e inclui o ficheiro string.

EDIT2: Já consegui...fiz getline(cin, string);
Cumps
 
Última edição:
Mais uma vez estou com dificuldades num exercicio de c++.

Para já fiz isto:

Código:
//exercicio 4
#include <iostream>
using namespace std;
const int Size = 50;
struct bop
{
       char fullname[Size];
       char title[Size];
       char bopname[Size];
       int preference;
};
int main()
{
    bop arr[3];
    arr[0].fullname = "Wimp Macho";
    arr[1].fullname = "Raki Rhodes";
    arr[2].fullname = "Celia Laiter";
    arr[0].title = "beginner programmer";
    arr[1].title = "programmer";
    arr[2].title = "master programming";
    return 0;
}

No exercicio que estou a fazer tenho que usar a estrutura bop e tenho de criar um array do tipo bop. O enunciado diz para atribuir valores á sorte aos elementos do array, mas estou com dificuldades nessa parte...não percebo porquê que dá erro.


Cumps
 
Back
Topo