Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - galapok11

#1
Saludos a todos
Llevo un rato buscando un tutorial, libro, manual o lo que sea respecto a multihilos en C, y solo encuentro para la libreria pthread.h por lo que no me sirve.
Necesitaria para la libreria de Windows, windows.h. Por favor, si conocen de alguna, mandemen un Link o lo que sea
Muchas gracias
#2
Si he usado un par de llos estaticos.
Es la primera vez que hago un programo con listas enlazables... Me falla la funcion de borrar, pero cuando solo existe un usuario, si me que lo borrar, ahora me gustaria borrarlos cuando hay varios (lo de borrar segun el nombre, no me ha llegado a funcionar pero primero que me funcione lo anterior...)

Muchas gracias por tu respuesta!!  ;D ;D
Aquie te dejo el codigo del programa entero

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*+-------------------------------------------------------------------+*/
/*| Defines                                                           |*/
/*+-------------------------------------------------------------------+*/

/*+-------------------------------------------------------------------+*/
/*| Structs & Definitions                                             |*/
/*+-------------------------------------------------------------------+*/

//Define the structure list_user
struct dsd_list_user
{
    char chrc_firstname[20];
    char chrc_lastname[20];
    char chrc_address[50];
    char chrc_age[2];
    dsd_list_user *adsc_next;
};

/*+-------------------------------------------------------------------+*/
/*| Global Variables                                                  |*/
/*+-------------------------------------------------------------------+*/

/*+-------------------------------------------------------------------+*/
/*| Static Variables                                                  |*/
/*+-------------------------------------------------------------------+*/

//Create a variable to assign the strcture
//struct list_user user[MAX_USERS];

/*+-------------------------------------------------------------------+*/
/*| Internal function prototypes.                                     |*/
/*+-------------------------------------------------------------------+*/

// For starters, it should contain a structure which will keep 4 fields:
// -- Firstname
// -- Lastname
// -- Age
// -- Address
// -- (and the next pointer, of course)

// Also, I would like you to implement some functions in order to interact with the list,
// for starters, the basic ones which need to be defined are:
// -- add/remove element from the list
// -- print the whole list
// -- print a specific element of the list

//Create pointers for the first and last user
static struct dsd_list_user *dss_first, *last, *dss_temp;


//Function which shows the main menu with four options
void show_menu()
{
    printf("Menu: \n");
    printf("1- Add a new user\n");
    printf("2- Delete a user\n");
    printf("3- Show the user's list\n");
    printf("4- Exit\n\n");
    printf("Choose a option: ");
    fflush(stdout);
    //printf("\n\n\n");
    //scanf("%i",&ins_option_menu);
}
//#define SCANF
//Function which adds a new user
void add_user()
{
    //Create a pointer for add new users
    struct dsd_list_user *new_user;

    //Keep memory for the new user
    new_user = (struct dsd_list_user *) malloc(sizeof(struct dsd_list_user));

    //Show the fields to fill for creating a new user
    printf("\nNEW USER\n");
    printf("\nFirst Name: ");
    fflush(stdin);
#ifdef SCANF
    scanf("%s",new_user->chrc_firstname); 
#else
    gets(new_user->chrc_firstname);
#endif // SCANF
    fflush(stdin);
    printf("Last Name: ");
#ifdef SCANF
    scanf("%s",new_user->chrc_lastname); 
#else
    gets(new_user->chrc_lastname);
#endif // SCANF
    fflush(stdin);
    printf("Address: ");
#ifdef SCANF
    scanf("%s",new_user->chrc_address); 
#else
    gets(new_user->chrc_address);
#endif // SCANF
    fflush(stdin);
    printf("Age: ");
#ifdef SCANF
    scanf("%s",new_user->chrc_age); 
#else
    gets(new_user->chrc_age);
#endif // SCANF

//The last user of the list is always null
    new_user->adsc_next = NULL;

    //Check if there are more users in the list
    if (dss_first==NULL)
    {
        //If there are not users, show the user is the first
        printf("\nFIRST USER\n");
        //So, the new and first user, will be the first and last user.
        dss_first = new_user;
        last = new_user;
    }

    //If there are users, assign the new user to the next and obiously to the last user.
    else
    {
        last->adsc_next = new_user;
        last = new_user;
    }
    printf("USER CREATED\n\n");
}

//Function which drops an user
void drop_user()
{
    struct dsd_list_user *dsl_current_user;
//struct dsd_list_user *dsl_temp_user;
struct dsd_list_user *dsl_previous_user;
//struct dsd_list_user *dsl_next_user;
//struct dsd_list_user *dsl_first_user;
dsd_list_user *dsl_next;

//Variable to indicate the number of user
    //int i = 0;
    int number_user = 0;
int inp_index = 0;

    //Assign that pointer to the first user
    dsl_current_user = dss_first;
dsl_previous_user = last;


//Check if there are users in the list
    if (dsl_current_user==NULL)
    {
        //If there are not users, show the user is the first
        printf("\nThere are no users to drop\n\n");
        return;
    }

//If there are just one user
if (dsl_current_user->adsc_next == NULL)
{
printf("Only one user in the list to drop.");
//fflush(stdin);
//gets(dsl_current_user->chrc_firstname);
free(dss_first);
dss_first = NULL;
last = NULL;
return;
}
 
//p_gotto:
while (dsl_current_user != NULL)
{

if(dsl_current_user->adsc_next != NULL)
{
printf("There are more of one user in the list:");
//fflush(stdin);
//gets(dsl_current_user->chrc_firstname);
//dsl_current_user->adsc_next=dsl_previous_user;
//dsl_current_user = dsl_current_user->adsc_next;
free(dsl_current_user->adsc_next);
dsl_current_user->adsc_next = NULL;
//last = NULL;
return;
}
}

//goto p_gotto;
}






//Function which shows the full list
void show_list()
{
    //Create a pointer for show the full which indicate the current user to show in the list
    struct dsd_list_user *dsl_current_user;

    //Variable to indicate the number of user
    int i = 0;

    //Assign that pointer to the first user
    dsl_current_user = dss_first;

    //Start to show the full list
    printf("\n\nShowing the full list:\n\n");

    //Create a while to show the current user in that moment
    //Obiously, while the current user is not NULL
   if(dsl_current_user == NULL)
   {
  printf("There are not users in the list\n\n");
   return;
   }

while(dsl_current_user != NULL)
    {
        //Show the data of users
        printf("User number: %i \n\n", i+1);
        printf("First Name: %s\n", dsl_current_user->chrc_firstname);
        printf("Last Name: %s\n", dsl_current_user->chrc_lastname);
        printf("Address: %s\n", dsl_current_user->chrc_address);
        printf("Age: %s\n\n\n", dsl_current_user->chrc_age);

        //Assign the next user to the current for the next repetition
        dsl_current_user = dsl_current_user->adsc_next;

        //Pass to the next user
        i++;
    }

    //If the number of users is 0 -> the list is empty
    if (i==0) printf("The List is empty\n\n");
}

/*+-------------------------------------------------------------------+*/
/*| Main control procedure.                                           |*/
/*+-------------------------------------------------------------------+*/

int main()
{
    //int ins_option_menu;
    int option;

   

    do
    {
        show_menu();
        option = getchar();

        //Depending of the option selected, start a function or exit.
        if (option=='1')
        { add_user(); }
        if (option=='2')
        { drop_user();}
        //{ printf("\nNot configurated\n\n"); }
        if (option=='3')
        { show_list(); }
        if (option=='4')
        { return 0; }
        if(option < '1' || option > '4')
        { printf( "\nOption incorrect\n\n" ); }
        fflush(stdin);
    }
    while(option != 4);
    printf("\n\n");
    //system("pause");
    //goto p_goto;
}


/*+-------------------------------------------------------------------+*/
/*| FINAL                                                             |*/
/*+-------------------------------------------
#3
Este funcion deberia borrar un elemento de una lista STRUCT pero no llega a funcionar

void drop_user()
{
    struct dsd_list_user *dsl_current_user;
struct dsd_list_user *dsl_temp_user;

dsl_temp_user=head;
   
    //Variable to indicate the number of user
    //int i = 0;
    int number_user = 0;

    //Assign that pointer to the first user
    dsl_current_user = dss_first;

    //Check if there are users in the list
    if (dsl_current_user==NULL)
    {
        //If there are not users, show the user is the first
        printf("\nThere are no users to drop\n\n");
        return;
    }

    //If there are just one user
    if (dsl_current_user->adsc_next == NULL)
    {
        printf("Only one user to drop it.\n");
printf("Indicate the First Name of the user which you want drop it:");
//gets(dsl_current_user->chrc_firstname);
free(dsl_current_user);
//dsl_current_user = NULL;
return;
//dsl_current_user = dsl_current_user->adsc_next;
    }
while (dsl_current_user != NULL)
{
printf("Indicate the First Name of the user which you want drop it:");
gets(dsl_current_user->chrc_firstname);
free(dsl_current_user);
dsl_current_user = dsl_current_user->adsc_next;
}
}

#4
Saludos, estoy buscando la manera de crear mis propias funciones que correspondan a las sigueintes: strcpy, strlen, strcmp, strcat
He conseguido realizar strcpy, y strcmp.
Pero deberia hacerlo sin las funciones for, while y do: si asi es...
Gracias por leerme, y mas un si me ayudas :)
#5
Saludos programadores.
He terminado un programa y me gustaria saber como incluir los separadores de miles a la hora de mostrar dicho resultado en pantalla. He estado investigando en Internet pero lo poco que he visto/entendido no he conseguido aplicarlo.
Gracias por leerme, y mas aun al que me responda :)

Este es el programa, siento que este en ingles...
/*+-------------------------------------------------------------------+*/
/*| System and library header files.                                  |*/
/*+-------------------------------------------------------------------+*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/*+-------------------------------------------------------------------+*/
/*| Defines                                                           |*/
/*+-------------------------------------------------------------------+*/

//Maximum characters of the file cypher.txt
#define LIMIT_NAMES 6000

/*+-------------------------------------------------------------------+*/
/*| Structs & Definitions                                             |*/
/*+-------------------------------------------------------------------+*/

/*+-------------------------------------------------------------------+*/
/*| Global Variables                                                  |*/
/*+-------------------------------------------------------------------+*/

/*+-------------------------------------------------------------------+*/
/*| Static Variables                                                  |*/
/*+-------------------------------------------------------------------+*/

static char array_list_names[LIMIT_NAMES][50];
int ins_total_score = 0;


////Static variables for the time
static int ins_time_start;                  //Start time of NameLists
static int ins_time_stop;                  //Finish time of NameLists

/*+-------------------------------------------------------------------+*/
/*| Internal function prototypes.                                     |*/
/*+-------------------------------------------------------------------+*/

/*+-------------------------------------------------------------------+*/
/*| Explanation                                |*/
/*+-------------------------------------------------------------------+*/


//A 46K text file containing over five-thousand first names, begin by sorting it into alphabetical order.
//
//Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score.
//For example, when the list is sorted into alphabetical order, COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN would obtain a score of 938 × 53 = 49714.
//What is the total of all the name scores in the file?
//
//In order to sort the names, you will need to use qsort (http://www.cplusplus.com/reference/cstdlib/qsort/).
//It might be a bit tricky and difficult,
//i'll let you try alone if you want, but due to the pointer redirection you will need to apply in order to use the function, i'll gladly help you out - so don't hesitate to stop by and ask me.

/*+-------------------------------------------------------------------+*/
/*| Main control procedure.                                           |*/
/*+-------------------------------------------------------------------+*/

   //Function compare by default
   int m_compare (const void * vpp_a, const void * vpp_b)
      {
         return strcmp((char *) vpp_a, (char *) vpp_b);
         //return ( *(int*)a - *(int*)b );
      }
   //////////////////////////////////////////////

int main ()
{
     //Indicate time
   clock_t t_start, t_end;
   double secs;
   t_start = clock();
   //////////////////////////////////////////////////////////////////////////////////////
   


   //////////////////////////////////////////////////////////////////////////////////////
   //Procedure to count the words of the file names.txt and keep the array with all names
 
   //Open file to read it
   FILE *file_names;
   file_names = fopen("names.txt", "r+");
   
   //If the file is incorrect, indicate it and close the program
   if (file_names==NULL)
   {
      printf("File's content is incorrect.");
      system("pause");
      return -1;
   }
   // //Function to count the total names of the file
   // int ins_number_names = 0+1;
   //      while(!feof(file_names))
   //      {
   //            if(fgetc(file_names) == ',')
   //            {
   //                   ins_number_names++;
   //            }
   //      }
   //////Show the total number of names
   //printf("\nThe Number of names of the file names.txt is %d\n", ins_number_names);
   //system("PAUSE");      

   //Variable to keep the total number of names
   int ins_number_names = 0;

   //Start a while to know the number of names, and keep all names in one array
   while(!feof(file_names) && ins_number_names < LIMIT_NAMES)
   {
      //Initial lenght for every name
        int lenght_names = 0;
      //Other characters of the file, in this case, the commas ','
        char other_char;
      //Limit of characters of the names
        char limit_char_names[50];

      //Exclude the commas ',' and double quotation marks ' " " ' to can counting the names
        while((other_char = fgetc(file_names)) != ',' && !feof(file_names))
      {
            if(other_char == '\"'){
                continue;
            }
            else{
                limit_char_names[lenght_names] = other_char;
                lenght_names++;
            }
        }
        limit_char_names[lenght_names] = '\0';

      //Keep with strcpy the names in the array array_list_names
        strcpy(array_list_names[ins_number_names],limit_char_names);
        ins_number_names++;
   }

   //Close the file names.txt
   fclose(file_names);
   /////////////////////////////////////////////////////////////////////////////////////



   //Show the array with all names to check it
   /*   for(int i = 0; i < ins_number_names; i++)
         {
         printf("%s ",array_list_names);
         }*/
   
   printf("\nThe total number of names is: %i\n",ins_number_names);
   system("PAUSE");
   
   
   //Start the function to sort all names in alphabetical order
   qsort (array_list_names, ins_number_names, 50, m_compare);
   
   //Show the array sorted to check the function sort
   /*for(int i=0; i<ins_number_names;i++)
      {
      printf ("%s ",array_list_names);   
      }*/
      
   //Start with the operations to calculate the name score and total score
   
   //Assign to every word of every name a value which will be the position of the letter
   for(int i1=0; i1<ins_number_names;i1++)
   {
      //Variable to indicate the sum
      int ins_sum=0;
      //Variable ins_number_char_names to know the lenght of the name
      int ins_lenght_names = strlen(array_list_names[i1]);

      for(int i2=0; i2<ins_lenght_names; i2++)
         {
         //Calculate the score of every character
         ins_sum += array_list_names[i1][i2] - 'A' + 1;
         }
      
      //Calculate the values
      int ins_value = ins_sum * (i1+1);
      //Calculate the total score
      ins_total_score += ins_value;
   }

   //Show the total score os the file names.txt
   printf("The total score of all names is: %i\n", ins_total_score);
   system("pause");
   ////////////////////////////////////////////////////////////////////////////////////


   //Show time
   t_end = clock();
   secs = (double)(t_end - t_start) / CLOCKS_PER_SEC;
   printf("Time used to process the names list and calculate the total score names: %.16g miliseconds", secs * 1000.0);
   printf("\n\n");
   /////////////////////////////////////////////////////
   
   system("pause");
   return 0;
   
   }

/*+-------------------------------------------------------------------+*/
/*| FINAL                                                             |*/
/*+-------------------------------------------------------------------
#7
Saludos, este es mi primer tema.
Dispongo de un archivo.txt con mas de 5.000 nombres separados por comas y entre comillas.
Me gustaria saber como guardar todos ellos en un array.
Gracias por leerme y mas un por vuestra futura respuesto.