Шпора для ВМСиС, 1ый семестр (Луцик ЮА)
.doc
Перевод в другую сс int ss; char ms[20]; char znak=’+’; void main() { int t,i,num1,k1=10,k2=11; double num; printf("BBEDITE 4ICLO: "); scanf("%lf",&num); printf("BBEDITE TO4HOCTb: "); scanf("%d",&t); printf("BBEDITE OCHOBAHIE CC:"); scanf("%d",&ss); num<0 ? znak=’-’ , num*=-1 : num; num1=num; //celaia 4astb num-=num1; //drobnaia 4astb while(num1>=ss) //na4 zna4enia { i=num1%ss; //ostatok ot delenia num1/=ss; //celaia 4astb ot delenia ms[k1--]=i>9 ? i-10+’a’ : i+’0’; } ms[k1--]=num1>9 ? num1-10+’a’ : num1+’0’; ms[k1]=znak; ms[k2++]=’.’; while(num!=0 && k2-11<=t) { num=(num*=ss,i=num,num-=i); ms[k2++]=i>9 & i-10+’a’ : i+’0’; } for(i=k1;i<k2;i++) printf(“%c”,ms[i]); } Перевод в другую сс рекурсивно char* f(int n, int k, int p, char*s); main() {int n, p, k, n1; char *s; printf("Enter n, p: "); scanf("%d%d", &n, &p); k=0; n1=n; while (n>0) { n/=p; ++k; } s=(char*) calloc(k+1, sizeof(char)); s=f(n1, k-1, p, s); printf("Result: \n"); puts(s); free(s); getch(); return 0;} char* f(int n, int k, int p, char*s) { int ost; if (n>0) { ost=n%p; if (ost<10) { s[k]=ost+'0';} else {s[k]=ost-10+'A';} f(n/p, k-1, p, s); } return s; } Калькулятор void main() { double res; int ind=1; float a,b; char opr; do { puts("Enter a znak b"); ind=scanf("%f%c%f",&a,&opr,&b); } while (ind<3); switch (opr) { case '+': res=a+b;break; case '-': res=a-b;break; case '*': res=a*b;break; case '/': res=a/b;break; default: puts("Error");break; } fflush(stdin); if (ind) printf("Result: %8.3lf",res); getch(); } Ввести массив строк. В каждой найти максимально слово. int length(char *s) { for(int i=0;*(s+i);i++); return i;} void main() {char *str,*word; int leng,len=0,ch=0; str=(char*)malloc(256*sizeof(char)); gets(str); leng=length(str); *(str+leng)=' '; int j=0; for(int i=0;i<leng+1;i++) {if(*(str+i)!=' ') ch++; else if(ch>len) {len=ch; word=str+j; ch=0; j=i+1;} else {ch=0; j=i+1; } } printf("\nlen=%d\n",len); for(i=0;i<len;i++) printf("%c",*(word+i)); } Обнулить числа на главной диагонали #include <stdio.h> main() {int a[128][128]; int i, j, n; scanf("%d", &n); for (i=0; i<n; ++i) for (j=0; j<n; ++j) scanf("%d", &a[i][j]); for (i=0; i<n; ++i) for (j=0; j<i; ++j) if (a[i][i] == a[j][j]) a[i][i] = 0; for (i=0; i<n; ++i) {for (j=0; j<n; ++j) { printf("%4d", a[i][j]);} printf("\n"); } return 0; }
|
Поиск слова макс. длины int beg=0,i=0,j=0; void main () {char *st; int t=0,num=0,max=0,n; //razmernost' stroki scanf("%d",&n); st=(char*)calloc(n,sizeof(char)); //Vvedite text:"); gets(st); while(*(st+j)) {num=0; while (*(st+j)==' ')//propusk probelov j++; while(*(st+j)!=' ' && *(st+j)) {num++; //kolichestvo bukv v slove j++;} if(max<num)//zapominaem kolichestvo bukv {max=num; beg=j-max; //zapomnim nachalo slova num=0;}} for(i=beg;i<beg+max;i++) puts(st); getch(); } Поиск слова макс. длины и реверс этого слова double tr(double(*f1)(double),double a,double b,double e,int n) {double y2=0.,y1,x,h=(b-a)/n; do{y1=y2; y2=0.5*((*f1)(a)+(*f1)(b)); for(x=a+h;x<b;x+=h) y2+=(*f1)(x); y2*=h; h/=2;}while(fabs(y1-y2)>e); return y2;} void revers(char*,int); int beg=0;//nachalo naidennogo slova int i=0; //indexy int j=0; void main () { char *st; int t=0; int num=0,max=0; int n; clrscr(); puts("Vvedite razmernost' stroki:"); scanf("%d",&n); if(!(st=(char*)calloc(n,sizeof(char)))) {puts("Malo pamyati!"); getch(); return;} fflush(stdin); puts("\nVvedite text:"); get_str(st,n); //do etgo momenta vvod while(*(st+j)) { num=0; while (*(st+j)==' ') //propusk probelov j++; while(*(st+j)!=' ' && *(st+j)) { num++; //kolichestvo bukv v slove j++;} if(max<num)//zapominaem kolichestvo bukv {max=num; beg=j-max; //zapomnim nachalo slova num=0; } } i=beg;//peredaem nachalo slova revers(st,max); puts(st); getch(); } void revers(char *st, int max) //revers {int t=beg+max-1; //konec slova char c; if(i<t && *(st+i) && *(st+i)!=' ') {c=*(st+i); *(st+i)=*(st+t);*(st+t)=c; i++;t--;revers(st,max-1);} } Поиск слова макс. длины с помощью функции int get_str(char*,int); void main() { char *st; int i,j,k; int sum,max; int a,b;//granicy slova clrscr(); puts("Vvedite razmernost' stroki:"); scanf("%d",&k); st=(char*)calloc(k,sizeof(char)); if(!st) { puts("Malo pamyati!"); return;} fflush(stdin); puts("\nVvedite text:"); get_str(st,k); max=0; for(i=0;i<k;i++) { sum=0; if(*(st+i)==' ') i++; if(*(st+i)!=' ') { j=i; while(*(st+j)!=' ' && *(st+j++)) sum++; if(max<sum) { max=sum; a=i; b=j-1; i=j-1;} else i=j-1;} } printf ("\nKolichestvo bukv v max slove =%d",max); puts("\nSlovo s max kol-vom bukv:"); for (i=a;i<b+1;i++) printf("%c",*(st+i)); getch(); } int get_str(char *st,int k) { int c,i=0; while(--k>0 && (c=getchar())!='\n' && c!=13) *(st+i++)=c; *(st+i)='\0'; return i-1;}
|
2 массива по возрастанию. В третий по убыванию #define N 6 void swap(int *m,int i,int j) {int t; t=m[i]; m[i]=m[j]; m[j]=t; return;} void qs(int *m,int l,int r) {int i,las; if(l>=r) return; las=l; for(i=l+1;i<=r;i++) if(m[i]<m[l]) swap(m,++las,i); swap(m,l,las); qs(m,l,las-1); qs(m,las+1,r); return;} main () {int i1,i2,i3,m[N],n[N],mn[N+N]; for(i1=0;i1<N;i1++) scanf("%d",&m[i1]); for(i2=0;i2<N;i2++) scanf("%d",&n[i2]); qs(m,0,N-1); qs(n,0,N-1); i1=i2=N-1; i3=0; while(i1>=0 && i2>=0) {while(i1>=0 && m[i1]>=n[i2]) mn[i3++]=m[i1--]; while(i2>=0 && m[i1]<n[i2]) mn[i3++]=n[i2--]; } if(i1>=0) for(;i1>=0;) mn[i3++]=m[i1--]; if(i2>=0) for(;i2>=0;) mn[i3++]=n[i2--]; for(i3=0;i3<N+N;i3++) printf("%d",mn[i3]); getch (); return 0;} } Отсортировать 2 массива по возрастанию и в третий по убыванию без сортировки. Передать в функцию main. void sort(long *, int ); main () { long int *a, *b, *c; int n, m, i, j, k; printf("Enter n, m: "); scanf("%d%d", &n, &m); a = (long*) calloc(n, sizeof(long)); b = (long*) calloc(m, sizeof(long)); c = (long*) calloc(n+m, sizeof(long)); printf("Enter %d elements of A\n", n); for (i=0; i<n; ++i) scanf("%ld", &a[i]); printf("Enter %d elements of B\n", m); for (i=0; i<m; ++i) scanf("%ld", &b[i]); sort(a, n); sort(b, m); printf("Sorted A: \n"); for (i=0; i<n; ++i) printf("%4d", a[i]); printf("Sorted B: \n"); for (i=0; i<m; ++i) printf("%4d", b[i]); i=j=k=0; while ((i<n) && (j<m)) { if (a[i]<b[j]) { c[k]=a[i]; ++i; ++k; } else { c[k]=b[j]; ++j; ++k; } } while (i<n) { c[k]=a[i]; ++i; ++k; } while (j<m) { c[k]=b[j]; ++j; ++k; } printf("Result : \n"); for (i=0; i<n+m; i++) printf("%4d", c[i]); free(a); free(b); free(c); } void sort(long *a, int n) { int i, j; long temp; for (i=n-1; i>0; --i) for (j=0; j<i; j++) if (a[j] > a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } Рекурсивный ввод void rec () { char i; scanf ("%c", &i); if (i != '0') rec (); else printf ("Result: "); printf ("%3c", i); } void main () { printf ("Enter numbers: \n"); rec (); }
|
Сортировки: void srt1(int kl,int *ms) // Пузырёк { int i,j,m; for (i=0;i<kl;i++) for (j=kl;j>i;j--) if (ms[j-1]>ms[j]) { m=ms[j-1]; ms[j-1]=ms[j]; ms[j]=m; }} void srt2(int kl,int *ms) // Метод через отбор { int i,j,m,kk; for (i=0;i<kl-1;i++) { m=i; kk=ms[i]; for (j=i+1;j<kl;j++) if (ms[j]<kk) { m=j; kk=ms[j]; } ms[m]=ms[i]; ms[i]=kk; } } void srt3(int kl,int *ms) // Метод втавок { register int i,j,kk; for (i=1;i<kl;i++) { j=i-1; kk=ms[i]; while (j>=0 && kk<ms[j]) ms[j-- +1]=ms[j]; ms[j+1]=kk; } } void srt4(int kl,int *ms) // Шейкер { int a,b=kl-1,c=1,d=kl-1,i; do { for (i=d;i>=c;i--) if (ms[i-1]>ms[i]) { a=ms[i]; ms[i]=ms[i-1]; ms[i-1]=a; b=i; } c=b+1; for (i=c;i<=d;i++) if (ms[i-1]>ms[i]) { a=ms[i]; ms[i]=ms[i-1]; ms[i-1]=a; b=i; } d=b-1; } while (c<=d); } void srt5(int kl,int *ms) // Шелл (quick sort) { int i,j,dp,a; for (dp=kl/2;dp>0;dp/=2) for (i=dp;i<kl;i++) for (j=i-dp; j>=0 && ms[j]>ms[j+dp]; j-=dp) {a=ms[j]; ms[j]=ms[j+dp]; ms[j+dp]=a; } } void srt6 (int *a,int l,int r) // Хоар { int i,las; if (l>=r) return; swap(a,l,(l+r)/2); las=l; for (i=l+1;i<=r;i++) if (a[i]<a[l]) swap(a,++las,i); swap(a,l,las); srt6(a,l,las-1); srt6(a,las+1,r); } void swap(int *a,int i,int j) { int tmp=a[i]; a[i]=a[j]; a[j]=tmp; } void main() { clrscr(); int ms1[]={8,5,2,6,7,1,3,4},i; int ms2[]={8,5,2,6,7,1,3,4}; int ms3[]={8,5,2,6,7,1,3,4}; int ms4[]={8,5,2,6,7,1,3,4}; int ms5[]={8,5,2,6,7,1,3,4}; int ms6[]={8,5,2,6,7,1,3,4}; srt1(7,ms1); srt2(8,ms2); srt3(8,ms3); srt4(8,ms4); srt5(8,ms5); srt6(ms6,0,7); for (i=0;i<8;i++) printf("%3d",ms1[i]); printf("\n"); for (i=0;i<8;i++) printf("%3d",ms2[i]); printf("\n"); for (i=0;i<8;i++) printf("%3d",ms3[i]); printf("\n"); for (i=0;i<8;i++) printf("%3d",ms4[i]); printf("\n"); for (i=0;i<8;i++) printf("%3d",ms5[i]); printf("\n"); for (i=0;i<8;i++) printf("%3d",ms6[i]); printf("\n"); getch(); } Седловая точка void main() {int **p,i,j,k,n,i1,i2,j1,t,m; //Razmernost' stroki scanf("%d",&k); p=(int**)malloc(k*sizeof(int*)))) //Razmernost' stolbca scanf("%d",&n); for (i=0;i<n;i++) *(p+i)=(int*)malloc(n*sizeof(int)) //vvod matricy for (i=0;i<k;i++) for (j=0;j<n;j++) scanf("%d",(*(p+i)+j)); /*Poisk sedlovoi tochki*/ for(i=0;i<k;i++) { t=*(*(p+i)+0); i1=i; j1=0; for(j=1;j<n;j++) if(*(*(p+i)+j)>t) { t=*(*(p+i)+j); i1=i;j1=j;} m=0; for(i2=0;i2<k;i2++) if(*(*(p+i1)+j1)>=*(*(p+i2)+j1) && i1!=i2) m=1; if(!m){printf("\nNaidena sedlovays tochka %d c koordinatami: %d-stroka,%d-stolbec",*(*(p+i1)+j1),i1+1,j1+1); break;}} } |
Вставить одну строку в N-ую позицию второй строки main() { char *a, *b; int n, m, k, i; printf("Enter n, m: "); scanf("%d%d", &n, &m); a = (char*) calloc(n+m+1, sizeof(char)); if (a==NULL) { printf("Not allocated!"); return 1; } b = (char*) calloc(m+1, sizeof(char)); if (b==NULL) { printf("Not allocated!"); return 1; } fflush(stdin); gets(a); gets(b); printf("Enter position: "); scanf("%d", &k); for (i=n-1; i>=k; --i) a[m+i]=a[i]; for (i=0; i<m; ++i) a[k+i]=b[i]; printf("Result: \n"); puts(a); } 2 строки. Вставить первую строку во вторую с фунциями char *str_cat(char*,char*,int); int get_str(char*,int); int str_len(char*); void main () {char *st,*ss,*tmp=""; int i,j,k,n; scanf("%d",&n);//razmernost' 1-oi stroki if(!(st=(char*)calloc(n,sizeof(char)))) {puts("Malo pamyati!");return;} scanf("%d",&k);//razmernost' 2-oi stroki //выделение памяти get_str(st,n);//kuda budem vstavlyat' get_str(ss,k);//kotoruyu nado vstavit' scanf("%d",&j);//index, s kotorogo nado vstavit' tmp=str_cat(st,ss,j);free(st); st=tmp;puts(st);} int get_str(char *st,int n) {int c,i=0; while(--n>0 && (c=getchar())!='\n' && c!=13) *(st+i++)=c; *(st+i)='\0';return i-1;} char *str_cat(char *s1,char *s2,int k) {char *ss;int i; if(k>str_len(s1)) k=str_len(s1); ss=(char*)malloc(str_len(s1)+str_len(s2)); for(i=0;i<k;i++) *(ss+i)=*(s1+i); for(i=0;*(s2+i);i++) *(ss+k+i)=*(s2+i); for(i=0;*(ss+k+str_len(s2)+i-1)=*(s1+k+i);i++); *(ss+k+str_len(s2)+i)='\0'; free(s1); s1=ss; return s1;} int str_len(char *s) {for(int t=0;*(s+t);t++); return t; } В main задать k строк. Написать функцию с неопределенным кол-вом параметров, которая принимает k строк заданных в main и находит слово максимальной длины. #define N 5 char* f(int n, ...); main() { int m, i; char *s[N],*w; printf("Enter max length: "); scanf("%d", &m); for (i=0; i<N; ++i) s[i] = (char *) calloc(m+1, sizeof(char)); fflush(stdin); for (i=0; i<N; ++i) { printf("Enter %d-s string: ", i); gets(s[i]); } w=f(N, s[0], s[1], s[2], s[3], s[4]); printf("%s\n", w); w=f(3, s[0], s[1], s[2]); printf("%s\n", w); } char* f(int n, ...) { char **s; int i, j, begin, end, curlen, maxlen; int maxi, maxj, slen, st; char *w; s=(char**)(...); maxlen=0; for (i=0; i<n; i++) { st=0; slen=strlen(s[i]); for (j=0; j<=slen; j++) { if ((st==0) && ( (s[i][j]>='a') && (s[i][j]<='z') || (s[i][j]>='Z') && (s[i][j]<='Z') ) ) { begin = j; st=1; } else if ((st==1) && !((s[i][j]>='a') && (s[i][j]<='z') || (s[i][j]>='Z') && (s[i][j]<='Z') )) {end=j; st=0; curlen=end-begin; if (curlen > maxlen) { maxlen=curlen; maxi=i; maxj=begin; } } } } w=(char *) calloc(maxlen+1, sizeof(char)); for (i=0; i<maxlen; ++i) w[i] = s[maxi][maxj+i]; return w; } |
Поменять 1 и 2 местами main () {int i,i1,i2,j1,j2; char s[20],c; gets(s); for(i=0;i<20;i++) if(!i || ((s[i-1]==' ')&&(s[i]!=' '))) {i1=i; while(s[i]!=' ') i++; i2=i; break; } for(i;i<20;i++) if(!i || ((s[i-1]==' ')&&(s[i]!=' '))) {j1=i; while(s[i]!=' ') i++; j2=i; break; } for(i=i1;i<(i1+j2)/2;i++) {c=s[i]; s[i]=s[i+j1]; s[i+j1]=c; } printf("%s\n",s); getch (); return 0; } Поменять 1 и последнее void main () {char *st,*st1; int t=0,num1=0,num2=0,n,k=0; int beg1=0,end2=0,i=0,i1=0; int j=0,j1=0; //razmernost' stroki scanf("%d",&n); st=(char*)calloc(n,sizeof(char)); //Vvedite text:"); k=get_str(st,n); while (*(st+j)==' ')//propusk probelov j++; if(*(st+j)!=' ' && *(st+j)) beg1=j; while(*(st+j)!=' ' && *(st+j)) {num1++;//schitaem kol-vo bukv v pervom slove j++; if(*(st+j)==' ') break;} i=k;//stavim index v konec stroki while(*(st+i)==' ' && i!=0) //propusk probelov i--;if(*(st+i)!=' ' && i!=0) //zapominaem konec slova end2=i; while(*(st+i)!=' ' && i!=0) //prohod po poslednemu slovu {num2++;//schitaem kol-vo bukv v posled slove i--; if(*(st+i)==' ') break;} st1=(char*)calloc(k+1,1);//sozdaem novuyu stroku i1=0; i=0; j=0; while(*(st+t)) {while(i!=beg1 && *(st+i)) //perezapis' stroki do pervogo slova {*(st1+i1)=*(st+i); i++; i1++; t++; } if(i==beg1)//esli doshli do pervogo slova j=end2-num2+1;//stanovimsya v nachalo poslednego slova while(j<end2+1) //poka ne do konca stroki { *(st1+i1)=*(st+j); j++; i1++; t++; } if(j==end2+1)//esli konec stroki i=beg1+num1; while(*(st+i) && i!=end2-num2+1) //do nachala poslednego slova { *(st1+i1)=*(st+i); //perepisyvaem stroku i++; i1++; t++; } if(i==end2-num2+1) //esli nachalo vtorogo slova j=beg1;//ot nachala pervogo slova while(*(st+j)!=' ' && *(st+j)) { *(st1+i1)=*(st+j); j++; i1++; t++; } if(*(st+j)!=' ') { i=end2+1; while(i<k+1) //dozapis' stroki {*(st1+i1)=*(st+i); i++; i1++; t++; } } *(st1+i1)='\0'; } free(st); st=st1; puts(st); } int get_str(char *st,int n) {int c,i=0; while(--n>0 && (c=getchar())!='\n' && c!=13) *(st+i++)=c; *(st+i)='\0'; return i-1; } Удаление символа void swap(char*);//funkcia zameny elementov void del(char**,char); void main() {char **st,simv; int i,j,k,n,t; //количество строк scanf("%d",&n); st=(char**)calloc(n,sizeof(char*)); //количество символов scanf("%d",&t); for(i=0;i<t;i++) *(st+i)=(char*)calloc(t,sizeof(char)); for(i=0;i<n;i++) gets(*(st+i)); //символ для поиска scanf("%c",&simv); for(i=0;i<n;i++) del(st+i,simv); for(i=0;i<n;i++) puts(*(st+i)); getch();} void del(char *(*(st+i)),char simv) {static j; if(*(*(st+i)+j)==simv) {if(*(*(st+i)+j+1)) swap(*(st+i)+j);} else j++; if(*(*(st+i)+j)) del(st+i,simv);} void swap(char *pp) {*pp=*(pp+1); if(*pp) swap(pp+1); }
|
Ввести несколько чисел. Вывести в обратн. порядке void func(); int k; void main() {//количество чисел scanf("%d",&k); //ввод чисел func();} void func() {static i; int j; scanf("%d",&j); i++; if(i<k) func(); printf("\n%d:%d",i--,j); } Рекурсивный переворот строки наместе void rev1(char *ss,int nn) { static i; char c; c=*(ss+i++); if(c) rev1(ss,nn); else return; *(ss+nn- (--i)=c; } void rev2(char *ss,int nn) { static i; char c; c=*(ss+i++); *(ss+i)=*(ss+nn-1-i) *(ss+nn-1-i)=c; if(++i < nn/2) rev2(ss,nn); else return; } Реверс первого слова void main() {char *s,c; int n; s=(char*)malloc(100*sizeof(char)); gets(s); n=0; while (*(s+n)!=' ' && *(s+n)) n++; n--; for(int i=0;i<(n+1)/2;i++) {c=*(s+i); *(s+i)=*(s+n-i); *(s+n-i)=c;} puts(s); } Реверс главной диагонали void revers(int k,int** mt) {static i,j=k-1; int tmp=*(*(mt+i)+i); *(*(mt+i)+i)=*(*(mt+j)+j); *(*(mt+j)+j)=tmp; i++;j--; if(i<j) revers(k,mt); i--;j++; } Реверс слов в массиве строк #define n 3 void revs(char* m) {int l; static int i,k; char *s; l=0; while(m[i]!=' '&&m[i]!='\0') { l++; i++;} s=(char*)malloc(l*sizeof(char)); for(k=0;k<l;k++) s[k]=m[i-l+k]; if(m[i]) { i++; revs(m); m[i++]=' '; for(k=0;k<l;k++,i++) m[i]=s[k]; m[i]='\0';} else { i=0; for(k=0;k<l;k++,i++) m[i]=s[k]; m[i]='\0';}} void revb(char* m) {static int i,j; char c; c=m[i++]; if(c) { revb(m);} else {i=0; j=0; return;} m[j++]=c; return;} main() {int i,f; char m[100]; clrscr(); for (f=0;f<=n;f++) {gets(m); i=0; while(m[i]) i++; revb(m); puts(m);} getch(); return 0;} Ввести массив строк и рекурсивно сделать реверс строки void f(char*, int, int); main() { char **s; int n, m; int i; //ввести //выделить память for (i=0; i<n; ++i) { printf("Enter str #%d: ", i+1); gets(s[i]); } for (i=0; i<n; ++i) { f(s[i], strlen(s[i]), 0); } printf("Result: \n"); for (i=0; i<n; ++i) { puts(s[i]); } } void f(char* s, int n, int i) { char tmp; if (i<n/2) { tmp = s[i]; s[i] = s[n-i-1]; s[n-i-1] = tmp; f(s, n, i+1); } } |
2 матрицы умножить (while) #define N1 3 #define N2 3 #define N3 3 int m[N1][N2]; int n[N1][N2]; int mn[N1][N3]; main () { int i,j,k; clrscr (); for (i=0; i<N1; i++) for (j=0; j<N2; j++) scanf ("%d",&m[i][j]); for (i=0; i<N2; i++) for (j=0; j<N3; j++) scanf("%d",&n[i][j]); i=0; while (i<N1) { j=0; while (j<N3) {mn[i][j]=0; k=0; while (k<N2) {mn[i][j]+=m[i][k]*n[j][k]; k++; } j++;} i++; } for (i=0; i<N1; i++) {printf ("\n"); for (j=0; j<N3; j++) printf ("%d ",mn[i][j]); } getch (); return 0; } Перемножить 2 матрицы циклами do...while void main() { int *m1,*m2,*m3,m,n,k,i,j,i1,i2,i3,j1,j2,j3; scanf("%d%d%d",&m,&n,&k); m1=(int*)malloc(m*n*sizeof(int)); m2=(int*)malloc(n*k*sizeof(int)); m3=(int*)calloc(m*k,sizeof(int)); for(i=0;i<m*n;i++) scanf("%d",m1+i); for(i=0;i<n*k;i++) scanf("%d",m2+i); i2=i3=j2=j3=0; for(i1=0;i1<m;i1++) {do {j1=0; do {*(m3+i3*k+j3)+=*(m1+i1*n+j1)**(m2+i2*k+j2); i2++; j1++; }while((i2<n) && (j1<n)); j3++; j2++; i2=0; }while(j2<k && j3<k); j3=0; i3++; i2=0; j2=0; } } Функция перемножения двух матриц циклами do...while void mul(int **a, int **b, int **&c, int n, int m, int k); void input(int **&a, int &n, int &m); void output(int **a, int n, int m); void alloc(int **&a, int n, int m); main() { int **a1, **a2, **a3, n1, m1, n2, m2; printf(" Matrix 1: \n"); input(a1, n1, m1); printf(" Matrix 2: \n"); input(a2, n2, m2); alloc(a3, n1, m2); mul(a1, a2, a3, n1, m1, m2); printf(" Result: \n"); output(a3, n1, m2); } void mul(int **a, int **b, int **&c, int n, int m, int k) { int i, j, l; i=0; do { j=0; do { c[i][j]=0; l=0; do { c[i][j] += a[i][l]*b[l][j]; ++l; } while (l<m); ++j; } while (j<k); ++i; } while (i<n); } void alloc(int **&a, int n, int m) { int i, j; a=(int **) calloc(n, sizeof(int *)); for (i=0; i<n; ++i) { a[i]=(int*) calloc(m, sizeof(int)); } } void input(int **&a, int &n, int &m) { int i, j; printf("Enter n, m: "); scanf("%d%d", &n, &m); alloc(a, n, m); printf("Enter matrix: \n"); for (i=0; i<n; ++i) { for (j=0; j<m; ++j) scanf("%d", &a[i][j]); } } void output(int **a, int n, int m) { int i, j; for (i=0; i<n; ++i) { for (j=0; j<m; ++j) printf("%4d", a[i][j]); } } |
НОД рекурсией int NOD(int n, int m); main() { int n, m; int nod; scanf("%d%d", &n, &m); nod = NOD(n, m); printf("%d \n", nod); return 0;} int NOD(int n, int m) { int t; if (n<m) { t=n; n=m; m=t;} /* n >= m */ if (n%m==0) {return m;} else return NOD(n%m, m); } Фиббоначи рекурсией int fin(int); void main() {int n,i; scanf("%d",&n); for(i=0;i<n;i++) printf("\n%4d",fin(i)); } int fin(int n) {return !n || (n==1)?1:fin(n-1)+fin(n-2); } Ввести символьную строку, и для каждого числа найти числа Фиббоначчи рекурсией int fin(int); void main() {int *m,n,i; scanf("%d",&n);//razm. massiva m=(int*)malloc(n*sizeof(int)); for(i=0;i<n;i++) scanf("%d",m+i); for(i=0;i<n;i++) printf("\n%d",fin(*(m+i))); } int fin(int n) {return (n==0 || n==1)?1:fin(n-1)+fin(n-2); } sinX #include<stdio.h> #include<conio.h> #include<math.h> int fact(int n); void main() {int n,i,ch=1,a,b,h,j; double e,sum=0; puts("Vvedite a,b,h, kolichestvo slagaemyx i tochnost':"); scanf("%d%d%d%d%lf",&a,&b,&h,&n,&e); for(j=a;j<=b;j+=h) {for(i=1;i<2*n && (pow(j,i)/fact(i))>e;i+=2) if(ch%2!=0) {sum+=pow(j,i)/fact(i); ch++; } else {sum-=pow(j,i)/fact(i); ch++;} printf("\nSinX = %lf",sum);}} int fact(int n) {if(n==0 || n==1) return 1; return fact(n-1)*n; } Нахождение логарифма #include<stdio.h> #include<conio.h> #include<math.h> int fact(int n); void main() {int n,i,ch=1; double x,e,sum=0; puts("Vvedite chislo, kolichestvo slagaemyx i tochnost':"); scanf("%lf%d%lf",&x,&n,&e); for(i=1;i<=n && (pow(x-1,i)/i)>e;i++) if(ch%2!=0) {sum+=pow(x-1,i)/i; ch++; } else {sum-=pow(x-1,i)/i; ch++; } printf("\nlnX = %lf",sum);} Факториал (3 способа) #include<stdio.h> int fact1(int n); int fact2(int n); int fact3(int n); void main() {int n,f1,f2=0,f3=0; puts("Enter n:"); scanf("%d",&n); f1 = fact1(n); f2 = fact2(n); f3 = fact3(n);} int fact1(int n) {if(n==1) return 1; else return fact1(n-1)*n;} int fact2(int n) {return n?n*fact2(n-1):1;} int fact3(int n) {static long i; // т.к. i-статическая, то для нее не созда- if(!n) return 1;// ется копии и при возврате через return // для вычисления 0! if (++i<n) return fact3(n)*--i; return n; // i сохраняет const максимальное значение}
|
Посчитать за один проход кол-во цифр и букв main() { char s[1024]; int cnt[256]; int i, n; printf("Enter string: \n"); gets(s); for (i=0; i<256; ++i) cnt[i]=0; for (i=0; s[i]!='\0'; ++i) { cnt[s[i]]++; } for (i=0; i<256; ++i) { if (cnt[i] > 0) { printf(" %c : %d time(s) \n", i, cnt[i]); }} } Найти в каждой строке слова состоящие из первых 5 букв и вывести их. Не использ. другие массивы void main() {char **st;clrscr();scanf("%d",&k); st=(char**)calloc(k,sizeof(char*)); for(i=0;i<=k;i++){*(st+i)=(char*)calloc(200,sizeof(char)); gets(*(st+i));}for(i=1;i<=k;i++){while(*(*(st+i)+j)!='\0') {while(*(*(st+i)+j)!='\0' && *(*(st+i)+j)!=' ') {for(y=0;y<5;y++){if(*(*(st+i)+j)=='a'+y) {j1=j;j1--;while(j1>=0 && *(*(st+i)+j1)!=' ') {if(*(*(st+i)+j1)==*(*(st+i)+j)){s1++;j1--;} else j1--;}if(s1==0){s++;break;}else s1=0;}}j++;}if(s==5) {j-=5;s=0;while(*(*(st+i)+j)!='\0' && *(*(st+i)+j)!=' ') {printf("%c",*(*(st+i)+j));j++;}} else s=0; if(*(*(st+i)+j)!='\0')j++;}}getch(); } Сортирока слов через коммандную строку void main(int argc,char** argv) {int i,j,k,z; char *c; clrscr(); for(i=1;i<argc-1;i++) for(j=1;j<argc-i;j++) { k=0; while(!(z=*(*(argv+j)+k)-*(*(argv+j+1)+k))) k++; if(z>0) { c=*(argv+j); *(argv+j)=*(argv+j+1); *(argv+j+1)=c;} } for(i=1;i<argc;i++) puts(*(argv+i)); return; } Массив строк содерж по алф. int str_cmp(char*,char*); void copy(char*,char*); void sort(int size,char str[][80]) {int i,j;char tmp[80]; for(i=0;i<size-1;i++) for(j=i+1;j<size;j++) if(str_cmp(str[i],str[j])>0) {copy(tmp,str[i]); copy(str[i],str[j]); copy(str[j],tmp);}} void copy(char *s1,char*s2) {while(*s1++=*s2++);} int str_cmp(char *s1,char *s2) {while(*s1 || *s2) if(*s1-*s2) return *s1-*s2; else {s1++;s2++;}} void main() {char arr[10][80]; int num,i; do{printf("Vvedite kol-vo strok:\n"); scanf("%d",&num);}while(num>10); for(i=0;i<num;i++) gets(arr[i]);//vvod} sort(num,arr); printf("\nOtsortirovannye stroki:\n"); for(i=0;i<num;i++) puts(arr[i]); } Отсортировать главную диагональ (указатель на указатель) void sort(int k,int** mt) {int i,j; for(i=0;i<k;i++) for(j=k-1;j>i;j--) if(*(*(mt+i)+i)>*(*(mt+j)+j)) {int tmp=*(*(mt+i)+i); *(*(mt+i)+i)=*(*(mt+j)+j); *(*(mt+j)+j)=tmp;}} void main() {int **p,i,j,k; printf("\nRazmernost' stroki i stolbca:"); scanf("%d",&k); if (!(p=(int**)malloc(k*sizeof(int*)))) {puts("Malo pamyati!");return;} for (i=0;i<k;i++) if (!(*(p+i)=(int*)malloc(k*sizeof(int)))) {puts("Malo pamyati!");for (j=0;j<i;j++) free (*(p+j));free (p);return;} //vvod matricy for (i=0;i<k;i++) for (j=0;j<k;j++) {printf("mt[%d][%d]=",i,j); scanf("%d",(*(p+i)+j));} /*Vyvod matricy do sortirovki*/ for (i=0;i<k;i++){printf("\n"); for (j=0;j<k;j++) printf("%5d",*(*(p+i)+j));} sort(k,p); /*Vyvod matricy s otsortirovannym*/ }
|
Создать ф-цию с переменным числом параметров, в которую передаются k массивов типа float, затем найти тот массив, в котором сумма элементов максимальна вывести его #define K 5 int f(int n, int m, ...); main() { float **a; int m; int i, j; float b[K][100]; printf("Enter size of arrays: "); scanf("%d", &m); a=(float**) calloc(K, sizeof(float*)); if (!a) { return 1; } for (i=0; i<K; ++i) { a[i] = (float*) calloc(m, sizeof(float)); if (a[i]==NULL) { printf("Could not allocate memory!"); return 1; } } for (i=0; i<K; ++i) for (j=0; j<m; ++j) { scanf("%f", &b[i][j]); } i=f(K, m, b[0], b[1], b[2], b[3], b[4]); for (j=0; j<m; ++j) printf("%5.3f ", b[i][j]); printf("\n"); } int f(int n, int m, ...) { int i, j; float **a; float s, maxs; int maxi; a=(float**)(...); maxs=0; for (i=0; i<n; ++i) { s=0; for (j=0; j<m; ++j) s+=a[i][j]; if (s>maxs) { maxi=i; maxs=s; } } return maxi; } A to I atoi (char *ss) { int n,i=0, znak; while (ss[i]==’ ‘) i++; if (!ss[i]) return 0; znak (ss[i]==’-‘)? –1:1; if (ss[i]==’+’ || ss[i]==’-’) i++; for (n=0;ss[i]>’0’ && ss[i]<=9; i++) n=10*n+(ss[i]-‘0’); return znak *n; } I to A void itoa(int); void main() {int n; scanf("%d",&n); itoa(n);} void itoa(int n) {int i=0; char *st,znak; n>0?znak='+':znak='-'; znak=='-'?n=-n:n; st=(char*)calloc(100,sizeof(char)); do *(st+i++)=n%10+'0'; while ((n/=10)>0); *(st+i)=znak; for(int j=i;j>=0;j--) printf("%c",*(st+j));} A to F double atof(char *s) { double n, ii=0; int i=0, znak; while (ss[i]==’ ‘) i++; if (!ss[i]) return 0; znak=(ss[i]==’-‘)?-1:1; if(ss[i]=’-‘ || ss[i]==’+’) i++; for (n=0.0; (ss[i]=’0’ && ss[i]<=’s’) || ss[i]==’.’; i++) { if (ss[i]=’.’) n=10.* n+(ss[i]-‘0’); else ii=1; if (ii) ii*=10; } ii/=10; return znak *n/ii; } Посчитать сумму неизвестного числа Int и Float переменных. Использовать va_list, va_start #include <stdio.h> #include <stdlib.h> #include <stdarg.h> enum Type { End, Float, Int}; float f(...); main() { float sum; sum = f(Int, 5, Float, 7.3, Int, 2, End); printf("%5.3f\n", sum); return 0;} float f(...) { float sum=0; Type type; int int_var; float float_var; va_list a; va_start(a, 0); while ( (type = va_arg(a, Type) ) != End) {if (type==Int) { int_var = va_arg(a, int); sum+=(float) int_var;} else if (type==Float) { float_var = va_arg(a, double); sum+=(float)float_var;}} va_end(a); return sum; }
|
Нахождение интеграла методом трапеции double fun(double); double trap(double(*)(double),double,double,double,double); void main() {double(*f)(double),a,b,e,n; scanf("%lf%lf%lf%lf",&a,&b,&e,&n); f=fun; printf("Integral=%lf",trap(f,a,b,e,n));} double trap(double(*f)(double),double a,double b,double e,double n) {double y1,y2=0,x,h; h=(b-a)/n; do {y1=y2; y2=0.5*((*f)(b)+(*f)(a)); for(x=a+h;x<=b-h;x+=h) y2+=(*f)(x); y2*=h; h/=2;} while(fabs(y1-y2)>e); return y2;} double fun(double x) {return x-1; } Нахождение интеграла методом прямоуголн. double fun(double); double rect(double(*)(double),double,double,double,double); void main() {double (*f)(double); double a,b,e,n; scanf("%lf%lf%lf%lf",&a,&b,&e,&n); f=fun; printf("Koren=%lf",rect(f,a,b,e,n));} double rect(double(*f)(double),double a,double b,double e,double n) {double y1,y2=0,h=fabs(a-b)/n,x; do {y1=y2; y2=f(a)*h; for(x=a+h;x<b-h;x+=h) y2+=f(x)*h; h/=2;} while(fabs(y1-y2)>e); return y2;} double fun(double x) {return x-1; } Методом деления отрезка пополам найти корень уравнения double f(double); double luc(double a, double b, double e, double (*f)(double)); main() { double a, b, eps; double res; printf("Enter a, b, eps: "); scanf("%lf%lf%lf", &a, &b, &eps); res = luc(a, b, eps, &f); printf("%lf\n", res); } double f(double x) { return x*x-4; } double luc(double a, double b, double e, double (*f)(double)) { double fa, fb, c, fc; do { fa = (*f)(a); fb = (*f)(b); c = (a+b)/2; fc = (*f)(c); if (fa*fc < 0) b=c; else if (fc*fb < 0) a=c; else { return c; } } while (fabs(a-b)>e); return c; } Методом хорд найти корень уравнения int xord(double(*f)(double), double a, double b, double *x, double e) { double fa,fb,fx,x0=*x; int n=0; fa=f(a); fb=f(b); *x=a-fa*(b-a)/(fb-fa); do { n++; x0=*x; fa=fx; *x=a-fa*(b-a)/(fb-fa); } if(fx*fa<0) { b=*x; fb=fx; *x=b-fb*(b-a)/(fb-fa);; }} while(fabs(x0-*x)>e); return n; |
|||
Сортировка Хора #define n 3 void hoare(int l,int r,int *ms) {int i=l,j=r; int se=ms[(1+r)/2]; int buf; do {while(ms[i]<se) i++; while(ms[j]>se) j--; if (i<=j) {buf=ms[i]; ms[i]=ms[j]; ms[j]=buf; i++;j--;}} while(i<=j); if(i<r) hoare(i,r,ms); if(j>l) hoare(l,j,ms);} void main() {int i,j,ms[n][n],s; puts("Entar array:"); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&ms[i][j]); puts("Enter str N:"); scanf("%d",&s); puts("a"); hoare(0,n-1,ms+s); } Перевод строк в числа void smax(char**,int); void sorts(char**,int); void revs(char*); main() {char *u,**s=0; int i,j,k,z,n; double *m,p; clrscr(); { printf("\n BBEDITE STROKI \n"); u=(char*)malloc(100*sizeof(char)); if(s) {for(i=0;i<10;i++) if(*(s+i)) free(*(s+i)); free(s);} s=(char**)calloc(10,sizeof(char*)); for(i=0;i<10;i++) {gets(u); if(*u=='\0') { n=i; break;} j=0; while(*(u+j)!='\0') j++; *(s+i)=(char*)malloc((j+1)*sizeof(char)); for(k=0;k<j+1;k++) *(*(s+i)+k)=*(u+k); *(*(s+i)+k)='\0'; } free(u); } m=(double*)calloc(n,sizeof(double)); for(i=0;i<n;i++) { j=0; if(*(*(s+i)+j)=='-') {j++; z=-1; } else z=1; while(*(*(s+i)+j)!='.'&&*(*(s+i)+j)!='\0') {m[i]=(m[i]*10)+(*(*(s+i)+j)-'0'); j++; } if(*(*(s+i)+j)=='.') {j++; p=1; while(*(*(s+i)+j)) { p/=10; m[i]+=(*(*(s+i)+j)-'0')*p; j++;}} m[i]*=z; printf("%lf\n",m[i]);} getch(); } Сортировать i-ую строку матрицы a[i][j] методом вставок int* vstav(int len, int *mas) {register int i, j, kk; for(i=1;i<len;i++) {j = i-1; kk = mas[i]; while(j>=0 && kk<=mas[j]) mas[j-- +1]=mas[j]; mas[j+1]=kk;} return mas; } void main() { int *mas,len=5; mas=(int*)malloc(len*sizeof(int)); for(int i=0;i<len;i++) scanf("%d",mas+i); vstav(len,mas); }
|
В main введите символьные строки, и напишите 3 функции: а) ввод символьной строки размером k б) нахождение длинны строки в) добавление одной строки в конец другой char* inputstring(char*, int); int stringlength(char*); char* concat(char*, char*); main() { char *s1, *s2; int k1, k2, n1, n2; printf("Enter k1, k2: "); scanf("%d%d", &k1, &k2); s1=(char*) calloc(k1+k2+1, sizeof(char)); s2=(char*) calloc(k2+1, sizeof(char)); printf("Enter 1st string: \n"); s1=inputstring(s1, k1); printf("Enter 2nd string: \n"); s2=inputstring(s2, k2); printf("Length of 1st string: %d\n", stringlength(s1)); printf("Length of 2st string: %d\n", stringlength(s2)); s1=concat(s1, s2); printf("Concatenated: \n"); puts(s1); printf("\n\n"); } char* inputstring(char* s, int k) { int i=0; char c; do { c=getche(); if (c != '\r') { s[i]=c; i++; } } while ((c!='\r') && (i<k)); s[i]='\0'; printf("\n"); return s; } int stringlength(char* s) { int i; for (i=0; s[i]!='\0'; ++i) ; return i; } char* concat(char* s1, char* s2) { int n1, n2, i; n1=stringlength(s1); n2=stringlength(s2); for (i=0; i<n2; ++i) s1[n1+i] = s2[i]; return s1; } Транспонировать .матрицу (while) без новой #include <conio.h> #include <stdio.h> #define n 4 void trans(int m[n][n]) { int i=0,j,t; while (i<n) { j=0; while(j<i) {t=m[i][j]; m[i][j]=m[j][i]; m[j][i]=t; j++; } i++; } } main () { int i,j,k,m[n][n]; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&m[i][j]); for(i=0;i<n;i++,printf("\n")) for(j=0;j<n;printf("%5d",m[i][j++])); trans(m); printf("\n\n"); for(i=0;i<n;i++,printf("\n")) for(j=0;j<n;printf("%5d",m[i][j++])); getch (); return 0;
|
Сортировка кв. матрицы выше побочной диагонали void main() { float *mm, k; int i, i1, j, j1, n; scanf(“%d”,&n); mm=(float *)calloc(n*n, sizeof(float)); if(!mm) return; //ввод mm //вывод mm for(i=0;i<n-2;i++) for(j=0;j<n-i-1;j++) { k=*(mm+i*n+j); for(i1=n-2;j1>=i;i1--) for(j1=n-i1-2;j1>=0;j1--) if((*mm+i*n+j)>*(mm+i1*n+j1)) { k=*(mm+i*n+j); *(mm+i*n+j)=*(mm+i1*n+j1); *(mm+i1*n+j1)=k; } } Найти выше главной диагонали столбец с макс. суммой и ниже мин. суммой int **p,n,s,i,j,i1,i2,s1,s1,k; //ввод p k=0; s1=*(*p+1); s2=*(*(p+n-1)+s-2); j11; j2=s-2; for(j=0;j<n;j++) { for(i=0;i<n;i++) if(i!=j) k+=*(*(p+i)+j); else { if(s1<k) { s1=k; j1=j; } k=0; } if(s2>k && j<s-1) {s2=k; j2=j; } k=0; } Найти простые числа в кв. матрице и на его место поставить *. Остальные числа удалить и вывести * на экран void main() { int **a,i,j,k=0,i1,i2,j1,j2,n,m; //выделить память i2=i1=n/2; j2=j1=m/2; do { if)j1<0 || j2>m-1) break; for (j=j1; j<=j2; j++) *(*(a+i1)+j)=++k; j2++; if(i1<0 || i2>n-1) break; for(i=i1;i<=i2;i++) *(*(a+i)+j2)=++k; i2++; if(j1<0 || j2>m-1) break; for(i=i2;j>=j1;j--) *(*(a+i2)+j)=++k; j1--; if(i1<0 || i2>n-1) break; for(i=i2;i<=i1;j--) *(*(a+i)+j1)=++k; i1--: } while(1); for(i=0:i<n;i++) for(j=0;j<m;j++) { k=0; for(j1=2;j1<*(*(a+i)+j)-1;j1++) if(*(*(a+i)+j)%j1==0) k=1; if(!k) *(*(a+i)+j)=0; } |
|
|
|