2015-12-18 2 views
-2

поэтому у меня этот код. Мне нужно создать цикл for, который проверяет все символы в строке и проверяет, все ли они действительны (So numbers from 0-> 7). Но я не знаю, как это писать, я что-то пробовал, но это не сработало. Вот примеры: пользователь вводит: 77, код работает, пользователь вводит 99, код не работает, пользователь вводит 5., код не работает, и т.д ..C# для случая в строке (простой)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace NALOGA1 
{ 
    class Program 
    { 
     static string decToOct(int stevilo)//v mojon primere 7 
     { 
      string izhod = ""; 
      //7>0 DRŽI 
      while (stevilo > 0) 
      { 
       //izhodi se dodeli ostanek deljenja z 8 keri se spremeni v string 
       izhod = (stevilo % 8) + izhod; 
       //7/8; 
       stevilo /= 8; 
      } 
      return izhod; 
     } 

     static int Octtodesetisko(string stevilo) 
     { 

      double vsota = 0; 
      for (int i = stevilo.Length - 1; i >= 0; i--) 
      { 

       int stevka = stevilo[i] - '0'; 
       vsota += (stevka * Math.Pow(8, i)); 
      } 

      return (int)vsota; 
     } 


     static void Main(string[] args) 
     { 



      //3 podprogram-in progress 


      string prvastevilka = Console.ReadLine(); 



      int prvasprememba = Int32.Parse(prvastevilka); 
      if (prvasprememba > 0) 
      { 
       Console.WriteLine(decToOct(prvasprememba)); 

      } 
      else 
      { 
       Console.WriteLine("Napaka"); 
      } 


       string drugastevilka = Console.ReadLine(); 
       int drugasprememba = Octtodesetisko(drugastevilka); 
       foreach (char znak in drugastevilka) 
       { 
        if(znak!=1 || znak!=2 || znak!=3 || znak!=4 || znak!=5 || znak!=6 || znak!=7) 
        { 
         Console.WriteLine("Napaka"); 
        } 
        else 
        { 
         Console.WriteLine("dela :D"); 
        } 
       } 
       Console.ReadKey(); 
     } 
    } 

} 
+1

Определить _works_ и _doesn't work_ ясно. –

+3

Хотя технически можно следить за потоком программы, просто глядя на логику, это было бы ДЕЙСТВИТЕЛЬНО полезно, если бы вы перевели все на английский. Сокращает накладные расходы на тонну для людей, пытающихся помочь. – kai

+0

вам не нужно проверять каждый символ; 'if (znak> = '0' && znak <= '7') {// valid}' - вы также в настоящее время исключаете '0' –

ответ

1

Лично я бы воспользоваться метода LINQ Enumerable.All выразить это в очень сжатой и читаемым образом:

if (str.Any() && str.All(c => c >= '0' && c <= '7')) 
{ 
    Console.WriteLine("good"); 
} 
else 
{ 
    Console.WriteLine("bad"); 
} 

EDIT: нет LINQ

это не трудно перевести то, что метод LINQ Enumerable.All делает для нормального цикла. Это просто более многословен:

bool isValid = true; 
foreach (char c in str) 
{ 
    if (c < '0' || c > '7') 
    { 
     isValid = false; 
     break; 
    } 
} 

if (str.Length != 0 && isValid) 
{ 
    Console.WriteLine("good"); 
} 
else 
{ 
    Console.WriteLine("bad"); 
} 
+0

не разрешено использовать liq извините – averagejoex

+0

Ok, no liq. Но как насчет LINQ? :) – sstan

+0

Wow выше описанный метод работает, но как насчет пустой строки? – averagejoex

1

Во-первых, там, кажется, ошибка в линии

if(znak!=1 || znak!=2 || znak!=3 || znak!=4 || znak!=5 || znak!=6 || znak!=7) 

Я думаю, что следует читать

if(znak!='1' || znak!='2' || znak!='3' || znak!='4' || znak!='5' || znak!='6' || znak!='7') 

, который должен быть сжат до

if (znak >= '0' && znak <= '7') 

Вы можете нам е LINQ вместо петли for вот так:

if (drugastevilka.All(c => c >= '0' && c <= '7') 
    Console.WriteLine("dela :D"); 
else 
    Console.WriteLine("Napaka"); 

Но самое лучшее решение, вероятно, использовать регулярное выражение:

Regex regex = new Regex("^[0-7]+$"); 
if (regex.IsMatch(drugastevilka)) 
    Console.WriteLine("dela :D"); 
else 
    Console.WriteLine("Napaka"); 

Edit: решение LINQ показано принимает пустые строки, то регулярное выражение (как показано) требуется не менее 1 символа. Переведите + с *, и он также примет пустые строки. Но я не думаю, что вы хотите принять пустые строки.

+0

не разрешено использовать liq извините – averagejoex

+0

@averagejoex Я уже догадался, что. Я бы предпочел регулярное выражение, но если ваша задача включает использование цикла for, используйте, по крайней мере, 'if (znak> = '0' && znak <= '7')' вместо проверки каждого отдельного случая. –

0

Вы Мессинг с типом данных Вы можете попробовать с кодом ниже

static string decToOct(int stevilo)//v mojon primere 7 
     { 
      int izhod = 0; 
      //7>0 DRŽI 
      while (stevilo > 0) 
      { 
       //izhodi se dodeli ostanek deljenja z 8 keri se spremeni v string 
       izhod = (stevilo % 8) + izhod; 
       //7/8; 
       stevilo /= 8; 
      } 
      return (izhod.ToString()); 
     } 
+0

не работает afsaf – averagejoex

0

А что-то вроде этого?

class Program 
{ 
    static void Main(string[] args) 
    { 
     string someString = "1234567"; 
     string someOtherString = "1287631"; 
     string anotherString = "123A6F2"; 

     Console.WriteLine(IsValidString(someString)); 
     Console.WriteLine(IsValidString(someOtherString)); 
     Console.WriteLine(IsValidString(anotherString)); 

     Console.ReadLine(); 
    } 

    public static bool IsValidString(string str) 
    { 
     bool isValid = true; 

     char[] splitString = str.ToCharArray(); //get an array of each character 

     for (int i = 0; i < splitString.Length; i++) 
     { 
      try 
      { 
       double number = Char.GetNumericValue(splitString[i]); //try to convert the character to a double (GetNumericValue returns a double) 

       if (number < 0 || number > 7) //we get here if the character is an int, then we check for 0-7 
       { 
        isValid = false; //if the character is invalid, we're done. 
        break; 
       } 
      } 
      catch (Exception) //this will hit if we try to convert a non-integer character. 
      { 

       isValid = false; 
       break; 
      }     
     } 

     return isValid; 
    } 
} 

IsValidString() принимает string, преобразует его в Char array, затем проверяет каждое значение, как, например:

Get the numeric value Check if the value is between 0-7

GetNumericValue подведет на нецелых характер, поэтому мы обернуть его в try/catch - если мы попали в исключение, мы знаем, что isValid = false, поэтому мы break. Если мы получим действительный номер, и это не между 0-7, мы также знаем, что isValid = false, поэтому мы break.

Если мы пройдем через весь список, строка верна.

Образец приведенный выше возвращений:

IsValidString(someString) == true

IsValidString(someOtherString) == false

IsValidString(anotherString) == false

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