Перейти до вмісту

прога


Повідомлень в темі: 9

#1 Gemini

    Місцевий

  • Користувачі
  • PipPipPipPipPipPip
  • 203 повідомлень
  • Стать:Чоловік
  • Місто:Тернопільщина

Відправлено 06.03.2009 – 15:23

  • 9
хтось може сказати де тут помилка, програма компілюється і запускається, нажимаю 1 - нічого не виводиться

#include <stdio.h>
#include <math.h>
int a[2] [2];
int d2(int det2)
{
int i,j;

for (i=1;i<=2;i++)
for (j=1;j<=2;j++)
{
printf("a[%d,%d]=",i,j);
scanf("%d,%d",&a[i] [j]);

{ det2=a[1] [1]*a[2] [2]-a[1] [2]*a[2] [1];};
}
printf("determinant=%d",det2);
return det2;
}

int main()
{
int number;
scanf("%d",&number);
switch (number)
{
case 1 :{int d2(int det2); break;}
default :{printf("No\n"); break;}
}
return 0;
}

#2 Хтось_дивний

    Я пытался быть спpаведливым и добpым...

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1037 повідомлень
  • Стать:Чоловік
  • Місто:Україна, Тернопіль

Відправлено 06.03.2009 – 17:38

Наскільки я зрозумів тобі треба розрахувати детермінант. Помилка в програмі отут
case 1 :{int d2(int det2); break;}
ти не викликаєш підпрограму d2.
Ось цей кусок
int main()
{
int number;
scanf("%d",&number);
switch (number)
{
case 1 :{int d2(int det2); break;}
default :{printf("No\n"); break;}
}
return 0;
}
заміни на цей:
int main()
{
int number;
int dt;
scanf("%d",&number);
switch (number)
{
case 1 :{d2(dt); break;}
default :{printf("No\n"); break;}
}
scanf("%d"); //тут треба натиснути любу букву і Enter
return 0;
}
Поясни ще одне для чого тобі використовувати оператор switсh?

Повідомлення відредагував †Angel†: 06.03.2009 – 17:39

  • 0

#3 Evol

    Старійшина

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1846 повідомлень
  • Стать:Чоловік

Відправлено 06.03.2009 – 17:49

і ще ось тут не зрозуміло:

Перегляд допису-Oleh- (6.03.2009 15:23) писав:

scanf("%d,%d",&a[i] [j]);

int d2(int det2)
{ 
int i,j;

for (i=1;i<=2;i++)
for (j=1;j<=2;j++)
{
printf("a[%d,%d]=",i,j);
scanf("%d",&a[i] [j]);
}
det2=a[1] [1]*a[2] [2]-a[1] [2]*a[2] [1];

printf("determinant=%d",det2);
return det2;
}

Повідомлення відредагував Evol: 06.03.2009 – 17:52

  • 0

#4 Gemini

    Місцевий

  • Користувачі
  • PipPipPipPipPipPip
  • 203 повідомлень
  • Стать:Чоловік
  • Місто:Тернопільщина

Відправлено 09.03.2009 – 14:40

Дуже тобі дякую. †Angel†
А оператор switch мені буде потрібен далі.
Треба також обчислити детермінант матриці 3 на 3 і 4 на 4.

†Angel† а ти не міг би мені допомогти з програмою.
Мені потрібно, щоб результат роботи програми записувався в файл.
Я вже маю робочу програму, яка обчислює визначники.
Якщо потрібно я тобі її скину.
  • 0

#5 Хтось_дивний

    Я пытался быть спpаведливым и добpым...

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1037 повідомлень
  • Стать:Чоловік
  • Місто:Україна, Тернопіль

Відправлено 09.03.2009 – 21:18

Перегляд допису-Oleh- (9.03.2009 14:40) писав:

Дуже тобі дякую. †Angel†
А оператор switch мені буде потрібен далі.
Треба також обчислити детермінант матриці 3 на 3 і 4 на 4.

†Angel† а ти не міг би мені допомогти з програмою.
Мені потрібно, щоб результат роботи програми записувався в файл.
Я вже маю робочу програму, яка обчислює визначники.
Якщо потрібно я тобі її скину.
Допомогти можу але не написати)) ;) просто в самого зараз три програми в розробці та і робота напрягає :yes: Пробуй писати сам, а якщо щось буде не ясно то питай - підправлю і поясню :cool2:

Повідомлення відредагував †Angel†: 09.03.2009 – 21:18

  • 0

#6 kavalera

    Старійшина

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1258 повідомлень
  • Стать:Чоловік

Відправлено 11.03.2009 – 04:04

Перегляд допису-Oleh- (6.03.2009 15:23) писав:

хтось може сказати де тут помилка, програма компілюється і запускається, нажимаю 1 - нічого не виводиться
#include <stdio.h>
#include <math.h>
int a[2] [2];
int d2(int det2)
{  
int i,j;

    for (i=1;i<=2;i++)
    for (j=1;j<=2;j++)
    {
      printf("a[%d,%d]=",i,j);
      scanf("%d,%d",&a[i] [j]);
      
       { det2=a[1] [1]*a[2] [2]-a[1] [2]*a[2] [1];};
    }
    printf("determinant=%d",det2);
    return det2;
} 

int main()
{
     int number;
      scanf("%d",&number);
      switch (number)
      {
            case 1 :{int d2(int det2); break;}
            default :{printf("No\n"); break;}
      }
      return 0;
}
Справа в тому, -Oleh-, що у функції main() ви не викликаєте свою функцію, а пишете там її прототип, через це, як вже було сказано, вона не працює. Але справа не тільки в цьому. Як видно з функції d2(), вона завжди має рахувати визначник другого порядку і вертати його. В такому разі абсолютно не потрібно присвоювати цей визначник аргументу функціїї! Аргумент взагалі не потрібен. Треба об*явити локальну змінну в тілі функції, скинути на неї результат обрахунку, і вернути цю змінну в кінці функції. Крім того, навіщо оголошувати глобальний масив? Його теж краще зробити локальним.
Крім того, подивіться, блок { det2=a[1] [1]*a[2] [2]-a[1] [2]*a[2] [1];}; лежить всередині другого фора, в той же час індекси проставлені константно, що передбачає що відповідні елементи масиву вже ініціалізовано. Але ж коли іде перша ітерація першого фора змінна "i" НЕ МОЖЕ бути рівна 2. Через це рахується там в той час якийсь брєд. Карочі, треба спочатку ПОВНІСТЮ залити масив, а потім рахувати детермінант, і залити правильно. В тому числі так, щоб ініціалізація йшла і елементів з нульовими індексами. Для цього треба щоб у ваших циклах змінні починалися з НУЛІВ.

Функція d2() має бути приблизно такою:
 int d2(void);				  // прототип

 int d2(){
  int mtr[2][2];
  register int i=0,
  register int j=0;				 // мають бути нулями для правильної індексації масиву! register - для солідности. :)

  for(;i<2;i++)
   for(j=0;j<2;j++){	  //заливаєте масив, наприклад так, але не так як у вас(там помилка у сканфі).
	printf("a[%d][%d]=",i,j);
	scanf("%d",&mtr[i][j]);
   }

//рахуєте детермінант(можна навіть локальної змінної не вживати)
//Якщо для чогось(?) вам необхідно, виводите й принтеф(але тоді треба таки змінна, якій присвойте в такому разі вираз в дужках в ретурні)
//printf("blablabla==%d", zminna); змінну zminna треба тоді об*явити, ініціалізувати виразом що в ретурні, а в нього тоді поставити її!

 return (mtr[1][1]*mtr[2][2]-mtr[1][2]*mtr[2][1]); // або return zminna;
}

Майн такий:
int main(int argc, *argv[]){
 if(argc==1){printf("options:\n\t 1 - calculate a determinant\n\tother - do nothing, smoke the bambuk");return 0;}
 if(!strcmp(argv[1],"1"))d2(); // ВИКЛИК вашої функції.  Це  і рядок вище - шоб красіво було. Але треба додати #include<string.h>.
 return 0;
}

Звісно, якщо потрібен switch, то можна зробити так:
switch(argv[1]){
 case 1: d2();break;
 default: do_something();
 }
return 0;

Повідомлення відредагував GhulbeddinHekmatiar: 11.03.2009 – 04:32

  • 0

#7 kavalera

    Старійшина

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1258 повідомлень
  • Стать:Чоловік

Відправлено 11.03.2009 – 04:55

Перегляд дописуGhulbeddinHekmatiar (11.03.2009 04:04) писав:

Справа в тому, що якісь глюки кояться з редагуванням. Того без зайвого розсусолювання скажу, що на останню секцію коду (там де switch(argv[1] :yes:))не треба зважати. Вона туди влізла випадково, а переписати вже не зміг. Тож слід зазначити, що майн може бути і таким як у вас -Oleh-, але треба викликати функцію d2(), тобто:
case 1: d2();break; // так правильно.
А у першому моєму пості треба виправити рядок
return (mtr[1][1]*mtr[2][2]-mtr[1][2]*mtr[2][1]);
на рядок
return (mtr[0][0]*mtr[1][1]-mtr[0][1]*mtr[1][0]);
Кажу ж, відредагувати виявилося не просто, а потім і взагалі все сперділося. :cool2:

Повідомлення відредагував GhulbeddinHekmatiar: 11.03.2009 – 05:02

  • 0

#8 Gemini

    Місцевий

  • Користувачі
  • PipPipPipPipPipPip
  • 203 повідомлень
  • Стать:Чоловік
  • Місто:Тернопільщина

Відправлено 19.03.2009 – 17:08

#include <stdio.h>
int a[2][2];
int main()
{
	int i,j,d;
	for (i=0;i<2;i++)
	for (j=0;j<2;j++)
	{
	
	  printf("a[%d,%d]=",i,j);
	  scanf("%d",&a[i][j]);
	  { d=a[0][0]*a[1][1]-a[0][1]*a[1][0];};
	   
	}	 
	printf("d=%d",d);
}

Хтось може допомогти. Потрібно, щоб результат (або все, що я вводжу) записувалось у файл.

Нижче приводжу код програми, яка працює з файлами.

#include <stdio.h>
main()
{
	  FILE *fp;
	  char ss[20];
	  int i;
	  printf("Vvedit nazvy knugu, zag.kilkist, kilkist vudanux, zalushok: \n");
	  for (i=0;i<4;i++)
	  {
		  scanf("%s",ss);
		  fp=fopen("File.txt","a");
		  fputs(ss,fp);
		  fputs("\n",fp);
		  fclose(fp);
	  }
	  //Вивід з файлу
	  fp=fopen("File.txt","r");
	  int c;
	  while ((c=getc(fp)) !=EOF)
	  putc(c, stdout);
	  return 0;
}

Дуже треба. Хто може - зробіть.
  • 0

#9 kavalera

    Старійшина

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1258 повідомлень
  • Стать:Чоловік

Відправлено 20.03.2009 – 14:04

По-перше, ви мабуть не читали, шо я вам написав. Того знову ліпите блок { d=a[0][0]*a[1][1]-a[0][1]*a[1][0];}; Якщо вам дійсно треба, почитайте те що я вам написав.
А стосовно другого блоку коду, то взагалі не зрозуміле питання. Сформулюйте чіткіше. І до речі, скромности вам не позичати. :ggggg:
  • 0

#10 Хтось_дивний

    Я пытался быть спpаведливым и добpым...

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 1037 повідомлень
  • Стать:Чоловік
  • Місто:Україна, Тернопіль

Відправлено 20.03.2009 – 19:26

Перегляд дописуIA32 (20.03.2009 14:04) писав:

По-перше, ви мабуть не читали, шо я вам написав. Того знову ліпите блок { d=a[0][0]*a[1][1]-a[0][1]*a[1][0];}; Якщо вам дійсно треба, почитайте те що я вам написав.
А стосовно другого блоку коду, то взагалі не зрозуміле питання. Сформулюйте чіткіше. І до речі, скромности вам не позичати. :ggggg:
насправді хлопця приперає строк здачі курсака))
  • 0



Кількість користувачів, що читають цю тему: 1

0 користувачів, 1 гостей, 0 анонімних