Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C#] ошибки в программе со строкам


Автор: ArniLand 11.4.2010, 19:38
Написал программу по следующему заданию. При компиляции выдает ошибки помогите их исправить пожалуйста. Если возможно, подправите пожалуйста мою программу и выдайте ее правильный вариант. Также покажите пожалуйста как реализовать в program.cs вывод символов в верхнем регистре и результат подсчета количества гласных букв.
Задание:
Класс инкапсулирует одномерный массив из элементов символьного типа. Создать индексатор, который предотвращает нарушение границы массива и возвращает символ лишь в верхнем регистре. Создать свойство, доступное для чтения закрытого элемента - данного, что содержит количество гласных букв в массиве. Результат выполнение вывести на экран. В Program.cs реализовать сам вывод на экран.

Ошибки:
Цитата

c:\WINDOWS\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:DEBUG;TRACE /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.DataSetExtensions.dll" /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:"C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll" /debug+ /debug:full /filealign:512 /optimize- /out:"obj\Debug\laba index.exe" /target:exe Program.cs Properties\AssemblyInfo.cs Row.cs
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(13,33): error CS0236: A field initializer cannot reference the non-static field, method, or property 'laba_index.Row.charray'
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(12,16): (Related location)
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(26,31): error CS0029: Cannot implicitly convert type 'bool' to 'int'
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(31,31): error CS0029: Cannot implicitly convert type 'bool' to 'int'
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(32,28): error CS0031: Constant value '0' cannot be converted to a 'char'
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(39,21): error CS0200: Property or indexer 'string.this[int]' cannot be assigned to -- it is read only
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(40,31): error CS0029: Cannot implicitly convert type 'bool' to 'int'
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(44,31): error CS0029: Cannot implicitly convert type 'bool' to 'int'
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(64,29): error CS0151: A value of an integral type expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(66,30): error CS0029: Cannot implicitly convert type 'char' to 'method group'
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(67,30): error CS0029: Cannot implicitly convert type 'char' to 'method group'
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Row.cs(70,24): error CS0266: Cannot implicitly convert type 'int' to 'char'. An explicit conversion exists (are you missing a cast?)
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,33): error CS1525: Invalid expression term 'char'
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,34): error CS0443: Syntax error; value expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,36): error CS1026: ) expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,46): error CS1525: Invalid expression term '{'
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,47): error CS1002: ; expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,51): error CS1002: ; expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,51): error CS1525: Invalid expression term ','
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,53): error CS1002: ; expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,57): error CS1002: ; expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,57): error CS1525: Invalid expression term ','
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,59): error CS1002: ; expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,62): error CS1002: ; expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,62): error CS1525: Invalid expression term ','
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,64): error CS1002: ; expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,67): error CS1002: ; expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,67): error CS1525: Invalid expression term ','
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,69): error CS1002: ; expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,72): error CS1002: ; expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,72): error CS1525: Invalid expression term ','
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,74): error CS1002: ; expected
D:\Мои документы\Visual Studio 2008\Projects\laba index\laba index\Program.cs(12,77): error CS1002: ; expected


Код программы:
Код

//Row.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace laba_index
{
    class Row
    {
        public int Length;
        public int errflag;
        char[] charray;
        string str = new string(charray);

        public Row(string str)
        {
            this.str = str;
        }

        public char this[int i]
        {
            get
            {
                if (ok(i))
                {
                    errflag = false;
                    return Char.ToUpper(str[i]);
                }
                else
                {
                    errflag = true;
                    return 0;
                }
            }
            set
            {
                if (ok(i))
                {
                    str[i] = value;
                    errflag = false;
                }
                else
                {
                    errflag = true;
                }
            }
        }
        private bool ok(int i)//метод возвращает значение true, если индекс в пределах границ
        {
            if (i >= 0 & i < Length)
                return true;
            return false;
        }



        public char VowelsCount
        {
            get
            {
                int count = 0;
                foreach (char c in charray)
                {
                    switch (char.ToUpper)
                    {
                        case 'A': count++; break;
                        case 'E': count++; break;
                    }
                }
                return count;
            }
        }
    }
}

//Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace laba_index
{
    class Program
    {
        static void Main(string[] args)
        {
            Row r = new Row(char[] charray = {'A' , 'b' , 'E', 'r', 't', 'y'};
        }
    }
}


    
       
   




                
               





        
    



Автор: Fortnox 11.4.2010, 19:55
Скажем, вот так:
Код

 class Row
    {
        private int _length;
        private int _vowelsCount;
        private readonly char[] _vowels = { 'a', 'e', 'y', 'u', 'i', 'o', };
        private char[] _array;

        public Row(char[] chars)
        {
            _array = chars;
            _length = chars.Length;
        }

        public Row()
        {
            _length = 0;
            _array = new char[0];
        }

        public char this[int index]
        {
            get
            {
                // если запрашиваемый элемент находитися
                // за пределами массива, бросам исключение
                if (index < _length || index > _length)
                    throw new ArgumentOutOfRangeException("index", index, "Индекс находился за пределами массива");

                return char.ToUpper(_array[index]);
            }
        }

        public int VowelsCount
        {
            get
            {
                int count = 0;

                // Подсчитываем гласные в массиве
                foreach (char c in _array)
                {
                    switch (char.ToUpper(c))
                    {
                        case 'A': count++; break;
                        case 'E': count++; break;
                        case 'I': count++; break;
                        case 'O': count++; break;
                        case 'U': count++; break;
                        case 'Y': count++; break;
                    }
                }
                return count;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                Row row = new Row(new char[] { 'i', 't', 's', 't', 'r', 'i', 'n', 'g' });

                // Раскомментировать для исключения
                // Console.WriteLine(row[-1]);

                Console.Write("Vowels count: {0}", row.VowelsCount);
                Console.ReadLine();
            }
            catch (Exception error)
            {
                Console.WriteLine(error.Message);
                Console.ReadLine();
            }
        }
    }

Автор: ArniLand 11.4.2010, 20:02
откомпилировал ваш вариант программы, выдает такие ошибки, как их исправить?
Цитата

D:\Documents\Visual Studio 2008\Projects\ConsoleApplication4\ConsoleApplication4\Program.cs(24,27): error CS0246: The type or namespace name 'ArgumentOutOfRangeException' could not be found (are you missing a using directive or an assembly reference?)
D:\Documents\Visual Studio 2008\Projects\ConsoleApplication4\ConsoleApplication4\Program.cs(59,13): error CS0103: The name 'Console' does not exist in the current context
D:\Documents\Visual Studio 2008\Projects\ConsoleApplication4\ConsoleApplication4\Program.cs(60,13): error CS0103: The name 'Console' does not exist in the current context
D:\Documents\Visual Studio 2008\Projects\ConsoleApplication4\ConsoleApplication4\Program.cs(62,16): error CS0246: The type or namespace name 'Exception' could not be found (are you missing a using directive or an assembly reference?)
D:\Documents\Visual Studio 2008\Projects\ConsoleApplication4\ConsoleApplication4\Program.cs(64,13): error CS0103: The name 'Console' does not exist in the current context
D:\Documents\Visual Studio 2008\Projects\ConsoleApplication4\ConsoleApplication4\Program.cs(65,13): error CS0103: The name 'Console' does not exist in the current context


Автор: Fortnox 11.4.2010, 20:07
В начале файла проверьте импорт типов из пространств имен:
(это должно быть в начале файла)
Код
using System;
using System.Collections.Generic;
using System.Text;

Автор: ArniLand 11.4.2010, 20:12
так как я не сильно разбираюсь в шарпе, просьба к вам объяснить пожалуйста, что делают вот эти строчки?:
Код

private readonly char[] _vowels = { 'a', 'e', 'y', 'u', 'i', 'o', };


Код

throw new ArgumentOutOfRangeException("index", index, "Индекс находился за пределами массива");


Код

catch (Exception error)

Автор: Fortnox 11.4.2010, 20:29
ArniLand, конечно:
Код

private readonly char[] _vowels = { 'a', 'e', 'y', 'u', 'i', 'o', };

Объявляем массив char, состоящий из гласных, делаем его readonly (инициализация массива во время объявления). 
Эту строчку можно удалить, я недоглядел, что она не используется в принципе.

Код

throw new ArgumentOutOfRangeException("index", index, "Индекс находился за пределами массива");

Сообщаем (throw) об исключении (ошибке) ArgumentOutOfRange (аргумент вне допустимого предела значений, в данном случае либо меньше 0, либо больше размера массива). В качестве информации об ошибке передаем:
"index" - имя параметра (переменной), который вызвал ошибку
index -  значение index
3 параметр - информационное сообщение.
Можно было конечно просто возвращать символ какой-нибудь, например 'N', но лучше вызвать ошибку, чтобы ее можно было перехватить и, если нужно, вывести пользователю сообщение. Для этого, в Main, я использовал связку try-catch - грубо говоря, код, исполняемый в блоке try{...}, защищен, если происходит исключение (возникает ошибка), в зависимости от типа ошибки, она обрабатывается в блоке catch{...}, где выводится сообщение об ошибке для пользователя.

Код

catch (Exception error)

Тут собственно, обработка (перехват) всех ошибок, так как класс Exception является базовым для всех других классов для обработки ошибок.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)