Conversation with Merlin [email protected] · Tue Nov 07 2023

podrias explicarme recursividad detalladamente paso a paso con un ejemplo con nodos imprimiendo del primer al ultimo nodo y del ultimo al primer nodo en C#

¡Claro! La recursividad es una técnica de programación en la que una función se llama a sí misma para resolver un problema. Permíteme darte un ejemplo paso a paso de cómo implementar la recursividad en C# para imprimir los nodos de una lista en orden desde el primer nodo hasta el último y luego desde el último nodo hasta el primero.

Supongamos que tenemos una clase Nodo que representa un nodo en una lista enlazada. Cada nodo tiene un valor y una referencia al siguiente nodo. Aquí está la definición de la clase Nodo:

class Nodo { public int Valor { get; set; } public Nodo Siguiente { get; set; } public Nodo(int valor) { Valor = valor; Siguiente = null; } }

Para imprimir los nodos en orden desde el primer nodo hasta el último, podemos usar la recursividad de la siguiente manera:

static void ImprimirNodosDesdePrimero(Nodo nodo) { if (nodo != null) { Console.WriteLine(nodo.Valor); ImprimirNodosDesdePrimero(nodo.Siguiente); } }

Aquí estamos empezando por el primer nodo y luego imprimiendo su valor. Luego, llamamos a la función ImprimirNodosDesdePrimero nuevamente con el siguiente nodo como argumento.

Para imprimir los nodos en orden desde el último nodo hasta el primero, podemos usar la recursividad de la siguiente manera:

static void ImprimirNodosDesdeUltimo(Nodo nodo) { if (nodo != null) { ImprimirNodosDesdeUltimo(nodo.Siguiente); Console.WriteLine(nodo.Valor); } }

Aquí estamos llamando a la función ImprimirNodosDesdeUltimo antes de imprimir el valor del nodo. Esto asegura que primero se impriman los nodos siguientes y luego el nodo actual.

A continuación, puedes crear una lista enlazada de nodos y llamar a estas funciones para imprimir los nodos:

Nodo nodo1 = new Nodo(1); Nodo nodo2 = new Nodo(2); Nodo nodo3 = new Nodo(3); Nodo nodo4 = new Nodo(4); nodo1.Siguiente = nodo2; nodo2.Siguiente = nodo3; nodo3.Siguiente = nodo4; Console.WriteLine("Imprimir nodos desde el primero:"); ImprimirNodosDesdePrimero(nodo1); Console.WriteLine("Imprimir nodos desde el último:"); ImprimirNodosDesdeUltimo(nodo1);

Esto imprimirá los valores de los nodos en orden desde el primero hasta el último y luego desde el último hasta el primero.

Espero que esto te ayude a entender cómo implementar la recursividad y cómo imprimir los nodos en orden en una lista enlazada en C#. Si tienes alguna otra pregunta, ¡no dudes en preguntar!

como seria el codigo fuente completo

Aquí tienes el código fuente completo para implementar la recursividad en C# y para imprimir los nodos de una lista en orden desde el primer nodo hasta el último y desde el último nodo hasta el primero:

using System; class Nodo { public int Valor { get; set; } public Nodo Siguiente { get; set; } public Nodo(int valor) { Valor = valor; Siguiente null; } } class Program { static void ImprimirNodosDesdePrimero(Nodo nodo) if (odo != null) { Console.WriteLine(nodo.Valor); ImprimirNodosDesdePrimero(nodo.Siguiente); } } static void ImprimirNodosUltimo(Nodo nodo) { if (nodo != null) { ImprimirNodosDesdeUltimo(nodo.Siguiente); Console.WriteLine(nodo.Valor); } } static void Main(string[] args) { Nodo nodo1 = new Nodo(1); Nodo nodo2 = new Nodo(2); Nodo nodo = new Nodo(3); Nodo nodo4 = new Nodo(4); nodo1.Siguiente = nodo2; nodo2.Siguiente = nodo3; nodo3.Siguiente = nodo4; Console.WriteLine("Imprimir nodos desde el primero:"); ImprimirNodosDesdePrimero(nodo1); Console.WriteLine("Imprimir nodos desde el último:"); ImprimirNodosDesdeUltimo(nodo1); } }

Puedes cop y pegar este código en un archivo de código fuente con extensión ".cs" y ejecutarlo para ver la impresión de los nodos en orden desde el primer nodo hasta el último y desde el último nodo hasta el.

Espero que esto te sirva. Si tienes alguna otra pregunta no dudes en preguntar.

y como seria el codigo fuente completo solicitando nombre y edad en los nodos e imprimir mediante un menu de opciones los nodos

Aquí tienes el código fuente completo que solicita nombre y edad en los nodos de una lista enlazada y permite imprimir los nodos mediante un menú de opciones:

using System; class Nodo { public string Nombre { get; set; } public int Edad { get; set; } public Nodo Siguiente { get; set; } public Nodo(string nombre, int edad) { Nombre = nombre; Edad = edad; Siguiente = null; } } class Program { static Nodo ObtenerNuevoNodo() { Console.WriteLine("Ingrese el nombre del nodo:"); string nombre = Console.ReadLine(); Console.WriteLine("Ingrese la edad del nodo:"); int edad = int.Parse(Console.ReadLine()); return new Nodo(nombre, edad); } static void InsertarNodoAlFinal(ref Nodo cabeza) { Nodo nuevoNodo = ObtenerNuevoNodo(); if (cabeza == null) { cabeza = nuevoNodo; } else { Nodo actual = cabeza; while (actual.Siguiente != null) { actual = actual.Siguiente; } actual.Siguiente = nuevoNodo; } } static void ImprimirNodos(Nodo cabeza) { Nodo actual = cabeza; while (actual != null) { Console.WriteLine($"Nombre: {actual.Nombre}, Edad: {actual.Edad}"); actual = actual.Siguiente; } } static void Main(string[] args) { Nodo cabeza = null; while (true) { Console.WriteLine("Ingrese una opción:"); Console.WriteLine("1. Insertar un nuevo nodo"); Console.WriteLine("2. Imprimir los nodos"); Console.WriteLine("3. Salir"); string opcion = Console.ReadLine(); switch (opcion) { case "1": InsertarNodoAlFinal(ref cabeza); break; case "2": Console.WriteLine("Nodos:"); ImprimirNodos(cabeza); break; case "3": return; default: Console.WriteLine("Opción inválida. Por favor, ingrese una opción válida."); break } Console.WriteLine(); } } }

Puedes copiar y pegar este código en un archivo de código fuente con extensión ".cs" y ejecutarlo. Te mostrará un menú de opciones donde puedes seleccionar la opción 1 para insertar un nuevo nodo con nombre y edad, la opción 2 para imprimir los nodos y la opción 3 para salir.

Espero que esto te ayude. Si tienes alguna otra pregunta, no dudes en preguntar.

y como agrego en el menu y cual el codigo para imprimir desde el ultimo al primero como asi tambien del ultimo al primer nodo

Aquí tienes el código actualizado que agrega la opción para imprimir los nodos desde el último hasta el primero en el menú:

using System; class Nodo { public string Nombre { get; set; } public int Edad { get; set; } public Nodo Siguiente { get; set; } public Nodo(string nombre, int edad) { Nombre = nombre; Edad = edad; Siguiente = null; } } class Program { static Nodo ObtenerNuevoNodo() { Console.WriteLine("Ingrese el nombre del nodo:"); string nombre = Console.ReadLine(); Console.WriteLine("Ingrese la edad del nodo:"); int edad = int.Parse(Console.ReadLine()); return new Nodo(nombre, edad); } static void InsertarNodoAlFinal(ref Nodo cabeza) { Nodo nuevoNodo = ObtenerNuevoNodo(); if (cabeza == null) { cabeza = nuevoNodo; } else { Nodo actual cabeza; while (actual.Siguiente != null) { actual = actual.Siguiente; } actual.Siguiente = nuevoNodo; } } static void ImprimirNodosDesdePrimero(Nodo cabeza) { Nodo actual = cabeza; while (actual != null) { Console.WriteLine($"Nombre: {actual.Nombre}, Edad: {actual.Edad}"); actual = actual.Siguiente; } } static void ImprimirNodosDesdeUltimo(Nodo nodo) { if (nodo != null) { ImprimirNodosDesdeUltimo(nodo.Siguiente); Console.WriteLine($"Nombre: {nodo.Nombre}, Edad: {nodo.Edad}"); } } static void Main(string[] args) { Nodo cabeza = null; while (true) { Console.WriteLine("Ingrese una opción:"); Console.WriteLine("1. Insertar un nuevo nodo"); Console.WriteLine("2. Imprimir los nodos desde el primero"); Console.WriteLine("3. Imprimir los nodos desde el último"); Console.WriteLine("4. Salir"); string opcion = Console.ReadLine(); switch (opcion) { case "1": InsertarNAlFinal(ref cabeza); break; case "2": Console.WriteLine("Nodos desde el primero:"); ImprimirNodosDesdePrimero(cabeza); break; case "3": Console.WriteLine("Nodos desde el último:"); ImprimirNodosDesdeUltimo(cabeza); break; case "4": return; default: Console.WriteLine("Opción inválida. Por favor, ingrese una opción válida."); break; } Console.WriteLine(); } } }

Con esta actualización, se ha agregado la opción 3 en el menú para imprimir los nodos desde el último hasta el primero. Al seleccionar esta opción se invoca el método ImprimirNodosDesdeUltimo(cabeza) que imprimirá los nodos en orden desde el último nodo hasta el primero.

Espero que esto resuelva tu pregunta. Si tienes alguna otra inquietud, no dudes en preguntar.

puedes explicarme detalladamente tu funcion ImprimirNodosDesdeUltimo que es recursiva

¡Por supuesto! La función ImprimirNodosDesdeUltimo es un método recursivo que se encarga de imprimir los nodos de una lista enlazada desde el último nodo hasta el primero.

Aquí está el código de la función ImprimirNodosDesdeUltimo:

static void ImprimirNodosDesdeUltimo(Nodo nodo) { if (nodo != null) { ImprimirNodosDesdeUltimo(nodo.Siguiente); Console.WriteLine($"Nombre: {nodo.Nombre}, Edad: {nodo.Edad}"); } }

Ahora explicaré el funcionamiento de esta función paso a paso:

  1. La función ImprimirNodosDesdeUltimo recibe como parmetro un objeto Nodo que representa el primer nodo de la lista enlazada.

  2. Dentro de la función, se realiza la siguiente comprobación if (nodo != null. Este bloque de código se ejecuta siempre y el nodo actual no sea nulo.

  3. Si el nodo actual no es nulo, se realiza una llamadaiva a la función ImprimirNodosDesdeUltimo pasando como parámetro el siguiente nodo en la lista nodo.Siguiente. Esta llamada recursiva se realiza antes de imprimir el nodo actual.

  4. El efecto de esta llamada recursiva es que se seguirán llamando a sí misma las instancias de la función ImprimirNodosDesdeUltimo hasta llegar al último nodo de la lista. Luego, comenzará a imprimir los nod en orden inverso, ya que la llamada recursiva se realiza antes de imprimir el nodo actual.

  5. Finalmente, cuando se llega al ultimo nodo (cuando nodo == null), la función imprime los datos del nodo actual utilizando Console.WriteLine.

De esta forma, la función ImprimirNodosDesdeUltimo se va llamando a sí misma para recorrer la lista enlazada en sentido inverso y va imprimiendo los nodos a medida que va retrocediendo por la lista.

Espero que esta explicación aclare tus dudas. Si necesitas más detalles o tienes alguna otra pregunta, estaré encantado de ayudarte.

en que parte agrego el codigo fuente para guardar en un archivo de texto y en el menu como agrego la opcion

Para guardar los nodos en un archivo de texto, puedes agregar el siguiente código dentro del método Main, antes del switch que muestra el menú de opciones:

static void GuardarNodosEnArchivo(Nodo cabeza) { Console.WriteLine("Ingrese el nombre del archivo para guardar los nodos:"); string nombreArchivo = Console.ReadLine(); using (StreamWriter sw = new StreamWriter(nombreArchivo)) { Nodo actual = cabeza; while (actual != null) { sw.WriteLine($"Nombre: {actual.Nombre}, Edad: {actual.Edad}"); actual = actual.Siguiente; } } }

Este método GuardarNodosEnArchivo te permite ingresar el nombre del archivo en el que deseas guardar los nodos. Luego, se recorre la lista enlazada y se escribe cada nodo en una línea del archivo de texto.

Luego, debes agregar la opción en el menú para guardar los nodos. Puedes añadirlo antes de la opción de salir (opción "4") de la siguiente manera:

switch (opcion) { case "1": InsertarNodoAlFinal(ref cabeza); break; case "2": Console.WriteLine("Nodos desde el primero:"); ImprimirNodosDesdePrimero(cabeza); break; case "3": Console.WriteLine("Nodos desde el último:"); ImprimirNodosDesdeUltimo(cabeza); break; case "4": GuardarNodosEnArchivo(cabeza); return; "5": return; default: Console.WriteLine("Opción inválida. Por favor, ingrese una opción válida."); break; }

Aquí hemos agregado una nueva opción "4" en el menú para guardar los nodos en un archivo de texto. Al seleccionar esta opción, se llamará al método GuardarNodosEnArchivo y después se saldrá del programa.

Recuerda que también debes modificar el switch/case para acomodar el nuevo número de opciones. Por ejemplo, si ya tenías 4 opciones, debes cambiar el case "4" a case "5".

Espero que esto solucione tu duda. Si tienes alguna otra pregunta, no dudes en preguntar.

y si quisiera tener una opcion que ordene los valores de los nodos ingresados, cual seria el codigo fuente y opcion de menu

Para agregar una opción al menú quea ordenar los valores de los nodos ingresados, puedes seguir los siguientes pasos:

1 Agrega el siguiente código dentro del método Main, antes del switch del menú:

static void OrdenarNodos(ref Nodo cabeza) { // Convertir los nodos a una lista List<Nodo> nodosList = new List<Nodo>(); Nodo actual = cabeza; while (actual != null) { nodosList.Add(actual); actual = actual.Siguiente; } // Ordenar la lista de nodos por edad nodosList = nodosList.OrderBy(n => n.Edad).ToList(); // Reconstruir la listalazada con los nodos ordenados cabeza = null; foreach (Nodo nodo in nodosList) { InsertarNodoAlFinal(ref cabeza, nodo.Nombre, nodo.Edad); } Console.WriteLine("Nodos ordenados por edad."); }

Este método OrdenarNodos realiza lo siguiente:

  • Convierte los nodos de la lista enlazada a una lista genérica List<Nodo>.
  • Ordena la lista de nodos utilizando el método OrderBy de LINQ, que permite especificar una clave de ordenamiento. En este caso, estamos ordenando los nodos por su propiedad Edad.
  • Reconstruye la lista enlazada con los nodos ordenados, llamando a la función InsertarNodoAlFinal para cada nodo en la lista ordenada.
  • Muestra un mensaje en la consola indicando que los nodos han sido ordenados.
  1. Agrega la opción en el menú para ordenar los nodos, puedes hacerlo antes de la opción de salir (opción "5"):
case "5": OrdenarNodos(ref cabeza); break; case "6": return;

Aquí hemos agregado una opción "5 en el menú para ordenar los nodos. Al seleccionar esta opción, se llamará al método OrdenarNodos y se imprimirá un mensaje indicando que los nodos han sido ordenados.

Recuerda que también debes modificar el switch/case para acomodar el nuevo número de opciones. Por ejemplo, si ya tenías 5 opciones, debes cambiar elcase "5"acase "6"`.

Espero que esto te sea útil. Si tienes alguna otra pregunta, no dudes en preguntar.

el programa completo como seria

Aquí tienes el programa completo, incluyendo la opción de ordenar los nodos:

using System; using System.Collections.Generic; using System.Linq; class Nodo { public string Nombre { get; set; } public int Edad { get; set; } public Nodo Siguiente { get; set; } public Nodo(string nombre, int edad) { Nombre = nombre; Edad = edad; Siguiente = null; } } class Program { static Nodo ObtenerNuevoNodo() { Console.WriteLine("Ingrese el nombre del nodo:"); string nombre = Console.ReadLine(); Console.WriteLine("Ingrese la edad del nodo:"); int edad = int.Parse(Console.ReadLine()); return new Nodo(nombre, edad); } static void InsertarNodoAlFinal(ref Nodo cabeza, string nombre, int edad) { Nodo nuevoNodo = new Nodo(nombre, edad); if (cabeza == null) { cabeza = nuevoNodo; } else { Nodo actual = cabeza; while (actual.Siguiente != null) { actual = actual.Siguiente; } actual.Siguiente = nuevoNodo; } } static void ImprimirNodos(Nodo cabeza) { Nodo actual = cabeza; while (actual != null) { Console.WriteLine($"Nombre: {actual.Nombre}, Edad: {actual.Edad}"); actual = actual.Siguiente; } } static void GuardarNodosEnArchivo(Nodo cabeza) { Console.WriteLine("Ingrese el nombre del archivo para guardar los nodos:"); string nombreArchivo = Console.ReadLine(); using (System.IO.StreamWriter sw = new System.IO.StreamWriter(nombreArchivo)) { Nodo actual = cabeza; while (actual != null) { sw.WriteLine($"Nombre: {actual.Nombre}, Edad: {actual.Edad}"); actual = actual.Siguiente; } } } static void OrdenarNodos(ref Nodo cabeza) { List<Nodo> nodosList = new List<Nodo>(); Nodo actual = cabeza; while (actual != null) { nodosList.Add(actual); actual = actual.Siguiente; } nodosList = nodosList.OrderBy(n => n.Edad).ToList(); cabeza = null foreach (Nodo nodo in nodosList) { InsertarNodoAlFinal(ref cabeza, nodo.Nombre, nodo.Edad); } Console.WriteLine("Nodos ordenados por edad."); } static void Main(string[] args) { Nodo cabeza = null; while (true) { Console.WriteLine("Ingrese una opción:"); Console.WriteLine("1. Insertar un nuevo nodo"); Console.WriteLine("2. Imprimir los nodos"); Console.WriteLine("3. Guardar los nodos en un archivo"); Console.WriteLine("4. Ordenar los nodos por edad"); Console.WriteLine("5. Salir"); string opcion = Console.ReadLine(); switch (opcion) { case "1": InsertarNodoAlFinal(ref cabeza, "", 0); break; case "2": Console.WriteLine("Nodos:"); ImprimirNodos(cabeza); break; case "3": GuardarNodosEnArchivo(cabeza); break; case "4": OrdenarNodos(ref cabeza); break; case "5": return; default: Console.WriteLine("Opción inválida. Por favor, ingrese una opción válida."); break; } Console.WriteLine(); } } }

Puedes copiar y pegar este código en un archivo de código fuente con extensión ".cs" y ejecutarlo. Luego, podrás seleccionar diferentes opciones del menú para insertar nodos, imprimir los nodos, guardar los nodos en un archivo y ordenar los nodos por edad.

Espero que esto te ayude. Si tienes alguna otra pregunta, no dudes en preguntar.

esta linea de tu codigo InsertarNodoAlFinal(ref cabeza, nodo.Nombre, nodo.Edad); muestra el siguiente error Ninguna sobrecarga para el método 'InsertarNodoAlFinal' toma 3 argumentos

El error "Ninguna sobrecarga para el método 'InsertarNodoAlFinal' toma 3 argumentos" indica que el método InsertarNodoAlFinal no tiene una definición que acepte tres argumentos en el código actual.

Para solucionar este error, puedes hacer lo siguiente:

  1. Asegúrate de que el método InsertarNodoAlFinal tenga una definición que acepte tres argumentos: ref Nodo cabeza, string nombre, int edad. Si ya tienes esta definición en tu código, verifica si hay algún error sintaxis o nombres incorrectos de los parámetros.

  2. Si no tienes una definición de InsertarNodoAlFinal que acepte tres argumentos, puedes modificar el código para hacerlo compatible con la definición actual del método. Por ejemplo, podrías pasar solo el nodo como argumento y extraer el nombre y la edad dentro método. Aquí hay un ejemplo de cómo podrías modificar el código:

static void InsertarNodoAlFinal(ref Nodo cabeza, Nodo nuevoNodo) { if (cabeza == null) { cabeza = nuevoNodo; } else { Nodo actual = cabeza; while (actual.Siguiente != null) { actual =.Siguiente; } actual.Siguiente = nuevoNodo; } } static void Main(string[] args) { Nodo cabeza = null; while (true) { Console.WriteLine("Ingrese una opción:"); Console.WriteLine("1. Insertar un nuevo nodo"); Console.WriteLine("2. Imprimir los nodos"); Console.WriteLine3.ir"); string opcion = Console.ReadLine(); switch (opcion) { case "1": Nodo nuevoNodo =enerNuevoNodo(); InsertarNodoAlFinal(ref cabeza nuevoNodo); break; case "2": Console.WriteLine("Nodos:"); ImprimirNodos(cabeza); break; case "3": return; default: Console.WriteLine("Opción inválida. Por favor, ingrese opción válida."); break; } Console.WriteLine(); } }

En este ejemplo, he creado un nuevo método InsertarNodoAlFinal acepta dos argumentos: ref Nodo cabeza y Nodo nuevoNodo. Dentro de este método, se realiza la inserción del nodo en la lista enlazada. Luego, en el Main, se obtiene un nuevo nodo mediante el método ObtenerNuevoNodo y se pasa como argumento al método InsertarNodoAlFinal.

Espero que esto solucione el error. Si tienes alguna otra pregunta, no dudes en preguntar.

Los lenguajes, como casi todo en este universo que tiende a la entropa, van evolucionando y ganando complejidad con el tiempo. As nos encontramos con la paradoja de que cuanto ms completa es la sintaxis, ms ilegible se puede volver el cdigo. Por ejemplo, la mxima que deca escribe la menor cantidad de cdigo, que vaya lo ms rpido posible, tiene un orden de prioridad menor frente a paradigmas de programacin ms modernos como Clean Code o KISS. Por ello ahora quiero compartir una tcnica para facilitar la legibilidad de nuestros programas y que trata de la sobrecarga de los mtodos. Qu es sobrecargar Segn MSDN, La sobrecarga consiste en crear ms de un procedimiento, constructor de instancia o propiedad en una clase con el mismo nombre y distintos tipos de argumento. Lo cual, sin un buen ejemplo, es un tanto confuso. Me pongo manos a la obra, creo un proyecto de consola y, en el inicio del programa, hago que escriba por consola el resultado de un mtodo llamado suma(). using System; namespace GenbetaDevConsola { class Program { static void Main(string[] args) { System.Console.Write(suma(1, 1)); } } } Obviamente debo escribir el mtodo, tal que as: private int suma(int numero1, int numero2) { return numero1 + numero2; } Pero, si me encuentro con que los nmeros no son enteros si no que son ms grandes? Tengo dos opciones. Una sera crear un nuevo mtodo que se llame algo como sumaDouble() y que tenga dos nmeros doubles por parmetros. La otra opcin es sobrecargar el mtodo suma con nuevos parmetros, pudindolo utilizar indistintamente en un caso o en el otro. private int suma(double numero1, double numero2) { int numero = 0; Int32.TryParse((numero1 + numero2).ToString(),out numero); return numero; } Lo mejor es que Intellisense del Visual Studio me ayuda y me indica que el mtodo suma() est sobrecargado y me ofrece ver la firma de cada una de ellas. Es ms, puedo ir aadiendo complejidad a mi mtodo suma aceptando ms parmetros y de diferente tipo como, por ejemplo, poder sumar tres cantidades o hacer sumas booleanas. private static int suma(int numero1, int numero2, int numero3) { return numero1 + numero2 numero3; } private static int suma(Boolean numero1, Boolean numero2) { return numero1 == numero2? 1 : 0; } NOTA: Lo que he utilizado en la suma Booleana es una forma compacta de un condicional. Si se cumple la igualdad, devuelvo 1. Si no, devuelvo 0. No es muy legible y conozco alguno que deca que esto era evil. Pero es muy til. Fjate que lo importante de utilizar sobrecargas, es que encapsulo el funcionamiento de los mtodos de forma que siempre llamo a suma(), y solo me debo preocupar de cumplimentar correctamente alguna de sus posibles firmas. Por cierto, por si alguno desconoce el concepto de firma, MSDN dice: Los mtodos se declaran en una clase o struct mediante la especificacin del nivel de acceso como public o private, modificadores opcionales como abstract o sealed, el valor devuelto, el nombre del mtodo y cualquier parmetro de mtodo.Todos esos elementos constituyen la firma del mtodo. Mejorando las sobrecargas Pero C# sigue adelante en su evolucin (realmente todo .NET) y a partir de la versin 4.0 tengo tres novedades que me han llamado mucho la atencin por su utilidad. Puedo declarar un mtodo y ponerle por defecto un valor a cada uno de sus parmetros. Por ejemplo si quiero calcular la hipotenusa puedo crear un mtodo tal cual, public static double calculaHipotenusa ( double cateto1 = 100, double cateto2 = 100, double hipotenusa = 0 ) { return Math.Sqrt(Math.Pow(cateto1,2) + Math.Pow(cateto1,2)); } As puedo llamar a este mtodo de diferentes formas de acuerdo a los datos que tenga, sin tener que rellenar obligatoriamente todos los parmetros. static void Main(string[] args) { System.Console.Write(calculaHipotenusa()); System.Console.Write(calculaHipotenusa(100)); System.Console.Write(calculaHipotenusa(100, 50)); System.Console.Write(calculaHipotenusa(cateto2:50)); } Ahora fjate en la ltima forma de llamar al mtodo. Estoy introduciendo el nom

genbeta.com

Autor Tema: ErrorC# Ninguna sobrecarga para el mtodo 'Show' acepta '3' argumentos (Ledo 4,438 veces) Joe Fraddy Desconectado Mensajes: 277 Estoy usando Visual Studio 2008, para desarrollar una aplicacin en el lenguaje C#, todo muy bien, pero me sale este error, al querer correr el programa:Error 1 Ninguna sobrecarga para el mtodo 'Show' acepta '3' argumentosEste error me sale en el codigo:DialogResult result = MessageBox.Show(msg.ToString(), "Modificar",MessageBoxButtons.YesNo);De hecho si quito la parte de MessageBoxButtons.YesNo el programa corre perfectamente.Me podran ayudarSaludos!!! Eletro Ex-Staff Desconectado Mensajes: 9.697 Es extrao, la sobrecarga u overload MessageBox.Show(String, String, MessageBoxButtons) est disponible en todas las versiones de .Net Framework mencionadas aqu:MessageBox.Show Method - MSDNEsts utilizando algn perfil de cliente de .Net Framework?.Prueba a limpiar y reconstruir el proyecto (Build -> Clean Solution | Build -> Rebuild Solution)Saludos MeTaD Desconectado Mensajes: 84 Te falta MessageBoxIcon, y luego es que viene los buttons, si no me equivoco... hace ya tiempo que no toco el C#Prueba esto a ver que te dice:MessageBox.Show("my text", "title",MessageBoxButtons.OKCancel,MessageBoxIcon.Exclamation,MessageBoxDefaultButton.Button1 );Es una version .net compact o algo asi? que version de .net usas? ltima modificacin: 4 Febrero 2016, 21:27 pm por MeTaD En lnea Eletro Ex-Staff Desconectado Mensajes: 9.697 Te falta MessageBoxIcon, y luego es que viene los buttons, si no me equivoco... hace ya tiempo que no toco el C#Hombre, eso es otro overload, y lo cierto es que lo que propones como solucin debera servir, pero el problema principal sigue siendo un misterio, por que ese otro overload que se mencion al principio tambin debera poder usarlo.Saludos! Mensajes similares Asunto Iniciado por Respuestas Vistas ltimo mensaje detectar metodo show Programacin Visual Basic z_ane_666 2 2,430 29 Octubre 2011, 10:36 am por z_ane_666 Para qu funciona la sobrecarga de operadores? Programacin C/C++ Rockstar97 3 2,025 21 Mayo 2015, 02:50 am por Peregring-lk CItem::Convert : la funcin no acepta 7 argumentos Programacin C/C++ YolaxD 3 1,799 18 Enero 2016, 20:35 pm por MAFUS Paso como argumentos a un mtodo .NET (C#, VB.NET, ASP) aspiazu 1 1,542 12 Abril 2017, 04:32 am por Eletro Mi Sony Xperia st26i no acepta ninguna tarjeta SD. Ayuda Android Carcarez58 2 4,727 30 Noviembre 2019, 20:00 pm por Machacador

foro.elhacker.net

Artculo 04/07/2023 Realiz una llamada a un mtodo sobrecargado, pero el compilador encontr dos o ms sobrecargas con listas de parmetros a los que se puede convertir la lista de argumentos y no puede seleccionar entre estas. El compilador intenta que los tipos de datos en la lista de argumentos de llamada y la lista de parmetros de sobrecarga coincidan lo mximo posible. Requiere una conversin de ampliacin de cada uno de los argumentos al parmetro correspondiente, tanto si el modificador de comprobacin de tipo (Option Strict Statement) es On como si es Off. Si el compilador encuentra ms de una sobrecarga que satisface el requisito de ampliacin, busca la sobrecarga que es ms especfica para los tipos de datos del argumento, es decir, que realiza una llamada para la menor cantidad de ampliacin. Genera este mensaje de error cuando una sobrecarga es ms especfica para el tipo de datos de un argumento, mientras que otra sobrecarga es ms especfica para el tipo de datos de otro argumento. Para obtener ms informacin y un ejemplo, vea Overload Resolution. Identificador de error: BC30521 Para corregir este error Revise todas las sobrecargas del mtodo y determine a cul desea llamar. En la instruccin de llamada, haga que los tipos de datos de los argumentos coincidan con los tipos de datos de los parmetros definidos para la sobrecarga deseada. Es posible que deba usar la CType Function para convertir uno o ms tipos de datos a los tipos definidos. Consulte tambin Sobrecarga de procedimientos Consideraciones sobre la sobrecarga de procedimientos Overload Resolution Sobrecargas Propiedades y mtodos sobrecargados Option Strict (instruccin) CType Function

learn.microsoft.com

static void OrdenarNodos(ref Nodo cabeza) { List nodosList = new List(); Nodo actual = cabeza; while (actual != null) { nodosList.Add(actual); actual = actual.Siguiente; }

nodosList = nodosList.OrderBy(n => n.Edad).ToList(); cabeza = null; foreach (Nodo nodo in nodosList) { InsertarNodoAlFinal(ref cabeza, nodo.Nombre, nodo.Edad); } Console.WriteLine("Nodos ordenados por edad."); }

esta funcion como la soluciono para que no muestre el error: InsertarNodoAlFinal(ref cabeza, nodo.Nombre, nodo.Edad); muestra el siguiente error Ninguna sobrecarga para el método 'InsertarNodoAlFinal' toma 3 argumentos

Si estás obteniendo el error "Ning sobrecarga para el método 'InsertarNodoAlFinal' toma 3 argumentos" al llamar a la función InsertarNodoAlFinal(ref cabeza, nodo.Nombre, nodo.Edad), significa que la función InsertarNodoAlFinal no tiene una sobrecarga que acepte tres argumentos en el código actual.

Para solucionar este problema, puedes realizar los siguientes pasos:

  1. Verifica la definición de la función InsertarNodoAlFinal y asegúrate de que solo acepte dos argumentos, por ejemplo, ref Nodo cabeza y Nodo nuevoNodo. Si ya tienes esta definición en tu código, verifica que los nombres de los parámetros correctos y coincidan con la llamada a la función.

  2. Si deseas pasar tres argumentos a la función InsertarNodoAlFinal, tendrás que modificar suición para que acepte los tres argumentos. Dentro de función, puedes crear un nuevo nodo utilizando los argumentos proporcionados y luego insertarlo en la lista enlazada.

Aquí hay un ejemplo de cómo podrías modificar la función InsertarNodoAlFinal para que acepte tres argumentos:

static void InsertarNodoAlFinal(ref Nodo cabeza, string nombre, int edad) { Nodo nuevoNodo = new Nodo(nombre, edad); if (abeza == null) { cabeza = nuevoNodo } else { Nodo actual = cabeza; while (actual.Siguiente != null) { actual = actual.Siguiente; } actual.Siguiente = nuevoNodo } }

Con esta modificación, puedes llamar a la función InsertarodoAlFinal con tres argumentos sin obtener el error.

Espero que esto solucione el problema. Si tienes alguna otra pregunta, no dudes en preguntar.

Los lenguajes, como casi todo en este universo que tiende a la entropa, van evolucionando y ganando complejidad con el tiempo. As nos encontramos con la paradoja de que cuanto ms completa es la sintaxis, ms ilegible se puede volver el cdigo. Por ejemplo, la mxima que deca escribe la menor cantidad de cdigo, que vaya lo ms rpido posible, tiene un orden de prioridad menor frente a paradigmas de programacin ms modernos como Clean Code o KISS. Por ello ahora quiero compartir una tcnica para facilitar la legibilidad de nuestros programas y que trata de la sobrecarga de los mtodos. Qu es sobrecargar Segn MSDN, La sobrecarga consiste en crear ms de un procedimiento, constructor de instancia o propiedad en una clase con el mismo nombre y distintos tipos de argumento. Lo cual, sin un buen ejemplo, es un tanto confuso. Me pongo manos a la obra, creo un proyecto de consola y, en el inicio del programa, hago que escriba por consola el resultado de un mtodo llamado suma(). using System; namespace GenbetaDevConsola { class Program { static void Main(string[] args) { System.Console.Write(suma(1, 1)); } } } Obviamente debo escribir el mtodo, tal que as: private int suma(int numero1, int numero2) { return numero1 + numero2; } Pero, si me encuentro con que los nmeros no son enteros si no que son ms grandes? Tengo dos opciones. Una sera crear un nuevo mtodo que se llame algo como sumaDouble() y que tenga dos nmeros doubles por parmetros. La otra opcin es sobrecargar el mtodo suma con nuevos parmetros, pudindolo utilizar indistintamente en un caso o en el otro. private int suma(double numero1, double numero2) { int numero = 0; Int32.TryParse((numero1 + numero2).ToString(),out numero); return numero; } Lo mejor es que Intellisense del Visual Studio me ayuda y me indica que el mtodo suma() est sobrecargado y me ofrece ver la firma de cada una de ellas. Es ms, puedo ir aadiendo complejidad a mi mtodo suma aceptando ms parmetros y de diferente tipo como, por ejemplo, poder sumar tres cantidades o hacer sumas booleanas. private static int suma(int numero1, int numero2, int numero3) { return numero1 + numero2 numero3; } private static int suma(Boolean numero1, Boolean numero2) { return numero1 == numero2? 1 : 0; } NOTA: Lo que he utilizado en la suma Booleana es una forma compacta de un condicional. Si se cumple la igualdad, devuelvo 1. Si no, devuelvo 0. No es muy legible y conozco alguno que deca que esto era evil. Pero es muy til. Fjate que lo importante de utilizar sobrecargas, es que encapsulo el funcionamiento de los mtodos de forma que siempre llamo a suma(), y solo me debo preocupar de cumplimentar correctamente alguna de sus posibles firmas. Por cierto, por si alguno desconoce el concepto de firma, MSDN dice: Los mtodos se declaran en una clase o struct mediante la especificacin del nivel de acceso como public o private, modificadores opcionales como abstract o sealed, el valor devuelto, el nombre del mtodo y cualquier parmetro de mtodo.Todos esos elementos constituyen la firma del mtodo. Mejorando las sobrecargas Pero C# sigue adelante en su evolucin (realmente todo .NET) y a partir de la versin 4.0 tengo tres novedades que me han llamado mucho la atencin por su utilidad. Puedo declarar un mtodo y ponerle por defecto un valor a cada uno de sus parmetros. Por ejemplo si quiero calcular la hipotenusa puedo crear un mtodo tal cual, public static double calculaHipotenusa ( double cateto1 = 100, double cateto2 = 100, double hipotenusa = 0 ) { return Math.Sqrt(Math.Pow(cateto1,2) + Math.Pow(cateto1,2)); } As puedo llamar a este mtodo de diferentes formas de acuerdo a los datos que tenga, sin tener que rellenar obligatoriamente todos los parmetros. static void Main(string[] args) { System.Console.Write(calculaHipotenusa()); System.Console.Write(calculaHipotenusa(100)); System.Console.Write(calculaHipotenusa(100, 50)); System.Console.Write(calculaHipotenusa(cateto2:50)); } Ahora fjate en la ltima forma de llamar al mtodo. Estoy introduciendo el nom

genbeta.com

Autor Tema: ErrorC# Ninguna sobrecarga para el mtodo 'Show' acepta '3' argumentos (Ledo 4,438 veces) Joe Fraddy Desconectado Mensajes: 277 Estoy usando Visual Studio 2008, para desarrollar una aplicacin en el lenguaje C#, todo muy bien, pero me sale este error, al querer correr el programa:Error 1 Ninguna sobrecarga para el mtodo 'Show' acepta '3' argumentosEste error me sale en el codigo:DialogResult result = MessageBox.Show(msg.ToString(), "Modificar",MessageBoxButtons.YesNo);De hecho si quito la parte de MessageBoxButtons.YesNo el programa corre perfectamente.Me podran ayudarSaludos!!! Eletro Ex-Staff Desconectado Mensajes: 9.697 Es extrao, la sobrecarga u overload MessageBox.Show(String, String, MessageBoxButtons) est disponible en todas las versiones de .Net Framework mencionadas aqu:MessageBox.Show Method - MSDNEsts utilizando algn perfil de cliente de .Net Framework?.Prueba a limpiar y reconstruir el proyecto (Build -> Clean Solution | Build -> Rebuild Solution)Saludos MeTaD Desconectado Mensajes: 84 Te falta MessageBoxIcon, y luego es que viene los buttons, si no me equivoco... hace ya tiempo que no toco el C#Prueba esto a ver que te dice:MessageBox.Show("my text", "title",MessageBoxButtons.OKCancel,MessageBoxIcon.Exclamation,MessageBoxDefaultButton.Button1 );Es una version .net compact o algo asi? que version de .net usas? ltima modificacin: 4 Febrero 2016, 21:27 pm por MeTaD En lnea Eletro Ex-Staff Desconectado Mensajes: 9.697 Te falta MessageBoxIcon, y luego es que viene los buttons, si no me equivoco... hace ya tiempo que no toco el C#Hombre, eso es otro overload, y lo cierto es que lo que propones como solucin debera servir, pero el problema principal sigue siendo un misterio, por que ese otro overload que se mencion al principio tambin debera poder usarlo.Saludos! Mensajes similares Asunto Iniciado por Respuestas Vistas ltimo mensaje detectar metodo show Programacin Visual Basic z_ane_666 2 2,430 29 Octubre 2011, 10:36 am por z_ane_666 Para qu funciona la sobrecarga de operadores? Programacin C/C++ Rockstar97 3 2,025 21 Mayo 2015, 02:50 am por Peregring-lk CItem::Convert : la funcin no acepta 7 argumentos Programacin C/C++ YolaxD 3 1,799 18 Enero 2016, 20:35 pm por MAFUS Paso como argumentos a un mtodo .NET (C#, VB.NET, ASP) aspiazu 1 1,542 12 Abril 2017, 04:32 am por Eletro Mi Sony Xperia st26i no acepta ninguna tarjeta SD. Ayuda Android Carcarez58 2 4,727 30 Noviembre 2019, 20:00 pm por Machacador

foro.elhacker.net

Artculo 04/07/2023 Realiz una llamada a un mtodo sobrecargado, pero el compilador encontr dos o ms sobrecargas con listas de parmetros a los que se puede convertir la lista de argumentos y no puede seleccionar entre estas. El compilador intenta que los tipos de datos en la lista de argumentos de llamada y la lista de parmetros de sobrecarga coincidan lo mximo posible. Requiere una conversin de ampliacin de cada uno de los argumentos al parmetro correspondiente, tanto si el modificador de comprobacin de tipo (Option Strict Statement) es On como si es Off. Si el compilador encuentra ms de una sobrecarga que satisface el requisito de ampliacin, busca la sobrecarga que es ms especfica para los tipos de datos del argumento, es decir, que realiza una llamada para la menor cantidad de ampliacin. Genera este mensaje de error cuando una sobrecarga es ms especfica para el tipo de datos de un argumento, mientras que otra sobrecarga es ms especfica para el tipo de datos de otro argumento. Para obtener ms informacin y un ejemplo, vea Overload Resolution. Identificador de error: BC30521 Para corregir este error Revise todas las sobrecargas del mtodo y determine a cul desea llamar. En la instruccin de llamada, haga que los tipos de datos de los argumentos coincidan con los tipos de datos de los parmetros definidos para la sobrecarga deseada. Es posible que deba usar la CType Function para convertir uno o ms tipos de datos a los tipos definidos. Consulte tambin Sobrecarga de procedimientos Consideraciones sobre la sobrecarga de procedimientos Overload Resolution Sobrecargas Propiedades y mtodos sobrecargados Option Strict (instruccin) CType Function

learn.microsoft.com

no funciona tu codigo insertar

Lamento que el código proporcionado no funcione correctamente. Para ayudarte mejor, ¿podrías proporcionarme más detalles sobre el problema específico que estás enfrentando con la función de inserción de nodos en la lista enlazada? ¿Recibes algún error o mensaje en particular?

Con la información adicional, podré brindarte una solución más precisa o una revisión del código para solucionar el problema.

Espero tu respuesta.

No debe confundirse con Lista. En ciencias de la computacin, una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias, enlaces o punteros al nodo anterior o posterior. El principal beneficio de las listas enlazadas respecto a los vectores convencionales es que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento. Una lista enlazada es un tipo de dato autorreferenciado porque contienen un puntero o enlace (en ingls link, del mismo significado) a otro dato del mismo tipo. Las listas enlazadas permiten inserciones y eliminacin de nodos en cualquier punto de la lista en tiempo constante (suponiendo que dicho punto est previamente identificado o localizado), pero no permiten un acceso aleatorio. Existen diferentes tipos de listas enlazadas: listas enlazadas simples, listas doblemente enlazadas, listas enlazadas circulares y listas enlazadas doblemente circulares. Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales como Lisp, Scheme y Haskell tienen estructuras de datos ya construidas, junto con operaciones para acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales como C o C++ y Java, respectivamente, disponen de referencias para crear listas enlazadas. Historia[editar] Las listas enlazadas fueron desarrolladas en 1955-56 por Cliff Shaw y Herbert Simn en RAND Corporation, como la principal estructura de datos para su Lenguaje de Procesamiento de la Informacin (IPL). IPL fue usado por los autores para desarrollar varios programas relacionados con la inteligencia artificial, incluida la Mquina de la Teora General, el Solucionador de Problemas Generales, y un programa informtico de ajedrez. Se public en IRE Transactions on Information Theory en 1956, y en distintas conferencias entre 1957-1959, incluida Proceedings of the Western Joint Computer en 1957 y 1958, y en Information Processing (Procedentes de la primera conferencia internacional del procesamiento de la informacin de la Unesco) en 1959. El diagrama clsico actual, que consiste en bloques que representan nodos de la lista con flechas apuntando a los sucesivos nodos de la lista, apareci en Programming the Logic Theory Machine, de Newell y Shaw. Newell y Simn fueron reconocidos por el ACM Turing Award en 1975 por hacer contribuciones bsicas a la inteligencia artificial, a la psicologa del conocimiento humano y al procesamiento de las listas. El problema de los traductores del procesamiento natural del lenguaje condujo a Vctor Yngve del Instituto Tecnolgico de Massachusetts (MIT) a usar listas enlazadas como estructura de datos en su COMIT, lenguaje de programacin para computadoras, que investig en el campo de la Lingstica computacional. Un informe de este lenguaje, titulado A programming language for mechanical translation apareci en Mechanical Translation en 1958. LISP, el principal procesador de listas, fue creado en 1958. Una de las principales estructuras de datos de LISP es la lista enlazada. En torno a los 60, la utilidad de las listas enlazadas y los lenguajes que utilizaban estas estructuras como su principal representacin de datos estaba bien establecida. Bert Green, del Lincoln Laboratory del MIT, public un estudio titulado Computer languages for symbol manipulation en IRE Transaction on Human Factors in Electronics en marzo de 1961 que resuma las ventajas de las listas enlazadas. Un posterior artculo, A Comparison of list-processing computer languages de Bobrow y Raphael, apareca en Communications of the ACM en abril de 1964. Muchos sistemas operativos desarrollados por la empresa Technical Systems Consultants (originalmente de West Lafayette Indiana y despus de Raleigh, Carolina del Norte

es.wikipedia.org

LISTAS ENLAZADASUna lista enlazada la constituye una coleccin lineal de elementos, llamados nodos, donde el orden de los mismos se establece mediante punteros. Cada nodo se divide en dos partes: una primera que contiene la informacin asociada al elemento, y una segunda parte, llamada campo de enlace o campo al siguiente puntero, que contiene la direccin del siguiente nodo de la lista. Una lista enlazada es una coleccin lineal de elementos donde el orden de los mismos se establece mediante punteros. La idea bsica es que cada componente de la lista incluya un puntero que indique donde puede encontrarse el siguiente componente por lo que el orden relativo de estos puede ser fcilmente alterado modificando los punteros lo que permite, a su vez, aadir o suprimir elementos de la lista. Una lista enlazada es una serie de nodos, conectados entre s a travs de una referencia, en donde se almacena la informacin de los elementos de la lista. Por lo tanto, los nodos de una lista enlazada se componen de dos partes principales: Ventajas de usar listas: Las listas son dinmicas, es decir, podemos almacenar en ellas tantos elementos como necesitemos, siempre y cuando haya espacio suficiente espacio en memoria. Al insertar un elemento en la lista, la operacin tiene un tiempo constante independientemente de la posicin en la que se inserte, solo se debe crear el nodo y modificar los enlaces. Esto no es as en los arreglos, ya que si el elemento lo insertamos al inicio o en medio, tenemos un tiempo lineal debido a que se tienen que mover todos los elementos que se encuentran a la derecha de la posicin donde lo vamos a insertar y despus insertar el elemento en dicha posicin; solo al insertar al final del arreglo se obtienen tiempos constantes. Al eliminar un elemento paso lo mismo que se menciono en el punto anterior. Desventajas de usar listas:El acceso a un elemento es ms lento, debido a que la informacin no est en posiciones contiguas de memoria, por lo que no podemos acceder a un elemento con base en su posicin como se hace en los arreglos. REPRESENTACION DE LISTAS ENLAZADAS EN MEMORIA Sea LISTA una lista enlazada, salvo que se indique lo contrario. Almacenaremos LISTA en memoria de la forma siguiente. Como mnimo, LISTA estar compuesta por dos arrays lineales, a los que llamaremos INFO y ENLACE, tales que INFO [K] y ENLACE [K] contienen la parte de informacin y el campo de puntero de cada nodo de LISTA respectivamente. Necesitamos tambin una variable especial llamada COMIENZO que contiene la posicin ocupada por el primer elemento de la lista, y una marca especial NULO que indica el final de la misma. Puesto que los ndices de los arrays INFO y ENLACE sern habitualmente positivos, el valor NULO ser el -999, salvo que digamos lo contrario. El siguiente ejemplo muestra la representacin memoria de una lista enlazada en la que cada nodo de la lista contiene un nico carcter. Podemos obtener la lista de caracteres o, en otras palabras, la cadena de la forma siguiente: COMIENZO = 9, luego INFO [9] = N primer carcter. ENLACE [9] = 3, luego INFO [3] = 0 segundo carcter. ENLACE [3] = 6, luego INFO [6] = (carcter blanco) tercer carcter. ENLACE [6] = 11, luego INFO [11] = E cuarto carcter. ENLACE [11] = 7, luego INFO [7] = X quinto carcter. ENLACE [7] = 10, luego INFO [10] = I sexto carcter. ENLACE [10] = 4, luego INFO [4] = T sptimo carcter.ENLACE [4] = -999 valor nulo, luego termina la lista. FORMA PRINCIPAL DE LA LISTA ENLAZADA Codigo:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace WindowsApplication1{ public partial class Listas : Form { public Listas() { InitializeComponent(); } public static int[] enlace = new int[10] { 2, 3, 4, 0, -999, 6, 7, 8, 9, -999 }; public static string[] alumno = new string[10] { "Jose", "Ana", "Rosa", "Beto", "zeta", "", "", "", "", "" }; public static int comienzo = 1; public static int disponible = 5; privat

adsltodo.es

A las listas vistas hasta el momento podemos recorrerlas solamente en una direccin (Listas simplemente encadenadas). Hay problemas donde se requiere recorrer la lista en ambas direcciones, en estos casos el empleo de listas doblemente encadenadas es recomendable. Como ejemplo pensemos que debemos almacenar un men de opciones en una lista, la opcin a seleccionar puede ser la siguiente o la anterior, podemos desplazarnos en ambas direcciones. Representacin grfica de una lista doblemente encadenada: Observemos que una lista doblemente encadenada tiene dos punteros por cada nodo, uno apunta al nodo siguiente y otro al nodo anterior. Seguimos teniendo un puntero (raiz) que tiene la direccin del primer nodo. El puntero sig del ltimo nodo igual que las listas simplemente encadenadas apunta a null, y el puntero ant del primer nodo apunta a null. Se pueden plantear Listas tipo pila, cola y genricas con enlace doble. Hay que tener en cuenta que el requerimiento de memoria es mayor en las listas doblemente encadenadas ya que tenemos dos punteros por nodo. La estructura del nodo es: class Nodo { public int info; public Nodo sig, ant; } Resolveremos algunos mtodos para administrar listas genricas empleando listas doblemente encadenadas para analizar la mecnica de enlace de nodos. Muchos de los mtodos, para listas simple y doblemente encadenadas no vara, como por ejemplo: el constructor, Vacia, Cantidad, etc. Programa: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ListaGenericaDoble1 { class ListaGenericaDoble { class Nodo { public int info; public Nodo ant,sig; } private Nodo raiz; public ListaGenericaDoble () { raiz=null; } void Insertar (int pos, int x) { if (pos <= Cantidad () + 1) { Nodo nuevo = new Nodo (); nuevo.info = x; if (pos == 1) { nuevo.sig = raiz; if (raiz!=null) raiz.ant=nuevo; raiz = nuevo; } else if (pos == Cantidad () + 1) { Nodo reco = raiz; while (reco.sig != null) { reco = reco.sig; } reco.sig = nuevo; nuevo.ant=reco; nuevo.sig = null; } else { Nodo reco = raiz; for (int f = 1 ; f <= pos - 2 ; f++) reco = reco.sig; Nodo siguiente = reco.sig; reco.sig = nuevo; nuevo.ant=reco; nuevo.sig = siguiente; siguiente.ant=nuevo; } } } public int Extraer (int pos) { if (pos <= Cantidad ()) { int informacion; if (pos == 1) { informacion = raiz.info; raiz = raiz.sig; if (raiz!=null) raiz.ant=null; } else { Nodo reco; reco = raiz; for (int f = 1 ; f <= pos - 2 ; f++) reco = reco.sig; Nodo prox = reco.sig; reco.sig = prox.sig; Nodo siguiente=prox.sig; if (siguiente!=null) siguiente.ant=reco; informacion = prox.info; } return informacion; } else return int.MaxValue; } public void Borrar (int pos) { if (pos <= Cantidad ()) { if (pos == 1) { raiz = raiz.sig; if (raiz!=null) raiz.ant=null; } else { Nodo reco; reco = raiz; for (int f = 1 ; f <= pos - 2 ; f++) reco = reco.sig; Nodo prox = reco.sig; prox=prox.sig; reco.sig = prox; if (prox!=null) prox.ant=reco; } } } public void Intercambiar (int pos1, int pos2) { if (pos1 <= Cantidad () && pos2 <= Cantidad ()) { Nodo reco1 = raiz; for (int f = 1 ; f < pos1 ; f++) reco1 = reco1.sig; Nodo reco2 = raiz; for (int f = 1 ; f < pos2 ; f++) reco2 = reco2.sig; int aux = reco1.info; reco1.info = reco2.info; reco2.info = aux; } } public int Mayor () { if (!Vacia ()) { int may = raiz.info; Nodo reco = raiz.sig; while (reco != null) { if (reco.info > may) may = reco.info; reco = reco.sig; } return may; } else return int.MaxValue; } public int PosMayor() { if (!Vacia ()) { int may = raiz.info; int x=1; int pos=x; Nodo reco = raiz.sig; while (reco != null) { if (reco.info > may) { may = reco.info; pos=x; } reco = reco.sig; x++; } return pos; } else return int.MaxValue; } public int Cantidad () { int cant = 0; Nodo reco = raiz; while (reco != null) { reco = reco.sig; cant++; } return cant; } public bool Ordenada() { if (Cantidad() > 1) { Nodo reco1=raiz; Nodo reco2=raiz.sig; while (reco2!=null) { if (reco2.info < reco1.info) { return false; } reco2=reco2.s

tutorialesprogramacionya.com

al presionar la opcion 1 no pide ningun dato, solo muestra el menu nuevamente

Lamento el error en el código. Parece que el método ObtenerNuevoNodo() no se está llamando correctamente cuando seleccionas la opción "1" en el menú. Esto puede deberse a una omisión o error en el código.

Paraucionar esto, asegúrate de que estás llamando correctamente al método ObtenerNuevoNodo() y asignando el nuevo nodo a la variable nuevoNodo antes de llamar a la función InsertarNodoAlFinal().

Aquí hay un ejemplo corregido del código:

static void Main(string[] args) { Nodo cabeza = null; while (true) { Console.WriteLine("Ingrese una opción:"); Console.WriteLine("1. Insertar un nuevo nodo"); Console.WriteLine("2. Imprimir los nodos"); Console.WriteLine("3. Salir"); string opcion = Console.ReadLine(); switch (opcion) { case "1": Nodo nuevoNodo = ObtenerNuevoNodo(); // Llama al método ObtenerNuevoNodo() InsertarNodoAlFinal(ref cabeza, nuevoNodo); // Pasa el nuevo nodo como argumento break; case "2 Console.WriteLine("Nodos:"); ImprimirNodos(cabeza); break; case "3": return; default: Console.WriteLine("Opción invál. Por favor, ingrese una opción válida."); break; } Console.WriteLine(); } } static Nodo ObtenerNuevoNodo() { Console.WriteLine("Ingrese el nombre del nodo:"); string nombre = Console.ReadLine(); Console.WriteLine("Ingrese la edad del nodo:"); int edad = int.Parse(Console.ReadLine()); return new Nodo(nombre, edad); }

En este ejemplo, se corrigió la llamada al método ObtenerNuevoNodo() dentro del case "1", asegurándonos de que estamos asignando el nuevo nodo devuelto por el método a la variable nuevoNodo. Luego, pasamos nuevoNodo como un argumento al llamar a InsertarNodoAlFinal().

Espero que esto solucione el problema y ahora puedas ingresar los datos para insertar un nuevo nodo correctamente. Si tienes alguna otra pregunta, no dudes en preguntar.

%PDF-1.7 % 1 0 obj <>/Metadata 5540 0 R/ViewerPreferences 5541 0 R>> endobj 2 0 obj <> endobj 3 0 obj <>/XObject<>/Font<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 960 540] /Contents 4 0 R/Group<>/Tabs/S/StructParents 0>> endobj 4 0 obj <> stream xV]j1~_;XB$\`N=A;tFkb4oGG3\4 Ri-=N5f4x4O'7-q,B\:% ~t&'1P P 58#+t(Rpz @RZ! 2$M4nJR Uk/ B,h(`3ZN d~ YUCU`uR3*@5J) ce AD na\Yz&j_=gv = n3{TBM ~{n+- .3 Fz)g_oqw xX83B~C $\2e@+$JkB_" i$ m,#$fT'.XDEM}c=%;cP3-\R[T)vEf,^^Nb+;R"fXD<.x,Hd0cf@SsghsOfAi_V#I8QgY_]*jV1QR-J7C7MMmuU` h endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 7 0 obj <> stream x] sDV [ lXIJ,l Ic|a=.bxF7h,ak }g{N-v{j;`)%a1Bsa~\#"ZY:t1a&PNI9;m \|1ak@mj~k'& [vM3O=| 3+AOm ytGm [YoVm }'n5mS(#VA]_w| aD.c4hGx$|V|[ptO:hi*gX,|Ks_+\X`x<($-5_Hug#3p2:Z_t` MFAp[smcwtd$|[a&g?<=H6;] 7O3fC z'`6VGg ZKuoBa6<kf9\~ 76[U-&]+-( FS!(9h%. -mN"MY0OtN 9iVr m1 V*S,yZ=|VXj%MTMuziUj9EL p.i $! H[JXrlu/`Kq8y(kH\Z gy@l6A 9]6(V=?;C['ONOJ-on9t <s]q/ppo)sflx3'_T^9$[e)1E<7-xe"N/\I_eZDOK Vq)Y[&^$xO>t;'h"a8 e.^4{uh]&9:1_d}p7`.!8X` /p/1 QT=1>m,H~rXQ~zXYFX;%s$on6FH[@q[ W `s#>7cbtK]c,F|/~ Jcp>9'lTtNe:CRxEXfiws?-E!/^HFz~?O:ASoICinY!KnSQ5O!Og!psP2wgP=+]2zaR|q20zAm%Wb- {*2C -;&-0X/-(" 5;TWz?zt\NKgk oVBv+{f$ 4he'Z 0)zN=?0#i|(OM47#NS *2~ 7xcsIt{2:pF/Cn_-HROOy{F\c3a5JtV-*]aI#S3n!rI5784?fk?,W' e[R}{8c_>b o1pEw`x7'/<+1mGx;W&HfMY3[E{s13Y?S-;|*/2&|c!\/ QRs0Z0c6[>=T0 )Ud%; t0Xp}\ P.{vk8unXeMvc;e6)]Xac Cgmf#i*_il p=`^=,co/z+&xG:B;D!${^\M]F;#{izNUtAt=`X~g[1L:;ru=S/\+~"/ :5ZVoW/x QuME){]D`*J*(S'HCL7v*zP0uSTw2$"Sj;X .EQ\C48$fp6 E9.;ZCBhv']F",i[` dp[8 E*bF5aQpX+A|6VPvk'3\@iO$*KEL$ e l[+WL"09"A+F)%_ ~to*%8S.ZP2i= K`1_QDd__6ijJJ>P{ nr J` tTRz@\A>C=2;P-9@`T{7L:'F b]9uI hgl6H+ Fx(}SEU:L(` C D\IKeQ 1((@ ni\_SV"Z4;FtE_Q LIG D][mA x4:dA>P 2!p`8<Y%u++aJ /@D<4VheNV5PgR)/-T xbBm:3 72v`?v endstream endobj 8 0 obj <> stream x}PTU.. ~fbI2Bf4~c*hLSZ6#ihfheJjh(b ~{46xx{=?}/Ct&T P : RO"J%/IpG1q&ezQg>>("nC*G=Az++:V}-GZ"GM&G%qEqw]4\#>w)R p%:I^U]'Hu$S(BiqQ$"/U HSETE+%s<+nyRTooMB,!"tBB'[m:-^VO$O9P-uRyl_:}1*=pU%G}JQo6JN/I,q8#)FzE=|h*B$="CuI7}xD~-r^SfMz`Ec*k*q9M *$5JLlM  D >@=\IMFB7QeITf1J9s] ^r A)usuoe  + +1W4^f5tgc)Pm0WQ.(2 -Q:_Z :.(]K:Q#!yT8&$\3=L@9,Ji{Z'B0cH69~iG5EI)GuS1EroIFSMQb}q,22%USw/iK{Q[a/yScT<#g@H1w=jM8b4+'bo-\\I)NL>$y_ysfq AAeys?p b-Akn.EXR0KzDkKuf'*D=cH+OL]IY8< 0 I$T qrc /__i:n`C0 PZw~4D+CCe\!}Qh[:Re32YI* +bM?RSb/ >ZUm:Qs F,(zH5B_b5 l6XilQN&5OB64gnPP~]j:EO/W N C C X_X=x(L)hV@GW m)ZLLGm735g> endobj 10 0 obj <> endobj 11 0 obj <> stream xys+H< !@wSnGc?\ZwH$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"8; 1,Cu,H$D"H$Gox\ ?O?z-O_~w_~X;H$D"H$YzbyA7MnL8\GfkQ-O- s+ F jF[-^_J~]huGU?},6iMwgte^p'$v4}H$D"8[_Bw;[WXWf{Q~u[|nIGM FQQbuGMC91*Rk,jNVoU8\*r_aRn@wlvp?EWO'O[{w:U~5To_S UocSsP}XA$'Cb tvjeU_<D"q G$ J<)Wo DEQ1}*u=w=u%' 1U+}(uzd*T ]@?i>}kM]\Unpehi~k-y~.& [4"O]UaW;tLA.w\Fut W5wKkE?yA/^^9*qrWj* GV*@C}V@*AeBE'N&:r,H)uSAPTgtNO>Zk}A~J7@z#?H$e#jgO_l[lR1QWOfmi u[X8zUhT5dG`]K+U ]hOp@6(vsVQzdE@5\Ss yBC=*~ ~MYK7:ih*[aGVDw#`|Sa5h /s, 0N 8AT0.i1kd{(0^1 5K42-mcaT8}C|" 3Owv`5 /}pU i v@Z5#U~=CN=g }|/'< Qzfn !h;U/JL8vfV~T{"0]CC$*E_e P8K/]}g'hsbS_hf>DUO&TTHGm&*]2XL`6(jM ^C1:E#VTpehBtJ}pE];+n!(cMCQ E_&mcbHXCggNTn=Wa`Em-  {%QUINn@:yQ<,:aHv LTkOO*v kh W>-nkj

uv.mx

%PDF-1.5 % 1 0 obj <>>> endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 4 0 R/Group<>/Tabs/S/StructParents 0>> endobj 4 0 obj <> stream x[KF0HLGpq8! R/Oq9VUw!%zc~TulRM^g]?rv?\/6=vWe'O, fbk/_%[n&SCL #=1 f|dO'1e[[GuA)Kx7$xDInOO{syV23V "Luq3RFwm$Z5[H&y+-agJAkvM[ .%ak8GSO;(p< Y{a IjWGdvow;tq>8>V:[urU2>U LzF3 `e!#>x9Fk6P26Z3Y:=~wb6hX^jr>P}RS`ZBN}CCLcV i`.OQ1sJ`]&~cI3JKI>{B`:<q8]u*bR:J4Zwz`SpsfzeyAya1ev%'ZZwE+vs<&t}vNxd[ &# iQ~:^eteCi'P5Z5s-S:wo ZU-q$WzjZ}YBcfUn!+Y6Fh \re(DjT 7BY0fb|3tG>,JiJ'(9QJuXQ$QG`:-c7?*H*8dhFrN"Cr XatiZu,.CsW_Ue`_t+2"d:A!8 =0>?FW'0vq72uE(Lv|o^ciNs@oqp`l5Gf4ZyA(Nv_WCA x>9KfV9K2u@-yX<cIcI<whSyE#vye+y-R:>|MYd!w?{uBRWHv(wmNL't5h(&ABY^U3av7e({N6m"%&}CvKNie>_ab[BC'l6YmW-OV7H'LIX^ .3]]]$\sE@^Ni@Z 8u8P (;07XPA\Mmq"Kh#wXIO !OEe;c~j4r1Od#9oBQM[d|EZk>( k~N`TT~}C=>> pfD281MLC3D;OuZpDPN0Iyfr,m4%)R|N:$sF_ 4{%poSH*oi5GX#(` >B~-,PN* 5t0)y2RL:?uwE<gtA]cm,\]MJM+6c9W=\)ka\8wWYAg<k$ `0|}p~r{r6)UM=Lu6p1;\g=A}mw%q*TerZ9D4Hab^9v$ qFSZlw\YIcmg3, 665jF]&9&Fir[ !>Bd@+Avb8Ea}}MS}I5j}vV_wJ\8khB-~t{2kQkWI]3a/^pvj-} sZ_#:=KN7mnam w  VemO8{|-[W< @J$G`PVi{Ft%e#,uC-xE }@*X Hm>YzAY3| \=,CWJ:+xQAh#>Pb] b Bf=VW4B"Z=_Q26m$Kb#>mL&!R?eiQ| *0 /g0JeE F'A=}'w |7BjHN8Ic;,@"27 v1$||V R7]sul++o?,J ]"m :7w+}&mSYoKZ)[3L1 ~:$jy-Z~c;(^Mp/_'r(8Q ./T&QDk!Jm;Jzj$Gn?R0)MPdxW%omze_ J [E->$ IV/+eRiz BfYH _H ?1;wO D ~$sRaI'Ux'"tu{Y7{5>{5 22pKkVN//-Pu|%r$X/ c~<-8'xbda1> endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <> endobj 11 0 obj [ 12 0 R] endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj [ 21 0 R] endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <>/ExtGState<>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 612 792] /Contents 25 0 R/Group<>/Tabs/S/StructParents 1>> endobj 25 0 obj <> stream xZKomNO0 ( %" Zu ?*Gt|)U^o rUU_kx|_v~O5xqovj~sp?v}- 9?,5\*v;>?`Og1!xgY w\i ?kY(J^K_k^e ~`U jVglx` 8  rUady,zFzVBz7k*XOg7_gEjs*TgiK@:]]w~".A\UZA>X4dY-^'|qH\|'KEe:"yU"xMDXF,G&*~g^z9xGtn "N<&x 8D6G/W.A{aOX,d)\t8A- SGu kYBb= h/R3sQ~Z"hwZ%$'Kp6o@~)LyZ l*bp)0;b)k.`EKJS<[NB=BGP^raK0YFgn8+ RO5p36FNKi-Fh[iDT;x)|b]wAWp"C5<,r y^; .sY?Z) I+SZyxb`%G(`Lo5dpD+;$il .iSzgrpx,GXnDcdz&y]^oPwNDn1"J=kGmC5{)2?,Zg9?VAE pb}R!U*s $\'t0z3c2GNye -+ ~`i^= n R7 6Npzq{HD!|ZKj.|QR4%z4DxF+[r8O$zM($HF&OD7oY:CQ: 4<L27o"!]}h`s"\( A(A JD( ZAj"_t]BIAsUQ}N,n&{>K nxB+a=U*~ o5DT@ht5f* }?W*wm(O .M ',q{j$ !/ : KHt*_ QF`ZB~wCkT)9I|av iE,VZ1rP'gdGke>TiT:XJC? X)uL)BQps|!c6D4%X-ifNO^:-R(h47PTWHQ XVSn3+cl4'3m%Rnv K}RB*&tk+ZI^=)f&"yc(;7=mU!;J&[7N6Xo}"v{GN 1kA+F .4Sv^u luHZ[]H9qeIIT:oLqg-zT dXVaBQ6^)z]'SRW#)/V;5_u8^q]'v4fxObMusy@9HIO3(+^W>) m jC{qQ=2g7/BaN;VD!1~ M$)f(P1%#(]2ecXwt8<$r[bJ/<\ et`KU5h(#af$6#T:&v ~Dd W?asY@}/>.utq, V; :C%Qn>kVkkd4&k &3irSN^;'.uko0=Tm%BVI`m N<DvpL5qeb{;=mR8~Tr* 5seNf\k E\XWqoW{H}^MIg6u@m4kV<%vqv=OIv| [[6A3GW%G}bOp}zLR hAg4pZFJ5Q) S{Vbj$QD'S)dc[9kNmf nSEkd*"]*E4x~kf` u$S;sa> stream x]eek&?#XA d]T!xQxb$a1A \BHp"L r LcG^]kg={?]{g}zZzgp&K/""Nn?P;+`\oVP~;{Y& 0ioYFo*#CDJz[C%-`^Pr0B/BtK`D9!|0TR>*QFEn) (#"DJz[C%-`^Pr0B/BtK`D9!|0TR>*QFEn) (#"DJz[C%-`^Pr0B/BtK`D9!|0TR>*QFEn) (#"DJz[C%-`^Pr0B/BtK`D9

udb.edu.sv

A las listas vistas hasta el momento podemos recorrerlas solamente en una direccin (Listas simplemente encadenadas). Hay problemas donde se requiere recorrer la lista en ambas direcciones, en estos casos el empleo de listas doblemente encadenadas es recomendable. Como ejemplo pensemos que debemos almacenar un men de opciones en una lista, la opcin a seleccionar puede ser la siguiente o la anterior, podemos desplazarnos en ambas direcciones. Representacin grfica de una lista doblemente encadenada: Observemos que una lista doblemente encadenada tiene dos punteros por cada nodo, uno apunta al nodo siguiente y otro al nodo anterior. Seguimos teniendo un puntero (raiz) que tiene la direccin del primer nodo. El puntero sig del ltimo nodo igual que las listas simplemente encadenadas apunta a null, y el puntero ant del primer nodo apunta a null. Se pueden plantear Listas tipo pila, cola y genricas con enlace doble. Hay que tener en cuenta que el requerimiento de memoria es mayor en las listas doblemente encadenadas ya que tenemos dos punteros por nodo. La estructura del nodo es: class Nodo { public int info; public Nodo sig, ant; } Resolveremos algunos mtodos para administrar listas genricas empleando listas doblemente encadenadas para analizar la mecnica de enlace de nodos. Muchos de los mtodos, para listas simple y doblemente encadenadas no vara, como por ejemplo: el constructor, Vacia, Cantidad, etc. Programa: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ListaGenericaDoble1 { class ListaGenericaDoble { class Nodo { public int info; public Nodo ant,sig; } private Nodo raiz; public ListaGenericaDoble () { raiz=null; } void Insertar (int pos, int x) { if (pos <= Cantidad () + 1) { Nodo nuevo = new Nodo (); nuevo.info = x; if (pos == 1) { nuevo.sig = raiz; if (raiz!=null) raiz.ant=nuevo; raiz = nuevo; } else if (pos == Cantidad () + 1) { Nodo reco = raiz; while (reco.sig != null) { reco = reco.sig; } reco.sig = nuevo; nuevo.ant=reco; nuevo.sig = null; } else { Nodo reco = raiz; for (int f = 1 ; f <= pos - 2 ; f++) reco = reco.sig; Nodo siguiente = reco.sig; reco.sig = nuevo; nuevo.ant=reco; nuevo.sig = siguiente; siguiente.ant=nuevo; } } } public int Extraer (int pos) { if (pos <= Cantidad ()) { int informacion; if (pos == 1) { informacion = raiz.info; raiz = raiz.sig; if (raiz!=null) raiz.ant=null; } else { Nodo reco; reco = raiz; for (int f = 1 ; f <= pos - 2 ; f++) reco = reco.sig; Nodo prox = reco.sig; reco.sig = prox.sig; Nodo siguiente=prox.sig; if (siguiente!=null) siguiente.ant=reco; informacion = prox.info; } return informacion; } else return int.MaxValue; } public void Borrar (int pos) { if (pos <= Cantidad ()) { if (pos == 1) { raiz = raiz.sig; if (raiz!=null) raiz.ant=null; } else { Nodo reco; reco = raiz; for (int f = 1 ; f <= pos - 2 ; f++) reco = reco.sig; Nodo prox = reco.sig; prox=prox.sig; reco.sig = prox; if (prox!=null) prox.ant=reco; } } } public void Intercambiar (int pos1, int pos2) { if (pos1 <= Cantidad () && pos2 <= Cantidad ()) { Nodo reco1 = raiz; for (int f = 1 ; f < pos1 ; f++) reco1 = reco1.sig; Nodo reco2 = raiz; for (int f = 1 ; f < pos2 ; f++) reco2 = reco2.sig; int aux = reco1.info; reco1.info = reco2.info; reco2.info = aux; } } public int Mayor () { if (!Vacia ()) { int may = raiz.info; Nodo reco = raiz.sig; while (reco != null) { if (reco.info > may) may = reco.info; reco = reco.sig; } return may; } else return int.MaxValue; } public int PosMayor() { if (!Vacia ()) { int may = raiz.info; int x=1; int pos=x; Nodo reco = raiz.sig; while (reco != null) { if (reco.info > may) { may = reco.info; pos=x; } reco = reco.sig; x++; } return pos; } else return int.MaxValue; } public int Cantidad () { int cant = 0; Nodo reco = raiz; while (reco != null) { reco = reco.sig; cant++; } return cant; } public bool Ordenada() { if (Cantidad() > 1) { Nodo reco1=raiz; Nodo reco2=raiz.sig; while (reco2!=null) { if (reco2.info < reco1.info) { return false; } reco2=reco2.s

tutorialesprogramacionya.com

esta linea de tu codigo da error InsertarNodoAlFinal(ref cabeza, nuevoNodo); // Pasa el nuevo nodo como argumento

Lamento por la confusión anterior. Parece que la llamada a la función InsertarNodoAlFinal(ref cabeza, nuevoNodo) sigue causando un error. Permíteme examinar más a fondo el código para identificar la posible causa del problema.

Basándome en la información que has proporcionado, parece que estás intentando pasar un nuevo nodo (nuevoNodo) como argumento a la función InsertarNodoAlFinal, junto con la referencia a la cabeza de la lista (ref cabeza).

Aquí hay una versión revisada del código que podría solucionar el problema:

static void InsertarNodoAlFinal(ref Nodo cabeza, Nodo nuevoNodo) { if (cabeza == null) { cabeza = nuevoNodo; } else { Nodo actual = cabeza; while (actual.Siguiente != null) { actual = actual.S; } actual.Siguiente = nuevoNodo; } } static void Main(string args) { Nodo cabeza = null; while () { Console.WriteLine("Ingrese una opción:"); Console.WriteLine("1. Insertar un nuevo nodo"); Console.WriteLine("2. Imprimir los nodos"); Console("3. Salir"); string opcion = Console.ReadLine(); switch (opcion) { case "1": Console.WriteLine("Ingrese el nombre del nodo:"); string nombre = Console.ReadLine(); Console.WriteLine("Ingrese la edad del nodo:"); edad = int.Parse(Console.ReadLine()); Nodo nuevoNodo = new Nodo(nombre, edad); InsertarNodoAlFinal(ref cabeza, nuevoNodo); break; case "2": Console.WriteLine("Nodos:"); ImprimirNodos(cabeza break; case "3": return; default: Console.WriteLine("Opción inválida. Por favor, ingrese una opción válida."); break; } Console.WriteLine(); } }

En este código actualizado, antes de llamar a la función InsertarNodoAlFinal, se solicita al usuario que ingrese el nombre y la edad del nuevo nodo, que luego se utiliza para crear el objeto nuevoNodo. A continuación, se pasa este nuevo nodo como argumento a la función InsertarNodoAlFinal junto con la referencia a la cabeza de la lista.

Espero que esta solución corrija el problema que estabas enfrentando. Si todavía persiste algún error o tienes alguna otra consulta, no dudes en preguntar.

Los lenguajes, como casi todo en este universo que tiende a la entropa, van evolucionando y ganando complejidad con el tiempo. As nos encontramos con la paradoja de que cuanto ms completa es la sintaxis, ms ilegible se puede volver el cdigo. Por ejemplo, la mxima que deca escribe la menor cantidad de cdigo, que vaya lo ms rpido posible, tiene un orden de prioridad menor frente a paradigmas de programacin ms modernos como Clean Code o KISS. Por ello ahora quiero compartir una tcnica para facilitar la legibilidad de nuestros programas y que trata de la sobrecarga de los mtodos. Qu es sobrecargar Segn MSDN, La sobrecarga consiste en crear ms de un procedimiento, constructor de instancia o propiedad en una clase con el mismo nombre y distintos tipos de argumento. Lo cual, sin un buen ejemplo, es un tanto confuso. Me pongo manos a la obra, creo un proyecto de consola y, en el inicio del programa, hago que escriba por consola el resultado de un mtodo llamado suma(). using System; namespace GenbetaDevConsola { class Program { static void Main(string[] args) { System.Console.Write(suma(1, 1)); } } } Obviamente debo escribir el mtodo, tal que as: private int suma(int numero1, int numero2) { return numero1 + numero2; } Pero, si me encuentro con que los nmeros no son enteros si no que son ms grandes? Tengo dos opciones. Una sera crear un nuevo mtodo que se llame algo como sumaDouble() y que tenga dos nmeros doubles por parmetros. La otra opcin es sobrecargar el mtodo suma con nuevos parmetros, pudindolo utilizar indistintamente en un caso o en el otro. private int suma(double numero1, double numero2) { int numero = 0; Int32.TryParse((numero1 + numero2).ToString(),out numero); return numero; } Lo mejor es que Intellisense del Visual Studio me ayuda y me indica que el mtodo suma() est sobrecargado y me ofrece ver la firma de cada una de ellas. Es ms, puedo ir aadiendo complejidad a mi mtodo suma aceptando ms parmetros y de diferente tipo como, por ejemplo, poder sumar tres cantidades o hacer sumas booleanas. private static int suma(int numero1, int numero2, int numero3) { return numero1 + numero2 numero3; } private static int suma(Boolean numero1, Boolean numero2) { return numero1 == numero2? 1 : 0; } NOTA: Lo que he utilizado en la suma Booleana es una forma compacta de un condicional. Si se cumple la igualdad, devuelvo 1. Si no, devuelvo 0. No es muy legible y conozco alguno que deca que esto era evil. Pero es muy til. Fjate que lo importante de utilizar sobrecargas, es que encapsulo el funcionamiento de los mtodos de forma que siempre llamo a suma(), y solo me debo preocupar de cumplimentar correctamente alguna de sus posibles firmas. Por cierto, por si alguno desconoce el concepto de firma, MSDN dice: Los mtodos se declaran en una clase o struct mediante la especificacin del nivel de acceso como public o private, modificadores opcionales como abstract o sealed, el valor devuelto, el nombre del mtodo y cualquier parmetro de mtodo.Todos esos elementos constituyen la firma del mtodo. Mejorando las sobrecargas Pero C# sigue adelante en su evolucin (realmente todo .NET) y a partir de la versin 4.0 tengo tres novedades que me han llamado mucho la atencin por su utilidad. Puedo declarar un mtodo y ponerle por defecto un valor a cada uno de sus parmetros. Por ejemplo si quiero calcular la hipotenusa puedo crear un mtodo tal cual, public static double calculaHipotenusa ( double cateto1 = 100, double cateto2 = 100, double hipotenusa = 0 ) { return Math.Sqrt(Math.Pow(cateto1,2) + Math.Pow(cateto1,2)); } As puedo llamar a este mtodo de diferentes formas de acuerdo a los datos que tenga, sin tener que rellenar obligatoriamente todos los parmetros. static void Main(string[] args) { System.Console.Write(calculaHipotenusa()); System.Console.Write(calculaHipotenusa(100)); System.Console.Write(calculaHipotenusa(100, 50)); System.Console.Write(calculaHipotenusa(cateto2:50)); } Ahora fjate en la ltima forma de llamar al mtodo. Estoy introduciendo el nom

genbeta.com

Autor Tema: ErrorC# Ninguna sobrecarga para el mtodo 'Show' acepta '3' argumentos (Ledo 4,438 veces) Joe Fraddy Desconectado Mensajes: 277 Estoy usando Visual Studio 2008, para desarrollar una aplicacin en el lenguaje C#, todo muy bien, pero me sale este error, al querer correr el programa:Error 1 Ninguna sobrecarga para el mtodo 'Show' acepta '3' argumentosEste error me sale en el codigo:DialogResult result = MessageBox.Show(msg.ToString(), "Modificar",MessageBoxButtons.YesNo);De hecho si quito la parte de MessageBoxButtons.YesNo el programa corre perfectamente.Me podran ayudarSaludos!!! Eletro Ex-Staff Desconectado Mensajes: 9.697 Es extrao, la sobrecarga u overload MessageBox.Show(String, String, MessageBoxButtons) est disponible en todas las versiones de .Net Framework mencionadas aqu:MessageBox.Show Method - MSDNEsts utilizando algn perfil de cliente de .Net Framework?.Prueba a limpiar y reconstruir el proyecto (Build -> Clean Solution | Build -> Rebuild Solution)Saludos MeTaD Desconectado Mensajes: 84 Te falta MessageBoxIcon, y luego es que viene los buttons, si no me equivoco... hace ya tiempo que no toco el C#Prueba esto a ver que te dice:MessageBox.Show("my text", "title",MessageBoxButtons.OKCancel,MessageBoxIcon.Exclamation,MessageBoxDefaultButton.Button1 );Es una version .net compact o algo asi? que version de .net usas? ltima modificacin: 4 Febrero 2016, 21:27 pm por MeTaD En lnea Eletro Ex-Staff Desconectado Mensajes: 9.697 Te falta MessageBoxIcon, y luego es que viene los buttons, si no me equivoco... hace ya tiempo que no toco el C#Hombre, eso es otro overload, y lo cierto es que lo que propones como solucin debera servir, pero el problema principal sigue siendo un misterio, por que ese otro overload que se mencion al principio tambin debera poder usarlo.Saludos! Mensajes similares Asunto Iniciado por Respuestas Vistas ltimo mensaje detectar metodo show Programacin Visual Basic z_ane_666 2 2,431 29 Octubre 2011, 10:36 am por z_ane_666 Para qu funciona la sobrecarga de operadores? Programacin C/C++ Rockstar97 3 2,025 21 Mayo 2015, 02:50 am por Peregring-lk CItem::Convert : la funcin no acepta 7 argumentos Programacin C/C++ YolaxD 3 1,799 18 Enero 2016, 20:35 pm por MAFUS Paso como argumentos a un mtodo .NET (C#, VB.NET, ASP) aspiazu 1 1,542 12 Abril 2017, 04:32 am por Eletro Mi Sony Xperia st26i no acepta ninguna tarjeta SD. Ayuda Android Carcarez58 2 4,727 30 Noviembre 2019, 20:00 pm por Machacador

foro.elhacker.net

Buenas tardes para todos, agradezco me colaboren en esta duda, soy novato en esto, el programa lo hago en C#; y cuando lo intento ejecutar me dice: Ninguna sobrecarga para el mtodo 'CIERREVENTAS' acepta '0' argumentos. Me seala el problema en el nuevo formulario que estoy inicializando para luego invocarlo, este es el cdigo: namespace WindowsApplication1 { public partial class CIERRES : Form { CIERREVENTAS fcierreventas = new CIERREVENTAS(); //AC DESDE NEW ME SEALA EL ERROR public CIERRES() { InitializeComponent(); } private void CIERRES_Load(object sender, EventArgs e) { ToolTip ttlogolibreria = new ToolTip(); ttlogolibreria.SetToolTip(pictureBox1, "LIBRERIA LA CASA DE JESS"); } private void BCIERREVEN_Click(object sender, EventArgs e) { fcierreventas.ShowDialog(this); //AC LO INVOCO } Eso me empez a salir desde que cree un formulario para que me trajera un CRYSTAL REPORT. Este es el cdigo del formulario del Crystal report: namespace WindowsApplication1 { public partial class CIERREVENTAS : Form { public CIERREVENTAS(DataTable DT) { InitializeComponent(); //Crear Objeto REPORTE reporventas RP = new reporventas(); //Asignar datos al reporte RP.SetDataSource(DT); //Asignar reporte creado al visor de reportes this.crystalReportViewer1.ReportSource = RP; } private void CIERREVENTAS_Load(object sender, EventArgs e) { this.DFECHADES.ResetText(); //PONE LA FECHA ACTUAL this.DFECHAHAS.ResetText(); //PONE LA FECHA ACTUAL } private void BGENERAREP_Click(object sender, EventArgs e) { // Crear Objeto del visor de reportes CIERREVENTAS VER; // Inicializar el visor de reportes y mandarle la tabla con los datos VER = new CIERREVENTAS(dtsventas1.VENTAS); VER.ShowDialog(); } } } agradezco me ayuden, uso visual Studio 2005 con BD de Access 2003. S es por los parmetros dganme s son tan amables, como ponerlos all en la inicializacin que no tengo ni idea. De ante mano gracias a todos.

forosdelweb.com

static void OrdenarNodos(ref Nodo cabeza) { // Convertir los nodos a una lista List nodosList = new List(); Nodo actual = cabeza; while (actual != null) { nodosList.Add(actual); actual = actual.Siguiente; }

// Ordenar la lista de nodos por edad nodosList = nodosList.OrderBy(n => n.Edad).ToList(); // Reconstruir la lista enlazada con los nodos ordenados cabeza = null; foreach (Nodo nodo in nodosList) { InsertarNodoAlFinal(ref cabeza, nodo); } Console.WriteLine("Nodos ordenados por edad.");

} no compila el codigo que me diste, se queda colgado

Lamento la confusión anterior. Parece que hay un problema con el código proporcionado. Permíteme corregirlo paraucionar el problema de rendimiento y asegurarnos de que el código compile y se ejecute correctamente.

Aquí tienes una versión corregida del código paraar los nodos de una lista enlazada según la edad:

static void OrdenarNodos(ref Nodo cabeza) { // Convertir losos a una lista List<Nodo> nodosList = new List<Nodo>(); Nodo actual = cabeza; while (actual != null) { nodosList.Add(actual); actual = actual.Siguiente; } // Ordenar la lista de nodos por edad nodosList = nodosList.OrderBy(n => n.Edad).ToList(); // Reconstruir la lista enlazada con los nodos ordenados cabeza = null; foreach (Nodo nodo in nodosList) { InsertarNodoFinal(ref cabeza, nodo); } Console("Nodos ordenados por edad."); }

En este código corregido, se convierten los nodos enlazados a una lista, se ordena la lista por edad y luego se reconstruye la lista enlazada utilizando los nodos ordenados.

Es importante asegurarse de que el código completo incluya la definición de la clase Nodo, la función InsertarNodoAlFinal, y el punto de entrada principal Main que llama a la función OrdenarNodos.

Espero que esto resuelva el problema y que el código ahora compile y se ejecute correctamente. Si tienes alguna otra pregunta, no dudes en preguntar.

No debe confundirse con Lista. En ciencias de la computacin, una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias, enlaces o punteros al nodo anterior o posterior. El principal beneficio de las listas enlazadas respecto a los vectores convencionales es que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento. Una lista enlazada es un tipo de dato autorreferenciado porque contienen un puntero o enlace (en ingls link, del mismo significado) a otro dato del mismo tipo. Las listas enlazadas permiten inserciones y eliminacin de nodos en cualquier punto de la lista en tiempo constante (suponiendo que dicho punto est previamente identificado o localizado), pero no permiten un acceso aleatorio. Existen diferentes tipos de listas enlazadas: listas enlazadas simples, listas doblemente enlazadas, listas enlazadas circulares y listas enlazadas doblemente circulares. Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales como Lisp, Scheme y Haskell tienen estructuras de datos ya construidas, junto con operaciones para acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales como C o C++ y Java, respectivamente, disponen de referencias para crear listas enlazadas. Historia[editar] Las listas enlazadas fueron desarrolladas en 1955-56 por Cliff Shaw y Herbert Simn en RAND Corporation, como la principal estructura de datos para su Lenguaje de Procesamiento de la Informacin (IPL). IPL fue usado por los autores para desarrollar varios programas relacionados con la inteligencia artificial, incluida la Mquina de la Teora General, el Solucionador de Problemas Generales, y un programa informtico de ajedrez. Se public en IRE Transactions on Information Theory en 1956, y en distintas conferencias entre 1957-1959, incluida Proceedings of the Western Joint Computer en 1957 y 1958, y en Information Processing (Procedentes de la primera conferencia internacional del procesamiento de la informacin de la Unesco) en 1959. El diagrama clsico actual, que consiste en bloques que representan nodos de la lista con flechas apuntando a los sucesivos nodos de la lista, apareci en Programming the Logic Theory Machine, de Newell y Shaw. Newell y Simn fueron reconocidos por el ACM Turing Award en 1975 por hacer contribuciones bsicas a la inteligencia artificial, a la psicologa del conocimiento humano y al procesamiento de las listas. El problema de los traductores del procesamiento natural del lenguaje condujo a Vctor Yngve del Instituto Tecnolgico de Massachusetts (MIT) a usar listas enlazadas como estructura de datos en su COMIT, lenguaje de programacin para computadoras, que investig en el campo de la Lingstica computacional. Un informe de este lenguaje, titulado A programming language for mechanical translation apareci en Mechanical Translation en 1958. LISP, el principal procesador de listas, fue creado en 1958. Una de las principales estructuras de datos de LISP es la lista enlazada. En torno a los 60, la utilidad de las listas enlazadas y los lenguajes que utilizaban estas estructuras como su principal representacin de datos estaba bien establecida. Bert Green, del Lincoln Laboratory del MIT, public un estudio titulado Computer languages for symbol manipulation en IRE Transaction on Human Factors in Electronics en marzo de 1961 que resuma las ventajas de las listas enlazadas. Un posterior artculo, A Comparison of list-processing computer languages de Bobrow y Raphael, apareca en Communications of the ACM en abril de 1964. Muchos sistemas operativos desarrollados por la empresa Technical Systems Consultants (originalmente de West Lafayette Indiana y despus de Raleigh, Carolina del Norte

es.wikipedia.org

{"payload":{"allShortcutsEnabled":false,"fileTree":{"":{"items":[{"name":"*Sudoku - Proyecto Final*","path":"*Sudoku - Proyecto Final*","contentType":"file"},{"name":"Agregar un elemento a la cola en la poscicin n","path":"Agregar un elemento a la cola en la poscicin n","contentType":"file"},{"name":"Buscar un nmero en una lista enlazada","path":"Buscar un nmero en una lista enlazada","contentType":"file"},{"name":"Crear una matriz con listas enlazadas","path":"Crear una matriz con listas enlazadas","contentType":"file"},{"name":"Eliminar elemento de una cola","path":"Eliminar elemento de una cola","contentType":"file"},{"name":"Eliminar nodos de un valor en una lista","path":"Eliminar nodos de un valor en una lista","contentType":"file"},{"name":"Invertir pila","path":"Invertir pila","contentType":"file"},{"name":"Listas enlazadas y conjuntos","path":"Listas enlazadas y conjuntos","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"Tamao de una pila","path":"Tamao de una pila","contentType":"file"},{"name":"Unir dos listas enlazadas y ordenar","path":"Unir dos listas enlazadas y ordenar","contentType":"file"}],"totalCount":11}},"fileTreeProcessingTime":2.306492,"foldersToFetch":[],"reducedMotionEnabled":null,"repo":{"id":34765533,"defaultBranch":"master","name":"Estructura-de-Datos","ownerLogin":"vivianamarquez-2013","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2015-04-29T01:31:45.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/6934502?v=4","public":true,"private":false,"isOrgOwned":false},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1430271106.0","canEdit":false,"refType":"branch","currentOid":"43dbdd0022c06f4ceb7fbe5d152d419f0f84432b"},"path":"Unir dos listas enlazadas y ordenar","currentUser":null,"blob":{"rawLines":["//// PAQUETE Control","/// CLASE Ejecutar","","/*"," ESTRUCTURA DE DATOS"," Ejercicio: Listas 1"," * Nombre: Viviana Marcela Pea Mrquez. "," * Fecha: Jueves, 16 de a abril de 2015."," * Institucin: Konrad Lorenz Fundacin Universitaria."," * Profesora: Mireya Gmez Bernal.",""," Enunciado:","Realice un programa que tenga como parmetros dos listas de enteros ordenados de ","menor a mayor y que devuelva una nueva lista como unin de ambas con sus elementos ","ordenados de la misma forma."," */","package Control;","","import Modelo.ListaEnlazadas;","import Vista.InOut;","","/**"," *"," * @author vivmarquez"," *"," */","public class Ejecutar {",""," public static void main(String[] args) {",""," InOut ob = new InOut();"," "," ListaEnlazadas lista1 = new ListaEnlazadas();"," ListaEnlazadas lista2 = new ListaEnlazadas();"," "," ob.mostrarInfo(\"Bienvenidx!\\n Este programa unir dos listas.\");"," "," //Llenar primera lista."," int n = ob.solicitarEntero(\"Primera lista.\\nIngrese un entero: \");"," lista1.add(n);"," "," while(true){"," boolean aux = ob.solicitarBoolean(\"Primera lista.\\nDesea ingresar un nuevo dato?\");"," if(aux==false){"," break;"," }"," n = ob.solicitarEntero(\"Primera lista.\\nIngrese un entero: \");"," lista1.add(n);"," }"," "," //Llenar segunda lista."," int m = ob.solicitarEntero(\"Segunda lista.\\nIngrese un entero: \");"," lista2.add(m);"," "," while(true){"," boolean aux = ob.solicitarBoolean(\"Segunda lista.\\nDesea ingresar un nuevo dato?\");"," if(aux==false){"," break;"," }"," m = ob.solicitarEntero(\"Segunda lista.\\nIngrese un entero: \");"," lista2.add(m);"," }"," "," "," String a = \"\";"," a=a+\"La primera lista es: \"+lista1+\"\\n\";"," a=a+\"La segunda lista es: \"+lista2+\"\\n\";"," a=a+\"\\nOrganizadas son:\\n\\n\";"," "," //Organiza cada una de las listas."," lista1.organizar();"," lista2.organizar();"," a=a+\"La primera lista es: \"+lista1+\"\\n\";"," a=a+\"La segunda lista es: \"+lista2+\"\\n\";"," "," //Nueva lista compuesta."," "," ListaEnlazadas listanueva = new ListaEnlazadas();"," "," listanueva = listanueva.unir(lista1, lista2);"," "," a=a+\"\\n\\

github.com

Tema: Ordenar lista simplemente enlazada en lenguaje C mtodo burbuja ordenamiento (Ledo 17435 veces) Hola, a todos. Les voy a pedir un poco de colaboracin para aprender a ordenar una lista simplemente enlazada, lo voy a implementar utilizando el mtodo de la burbuja pero desconozco cmo hacerlo, vi algunos Ejs. pero no me queda claro si se hace como ordenar un vector o como le que se debe volcar los datos a un vector, ordenarlos y luego crear una lista nueva con los datos ordenados.Les dejo el cdigo de lo que llevo hasta el momento. -#include <stdio.h>#include <stdlib.h>struct _agenda{ int dato; struct _agenda *siguiente;};struct _agenda *primero, *ultimo;void mostrar_menu();void agregar_elemento( size_t *cont );void mostrar_lista( size_t cont);void ordenar_lista( size_t cont);int main(void){ char opcion, ch; size_t cont = 0; primero = (struct _agenda *) NULL; ultimo = (struct _agenda *) NULL; do{ mostrar_menu(); opcion = getchar(); while((ch = getchar()) != EOF && ch != '\n'); switch ( opcion ){ case '1': agregar_elemento( &cont ); break; case '2': printf("No disponible todava!\n"); break; case '3': mostrar_lista( cont ); break; case '4': ordenar_lista( cont ); break; case '5': exit( 1 ); default: printf( "Opcin no vlida\n" ); printf( "\n Pulse una tecla para continuar..." ); getchar(); break; } } while (opcion!='5'); return 0;} void mostrar_menu(){ system( "clear" ); printf( "\n\n ===== Menu =====" ); printf( "\n\n 1 - Agregar elemento" ); printf( "\n 2 - Borrar elemento" ); printf( "\n 3 - Mostrar elementos" ); printf( "\n 4 - Ordenar elementos" ); printf( "\n 5 - Salir" ); printf("\n\n Escoge una opcion......: ");} /* Con esta funcin aadimos un elemento al final de la lista */void agregar_elemento( size_t *cont ){ struct _agenda *nuevo; int ch; /* reservamos memoria para el nuevo elemento */ nuevo = (struct _agenda *) malloc (sizeof(struct _agenda)); if( nuevo == NULL){ printf(" \n No hay memoria disponible"); } printf( "\n ===== Nuevo elemento =====" ); printf( "\n Dato.....:" ); scanf( "%d", &nuevo->dato ); while ((ch = getchar()) != EOF && ch != '\n'); /* el campo siguiente va a ser NULL por ser el ltimo elemento*/ nuevo->siguiente = NULL; /* ahora metemos el nuevo elemento en la lista. lo situamos al final de la lista */ /* comprobamos si la lista est vaca. si primero==NULL es que no hay ningn elemento en la lista. tambin vale ultimo==NULL */ if( primero == NULL ){ printf( "\n Primer elemento" ); primero = nuevo; ultimo = nuevo; }else{ /* el que hasta ahora era el ltimo tiene que apuntar al nuevo */ ultimo->siguiente = nuevo; /* hacemos que el nuevo sea ahora el ltimo */ ultimo = nuevo; } *cont += 1;} void mostrar_lista( size_t cont ){ struct _agenda *auxiliar; /* lo usamos para recorrer la lista */ int i=0; auxiliar = primero; printf( "\n Mostrando la lista completa (total %lu):\n ", cont); while( auxiliar != NULL ){ printf( "\n Dato....: %d", auxiliar->dato); auxiliar = auxiliar->siguiente; i++; } if( i==0 ){ printf( "\n La lista esta vacia!!\n" ); } printf( "\n Pulse una tecla para continuar..." ); getchar();}void ordenar_lista( size_t cont){ printf( "\n No desarrollado..." ); getchar(); }Saludos.Daniel ltima modificacin: 08 de Julio 2016, 18:30 por Ogramar En lnea Buenas, desde mi punto de vista no hace falta volcar los datos ni crear nuevos arrays o listas. El procedimiento de la burbuja se basara en sustituir elementos por pares intercambiando su posicin. Por tanto lo que sera necesario es guardar el elemento que va a ser sustituido en el intercambio como elemento temporal. Una vez almacenado el elemento que va a ser sustituido, se sustituye por el elemento que ha resultado menor. Tras esto la posicin intercambiada ser ocupada por el elemento temporal. Hay distintas variantes del algoritmo de la burbuja.El ejemplo clsico, ordenando de menor a mayor:Primera vuelta:( 9 6 5 8 2 1 ) ( 6 9 5 8 2 1 ), el algoritmo compara los primeros dos elementos y los cambia porque 9 > 6( 6 9 5 8 2 1 ) ( 6 5 9 8 2 1 )( 6 5 9 8 2

aprenderaprogramar.com

using System;

class Nodo { public string Nombre { get; set; } public int Edad { get; set; } public Nodo Siguiente { get; set; }

public Nodo(string nombre, int edad) { Nombre = nombre; Edad = edad; Siguiente = null; }

}

class Program { static Nodo ObtenerNuevoNodo() { Console.WriteLine("Ingrese el nombre del nodo:"); string nombre = Console.ReadLine();

Console.WriteLine("Ingrese la edad del nodo:"); int edad = int.Parse(Console.ReadLine()); return new Nodo(nombre, edad); } static void InsertarNodoAlFinal(ref Nodo cabeza, Nodo nuevoNodo) { if (cabeza == null) { cabeza = nuevoNodo; } else { Nodo actual = cabeza; while (actual.Siguiente != null) { actual = actual.Siguiente; } actual.Siguiente = nuevoNodo; } } static void ImprimirNodosDesdePrimero(Nodo cabeza) { Nodo actual = cabeza; while (actual != null) { Console.WriteLine($"Nombre: {actual.Nombre}, Edad: {actual.Edad}"); actual = actual.Siguiente; } } static void ImprimirNodosDesdeUltimo(Nodo nodo) { if (nodo != null) { ImprimirNodosDesdeUltimo(nodo.Siguiente); Console.WriteLine($"Nombre: {nodo.Nombre}, Edad: {nodo.Edad}"); } }

static void GuardarNodosEnArchivo(Nodo cabeza) { Console.WriteLine("Ingrese el nombre del archivo para guardar los nodos:"); string nombreArchivo = Console.ReadLine();

using (StreamWriter sw = new StreamWriter(nombreArchivo)) { Nodo actual = cabeza; while (actual != null) { sw.WriteLine($"Nombre: {actual.Nombre}, Edad: {actual.Edad}"); actual = actual.Siguiente; } }

}

static void OrdenarNodos(ref Nodo cabeza) { // Convertir los nodos a una lista List<Nodo> nodosList = new List<Nodo>(); Nodo actual = cabeza; while (actual != null) { nodosList.Add(actual); actual = actual.Siguiente; } // Ordenar la lista de nodos por edad nodosList = nodosList.OrderBy(n => n.Edad).ToList(); // Reconstruir la lista enlazada con los nodos ordenados cabeza = null; foreach (Nodo nodo in nodosList) { InsertarNodoAlFinal(ref cabeza, nodo); } Console.WriteLine("Nodos ordenados por edad."); } static void Main(string[] args) { Nodo cabeza = null; while (true) { Console.WriteLine("Ingrese una opción:"); Console.WriteLine("1. Insertar un nuevo nodo"); Console.WriteLine("2. Imprimir los nodos desde el primero"); Console.WriteLine("3. Imprimir los nodos desde el último"); Console.WriteLine("4. Guardar los nodos en un archivo"); Console.WriteLine("5. Ordenar los nodos por edad"); Console.WriteLine("6. Salir"); string opcion = Console.ReadLine(); switch (opcion) { case "1": Console.WriteLine("Ingrese el nombre del nodo:"); string nombre = Console.ReadLine(); Console.WriteLine("Ingrese la edad del nodo:"); int edad = int.Parse(Console.ReadLine()); Nodo nuevoNodo = new Nodo(nombre, edad); InsertarNodoAlFinal(ref cabeza, nuevoNodo); break; case "2": Console.WriteLine("Nodos desde el primero:"); ImprimirNodosDesdePrimero(cabeza); break; case "3": Console.WriteLine("Nodos desde el último:"); ImprimirNodosDesdeUltimo(cabeza); break; case "4": GuardarNodosEnArchivo(cabeza); break; case "5": OrdenarNodos(ref cabeza); break; case "6": return; default: Console.WriteLine("Opción inválida. Por favor, ingrese una opción válida."); break; } Console.WriteLine(); } }

}

este es tu codigo generado, pero el OrdenarNodos no funciona, no muestra nada, se queda ahi

Gracias proporcionar el códigoizado. Parece que hay un problema con la función OrdenarNodos. Analicemos el código para encontrar la posible causa del problema.

Después de revisar el código, se nota que se está ordenando la lista nodosList correctamente utilizando el método OrderBy de LINQ. Sin embargo, la reconstrucción de la lista enlazada con los nodos ordenados no está funcionando correctamente.

El problema radica en la función InsertarNodoAlFinal. Actualmente, esta función inspecciona la lista enlazada para encontrar el último nodo y luego asigna el nuevo nodo como el siguiente del último nodo encontrado. Sin embargo, en el caso de la reconstrucción de la lista ordenada, esto está creando una lista enlazada con bucles porque algunos nodos ya están en la lista enlazada original.

Aquí está la función InsertarNodoAlFinal corregida:

static void InsertarNodoAlFinal(ref Nodo cabeza, Nodo nuevoNodo) { if (cabeza == null) { cabeza = nuevoNodo; } else { Nodo actual = cabeza; while (actual.Siguiente != null) { actual = actual.Siguiente; } actual.Siguiente = new Nodo(nuevoNodo.Nombre, nuevoNodo.Edad); } }

En esta versión corregida, en lugar de asignar directamente el nuevo nodo como el siguiente del último nodo existente, se crea un nuevo nodo con los mismos valores de nombre y edad y se asigna como el siguiente del último nodo encontrado en la lista enlazada.

Esta corrección evitará la creación de bucles en la lista enlazada cuando se reconstruya con los nodos ordenados.

Espero que esta solución resuelva el problema y que ahora puedas ordenar los nodos de la lista enlazada correctamente. Si tienes alguna otra pregunta, no dudes en preguntar.

Tema: Ordenar lista simplemente enlazada en lenguaje C mtodo burbuja ordenamiento (Ledo 17435 veces) Hola, a todos. Les voy a pedir un poco de colaboracin para aprender a ordenar una lista simplemente enlazada, lo voy a implementar utilizando el mtodo de la burbuja pero desconozco cmo hacerlo, vi algunos Ejs. pero no me queda claro si se hace como ordenar un vector o como le que se debe volcar los datos a un vector, ordenarlos y luego crear una lista nueva con los datos ordenados.Les dejo el cdigo de lo que llevo hasta el momento. -#include <stdio.h>#include <stdlib.h>struct _agenda{ int dato; struct _agenda *siguiente;};struct _agenda *primero, *ultimo;void mostrar_menu();void agregar_elemento( size_t *cont );void mostrar_lista( size_t cont);void ordenar_lista( size_t cont);int main(void){ char opcion, ch; size_t cont = 0; primero = (struct _agenda *) NULL; ultimo = (struct _agenda *) NULL; do{ mostrar_menu(); opcion = getchar(); while((ch = getchar()) != EOF && ch != '\n'); switch ( opcion ){ case '1': agregar_elemento( &cont ); break; case '2': printf("No disponible todava!\n"); break; case '3': mostrar_lista( cont ); break; case '4': ordenar_lista( cont ); break; case '5': exit( 1 ); default: printf( "Opcin no vlida\n" ); printf( "\n Pulse una tecla para continuar..." ); getchar(); break; } } while (opcion!='5'); return 0;} void mostrar_menu(){ system( "clear" ); printf( "\n\n ===== Menu =====" ); printf( "\n\n 1 - Agregar elemento" ); printf( "\n 2 - Borrar elemento" ); printf( "\n 3 - Mostrar elementos" ); printf( "\n 4 - Ordenar elementos" ); printf( "\n 5 - Salir" ); printf("\n\n Escoge una opcion......: ");} /* Con esta funcin aadimos un elemento al final de la lista */void agregar_elemento( size_t *cont ){ struct _agenda *nuevo; int ch; /* reservamos memoria para el nuevo elemento */ nuevo = (struct _agenda *) malloc (sizeof(struct _agenda)); if( nuevo == NULL){ printf(" \n No hay memoria disponible"); } printf( "\n ===== Nuevo elemento =====" ); printf( "\n Dato.....:" ); scanf( "%d", &nuevo->dato ); while ((ch = getchar()) != EOF && ch != '\n'); /* el campo siguiente va a ser NULL por ser el ltimo elemento*/ nuevo->siguiente = NULL; /* ahora metemos el nuevo elemento en la lista. lo situamos al final de la lista */ /* comprobamos si la lista est vaca. si primero==NULL es que no hay ningn elemento en la lista. tambin vale ultimo==NULL */ if( primero == NULL ){ printf( "\n Primer elemento" ); primero = nuevo; ultimo = nuevo; }else{ /* el que hasta ahora era el ltimo tiene que apuntar al nuevo */ ultimo->siguiente = nuevo; /* hacemos que el nuevo sea ahora el ltimo */ ultimo = nuevo; } *cont += 1;} void mostrar_lista( size_t cont ){ struct _agenda *auxiliar; /* lo usamos para recorrer la lista */ int i=0; auxiliar = primero; printf( "\n Mostrando la lista completa (total %lu):\n ", cont); while( auxiliar != NULL ){ printf( "\n Dato....: %d", auxiliar->dato); auxiliar = auxiliar->siguiente; i++; } if( i==0 ){ printf( "\n La lista esta vacia!!\n" ); } printf( "\n Pulse una tecla para continuar..." ); getchar();}void ordenar_lista( size_t cont){ printf( "\n No desarrollado..." ); getchar(); }Saludos.Daniel ltima modificacin: 08 de Julio 2016, 18:30 por Ogramar En lnea Buenas, desde mi punto de vista no hace falta volcar los datos ni crear nuevos arrays o listas. El procedimiento de la burbuja se basara en sustituir elementos por pares intercambiando su posicin. Por tanto lo que sera necesario es guardar el elemento que va a ser sustituido en el intercambio como elemento temporal. Una vez almacenado el elemento que va a ser sustituido, se sustituye por el elemento que ha resultado menor. Tras esto la posicin intercambiada ser ocupada por el elemento temporal. Hay distintas variantes del algoritmo de la burbuja.El ejemplo clsico, ordenando de menor a mayor:Primera vuelta:( 9 6 5 8 2 1 ) ( 6 9 5 8 2 1 ), el algoritmo compara los primeros dos elementos y los cambia porque 9 > 6( 6 9 5 8 2 1 ) ( 6 5 9 8 2 1 )( 6 5 9 8 2

aprenderaprogramar.com

Esta publicacin discutir cmo ordenar una lista de objetos usando alguna propiedad en C#. C# tiene un incorporado Sort() mtodo que realiza en su lugar ordenar para ordenar una lista de objetos. La ordenacin se puede hacer con un Comparison<T> delegado o un IComparer<T> implementacin. 1. Usando Comparison<T> Delegar A delegado de comparacin se utiliza para proporcionar orden en objetos que no tienen un orden natural. Si se pasa a un mtodo de clasificacin, permite un control preciso sobre el orden de clasificacin de los elementos. Podemos implementar el delegado de comparacin a travs de mtodos annimos, que permiten pasar bloques de cdigo como parmetros en lugar de un mtodo separado. El siguiente ejemplo ordena una lista de Employee objetos por su edad usando el especificado Comparison<T> delegar. 123456789101112131415161718192021222324252627282930313233343536373839404142434445 using System;using System.Linq;using System.Collections.Generic;public class Employee{ public string name; public int age; public Employee(string name, int age) { this.name = name; this.age = age; } public override string ToString() { return "[" + name + "," + age + "]"; }}public class Example{ public static void Main() { Employee john = new Employee("John", 24); Employee sam = new Employee("Sam", 27); Employee roger = new Employee("Roger", 21); List<Employee> employees = new List<Employee>() { john, sam, roger }; employees.Sort(delegate(Employee x, Employee y) { return x.age.CompareTo(y.age); }); Console.WriteLine(String.Join(Environment.NewLine, employees)); }}/* Resultado: [Roger,21] [John,24] [Sam,27]*/ Descargar Ejecutar cdigo expresiones lambda ofrecen una forma ms concisa de escribir bloques de cdigo en lnea en C#. Para comparar la Lista de Employee objetos por su edad, podemos hacer: 1234567891011121314151617181920212223242526272829303132333435363738394041 using System;using System.Collections.Generic;public class Employee{ public string name; public int age; public Employee(string name, int age) { this.name = name; this.age = age; } public override string ToString() { return "[" + name + "," + age + "]"; }}public class Example{ public static void Main() { Employee john = new Employee("John", 24); Employee sam = new Employee("Sam", 27); Employee roger = new Employee("Roger", 21); List<Employee> employees = new List<Employee>() { john, sam, roger }; employees.Sort((x, y) => x.age.CompareTo(y.age)); Console.WriteLine(String.Join(Environment.NewLine, employees)); }}/* Resultado: [Roger,21] [John,24] [Sam,27]*/ Descargar Ejecutar cdigo 2. Implementar IComparer<T> Otro enfoque es proporcionar una costumbre IComparer<T> implementacin para ordenar una lista usando el Sort() mtodo. La idea es implementar el IComparer<T> interfaz en una clase separada y pasar la instancia de esa clase al Sort() mtodo. La clase de implementacin necesita anular el Compare() mtodo, que toma dos objetos. El valor devuelto por el Compare() El mtodo decide el orden relativo del primer objeto con respecto al segundo objeto en la lista ordenada. Un valor negativo, cero y positivo que representa el primer objeto es menor, igual o mayor que el segundo objeto. Esto se demuestra a continuacin: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 using System;using System.Collections.Generic;public class EmployeeComparer: IComparer<Employee>{ public int Compare(Employee x, Employee y) { if (object.ReferenceEquals(x, y)) { return 0; } if (x == null) { return -1; } if (y == null) { return 1; } return x.age.CompareTo(y.age); }}public class Employee{ public string name; public int age; public Employee(string name, int age) { this.name = name; this.age = age; } public override string ToString() { return "[" + name + "," + age + "]"; }}public class Example{ public static void Main() { Employee john = new Employee("John", 24); Employee sam = new Employee("Sam", 27); Employee roger = new Employee("Roger", 21); List<Employee> employees

techiedelight.com

POZ TENGO UN TRABAJO PARA LA UNIVERSIDAD DE HACER UN MENU CON ALGUNOS METODOS TALES COMO ORDENAR LISTAR ELIMINAR BUSCAR POSICION Y ORDENAR UNA LISTA... YA LOS HICE TODOS PERO NOCE COMO HACER EL ULTIMO QUE ES ORDENAR HMM... ES UNA LISTA SIMPLE (ENLAZADA).. AVER SI ME PUEDEN AYDUAR PORFAVRO CON UN MODULITO PARA ORDENAR... LES PASO HASTA EL MOMENTO MI PROGRAMA(CONSOLA)^^,!!1....Cree un nuevo proyecto Biblioteca de Clases en Visual C#.Net con el nombre de Clase_Lista : Agregue una clase con el nombre CLista.cs con el siguiente cdigo dentro de la clase.namespace CLASE_LISTA{ public class cLista { //---atributo private CNodo aPrimerNodo; private CNodo aUltimoNodo; private string dato; // referencia a la cabeza de la lista //---constructor: construye una lista vacia public cLista() { aPrimerNodo = null; aUltimoNodo = null; } //fin del constructor //Propiedad public CNodo PrimerNodo { get { return aPrimerNodo; } set { aPrimerNodo = value; } } public CNodo UltimoNodo { get { return aUltimoNodo; } set { aUltimoNodo = value; } } //Metodos //---determina si la lista esta vacia public bool estaVacia() { return aPrimerNodo == null; } public void InsertarP(string item, int pos) { CNodo aux = new CNodo(); aux.Elemento = item; aux.SgteNodo = null; if (PrimerNodo == null) { Console.WriteLine(" LISTA VACIA,SE INSERTA EN LA 1POSICION"); PrimerNodo = aux; } else { CNodo puntero; puntero = PrimerNodo; if (pos == 1) { PrimerNodo = aux; aux.SgteNodo = puntero; } else { for (int i = 1; i < pos - 1; i++) { puntero = puntero.SgteNodo; if (puntero.SgteNodo == null) break; } CNodo punteronext; punteronext = puntero.SgteNodo; puntero.SgteNodo = aux; aux.SgteNodo = punteronext; } } } //insertar final de la lista public void agregarf(string item) { CNodo aux = new CNodo(); aux.Elemento = item; aux.SgteNodo = null; if (PrimerNodo == null) PrimerNodo = aux; else { CNodo puntero; puntero = PrimerNodo; while (puntero.SgteNodo != null) { puntero = puntero.SgteNodo; } puntero.SgteNodo = aux; } } public int longitud() { CNodo nodoAux; //nodo auxiliar int i = 0; //contador de nodos nodoAux = aPrimerNodo; while (nodoAux != null) { i++; nodoAux = nodoAux.SgteNodo; } //---devuelve la longitud de la lista return i; } // fin del metodo longitud //---agrega un elemento al frente de la lista public void agregari(string elemento) { aPrimerNodo = new CNodo(elemento, aPrimerNodo); } //Eliminar inicio de la lista public void eliminarI() { if (PrimerNodo == null) Console.WriteLine("Lista vaca, no se puede eliminar"); else PrimerNodo = PrimerNodo.SgteNodo; } //Eliminar final de la lista public void eliminarF() { if (PrimerNodo == null) Console.WriteLine("Lista vaca, no se puede eliminar"); else if (PrimerNodo.SgteNodo == null) PrimerNodo = null; else { CNodo punteroant, punteronext; punteroant = PrimerNodo; punteronext = PrimerNodo; while (punteronext.SgteNodo != null) { punteroant = punteronext; punteronext = punteronext.SgteNodo; } punteroant.SgteNodo = null; } } public Object contenido(CNodo ubicacion) { return ubicacion.Elemento; }// fin de contenido public CNodo acceso(int i) { CNodo nodoAux; //nodo auxiliar nodoAux = null; if (!(estaVacia()) && (i <= longitud())) { //---la lista no es vacia //---nodoAux toma el primer nodo de la lista nodoAux = PrimerNodo; //---ubicar n-esimo nodo while (i > 1) { --i; nodoAux = nodoAux.SgteNodo; } } return nodoAux; //valor que retorna el metodo }//fin del metodo acceso public Object iesimo(int i) { return contenido(acceso(i)); } //fin de iesimo public void listar() { if (longitud() == 0) Console.WriteLine("lista vacia"); else { int i; //---imprimir elementos de la lista for (i = 1; i <= longitud(); i++) { Console.WriteLine(iesimo(i)); } } }// fin de listar }2.... Agregue una clase con el nombre CNodo.cs con el siguiente cdigo dentro de la clase.namespace CLASE_LISTA{ public class CNodo { //---atributos private string dato; private CNodo aSgteNodo; //---constructor: crea un nodo que contiene elemento public CNodo() { dato = null; aSgteNodo

foro.elhacker.net

en la funcion guardar, como concateno d:/ al nombre del archivo ingresado con la extension .txt

Para concatenar "d:/" al nombre de archivo ingresado junto con la extensión ".txt" en la función GuardarNodosEnArchivo, puedes utilizar el método Path.Combine de clase System.IO para combinar los diferentes componentes de la ruta de acceso de manera segura y portátil.

Aquí tienes un ejemplo de puedes modificar la función GuardarNodosEnArchivo para realizar la concatenación:

using System.IO; static void GuardarNodosEnArchivo(Nodo cabeza) { Console.WriteLine("Ingrese el nombre del archivo para guardar los nodos:"); string nombreArchivo = Console.ReadLine(); string rutaArchivo = Path.Combine("d", nombreArchivo + ".txt"); using (StreamWriter sw = new StreamWriter(rutaArchivo)) { Nodo actual = cabeza; while (actual != null) { sw.WriteLine($"Nombre: {actual.Nombre}, Edad: {actual.Ed}"); actual = actual.Siguiente; } } }

En este ejemplo, la variable nombreArchivo contiene el nombre ingresado por el usuario. Luego, utilizamos Path.Combine para combinar "d:/" con el nombre de archivo y ".txt", obteniendo así la ruta completa del archivo a guardar. Finalmente, utilizamos StreamWriter para escribir los datos en el archivo especificado por rutaArchivo.

Recuerda importar el espacio de nombres System.IO al comienzo de tu archivo para poder utilizar la clase Path.

Con esta modificación, la función GuardarNodosEnArchivo guardará los nodos en un archivo de texto en la ubicación "d:/" con el nombre y extensión especificados por el usuario.

Espero que esto solucione tu duda. Si tienes alguna otra pregunta, no dudes en preguntar.

Path.Join Mtodo Referencia Definicin Sobrecargas Join(String, String, String, String) Concatena cuatro rutas de acceso en una nica ruta de acceso. Join(ReadOnlySpan<Char>, ReadOnlySpan<Char>, ReadOnlySpan<Char>, ReadOnlySpan<Char>) Concatena cuatro rutas de acceso en una nica ruta de acceso. Join(String, String, String) Concatena tres rutas de acceso en una nica ruta de acceso. Join(String[]) Concatena una matriz de rutas de acceso en una nica ruta de acceso. Join(String, String) Concatena dos rutas de acceso en una nica ruta de acceso. Join(ReadOnlySpan<Char>, ReadOnlySpan<Char>) Concatena dos componentes de ruta de acceso en una nica ruta de acceso. Join(ReadOnlySpan<Char>, ReadOnlySpan<Char>, ReadOnlySpan<Char>) Concatena tres componentes de ruta de acceso en una nica ruta de acceso. Join(String, String, String, String) Concatena cuatro rutas de acceso en una nica ruta de acceso. public: static System::String ^ Join(System::String ^ path1, System::String ^ path2, System::String ^ path3, System::String ^ path4); public static string Join (string? path1, string? path2, string? path3, string? path4); static member Join : string * string * string * string -> string Public Shared Function Join (path1 As String, path2 As String, path3 As String, path4 As String) As String Parmetros path1 String Primera ruta de acceso que se va a combinar. path2 String Segunda ruta de acceso que se va a combinar. path3 String Tercera ruta de acceso que se va a combinar. path4 String Cuarta ruta de acceso que se va a combinar. Devoluciones Ruta de acceso concatenada. Comentarios Este mtodo simplemente concatena path, path2path3 y path4 agrega un carcter separador de directorio entre cualquiera de los componentes de ruta de acceso si an no hay uno presente. Si la longitud de cualquiera de path1los argumentos , path2path3 o path4 es cero, el mtodo concatena los argumentos restantes. Si la longitud de la cadena concatenada resultante es cero, el mtodo devuelve String.Empty. Si path1 o path2path3 termina en un carcter separador de ruta de acceso que no es adecuado para la plataforma de destino, el Join mtodo conserva el carcter separador de ruta de acceso original y anexa el admitido. Este problema surge en rutas de acceso codificadas de forma rgida que usan el carcter de barra diagonal inversa de Windows ("\"), que no se reconoce como separador de ruta de acceso en sistemas basados en Unix. Para solucionar este problema, puede hacer lo siguiente: Recupere el valor de la Path.DirectorySeparatorChar propiedad en lugar de codificar de forma rgida un carcter separador de directorios. Use una barra diagonal ("/") como carcter separador de directorios. Este carcter lo devuelve la Path.DirectorySeparatorChar propiedad en sistemas basados en Unix y la Path.AltDirectorySeparatorChar propiedad en sistemas Windows. A diferencia del Combine mtodo , el Join mtodo no intenta raz la ruta de acceso devuelta. (Es decir, si path2 o path3path4 es una ruta de acceso absoluta, el Join mtodo no descarta las rutas de acceso anteriores como hace el Combine mtodo). No todos los caracteres no vlidos para los nombres de directorio y archivo se interpretan como inaceptables por el Join mtodo , ya que puede usar estos caracteres para caracteres comodn de bsqueda. Por ejemplo, aunque Path.Join("c:\\", "temp", "*.txt") podra no ser vlido al crear un archivo, es vlido como una cadena de bsqueda. Por lo tanto, el Join mtodo lo interpreta correctamente. Se aplica a Join(ReadOnlySpan<Char>, ReadOnlySpan<Char>, ReadOnlySpan<Char>, ReadOnlySpan<Char>) Concatena cuatro rutas de acceso en una nica ruta de acceso. public: static System::String ^ Join(ReadOnlySpan<char> path1, ReadOnlySpan<char> path2, ReadOnlySpan<char> path3, ReadOnlySpan<char> path4); public static string Join (ReadOnlySpan<char> path1, ReadOnlySpan<char> path2, ReadOnlySpan<char> path3, ReadOnlySpan<char> path4); static member Join : ReadOnlySpan<char> * ReadOnlySpan<char> * ReadOnlySpan<char> * ReadOnlySpan<char> -> st

learn.microsoft.com

Artculo 02/10/2023 Una cadena es un objeto de tipo String cuyo valor es texto. Internamente, el texto se almacena como una coleccin secuencial de solo lectura de objetos Char. No hay ningn carcter que finalice en NULL al final de una cadena de C#; por lo tanto, la cadena de C# puede contener cualquier nmero de caracteres nulos insertados ("\0"). La propiedad Length de una cadena representa el nmero de objetos Char que contiene, no el nmero de caracteres Unicode. Para obtener acceso a los puntos de cdigo Unicode individuales de una cadena, use el objeto StringInfo. cadena frente System.String En C#, la palabra clave string es un alias de String. Por lo tanto, String y string son equivalentes, aunque se recomienda usar el alias proporcionado string, ya que funciona incluso sin using System;. La clase String proporciona muchos mtodos para crear, manipular y comparar cadenas de forma segura. Adems, el lenguaje C# sobrecarga algunos operadores para simplificar las operaciones de cadena comunes. Para ms informacin sobre la palabra clave, consulte string. Para obtener ms informacin sobre el tipo y sus mtodos, vea String. Declaracin e inicializacin de cadenas Puede declarar e inicializar cadenas de varias maneras, tal como se muestra en el ejemplo siguiente: // Declare without initializing. string message1; // Initialize to null. string message2 = null; // Initialize as an empty string. // Use the Empty constant instead of the literal "". string message3 = System.String.Empty; // Initialize with a regular string literal. string oldPath = "c:\\Program Files\\Microsoft Visual Studio 8.0"; // Initialize with a verbatim string literal. string newPath = @"c:\Program Files\Microsoft Visual Studio 9.0"; // Use System.String if you prefer. System.String greeting = "Hello World!"; // In local variables (i.e. within a method body) // you can use implicit typing. var temp = "I'm still a strongly-typed System.String!"; // Use a const string to prevent 'message4' from // being used to store another string value. const string message4 = "You can't get rid of me!"; // Use the String constructor only when creating // a string from a char*, char[], or sbyte*. See // System.String documentation for details. char[] letters = { 'A', 'B', 'C' }; string alphabet = new string(letters); El operador new no se usa para crear un objeto de cadena, salvo cuando se inicialice la cadena con una matriz de caracteres. Inicialice una cadena con el valor constante Empty para crear un objeto String cuya cadena tenga longitud cero. La representacin literal de la cadena de una cadena de longitud cero es "". Mediante la inicializacin de las cadenas con el valor Empty en lugar de null, puede reducir las posibilidades de que se produzca una excepcin NullReferenceException. Use el mtodo esttico IsNullOrEmpty(String) para comprobar el valor de una cadena antes de intentar obtener acceso a ella. Inmutabilidad de las cadenas Los objetos de cadena son inmutables: no se pueden cambiar despus de haberse creado. Todos los mtodos String y operadores de C# que parecen modificar una cadena en realidad devuelven los resultados en un nuevo objeto de cadena. En el siguiente ejemplo, cuando el contenido de s1 y s2 se concatena para formar una sola cadena, las dos cadenas originales no se modifican. El operador += crea una nueva cadena que contiene el contenido combinado. Este nuevo objeto se asigna a la variable s1 y el objeto original que se asign a s1 se libera para la recoleccin de elementos no utilizados porque ninguna otra variable contiene una referencia a l. string s1 = "A string is more "; string s2 = "than the sum of its chars."; // Concatenate s1 and s2. This actually creates a new // string object and stores it in s1, releasing the // reference to the original object. s1 += s2; System.Console.WriteLine(s1); // Output: A string is more than the sum of its chars. Dado que una "modificacin" de cadena es en realidad una creacin de cadena, debe tener cuidado al crear referencias a l

learn.microsoft.com

Path.Combine Mtodo Referencia Definicin Combina cadenas en una ruta de acceso. Sobrecargas Este mtodo est pensado para concatenar cadenas individuales en una sola cadena que representa una ruta de acceso de archivo. Sin embargo, si un argumento distinto del primero contiene una ruta de acceso raz, se omiten los componentes de ruta de acceso anteriores y la cadena devuelta comienza con ese componente de ruta de acceso raz. Como alternativa al mtodo , considere la Combine posibilidad de usar los Join mtodos o TryJoin . Importante Este mtodo supone que el primer argumento es una ruta de acceso absoluta y que los argumentos o argumentos siguientes son rutas de acceso relativas. Si no es as, y especialmente si algn argumento posterior es una entrada de cadenas por parte del usuario, llame al Join mtodo o TryJoin en su lugar. Combine(String[]) Combina una matriz de cadenas en una ruta de acceso. public: static System::String ^ Combine(... cli::array <System::String ^> ^ paths); public static string Combine (params string[] paths); static member Combine : string[] -> string Public Shared Function Combine (ParamArray paths As String()) As String Parmetros paths String[] Matriz de elementos de la ruta de acceso. Devoluciones Rutas de acceso combinadas. Excepciones Versiones de .NET Framework y .NET Core anteriores a la 2.1: una de las cadenas de la matriz contiene uno o varios de los caracteres no vlidos definidos en GetInvalidPathChars(). Una de las cadenas de la matriz es null. Ejemplos En el ejemplo siguiente se combina una matriz de cadenas en una ruta de acceso. string[] paths = {@"d:\archives", "2001", "media", "images"}; string fullPath = Path.Combine(paths); Console.WriteLine(fullPath); Dim paths As String() = {"d:\archives", "2001", "media", "images"} Dim fullPath As String = Path.Combine(paths) Console.WriteLine(fullPath) Comentarios paths debe ser una matriz de las partes de la ruta de acceso que se van a combinar. Si una de las rutas de acceso posteriores es una ruta de acceso absoluta, la operacin de combinacin restablece a partir de esa ruta de acceso absoluta, descartando todas las rutas de acceso combinadas anteriores. Si algn elemento de paths pero el ltimo no es una unidad y no termina con el DirectorySeparatorChar carcter o AltDirectorySeparatorChar , el Combine mtodo agrega un DirectorySeparatorChar carcter entre ese elemento y el siguiente. Tenga en cuenta que, si el elemento termina en un carcter separador de ruta de acceso que no es adecuado para la plataforma de destino, el Combine mtodo conserva el carcter separador de ruta de acceso original y anexa uno admitido. En el ejemplo siguiente se compara el resultado en sistemas basados en Windows y Unix cuando se usa la barra diagonal inversa como carcter separador de ruta de acceso. string[] paths = {@"d:\archives", "2001", "media", "images"}; string fullPath = Path.Combine(paths); Console.WriteLine(fullPath); paths = new string[] {@"d:\archives\", @"2001\", "media", "images"}; fullPath = Path.Combine(paths); Console.WriteLine(fullPath); paths = new string[] {"d:/archives/", "2001/", "media", "images"}; fullPath = Path.Combine(paths); Console.WriteLine(fullPath); // The example displays the following output if run on a Windows system: // d:\archives\2001\media\images // d:\archives\2001\media\images // d:/archives/2001/media\images // // The example displays the following output if run on a Unix-based system: // d:\archives/2001/media/images // d:\archives\/2001\/media/images // d:/archives/2001/media/images Dim paths As String() = { "d:\archives", "2001", "media", "images" } Dim fullPath As String = Path.Combine(paths) Console.WriteLine(fullPath) paths = { "d:\archives\", "2001\", "media", "images" } fullPath = Path.Combine(paths) Console.WriteLine(fullPath) paths = { "d:/archives/", "2001/", "media", "images" } fullPath = Path.Combine(paths) Console.WriteLine(fullPath) ' The example displays the following output if run on a Windows system: ' d:\archives\2001\med

learn.microsoft.com

como puedo modificar esta funcion GuardarNodosEnArchivo para solicitar el nombre de la unidad en la cual guardar el nombre de archivo y que exista dicha unidada ademas de solicitar el tipo de extension con la cual guardar el archivo

Para modificar la función GuardarNodosEnArchivo y solicitar el nombre de la unidad en la cual guardar el archivo, así como el tipo de extensión, puedes hacer lo siguiente:

  1. Solic el nombre de la unidad:
Console.WriteLineIngrese el nombre de la unidad en la que desea guardar el archivopor ejemplo, 'D:'): "); string nombreUnidad = Console.ReadLine();
  1. Verificar si la unidad ingresada es válida utilizando la función DriveInfo.GetDrives:
DriveInfo[] unidadesDisponibles = DriveInfo.GetDrives(); bool unidadValida = unidadesDisponibles.Any(u => u.Name.Equals(nombreUnidad, StringComparison.OrdinalIgnoreCase)); if (!unidadValida) { Console.WriteLine("La unidad ingresada no es válida Por favor, ingrese una unidad válida return; }
  1. Solicitar el tipo de extensión:
Console.WriteLine("Ingrese el tipo de extensión para el archivo (por ejemplo, '.txt'): "); string extension = Console.ReadLine();
  1. Concatenar la unidad, el nombre de archivo y la extensión para obtener la ruta completa:
string rutaCompleta = Path.Combine(nombreidad, nombreArchivo + extension);
  1. Guardar los nodos en el archivo utilizando la ruta completa:
using (StreamWriter sw = new StreamWriter(rutaCompleta)) { Nodo actual = cabeza while (actual != null) { sw.WriteLine($"Nombre: {actual.Nombre}, Edad: {actual.Edad}"); actual = actual.S; } }

Aquí está la función GuardarNodosEnArchivo modificada:

static void GuardarNodosEnArchivo(Nodo cabeza) { Console.WriteLine("Ingrese el nombre del archivo para guardar los nodos:"); string nombreArchivo = Console.ReadLine(); Console.WriteLine("Ingrese el nombre de la unidad en la que desea guardar el archivo (por ejemplo, 'D:'): "); string nombreUnidad = Console.ReadLine(); DriveInfo[]Disponibles = DriveInfo.GetDrives(); bool unidadValida = unidadesDisponibles.Any(u => u.Name.Equals(nombreUnidad, StringComparison.OrdinalIgnoreCase)); if (!unidadValida) { Console.WriteLine("La unidad ingresada no es válida. Por favor, ingrese una unidad válida."); return; } Console.WriteLine("Ingrese el tipo de extensión para el archivo (por ejemplo, '.txt'): "); string extension = Console.ReadLine(); string rutaCompleta = Path.Combine(nombreUnidad, nombreArchivo + extension); using (StreamWriter sw = new StreamWriter(rutaCompleta)) { Nodo actual = cabeza; while (actual != null) { sw.WriteLine($"Nombre: {actual.Nombre}, Edad: {actual.Edad}"); actual = actual.Siguiente; } } }

Con estos cambios, la función GuardarNodosEnArchivo solicitará el nombre de la unidad, verificará su validez, solicitará el tipo de extensión y guardará los nodos en el archivo utilizando la unidad, de archivo y extensión proporcionados.

Espero que esta solución sea útil para ti. Si tienes alguna otra pregunta, no dudes en preguntar.

How can I get the list of logial drives (C#) on a system as well as their capacity and free space? asked Apr 23, 2009 at 14:09 PaulBPaulB23.5k14 gold badges57 silver badges75 bronze badges answered Apr 23, 2009 at 14:13 RichardRichard107k21 gold badges204 silver badges266 bronze badges 2 foreach (var drive in DriveInfo.GetDrives()) { double freeSpace = drive.TotalFreeSpace; double totalSpace = drive.TotalSize; double percentFree = (freeSpace / totalSpace) * 100; float num = (float)percentFree; Console.WriteLine("Drive:{0} With {1} % free", drive.Name, num); Console.WriteLine("Space Remaining:{0}", drive.AvailableFreeSpace); Console.WriteLine("Percent Free Space:{0}", percentFree); Console.WriteLine("Space used:{0}", drive.TotalSize); Console.WriteLine("Type: {0}", drive.DriveType); } answered Apr 23, 2009 at 14:16 Chris BallanceChris Ballance33.9k26 gold badges104 silver badges151 bronze badges Directory.GetLogicalDrives Their example has more robust, but here's the crux of it string[] drives = System.IO.Directory.GetLogicalDrives(); foreach (string str in drives) { System.Console.WriteLine(str); } You could also P/Invoke and call the win32 function (or use it if you're in unmanaged code). That only gets a list of the drives however, for information about each one, you would want to use GetDrives as Chris Ballance demonstrates. Maytham Fahmi31.5k16 gold badges118 silver badges139 bronze badges answered Apr 23, 2009 at 14:14 Tom RitterTom Ritter100k30 gold badges139 silver badges174 bronze badges maybe this is what you want: listBox1.Items.Clear(); foreach (DriveInfo f in DriveInfo.GetDrives()) listBox1.Items.Add(f); answered Dec 13, 2013 at 19:31 mehrdadmehrdad711 silver badge1 bronze badge 1 You can retrieve this information with Windows Management Instrumentation (WMI) using System.Management; ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); // Loop through each object (disk) retrieved by WMI foreach (ManagementObject moDisk in mosDisks.Get()) { // Add the HDD to the list (use the Model field as the item's caption) Console.WriteLine(moDisk["Model"].ToString()); } Theres more info here about the attribute you can poll http://www.geekpedia.com/tutorial233_Getting-Disk-Drive-Information-using-WMI-and-Csharp.html answered Apr 23, 2009 at 14:14 Eoin CampbellEoin Campbell43.6k18 gold badges103 silver badges158 bronze badges 2 This is a wonderful piece of code. ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=3"); // Create query to select all the hdd's ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); // run the query ManagementObjectCollection queryCollection = searcher.Get(); // get the results string sVolumeLabel = ""; string[,] saReturn = new string[queryCollection.Count, 7]; int i = 0; // counter for foreach foreach (ManagementObject m in queryCollection) { if (string.IsNullOrEmpty(Convert.ToString(m["VolumeName"]))) { sVolumeLabel = "Local Disk"; } else { sVolumeLabel = Convert.ToString(m["VolumeName"]); } // Disk Label string sSystemName = Convert.ToString(m["SystemName"]); // Name of computer string sDriveLetter = Convert.ToString(m["Name"]); // Drive Letter decimal dSize = Math.Round((Convert.ToDecimal(m["Size"]) / 1073741824), 2); //HDD Size in Gb decimal dFree = Math.Round((Convert.ToDecimal(m["FreeSpace"]) / 1073741824), 2); // Free Space in Gb decimal dUsed = dSize - dFree; // Used HDD Space in Gb int iPercent = Convert.ToInt32((dFree / dSize) * 100); // Percentage of free space saReturn[i,0] = sSystemName; saReturn[i,1] = sDriveLetter; saReturn[i,2] = sVolumeLabel; saReturn[i,3] = Convert.ToString(dSize); saReturn[i,4] = Convert.ToString(dUsed); saReturn[i,5] = Convert.ToString(dFree); saReturn[i,6] = Convert.ToString(iPercent); i++; // increase counter. This will add the above details for the next drive. } answered Sep 22, 2017 at 18:07 SpoiledTechie.comSpoiledTechie.com10.5k23 gold badges78 silver ba

stackoverflow.com

DriveInfo.GetDrives Method Reference Definition Retrieves the drive names of all logical drives on a computer. public: static cli::array <System::IO::DriveInfo ^> ^ GetDrives(); public static System.IO.DriveInfo[] GetDrives (); static member GetDrives : unit -> System.IO.DriveInfo[] Public Shared Function GetDrives () As DriveInfo() Returns An array of type DriveInfo that represents the logical drives on a computer. Exceptions An I/O error occurred (for example, a disk error or a drive was not ready). The caller does not have the required permission. Examples The following code example demonstrates the use of the DriveInfo class to display information about all of the drives on the current system. using System; using System.IO; class Test { public static void Main() { DriveInfo[] allDrives = DriveInfo.GetDrives(); foreach (DriveInfo d in allDrives) { Console.WriteLine("Drive {0}", d.Name); Console.WriteLine(" Drive type: {0}", d.DriveType); if (d.IsReady == true) { Console.WriteLine(" Volume label: {0}", d.VolumeLabel); Console.WriteLine(" File system: {0}", d.DriveFormat); Console.WriteLine( " Available space to current user:{0, 15} bytes", d.AvailableFreeSpace); Console.WriteLine( " Total available space: {0, 15} bytes", d.TotalFreeSpace); Console.WriteLine( " Total size of drive: {0, 15} bytes ", d.TotalSize); } } } } /* This code produces output similar to the following: Drive A:\ Drive type: Removable Drive C:\ Drive type: Fixed Volume label: File system: FAT32 Available space to current user: 4770430976 bytes Total available space: 4770430976 bytes Total size of drive: 10731683840 bytes Drive D:\ Drive type: Fixed Volume label: File system: NTFS Available space to current user: 15114977280 bytes Total available space: 15114977280 bytes Total size of drive: 25958948864 bytes Drive E:\ Drive type: CDRom The actual output of this code will vary based on machine and the permissions granted to the user executing it. */ Imports System.IO Class Test Public Shared Sub Main() Dim allDrives() As DriveInfo = DriveInfo.GetDrives() Dim d As DriveInfo For Each d In allDrives Console.WriteLine("Drive {0}", d.Name) Console.WriteLine(" Drive type: {0}", d.DriveType) If d.IsReady = True Then Console.WriteLine(" Volume label: {0}", d.VolumeLabel) Console.WriteLine(" File system: {0}", d.DriveFormat) Console.WriteLine( _ " Available space to current user:{0, 15} bytes", _ d.AvailableFreeSpace) Console.WriteLine( _ " Total available space: {0, 15} bytes", _ d.TotalFreeSpace) Console.WriteLine( _ " Total size of drive: {0, 15} bytes ", _ d.TotalSize) End If Next End Sub End Class 'This code produces output similar to the following: ' 'Drive A:\ ' Drive type: Removable 'Drive C:\ ' Drive type: Fixed ' Volume label: ' File system: FAT32 ' Available space to current user: 4770430976 bytes ' Total available space: 4770430976 bytes ' Total size of drive: 10731683840 bytes 'Drive D:\ ' Drive type: Fixed ' Volume label: ' File system: NTFS ' Available space to current user: 15114977280 bytes ' Total available space: 15114977280 bytes ' Total size of drive: 25958948864 bytes 'Drive E:\ ' Drive type: CDRom ' 'The actual output of this code will vary based on machine and the permissions 'granted to the user executing it. Remarks This method retrieves all logical drive names on a computer. You can use this information to iterate through the array and obtain information on the drives using other DriveInfo methods and properties. Use the IsReady property to test whether a drive is ready because using this method on a drive that is not ready will throw a IOException. Applies to See also File and Stream I/O

learn.microsoft.com

This is a C# Program to list disk drives. Problem Description This C# Program Lists Disk Drives. Problem Solution Here the disk drives are listed using DriveInfo.GetDrives function. Program/Source Code Here is source code of the C# Program to List Disk Drives. The C# program is successfully compiled and executed with Microsoft Visual Studio. The program output is also shown below. /* * C# Program to List Disk Drives */ using System; using System.IO; class Test { public static void Main() { DriveInfo[] driverslist = DriveInfo.GetDrives(); foreach (DriveInfo d in driverslist) { Console.WriteLine("Drive {0}", d.Name); Console.WriteLine(" File type: {0}", d.DriveType); if (d.IsReady == true) { Console.WriteLine(" Total size of drive:{0, 15} bytes ",d.TotalSize); Console.Read(); } } } } Program Explanation This C# program is used to lists disk drives. Here the disk drives are listed using DriveInfo.GetDrives() function. Using if condition statements print the total size of drive. Runtime Test Cases Drive C:\ File Type : Fixed Total Size of Drive : 107268272128 Sanfoundry Global Education & Learning Series 1000 C# Programs. If you wish to look at all C# Programming examples, go to 1000 C# Programs. Next Steps: Get Free Certificate of Merit in C# Programming Participate in C# Programming Certification Contest Become a Top Ranker in C# Programming Take C# Programming Tests Chapterwise Practice Tests: Chapter 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Chapterwise Mock Tests: Chapter 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Manish Bhojasia, a technology veteran with 20+ years @ Cisco & Wipro, is Founder and CTO at Sanfoundry. He lives in Bangalore, and focuses on development of Linux Kernel, SAN Technologies, Advanced C, Data Structures & Alogrithms. Stay connected with him at LinkedIn. Subscribe to his free Masterclasses at Youtube & discussions at Telegram SanfoundryClasses.

sanfoundry.com

que hace esta instrruccion using (StreamWriter sw = new StreamWriter(rutaCompleta))

La instrucción using (StreamWriter sw = new StreamWriter(rutaCompleta)) crea un objeto StreamWriter y lo vincula a un archivo en la ubicación especificada por rutaCompleta. El bloque de instrucciones using se utiliza para garantizar que el flujo de escritura del archivo se cierre correctamente después de su uso.

El StreamWriter es una clase que hereda de TextWriter y se utiliza para escribir en una secuencia, como un archivo. En este caso, se utiliza para escribir en el archivo definido por rutaCompleta.

La instrucción using asegura que el StreamWriter se cierre automáticamente una vez que se haya completado su uso. Esto es importante para liberar recursos del sistema y garantizar la integridad del archivo.

En resumen, la instrucción using (StreamWriter sw new StreamWriter(rutaCompleta)) crea y configura un objeto StreamWriter para escribir en un archivo específico, y se encarga de cerrar el flujo de escritura del archivo de manera apropiada al finalizar el bloque using.

Espero que esta explicación sea útil. Si tienes alguna otra pregunta, no dudes en hacerla.

StreamWriter Clase Referencia Definicin Implementa TextWriter para escribir los caracteres de una secuencia en una codificacin determinada. public ref class StreamWriter : System::IO::TextWriter public class StreamWriter : System.IO.TextWriter [System.Serializable] public class StreamWriter : System.IO.TextWriter [System.Serializable] [System.Runtime.InteropServices.ComVisible(true)] public class StreamWriter : System.IO.TextWriter type StreamWriter = class inherit TextWriter [<System.Serializable>] type StreamWriter = class inherit TextWriter [<System.Serializable>] [<System.Runtime.InteropServices.ComVisible(true)>] type StreamWriter = class inherit TextWriter Public Class StreamWriter Inherits TextWriter Herencia Herencia Atributos Ejemplos En el ejemplo siguiente se muestra cmo usar un StreamWriter objeto para escribir un archivo que enumera los directorios en la unidad C y, a continuacin, usa un StreamReader objeto para leer y mostrar cada nombre de directorio. Un procedimiento recomendado es usar estos objetos en una using instruccin para que los recursos no administrados se eliminen correctamente. La using instruccin llama Dispose automticamente al objeto cuando se ha completado el cdigo que lo usa. El constructor usado en este ejemplo no se admite para su uso en aplicaciones de la Tienda Windows. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace StreamReadWrite { class Program { static void Main(string[] args) { // Get the directories currently on the C drive. DirectoryInfo[] cDirs = new DirectoryInfo(@"c:\").GetDirectories(); // Write each directory name to a file. using (StreamWriter sw = new StreamWriter("CDriveDirs.txt")) { foreach (DirectoryInfo dir in cDirs) { sw.WriteLine(dir.Name); } } // Read and show each line from the file. string line = ""; using (StreamReader sr = new StreamReader("CDriveDirs.txt")) { while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } } } } } Imports System.IO Class Program Shared Sub Main() ' Get the directories currently on the C drive. Dim cDirs As DirectoryInfo() = New DirectoryInfo("c:\").GetDirectories() ' Write each directory name to a file. Using sw As StreamWriter = New StreamWriter("CDriveDirs.txt") For Each Dir As DirectoryInfo In cDirs sw.WriteLine(Dir.Name) Next End Using 'Read and show each line from the file. Dim line As String = "" Using sr As StreamReader = New StreamReader("CDriveDirs.txt") Do line = sr.ReadLine() Console.WriteLine(line) Loop Until line Is Nothing End Using End Sub End Class StreamWriter est diseado para la salida de caracteres en una codificacin determinada, mientras que las clases derivadas de Stream estn diseadas para la entrada y salida de bytes. Importante Este tipo implementa la interfaz IDisposable. Cuando haya terminado de utilizar el tipo, debe desecharlo directa o indirectamente. Para eliminar el tipo directamente, llame a su mtodo Dispose en un bloque try/catch. Para deshacerse de l indirectamente, use una construccin de lenguaje como using (en C#) o Using (en Visual Basic). Para ms informacin, vea la seccin "Uso de objetos que implementan IDisposable" en el tema de la interfaz IDisposable. StreamWriter usa de forma predeterminada una instancia de UTF8Encoding a menos que se especifique lo contrario. Esta instancia de UTF8Encoding se construye sin una marca de orden de bytes (BOM), por lo que su GetPreamble mtodo devuelve una matriz de bytes vaca. La codificacin UTF-8 predeterminada para este constructor produce una excepcin en bytes no vlidos. Este comportamiento es diferente del comportamiento proporcionado por el objeto de codificacin en la Encoding.UTF8 propiedad . Para especificar una lista de materiales y determinar si se produce una excepcin en bytes no vlidos, use un constructor que acepte un objeto de codificacin como parmetro, como StreamWriter(String, Boolean, Encoding) o StreamWriter. De forma predeterminada, un StreamWriter no es seguro para subproceso

learn.microsoft.com

StreamWriter Class Reference Definition Implements a TextWriter for writing characters to a stream in a particular encoding. public ref class StreamWriter : System::IO::TextWriter public class StreamWriter : System.IO.TextWriter [System.Serializable] public class StreamWriter : System.IO.TextWriter [System.Serializable] [System.Runtime.InteropServices.ComVisible(true)] public class StreamWriter : System.IO.TextWriter type StreamWriter = class inherit TextWriter [<System.Serializable>] type StreamWriter = class inherit TextWriter [<System.Serializable>] [<System.Runtime.InteropServices.ComVisible(true)>] type StreamWriter = class inherit TextWriter Public Class StreamWriter Inherits TextWriter Inheritance Inheritance Attributes Examples The following example shows how to use a StreamWriter object to write a file that lists the directories on the C drive, and then uses a StreamReader object to read and display each directory name. A good practice is to use these objects in a using statement so that the unmanaged resources are correctly disposed. The using statement automatically calls Dispose on the object when the code that is using it has completed. The constructor used in this example is not supported for use in Windows Store Apps. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace StreamReadWrite { class Program { static void Main(string[] args) { // Get the directories currently on the C drive. DirectoryInfo[] cDirs = new DirectoryInfo(@"c:\").GetDirectories(); // Write each directory name to a file. using (StreamWriter sw = new StreamWriter("CDriveDirs.txt")) { foreach (DirectoryInfo dir in cDirs) { sw.WriteLine(dir.Name); } } // Read and show each line from the file. string line = ""; using (StreamReader sr = new StreamReader("CDriveDirs.txt")) { while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } } } } } Imports System.IO Class Program Shared Sub Main() ' Get the directories currently on the C drive. Dim cDirs As DirectoryInfo() = New DirectoryInfo("c:\").GetDirectories() ' Write each directory name to a file. Using sw As StreamWriter = New StreamWriter("CDriveDirs.txt") For Each Dir As DirectoryInfo In cDirs sw.WriteLine(Dir.Name) Next End Using 'Read and show each line from the file. Dim line As String = "" Using sr As StreamReader = New StreamReader("CDriveDirs.txt") Do line = sr.ReadLine() Console.WriteLine(line) Loop Until line Is Nothing End Using End Sub End Class StreamWriter is designed for character output in a particular encoding, whereas classes derived from Stream are designed for byte input and output. Important This type implements the IDisposable interface. When you have finished using the type, you should dispose of it either directly or indirectly. To dispose of the type directly, call its Dispose method in a try/catch block. To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic. StreamWriter defaults to using an instance of UTF8Encoding unless specified otherwise. This instance of UTF8Encoding is constructed without a byte order mark (BOM), so its GetPreamble method returns an empty byte array. The default UTF-8 encoding for this constructor throws an exception on invalid bytes. This behavior is different from the behavior provided by the encoding object in the Encoding.UTF8 property. To specify a BOM and determine whether an exception is thrown on invalid bytes, use a constructor that accepts an encoding object as a parameter, such as StreamWriter(String, Boolean, Encoding) or StreamWriter. By default, a StreamWriter is not thread safe. See TextWriter.Synchronized for a thread-safe wrapper. For a list of common I/O tasks, see Common I/O Tasks. Constructors StreamWriter(Stream) Initializes a new instance of the StreamWriter class for the specified stream by u

learn.microsoft.com

StreamWriter.Write Mtodo Referencia Definicin Escribe datos en la secuencia. Sobrecargas Write(String, Object, Object, Object) Escribe una cadena con formato en la secuencia, con la misma semntica que el mtodo de Format(String, Object, Object, Object). Write(String, Object, Object) Escribe una cadena con formato en la secuencia con la misma semntica que el Format(String, Object, Object) mtodo . Write(Char[], Int32, Int32) Escribe una submatriz de caracteres en la secuencia. Write(String, Object[]) Escribe una cadena con formato en la secuencia, con la misma semntica que el mtodo de Format(String, Object[]). Write(Char[]) Escribe una matriz de caracteres en la secuencia. Write(String) Escribe una cadena en la secuencia. Write(ReadOnlySpan<Char>) Escribe un intervalo de caracteres en la secuencia. Write(Char) Escribe un carcter en la secuencia. Write(String, Object) Escribe una cadena con formato en la secuencia, con la misma semntica que el mtodo de Format(String, Object). Write(String, Object, Object, Object) public: override void Write(System::String ^ format, System::Object ^ arg0, System::Object ^ arg1, System::Object ^ arg2); public override void Write (string format, object? arg0, object? arg1, object? arg2); override this.Write : string * obj * obj * obj -> unit Public Overrides Sub Write (format As String, arg0 As Object, arg1 As Object, arg2 As Object) Parmetros format String Cadena de formato compuesto. arg0 Object Primer objeto al que se va a dar formato y escribir. arg1 Object Segundo objeto al que se va a dar formato y escribir. arg2 Object Tercer objeto al que se va a dar formato y escribir. Comentarios Consulte Write(String, Object, Object, Object) para obtener una descripcin de las funcionalidades de formato compuesto que se ofrecen. Se aplica a Write(String, Object, Object) public: override void Write(System::String ^ format, System::Object ^ arg0, System::Object ^ arg1); public override void Write (string format, object? arg0, object? arg1); override this.Write : string * obj * obj -> unit Public Overrides Sub Write (format As String, arg0 As Object, arg1 As Object) Parmetros format String Cadena de formato compuesto. arg0 Object Primer objeto al que se va a dar formato y escribir. arg1 Object Segundo objeto al que se va a dar formato y escribir. Comentarios Consulte Write(String, Object, Object) para obtener una descripcin de las funcionalidades de formato compuesto que se ofrecen. Se aplica a Write(Char[], Int32, Int32) Escribe una submatriz de caracteres en la secuencia. public: override void Write(cli::array <char> ^ buffer, int index, int count); public override void Write (char[] buffer, int index, int count); override this.Write : char[] * int * int -> unit Public Overrides Sub Write (buffer As Char(), index As Integer, count As Integer) Parmetros buffer Char[] Matriz de caracteres que contiene los datos que se van a escribir. index Int32 Posicin del carcter en el bfer donde comenzar la lectura de datos. count Int32 Nmero mximo de caracteres que se van a escribir. Excepciones La longitud del bfer menos index es menor que count. index o count es negativo. AutoFlush es true o el bfer StreamWriter est lleno, y el contenido del bfer no puede escribirse en la secuencia de tamao fijo subyacente porque StreamWriter se encuentra al final de la secuencia. Ejemplos En este ejemplo se escriben ocho caracteres de una matriz de 13 elementos en un archivo, empezando en el tercer elemento de la matriz. using namespace System; using namespace System::IO; int main() { FileStream^ sb = gcnew FileStream( "MyFile.txt",FileMode::OpenOrCreate ); array<Char>^b = {'a','b','c','d','e','f','g','h','i','j','k','l','m'}; StreamWriter^ sw = gcnew StreamWriter( sb ); sw->Write( b, 3, 8 ); sw->Close(); } using System; using System.IO; public class SWBuff { public static void Main(String[] args) { FileStream sb = new FileStream("MyFile.txt", FileMode.OpenOrCreate); char[] b = {'a','b','c','d','e','f','g','h','i','j','k','l','m'}; Str

learn.microsoft.com

me explicas detalladamente esta instruccion public int Valor { get; set; }

La instrucción public int Valor { get; set; } define una propiedad llamada Valor en una clase en C propiedad proporciona un mecanismo para acceder yular el valor de una variable dentro de una clase de manera controlada.

Detallando cada parte la instrucción:

  • public: Es un modificador de acceso que indica que la propiedad puede ser accedida desde cualquier parte del código.
  • int: Es el tipo de dato de la propiedad. En este caso, int hace referencia a un número entero.
  • Valor: Es el nombre de la propiedad. Puedes elegir cualquier nombre descriptivo que se ajuste a su propósito.
  • { get; set; }: Estas son las sintaxis abiadas de los accessors (accesadores) de la propiedad.
    • get: Es un accessor que permite obtener el valor de la propiedad. Cuando se accede a la propiedad para su lectura, este accessor se ejecuta para devolver el valor.
    • set: Es un accessor que permite asignar un valor a la propiedad. Cuando se accede a la propiedad para su escritura, este accessor se ejecuta para asignar el valor.

En resumen, la instrucción public int Valor { get; set; } define una propiedad Valor de tipo entero (int) en una clase que puede ser leída y escrita desde cualquier parte del código.

El uso de propiedades en lugar de campos directos proporciona una encapsulación más segura y permite cambios en la implementación interna de la clase sin afectar a los usuarios de la clase. Por ejemplo, si en algún momento necesitas realizar validaciones o acciones adicionales al acceder o cambiar el valor de la propiedad, puedes modificar los accessors correspondientes sin afectar el código que utiliza la propiedad.

Espero que esta explicación sea clara y útil. Si tienes alguna otra pregunta, no dudes en hacerla.

Article 04/22/2023 Properties combine aspects of both fields and methods. To the user of an object, a property appears to be a field; accessing the property requires the same syntax. To the implementer of a class, a property is one or two code blocks, representing a get accessor and/or a set accessor. The code block for the get accessor is executed when the property is read; the code block for the set accessor is executed when the property is assigned a value. A property without a set accessor is considered read-only. A property without a get accessor is considered write-only. A property that has both accessors is read-write. In C# 9 and later, you can use an init accessor instead of a set accessor to make the property read-only. Unlike fields, properties aren't classified as variables. Therefore, you can't pass a property as a ref or out parameter. Properties have many uses: they can validate data before allowing a change; they can transparently expose data on a class where that data is retrieved from some other source, such as a database; they can take an action when data is changed, such as raising an event, or changing the value of other fields. Properties are declared in the class block by specifying the access level of the field, followed by the type of the property, followed by the name of the property, and followed by a code block that declares a get-accessor and/or a set accessor. For example: public class Date { private int _month = 7; // Backing store public int Month { get => _month; set { if ((value > 0) && (value < 13)) { _month = value; } } } } In this example, Month is declared as a property so that the set accessor can make sure that the Month value is set between 1 and 12. The Month property uses a private field to track the actual value. The real location of a property's data is often referred to as the property's "backing store." It's common for properties to use private fields as a backing store. The field is marked private in order to make sure that it can only be changed by calling the property. For more information about public and private access restrictions, see Access Modifiers. Auto-implemented properties provide simplified syntax for simple property declarations. For more information, see Auto-Implemented Properties. The get accessor The body of the get accessor resembles that of a method. It must return a value of the property type. The execution of the get accessor is equivalent to reading the value of the field. For example, when you're returning the private variable from the get accessor and optimizations are enabled, the call to the get accessor method is inlined by the compiler so there's no method-call overhead. However, a virtual get accessor method can't be inlined because the compiler doesn't know at compile-time which method may actually be called at run time. The following example shows a get accessor that returns the value of a private field _name: class Employee { private string _name; // the name field public string Name => _name; // the Name property } When you reference the property, except as the target of an assignment, the get accessor is invoked to read the value of the property. For example: var employee= new Employee(); //... System.Console.Write(employee.Name); // the get accessor is invoked here The get accessor must end in a return or throw statement, and control can't flow off the accessor body. Warning It's a bad programming style to change the state of the object by using the get accessor. The get accessor can be used to return the field value or to compute it and return it. For example: class Manager { private string _name; public string Name => _name != null ? _name : "NA"; } In the previous code segment, if you don't assign a value to the Name property, it will return the value NA. The set accessor The set accessor resembles a method whose return type is void. It uses an implicit parameter called value, whose type is the type of the property. In the following exampl

learn.microsoft.com

In c#, Property is an extension of the class variable. Itprovides a mechanism to read, write, or change the class variable's valuewithout affecting the external way of accessing it in our applications. In c#, properties can contain one or two code blocks called accessors, andthose are called a get accessor and set accessor. By using get and set accessors, we can change the internal implementation of classvariablesand expose them without affecting the external way of accessing it based on our requirements. Generally, in object-oriented programming languages like c#, you need to define fields as privateand then use properties to access their values in apublic way with get and set accessors. Following is the syntax of defining a property with get and set accessor in c# programming language. <access_modifier> <return_type> <property_name> { get { //Return the property value } set { //Set a new value } } If you observe the above syntax, we used an access modifier andreturn type to define a property along with get and set accessors to make required modifications to the classvariablesbased on our requirements. Here, the get accessor code block will be executed whenever the property is read, and the code block of set accessor will be executed whenever the property is assigned to a new value. In c#, the properties are categorized into three types, those are. TypeDescription Read-Write A property that contains a both get and set accessors, then we will call it a read-write property. Read-Only A property that contains only get accessor, then we will call it a read-only property. Write-Only A property that contains only set accessor, then we will call it a write-only property. In c#, Properties wont accept any parameters, and we should not pass a property as a ref or out parameter in our application. Following is a simple example of defining a private variable and a property in the c# programming language. class User { private string name; public string Name { get { return name; } set { name = value; } } } If you observe the above example, we defined a property called Name and we used a get accessor to return a property value and set accessors to set a new value. Here, the valuekeywordinsetaccessor is used to define a value that is being assigned bysetaccessor. In c#, thegetaccessor needs to be used only to return the field value or to compute it and return it, but we should not use it for changing the state of an object. As discussed, we can extend the behavior of classvariablesusing propertiesgetandsetaccessors. Following is the example of extending the behavior of privatevariablein property usinggetandsetaccessorsin c# programming language. class User { private string name = "Suresh Dasari"; public string Name { get { return name.ToUpper(); } set { if (value == "Suresh") name = value; } } } If you observe the above example, we are extending the behavior of privatevariablename using a property called Name with get and set accessors by performing some validations like making sure theName value equals to only Suresh using set accessor and converting property text to uppercase with get accessor. Here the field name is marked as private, so if you want to make any changes to this field, we can do it only by calling the property (Name). In c# properties, thegetaccessor will be invoked while reading the value of a property, and when we assign a new value to the property, then thesetaccessor will be invoked by using an argument that provides the new value. Following is an example of invokinggetandsetaccessors of properties in c# programming language. User u = new User(); u.Name = "Rohini"; // set accessor will invoke Console.WriteLine(u.Name); // get accessor will invoke In the above example, when we assign a new value to the property, then thesetaccessor will be invoked and thegetaccessor will be invoked when we try to read the value from the property. C# Properties (Get, Set) Example Following is an example of defining propertieswithgetands

tutlane.com

So as I understand it { get; set; } is an "auto property" which just like @Klaus and @Brandon said is shorthand for writing a property with a "backing field." So in this case: public class Genre { private string name; // This is the backing field public string Name // This is your property { get => name; set => name = value; } } However if you're like me - about an hour or so ago - you don't really understand what properties and accessors are, and you don't have the best understanding of some basic terminologies either. MSDN is a great tool for learning stuff like this but it's not always easy to understand for beginners. So I'm gonna try to explain this more in-depth here. get and set are accessors, meaning they're able to access data and info in private fields (usually from a backing field) and usually do so from public properties (as you can see in the above example). There's no denying that the above statement is pretty confusing, so let's go into some examples. Let's say this code is referring to genres of music. So within the class Genre, we're going to want different genres of music. Let's say we want to have 3 genres: Hip Hop, Rock, and Country. To do this we would use the name of the Class to create new instances of that class. Genre g1 = new Genre(); //Here we're creating a new instance of the class "Genre" //called g1. We'll create as many as we need (3) Genre g2 = new Genre(); Genre g3 = new Genre(); //Note the () following new Genre. I believe that's essential since we're creating a //new instance of a class (Like I said, I'm a beginner so I can't tell you exactly why //it's there but I do know it's essential) Now that we've created the instances of the Genre class we can set the genre names using the 'Name' property that was set way up above. public string Name //Again, this is the 'Name' property { get; set; } //And this is the shorthand version the process we're doing right now We can set the name of 'g1' to Hip Hop by writing the following g1.Name = "Hip Hop"; What's happening here is sort of complex. Like I said before, get and set access information from private fields that you otherwise wouldn't be able to access. get can only read information from that private field and return it. set can only write information in that private field. But by having a property with both get and set we're able do both of those functions. And by writing g1.Name = "Hip Hop"; we are specifically using the set function from our Name property set uses an implicit variable called value. Basically what this means is any time you see "value" within set, it's referring to a variable; the "value" variable. When we write g1.Name = we're using the = to pass in the value variable which in this case is "Hip Hop". So you can essentially think of it like this: public class g1 //We've created an instance of the Genre Class called "g1" { private string name; public string Name { get => name; set => name = "Hip Hop"; //instead of 'value', "Hip Hop" is written because //'value' in 'g1' was set to "Hip Hop" by previously //writing 'g1.Name = "Hip Hop"' } } It's Important to note that the above example isn't actually written in the code. It's more of a hypothetical code that represents what's going on in the background. So now that we've set the Name of the g1 instance of Genre, I believe we can get the name by writing console.WriteLine (g1.Name); //This uses the 'get' function from our 'Name' Property //and returns the field 'name' which we just set to //"Hip Hop" and if we ran this we would get "Hip Hop" in our console. So for the purpose of this explanation I'll complete the example with outputs as well using System; public class Genre { public string Name { get; set; } } public class MainClass { public static void Main() { Genre g1 = new Genre(); Genre g2 = new Genre(); Genre g3 = new Genre(); g1.Name = "Hip Hop"; g2.Name = "Rock"; g3.Name = "Country"; Console.WriteLine ("Genres: {0}, {1}, {2}", g1.Name, g2.Name, g3.Name); } } Output: "Genres

stackoverflow.com

un ejemplo

¡Claro! Aquí tienes un ejemplo práctico de cómo utilizar la propiedad Valor en C#:

public MiClase { private int valor; public int Valor { get { valor; } set { valor = value; } } class Program { static void Main(string[] args { MiClase objeto = new MiClase(); // Asignar un valor a la propiedad objeto.Valor = 10; // Obtener el valor de la propiedad int resultado = objeto.Valor; Console.WriteLine("El valor es: " + resultado); } }

En este ejemplo, se define una clase MiClase que tiene una propiedad llamada Valor Dentro de la clase, la propiedad utiliza un campo privado valor` para almacenar su valor.

El accessor get permite obtener el valor de la propiedad, y el accessor set permite asignar un valor a la propiedad.

En el método Main, se crea una instancia de MiClase llamada objeto. Luego, se asigna el valor 10 a la propiedad Valor utilizando el accessor set. Finalmente, se obtiene el valor de la propiedad utilizando el accessor get y se imprime en la consola.

El resultado de este ejemplo será la impresión del mensaje: "El valor es: 10".

Espero que este ejemplo te ayude a comprender cómo se utiliza la propiedad Valor en C#. Si tienes más preguntas, ¡no dudes en hacerlas!

Artculo 04/07/2023 Las propiedades combinan aspectos de los campos y los mtodos. Para el usuario de un objeto, una propiedad que parece un campo. Para acceder a la propiedad se necesita la misma sintaxis. Para el implementador de una clase, una propiedad es uno o dos bloques de cdigo que representa un descriptor de acceso get o un descriptor de acceso set. El bloque de cdigo del descriptor de acceso get se ejecuta cuando se lee la propiedad; el bloque de cdigo del descriptor de acceso set se ejecuta cuando se asigna un nuevo valor a la propiedad. Una propiedad sin un descriptor de acceso set se considera de solo lectura. Una propiedad sin un descriptor de acceso get se considera de solo escritura. Una propiedad que tiene ambos descriptores de acceso es de lectura y escritura. En C#9 y versiones posteriores, puede usar un descriptor de acceso init en lugar de set para que la propiedad sea de solo lectura. A diferencia de los campos, las propiedades no se clasifican como variables. Por lo tanto, no puede pasar una propiedad como un parmetro ref u out. Las propiedades tienen muchos usos: pueden validar datos antes de permitir un cambio; pueden exponer claramente datos en una clase donde esos datos se recuperan de otros orgenes, como una base de datos; pueden realizar una accin cuando los datos se cambian, como generar un evento, o cambiar el valor de otros campos. Las propiedades se declaran en el bloque de clase especificando el nivel de acceso del campo, seguido del tipo de la propiedad, seguido del nombre de la propiedad y seguido de un bloque de cdigo que declara un descriptor de acceso get o un descriptor de acceso set. Por ejemplo: public class Date { private int _month = 7; // Backing store public int Month { get => _month; set { if ((value > 0) && (value < 13)) { _month = value; } } } } En este ejemplo, Month se declara como una propiedad, de manera que el descriptor de acceso set pueda estar seguro de que el valor Month se establece entre 1 y 12. La propiedad Month usa un campo privado para realizar un seguimiento del valor actual. La ubicacin real de los datos de una propiedad se conoce a menudo como la "memoria auxiliar" de la propiedad. Es habitual que las propiedades usen campos privados como memoria auxiliar. El campo se marca como privado para asegurarse de que solo puede cambiarse llamando a la propiedad. Para obtener ms informacin sobre las restricciones de acceso pblico y privado, vea Modificadores de acceso. Las propiedades implementadas automticamente proporcionan una sintaxis simplificada para las declaraciones de propiedad simples. Para obtener ms informacin, vea Propiedades implementadas automticamente. El descriptor de acceso get El cuerpo del descriptor de acceso get se parece al de un mtodo. Debe devolver un valor del tipo de propiedad. La ejecucin del descriptor de acceso get es equivalente a la lectura del valor del campo. Por ejemplo, cuando se devuelve la variable privada del descriptor de acceso get y se habilitan las optimizaciones, la llamada al mtodo de descriptor de acceso get se inserta mediante el compilador, de manera que no existe ninguna sobrecarga de llamada al mtodo. En cambio, un mtodo de descriptor de acceso get virtual no puede insertarse porque el compilador no conoce en tiempo de compilacin a qu mtodo puede llamarse realmente en tiempo de ejecucin. A continuacin se muestra un ejemplo de un descriptor de acceso get que devuelve el valor de un campo privado _name: class Employee { private string _name; // the name field public string Name => _name; // the Name property } Cuando hace referencia a la propiedad, excepto como el destino de una asignacin, el descriptor de acceso get se invoca para leer el valor de la propiedad. Por ejemplo: var employee= new Employee(); //... System.Console.Write(employee.Name); // the get accessor is invoked here El descriptor de acceso get debe finalizar en una instruccin return o throw, y el control no puede salir del cuerpo del descriptor de acceso. Ad

learn.microsoft.com

La mayora de los lenguajes de programacin orientado a objetos acceden a sus atributos a travs de mtodos. Esto lo vimos en el concepto anterior cuando accedamos al atributo monto de un cliente: public void Depositar(int m) { monto = monto + m; } public int RetornarMonto() { return monto; } Vimos que luego llamamos a dichos mtodos con la sintaxis: cliente3.Depositar(200); cliente3.Extraer(150); En C# normalmente este tipo de problemas se lo resuelve implementado una propiedad. Veamos el mismo problemas resolvindolo utilizando propiedades. Problema 1: El problema era : Un banco tiene 3 clientes que pueden hacer depsitos y extracciones. Tambin el banco requiere que al final del da calcule la cantidad de dinero que hay depositada. Programa: Ver video using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Propiedades1 { class Cliente { private string nombre; private int monto; public string Nombre { set { nombre = value; } get { return nombre; } } public int Monto { set { monto = value; } get { return monto; } } public void Imprimir() { Console.WriteLine(Nombre + " tiene depositado la suma de " + Monto); } } class Banco { private Cliente cliente1, cliente2, cliente3; public Banco() { cliente1 = new Cliente(); cliente1.Nombre = "Juan"; cliente1.Monto = 0; cliente2 = new Cliente(); cliente2.Nombre = "Ana"; cliente2.Monto = 0; cliente3 = new Cliente(); cliente3.Nombre = "Pedro"; cliente3.Monto = 0; } public void Operar() { cliente1.Monto = cliente1.Monto + 100; cliente2.Monto = cliente2.Monto + 150; cliente3.Monto = cliente3.Monto + 200; } public void DepositosTotales() { int t = cliente1.Monto + cliente2.Monto + cliente3.Monto; Console.WriteLine("El total de dinero en el banco es:" + t); cliente1.Imprimir(); cliente2.Imprimir(); cliente3.Imprimir(); } static void Main(string[] args) { Banco banco1 = new Banco(); banco1.Operar(); banco1.DepositosTotales(); Console.ReadKey(); } } } Lo ms importante es entender que una propiedad es una forma de acceder al contenido de un atributo, tanto para consultar su valor como modificarlo. private string nombre; private int monto; public string Nombre { set { nombre = value; } get { return nombre; } } public int Monto { set { monto = value; } get { return monto; } } La propiedad Nombre mediante el modificador set inicializa el atributo nombre con el valor que llega del objeto: cliente1.Nombre = "Juan"; Como vemos donde definimos el objeto cliente1 accedemos a la propiedad mediante el operador punto y le asignamos un valor (en este caso un string porque la propiedad es de tipo string) Si queremos consultar el atributo nombre lo podemos hacer mediante la propiedad Nombre. Es comn definir el nombre que le damos a la propiedad con el mismo nombre que tiene el atributo pero con el primer caracter en maysculas: //atributo en minsculas private int monto; //nombre de la propiedad con el mismo nombre pero en maysculas. public int Monto { set { monto = value; } get { return monto; } } Podemos observar que la sintaxis para acceder a las propiedades donde definimos objetos es mucho mas intuitiva y sencillas, por ejemplo para saber cuanto dinero hay en el banco la sintaxis con propiedades es: int t = cliente1.Monto + cliente2.Monto + cliente3.Monto; Y como la vimos anteriormente por medio de un mtodo que retorna el monto tenemos la siguiente sintaxis: int t = cliente1.RetornarMonto () + cliente2.RetornarMonto () + cliente3.RetornarMonto (); Lo primero que nos viene a la mente es porque no definir los atributos con el modificador public : public int monto; Para luego poder consultarlos y/o modificarlos con la sintaxis: int t = cliente1.monto + cliente2.monto + cliente3.monto; Ahora veamos que cuando consultamos o inicializamos una propiedad en realidad lo que est sucediendo es la ejecucin de un mtodo (set o get) donde podemos disponer cdigo donde validar el valor asignado. Por ejemplo si disponemos la restriccin que el Monto siempre debe ser

tutorialesprogramacionya.com

El aprendizaje contirnuar en segundos... Los modificadores de acceso nos introducen al concepto de encapsulamiento. El encapsulamiento busca de alguna forma controlar el acceso a los datos que conforman un objeto o instancia, de este modo podramos decir que una clase y por ende sus objetos que hacen uso de modificadores de acceso (especialmente privados) son objetos encapsulados. Los modificadores de acceso permiten dar un nivel de seguridad mayor a nuestras aplicaciones restringiendo el acceso a diferentes atributos, mtodos, constructores asegurndonos que el usuario deba seguir una "ruta" especificada por nosotros para acceder a la informacin. Es muy posible que nuestras aplicaciones vayan a ser usadas por otros programadores o usuarios con cierto nivel de experiencia; haciendo uso de los modificadores de acceso podremos asegurarnos de que un valor no ser modificado incorrectamente por parte de otro programador o usuario. Generalmente el acceso a los atributos se consigue por medio de los mtodos get y set, pues es estrictamente necesario que los atributos de una clase sean privados. Nota: Siempre se recomienda que los atributos de una clase sean privados y por tanto cada atributo debe tener sus propios mtodos get y set para obtener y establecer respectivamente el valor del atributo. Nota 2: Siempre que se use una clase de otro paquete, se debe importar usando import. Cuando dos clases se encuentran en el mismo paquete no es necesario hacer el import pero esto no significa que se pueda acceder a sus componentes directamente. Veamos un poco en detalle cada uno de los modificadores de acceso Modificador de acceso private El modificador private en Java es el ms restrictivo de todos, bsicamente cualquier elemento de una clase que sea privado puede ser accedido nicamente por la misma clase por nada ms. Es decir, si por ejemplo, un atributo es privado solo puede ser accedido por lo mtodos o constructores de la misma clase. Ninguna otra clase sin importar la relacin que tengan podr tener acceso a ellos. package aap.ejemplo1; public class Ejemplo1 { private int atributo1;//Este atributo es privado private int contador = 0; //Contador de registro //Si un atributo es privado podemos crear mtodo get y set ... //... para ste y permitir el acceso a l desde otras instancias public void setAtributo1(int valor) { contador++;//Contador que lleva el registro de ediciones del atributo1 atributo1 = valor;//Establecemos el valor del atributo } public int getAtributo1() { return atributo1;//Retornamos el valor actual del atributo } //Get para el contador public int getContador() { return contador; } //Notar que no ponemos un set, pues no nos interesa que el contador pueda ser cambiado. } En el ejemplo anterior vemos lo que mencion al comiendo, tenemos un atributo privado y permitimos el acceso a l nicamente por medio de los mtodos de get y set, notemos que estos mtodos son pblicos y por tanto cualquiera puede accederlos. Lo realmente interesante con los mtodos get y set es que nos permiten realizar cualquier operacin como por ejemplo llevar una cuenta de la veces que se estableci el valor para el atributo permitindonos mantener nuestro sistema sin problemas. Tambin debemos notar que debido a que los mtodos get y set son propios de la clase no tienen problemas con acceder al atributo directamente. El modificador por defecto (default) Java nos da la opcin de no usar un modificador de acceso y al no hacerlo, el elemento tendr un acceso conocido como defaulto acceso por defecto que permite que tanto la propia clase como las clases del mismo paquete accedan a dichos componentes (de aqu la importancia de declararle siempre un paquete a nuestras clases). package aap.ejemplo2; public class Ejemplo2 { private static int atributo1;//Este atributo es privado static int contador = 0; //Contador con acceso por defecto public static void setAtributo1(int valor) { contador++;//Contador que lleva el registro de ediciones del atributo1 atributo1 = valor;//Establec

programarya.com