Академический Документы
Профессиональный Документы
Культура Документы
Cibernetica Si Informatica Economica Laborator Cu Exemple PDF
Cibernetica Si Informatica Economica Laborator Cu Exemple PDF
Введение ………………………………………………………………………………... 4
Тема № 1.
“Типы данных в C. Функции ввода, вывода“ …………………………….. 5
Тема № 2.
“Операции, операнды, выражения“ ………………………………………... 16
Тема № 3.
“Операторы” ……………………………………………………………………….. 23
Тема № 4.
“Поинтеры” ……………………………………………………………………….... 34
Тема № 5.
“Функции обработки символьных последовательностей” …………...... 43
Тема № 6.
“Типы данных, определяемые пользователем” ………….................... 53
Тема № 7.
“Аргументы функции main()“………………………….......………………….. 66
Тема № 8.
“Рекурсии“………………………………………………………………………….. 70
Тема № 9.
“Сортировка данных”……………………………………………………………. 76
Приложение 1.
“Спецификаторы формата” ............................................................... 84
Литература …………………………………………………………………………...... 85
3
Введение
4
Лабораторная работа N 1
Указания:
7
Функция getche( ) читает с эхо символ со стандартного устройства ввода
прямо в память, без нажатия клавиши Enter. При чтении символа ASCII
функция возвращает код символа. При чтении символа не ASCII функция
вызывается дважды: при первом вызове она возвращает значение 0, а при
втором – код нажатой клавиши. Функция не имеет параметров.
Прототип функции int getche( void ); содержится в файле <conio.h>.
8
Функция puts( s ) выводит на стандартное устройство вывода
последовательность символов ASCII заканчивающуюся символом NUL ( ‘\0’ ).
Она имеет один параметр, являющийся адресом начала выводимой
последовательности. Как правило, в качестве парамера используется имя
одномерного массива типа char. При обнаружении символа NUL, функция
не выводит его, а переводит курсор на начало следующей строки, т.е. символ
‘\0’ заменяется на ‘\n’. Функция возвращает код последнего символа
последовательности, т.е. символа предшествующего NUL, или –1 при
ошибке.
Прототип функции содержится в файле <stdio.h>.
Операция sizeof определяет размер в байтах для данного или для типа
данных. Например, sizeof( int ) возвращает количество байт, необходимое
для хранения значения типа int, а sizeof( d ) возвращает количество байт
выделенных для данного с именем d.
Примеры программ:
#include <conio.h>
#include <stdio.h>
void main(void)
{ char a;
clrscr();
a=getch();
putch(a);
getch();
}
#include <conio.h>
#include <stdio.h>
void main(void)
10
{ char a;
clrscr();
getch(); // Primul apel
printf("%d\n",getch()); // Al doilea apel
getch(); // Primul apel
a=getch(); // Al doilea apel
printf("%d\n",a);
getch(); // Primul apel
printf("%d\n",a=getch()); // Al doilea apel
getch();
}
#include <conio.h>
#include <stdio.h>
void main(void)
{ char c;
clrscr();
c=getchar();
putchar(c-1);
getch();
}
#include <conio.h>
#include <stdio.h>
#include <string.h>
void main(void)
{ char s[256];
clrscr();
gets(s);
printf(“Şirul are %d caractere”,strlen(s));
getch();
}
#include <conio.h>
#include <stdio.h>
void main(void)
{ int a,b,c;
clrscr();
scanf(“%d %d %d”,&a,&b,&c);
printf(“a=%d\tb=%d\tc=%d\nmedia=%.2f”,
a,b,c,(a+b+c)/3.0); //media cu 2 zecimale
11
getch();
}
#include <conio.h>
#include <stdio.h>
#define a 123.456f
void main(void)
{ clrscr();
printf("*%f*\n",a);
printf("*%2f*\n",a);
printf("*%20f*\n",a);
printf("*%-20f*\n",a);
printf("*%020f*\n",a);
printf("*%.2f*\n",a);
printf("*%.10f*\n",a);
printf("*%2.2f*\n",a);
printf("*%2.10f*\n",a);
printf("*%20.10f*\n",a);
printf("*%-20.10f*\n",a);
printf("*%020.10f*\n",a);
getch();
}
Содержание работы:
Контрольные вопросы:
15
Лабораторная работа N 2
Указания:
Примеры программ:
#include <conio.h>
#include <stdio.h>
void main(void)
{ float a,b;
clrscr();
scanf(“%f %f”,&a,&b);
printf(“Numerele citite: %f\t%f\n”,a,b);
printf(“Numerele ordonate: %f\t%f”,
a>b?b:a,a>b?a:b);
getch();
}
#include <conio.h>
#include <stdio.h>
void main(void)
{ unsigned a,b,c;
scanf(“%u %u %u”,&a,&b,&c);
(a+b+c)%3==0 ? printf(“Da”) : printf(“Nu”);
getch();
}
17
Пример 2.3. Программа определяет значения выражений !a&&b, !c||d, !
e&&f||!f&&e.
#include <conio.h>
#include <stdio.h>
void main(void)
{ int a,b; float c,d; double e,f;
clrscr();
scanf(“%d %d”,&a,&b);
printf(“\na=%-d\tb=%-d\t!a&&b=%-d\n\n”,
a,b, !a&&b);
scanf(“%f %f”,&c,&d);
printf(“\nc=%-f\td=%-f\t!c||d=%-d\n\n”,
c,d, !c||d);
scanf(“%lf %lf”,&e,&f);
printf(“\ne=%-lf\tf=%-lf\t!e&&f||!f&&e=%-d”,
e,f, !e&&f||!f&&e);
getch();
}
#include <conio.h>
#include <stdio.h>
void main(void)
{ unsigned a=5,b=2,c=3,d,n;
clrscr();
printf(“a=%-u\tb=%-u\tc=%-u\t
max(a,b)=%-u\tmax(a,b,c)= %u”,
a,b,c,d=a>b?a:b,n=d>c?d:c);
getch();
}
#include <conio.h>
#include <stdio.h>
void main(void)
{ long x,y; int u,w;
clrscr();
printf(“Introdu x şi u ”);
scanf(“%ld %d”,&x,&u);
w=u<<2; printf(“u=%-d\t%-d<<2=%-d\n”,u,u,w);
y=x>>2; printf(“x=%-ld\t%-ld>>2=%-ld\n”,x,x,y);
18
getch();
}
#include <conio.h>
#include <stdio.h>
void main(void)
{ int s;
clrscr();
scanf(“%d”,&s);
printf(“s=%-d\ts|1=%-d”,s,s|1);
getch();
}
Содержание работы:
2.4. Программа читает аргумент х и коэффициенты c0, c1, c2, c3, c4 типа
double многочлена q=c4x4+c3x3+c2x2+c1x+c0 , вычисляет значение многочлена
q и выводит значения x и q.
Используйте функцию poly( x, n, c[] ) и массив коэффициентов
многочлена для вычисления его значения.
2.7. Программа читает два целых числа и выводит эти числа и их среднее
геометрическое с двумя дробными знаками.
2.14. Программа читает число х, вычисляет х15, х25, х35, х45 и выводит
результаты.
20
2.20. Программа читает число х и выводит z=4х2+9х-2000, если х<0,
z=2000, если х=0 и z=4х2-2000, если х>0.
Используйте одно условное выражение.
Контрольные вопросы:
22
Лабораторная работа N 3
Тема: Операторы
Указания:
true false
expr
instruction1
23
true false
expr
instruction1
e1
false
e2
true
тело
цикла
e3
24
Оператор while является оператором цикла с предусловием и имеет
формат: while( e1 ) оператор; заголовок цикла - while( e1 ), содержит в
скобках выражение е1, определяющее условие повтора цикла. Тело цикла -
оператор, который может быть простым или составным оператором. Оно
содержит те операции, которые должны быть повторены в цикле.
Этот оператор реализует следующую циклическую структуру:
false
e1
true
тело
цикла
тело
цикла
e1
true
false
switch( expresie )
{ case c1: şir1; break;
case c2: şir2; break;
…
case cn: şirn; break;
default: şir; }
Примеры программ:
Пример 3.2. Программа читает два целых числа без знака и находит их
наименьшее общее кратное. Программа использует функцию предыдущего
примера, сохраненную в файле “f:\bc\mydir\ex3_1.c”.
#include <conio.h>
#include <stdio.h>
#include “f:\bc\mydir\ex3_1.c”
void main(void)
{ unsigned a,b,c;
clrscr();
printf(“Introdu 2 numere întregi fără semn: ”);
scanf(“%u %u”,&a,&b);
c=dc(a,b);
printf(“cmmmc(a,b)=%u”,a*b/c);
getch();
27
}
#include <conio.h>
#include <stdio.h>
void main(void)
{ int n;
clrscr();
printf("Introduceţi o cifră: ");
while(3.14)
{ if (scanf("%d",&n)==1) break;
clrscr();
printf("\nN-aţi introdus o cifră!\n");
printf("Introduceţi o cifră: ");
fflush(stdin); }
getch();
}
#include <conio.h>
#include <stdio.h>
void main(void)
{ int n[100],d=1,i=0,j;
clrscr();
getch();
}
28
}
#include <conio.h>
#include <stdio.h>
void main(void)
{ double t,x[100];int i=0,j=0,k;
clrscr();
while(scanf(“%lf”,&x[i++])==1);
i-=2;
printf(“\nAţi introdus şirul:\n”);
for( ; j<=i; j++) printf(“%lf\t”,x[j]);
for(j=0; j<i; j++)
{ for(k=j+1; k<=i; k++)
{ if( x[k]<x[j] ) { t=x[k],x[k]=x[j],x[j]=t;
}
}}
printf(“\n\nŞirul ordonat este:\n”);
for(j=0; j<=i; j++) printf(“%lf\t”,x[j]);
getch();
}
#include <conio.h>
#include <stdio.h>
#include <string.h>
void main(void)
{ char cuv[256],l,i,t;
clrscr();
gets(cuv);
printf(“Aţi introdus cuvântul: %s\n\n”,cuv);
l=strlen(cuv); //lungimea cuvântului cuv
for(i=0; i<l/2; i++)
{ t=cuv[i]; cuv[i]=cuv[l-1-i]; cuv[l-1-i]=t; }
printf(“Cuvântul inversat este: ”);puts(cuv);
getch();
}
Содержание работы:
30
3.11. Программа читает векторы х, у и выводит их скалярное
произведение.
Используйте оператар while и простые переменные ( без индексов ).
m)2+…+(xn-m)2 )/n)1/2.
Используйте операторы while и if и одномерный массив для вектора х.
31
3.21. Программа читает конструкции “op1 op op2”, где ор1 и ор2 -
числа, а ор - символ, представляющий собой арифметическую операцию (
+, -, * или / ) и выводит значение соответствующего выражения.
Используйте оператор switch.
Контрольные вопросы:
33
Лабораторная работа N 4
Указания:
35
требуется 1 байт, для типа float - 4 байта и для типа long double - 10
байтов памяти, соответственно.
Примеры программ:
#include <conio.h>
#include <stdio.h>
void main()
{ int x[50]={1,2,3,4,5},*px,i,r,t;
36
clrscr();
px=x;
r=*px;
for(i=0;i<5;i++)
{ t=*(px+i);
if( r<t ) r=x[i]; }
printf("Cel mai mare număr din şirul x este
%d",r);
getch();
}
#include <conio.h>
#include <stdio.h>
#include <string.h>
void main()
{ char s[256]="abracadabra",i,j,t;
clrscr();
puts("Şirul iniţial:\n");
puts(s);
for(i=0,j=strlen(s)-1; i<j; i++,j--)
{ t=*(s+i); *(s+i)=*(s+j); *(s+j)=t; }
puts("\nŞirul inversat:\n");
puts(s);
getch();
}
#include <conio.h>
#include <stdio.h>
#include <string.h>
void main()
{ unsigned x[30]={20,22,10,25,20},s=0,i=0;
clrscr();
puts("Şirul iniţial este:");
while( s<5 ) printf("%u\t",*(x+s++));
s=0;
while( i<5 )
{ s+=*(x+i); i+=2; }
printf("\nSuma elementelor de indice
par este %u",s);
getch();
}
#include <conio.h>
#include <stdio.h>
void main()
{ short i,j,t,n=12;
double x[234]={2,5,6,4,2,1,7,8,2,5,4,55};
clrscr();
puts("Şirul iniţial:\n");
for(i=0;i<n;i++) printf("%lf\t",x[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if( x[i]<x[j] ) { t=x[i];x[i]=x[j];x[j]=t; }
puts("\n\nŞirul ordonat descrescător:\n");
for(i=0;i<n;i++) printf("%lf\t",x[i]);
getch();
}
#include <conio.h>
#include <stdio.h>
void main()
{ short i,j,t,n=12;
long double x[234]={2,5,6,4,2,1,7,8,2,5,4,55};
clrscr();
puts("Şirul iniţial:\n");
for(i=0;i<n;i++) printf("%.1Lf\t",i[x]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if( x[i]<j[x] ) { t=*(x+i);x[i]=*&x[j];x[j]=t;
}
puts("\n\nŞirul ordonat descrescător:\n");
38
for(i=0;i<n;i++) printf("%.1Lf\t",*&i[x]);
getch();
}
#include <conio.h>
#include <stdio.h>
void main()
{ char x[256]="ACADEMIA DE STUDII ECONOMICE";
int n=27,i,j,t;
clrscr();
puts("Şirul iniţial:\n");
puts(x);
for(i=0;i<n;i++)
for(j=i+1;j<=n;j++)
if( x[i]>x[j] ) { t=x[i];x[i]=x[j];x[j]=t; }
puts("\n\nŞirul ordonat crescător:\n");
printf("*%s*",x);
getch();
}
#include <conio.h>
#include <stdio.h>
void main()
{ char c[15]="Cibernetica",s[15]="Statistica";
int i;
clrscr();
for(i=-2;i<13;i++)
printf("%p\t%c\t%p\t%c\n",c+i,c[i],s+i,s[i]);
getch();
}
#include <conio.h>
#include <stdio.h>
void main()
{ char a[5][5]={ 'a','b','c','d','e',
'f','g','h','i','j',
'k','l','m','n','o',
'p','q','r','s','t',
39
'u','v','w','x','y' };
int i,j;
clrscr();
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{ printf("%p\t%p\t%p\t", &a[i][j],
&*(a[i]+j), &*(*a+5*i+j));
printf("%c\t%c\t%c\t", a[i][j],
*(a[i]+j), *(*a+5*i+j));
printf("%p\t%p\t%p\n", &a[i][j],
(a[i]+j), (*a+5*i+j));
getch(); }
getch();
}
Содержание работы:
4.1. Программа читает три числа: a типа int, b типа float и c типа
double. Для введенных данных программа вычисляет и выводит: введенные
числа, наибольшее число, наименьшее число, сумму чисел, произведение
чисел, их среднее арифметическое с двумя десятичными знаками после
запятой, их геометрическое среднее с тремя десятичными знаками после
запятой.
40
4.7. Программа вычисляет скалярное произведение p двух векторов x, y
( p=x1⋅y1+x2⋅y2+…+xn⋅yn ), не используя массивы.
Контрольные вопросы:
41
z[22]={0,1,2,3,4,5}, *pz=z; long double w[22]={0,1,2,3,4,5}, *pw=w; Что
выведет printf(“%c%d%f%lf%Lf”,*(ps+1),*(px+2),*(py+3),*(pz+4),*(pw+5)); ?
4.14. Пусть имеется short i[22]={0,1,2,3,4,5}, *pi=i; Что выведет
printf(“%d%d%d%d%d%d”,*pi,*pi++,*pi++,*pi++,*pi++,*pi++); ?
4.15. Пусть имеется int i[22]={0,1,2,3,4,5}, *pi=i; Что выведет printf(“%d
%d%d%d%d%d”,*pi,*++pi,*++pi,*pi++,*pi++,*pi++); ?
4.16. Пусть имеется float i[22]={0,1,2,3,4,5},*pi=i+5; Что выведет
printf(“%f%f%f%f%f%f”,*pi,*pi--,*pi--,*pi--,*pi--,*pi--); ?
4.17. Пусть имеется double i[22]={0,1,2,3,4,5), *pi=i+5; Что выведет
printf(“%d%d%d%d%d%d”,*pi,*--pi,*--pi,*--pi,*--pi,*--pi); ?
4.18. Рассмотрите вопросы теста тест_04 и выберите правильные ответы
на каждый вопрос.
42
Лабораторная работа N 5
Указания:
Функция stricmp() имеет прототип int stricmp( const char *s1, const
char *s2 ); Она сравнивает символьные последовательности с1 и с2, на
которые которые указывают указатели s1 и s2, соответственно, не
различая прописные и заглавные буквы. Функция возвращает положительное
значение, если c1>c2, значение 0, если с1=с2, и отрицательное значение,
если c1<c2.
Функция strncmp() имеет прототип int strncmp( const char *s1, const
char *s2, unsigned n ); Она сравнивает не более n первых символов
последовательностей с1 и с2, на которые указывают указатели s1 и s2,
соответственно. Функция возвращает положительное значение, если c1>c2,
значение 0, если с1=с2, и отрицательное значение, если c1<c2.
Функция strnicmp() имеет прототип int strnicmp( const char *s1, const
char *s2, unsigned n ); Она сравнивает не более n первых символов
последовательностей с1 и с2, на которые указывают указатели s1 и s2,
соответственно, не различая прописные и заглавные буквы. Функция
возвращает положительное значение, если c1>c2, значение 0, если с1=с2,
и отрицательное значение, если c1<c2.
Функция strcpy() имеет прототип char *strcpy( char *d, const char *s );
Она копирует содержимое последовательности, на которую указывает
указатель s, в последовательность на которую указывает указатель d.
Копируется и символ ‘\0’. Функция возвращает значение указателя d.
Функция strncpy() имеет прототип char *strnpy( char *d, const char *s,
unsigned n ); Она копирует не более n первых символов, содержащихся в
последовательности, на которую указывает указатель s, в
последовательность на которую указывает указатель d. Функция возвращает
значение указателя d.
Функция strcat() имеет прототип char *strcat( char *d, const char *s );
Она сцепляет последовательности, на которые указывают указатели d и s:
копирует содержимое последовательности, на которые указывает указатель
s, в продолжение, после последнего символа последовательности, на которую
указывает указатель d. Копируется и символ ‘\0’. Функция возвращает
значение указателя d.
Функция strncat() имеет прототип char *strncat( char *d, const char *s,
unsigned n ); Она сцепляет к последовательности, на которую указывает
указатель d, не более n первых символов последовательности, на которую
указывает указатель s: копирует не более n первых символов,
содержащихся в последовательности, на которую указывает указатель s, в
продолжение, за последним символом последовательности, на которую
указывает указатель d. Функция возвращает значение указателя d.
Функция strchr() имеет прототип char *strchr( const char *s, int c ); Она
осуществляет поиск первого появления символа c в последовательности, на
которую указывает указатель s.
Функция возвращает указатель на первое появление символа c в
соответствующей последовательности или указатель NULL.
Функция strstr() имеет прототип char *strstr( const char *s1, const char
*s2 ); Она находит первое вхождение последовательности c2, на которую
указывает указатель s2, в последовательности c1, на которую указывает
указатель s1.
Функция возвращает указатель на первое появление последовательности
s2 в последовательности s1 или указатель NULL.
44
Функция free() имеет прототип void free( void *p ); содержащийся в
файле <alloc.h>. Она освобождает память heap, на которую указывает
указатель p. ( Смотри также функцию void farfree( void far *p ); ).
Примеры программ:
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include “f:\bc\mydir\ex5_1.c”
void main(void)
{ char c1[30], c2[30], c3[30], c4[30], *q;
clrscr();
printf(“Introdu un text din patru cuvinte: ”);
scanf(“%s %s %s %s”,c1,c2,c3,c4);
printf(“\nAţi introdus textul:\n\n”);
printf(“%s %s %s %s\n\n”,c1,c2,c3,c4);
q=bw(c1,c2,c3);
q=( strcmp(q,c4)>0 )?q:c4;
printf(“Cel mai mare cuvânt este: ”);
puts(q);
getch();
}
if( yyyy<1999 )
{ if( a2-a1==1 )
{ b=(a1%4==0)&&(a1%100)||(a1%400==0);
nd1nd2=nd2+365+b-nd1; }
else { for(b=0,i=a1;i<a2;i++)
b+=(i%4==0)&&(i%100)||(i%400==0);
bi=(a1%4==0)&&(a1%100)||(a1%400==0);
nd1nd2=365*(a2-a1-1)+b+nd2+
48
365+bi-nd1; }
r=nd1nd2%7; return eliz[r]; }
if( yyyy>1999 )
{ d2=dd, strcpy(m2,luna), a2=yyyy,
d1=16, strcpy(m1,"Noiembrie") ,a1=1999;
nd1=nz(d1,m1,a1); nd2=nz(d2,m2,a2);
if( a2-a1==1 )
{ b=(a1%4==0)&&(a1%100)||(a1%400==0);
nd1nd2=nd2+365+b-nd1; }
else { for(b=0,i=a1;i<a2;i++)
b+=(i%4==0)&&(i%100)||(i%400==0);
bi=(a1%4==0)&&(a1%100)||(a1%400==0);
nd1nd2=365*(a2-a1-1)+b+nd2+
365+bi-nd1; }
r=nd1nd2%7; return zile[r]; }
if( (yyyy==1999)&&(nd1>nd2) )
{ d2=dd; strcpy(m2,luna); a2=yyyy;
d1=16, strcpy(m1,"Noiembrie") ,a1=1999;
nd1=nz(d1,m1,a1); nd2=nz(d2,m2,a2);
printf("nd1=%u nd2=%u\n",nd1,nd2); getch();
nd1nd2=nd2-nd1; r=nd1nd2%7; return zile[r]; }
else { nd1nd2=nd2-nd1; r=nd1nd2%7;
return eliz[r]; }
#include <conio.h>
#include <stdio.h>
#include <string.h>
unsigned zl[]=
{0,31,28,31,30,31,30,31,31,30,31,30,31};
char *dl[]=
{ "", "Ianuarie", "Februarie", "Martie",
"Aprilie", "Mai", "Iunie",
"Iulie", "August", "Septembrie",
"Octombrie", "Noiembrie", "Decembrie" };
char *zile[]=
{ "Marţi", "Miercuri", "Joi", "Vineri",
"Sâmbătă", "Duminică", "Luni" };
49
char *eliz[]=
{ "Marţi", "Luni", "Duminică", "Sâmbătă",
"Vineri", "Joi", "Miercuri" };
#include "f:\bc\mydir\ex5_10.c"
#include "f:\bc\mydir\ex5_12.c"
void main(void)
{ unsigned d,y; char luna[30], *p;
clrscr();
printf("Introdu o dată calendaristică
dd luna yyyy: ");
scanf("%2d %s %4d",&d,luna,&y);
printf("\nAti introdus data: %2d %s %4d\n\n",
d,luna,y);
p=ziua(d,luna,y);
printf("%s",p);
getch();
}
Содержание работы:
52
Лабораторная работа N 6
Указания:
1) struct dosar
{
char nume[25];
char prenume[25];
struct data_calenraristica
{ int zi;
char luna[11];
int an;
} data_nasterii, data_angajarii;
} angajat, secţie[100];
54
Здесь объявлены объединения f1, f2 типа aria, массив объединений f3,
состоящий из 6 элементов, представляющих собой объединения типа aria, а
также указатель z, указывающий на тот же тип aria.
1) enum luna { ileg, ian, feb, mar, apr, mai, iun, iul, aug, sep, oct, nov,
dec } m1, m2, m3[12], *w;
2) enum mon { ian=1, feb, mar, apr, mai, iun, iul, aug, sep, oct, nov,
dec };
1) typedef union { double raza; double tp; double ld[2]; double lt[3]; }
figura;
figura cerc, patrat, triunghi;
Здесь name - имя объявленного нового типа битовые поля, а n1, n2,
…, nm - переменные этого нового типа, т.е. каждая из них является
структурой битовых полей, а pole1, pole2, …, polen - объявления битовых
полей.
56
где tip - тип поля, imea_polea - имя поля, dlina_polea - длина поля в
битах, не превышающая длину машинного слова. Имя поля может
отсутствовать, тогда поле определяет зону памяти, неиспользованную в
соответствующем слове. Длина поля может быть 0, тогда следующее за ним
поле размещается в следующем слове. Биты размещаются в машинном слове,
начиная с битов меньшего порядка в сторону возрастания порядка битов.
Если поле не умещается в текущем слове, тогда оно размещается в
следующем слове. Поля могут быть типа unsigned, int, signed, char, usigned
char.
Примеры программ:
57
Пример 6.1. Функция вычисляет аргумент комплексного числа. У нее
один параметр, являющийся указателем на тип COMPLEX. Тип COMPLEX
определяется следующим образом: typedef struct { double x; double y }
COMPLEX; Функция возвращает аргумент типа double комплексного числа,
на которое указывает параметр функции.
Для комплексного числа z=x+iy аргумент argz равен:
#include <conio.h>
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979
typedef struct { double x; double y; } COMPLEX;
#include “f:\bc\mydir\ex6_1.c”
void main(void)
{ COMPLEX z1,z2;
double argz1, argz2;
clrscr();
printf(“Introduceţi 2 numere complexe: ”);
scanf(“%lf %lf %lf %lf”,
&z1.x,&z1.y,&z2.x,&z2.y);
argz1=darg(&z1); argz2=darg(&z2);
printf(“\n\nAţi introdus numerele
complexe:\n\n”);
printf(“z1=(%-.2lf)+i(%-.2lf)\n
z2=(%-.2lf+i(%-.2lf)\n\n”,
z1.x,z1.y,z2.x,z2.y);
58
printf(“argz1=%-lf\nargz2=%-lf\n”,argz1,argz2);
printf(“\nNumerele ordonate în ordinea creşterii
argumentelor:\n\n”);
(argz1<argz2)?printf(“(%-.2lf)+i(%-.2lf)\n
(%-.2lf)+i(%-.2lf)\n”, z1.x,z1.y,z2.x,z2.y):
printf(“(%-.2lf)+i(%-.2lf)\n(%-.2lf)+i(%-.2lf)\n”,
z2.x,z2.y,z1.x,z1.y);
getch();
}
#include <conio.h>
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979
typedef struct { double x; double y; } COMPLEX;
#include “f:\bc\mydir\ex6_1.c”
void main(void)
{ COMPLEX z;
double modz, argz, mod, arg;
unsigned n, m;
clrscr();
printf(“Introduceţi ordinul n pentru rădăcină
şi numărul complex z:\n\n”);
scanf(“%u %lf %lf”, &n, &z.x, &z.y );
printf(“\n\nAţi introdus n=%-u şi
z=(%.2lf)+i(%.2lf)\n\n”, n, z.x, z.y );
//Calculăm modulul numărului z
modz=sqrt( z.x*z.x+z.y*z.y );
//Calculăm argumentul numărului z
argz=darg(&z);
//Calculăm modulul pentru rădăcini
mod=pow( modz, 1.0/n );
//Calculăm rădăcinile de ordinul n din z
printf(“Rădăcinile de ordinul %d din numărul
z=(%.2lf)+i(%.2lf) sunt:\n\n”,
n, z.x, z.y );
for(m=0; m<n; m++)
{ arg=(argz+2*PI*m)/n;
59
printf(“r(%2d)=(%-.2lf)+i(%-.2lf)\n”,
m, mod*cos(arg), mod*sin(arg) ); }
getch();
}
#include <conio.h>
#include <stdio.h>
typedef struct { long unsigned m; long unsigned n; }
RATIONAL;
#include "f:\bc\mydir\ex6_4.c"
void main(void)
{ RATIONAL *p, frac;
clrscr();
printf("Introduceţi o fracţie raţională:\n\n");
scanf("%lu %lu", &frac.m, &frac.n);
printf("\n\nAţi introdus fracţia:\n\n");
printf("%lu/%lu\n\n", frac.m, frac.n);
p=simplifica( &frac );
printf("Fracţia simplificată este:\n\n");
printf("%lu/%lu",p->m,p->n);
getch();
}
60
Пример 6.6. Программа вычисляет объем одного из тел: куба, шара,
прямого конуса, прямого цилиндра, прямого параллелипипеда или прямой
пирамиды. Величины, необходимые для вычисления объема, будут храниться
в объединении. Объемы вычисляются по формулам:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define PI 3.14159265358979
void main(void)
{ union { double r;
double a[2];
double b[3]; } c;
int v; double volum; clrscr();
printf(“Alegeţi o alternativă:\n\n”);
printf(“1 – cub\n
2 – sferă\n
3 – con\n”);
printf(“4 – cilinrdu\n
5 – paralelepiped\n
6 – piramidă\n\n”);
scanf(“%d”,&v); printf(“\n\n”);
switch(v) {
default:printf(“Aţi ales alternativa de
ieşire”); getch(); exit(1);
case 1: printf (“Introduceţi lungimea
laturii cubului: ”);
scanf(“%lf”, &c.r);
volum=c.r*c.r*c.r;
printf(“\n\nVolumul cubului cu
latura a=%-.2lf este ”); break;
case 2: printf(“Introduceţi lungimea razei
sferei: ”);
scanf(“%lf”, &c.r);
volum=4.0/3.0*PI*c.r*c.r*c.r;
printf(“\n\nVolumul sferei cu raza
r=%-.2lf este ”); break;
case 3: printf(“Introduceţi lungimea razei
circumferinţei din baza conului”);
61
printf(“ şi înălţimea conului: ”);
scanf(“%lf%lf”,&c.a[0],&c.a[1]);
volum=1.0/3.0*PI*c.a[0]*c.a[0]*c.a[1];
printf(“\n\nVolumul conului cu raza
bazei”);
printf(“ r=%-.2lf şi înălţimea h=%-
.2lf este ”); break;
case 4: printf(“Introduceţi lungimea razei
circumferinţei din baza cilindrului”);
printf(“ şi înălţimea cilindrului: ”);
scanf(“%lf%lf”,&c.a[0],&c.a[1]);
volum=PI*c.a[0]*c.a[0]*c.a[1];
printf(“\n\nVolumul cilindrului cu
raza ”);
printf(“bazei r=%-.2lf şi înălţimea
h=%-.2lf este ”); break;
case 5: printf(“Introduceţi lungimile
laturilor paralelipipedului: ”);
scanf(“%lf%lf%lf”,
&c.b[0],&c.b[1],&c.b[2]);
volum=c.b[0]*c.b[1]*c.b[2];
printf(“\n\nVolumul papalelipipedului
cu laturile ”);
printf(“a=%-.2lf, b=%-.2lf şi
c=%-.2lf este ”); break;
case 6: printf(“Introduceţi lungimile
laturilor dreptunghiului ”);
printf(“din baza piramidei ”);
printf(”si inaltimea piramidei: ”);
scanf(“%lf%lf%lf”,
&c.b[0],&c.b[1],&c.b[2]);
volum=1.0/3.0*c.b[0]*c.b[1]*c.b[2];
printf(“\n\nVolumul piramidei cu
laturile dreptunghiului ”);
printf(“din bază a=%-.2lf, b=%-.2lf
şi înălţimea h=%-.2lf este ”);
}
printf(“%-.2lf\n\n”,volum);
getch();
}
#include <conio.h>
#include <stdio.h>
void main(void)
{ unsigned nl;
62
enum { Ian=1, Feb, Mar, Apr, Mai, Iun,
Iul, Aug, Sep, Oct, Nov, Dec } dl;
enum { Primăvara=1, Vara, Toamna, Iarna } da;
while(1)
{ clrscr();
printf(“Introduceţi numărul unei luni
calendaristice: ”);
if( scanf(“%u”, &dl)==1 )
if( dl>0 && dl<13 ) break; }
if( dl==Dec||dl==Ian||dl==Feb )
{ da=Iarna; printf(“%u – Iarna\n”, da); }
if( dl==Mar||dl==Apr||dl==Mai )
{ da=Primăvara; printf(“%u – Primăvara\n”,
da); }
if( dl==Iun||dl==Iul||dl==Aug )
{ da=Vara; printf(“%u – Vara\n”, da); }
if( dl==Sep||dl==Oct||dl==Nov )
{ da=Toamna; printf(“%u – Toamna\n”, da); }
getch();
}
#include <conio.h>
#include <stdio.h>
void main(void)
{ union { struct {
unsigned b0_3 : 4;
unsigned : 4;
unsigned : 4;
unsigned b12_15: 4;
} nb;
unsigned n; } nu;
clrscr();
printf("Inroduceţi un număr întreg fără semn: ");
scanf("%u",&nu.n);
printf("%u\n",nu.nb.b12_15);
printf("%u",nu.nb.b0_3);
getch();
}
Содержание работы:
63
6.0. Введите и выполните программы из примеров 6.1-6.8.
Контрольные вопросы:
64
6.1. Что такое тип определенный пользователем ? Какие это типы?
6.2. Что такое структура ? Каково различие между структурой и
массивом?
6.3. Как объявляется структура?
6.4. Как производится ссылка на компоненты структуры?
6.5. Как выделяется память для структур ?
6.6. С какой целью используются данные типа структуры?
6.7. Что такое структура анонимного типа?
6.8. Что такое объединение ? Чем отличается объединение от
структуры?
6.9. Как объявляется объединение?
6.10. Как производится ссылка на компоненты объединения?
6.11. Как выделяется память для объединений?
6.12. С какой целью используется тип объединение?
6.13. Что такое объединение анонимного типа?
6.14. Что представляет собой тип битовые поля ?
6.15. Как объявляются данные типа битовые поля?
6.16. Как производится ссылка на битовые поля?
6.17. Как выделяется память для данных типа битовые поля?
6.18. С какой целью используется тип битовые поля?
6.19. Какого типа могут быть битовые поля?
6.20. Какова максимальная длина битового поля?
6.21. Какова минимальная длина битового поля и что она означает?
6.22. Что означает отсутствие имени битового поля в объявлении
соответствующего типа битовые поля?
6.23. Что представляет собой тип перечисление ?
6.24. Как объявляется тип перечисление?
6.25. Как выделяется память для данных типа перечисление?
6.26. В каких целях используется тип перечисление?
6.27. Какие значения неявно присваиваются смысловым именам в
объявлении типа перечисление?
6.28. Как можно присвоить смысловым именам из объявления типа
перечисление значения отличные от неявных значений?
6.29. Каков тип значений смысловых имен в объявлении типа
перечисление?
6.30. Какие операции можно производить над данными типа
перечисление?
6.31. Как можно переименовать тип?
6.32. Рассмотрите вопросы теста тест_06 и выберите правильные ответы
на каждый вопрос.
65
Лабораторная работа N 7
Указания:
Примеры программ:
#include <conio.h>
#include <stdio.h>
void main(int argc, char *argv[])
{ int i=0;
clrscr();
for( ; i++<argc-1; )
printf(“%s\n”,argv[i]);
getch();
}
66
Пример 7.2. Программа определяет количество дней в календарном
месяце. Название месяца и соответствующий год являются аргументами
функции main().
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main(int a, char *b[])
{ char *dl[]=
{"","Ianuarie", "Februarie", "Martie",
"Aprilie", "Mai", "Iunie",
"Iulie", "August", "Septembrie",
"Octombrie", "Noiembrie", "Decembrie"};
int i,bi,an,nz[]=
{0,31,28,31,30,31,30,31,31,30,31,30,31};
clrscr(); an=atoi(b[2]);
bi=(an%4==0)&&(an%100)||(an%400==0);
if( bi ) nz[2]+=1;
for(i=1; i<13; i++)
if( !strcmp(b[1],dl[i]) )
{ printf("\n%s - %d zile\n",b[1],nz[i]);
break; }
getch();
}
#include <conio.h>
#include <stdio.h>
void main(int p, char **w)
{ double c(int, char **),k;
k=c(p,w);
if( k>0 ) printf("\n\nargv[1]: %s\n",w[1]);
else printf("\n\nargv[2]: %s\n",w[2]);
getch(); }
Пример 7.4. Функция main() может вызвать саму себя. В этом примере
функция main() имеет один параметр – название определенного языка
программирования. Программа должна “угадать” это название, прочитав
название какого-либо языка со стандартного ввода.
#include <conio.h>
#include <stdio.h>
#include <string.h>
void main(int a, char *b[])
{ char *s; clrscr();
printf("Limbajul de programare ? ");
gets(s);
if( strcmp(s,b[1]) )
{ printf("Greşit ! Apăsaţi o tastă
!\n");
getch(); main(a,b); }
printf("Corect ! Aţi ghicit !
Apăsaţi o tastă !\n");
getch(); exit(1);
}
Содержание работы:
Контрольные вопросы:
69
Лабораторная работа N 8
Тема: Рекурсии
Указания:
Примеры программ:
#include <stdio.h>
70
#include <conio.h>
#define MAX 170
void main(void)
{ double fact(int n);
int n; char t[255];
clrscr();
for ( ; ; )
{ printf(“n=? “);
if( gets(t)>0 && sscanf(t,”%d”,&n)==1 &&
n>=0 && n<=MAX ) break;
printf(“Se cere un număr întreg din
segmentul [0,%d]\n”,MAX); }
printf(“n=%d\tn!=%g\n”,n,fact(n));
getch();
}
double fact(int n)
{ if( n==0 ) return 1.0;
else return n*fact(n-1); }
#include <stdio.h>
#include <conio.h>
void main(void)
{ unsigned n=17, k=7, aranjamente;
clrscr();
aranjamente=A(n,k);
printf(“A(%-u,%-u)=%-u”,n,k,aranjamente);
getch();
}
#include <stdio.h>
#include <conio.h>
71
void main(void)
{ unsigned m=1,n=10;
clrscr();
printf(“%-u\t%-u\tSuma=%-u”,m,n,Suma(m,n));
getch();
}
#include <stdio.h>
#include <conio.h>
int x[4]={ 23,-34,43,-3 };
void main(void)
{ int Mic(int );
int n=3;
clrscr();
printf(“Cel mai mic număr este %d”, Mic(n));
getch();
}
int Mic(int n)
{ if( n==0 ) return x[n];
else return x[n]<Mic(n-1)?x[n]:Mic(n-1); }
#include <stdio.h>
#include <conio.h>
void citex(void)
{ int *x, *s=0;
if( scanf(“%d”,x)!=1 ) { printf(“%d”,*s);
return; }
else { *s+=*x; citex(); }
}
void main(void)
{ clrscr();
citex();
getch();
}
#include <stdio.h>
#include <conio.h>
int A[3][4]={ 1, 2, 3, 4,
72
10, 11, 12, 5,
9, 8, 7, 6 };
void main(void)
{ clrscr();
Tipar(0,0,2,3);
getch();
}
Содержание работы:
Контрольные вопросы:
74
8.1. Каковы преимущества и недостатки использования рекурсивных
функций?
8.2. Чем отличается определение в программе рекурсивной функции от
определения функции, не являющейся рекурсивной?
8.3. Где, когда и как производится размещение в памяти формальных
параметров и локальных переменных для рекурсивной функции? Объясните
на примере.
8.4. Рассмотрите вопросы теста тест_08 и выберите правильные ответы на
каждый вопрос.
75
Лабораторная работа N 9
Указания:
76
Быстрая сортировка I (quicksort; сортировка с взаимообменом позиций).
Выбирается произвольный элемент массива и переставляются элементы в
массиве так, чтобы все элементы, меньшие или равные выбранному, были
слева от него, а все элементы, большие или равные выбранному, были справа
от него. Таким образом исходный массив разбивается на два массива.
Элементы первого массива меньше или равны элементам второго массива.
Далее с каждым из этих двух массивов поступают таким же образом. Такое
разбиение продолжается до тех пор, пока в каждой части не будет только по
одному элементу. В результате исходный массив будет отсортирован по
возрастанию.
Эффективность метода зависит от разделяющего элемента, выбираемого
на каждом шаге. Простым и довольно эффективным методом выбора
разделяющего элемента является выбор элемента из середины массива, в
качестве разделяющего. Назовем метод сортировки с таким способом выбора
разделяющего элемента быстрой сортировкой I (quicksort). Он реализован
в примере 9.4.
Примеры программ:
Контрольные вопросы:
83
П р и л о ж е н и е 1
Спецификаторы формата
84
B I B L I O G R A F I E
1. Dr. Kris Jamsa, Lars Klander. Totul despre C şi C++. Manual fundamental
de programare în C şi C++. Bucureşti: Teora, 2000.
2. Herbert Shildt. C manual complet. Editura Teora, Bucureşti, 1998.
3. Liviu Negrescu. Limbajele C şi C++ pentru începători. V. 1. Editura
Microinformatica, Cluj-Napoca, 1995.
4. Vasile Petrovici, Florin Goicea. Programarea în limbajul C. Editura Tehnică,
Bucureşti, 1993.
5. Ştefan BERZAN, Rodica BERZAN. Programarea calculatoarelor. Teste,
probleme, coduri C pentru lucrările practice şi de laborator. Editura ASEM,
Chişinău, 2003.
6. Герберт Шилдт. Полный справочник по С. Москва:Издательский дом
“Вильямс”, 2002.
7. Ştefan BERZAN, Rodica BERZAN. Программирование. Tесты, задачи,
коды С для практических и лабораторных работ. Editura ASEM, Chişinău,
2003.
8. Культин Н.Б. С/С++ в задачах и примерах. СПб.: БХВ-Петербург, 2001.
9. Бьерн Строустран. Язык программирования С++.
10. Arnush Craig. Borland C++. Moscova, 1997.
11. http://www.brainbench.com
12. http://www.cplus.about.com
13. http://www.programare.ro
14. http://www.specialist.ru
15. http://www.ipg.h1.ru
16. http://www.citforum.ru
85