Форум - Программирование
Форум

Форум (http://barca.ru/forum/index.php)
-   Hi-tech (http://barca.ru/forum/forumdisplay.php?f=40)
-   -   Программирование (http://barca.ru/forum/showthread.php?t=976)

Catala 14.03.2012 21:05

PHP код:

#include <conio.h>
#include <stdio.h>
void main()
{

    
int x
 
    for(
10<= 99x++)
    {
        if (((
10) * (10) + (10) * (10)) % 13 == 0)
        {
            
printf("x = %d\n"x);
        }
    }
     
    
getch();



К@t@LoNeЦ 16.03.2012 18:42

Вложений: 2
Вот еще проблема с задачей (рс.1)

Т.е, проще говоря, если я ввиду n=5 , то вот что должно получиться (рс.2)

Как это мне записать?

заготовка и ошибка (рс.2)

Catala 16.03.2012 18:53

PHP код:

#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>

void main()
{
    
float result 0;
    
int i;
    
int n;

    
printf("Input a number: ");
    
scanf("%d", &n);

    for(
0ni++)
    {
        
result sqrt(result 2);
    }

    
printf("The result is %f"result);

    
getch();



К@t@LoNeЦ 16.03.2012 18:57

Catala, уф , спасибо огромное, мне бы тока одной строчки хватило:bowdown:

К@t@LoNeЦ 13.04.2012 18:43

Дан массив целых чисел размерности n. Все элементы массива с четными номерами, предшествующие первому максимальному элементу, умножить на максимальный

Предпоследний цикл считает до бесконечности.
В чем ошибка?

PHP код:

#include <conio.h>
#include <math.h>
#include <stdio.h>
void main()
{
    
    
int max,n,k,i;
    
printf("vvedite razmernost ");
    
scanf_s("%d",&n);
    
int *mass = new int[n];
    
delete[]mass;
    

    for (
i=1;i<=n;i++)   
    {
          
printf("vveite chislo ");
          
scanf_s("%d",&mass[i]);
    }

    
max=mass[1];
    
k=1;
    
    for (
i=2;i<=n;i++)
      {
          if (
mass[i]>max)
             { 
                 
max=mass[i];
                 
k=i;
             }
          
      }

    for (
i=1;1<=k;i++)
    {
        if (
32000%i==0)
             {
                 
mass[i]=mass[i]*max;
             }
    }

    for (
i=1;1<=n;i++)
    {
        
printf("mass[i] =%lf",mass[i]);
    }

    
getch();



GERONIMO 13.04.2012 18:55

Цитата:

Сообщение от К@t@LoNeЦ
printf("vveite*chislo*");


Я ничего не смыслю в программировании, но тут ты пропустил букву :"d"

Catala 13.04.2012 19:06

Во-первых, массивы идут от 0 до n-1. Обращение к элементу n должно вызывать access violation. Во-вторых, память освобождается в самом начале программы, то есть вся работа ведется без выделенной памяти. Это еще до того, как вникнуть в алгоритм, который выглядит странно. Как собственно и задача. Что такое "первый максимальный элемент"? Если есть несколько одинаковых элементов, которые являются максимумом, нужен с минимальным индексом?

К@t@LoNeЦ 13.04.2012 19:17

Цитата:

Сообщение от Catala
Во-первых, массивы идут от 0 до n-1.

Необязательно.Я ввожу, начиная с mass[1].Ведь в for сначала идет присвоение элемента ,а потом увеличение номера элемента

Цитата:

Сообщение от Catala
Обращение к элементу n должно вызывать access violation.

В первый раз слышу.Всегда работал без него.

Цитата:

Сообщение от Catala
Это еще до того, как вникнуть в алгоритм, который выглядит странно.

какой именно? предпоследний?



В предпоследнем цикле сначала было "if (i%2==0)",что правильнее при определении четности\нечетности, но проблема в том, что i должно быть целочисленным, поэтому решил пойти от обратного:
по идее если i - четное, то он должен делить без остатка 32000 ( к примеру)

Catala 13.04.2012 19:28

Цитата:

Сообщение от К@t@LoNeЦ
Необязательно.Я ввожу, начиная с mass[1].Ведь в for сначала идет присвоение элемента ,а потом увеличение номера элемента

Интересно вас учат. Объясняю. Допустим массив начинается в адресе 1000. Когда ты делаешь new int[5] операционная система выделяет тебе сплошной блок памяти размеров в 20 байт(int 4 байта). mass[i] это то же самое, что *(mass + (4 * i)). Поэтому обращение к mass[5] это обращение к адресу 1020, которое тебе не принадлежит. И не имеет никакого значения как ты вводишь элементы. Ввод элементов это не выделение памяти, а запись данных в уже выделенную. В C всегда массив начинается с нуля. Если ты хочешь использовать n элементов начиная с 1, то в new нужно давать n+1. Ты же вообще делаешь в начале delete, что освобождает память и для тебя она не существует, а потом обращаешься к памяти которая не была твоей даже до этого освобождения.

Переменная k тебе не нужна. В условии второго пробега достаточно mass[i] < max. Ну и у тебя слева в условии цикла 1 вместо i. 32000 очень надеюсь нужно только для проверки.

К@t@LoNeЦ 13.04.2012 19:43

Цитата:

Сообщение от Catala
Переменная k тебе не нужна.

как мне тогда без k номер максимального элемента то узнать?

Цитата:

Сообщение от Catala
Ну и у тебя слева в условии цикла 1 вместо i

не понял, где именно?


Цитата:

Сообщение от Catala
Интересно вас учат. Объясняю. Допустим массив начинается в адресе 1000. Когда ты делаешь new int[5] операционная система выделяет тебе сплошной блок памяти размеров в 20 байт(int 4 байта). mass[i] это то же самое, что *(mass + (4 * i)). Поэтому обращение к mass[5] это обращение к адресу 1020, которое тебе не принадлежит. И не имеет никакого значения как ты вводишь элементы.


int *mass = new int[n];
delete[]mass;

может и так, только нам пока так говорят заполнять динаический массив

Catala 13.04.2012 20:00

Цитата:

Сообщение от К@t@LoNeЦ
не понял, где именно?

for (i=1;1<=k;i++)

Цитата:

Сообщение от К@t@LoNeЦ
как мне тогда без k номер максимального элемента то узнать?

Цикл сверху меняешь на for (i=1; mass[i] < max ; i++). И пробелы не забываем...


Цитата:

Сообщение от К@t@LoNeЦ
может и так, только нам пока так говорят заполнять динаический массив

delete делается после завершения работы с массивом. Делать подряд new и delete не имеет вообще никакого смысла. Это как построить дом только чтобы его взорвать сразу после укладки последнего кирпича.

К@t@LoNeЦ 13.04.2012 20:18

Catala, все исправил, только все равно до бесконечности считает
Вот что получилось:

PHP код:

#include <conio.h> 
#include <math.h> 
#include <stdio.h> 
void main() 

     
    
int max,n,k,i
    
printf("vvedite razmernost "); 
    
scanf_s("%d",&n); 
    
int *mass = new int[n]; 
     
    for (
i=1;i<=n;i++)    
    { 
          
printf("vveite chislo "); 
          
scanf_s("%d",&mass[i]); 
    } 

    
max=mass[1]; 
    
     
    for (
i=2;i<=n;i++) 
      { 
          if (
mass[i]>max
             {  
                 
max=mass[i]; 
             } 
           
      } 

     for (
i=1;mass[i]<max;i++)
    { 
        if (
32000%i==0
             { 
                 
mass[i]=mass[i]*max
             } 
    } 

    for (
i=1;1<=n;i++) 
    { 
        
printf("mass[i] =%lf",mass[i]); 
    } 

    
getch(); 





после того как ввожу последний элемент, бесколенчно пишет "mass[i] = 0.000000".
Ничего не поменялось

Catala 13.04.2012 20:25

PHP код:

#include <conio.h>  
#include <math.h>  
#include <stdio.h>

void main()  
{  
      
    
int maxnki;  
    
    
printf("vvedite razmernost ");  
    
scanf("%d", &n);  
    
    
int mass = new int[n];  
      
    for (
0ni++)     
    {  
          
printf("vveite chislo ");  
          
scanf("%d", &mass[i]);  
    }  

    
max=mass[1];  
     
    for (
2ni++)  
    {  
        if (
mass[i] > max)  
        {   
            
max mass[i];  
        }  
            
    }  

    for (
0mass[i] < max i++) 
    {  
        if ((
2) == 0)  
        {  
            
mass[i] = mass[i] * max;  
        }  
    }  

    for (
0ni++)  
    {  
        
printf("mass[%d] = %d\n"imass[i]);  
    }  

    
getch();  



Catala 13.04.2012 20:34

Только в конце delete не забудь.

Цитата:

Сообщение от К@t@LoNeЦ
по идее если i - четное, то он должен делить без остатка 32000 ( к примеру)

А, ну и это разумеется является грубой ошибкой.

К@t@LoNeЦ 18.04.2012 12:06

Дана матрица размерности nxn. Получить одномерный массив, хранящий сумму элементов нисходящих диагоналей матрицы.

Вылазиют две одинаковые ошибки:

" error C2440: =: невозможно преобразовать 'int *' в 'int' "

ошибки в обоих циклах в моменте:

s=s+a[m,p];


Программа:


PHP код:

#include <conio.h>
#include <math.h>
#include <stdio.h>
void main()
{

    
int i,j,n,m,p,k,s;

    
int = new int[n];
    

    
int a[255][255];
    
printf("vvedite razmer massiva");
    
scanf_s("%d",&n);
    
    
printf("vvedite eliment");

        for(
i=0i<ni++)
    {
        for(
j=0j<nj++)
        {
            
scanf_s("%d",&a[i][j]);
        }
    }

   
    
s=0;
           
p=0;
    
m=0;
    
k=1;

    
i=n;
    
j=1;

    while (
i>=1)
    {
        
m=i;
        
p=j;
        while (
m<=|| p<=n)
        {
            
s=s+a[m,p];
            
m++;
            
p++;
        }

        
b[k]=s;
        
s=0;
        
k++;
        
i--;
    }

    
i=1;
    
j=2;

    while (
j<n)
    {
        
m=i;
        
p=j;
        while (
m<=|| p<=n)
        {
            
s=s+a[m,p];
            
m++;        
            
p++;
        }
        
b[k]=s;
        
s=0;
        
k++;
        
j++;
    }

    for (
0in-1i++);
    {
        
printf("%d=b[i]"b[i]);
    }

    
getch();





Помогите исправить ошибки

Catala 18.04.2012 12:34

В C a[m][p], а не a[m, p].

К@t@LoNeЦ 18.04.2012 14:40

Вложений: 1
другая проблема:

присваивает значению s левые числа, а не s=s+a[m][p] как надо

и в конце не выводит одномерный массив b[2*n-1]

2*n-1 - это количество нужных диагоналей

PHP код:

#include <conio.h>
#include <math.h>
#include <stdio.h>
void main()
{

    
int i,j,n,m,p,k,s;

    
    

    
int a[255][255];

    
printf("vvedite razmer massiva ");
    
scanf_s("%d",&n);
    
    

    for(
i=0i<ni++)
    {
        for(
j=0j<nj++)
        {
            
printf("a[i,j] ");
            
scanf_s("%d",&a[i][j]);
        }
    }

    for(
i=0i<ni++)
    {
    
        for(
j=0j<nj++)
        {
            
printf("%d "a[i][j]);
        }
        if (
j=n)
        {
            
printf("\n");
        }
    }

    
printf("\n");

    
int = new int[(2*n)-1];
    
    
s=0;
    
p=0;
    
m=0;
    
k=1;

    
i=n;
    
j=1;

    while (
i>=1)
    {
        
m=i;
        
p=j;
        while (
m<=|| p<=n)
        {
            
s=s+a[m][p];
            
printf("%d\n "s);
            
m++;
            
p++;
        }

        
b[k]=s;
        
printf("%d\n "b[k]);
        
s=0;
        
k++;
        
i--;
    }

    
s=0;
    
i=1;
    
j=2;

    
printf("Vtoroy czickl\n ");

    while (
j<=n)
    {
        
m=i;
        
p=j;
        while (
m<=|| p<=n)
        {
            
s=s+a[m][p];
            
printf("%d\n "s);
            
m++;        
            
p++;
        }
        
b[k]=s;
        
printf("%d\n "b[k]);
        
s=0;
        
k++;
        
j++;
    }

    for (
1k<2*n-1k++);
    {
        
printf("b[k]=");
        
printf("%d\n"b[k]);
    }

    
getch();



Вот что выводит(рис). А должно быть : b[k]=3, b[k]=5, b[k]=2

Catala 18.04.2012 14:46

Что такое нисходящие диагонали?

К@t@LoNeЦ 18.04.2012 14:47

Catala, все диагонали параллельные главной ( включая саму главную)

Catala 18.04.2012 14:49

Кстати, вам серьезно за такой стиль сразу 0 не ставят?

К@t@LoNeЦ 18.04.2012 14:51

Цитата:

Сообщение от Catala
Кстати, вам серьезно за такой стиль сразу 0 не ставят?

первому курсу?;)

Catala 18.04.2012 14:51

Цитата:

Сообщение от К@t@LoNeЦ
Catala, все диагонали параллельные главной ( включая саму главную)

Намного понятней:D Надеюсь я правильно угадал. Сейчас посмотрим.

Catala 18.04.2012 14:57

Цитата:

Сообщение от К@t@LoNeЦ
первому курсу?

Конечно, учить хорошим манерам надо с самого начала.

Я все равно не понял. Что должно вывести для
1 2 3
4 5 6
7 8 9

К@t@LoNeЦ 18.04.2012 15:03

Catala, 7,12,15,8,3

Цитата:

Сообщение от Catala
Сейчас посмотрим.


моя программа настолько безнадежна?:closetema:

Catala 18.04.2012 15:22

PHP код:

#include <conio.h> 
#include <math.h> 
#include <stdio.h> 
void main() 


    
int n;
    
int ij;
    
int diag;
    
int a[255][255]; 

    
printf("vvedite razmer massiva "); 
    
scanf_s("%d",&n); 
     
     

    for(
0ni++) 
    { 
        for(
0nj++) 
        { 
            
printf("a[%d, %d]: "ij); 
            
scanf_s("%d", &a[i][j]); 
        } 
    } 

    for(
0ni++) 
    { 
     
        for(
0nj++) 
        { 
            
printf("%d "a[i][j]); 
        } 
        if (
== n
        { 
            
printf("\n"); 
        } 
    } 

    
printf("\n"); 

    
int = new int[(n) - 1]; 
    for(
0< (n) - 1i++)
    {
        
b[i] = 0;
    }
    for(
diag 1diag <= ndiag++)
    {
        for(
0diagi++)
        {
            
b[diag 1] += a[diag i][i];
        }
    }

    for(
diag 1diag ndiag++)
    {
        for(
0diagi++)
        {
            
b[(n)  - diag 1] += a[i][diag i];
        }
    }
    
    for (
0< ( n) - 1i++) 
    { 
        
printf("b[%d] = "i); 
        
printf("%d\n"b[i]); 
    } 

    
getch(); 



Цитата:

Сообщение от К@t@LoNeЦ
моя программа настолько безнадежна?

Я не стал разбираться. Программа с переменными a, b, i, j, k, m, p, s, n не для моей психики.

К@t@LoNeЦ 03.05.2012 19:49

задача

.:
Использовать структуру.
Дан файл f, содержащий сведения об игрушках: указывается название игрушки (например, кукла, кубики, мяч, конструктор и т.д.), ее стоимость в копейках и возрастные границы детей, для которых игрушка предназначена (например, для детей от двух до пяти лет). Получить следующие сведения:
a. Названия игрушек, цена которых не превышает 4 руб. и которые подходят детям 5 лет;
b. Цену самого дорогого конструктора, оформленную по образцу … руб. … коп.;
c. Названия наиболее дорогих игрушек (цена которых отличается от цены самой дорогой игрушки не более чем на 1 руб.);
d. Названия игрушек, которые подходят как детям 4 лет, так и детям 10 лет;
e. Можно ли подобрать игрушку, любую, кроме мяча, подходящую ребенку 3 лет, и дополнительно мяч так, чтобы суммарная стоимость игрушек не превосходила 5 руб.
f. Имеется ли мяч ценой 2 руб. 50 коп., предназначенный детям от 3 до 8 лет?; если нет, занести сведения об этой игрушке в файл f.


Например у нас есть три игрушки:
1)Название:Кукла
Цена:20000.
Возраст:3-7
2)Название: мяч
Цена:30000
Возраст:4-12
3)Название:Лего
Цена:40000
Возраст:4-9

Вопрос в том, чо я не пойму как сам файл должен выглядеть

1)Построчно 9 строк:
Кукла
20000.
3,7
мяч
30000
4,12
Лего
40000
4,9

2)Или так:
Кукла
Мяч
Лего
20000
30000
40000
3,7
4,12
4,9


Как должен выглядеть файл?

К@t@LoNeЦ 24.05.2012 19:34

Текст вышезапостенной задачи:
тыц:
PHP код:

#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

struct Student
{
        
char name[150];
        
double cost;
        
int age1;
        
int age2;
        
};

int main()
{
        
        
int n=10;
        
int i=0;
        
int k=0;
        
int j=0;
        
int p=0;
        
Student *st=new Student[n];
        
double max_konstruktor_cost//Для задания "b"
        
double max_toys_cost=st[1].cost//Для задания "c"
        

        
FILE *fo;
        
fo=fopen("f.txt","r");

        if(!
fo)
        {
            
printf("Nevozmojno otkrit fail\n");
        }

        else
        {
             while(!
feof(fo))
                {
                        
fscanf(   fo,  "%s%lf%d%d",  &st[i].name,   &st[i].cost,   &st[i].age1,   &st[i].age2    );
                        
p=i;
                        
i++;
                }
        }




                        
//Задание "а":
                        
printf("\nNazvaniya igrushek, zcena kotorih ne previshaet 4 rub. i kotorie podhodyat detyam 5 let:");
                        for (
i=0i<=pi++)
                        {
                           if (    (
st[i].cost<=4)     &&    (st[i].age1<=5)    &&    (st[i].age2>=5)  )
                           {
                               
printf(" %s"st[i].name );
                           }
                        }

                        
printf("\n");


                        
//Задание "b":
                        
for (i=0i<=pi++)
                        {
                            if (  (
strcmp(st[i].name,"konstruktor")==0)  );
                            
max_konstruktor_cost st[i].cost;
                            while (
i<=p)
                            {
                                if (  (
strcmp(st[i].name,"konstruktor")==0)   && (st[i].cost max_konstruktor_cost)  )
                                {
                                     
max_konstruktor_cost st[i].cost;
                                  }
                                
i++;
                            }

                            break;
                        }
                        
printf("\nZcena samogo dorogogo konstruktora:");
                        
printf(" %.3lf"max_konstruktor_cost);


                        
printf("\n");


                        
//Задаание "c":
                        
max_toys_cost st[0].cost;
                        
printf("\nNazvaniya naibolee dorogih igrushek:");

                        for (
i=1i<=pi++)
                        {
                            if (  (
st[i].cost max_toys_cost) )
                            {
                                
max_toys_cost st[i].cost;
                            }
                        }
                        for (
i=0i<=pi++)
                        {
                            if (  (
st[i].cost == max_toys_cost) || (max_toys_cost st[i].cost) <= 1  )
                            {
                                
printf(" %s"st[i].name);
                            }
                        }



                        
printf("\n");


                        
//Задание "d":
                        
printf("\nNazvaniya igrushek, kotorie podhodyat kak detyam 4 let, tak i detyam 10 let:");
                        for (
i=0i<=pi++)
                        {
                           if (  (
st[i].age1<=4)  &&   (st[i].age2>=10)  )
                           {
                                
printf(" %s"st[i].name );
                           }
                        }



                        
printf("\n");

                        
                        
//задание "e":
                        
printf"\nMozhno podobrat igrusku, podhodyashuu rebenku 3 let, i dopolnitelno maych tak, chtobi summarnaya stoimost igrushek ne prevoshodila 5 rub:");
                        for (
i=0i<=pi++)
                        {
                            if (
strcmp(st[i].name,"myach")==0)
                            {
                                for (
j=0j<=pj++)
                                {
                                    if (  (
strcmp(st[j].name,"myach")!=0) && (st[j].age1 <= 3) && (st[j].age2 >= 3) && (st[j].cost st[j].cost <= 5)  )
                                    {
                                        
printf(" %s"st[j].name ); 
                                    }
                                }
                            }
                        }


                        
printf("\n");
                                                   
 
                        
//Задание "f":
                        
for (i=0i<=pi++)
                        {
                            if (  (
strcmp(st[i].name,"myach")==0)  &&  (st[i].cost == 2.5) && (st[i].age1 >= 3) && (st[i].age2 <= 8)  )
                            {
                                
k++;
                            }
                        }
                        
printf("%d",k);
                        if (
k>0)
                        {
                            
printf("\nKolichestvo myachey zcenoy 2rub. 50 kop., prednaznachenniy dlya detey ot 3 do 8 let:");
                            
printf("%d"k);
                        }
                        else
                        {
                            
//Занести сведения в файл
                        
}
                        
                           
                  
        
fclose(fo);
        
getch();
        
delete [] st;





есть все, кроме задания f ,а именно:
Имеется ли мяч ценой 2 руб. 50 коп., предназначенный детям от 3 до 8 лет?; если нет, занести сведения об этой игрушке в файл f.

Как это провернуть, чтоб дозапись шла, начиная с номера со строки, большго чем кол-во строчек файла (их 10 в моем файле), т.е с 11 строчки?

Catala 24.05.2012 21:22

Про флаг "a+" в fopen ты просто не знаешь или он почему-то не подходит?

К@t@LoNeЦ 25.05.2012 19:32

Цитата:

Сообщение от Catala
Про флаг "a+" в fopen ты просто не знаешь или он почему-то не подходит?

знаю
Но как мне потом записать индекс i номера строки, когда я буду присуждать имени, цене и возрастным ограничениям нужные значения ?

т.е

PHP код:

fo=fopen("f.txt","a+");

st[i].name "myach";
st[i].cost 2.5;
st[i].age1 3;
st[i].age1 8;

if(!
fo

    
printf("Nevozmojno otkrit fail\n"); 
}

else
{
    
fprintf(   fo,  "%s%lf%d%d",  &st[i].name,   &st[i].cost,   &st[i].age1,   &st[i].age2    );



чему тут будет i равен?

Catala 25.05.2012 20:45

А почему ты просто не пишешь и читаешь сразу всю структуру через fread и fwrite? Ты попробовал записать с a+? Если я правильно помню он начнет записывать с последней строчке. То есть если было 10 начнет писать с 11. Если так нельзя можно добавить еще одну структуру к массиву в индексе p+1 насколько я понял твои обозначения, открыть файл просто для записи(с удалением содержимого) и заново записать в него весь массив полностью.

К@t@LoNeЦ 23.07.2012 13:00

Кто-нибудь знаком с такими языками программирования как: LD, FBD, SFC, ST, IL, CFC ?
Просто все они являются языками программирования ПЛК, и первые три из них - графические.

Хотелось бы узнать, насколько сильно отличаются принципы программирования графических языков ПЛК от т.н. "неграфических", в частнотсти, и различие этих шести языков для ПЛК от всеми известных языков программирования (Объектно-ориентированных, скриптовых и т.д.) таких как: Delphi, C++, Assembler и т.д.

К@t@LoNeЦ 15.05.2014 19:37

Вопрос скорее к знающим Java, но и от любой помощи не откажусь.
Столкнулся с задачей написать клиент-сервер на любом языке, решающий простое задание.
Т.к. сам сейчас начал изучать java, решил на нем и писать.
Задание - сортировка шести чисел по частям.
Имеется строка с шестью числами через пробел на сервере с ограничением на 3 клиентов.
Клиент разбивает этот "массив" (никакой это не массив, просто слово другого не смог подобрать) на 3 куска и отправляет клиентам, чтобы они каждый свой кусок отсортировали и вернули серверу, чтобы что-то еще кое-что дальше сделать, но до этого еще дойти надо....
Так вот, по не знанию матчасти столкнулся с вопросами:
1. у меня при описании сервера есть переменная i, с помощью которой я и подсчитываю клиенты и обрубаю подключения новых, когда i>3. Хотя в мануале написано про какой-то backlog.
.
.
.
public ServerSocket(int port,
int backlog)
throws IOException
Creates a server socket and binds it to the specified local port number, with the specified backlog. A port number of 0 creates a socket on any free port.
.
.
.


Как я понял, он и должен этим заниматься, и я поставил тройку после номера порта, но это ничего не дало. Скорее всего это я что-то делаю не так.
2. Не пойму как оперировать этими клиентами. Т.е. как сделать так, чтобы он первые 2 числа отправлял 1-му клиенту, вторые - 2-му, третьи - 3-му и чтобы я мог вывести на экран номер подключенного клиента. Знаю только как отправить что-то определенное и известное, но не в зависимости от номера клиента.
Server:
PHP код:

import java.io.*;
import java.net.*;
 
class 
Server extends Thread
{
    
Socket s;
 
 
    public static 
void main(String args[])
    {
        try
        {
            
int i 0// счётчик подключений
 
            // привинтить сокет на локалхост, порт 6665
            
ServerSocket server = new ServerSocket(66653);
 
            
System.out.println("server is started");
 
            
// слушаем порт
            
while(i<4)
            {
                
// ждём нового подключения, после чего запускаем обработку клиента
                // в новый вычислительный поток и увеличиваем счётчик на единичку
                
new Server(server.accept());
                
i++;
            }
        }
        catch(
Exception e)
        {
System.out.println("init error: "+e);
        } 
// вывод исключений
    
    
}
 
    public 
Server(Socket s)
    {
        
// копируем данные
        
this.s;
 
        
// и запускаем новый вычислительный поток (см. ф-ю run())
        
setDaemon(true);
        
setPriority(NORM_PRIORITY);
        
start();
    }
 
    public 
void run()
    {
        try
        {          
            
InputStream sin s.getInputStream();
            
OutputStream sout s.getOutputStream();
            
            
DataInputStream in = new DataInputStream(sin);
            
DataOutputStream out = new DataOutputStream(sout);
            
            
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
           
            
String line "12 2 12 4 5 6";
               
                
System.out.println("\nSending to "  " client!");
 
                
String str[] = line.split("[ ]");
                                
                
out.writeUTF(String.valueOf(Integer.valueOf(str[0])+" "Integer.valueOf(str[1])));
                
                
System.out.println(String.valueOf(Integer.valueOf(str[0])+" "Integer.valueOf(str[1])));
                
in.readUTF();
                
System.out.println("Client got a pocket!");
  
        }catch(
Exception e)
        {
System.out.println("init error: "+e);} // вывод исключений
    
}




Client:
PHP код:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
 
public class 
Client extends Thread {
 
    public static 
void main(String[] argsthrows Exception {
        try {
            
Socket socket = new Socket("localhost"6665);
            
            
InputStream sin socket.getInputStream();
            
OutputStream sout socket.getOutputStream();  
            
            
DataInputStream in = new DataInputStream(sin);
            
DataOutputStream out = new DataOutputStream(sout);
            
String line,null;
            
            
line in.readUTF();
            
String str[] = line.split("[ ]");
            
            
System.out.println("I got a pocket!");
            if (
Integer.valueOf(str[0]) > Integer.valueOf(str[1])) {
                
                
str[0];
                
str[0] = str[1];
                
str[1] = c;
                
            }
                        
             
out.writeUTF("I got it!");           
             
System.out.println("line: "str[0] +" " str[1]);
                                     
        } catch(
Exception e)
        {
System.out.println("init error: "+e);}
    }  



В гугле в основном простейшие эхо-серверы на одного клиента.

Catala 16.05.2014 02:57

Непонятно зачем при осваивании основ работать с многопоточностью. Однопоточный сервер, принимаем подключения одно за другим в цикле. Определение порядкового номера подключения проблем вызывать не должно.

Backlog определяет длину очереди. Если сервер обрабатывает клиента быстрее, чем интервалы между клиентами (а это насколько я понял твой случай) в этом параметре нет смысла.

Пример. Допустим backlog равен 5. На обработку клиента нужна минута. В первую секунду каждой минуты стучатся 3 клиента.
1 минута - все 3 клиента зашли в очередь и первый поступил на обработку.
2 минута - первый клиент отключился, в очереди остались двое, как раз хватает места для 3 новых клиентов.
3 минута - второй клиент отключился, в очереди осталось 4. Место осталось только для одного нового (backlog == 5), поэтому два остальных получат connection refused.

К@t@LoNeЦ 22.05.2014 20:16

Короче поковырялся сегодня - вроде как удалось передать каждому клиенту то, что нужно, но местами набыдлокодил - if в while - масло масленное. Ладно, разбираться потом буду. Все же сдавать уже в следующую пятницу, а еще сортировку по частям на всем этом реализовывать, да и препод по сетевым технологиям в языках ничего не смыслит. Главное, что работает на данном этапе. Плотнее языком летом займусь.

Сервер:
PHP код:

import java.io.*;
import java.net.*;

class 
Server extends Thread
{
    
Socket socket;
    
    
//num - номер клиента, a - номер массивов для метода run()
    
int num=1a=0
    
    
//исходные числа, которые сортируем
    
String line "6 5 4 3 2 1"
    
    
//создает массив из чисел, разделенных пробелом
    
String str[] = line.split("[ ]"); 
    
    public static 
void main(String[] args)
    {
        
        try
        {
            
//i - счетчик подключений, a - номер массивов для метода run()
            
int i 1,0

            
// создаем сервер на локалхост, порт 6665
            
ServerSocket server = new ServerSocket(6665);
            

            
System.out.println("server is started");
            
System.out.println("\n---------------------------------------");

            
// слушаем порт
            
while(i<=4)
            {
                
// WARNING!
                // Следующие 15 строчек - быдлокод!(не исключено,что есть еще)
                
if (i>3){
                    
server.close();
                }
                else{
                
// ждём нового подключения, после чего запускаем обработку клиента
                // в новый вычислительный поток и увеличиваем счётчик на единичку
/*!*/           
new Server(iserver.accept(), a); //сам не понял, почему надо писать так, но работает

                //Инфа о подключенных клиентах
                
System.out.println("\nClient " " connected!");
                
                
i++; //увеличиваем счётчик 
                
a=a+2//берем следующие 2 числа
                
}
            }
        }
        catch(
Exception e)
        {
System.out.println("init error: "+e); // вывод исключений
        

    
    }

    public 
Server(int numSocket socketint a)
    {
        
// копируем данные
        
this.socket socket;
        
this.a;
        
this.num num;
        
        
// и запускаем новый вычислительный поток (см. ф-ю run())
        
setDaemon(true);
        
setPriority(NORM_PRIORITY);
        
start();
    }

    public 
void run()
    {
        
        try
        {          
            
// из сокета клиента берём поток входящих данных
            
InputStream sin socket.getInputStream();
            
// и оттуда же - поток данных от сервера к клиенту
            
OutputStream sout socket.getOutputStream();
            
            
// Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения
            
DataInputStream in = new DataInputStream(sin);
            
DataOutputStream out = new DataOutputStream(sout);
                   
                
System.out.println("\nSending to " num " client!");
               
                
// отсылаем клиенту строку = число1_число2
                
out.writeUTF(String.valueOf(Integer.valueOf(str[a])+" "Integer.valueOf(str[a+1])));
                
// выводим ее на экран
                
System.out.println(String.valueOf(Integer.valueOf(str[a])+" "Integer.valueOf(str[a+1])));
                
                
// ожидаем пока клиент пришлет строку текста
                
in.readUTF(); 
                
                
// отчет о клиенте
                
System.out.println("Client " num " got a pocket!");
                
System.out.println("\n---------------------------------------");
                 
  
        }catch(
Exception e)
        {
System.out.println("init error: "+e);} // вывод исключений
    
}




Клиент:
PHP код:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class 
Client extends Thread {

    public static 
void main(String[] argsthrows Exception {
        try {
            
            
// создаем сокет на локалхост, порт 6665
            
Socket socket = new Socket("localhost"6665);
            
            
// из сокета клиента берём поток входящих данных
            
InputStream sin socket.getInputStream();
            
            
// и оттуда же - поток данных от сервера к клиенту
            
OutputStream sout socket.getOutputStream();
            
            
// Конвертируем потоки в другой тип, чтоб легче обрабатывать текстовые сообщения
            
DataInputStream in = new DataInputStream(sin);
            
DataOutputStream out = new DataOutputStream(sout);
            
            
String line,null;
            
            
// ожидаем пока клиент пришлет строку текста
            
line in.readUTF();
            
            
//создает массив из чисел, разделенных пробелом
            
String str[] = line.split("[ ]");
            
            
System.out.println("I got a pocket!");
            
            
//сортировка пузырьком
            
if (Integer.valueOf(str[0]) > Integer.valueOf(str[1])) {
                
                
str[0];
                
str[0] = str[1];
                
str[1] = c;
                
            }
            
             
//отправляем серверу ответ           
             
out.writeUTF("I got it!");
             
             
//выводим то, что получилось на экран
             
System.out.println("line: "str[0] +" " str[1]);
                                     
        } catch(
Exception e// вывод исключений
        
{System.out.println("init error: "+e);}
    }  




Вот, что выдает сервер:

server is started

---------------------------------------

Client 1 connected!

Sending to 1 client!
6 5
Client 1 got a pocket!

---------------------------------------

Client 2 connected!

Sending to 2 client!
4 3
Client 2 got a pocket!

---------------------------------------

Client 3 connected!

Sending to 3 client!
2 1
Client 3 got a pocket!

---------------------------------------


Только по идее он должен выключаться при попытке подключить четвертый клиент, но он продолжает работать, а на клиент выдается вот это:
run:
init error: java.net.ConnectException: Connection refused: connect
СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 2 секунды)


06 апреля 2025 года. Воскресенье - 18:17 (Часовой пояс GMT +4).

Русский vBulletin v3.5.2, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Перевод сделал zCarot