Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2009, 14:34   #1
pavelslap
Пользователь
 
Регистрация: 08.02.2009
Сообщений: 73
Смущение Подскажите, пожалуйста

From Stilet: Ану бегом читать правила! В баню за такое название темы.

Добрый день, коллеги! Я тут написал небольшую программку, но без обломов не обошлось. При выводе на экран второго по величине элемента массива выскакивает число 2009249812. Диапазон случайных чисел в массиве запланирован от 16 до 48, а кол-во элементов - 16. Помогите, пожалуйста разобраться что не так..

Код:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <windows.h>
#include <math.h>

const int A=16, B=3, X=A%10+10;
int wx1=1,wy1=1,wx2=80,wy2=25,y=4,klav;
bool massiv_sozdan=false;

void getxy(int *x, int *y) {
  CONSOLE_SCREEN_BUFFER_INFO  csbInfo;
  GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
  *x = csbInfo.dwCursorPosition.X;
  *y = csbInfo.dwCursorPosition.Y;
}

void clreol() {
  int i,x,y;
  COORD a = { 80, 1 }; COORD b;
  SMALL_RECT r;
  DWORD len;
  CHAR_INFO str[81];
	for(i = 0; i < 80; i++) {
		str[i].Char.AsciiChar = ' ';
		str[i].Attributes     = 0x07;
	}
  getxy(&x, &y);
  len = 80 - x;
  b.X = 0; b.Y = 0;
  r.Top = y; r.Left = x; r.Bottom = y+1; r.Right = (SHORT)(x + len);
  WriteConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE), str, a, b, &r);
}

void gotoxy(int x,int y) {
 x=wx1+x-1;
 y=wy1+y-1;
 COORD cur={x-1,y-1};
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cur);
}

void color(int color, int bgcolor) {
 HANDLE hStdout;
 hStdout=GetStdHandle(STD_OUTPUT_HANDLE);
 SetConsoleTextAttribute(hStdout,color+(bgcolor*16));
}

void put_pointer() {
 color(11,0);
 printf("=>");
 color(15,0);
}

void del_3lines() {
 gotoxy(2,12); clreol(); 
 gotoxy(2,13); clreol();
 gotoxy(2,14); clreol();
}

void menu() {
 klav=getch();
 while (klav!=13) {
  switch(klav=getch()) {
       case 80: if(y<8)y++; gotoxy(1,y-1); printf("  "); gotoxy(1,y); put_pointer(); break;
       case 72: if(y>4)y--; gotoxy(1,y+1); printf("  "); gotoxy(1,y); put_pointer(); break;
  }                
 }
}

int main() {
 system("cls");
 color(15,0);
 printf("Pavels Slapins, D3-2, 18.11.2009, 3.uzd., 7,17,27 var. \n Konstantes: A=%d, B=%d, X=%d\n\n",A,B,X);
 printf("   1) Sozdatj massiv i vivesti ego na ekran\n   2) Najti maksmalnij nomer(neskolko)\n   3) Najti nomera, u kotorih poslednee chislo sovpadaet s B\n   4) Najti nomera, kotorije bolshe raznici pervogo i poslednego chisla massiva\n   5) Vijti iz programmi");
 gotoxy(1,y); put_pointer();

 while (y!=8) {
 menu();         
 int num, max=X, max2=X, max3=X, with3=0; //num - sshetchik v operacijah (1-4)                            
 if (klav==13) {
  switch(y) {
       case 4: 
        int mas[X]; 
        gotoxy(2,10);
        srand((unsigned)time(NULL));
         for(num=0;num<X;num++) printf("%d ",mas[num]=rand()%(1+A*B-A)+A); 
         del_3lines();
         massiv_sozdan=true; 
        break;
       case 5:
         if (massiv_sozdan==true) {
          for(num=0;num<X;num++) if(mas[num]>max)max=mas[num];
          gotoxy(2,12); clreol(); printf("Maksimalnij nomer massiva = %d",max);
          for(num=X;num>0;num--) {if(mas[num]!=max){if(mas[num]>max2)max2=mas[num];}}
          gotoxy(2,13); clreol(); printf("Vtoroj po velichine nomer massiva = %d",max2); 
          for(num=X;num>0;num--) {if((mas[num]!=max)&&(mas[num]!=max2)){if(mas[num]>max3)max3=mas[num];}}
          gotoxy(2,14); clreol(); printf("Tretij po velichine nomer massiva = %d",max3); 
         }
         else {
          gotoxy(2,10); printf("Massiv ne bil sozdan! Viberite pervij punkt!");
         } 
        break; 
       case 6:   
          if (massiv_sozdan==true) {
           del_3lines(); printf("Nomera, u kotorih poslednee chislo sovpadaet s B(3): "); 
           for(num=0;num<X;num++) {if(mas[num]%10==B) {with3=mas[num]; printf("%d ",with3);}};
           if (with3==0)printf("takih nomerov NET!");                                                  
          }
         else {
          gotoxy(2,10); printf("Massiv ne bil sozdan! Viberite pervij punkt!");
         } 
        break;
       case 7: 
          if (massiv_sozdan==true) {
           del_3lines(); 
           //operacii                        
          }
         else {
          gotoxy(2,10); printf("Massiv ne bil sozdan! Viberite pervij punkt!");
         }       
       break;   
  } 
 }        
 }
}

Последний раз редактировалось Stilet; 23.11.2009 в 14:55.
pavelslap вне форума Ответить с цитированием
Старый 23.11.2009, 15:23   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

У меня нормально работает )
netrino вне форума Ответить с цитированием
Старый 23.11.2009, 15:39   #3
pavelslap
Пользователь
 
Регистрация: 08.02.2009
Сообщений: 73
Радость

Между прочим у меня компилятор Dev v. 4.9.9.2
pavelslap вне форума Ответить с цитированием
Старый 23.11.2009, 15:48   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Действительно, в код закралась ошибка
Код:
for(num=0;num<X;num++) if(mas[num]>max)max=mas[num];
          gotoxy(2,12); clreol(); printf("Maksimalnij nomer massiva = %d",max);
          for(num=X;num>0;num--) {if(mas[num]!=max){if(mas[num]>max2)max2=mas[num];}}
          gotoxy(2,13); clreol(); printf("Vtoroj po velichine nomer massiva = %d",max2); 
          for(num=X;num>0;num--) {if((mas[num]!=max)&&(mas[num]!=max2)){if(mas[num]>max3)max3=mas[num];}}
Не следует забывать, что индексация начинается с 0, потому самый последний элемент - X-1. Поменяйте в двух цикла num = X на num = X-1.
netrino вне форума Ответить с цитированием
Старый 23.11.2009, 16:43   #5
pavelslap
Пользователь
 
Регистрация: 08.02.2009
Сообщений: 73
Радость

большое спасибо!
pavelslap вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пожалуйста,подскажите tcitr Компьютерное железо 9 12.09.2009 00:54
Подскажите, пожалуйста grandge Помощь студентам 0 01.05.2009 16:03
подскажите пожалуйста beygul Общие вопросы Delphi 8 28.09.2008 14:11
--==подскажите пожалуйста==-- HAMMAN Помощь студентам 3 20.01.2007 20:50
подскажите, пожалуйста, Lena2 Microsoft Office Excel 2 03.11.2006 17:38