c和指针是一本很经典的提高c语言水平的书籍。遂将自己写的代码进行上传,共同学习进步。
4.14.1
正数n的平方根可以通过计算一系列近似值来获得,每个近似值都比前一个更加接近准确值。第一个近似值是1,接下来的近似值则通过下面的公式来获得。编写一个程序,读入一个值,计算并打印它的平方根。
#include <stdio.h>
int main(int argc, const char *argv[])
{
while (1)
{
int n = 0;
float num_old1 = 0;
float num_old2 = 1;
scanf("%d",&n);
while (num_old1 != num_old2)
{
num_old1 = num_old2;
num_old2 = (num_old1 + (n / num_old1)) / 2;
printf("num_old2 = %f\n",num_old2);
}
}
return 0;
}
4.14.2
一个整数如果只能被它本身和1整除,它就被称为质数,请编写一个程序,打印出1-100之间的所有质数。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int num = 1;
int i = 0;
int j = 0;
int cnt = 0;
for(i = 0; i < 100; i++)
{
for (j = 2;j < num;j++)//eg.10 2`9的每一个数都不能被0整除,即对0求余不得0
{
if ((num % j) != 0)
{
cnt++;
}
}
if (cnt == num-2)
{
printf("num = %d\n",num);
}
cnt = 0;
num++;
}
return 0;
}
4.14.3
等边三角形的三条边长度都相等,但等腰三角形只有两条边长度是相等的。如果三角形的三条边长度都不相等,就称为不等边三角形
请编写一个程序,提示用户输入三个数,分别表示三角形三条边的长度,然后由程序判断它是什么类型的三角形。
提示:除了边的长度是否相等外,程序是否还应考虑一些其他东西?
#include <stdio.h>
int IsTriangle(int a,int b,int c)
{
if ( a + b <= c)
{
return 0;
}
if ( a + c <= b)
{
return 0;
}
if ( b + c <= a)
{
return 0;
}
return 1;//一旦有两边之和小于第三边的就return0,都不是return1
}
int IsWhatTriangle(int a,int b,int c)
{
int equal = 1;
if ( a == b )
{
equal++;
if (b == c)
{
equal++;
return equal;
}
else
{
return equal;
}
}
else if (a == c)
{
equal++;
return equal;
}
else if (b == c)
{
equal++;
return equal;
}
else
{
return equal;
}
}
int main(int argc, const char *argv[])
{
int a = 0;
int b = 0;
int c = 0;
int ret = 0;
int equal = 0;
printf("请分别输入三角形边长:");
scanf("%d %d %d",&a,&b,&c);
ret = IsTriangle(a,b,c);
if (ret == 1)//是三角形
{
equal = IsWhatTriangle(a,b,c);
if (equal == 3)
{
printf("等边三角形\n");
}
else if (equal == 2)
{
printf("等腰三角形\n");
}
else if (equal == 1)
{
printf("不等边三角形\n");
}
}
else
{
printf("不是三角形\n");
}
return 0;
}
4.14.4
编写函数copy_n,它的函数原型如下:void copy_n(char dst[],char src[],int n);
这个函数用于把一个字符串从数组src复制到dst,但有如下要求:必须正好复制n个字符到dst,不能多,也不能少。如果src字符串的长度小于n,你必须在复制后的
字符串尾部补充足够的NUL字符,使它的长度正好为n。如果src的长度长于或等于n,那么你在dst中存储了n个字符便可停止。此时,数组dst将不是以NUL结尾。
注意调用copy_n时,它应该在dst[0]至dst[n-1]的空间中存储一些东西,但也只限于那些位置,这与src的长度无关。
#include <stdio.h>
int main(int argc, const char *argv[])
{
char src[1024] = {"hello world"};
char dst[1024] = {0};
int n = 0;
int len = 0;
char *temp = src;
char *ptmp = dst;
int i = 0;
printf("请输入要复制的数组:");
gets(src);
printf("请输入要复制的字节个数:");
scanf("%d",&n);
len = strlen(src);
while (temp != '\0' && n != 0)
{
// dst[i] = *temp;
*ptmp = *temp;
temp++;
ptmp++;
// i++;
n--;
}
printf("dst:%s\n",dst);
return 0;
}
4.14.5
编写一个程序,从标准输入一行一行地读取文本,并完成如下任务:如果文件中有两行或更多行相邻的文本内容相同,那么就打印出其中一行,其余的行不打印,
你可以假设文件中的文本行在长度上不会超过128个字符。
提示:使用gets函数读取输入行,使用strcpy来复制它们,strcmp对其进行比较,相等函数返回0,不相等返回非0值。
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char array[64] = {0};
char last_array[64] = {0};
while (1)
{
gets(array);
if (!strcmp(array,last_array))
{
printf("%s\n",array);
}
strcpy(last_array,array);
}
return 0;
}
4.14.6
请编写一个函数,它从一个字符串中提取一个字符串。函数的原型应该如下:
int substr(char dst[],char src[],int start,int len);
函数的任务是从src数组起始位置向后偏移start个字符的位置开始,最多复制len个非NULL字符到dst数组。复制完毕后,dst数组必须以NULL字节结尾
函数的返回值是存储于dst数组中的字符串长度。
如果,start所指定的位置越过了src数组的尾部,或者start或len的值为负,那么复制到dst数组的是个空字符串。
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char src[1024] = {"hello world how are you"};
char dst[1024] = {0};
int start = 0;
int len = 0;
char *ptmp = src;
scanf("%d %d",&start,&len);
while (start != 1)
{
ptmp++;
if (*ptmp == '\0')
{
printf("is end\n");
return 0;
}
start--;
}
strncpy(dst,ptmp,len);
printf("dst:%s\n",dst);
return 0;
}
4.14.7
编写一个函数,从一个字符串中除去多余的空格。函数原型:
void deblank(char string[])
当函数发现字符串中如果有一个地方由一个或者多个连续的空格组成,就把它们改成单个空格字符。注意当你遍历整个字符串是要确保它以NUL字符结尾
#include <stdio.h>
int main(int argc, const char *argv[])
{
char str[1024] = {"hello world how are you"};
char dst[1024] = {0};
char *ptmp = str;
char *pdst = dst;
while (*ptmp != '\0')
{
if (*ptmp != ' ')//当前非空
{
*pdst = *ptmp;
pdst++;
ptmp++;
if (*ptmp == ' ')//下一个为空
{
*pdst = *ptmp;
pdst++;
}
ptmp--;
}
ptmp++;
}
printf("dst:%s\n",dst);
return 0;
}