ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言错题集 (1) (慢慢来比较快)(将练习过程中的错题整理出来,归纳知识点)

2021-07-01 10:58:03  阅读:147  来源: 互联网

标签:tmp 知识点 00 10 int arr C语言 错题 printf


选择题(2道)

第一题:
下面代码的结果是:( )

#include <stdio.h>
int main()
{
  int arr[] = {1,2,3,4,5};
  short *p = (short*)arr;
  int i = 0;
  for(i=0; i<4; i++)
  {
    *(p+i) = 0;
  }
   
  for(i=0; i<5; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

A.1 2 3 4 5
B.0 0 3 4 5
C.0 0 0 0 5
D.1 0 0 0 0

我的答案:C
正确答案:D

解答:
知识点:①小端存储

②sizeof( short ) = 2
10进制:1 2 3 4 5
原先二进制:00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05
结合sizeof( short ) = 2,
得到现在的二进制:00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00 05
答案就是:0 0 3 4 5

第二题:
题目名称:
下面代码的结果是:

#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0; 
}

A.>
B.<
C.不输出
D.程序有问题

我的答案:D
正确答案:A

解答:
知识点:① sizeof( ) 的结果是 unsigned int

② 算数转换:long double
double
float
unsigned long int
long int
unsigned int
int
unsigned short
short

③ -1 的补码 11111111
4 的补码 00000100
由于是 unsigned int ,显然,-1 > 4

#include <stdio.h>

int i;     // i 是全局变量,全局在没有赋初值的时候,编译器会自动将其赋值为 0
int main()
{
	i--;   // i = -1
	if (i > sizeof(i))   //判断 -1 > 4  ???
	{                    //sizeof() 的结果是 unsigned int 
		printf(">\n");   //所以,要将 i 先转换成 unsigned int ,然后和 -1 进行比较
	}
	else
	{
		printf("<\n");
	}
	return 0;
}

编程题(3道)

第一题:
计算求和
题目内容:
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,
例如:2+22+222+2222+22222

我的答案(运行正确)

知识点:
① double pow (double base , double exponent)

#include <stdio.h>
#include <math.h>

int main()
{
	int i = 0;
	int sum = 0;
	for (i = 1; i < 6; i++)
	{
		int j = 0;
		int ret = 0;
		for (j = 0; j < i; j++)
		{
			ret += 2*pow(10, j);
		}
		sum += ret;
	}
	printf("%d\n", sum);
 	return 0;
}

提供的答案:

通过观察可以发现,该表达式的第i项中有i个a数字,因此:
假设第i项为temp,则第i+1项为temp*10+a
具体参考以下代码
*/
int main()
{
int a = 0;
int n = 0;
int i = 0;
int sum = 0;
int tmp = 0;


scanf("%d%d", &a, &n);
for(i=0; i<n; i++)
{
tmp = tmp*10+a;
sum += tmp;
}
printf("%d\n", sum);

return 0;
}

第二题:
使用指针打印数组内容
写一个函数打印arr数组的内容,不使用数组下标,使用指针。
arr是一个整型一维数组。
我的答案:

#include <stdio.h>

panduan(int* a,int sz)
{
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%5d\n", *a);
        a = a + 1;
    }
}

int main()
{
    int arr[] = {0,1,2,3,4,5,6,7,8,9 };
    int size = sizeof(arr) / sizeof(arr[0]);
    panduan(arr,size);
 	return 0;
}

视频课程给出的答案:

#include <stdio.h>
 
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
	int size = sizeof(arr)/sizeof(arr[0]);
	int* p = arr;
	int* pend = arr + size - 1;
	while (p < pend)
	{
		printf("%d\n", *p);
		p++;
	}
	return 0;
}

第三题:
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=13+53+3^3,则153是一个“水仙花数”。

正确解答过程:(我调试了40多分钟)
#include <stdio.h>
#include <math.h>

int main()
{
	int i = 0;
	for (i = 0; i < 100000; i++)
	{
		int count = 1;
		int pb = i;          //一定要将 i 赋值给 变量 pb,因为假设用 i 进行 i/10 运算时
		while (pb / 10)      //就会将 i 的值改变  
		{
			count++;
			pb /= 10;
		}
		double ret = 0;
		int temp = i;         //一定要将 i 赋值给 变量 temp,
		while (temp)
		{
			ret += pow((double)(temp % 10), (double)count);
			temp = temp / 10;
		}
		if ((double)i == ret)    //这里体现了将 i 赋值给变量 pb 和变量 temp 的重要性
			printf("%d\n", i);
	}
	return 0;
}

答案给出的过程:

	此题的关键在于只要知道判断一个数据是否为水仙花数的方式,问题就迎刃而解。假定给定一个数据data,具体检测方式如下:
	1. 求取data是几位数
	2. 获取data中每个位置上的数据,并对其进行立方求和
	3. 对data中每个位上的数据立方求和完成后,在检测其结果是否与data相等即可,
	相等:则为水仙花数
	否则:不是
	具体实现参考以下代码。
	*/
	int main()
	{
	int i = 0;
	for(i=0; i<=999999; i++)
	{
	int count = 1;
	int tmp = i;
	int sum = 0;
	//判断i是否为水仙花数
	//1. 求判断数字的位数
	while(tmp/10)
	{
	count++;
	tmp = tmp/10;
	}
	     
	//2. 计算每一位的次方和
	tmp = i;
	while(tmp)
	{
	sum += pow(tmp%10, count);
	tmp = tmp/10;
	}
	     
	//3. 判断
	if(sum == i)
	printf("%d ", i);
	}
	return 0;
	}

标签:tmp,知识点,00,10,int,arr,C语言,错题,printf
来源: https://blog.csdn.net/weixin_45641816/article/details/118381164

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有