Проблема. Помогите!

  • Автор темы arximed
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

arximed

#1
Помогите решить задачку на С++... Я уже сижу два дня но ничего не выходит не хочит прога делать то что я ей говорю(или я неправильно говорю). Вот что надо сделать:
Дано целочисельную прямоугольную матрицу:
1)Сжать даную матрицу, удалив с нее строки и столбцы заполниные нулями;
2)Найти номер первой из строк что имеет хоть одно плюсовое число

Второе задание я сделал. А вот первое нивкакую не получается...
Помогите!!! Подскажите где можно почитать какието книги для чайников по програмированию на С++?
Большое всем спасиба!!! Извините за глупые вопросы...
 
A

Anton Chik

#2
без обид.ты нерусский или просто неграмотный?
Код:
const int N=10;
const int M=5;
int a[N][M];
int i,j,k,l;
int nullstr;
for(i=0;i<N;i++)// проверка строк
{
nullstr=1;
for(j=0;j<M;j++)if(a[i][j]!=0){nullstr=0;break;}// ищем пустую строку
if(nullstr)
 {
 //cдвиг строк вверх начиная с (i+1)-й
 for(k=i;k<N-1;k++)for(l=0;l<M;l++)a[k][l]=a[k+1][l];
 i--;
 }
}

for(i=0;i<M;i++)// проверка столбцов
{
nullstr=1;
for(j=0;j<N;j++)if(a[j][i]!=0){nullstr=0;break;}// ищем пустой столбец
if(nullstr)
 {
 //cдвиг столбцов влево начиная с (i+1)-го
 for(k=i;k<M-1;k++)for(l=0;l<N;l++)a[l][k]=a[l][k+1];
 j--;
 }
}
тип такого.сам не компилял, так что если будут косяки обращайся :D
 
A

arximed

#3
Нет я с Украины... Разговариваю на украинском. Так что извините за ошибки... Большое спасиба щас буду садиться за задачу...
 
A

arximed

#4
Может кому ни-ть еще пригодиться... Правда работает только когда заполнины нулями либо одна строка или столбец!!! Если 2 столб. или строки то прога просто виснит... Короче говоря немного глюков еще есть...
Код:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <fstream.h>
void main()
{
clrscr();
const int N=3;
const int M=4;
int a[N][M];
int i,j,k,l;
int nullstr;

for(i=0;i<N;i++) {
for(j=0;j<M;j++) {
cout<<"Vedit' element masuvy a["<<i<<"]["<<j<<"]=";
cin>>a[i][j]; } cout<<"\n";
}
int zz=0,xx=0;

 int RR=0;
 for (i=0;i<N; i++)
 for (j=0; j<M; j++)
 if (a[i][j]>0) {RR=i; cout<<"\nNomer perhogo z rjadkiv z + el-tom="<<RR<<"\n"; goto ROBO;}


ROBO: for(i=0;i<N;i++)// Perevirka rjadkiv
{
nullstr=1;
for(j=0;j<M;j++)if(a[i][j]!=0){nullstr=0;break;}// Hykaem pystui rjadok
if(nullstr)
{
//Zsyv rjadkiv yverx z (i+1)
for(k=i;k<N-1;k++)for(l=0;l<M;l++)a[k][l]=a[k+1][l];
i--;
zz=zz++;
}
}

for(i=0;i<M;i++)// Perevirka stovpciv
{
nullstr=1;
for(j=0;j<N;j++)if(a[j][i]!=0){nullstr=0;break;}// Hykaem pystui stovbec`
if(nullstr)
{
//Zsyv stovbciv vlivo z(i+1)
for(k=i;k<M-1;k++)for(l=0;l<N;l++)a[l][k]=a[l][k+1];
j--;
xx=xx++;
}
}

for(l=0;l<N-zz;l++) {
for(k=0;k<M-xx;k++) {
cout<<a[l][k];
    } cout<<"\n";
}

getch();
}
Большое СПАСИБА Anton Chik!!!!!!! :) ;) ;)
 
G

Guest

#5
Замечание: Использование label в С и С++ считается дурным тоном...

По поводу литературы - читай Кнута раздел вроде бы "разреженные массивы" или что-то типо того, поможет...

Далее...
По заданию - если тебе нужно по сжатой матрице определить номер первой ненулевой строки во входной матрице, то данный алгоритм тебе не подойдет...

Иначе...
По программе - попробуй так
Код:
for(i=0;i<N;) // Perevirka rjadkiv
{
bool nullstr=1;

for(j=0;j<M;j++) // Hykaem pystui rjadok
 if(a[i][j]!=0)
 {
  nullstr=0;
  i++;
  break;
 }

if(nullstr) //Zsyv rjadkiv yverx z (i+1)
{
 N--;

 for(k=i;k<N;k++)
  for(l=0;l<M;l++)
   a[k][l]=a[k+1][l];
}
}

for(j=0;j<M;) // Perevirka stovpciv
{
bool nullst=1;

for(i=0;i<N;i++) // Hykaem pystui stovbec`
 if(a[i][j]!=0)
 {
  nullstr=0;
  j++;
  break;
 }

if(nullstr) //Zsyv stovbciv vlivo z (j+1)
{
 M--;

  for(k=0;k<N;k++)
   for(l=j;l<M;l++)
    a[k][l]=a[k][l+1];
}
}

for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
 cout<<a[i][j];

cout<<"\n";
}

getch();
}
 
A

arximed

#6
Привет!!! Большое спасиба за помощ!!!
Вопрос: как это решить???
Написать програму, которая считывает строку или текст (в обоих случаях длина строки не должна привышать 80 символов, между словами допускаються пробелы и комы, нажатие "Enter" - означает конец файлу) з текстового файла и высчитывает:
а) сколько маленьких букв есть в этом тексте и заменить их на большие;
б) слова которые не имеют какой то избраной Мной буквы;
в) в другой текстовый файл выводит каждое слово текста с новой строки.
Помогите пожалуйста бедному студенту у которого скоро сесия!!!
Заранее благодарен и извините за беспокойство...

Вот что я состряпал, но это немного не работает:
Код:
#include<iostream.h>
#include<string.h>
#include<ctype.h>
#include<conio.h>
void main()
{ clrscr();
const int n=80;
char s[n];
cout<<"Vvedit' rjadok sumvoliv\n";
cin.getline(s,n);
int str=strlen(s);
int k=0;
char s1[n],s2[n];
int j=0;
 for(int i=0;i<str;i++)
 { if (islower(s[i])!=0) k++;

  s2[j++]=toupper(s[i]) ;}
   cout<<"Kil'kist' MALUX y teksti="<<k;
  


  char zz=0;
  cout<<"\nVvedu vubrany bykvy "; cin>>zz;



{
char w[25]; //Slovo
char mas[10][25];//masuv;
int k=0,t=0,i,j;
while(t<str)
{
for(j=0,i=t;s[i]!=' ';i++,j++)w[j]=s[i];//Formyem slovo do probila
w[j]='/0';//formyem kinec rjadka
strcpy(mas[k],w);//kopiyem slovo v masuv
k++;//zbilhyem het4ik sliv
t=i+1;//perexodum do nastypnogo slova v rjad.
}
strcpy(s,"");//o4uhaem vuxidnui rjadok
for(t=0;t<k;t++)
if(mas[t][0]<'0'&&mas[t][0]>'9')//jakho perhui sumvol ne cufra
{strcat(s,mas[t]);//kopiyem v rjadok slovo
strcat(s,' ');//kopiyem v rjadok probil
}
puts(str);//vuvodum rezyltat
}





cout<<"\n\nZapus 4usel propusom:";
cout<<"\n"<<s2;
getch();
}
Подскажите где у меня ошибки а то у меня не выходит их исправить...
 
G

Guest

#7
Код:
void main()
{
clrscr();
const int n=80;
char s[n];

cout<<"Vvedit' rjadok sumvoliv\n";
cin>>s;
int len=strlen(s);
Вроде же тебе надо строку из файла читать??? Ну, да ладно...
Название переменной str обычно дается строковой переменной, кстати в конце твоего кода она так и используется :unsure:...

Код:
 {
 int k=0;
 for(int i=0;i<len;i++)
  if (islower(s[i]))
  {
   k++;
   s[i]=toupper(s[i]);
  }
 
 cout<<"\n\nKil'kist' MALUX y teksti="<<k;
 
 cout<<"\n\nZapus teksty propusom:\n"<<s;
}
Совсем не понятно зачем тебе были нужны j, s1 и s2...
Хорошим тоном считается выполнять операции(функции) тогда, когда это требуется, т.е. менять на верхний регистор только маленькие буквы...

Кстати, программа явно решает не твою задачу ;)...
Код:
 {
 char zz;
 cout<<"\n\nVvedu vubrany bykvy ";
 cin>>zz;
 zz=toupper(zz);

 bool fzz=0;
 int k=0;
 for(int i=0;i<len;i++)
 {
  if(s[i]==zz)
   fzz=1;
  if((s[i]==' ') || (s[i]==','))
  {
   s[i]='\n';
   if(fzz)
    k++;
  }
 }

 cout<<"\n\nKil'kist' SLOV kotorye ne imeut \'"<<zz<<"\' y teksti="<<k;

 cout<<"\n\nVuxidnui rjadok:\n"<<s;
 cout<<s;
}
Ну, если тебе надо выводить слова, в которых нет буквы, которую ту ввел, алгоритм чуть поменяется...

Код:
 getch();
}
Конец...
 
G

Guest

#8
Код:
void main()
{
clrscr();
const int n=80;
char s[n];

cout<<"Vvedit' rjadok sumvoliv\n";
cin>>s;
int len=strlen(s);
Вроде же тебе надо строку из файла читать??? Ну, да ладно...
Название переменной str обычно дается строковой переменной, кстати в конце твоего кода она так и используется :unsure:...

Код:
 {
 int k=0;
 for(int i=0;i<len;i++)
  if (islower(s[i]))
  {
   k++;
   s[i]=toupper(s[i]);
  }
 
 cout<<"\n\nKil'kist' MALUX y teksti="<<k;
 
 cout<<"\n\nZapus teksty propusom:\n"<<s;
}
Совсем не понятно зачем тебе были нужны j, s1 и s2...
Хорошим тоном считается выполнять операции(функции) тогда, когда это требуется, т.е. менять на верхний регистор только маленькие буквы...

Кстати, программа явно решает не твою задачу ;)...
Код:
 {
 char zz;
 cout<<"\n\nVvedu vubrany bykvy ";
 cin>>zz;
 zz=toupper(zz);

 bool fzz=0;
 int k=0;
 for(int i=0;i<len;i++)
 {
  if(s[i]==zz)
   fzz=1;
  if((s[i]==' ') || (s[i]==','))
  {
   s[i]='\n';
   if(fzz)
    k++;
  }
 }

 cout<<"\n\nKil'kist' SLOV kotorye ne imeut \'"<<zz<<"\' y teksti="<<k;

 cout<<"\n\nVuxidnui rjadok:\n"<<s;
 cout<<s;
}
Ну, если тебе надо выводить слова, в которых нет буквы, которую ту ввел, алгоритм чуть поменяется...

Код:
 getch();
}
Конец...
 
A

arximed

#10
Кому не лень помогите! Хоть пару строчек я до конца сам состряпаю... Времени осталось мало а зще надо много чего написать...
Описати структуру з іменем Zodiak, яка б містила наступні поля:
- Прізвище і ім’я;
- Знак Зодіаку;
- Дата народження (масив з трьох чисел).
Написати програму, яка б виконувала наступні дії:
- введення з клавіатури даних в масив, що складається з восьми елементів типу Zodiak (3 бали);
- впорядкування записів у масиві за зростанням року народження (+1 бал).
- виведення на екран інформації про людину, прізвище якої вводиться з клавіатури. Якщо такої немає – вивести відповідне повідомлення (+1 бал).

Зарание благодарен... Не переводил на русский...
 
Статус
Закрыто для дальнейших ответов.