目录
1、下列输出什么
2、计算求和
3、使用指针打印数组内容
4、打印水仙花数
5、写一个函数,可以逆序一个字符串的内容
6、题目名称:打印菱形
6、喝汽水
7、猜名次
8、下列关于整形数组输出什么并解释
9、下列关于字符数组输出什么并解释
9.1 下列关于字符数组输出
9.2 下列关于字符数组输出
9.3 下列关于字符数组输出
9.4 下列关于字符数组输出
9.5 下列关于字符数组输出
9.6 下列关于字符数组输出
1、下列输出什么
int i;//i是全局变量,不初始化,默认是0
int main()
{
i--;
if (i > sizeof(i))
{
printf(">\n") ;
}
else
printf("<\n");
return 0;
}
输出>
因为:sizeof计算出的是一个unsigned数,当与有符号数-1比较的时候,-1会被看作一个无符号的数,-1在内存中存放的数是一个很大的数(32个1),所以>
2、计算求和
题目内容:
求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字
例: 2+22+222+2222+22222
//求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字
//例: 2+22+222+2222+22222
int main()
{
int a = 0;
int n = 0;
int i = 0;
int sum = 0;
int ret = 0;
scanf("%d %d",&a,&n);
for(i=0; i<=n; i++)
{
ret = ret*10 + n;
sum = sum + ret;
}
printf("%d\n",sum);
return 0;
}
3、使用指针打印数组内容
题目内容:
写一个函数打印a数组的内容,不使用数组下标,使用指针。
arr是一个整形一维数组。
方法一:
void print(int *p,int len)
{
int i = 0;
for(i=0;i<len; i++)
{
printf("%d ",*(p+i));
}
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int* p = arr;
int sz = sizeof(arr)/sizeof(arr[0]);
print(p,sz);
return 0;
}
方法二:
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int* p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
int* pend = arr + sz - 1;
while(p <= pend)
{
printf("%d ",*p);
p++;
}
return 0;
}
4、打印水仙花数
题目内容
求出0~100000之间的所有”水仙花数“并输出
水仙花数”是指一个n位数,其各山数子的n次方之和于该数本身,如:153=1^3+5^3+ 3^3,则153是一个
#include<math.h>
int main()
{
int i = 0;
int n = 1;
int tmp = 0;
int sum = 0;
for(i=0; i<=100000; i++)
{
tmp = i;
while(tmp/10)
{
n++;
tmp = tmp/10;
}
tmp = i;
while(tmp)
{
int ret = tmp % 10;
sum += pow(ret,n);
tmp = tmp / 10;
}
if(sum == i)
{
printf("%d ",i);
}
}
return 0;
}
5、写一个函数,可以逆序一个字符串的内容
#include<string.h>
void reverse(char * str)
{
int len = strlen(str)-1;
char* left = str;
char* right = str + len;
while(left < right)
{
int tmp = 0;
tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse(arr);
printf("%s",arr);
return 0;
}
6、题目名称:打印菱形
题目内容:
用C语言在屏幕上输出以下图案:
int main()
{
int line = 0;
scanf("%d",&line);
int i = 0;
for(i=0; i<line; i++ )
{
int j = 0;
for(j=0; j<line-1-i ; j++)
{
printf(" ");
}
for(j=0; j<i*2+1; j++)
{
printf("*");
}
printf("\n");
}
for(i=0; i<=line-1; i++)
{
int j = 0;
for(j=0; j<=i; j++)
{
printf(" ");
}
for(j=0; j<2*(line-1-i)-1 ;j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
6、喝汽水
1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水 (编程实现)。
int main()
{
int money = 0;
scanf("%d",&money);
int total = money;
int empty = money;
while(empty >=2)
{
total += empty / 2;
empty = empty / 2 + empty % 2;
}
printf("%d\n",total);
return 0;
}
或者
int main()
{
int money = 0;
scanf("%d",&money);
int total = money;
if(total>0)
{
total = money*2 - 1;
}
printf("%d\n",total);
return 0;
}
7、猜名次
题目内容:
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
- A选手说:B第二,我第三;
- B选手说:我第二,E第四;
- C选手说:我第一,D第二;
- D选手说:C最后,我第三:
- E选手说:我第四,A第一;
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次
int main()
{
int a = 0;int b = 0;int c = 0; int d = 0; int e = 0;
int i = 0;
for(a=1; a<=5; a++)
{
for(b=1; b<=5; b++)
{
for(c=1; c<=5; c++)
{
for(d=1;d<=5;d++)
{
for(e=1; e<=5; e++)
{
if((b==2)+(a==3)==1 &&((b==2)+(e==4)==1)
&& (c==1)+(d==2)==1
&&((c==5)+(d==3)==1)
&&((e==4)+(a==1)==1))
{
if(a*b*c*d*e == 120)
{
printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
}
}
}
}
}
}
}
return 0;
}
8、下列关于整形数组输出什么并解释
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a + 0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a + 1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a + 1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0] + 1));
return 0;
}
//sizeof(数组名) - 数组名表示整个数组的 - 计算的是整个数组的大小
//&数组名 - 数组名表示整个数组,取出的是整个数组的地址
//除此之外,所有的数组名都是数组首元素的地址
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n",sizeof(a)); //16 - sizeof(数组名) - 数组名表示整个数组的 - 计算的是整个数组的大小
printf("%d\n",sizeof(a + 0));// 4/8 - a+0是第一个元素的地址,sizeof(a+0)计算的是地址的大小
printf("%d\n",sizeof(*a)); //4 - 首元素的地址被解引用,sizeof(*a)计算的是第一个元素的大小
printf("%d\n",sizeof(a + 1)); //4/8 - a+1是第二个元素的地址,计算的是地址的大小
printf("%d\n",sizeof(a[1])); //4 - 计算的是第二个元素大小
printf("%d\n",sizeof(&a)); // 4/8 - &a虽然数组的地址,但也是地址,sizeof(&a)计算的一个地址的大小
printf("%d\n",sizeof(*&a)); // 16 - 对整个数组解引用,计算的是整个数组的大小
printf("%d\n",sizeof(&a + 1));// 4/8 - &a + 1是数组后面的空间的位置地址
printf("%d\n",sizeof(&a[0])); // 4/8 - 表示第一个元素的地址
printf("%d\n",sizeof(&a[0]+ 1));//4/8 - 表示第二个元素的地址
return 0;
}
9、下列关于字符数组输出什么并解释
9.1 下列关于字符数组输出
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr));
printf("%d\n",sizeof(arr + 0));
printf("%d\n",sizeof(*arr));
printf("%d\n",sizeof(arr[1]));
printf("%d\n",sizeof(&arr));
printf("%d\n",sizeof(&arr + 1));
printf("%d\n",sizeof(&arr[0] + 1));
return 0;
}
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr)); //6 - sizeof(arr)表示整个数组的地址
printf("%d\n",sizeof(arr + 0));// 4/8 - 单独的arr(没有和sizeof搭配)就是首元素的地址,加0还是首元素的地址
printf("%d\n",sizeof(*arr));// 1 - arr就是首元素的地址,*arr就是'a'
printf("%d\n",sizeof(arr[1]));// 1 - 就是'b'
printf("%d\n",sizeof(&arr));// 4/8 - 取数组的地址
printf("%d\n",sizeof(&arr + 1));// 4/8 - 跳过一个数组的地址,'f'的后面
printf("%d\n",sizeof(&arr[0] + 1));// 4/8 - 跳过一个元素的地址,即'b'的地址
return 0;
}
9.2 下列关于字符数组输出
#include<string.h>
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n",strlen(arr));//
printf("%d\n",strlen(arr + 0));//
printf("%d\n",strlen(*arr));//
printf("%d\n",strlen(arr[1]));//
printf("%d\n",strlen(&arr));//
printf("%d\n",strlen(&arr + 1));//
printf("%d\n",strlen(&arr[0] + 1));//
return 0;
}
#include<string.h>
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n",strlen(arr));//随机值 - arr为首元素的地址,后的/0找不到
printf("%d\n",strlen(arr + 0));//随机值 - arr+0 还是首元素的地址
printf("%d\n",strlen(*arr));//错误 - *arr 这里找到的是'a',而非一个地址
printf("%d\n",strlen(arr[1]));//错误 - arr[1]这里找到的是'b',而非一个地址
printf("%d\n",strlen(&arr));//随机值 - 找到数组的地址开始数
printf("%d\n",strlen(&arr + 1));//随机值 - 找到数组后面的地址开始数
printf("%d\n",strlen(&arr[0] + 1));//随机值 - 从'b'开始向后数
return 0;
}
9.3 下列关于字符数组输出
int main()
{
char arr[] = "abcdef";
printf("%d\n",sizeof(arr));
printf("%d\n",sizeof(arr + 0));
printf("%d\n",sizeof(*arr));
printf("%d\n",sizeof(arr[1]));
printf("%d\n",sizeof(&arr));
printf("%d\n",sizeof(&arr + 1));
printf("%d\n",sizeof(&arr[0] + 1));
return 0;
}
int main()
{
char arr[] = "abcdef";
printf("%d\n",sizeof(arr)); //7 - sizeof(arr)表示整个数组的地址
printf("%d\n",sizeof(arr + 0));// 4/8 - 单独的arr(没有和sizeof搭配)就是首元素的地址,加0还是首元素的地址
printf("%d\n",sizeof(*arr));// 1 - arr就是首元素的地址,*arr就是'a'
printf("%d\n",sizeof(arr[1]));// 1 - 就是'b'
printf("%d\n",sizeof(&arr));// 4/8 - 取数组的地址,它还是要给地址
printf("%d\n",sizeof(&arr + 1));// 4/8 - 跳过一个数组的地址,'f'的后面
printf("%d\n",sizeof(&arr[0] + 1));// 4/8 - 跳过一个元素的地址,即'b'的地址
return 0;
}
9.4 下列关于字符数组输出
#include<string.h>
int main()
{
char arr[] = "abcdef";
// "a b c d e f \0"
printf("%d\n",strlen(arr));
printf("%d\n",strlen(arr + 0));
printf("%d\n",strlen(*arr));
printf("%d\n",strlen(arr[1]));
printf("%d\n",strlen(&arr));
printf("%d\n",strlen(&arr + 1));
printf("%d\n",strlen(&arr[0] + 1));
return 0;
}
#include<string.h>
int main()
{
char arr[] = "abcdef";
// " a b c d e f \0"
printf("%d\n",strlen(arr));//6 - arr为首元素的地址,到\0停止
printf("%d\n",strlen(arr + 0));//6 - arr+0 还是首元素的地址
printf("%d\n",strlen(*arr));//错误 - *arr 这里找到的是'a',而非一个地址
printf("%d\n",strlen(arr[1]));//错误 - arr[1]这里找到的是'b',而非一个地址
printf("%d\n",strlen(&arr));//6 - 找到数组的地址开始数
printf("%d\n",strlen(&arr + 1));//随机值 - 找到数组后面的地址即\0开始数
printf("%d\n",strlen(&arr[0] + 1));//5 - 从'b'开始向后数
return 0;
}
9.5 下列关于字符数组输出
int main()
{
char* p = "abcdef";
printf("%d\n",sizeof(p)); //
printf("%d\n",sizeof(p + 1));//
printf("%d\n",sizeof(*p));//
printf("%d\n",sizeof(p[0]));//
printf("%d\n",sizeof(&p));//
printf("%d\n",sizeof(&p + 1));//
printf("%d\n",sizeof(&p[0] + 1));//
return 0;
}
int main()
{
char* p = "abcdef";
//p 是一个指向字符窜的指针
printf("%d\n",sizeof(p)); //4/8 - p是一个指针
printf("%d\n",sizeof(p + 1));//4/8 - p+1是'b',但是它还是一个地址
printf("%d\n",sizeof(*p));//1 - *p拿出来a
printf("%d\n",sizeof(p[0]));//1 - p[0] <==> *(p + 0)
printf("%d\n",sizeof(&p));//4/8 - 是取(地址p)的地址
printf("%d\n",sizeof(&p + 1));//4/8 - 是取(地址p后面一个单位)的地址
printf("%d\n",sizeof(&p[0] + 1));//4/8 - 是取地址b的地址
return 0;
}
9.6 下列关于字符数组输出
#include<string.h>
int main()
{
char* p = "abcdef";
printf("%d\n",strlen(p)); //
printf("%d\n",strlen(p + 1));//
printf("%d\n",strlen(*p));//
printf("%d\n",strlen(p[0]));//
printf("%d\n",strlen(&p));//
printf("%d\n",strlen(&p + 1));//
printf("%d\n",strlen(&p[0] + 1));//
return 0;
}
#include<string.h>
int main()
{
char* p = "abcdef";
// " a b c d e f \0"
printf("%d\n",strlen(p));//6 - p为首元素的地址,到\0停止
printf("%d\n",strlen(p + 1));//5 - p为首元素的地址+1,到\0停止
printf("%d\n",strlen(*p));//错误 - *p 这里找到的是'a',而非一个地址
printf("%d\n",strlen(p[0]));//错误 - p[0]这里找到的是'a',而非一个地址
printf("%d\n",strlen(&p));//随机 - 取到的是(地址p)的地址,后面到什么时候就碰到\0了,不知道
printf("%d\n",strlen(&p + 1));//随机 - 取到的是(地址p)的地址再往后跳一个单位,后面到什么时候就碰到\0了,不知道
printf("%d\n",strlen(&p[0] + 1));//5 - 从'b'开始向后数
return 0;
}