打印
[C语言]

C 语言实例 呕心沥血之作 快速提升C能力

[复制链接]
2673|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一路向北lm|  楼主 | 2018-10-12 20:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 一路向北lm 于 2018-10-12 20:15 编辑

C 语言实例1—— 打印0~100之间所有质数
#include <stdlib.h>
int main()
{
  int number;
  int divisor;
/*
** One and two are easy.
*/
printf( "1\n2\n" );
/*
** No other even numbers are prime; look at the remaining odd ones.
*/
for( number = 3; number <= 100; number = number + 2 )
{
  for( divisor = 3; divisor < number; divisor = divisor + 2 )
  {
    if( number % divisor == 0 )
    break;
  }
/*
** If the loop above stopped because the divisor got too big,
** we’ve got a prime.
*/
if( divisor >= number )
printf( "%d\n", number );
}
}


相关帖子

沙发
一路向北lm|  楼主 | 2018-10-12 20:06 | 只看该作者
本帖最后由 一路向北lm 于 2018-10-12 20:09 编辑

C 语言实例2—— 输入三角形三边长度,判断是什么类型三角形(等边、等腰、不能构成三角形)
#include <stdlib.h>
#include <stdio.h>
int main()
{
float a;
float b;
float c;
float temp;
/*
** Prompt for and read the data.
*/
printf( "Enter the lengths of the three sides of the triangle: " );
scanf( "%f %f %f", &a, &b, &c );
/*
** Rearrange the values so that a is the longest and c is the shortest.
*/
if( a < b )
{
temp = a;
a = b;
b = temp;
}
if( a < c )
{
temp = a;
a = c;
c = temp;
}
if( b < c )
{
temp = b;
b = c;
c = temp;
}
/*
** Now see what kind of triangle it is. Note that if any of the sides
** is <= 0 (and we really only have to check the shortest one for this),
** or if the two shorter sides together are shorter than the longest
** side, it isn’t a triangle at all.
*/
if( c <= 0 || b + c < a )
printf( "Not a triangle.\n" );
else if( a == b && b == c )
printf( "Equilateral.\n" );
else if( a == b || b == c )
printf( "Isosceles.\n" );
else
printf( "Scalene.\n" );
return EXIT_SUCCESS;
}


使用特权

评论回复
板凳
一路向北lm|  楼主 | 2018-10-12 20:10 | 只看该作者
C 语言实例3——C与指针快速上手例子程序读取一串列标号,这些列标号成对出现,表示输入行的列范围。这串列标号以一个负值结尾,作为结束标志。剩余输入行被程序读入并打印,然后输入行中被选中范围的字符串被提出出来并打印。说的有点模糊,来个实例,输入:

4  9  12  20  -1

abcdefghijklmnopqrstuvwxyz

Original input:  abcdefghijklmnopqrstuvwxyz

Rearrange line: efghijmnopqrstu

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_COLS       20
#define MAX_INPUT      1000


int read_column_numbers( int columns[], int max);
void rearrange( char *output, char const *input,int n_columns,int const columns[]);

int main()
{
   int n_columns;           //进行处理的列标号
   int columns[MAX_COLS];   //需要处理的列数
   char input[MAX_INPUT];   //容纳输入行的数组
   char output[MAX_INPUT];  //容纳输出行的数组

   //读取该串列标号
   n_columns = read_column_numbers(columns,MAX_COLS);

   //读取 处理和打印剩余的输入行
   while(gets(input)!=NULL)
   {
     printf("Original input : %s\n",input);
         rearrange(output,input,n_columns,columns);
         printf("Rearranged line: %s\n",output);
   
   }
   return EXIT_SUCCESS;

}


// 读取列标号,超出规定范围则不会理睬
int read_column_numbers( int columns[], int max)
{
    int num=0;
        int ch;
   
    // 取得列标号 如果读取的数小于0 则停止
        while( num<max && scanf("%d",&columns[num])==1 && columns[num]>=0 )
         num +=1;
        if(num%2!=0)
        {
          puts("Last column number is not paired");
          exit(EXIT_FAILURE);
        }
    // 丢弃改行中包含最后一个数字的那部分内容
        while( (ch=getchar())!=EOF && ch!='\n');
        return num;
}

// 处理输入行,将制定的字符链接在一起,输出行以NUL结尾
void rearrange( char *output, char const *input,int n_columns,int const columns[])
{
     
     int col ;        //columns数组的下标
         int output_col; //输出列计数器
     int len;        //输入行的长度
         len=strlen(input);
     output_col =0;
  //处理每对列标号
  for( col =0;col<n_columns;col+=2)
  {
      int nchars = columns[col+1]-columns[col]+1;

      //如果输入行结束或输出行数已满,就结束任务
          if(columns[col]>=len || output_col==MAX_INPUT-1)
                  break;
          //如果输出行数空间不够,只复制可以容纳的数据
          if(output_col+nchars>MAX_INPUT-1)
                  nchars = MAX_INPUT -output_col-1;
          //复制相关数据
          strncpy(output+output_col,input+columns[col],nchars);
          output_col+=nchars;
   
  }
  output[output_col]='\0';

}




使用特权

评论回复
地板
一路向北lm|  楼主 | 2018-10-12 20:11 | 只看该作者
C 语言实例4——建立简单的静态链表为了建立链表 使head指向a节点,a.next指向b节点,b.next指向c节点这就构成了链表关系。
#include<stdio.h>
struct Student
{
   int num;
   float score;
   struct Student *next;
};

int main()
{
     struct Student a,b,c,*head, *p;
     a.num=10101;
         a.score=89.5;
         b.num=10103;
         b.score=90;
         c.num=10107;
         c.score=85;

         head=&a;
         a.next=&b;
         b.next=&c;
         c.next=NULL;
         p=head;


         do  
         {
           printf("%ld,%5.1f\n",p->num,p->score);
           p=p->next;

         }
         while(p!=NULL);
         return 0;
}



使用特权

评论回复
5
一路向北lm|  楼主 | 2018-10-12 20:12 | 只看该作者
C 语言实例5——单链表 头插法
// 链表的头插入
#include<stdio.h>
#include<stdlib.h>


// 单链表声明
struct Book
{
   //信息域
        char title[128];
        char author[40];
        //指针域
   struct Book * next;
};


void getInput(struct Book *book);
void addBook(struct Book **library) ;
void printlibrary(struct Book *library);
void relsaselibrary(struct Book **library);



void getInput(struct Book *book)
{
  printf("请输入书名:");
  scanf("%s",book->title);
  printf("请输入作者:");
  scanf("%s",book->author);
}

void addBook(struct Book **library)  //参数library (head指针)是head指针的值。
{
  struct  Book  *book, *temp;

  // 在堆里面申请新的节点
  book =(struct Book *)malloc(sizeof(struct Book));
  if(book==NULL)
  {
    printf("内存分配失败");
        exit(1);
  }

  // 为新节点填充信息域内容
  getInput(book);

  if(*library != NULL)
  {
     // 把新的节点插入到链表的头部
          temp = *library;   //保存原来head指针指向的地址
          *library = book;   //把head指针指向新节点
          book->next=temp;   //把新节点的指针域指向原来head指针指向的地址
  
  }
  else   // 如果为NULL 空的单链表
  {
    *library = book;
        book->next=NULL;  
  }
}

void printlibrary(struct Book *library)
{
   struct Book *book;
   int count =1;

   book = library;
   while(book != NULL)
   {
     printf("Book%d: " ,count);
         printf("书名:%s",book->title);
         printf("作者:%s",book->author);
        // printf('\n');
         book = book->next;
         count++;
   
   }

}

void relsaselibrary(struct Book **library)
{
    struct Book *temp; // 临时变量

        while(*library !=NULL)    //直到library头指针指向NULL
        {
            temp = *library;
                *library =(*library)->next;
                free(temp);
        }

}
int main()
{
  
          struct Book *library = NULL;
          int ch;
      while(1)
          {
              printf("请问是否需要录入书籍信息(Y/N)");
                  do
                  {
                       ch = getchar();
                 
                  }
              while( ch !='Y' && ch!='N');

              if(ch == 'Y')
                  {
                  addBook(&library);
                  }
              else
                  {
                  break;
                  }
         
          }
           printlibrary(library);
       relsaselibrary(&library);
           return 0;
}



使用特权

评论回复
6
一路向北lm|  楼主 | 2018-10-12 20:13 | 只看该作者
C 语言实例6——单链表 尾插法
1. 遍历方式(不推荐,效率比较低。需要遍历整个链表。)
// 链表的尾插入
#include<stdio.h>
#include<stdlib.h>


// 单链表声明
struct Book
{
   //信息域
        char title[128];
        char author[40];
        //指针域
   struct Book * next;
};


void getInput(struct Book *book);
void addBook(struct Book **library) ;
void printlibrary(struct Book *library);
void relsaselibrary(struct Book **library);



void getInput(struct Book *book)
{
  printf("请输入书名:");
  scanf("%s",book->title);
  printf("请输入作者:");
  scanf("%s",book->author);
}

void addBook(struct Book **library)  //参数library (head指针)是head指针的值。
{
  struct  Book  *book, *temp;

  // 在堆里面申请新的节点
  book =(struct Book *)malloc(sizeof(struct Book));
  if(book==NULL)
  {
    printf("内存分配失败");
        exit(1);
  }

  // 为新节点填充信息域内容
  getInput(book);

  if(*library != NULL)
  {
     // 把新的节点插入到链表的尾部
          temp = *library;   //保存原来head指针指向的地址
          while(temp->next !=NULL)   // 定义到链表尾部
          {
             temp=temp->next;
          }
          // 插入数据
          temp->next = book;  
          book->next=NULL;   
  
  }
  else   // 如果为NULL 空的单链表
  {
    *library = book;
        book->next=NULL;  
  }
}

void printlibrary(struct Book *library)
{
   struct Book *book;
   int count =1;

   book = library;
   while(book != NULL)
   {
     printf("Book%d: " ,count);
         printf("书名:%s",book->title);
         printf("作者:%s\n",book->author);
       
         book = book->next;
         count++;
   
   }

}

void relsaselibrary(struct Book **library)
{
    struct Book *temp; // 临时变量

        while(*library !=NULL)    //直到library头指针指向NULL
        {
            temp = *library;
                *library =(*library)->next;
                free(temp);
        }

}
int main()
{
  
          struct Book *library = NULL;
          int ch;
      while(1)
          {
              printf("请问是否需要录入书籍信息(Y/N):");
                  do
                  {
                       ch = getchar();
                 
                  }
              while( ch !='Y' && ch!='N');

              if(ch == 'Y')
                  {
                  addBook(&library);
                  }
              else
                  {
                  break;
                  }
         
          }
           printlibrary(library);
       relsaselibrary(&library);
           return 0;
}

2. 不需要遍历,添加指向链表尾的指针(推荐使用,效率高)。
// 链表的尾插入(不需要遍历)
#include<stdio.h>
#include<stdlib.h>


// 单链表声明
struct Book
{
   //信息域
        char title[128];
        char author[40];
        //指针域
   struct Book * next;
};


void getInput(struct Book *book);
void addBook(struct Book **library) ;
void printlibrary(struct Book *library);
void relsaselibrary(struct Book **library);



void getInput(struct Book *book)
{
  printf("请输入书名:");
  scanf("%s",book->title);
  printf("请输入作者:");
  scanf("%s",book->author);
}

void addBook(struct Book **library)  //参数library (head指针)是head指针的值。
{
  struct  Book  *book;
  static struct  Book  *tail;   //指向链表尾部
  // 在堆里面申请新的节点
  book =(struct Book *)malloc(sizeof(struct Book));
  if(book==NULL)
  {
    printf("内存分配失败");
        exit(1);
  }

  // 为新节点填充信息域内容
  getInput(book);

  if(*library != NULL)
  {
          // 插入数据
          tail->next = book;  
          book->next=NULL;   
  
  }
  else   // 如果为NULL 空的单链表
  {
    *library = book;
        book->next=NULL;  
  }
  tail =book;
}

void printlibrary(struct Book *library)
{
   struct Book *book;
   int count =1;

   book = library;
   while(book != NULL)
   {
     printf("Book%d: " ,count);
         printf("书名:%s",book->title);
         printf("作者:%s\n",book->author);
       
         book = book->next;
         count++;
   
   }

}

void relsaselibrary(struct Book **library)
{
    struct Book *temp; // 临时变量

        while(*library !=NULL)    //直到library头指针指向NULL
        {
            temp = *library;
                *library =(*library)->next;
                free(temp);
        }

}
int main()
{
  
          struct Book *library = NULL;
          int ch;
      while(1)
          {
              printf("请问是否需要录入书籍信息(Y/N):");
                  do
                  {
                       ch = getchar();
                 
                  }
              while( ch !='Y' && ch!='N');

              if(ch == 'Y')
                  {
                  addBook(&library);
                  }
              else
                  {
                  break;
                  }
         
          }
           printlibrary(library);
       relsaselibrary(&library);
           return 0;
}





使用特权

评论回复
7
一路向北lm|  楼主 | 2018-10-12 20:16 | 只看该作者
C 语言实例7——单链表 的搜索
// 单链表的搜索
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// 单链表声明
struct Book
{
   //信息域
        char title[128];
        char author[40];
        //指针域
   struct Book * next;
};


void getInput(struct Book *book);
void addBook(struct Book **library) ;
void printlibrary(struct Book *library);
void relsaselibrary(struct Book **library);
struct Book  *searchBook(struct Book *library,char *target);
void printBook(struct Book *book);



void getInput(struct Book *book)
{
  printf("请输入书名:");
  scanf("%s",book->title);
  printf("请输入作者:");
  scanf("%s",book->author);
}

void addBook(struct Book **library)  //参数library (head指针)是head指针的值。
{
  struct  Book  *book;
  static struct  Book  *tail;   //指向链表尾部
  // 在堆里面申请新的节点
  book =(struct Book *)malloc(sizeof(struct Book));
  if(book==NULL)
  {
    printf("内存分配失败");
        exit(1);
  }

  // 为新节点填充信息域内容
  getInput(book);

  if(*library != NULL)
  {
          // 插入数据
          tail->next = book;  
          book->next=NULL;   
  
  }
  else   // 如果为NULL 空的单链表
  {
    *library = book;
        book->next=NULL;  
  }
  tail =book;
}

void printlibrary(struct Book *library)
{
   struct Book *book;
   int count =1;

   book = library;
   while(book != NULL)
   {
     printf("Book%d: " ,count);
         printf("书名:%s",book->title);
         printf("作者:%s\n",book->author);
       
         book = book->next;
         count++;
   
   }

}

void relsaselibrary(struct Book **library)
{
    struct Book *temp; // 临时变量

        while(*library !=NULL)    //直到library头指针指向NULL
        {
            temp = *library;
                *library =(*library)->next;
                free(temp);
        }
}

struct Book  *searchBook(struct Book *library,char *target)
{
  struct Book *book;
  book = library;
  while(book != NULL)
  {
          if(!strcmp(book->author,target)|| !strcmp(book->title,target))
          {
            break;
          }
          book = book->next;
  }
  return book;   //返回节点的指针
}

void printBook(struct Book *book)
{
  printf("书名:%s",book->title);
  printf("作者:%s",book->author);
}

int main()
{
  
          struct Book *library = NULL;
          struct Book *book;
          int ch;
          char input[128];
      while(1)
          {
              printf("请问是否需要录入书籍信息(Y/N):");
                  do
                  {
                       ch = getchar();
                 
                  }
              while( ch !='Y' && ch!='N');

              if(ch == 'Y')
                  {
                  addBook(&library);
                  }
              else
                  {
                  break;
                  }
         
          }
           printlibrary(library);

           printf("请输入书名或作者:");
           scanf("%s",input);
           book =searchBook(library,input);
           if(book ==NULL)
           {
             printf("没有找到相关书籍\n");
           }
           else
           {
            do
                {
                  printf("已找到符合书籍...\n");
                  printBook(book);
                }
                while((book=searchBook(book->next,input))!= NULL);
           }
       relsaselibrary(&library);
           return 0;
}



使用特权

评论回复
8
smartpower| | 2018-10-15 09:02 | 只看该作者
在MCU一般不太用到这么高深的技术。用得最多的就一个FOR。

使用特权

评论回复
9
877049204| | 2018-10-15 10:10 | 只看该作者
顶一个,有参考书或者电子文档分享一下更好

使用特权

评论回复
10
eydj2008| | 2018-10-15 11:23 | 只看该作者
是的在 MCU中 我还没使用过链表 ,    不知道哪些地方有用,   感觉是数据库用的.

使用特权

评论回复
评论
wsnsyy 2018-10-16 13:35 回复TA
内存管理 
11
1949zbh| | 2018-10-15 14:01 | 只看该作者
顶一下

使用特权

评论回复
12
Vansm| | 2018-10-15 17:51 | 只看该作者
记得上大学的时候我们C语言老师自己做了个题库  里面有一千个题,整个大一都在做题中度过,现在想想都心有余悸

使用特权

评论回复
13
yangzhi1023| | 2018-10-16 09:43 | 只看该作者
就这么点了吗? 直接整理好打包发出来不是更好吗?

使用特权

评论回复
14
caijie001| | 2018-10-16 14:08 | 只看该作者
一言不合放代码

使用特权

评论回复
15
一路向北lm|  楼主 | 2018-10-16 23:07 | 只看该作者
eydj2008 发表于 2018-10-15 11:23
是的在 MCU中 我还没使用过链表 ,    不知道哪些地方有用,   感觉是数据库用的. ...

RTT 就用到了啊

使用特权

评论回复
16
一路向北lm|  楼主 | 2018-10-16 23:07 | 只看该作者

吓唬他们

使用特权

评论回复
17
一路向北lm|  楼主 | 2018-10-16 23:07 | 只看该作者
yangzhi1023 发表于 2018-10-16 09:43
就这么点了吗? 直接整理好打包发出来不是更好吗?

还没整理好呢

使用特权

评论回复
18
一路向北lm|  楼主 | 2018-10-16 23:08 | 只看该作者
Vansm 发表于 2018-10-15 17:51
记得上大学的时候我们C语言老师自己做了个题库  里面有一千个题,整个大一都在做题中度过,现在想想都心有 ...

唉,自己一天练习点,很有用吧

使用特权

评论回复
19
一路向北lm|  楼主 | 2018-10-16 23:08 | 只看该作者

感谢支持哦

使用特权

评论回复
20
一路向北lm|  楼主 | 2018-10-16 23:08 | 只看该作者
877049204 发表于 2018-10-15 10:10
顶一个,有参考书或者电子文档分享一下更好

自己写的,没有什么参考书呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

277

主题

3805

帖子

76

粉丝