Difference between revisions of "2016-17 Programmi C"
		
		
		
		
		
		Jump to navigation
		Jump to search
		
				
		
		
	
| m | m | ||
| Line 106: | Line 106: | ||
|    iprint(head); |    iprint(head); | ||
|    printf("\n"); |    printf("\n"); | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | == comma operator == | ||
| + | <syntaxhighlight lang=C> | ||
| + | #include <stdio.h> | ||
| + | |||
| + | int slen(char *s) { /* in real programs use strlen instead */ | ||
| + |   size_t rval; | ||
| + |   for (rval = 0; *s != 0; s++, rval++) | ||
| + |     ; | ||
| + |   return rval; | ||
| + | } | ||
| + | |||
| + | int ispal(char *s) { | ||
| + |   int i,j; | ||
| + |   for (i=0, j=slen(s)-1; i < j; i++, j--) { | ||
| + |     if (s[i] != s[j]) | ||
| + |       return 0; | ||
| + |   } | ||
| + |   return 1; | ||
| + | } | ||
| + | |||
| + | void reverse(char *s) { | ||
| + |   int i,j; | ||
| + |   for (i=0, j=slen(s)-1; i < j; i++, j--) | ||
| + |     s[j] ^= s[i] ^= s[j] ^= s[i]; | ||
| + | } | ||
| + | |||
| + | int main(int argc, char *argv[1]) { | ||
| + |   for ( ;argc > 1; argv++, argc--) { | ||
| + |     printf("\"%s\" is%s palindrome\n", argv[1], | ||
| + |         ispal(argv[1])?"":"n't"); | ||
| + |     reverse(argv[1]); | ||
| + |     printf("\"%s\"\n", argv[1]); | ||
| + |   } | ||
| } | } | ||
| </syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 08:04, 2 October 2016
char by char copy
#include <stdio.h>
int main(int argc, char *argv[]) {
  int c;
  while ((c = getchar()) != EOF)
    putchar(c);
}
arrays, pointers and structs
#include <stdio.h>
char *spoint="hello";
char sarr[]="hello";
struct strs {
  char s[6];
} sstruct = {"hello"};
void foo(char *s) {
  s[4]=0;
}
void bar(struct strs s) {
  s.s[4]=0;
  printf("from bar %s\n", s.s);
}
int main(int argc, char *argv[]) {
  printf("%s %s %s\n", spoint, sarr, sstruct.s);
  foo(sarr);
  printf("%s %s %s\n", spoint, sarr, sstruct.s);
  bar(sstruct);
  printf("%s %s %s\n", spoint, sarr, sstruct.s);
  // test the following statements, one at a time
  //spoint = sarr;
  //sarr = spoint;
  foo(spoint);
  printf("%s %s %s\n", spoint, sarr, sstruct.s);
}
iteration and recursion
#include <stdio.h>
struct elem {
  int val;
  struct elem *next;
};
struct elem *head = NULL;
struct elem *rinsert(struct elem *new, struct elem *head) {
  if (head == NULL || new->val < head->val) {
    new->next = head;
    return new;
  } else {
    head->next = rinsert(new, head->next);
    return head;
  }
}
struct elem *iinsert(struct elem *new, struct elem *head) {
  struct elem **pnext;
  for (pnext = &head;
      *pnext != NULL && new->val > (*pnext)->val;
      pnext = &((*pnext)->next))
    ;
  new->next = *pnext;
  *pnext = new;
  return head;
}
void rprint(struct elem *this) {
  if (this) {
    printf("%d ",this->val);
    rprint(this->next);
  }
}
void iprint(struct elem *this) {
  for ( ; this != NULL; this = this->next)
    printf("%d ",this->val);
}
struct elem test[]={{5},{3},{9},{1},{7}};
#define NELEM (sizeof(test) / sizeof(struct elem))
int main(int argc, char *argv[]) {
  int i;
  for (i = 0; i < NELEM; i++)
    head = rinsert(&test[i], head);
  rprint(head);
  printf("\n");
  iprint(head);
  printf("\n");
  head = NULL;
  for (i = 0; i < NELEM; i++)
    head = iinsert(&test[i], head);
  rprint(head);
  printf("\n");
  iprint(head);
  printf("\n");
}
comma operator
#include <stdio.h>
int slen(char *s) { /* in real programs use strlen instead */
  size_t rval;
  for (rval = 0; *s != 0; s++, rval++)
    ;
  return rval;
}
int ispal(char *s) {
  int i,j;
  for (i=0, j=slen(s)-1; i < j; i++, j--) {
    if (s[i] != s[j])
      return 0;
  }
  return 1;
}
void reverse(char *s) {
  int i,j;
  for (i=0, j=slen(s)-1; i < j; i++, j--)
    s[j] ^= s[i] ^= s[j] ^= s[i];
}
int main(int argc, char *argv[1]) {
  for ( ;argc > 1; argv++, argc--) {
    printf("\"%s\" is%s palindrome\n", argv[1],
        ispal(argv[1])?"":"n't");
    reverse(argv[1]);
    printf("\"%s\"\n", argv[1]);
  }
}