Скрипт на VBA за извличане на текст от AutoCAD чертежи в списък на екрана.
Тест с CAD файл, съдържащ около 10000 линии, сериозно забави генерирането на 10000 shape обекта и показването им на картата.
Идея за простичка програма за визуализиране на CAD файлове (файлове съдържащи кадастрални данни).
CAD файловете са файлове, съдържащи данни за точки, линии (граници на имоти), текстове, контури и други данни.
Програмата ще използва библиотеката MapWinGIS.
MapWinGIS е библиотека, предлагаща възможност за визуализиране на данни от shape файлове, изображения, TIN и други формати. Поддържа се също и атрибутна информация.
Пренасяне на ориентировъчни ъгли
За да се пренесе ориентировъчния ъгъл O(I) от станция I, на която O(I) е известен, в точка J е необходимо да има измерени посоки от точка I към точка J и обратно.
Първо се изчислява посочния ъгъл α(I, J) от точка I към точка J:
посочен ъгъл α(I, J) = ориентировъчен ъгъл O(I) + посока R(I, J);
След това се изчислява обратния посочен ъгъл α(J, I) = α(I, J) ± 200 гради.
Накрая се изчислява ориентировъчния ъгъл O(J) = α(J, I) – R(J, I).
Проект в GitHub на програмата ПИПМ (Параметрично изравнение на планови мрежи).
Връзка:
https://github.com/Nanich87/least-squares-adjustment-of-survey-networks
Описание:
ПИПМ е програма за изравнение на геодезически мрежи чрез МНМК (Метод на най-малките квадрати).
Конзолна програма на C# за изравнение на ъглово-линейни мрежи
Проектът ще включва изравнение на ъглово-линейни мрежи по метода на най-малките квадрати и оценка на точността. Програмният език ще е C#. Входните данни ще се четат от kor и dpi файлове, съдържащи данни за дадените точки и измерванията.
Проектът ще бъде разделен на няколко отделни задачи (проблеми):
- Създаване на клас Point за дефиниране на дадените точки в мрежата;
- Прочитане на входните данни от kor файла и добавянето им в списък (List) от тип Point;
- Създаване на клас Station за дефиниране на станциите в мрежата;
- Създаване на клас Observation за дефиниране на измерванията в мрежата;
- Прочитане на станциите и измерванията от dpi файла, и добавянето им съответно в списъци (List) от тип Station и Observation;
- Дефиниране на клас PointDetermination, съдържащ методи за определяне на приблизителни координати на новите точки чрез засечки – права, обратна и линейна;
- Определяне на приблизителните координати на новите точки;
- Изчисляване на посочните ъгли;
- Изчисляване на ориентировъчните ъгли на станциите;
- Изчисляване коефициентите пред неизвестните в ураненията на поправките (съставяне на уравнение за всяка измерена посока и дължина);
- Елиминиране на ориентировъчното неизвестно в уравненията на поправките;
- Съставяне и решаване на система нормални уравнения;
- Определяне най-вероятните стойности на координатите на новите точки;
- Оценка на точността;
Задачите могат да претърпят промени в процеса на работа по проекта!
Връзки:
C# програмиране – част II | Онлайн | 10 от 10 | 279 от 500 | Взет! Точки: 61.10 Място: 181 |
За 21 точки не е взет с отличие, но можеха да са и 121 точки.
Поуката е повече подготовка за изпита по Обектно-ориентирано програмиране (ООП).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StrangeLandNumbers {
class Program {
static void Main(string[] args) {
Dictionary strangeLandNumbersDictionay = new Dictionary();
strangeLandNumbersDictionay.Add("f", 0);
strangeLandNumbersDictionay.Add("bIN", 1);
strangeLandNumbersDictionay.Add("oBJEC", 2);
strangeLandNumbersDictionay.Add("mNTRAVL", 3);
strangeLandNumbersDictionay.Add("lPVKNQ", 4);
strangeLandNumbersDictionay.Add("pNWE", 5);
strangeLandNumbersDictionay.Add("hT", 6);
List strangeLandNumbersList = new List();
string strangeLandNumber = Console.ReadLine();
StringBuilder number = new StringBuilder();
for (int index = 0; index < strangeLandNumber.Length; index++) {
number.Append(strangeLandNumber[index]);
if (strangeLandNumbersDictionay.ContainsKey(number.ToString())) {
strangeLandNumbersList.Add(number.ToString());
number.Clear();
}
}
int power = strangeLandNumbersList.Count - 1;
long sum = 0;
for (int index = 0; index < strangeLandNumbersList.Count; index++) {
sum += strangeLandNumbersDictionay[strangeLandNumbersList[index]] * (long) Math.Pow(7, power);
number.Clear();
power--;
}
Console.WriteLine(sum);
}
}
}
Изпита на 22.01.2014 (сутрин) приключи със среден резултат, само 279 точки, но изводите са вече направени – необходимо е повече старание и време за по-добър резултат.
Задачите бяха много интересни, а за следващия курс по C# част 2 ще се постарая да съм решил всички давани задачи до момента, плюс тези от Алго академията.
using System;
using System.Text;
using System.Linq;
using System.Collections.Generic;
namespace DecodeAndDecrypt {
class Program {
static void Main() {
string encodedMessage = Console.ReadLine();
List cypherDigitsList = new List();
for (int letterIndex = encodedMessage.Length - 1; letterIndex >= 0; letterIndex--) {
if (Char.IsDigit(encodedMessage[letterIndex])) {
cypherDigitsList.Add(encodedMessage[letterIndex]);
} else {
break;
}
}
cypherDigitsList.Reverse();
int cypherLenght = int.Parse(string.Join(string.Empty, cypherDigitsList.ToArray()));
string decodedMessage = Decode(encodedMessage, cypherLenght.ToString().Length);
int cypherStartIndex = decodedMessage.Length - cypherLenght;
string cypher = decodedMessage.Substring(cypherStartIndex, cypherLenght);
int encryptedMessageLength = decodedMessage.Length - cypher.Length;
string encryptedMessage = decodedMessage.Substring(0, encryptedMessageLength);
Console.WriteLine(Decrypt(encryptedMessage, cypher));
}
static string Decrypt(string encryptedMessage, string cypher) {
char[] cypherText = new char[encryptedMessage.Length];
int index = 0;
if (cypher.Length < encryptedMessage.Length) {
for (int i = 0; i < encryptedMessage.Length; i++) {
if (index == cypher.Length) {
index = 0;
}
cypherText[i] = (char)((FindLetterIndex((encryptedMessage[i])) ^ FindLetterIndex(cypher[index])) + 65);
index++;
}
} else {
for (int i = 0; i < cypher.Length; i++) {
if (index == encryptedMessage.Length) {
index = 0;
}
if (i >= encryptedMessage.Length) {
cypherText[index] = (char)((FindLetterIndex((cypherText[index])) ^ FindLetterIndex(cypher[i])) + 65);
} else {
cypherText[index] = (char)((FindLetterIndex((encryptedMessage[index])) ^ FindLetterIndex(cypher[i])) + 65);
}
index++;
}
}
string encryptedText = string.Join(string.Empty, cypherText);
return encryptedText;
}
static string Decode(string message, int cypherDigitsCount) {
StringBuilder decodedMessage = new StringBuilder();
StringBuilder letterMultiplier = new StringBuilder();
for (int i = 0; i < message.Length - cypherDigitsCount; i++) {
if (Char.IsDigit(message[i])) {
letterMultiplier.Append(Char.GetNumericValue(message[i]));
} else {
if (letterMultiplier.Length > 0) {
decodedMessage.Append(new string(message[i], int.Parse(letterMultiplier.ToString())));
letterMultiplier.Clear();
} else {
decodedMessage.Append(message[i]);
}
}
}
return decodedMessage.ToString();
}
static int FindLetterIndex(char letter) {
int index = (letter < 97 ? letter - 65 : letter - 97);
return index;
}
}
}