这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » [学习会]一起学习C语言-phoenix的重修之路

共12条 1/2 1 2 跳转至

[学习会]一起学习C语言-phoenix的重修之路

专家
2018-05-07 11:29:57     打赏

虽然说C一直也没有放下,但也说不上是真正的应用,所以说c的水平吧可能也就是入门级,功能都能实现,但什么优化啊,效能啊……之类的应该都谈不上。

这不,刚好碰到一个新项目,觉得应该把旧有的一些不稳定因素和缺陷都给彻底给清除了,所以就趁此机会也把c水平提高一下。

当然更好的是刚好我的亲爱的猫猫发起了这个超赞的活动,怎么能不参加?!!




关键词: 学习会     C语言     phoenix     学习    

专家
2018-05-14 10:01:03     打赏
2楼

虽然说活动是要到18号才开始,但一个周末怎么能光等不看书呢?

先看看笔记吧,因为是第一遍泛读,所以就蜻蜓点水了啦

总体来说,对于入门篇是名副其实的,按照书中的例子,一步一步由浅入深,确实可以入门。要说缺点,只有一,就是这个入门不是针对任何一个人说的,而以针对有计算机基础的人来说,至少需要知道怎么配制编程环境,怎么编译,……,不过对于在这里的大家,应该都不成问题对吧?!

  快快的看到第6章,发现自己吸取到了几点精华:

  1. 原来在做除法的时候,对于有一个数是负数时,其结果依赖于编译器,这一点可真的是完全不知道啊。但细想一下,应该是要知道的……此处省略5K字;

  2. 格式化输出的形式。因为之前并没有在显示上做多少工作,所以并没有完全的了解格式化输出的每个参数的意义,这次赶紧get起来;

  3. 对operator的单目、双目加深了理解。以前只是用,根本不去关注单目、双目什么的;


眼下这么多吧,具体的内容在深入学习时再做补充。



专家
2018-05-23 08:33:59     打赏
3楼

这是这几天的笔记,虽然做笔记能做到按时,但两天一帖真的有点困难,要坚持住。

抽空再写心得,先签到!


专家
2018-05-24 10:55:11     打赏
4楼

刚好抽点时间,把C的编译环境给配制了一下,毕竟光说不练是不行的,要学以致用。

总体上用了VC6.0+notepad++。大神用的VS毕竟太大了,**派需要电视,……所以还是在win的环境选择了较小的体积,并且也不需要再看dos的界面了。嗯……也不错,先用着

第一个程序,经典的helloword

首先是用notepad++写好程序,并保存为.c文件。

接着是对刚保存的.c文件进行编译,如下图中2所示,运行完毕后看到如3的提示,并在.c文件的目录下看到如下一张图中所示多了的两个同名文件,一个是.exe,一个是.obj。

如果这时运行命令(如图中4所示)执行.exe文件,会看到结果(如图中5所示)。


如果直接在文件夹下双击运行.exe文件,也可以执行,但因为程序会一闪而过,可能你什么也看不到。如果想看到结果的话,后面会给出一种简单方式。



专家
2018-05-29 17:35:18     打赏
5楼

进入实践篇

这部分会以实际动手进制巩固练习,先确认书中例程的结果,而后再把留下的作业给完成。



专家
2018-05-29 17:39:12     打赏
6楼

第二个例程的时候就出现了异常,出现了C1071的错误,

查找了问题原因,发现是因为中文注释(这里注释用的是/**/形式)的原因,说是中文+*”会使编译器识别错误。解决的问题是在“*”与中文隔开的地方加入一个空格就没有问题了。

疑问:前后两个程序,同样的注释方法,前一个没出现问题,而后一个出现问题,换名话说,不加空格的话不一定会出现问题,而加空格的话则一定不会出现问题,所以在明确知道哪些字会出现问题之前,先全部加空格好了。

上面这个注释可以成功通过编译。

上面这个注释需要在末尾的“值”与“*”之间加入空格才能通过编译。



专家
2018-05-30 18:03:51     打赏
7楼

汉字依然不能显示……

继续实践例程与做练习,发现我的电脑在使用\a后真的不会发出声音。还会有什么不一样的地方呢?


专家
2018-06-01 17:05:11     打赏
8楼

终于可以显示汉字了,看下图

1-12-cmd.png

这都要感谢Mexn,话说Mexn大名是啥?

不能显示汉字 的原因是文本编辑器的问题,与编码有关吧,在使用devcpp进行文本编辑后,进行编译运行就不存在乱码的问题了。



专家
2018-06-05 22:28:11     打赏
9楼

哎呀!!!被作业给难住了,一不小心就漏打卡了,赶紧先补交下作业。

前四题的答案公布

exam1-1

/*
1.	请在控制台实现如下功能。(20分)
*
**
***
****
*/
#include<stdio.h>
int main(void)
{
    puts(" *  ");
    puts(" ** ");
    puts("*** ");
    puts("****");
    return 0; 
}

exam1-1-cmd.JPG

exam1-2

/*
2. 效果与第一题结果相同,但是打印的行数有程序运行是确定。(25分)
*
**
***
****
*/
#include<stdio.h>
#include<limits.h>
void put_chars(unsigned int ch, unsigned int n)
{
     while ( n-- >0 )
      putchar(ch);
 }

int main(void)
{
    unsigned int no = 0;
    unsigned int nospace;
    unsigned int i;
    
    puts("输入数字以打印星星,输入的数字就是打印星星的行数,输入0结束程序。");
    printf("请输入数字:");
    scanf("%d", &no);
    
    while(no != 0)
    {
       if(no > 0 && no < UINT_MAX )
       {
           for( i = 1; i <= no; i++)
           {
                nospace = ((no - i ) / 2) + ((no - i ) % 2);
                put_chars(' ', nospace);
                put_chars('*', i);
                printf("\n");
           }
       }
       puts("输入数字以打印星星,输入的数字就是打印星星的行数,输入0结束程序。");
       printf("请输入数字:");
       scanf("%d", &no);
    };
    //endof while
    return 0; 
}//endof main

exam1-2-cmd.JPG


exam1-3

/*
3.请实现2个函数完成BCB码到二进制格式的转换和二进制到BCD转换功能,并自己编写测试。(28分)
*/
#include<stdio.h>
#include<limits.h>
 /* bcd转二进制,*/
unsigned char bcd2bin(unsigned char bcddata)
{
     unsigned char bindata;
     bindata = ((( bcddata >> 4) & 0x0f ) * 10) + ( bcddata & 0x0f);
     return bindata;
 }
 /* 二进制转bcd,二进制数值小于100*/
unsigned char bin2bcd(unsigned char bindata)
{
     unsigned char bcddata;
     bcddata = ((( bindata / 10 ) << 4 ) & 0xf0 ) + ( bindata % 10);
     return bcddata;
 }
/*显示bcd*/
void showbcd( unsigned char bcddata)
{
     printf( "%c%c", ((( bcddata >> 4) & 0x0f ) + '0'), (( bcddata & 0x0f) + '0'));
 }
int main(void)
{
    unsigned char cdata;
    unsigned char bcddata;
    unsigned char bindata;
    printf("请输入一个字符:");
    scanf("%c", &cdata);
    bcddata = bin2bcd(cdata);
    printf("BCD结果\n");
    printf("以字符显示:");showbcd(bcddata);putchar('\n');
    printf("以十六进制显示:%x\n", bcddata );
    printf("以整形显示:%d\n", bcddata );
    bindata = bcd2bin(bcddata);
    printf("bin结果\n");
    printf("以字符显示:%c\n", bindata);
    printf("以十六进制显示:%x\n", bindata );
    printf("以整形显示:%d\n", bindata );

    return 0; 
}//endof main

exam1-3-cmd.JPG


exam1-4

/*
4.请利用宏来实现3题功能。(30分)
*/
#include<stdio.h>
#include<limits.h>
 /* bcd转二进制,*/

#define bcd2bin(bcddata) ((( (bcddata) >> 4) & 0x0f ) * 10) + ( (bcddata) & 0x0f)

 /* 二进制转bcd,二进制数值小于100*/

#define bin2bcd(bindata) ((( (bindata) / 10 ) << 4 ) & 0xf0 ) + ( (bindata) % 10);

/*显示bcd*/
void showbcd( unsigned char bcddata)
{
     printf( "%c%c", ((( bcddata >> 4) & 0x0f ) + '0'), (( bcddata & 0x0f) + '0'));
 }
int main(void)
{
    unsigned char cdata;
    unsigned char bcddata;
    unsigned char bindata;
    printf("请输入一个字符:");
    scanf("%c", &cdata);
    bcddata = bin2bcd(cdata);
    printf("BCD结果\n");
    printf("以字符显示:");showbcd(bcddata);putchar('\n');
    printf("以十六进制显示:%x\n", bcddata );
    printf("以整形显示:%d\n", bcddata );
    bindata = bcd2bin(bcddata);
    printf("bin结果\n");
    printf("以字符显示:%c\n", bindata);
    printf("以十六进制显示:%x\n", bindata );
    printf("以整形显示:%d\n", bindata );

    return 0; 
}//endof main

exam1-4-cmd.JPG




专家
2018-06-11 18:03:33     打赏
10楼

提交第5题作业。虽然可能赶不上评分,但还是放出来给大家批评批评吧

/*
5.请利用来实现一个抽象数据类型的链表,他可以存放任意自定义数据类型,至少实现指定位置插入和制定位置得到数据,以及制定位置删除。(32分)
*/
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>

#define elemtype int
#define sampleNo 10
 /* 链表数据类型*/
typedef struct link{
	elemtype data;
	struct link *next;
}linker;

/*查找第n个元素*/
linker *scanforNo(linker *linkdata, int no )
{
	int i=1;
	linker *tempdata;
	
     //printf("no = %d\n",no);
	    tempdata = linkdata;
    while((i<(no+1)) && ((tempdata->next) != NULL))
    {
    		tempdata = tempdata->next;
    		i++;//printf("%d\t",i);printf("no = %d\tdata = %d\n",no, tempdata->data);
	}
    if(i<(no+1)){
		//printf("超出链表长度!\n");
		tempdata = NULL;
	}
    return tempdata;
}

/*查找数据为data元素的位置*/
int scanforData(linker *linkdata, elemtype data)
{
	int i=0;
	linker *tempdata;
	
     //printf("no = %d\n",no);
	    tempdata = linkdata;
    while(((tempdata) != NULL) && (tempdata->data != data))
    {
    		tempdata = tempdata->next;
    		i++;//printf("%d\t",i);printf("no = %d\tdata = %d\n",no, tempdata->data);
	}
    if(tempdata == NULL)
    {
		//printf("链表中没有%d!\n", data);
		i = 0;
	}
    return i;
}

/*在第n位插入数据*/
void insertData(linker *linkdata, int no, elemtype data)
{
	int i=1;
	linker *tempdata;
	linker *temp;
	
     //printf("no = %d\n",no);
	    tempdata = linkdata;
    while((i<(no)) && ((tempdata->next) != NULL))
    {
    		tempdata = tempdata->next;
    		i++;//printf("%d\t",i);printf("no = %d\n",no);
	}
	//printf("%d\n",i);
	if(i>=(no-1)){
		temp = (linker *)calloc(1, sizeof(linker));
		temp->data = data;
		temp->next = tempdata->next;
		tempdata->next = temp;
	}else if(i<(no-1)){
		printf("超出链表长度!\n");
	}	
}

/*删除第n位数据*/
void deleteData(linker *linkdata, int no)
{
	int i=1;
	linker *tempdata;
	linker *temp;
	
     //printf("no = %d\n",no);
	    tempdata = linkdata;
    while((i<(no+1)) && ((tempdata->next) != NULL))
    {
            temp = tempdata;
    		tempdata = tempdata->next;
    		i++;//printf("%d\t",i);printf("no = %d\n",no);
	}
	//printf("%d\n",i);
	if(i>=(no+1)){
		temp->next = tempdata->next;
	}else if(i<(no+1)){
		printf("超出链表长度!\n");
	}
}
/*打印整个链表*/
void printData(linker *linkdata)
{
	linker *pt;
	pt = linkdata;
	while( pt->next != NULL)
	{
		pt = pt->next;
		printf("%d\t", pt->data );
	}
	printf("\n打印链表结束!\n");
	printf("------------------------------\n");
}
/*打印命令界面*/
void drawUI(void)
{
    //printf("\n-------------------------\n");
	printf("添加新数据请输入1:\n");
	printf("按位置查找请输入2:\n");
	printf("按数据查找请输入3:\n");
	printf("删除数据请输入4:\n");
	printf("结束程序请输入9:\n");
	printf("请输入命令字以继续:");
}
/*建立样表*/
void creatSample(linker *linkdata)
{
	int i;
	for(i = 0; i < sampleNo; i++)
	{
		insertData(linkdata, (i+1),(i+1));
	}
}
/*命令相关*/
void cmd0(linker *linkdata)//加载样表
{
	creatSample(linkdata);
	printData(linkdata);
}
void cmd1(linker *linkdata)//添加新数据
{
     elemtype data;
     int no;
     printf("请输入要插入数据:");scanf("%d",&data); 
     printf("请输入要插入位置:");scanf("%d",&no);
     insertData(linkdata, (no),(data));
	printData(linkdata);
}
void cmd2(linker *linkdata)//按位置查找
{
     linker *temp;
     int no;
     
     printf("请输入要查找的位置:");scanf("%d",&no);
     temp = scanforNo(linkdata, no);
     if(temp != NULL)
     {
         printf("第%d位的数据是:%d。\n", no, temp->data);
     }else
     {
          printf("输入位置超出当前链表长度!\n");
      }
	printData(linkdata);
}
void cmd3(linker *linkdata)//按数据查找
{
     linker *temp;
     int no;
     elemtype data;
     
     printf("请输入要查找的数据:");scanf("%d",&data);
     no = scanforData(linkdata, data);
     if(no != 0)
     {
         printf("数据%d在链表中第%d位。\n", data, no);
     }else
     {
          printf("链表中没有%d!\n", data);
      }      
	printData(linkdata);
}
void cmd4(linker *linkdata)//删除数据
{
     int no;
     
     printf("请输入要删除数据位置:");scanf("%d",&no);
     deleteData(linkdata, no);
	printData(linkdata);
}
int cmd9(void)
{
	return 0;
}
/*主函数*/
int main(void)
{
	linker *header;
	linker *finder;
	int cmd;
	int holdOn = 1;
	header = (linker *)calloc(1, sizeof(linker));
	header->next = NULL;
	printf("加载样表请输入0:\n");
	while( holdOn )
	{
		drawUI();
		scanf("%d", &cmd);
		switch(cmd)
		{
			case 0:cmd0(header);break;//加载样表
			case 1:cmd1(header);break;//添加新数据
			case 2:cmd2(header);break;//按位置查找
			case 3:cmd3(header);break;//按数据查找
			case 4:cmd4(header);break;//删除数据
			case 9:holdOn = cmd9();break;
			default:printf("无此命令,请重新输入!\n");
            printf("------------------------------\n");break;
		}
	}//endof while
    return 0; 
}//endof main



共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]