Ir ao conteúdo
  • Cadastre-se

paulo luz magalhaes

Membro Pleno
  • Posts

    40
  • Cadastrado em

  • Última visita

Reputação

6
  1. Utilizando a linguagem C e o sistema operacional GNU/Linux, desenvolva um programa que calcule as raízes, se existirem, de uma equação do segundo grau, sendo que as constantes envolvidas no cálculo deverão ser fornecidas pelo usuário via teclado. Para a resolução da equação, deve-se utilizar três processos além do processo original. O primeiro processo será responsável por calcular o valor do delta e os demais deverão calcular as raízes da equação. Destaca-se que o envio do delta, para os processos que realizarão os cálculos das raízes, deverá ocorrer por Pipes. #include <stdio.h> #include <stdlib.h> #include <pthread.h> struct arguments { int a, b; }; void* sum (void* void_args) { struct arguments* args = (struct arguments *) void_args; float* result = malloc(sizeof(float)); *result = args->a + args->b; return (void*) result; } int main () { struct arguments args; args.a = 1; args.b = 2; float* result; pthread_t t1; pthread_create(&t1, NULL, sum, &args); pthread_join(t1, (void**) &result); printf("Resultado: %.2f\n", *result); return 0;
  2. #include <stdio.h> #include <stdlib.h> #include <pthread.h> struct arguments { int a, b; }; void* sum (void* void_args) { struct arguments* args = (struct arguments *) void_args; float* result = malloc(sizeof(float)); *result = args->a + args->b; return (void*) result; } int main () { struct arguments args; args.a = 1; args.b = 2; float* result; pthread_t t1; pthread_create(&t1, NULL, sum, &args); pthread_join(t1, (void**) &result); printf("Resultado: %.2f\n", *result); return 0; }
  3. O código para a separação do processo pai do filho é: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; pid_t pid; if ((pid = fork()) < 0) { perror("fork"); exit(1); } if (pid == 0) { //O código aqui dentro será executado no processo filho printf("pid do Filho: %d\n", getpid()); } else { //O código neste trecho será executado no processo pai printf("pid do Pai: %d\n", getpid()); } printf("Esta regiao sera executada por ambos processos\n\n"); scanf("%d", &i); exit(0); } Vamos fazer um experimento simples, declarar inicialmente uma variável do tipo char e iniciar ela com o valor 'a'. Então, no processo pai mudamo essa variável para armazenar 'b'. Vamos exibir, em ambos processos, o valor da variável e seu endereço de memória. Nosso código fica: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; char c = 'a'; pid_t pid; if ((pid = fork()) < 0) { perror("fork"); exit(1); } if (pid == 0) { printf("Caractere e Endereco: %c - %p (filho)\n",c,&c); } else { c='b'; printf("Caractere e Endereco: %c - %p (pai)\n",c,&c); } scanf("%d", &i); exit(0); } A função execv() é usada para executar um programa, em ambientes Linux. Ou seja, ela cria um processo novo, que é o programa que vai executar. Para ver a execv em ação, vamos criar um programa simples, de nome "teste" que simplesmente exibe a PID desse arquivo "teste", que é um executável, cujo código fonte é: #include <sys/types.h> #include <unistd.h> int main(void) { printf("\nPid do arquivo: %d\n", getpid()); Agora, nosso programa, que usa a função execv para executar o arquivo "teste": #include <stdio.h> int main(void) { printf("pid do Pai: %d\n", getpid()); execv("teste", NULL); printf("EU TENHO UM SEGREDO PRA CONTAR\n"); Assim como a função execv, a função system também executa um programa, na verdade ela simula o terminal, então é como se déssemos um comando no terminal. A diferença é que aqui a função filho não mata a pai, portanto, não há crimes ;) Vamos usar a função system para executar o mesmo arquivo "teste", isso é feito no terminal assim ./teste Logo, nosso código fica: #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { printf("pid do Pai: %d\n", getpid()); system("./teste"); printf("\nPrograma apos a funcao system\n"); } Utilizando a linguagem C e o sistema operacional GNU/LINUX, desenvolva um programa que crie um novo processo. Esse novo processo deverá alterar a sua imagem de execução, via chamada ao sistema execve() ou uma de suas variações, inserindo a imagem do comando /bin/ls, utilizando os parâmetros -lha --color. O professor da disciplina de Sistemas Operacionais pediu que usamos threads. Nunca programei usando essas operações, nem sei pra onde vou, peço ajuda na solução desse programa.
  4. Utilizando a linguagem C e o sistema operacional GNU/Linux, desenvolva um programa que calcule as raízes, se existirem, de uma equação do segundo grau, sendo que as constantes envolvidas no cálculo deverão ser fornecidas pelo usuário via teclado. Para a resolução da equação, deve-se utilizar três processos além do processo original. O primeiro processo será responsável por calcular o valor do delta e os demais deverão calcular as raízes da equação. Destaca-se que o envio do delta, para os processos que realizarão os cálculos das raízes, deverá ocorrer por Pipes. Segue abaixo o código: #include #include int main() { float a, //declarando os coeficientes da equação de segundo grau b, c, delta, y, x; int quatro=4, dois=2; printf("Digite os coeficientes da equação de segundo grau que daremos as raízes: "); scanf ("%f %f %f",&a,&b,&c); //valor do dricriminante delta = ((b)*(b) - (quatro)*(a)*(c)); if (delta>=0) { x=((-b)-(sqrt(delta)))/((dois)*(a)); y=((-b)+(sqrt(delta)))/((dois)*(a)); printf("O valor das raízes são %.2f e %.2f", x,y); } else if(delta<0) { printf("Não há como encontrar raízes, pois o valor do discriminate é negativo"); } } COMO QUE FARIA O PROGRAMA USANDO "PIPES" ESSA É A MINHA DÚVIDA.
  5. Dada uma pilha de n cartas numeradas de 1 an com a carta 1 no topo e a carta n na parte inferior. A seguinte operação é realizada enquanto você tiver 2 ou mais cartas na pilha. Descarte a carta do topo e mova a próxima carta (a que está no topo) para o fundo da pilha. Sua tarefa é encontrar a sequência de cartas descartadas e a última carta restante. Cada linha de entrada (exceto a última) contém um número n ≤ 50. A última linha contém 0 e não deve ser processada. Cada número de entrada produz duas linhas de saída. A primeira linha mostra a sequência de cartas descartadas e a segunda linha mostra as cartas restantes. Entrada A entrada consiste em um número indeterminado de linhas, cada uma contendo um valor de 1 a 50. A última linha contém o valor 0. Saída Para cada caso de teste, imprima duas linhas. A primeira linha apresenta a sequência de cartas descartadas, cada uma separada por uma vírgula e um espaço. A segunda linha mostra o número do cartão restante. Nenhuma linha tem espaços extras no início ou no final. Veja o exemplo para verificar o formato esperado. Exemplo de entrada Exemplo de saída 7 19 10 6 0 Cartões descartados: 1, 3, 5, 7, 4, 2 Cartão restante: 6 Cartões descartados: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 4, 8, 12, 16, 2, 10, 18, 14 Cartão restante: 6 Cartões descartados: 1, 3, 5, 7, 9, 2, 6, 10, 8 Cartão restante: 4 Cartões descartados: 1, 3, 5, 2, 6 Cartão restante: 4 #include struct Pilha { int topo; /* posição elemento topo */ int capa; float *pElem; }; void criarpilha( struct Pilha *p, int c ){ p->topo = -1; p->capa = c; p->pElem = (float*) malloc (c * sizeof(float)); } int estavazia ( struct Pilha *p ){ if( p-> topo == -1 ) return 1; // true else return 0; // false } int estacheia ( struct Pilha *p ){ if (p->topo == p->capa - 1) return 1; else return 0; } void empilhar ( struct Pilha *p, float v){ p->topo++; p->pElem [p->topo] = v; } float desempilhar ( struct Pilha *p ){ float aux = p->pElem [p->topo]; p->topo--; return aux; } float retornatopo ( struct Pilha *p ){ return p->pElem [p->topo]; } int main(){ struct Pilha minhapilha; int capacidade, op; float valor; printf( "\nCapacidade da pilha? " ); scanf( "%d", &capacidade ); criarpilha (&minhapilha, capacidade); while( 1 ){ /* loop infinito */ printf("\n1- empilhar (push)\n"); printf("2- desempilhar (POP)\n"); printf("3- Mostrar o topo \n"); printf("4- sair\n"); printf("\nopcao? "); scanf("%d", &op); switch (op){ case 1: //push if( estacheia( &minhapilha ) == 1 ) printf("\nPILHA CHEIA! \n"); else { printf("\nVALOR? "); scanf("%f", &valor); empilhar (&minhapilha, valor); } break; case 2: //pop if ( estavazia(&minhapilha) == 1 ) printf( "\nPILHA VAZIA! \n" ); else{ valor = desempilhar (&minhapilha); printf ( "\n%.1f DESEMPILHADO!\n", valor ); } break; case 3: // mostrar o topo if ( estavazia (&minhapilha) == 1 ) printf( "\nPILHA VAZIA!\n" ); else { valor = retornatopo (&minhapilha); printf ( "\nTOPO: %.1f\n", valor ); } break; case 4: exit(0); default: printf( "\nOPCAO INVALIDA! \n" ); } } }
  6. Como faço na linguagem C a solução desse problema aqui.... Na escola onde você estuda, a hora do recreio é a mais aguardada pela grande maioria dos alunos. Não só porque as vezes as aulas são cansativas, mas sim porque a merenda servida é muito boa, preparada por um chefe italiano muito caprichoso. Quando bate o sinal para a hora do recreio, todos os alunos saem correndo da sua sala para chegar o mais cedo possível na cantina, tanta é a vontade de comer. Um de seus professores notou, porém, que havia ali uma oportunidade. Utilizando um sistema de recompensa, seu professor de matemática disse que a ordem da fila para se servir será dada não pela ordem de chegada, mas sim pela soma das notas obtidas em sala de aula. Assim, aqueles com maior nota poderão se servir antes daqueles que tem menor nota. Sua tarefa é simples: dada a ordem de chegada dos alunos na cantina, e as suas respectivas notas na matéria de matemática, reordene a fila de acordo com as notas de matemática, e diga quantos alunos não precisaram trocar de lugar nessa reordenação. Entrada A primeira linha contém um inteiro N, indicando o número de casos de teste a seguir. Cada caso de teste inicia com um inteiro M (1 ≤ M ≤ 1000), indicando o número de alunos. Em seguida haverá M inteiros distintos Pi (1 ≤ Pi ≤ 1000), onde o i-ésimo inteiro indica a nota do i-ésimo aluno. Os inteiros acima são dados em ordem de chegada, ou seja, o primeiro inteiro diz respeito ao primeiro aluno a chegar na fila, o segundo inteiro diz respeito ao segundo aluno, e assim sucessivamente. Saída Para cada caso de teste imprima uma linha, contendo um inteiro, indicando o número de alunos que não precisaram trocar de lugar mesmo após a fila ser reordenada. Exemplo de Entrada Exemplo de Saída 3 3 100 80 90 4 100 120 30 50 4 100 90 30 25 1 0 4
  7. Faça um programa que realiza o cadastro de contas bancárias com as seguintes informações: número da conta, nome do cliente e saldo. O banco permite o cadastramento de apenas quinze contas e não pode haver mais de uma conta com o mesmo número. Crie o menu de opções a seguir: 1 Cadastrar contas. 2 Visualizar todas as contas de determinado cliente. 3 Excluir a conta com menor saldo (Suponha a não existência de saldos iguais). 4 Sair. Código em C :
  8. Implemente, utilizando lista encadeada, uma fila de inteiros. Insere no fim e remove no início da lista. #include <stdio.h> #include <stdlib.h> struct no { int dado; struct no *prox; }; void imprimir(struct no *prim) { struct no *atual = prim; system("clear"); printf("\nLista: "); while (atual != NULL) { printf("%d -> ", atual->dado); atual = atual->prox; } printf("NULL"); } struct no *insere_inicio(struct no *prim) { int num; printf("\nInsira o elemento no inicio da lista: "); scanf("%d", &num); struct no *novo = (struct no *) malloc(sizeof(struct no *)); novo->dado = num; novo->prox = prim; return novo; } struct no *insere_final(struct no *prim) { int num; printf("Insira o elemento no final da lista: "); scanf("%d", &num); struct no *novo = (struct no *) malloc(sizeof(struct no *)); novo->dado = num; novo->prox = NULL; if (prim == NULL) return novo; struct no *ultimo = prim; while (ultimo->prox != NULL) { ultimo = ultimo->prox; } ultimo->prox = novo; return prim; } struct no *remove_fim(struct no *prim) { if (prim == NULL) { printf("Lista Vazia!"); return NULL; } if (prim->prox == NULL) { printf("Removido do final!"); free(prim); return NULL; } struct no *penultimo = prim; struct no *ultimo = prim->prox; while (ultimo->prox != NULL) { penultimo = ultimo; ultimo = ultimo->prox; } penultimo->prox = NULL; free(ultimo); printf("Removido do final!"); return prim; } int main() { int op; struct no *prim = NULL; do { system("clear"); printf("\n<1> - Inserir no inicio"); printf("\n<2> - Inserir no final"); printf("\n<3> - Remover no inicio"); printf("\n<4> - Remover no final"); printf("\n<5> - Imprimir"); printf("\n<10> - Sair do programa\n\n"); printf("Digite sua opcao: "); scanf("%d", &op); switch (op) { case 1: prim = insere_inicio(prim); break; case 2: prim = insere_final(prim); break; case 3: prim = remove_inicio(prim); break; case 4: prim = remove_fim(prim); break; case 5: imprimir(prim); break; } } while (op != 10); return 0; }
  9. #include <stdio.h> #include <stdlib.h> main() { //Definição de variaveis int i, j, linhaA, colunaA, linhaB, colunaB, x; //Entrada de dados printf("\n Informe a quntidade de linhas da matriz A : "); scanf("%d",&linhaA); printf("\n Informe a quantidade de colunas da matriz A : "); scanf("%d",&colunaA); printf("\n Informe a quntidade de linhas da matriz B : "); scanf("%d",&linhaB); printf("\n Informe a quantidade de colunas da matriz B : "); scanf("%d",&colunaB); float matrizA[linhaA][colunaA], matrizB[linhaB][colunaB], matrizC[linhaA][colunaB], aux = 0; if(colunaA == linhaB) { for(i = 0; i < linhaA; i++) { for(j = 0; j < colunaA; j++) { printf("\n\n Informe o valor da %d%c Linha e da %d%c Coluna da Matriz A: ", i+1, 167, j+1, 167); scanf("%f", &matrizA[i][j]); } printf("\n"); } for(i = 0; i < linhaB; i++) { for(j = 0; j < colunaB; j++) { printf("\n\n Informe o valor da %d%c Linha e da %d%c Coluna da 2%c Matriz B: ", i+1, 167, j+1, 167, 167); scanf("%f", &matrizB[i][j]); } printf("\n"); } // Imprime as matrizes definidas printf("---------------------------- 1 - Matriz Gerada ---------------------------------\n\n"); for(i = 0; i < linhaA; i++) { for(j = 0; j < colunaA; j++) { printf("%6.f", matrizA[i][j]); } printf("\n\n"); } printf("---------------------------- 2 - Matriz Gerada ---------------------------------\n\n"); for(i = 0; i < linhaB; i++) { for(j = 0; j < colunaB; j++) { printf("%6.f", matrizB[i][j]); } printf("\n\n"); } printf("---------------------------- 3 - Matriz Gerada ---------------------------------\n\n"); //Processamento e saida em tela = PRODUTO DAS MATRIZES for(i = 0; i < linhaA; i++) { for(j = 0; j < colunaB; j++) { matrizC[i][j] = 0; for(x = 0; x < linhaB; x++) { aux += matrizA[i][x] * matrizB[x][j]; } matrizC[i][j] = aux; aux = 0; } } for(i = 0; i < linhaA; i++) { for(j = 0; j < colunaB; j++) { printf("%6.f", matrizC[i][j]); } printf("\n\n"); } printf("\n\n"); } else { printf("\n\n Nao ha com multiplicar as matrizes dadas "); } } COMO SERIA NA ALOCAÇÃO DINAMICA USANDO A FUNÇÃO DOUBLE?
  10. Crie um programa que multiplica duas matrizes quadradas do tipo double lidas do teclado. Seu programa deve ler a dimensão n da matriz, em seguida alocar dinamicamente duas matrizes n × n. Depois ler os dados das duas matrizes e imprimir a matriz resultante da multiplicação destas. #include<stdio.h> #include<stdlib.h> int main () { int matriz[3][3],i, j; printf ("\nDigite valor para os elementos da matriz\n\n"); for ( i=0; i<3; i++ ) for ( j=0; j<3; j++ ) { printf ("\nElemento[%d][%d] = ", i, j); scanf ("%d", &matriz[ i ][ j ]); } printf("\n\n******************* Saida de Dados ********************* \n\n"); for ( i=0; i<3; i++ ) for ( j=0; j<3; j++ ) { printf ("\nElemento[%d][%d] = %d\n", i, j,matriz[ i ][ j ]); } getch(); return(0); }
  11. Escreva um programa que lê todos os elementos de uma matriz N × N e mostra a matriz e a sua transposta na tela. Obs: O tamanho (N) da matriz deve ser lido do teclado e sua alocação deve ser dinâmica através da função malloc. #include <stdio.h> #include <stdlib.h> int main() { // alocando matriz int n = 3, m = 2; int **matriz = malloc(n * sizeof(int*)); for (int i = 0; i < n; i++) matriz[i] = malloc(m * sizeof(int)); // código omitido: lê os dados de matriz int **transp = transposta(matriz, n, m); // código omitido: imprime ou faz algo com transp // libera a memória alocada for(int i = 0; i < n; i++) free(matriz[i]); for (int j = 0; j < m; j++) free(transp[j]); free(matriz); free(transp); return 0; }
  12. a ideia do programa ficou desse jeito, mas ainda esta com problemas, nao estou tendo sucesso. #include <stdio.h> #include <string.h> #define TAM 5 //tamanho do vetor usado como cadastro void imprimeArquivo(){ Aluno cadastro[5]; FILE *arq = fopen(nomeArq, "r+b"); //Note que usamos r e n~ao w int i; if(arq == NULL){ printf("Erro: Imprime Arquivo!\n"); return; } fread(cadastro, sizeof(Aluno), TAM, arq); printf(" ---- Imprimindo Dados ----\n"); for(i=0; i<TAM; i++){ printf("nome: %s, rga: %s, nota:f \n", cadastro[i].nome, cadastro[i].rga, cadastro[i].nota); } printf("\n"); fclose(arq); }
  13. (Peço ajuda(ideia) para desenvolver o seguinte exercicio na linguagem C.) Escreva um programa que armazene em um arquivo o RGA, Nome e Nota de 5 alunos e, apos a escrita, escreva o RGA, Nome e Nota dos alunos que possuem Nota acima de 7. *Escreva o programa utilizando arquivo binario. *Faça uma segunda solução utilizando arquivo texto.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!