1.题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
2.题目:企业发放的奖金根据利润提成。
利润(I)低于或等于10万元时,奖金可提10%;
利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
从键盘输入当月利润I,求应发放奖金总数?
程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
#define WAN 10000 double bonus %lf
3.题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
程序分析:
int i,j,m,n,x; for(i=2;i<168;i++){if(168%i==0)j=168/i;if(i>j&& (i + j) % 2 == 0){x=n*n-100}}
4.题目:输入某年某月某日,判断这一天是这一年的第几天?
程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
int month[12]={31,28,31……};if(year%400==0||year%100!=0&&year%4==0)month[1]=29;for(i=0;i<month;i++)
5.题目:输入三个整数x,y,z,请把这三个数由小到大输出。
程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
int arr[3];scanf_S("%d%d%d",&arr[0]……);for(i=0;i<len;i++)for(j=i+1;j<len;j++){if(arr[i]>arr[j]){t=arr[i];arr[i]=arr[j];arr[j]=t;}}
用的是冒泡排序,注意输入数时必须有空格。
6.题目:用*号输出字母C的图案。
程序分析:可先用’*’号在纸上写出字母C,再分行输出。
char a='*';printf(" %c",a);
7.题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!
程序分析:字符共有256个。不同字符,图形不一样。
8.题目:输出9*9口诀。
程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
for (i = 1; i < 10; i++){ for (j = 1; j <= i; j++){result = i*j;printf("%d*%d=%-3d", i, j, result);
9.题目:要求输出国际象棋棋盘。
程序分析:国际象棋棋盘由64个黑白相间的格子组成,分为8行*8列。用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。
如果出现乱码情况请参考本博客【C 练习实例7】的解决方法
if(i%2)printf("%c%c %c%c ……",219,219,……)else……
10.题目:打印楼梯,同时在楼梯上方打印两个笑脸。
程序分析:用 ASCII 1 来输出笑脸;用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。
printf("\1\1\n"); /*输出两个笑脸*/
11.题目:古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
程序分析:兔子的规律为数列1,1,2,3,5,8,13,21….,即下个月是上两个月之和(从第三个月开始)。
sum[i] = sum[i - 1] + sum[i - 2];
12.题目:判断101到200之间的素数。
#include<math.h> for(j=2;j<=sqrt(i);j++)if(i%j==0)break;{if(j>sqrt(i)printf("%d\n",i)
13.题目:打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个”水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
i*100+j*10+k
14.题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
for(j=2;j<i;j++){if(i%j==0){i=i/j;printf(j);j=1;}if(j>=i)printf(i)}
15.题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
x=(i >= 90) ? 'A ': (i >= 60) ? 'B' : 'C';
16.题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
if (i < j){t = i; i = j; j = t;}r = i%j;while (r != 0){i = j;j = r;r = i%j;}printf("%d", j);
17.题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
程序分析:利用while语句,条件为输入的字符不为’\n’。
char str[20] = { '\0' };gets_s(str,20);
不能用0
while (str[i]){if ((str[i]>='a'&&str[i]<='z') || (str[i]>='A'&&str[i]<='Z'))i1++;else if (str[i] == ' ')j++;else if (str[i]>='0'&& str[i] <= '9')k++;else l++;i++;}
char *delete(char *str, char c);
int main(){
int i = 0, j=0, k = 0;
char s1[1000],m;
printf("please input the str: ");
gets_s(s1, 1000);
fflush(stdin);
printf("please input the char: ");
scanf_s("%c", &m,1);
printf("%s", delete(s1, m));
getch();
return 0;
}
char* delete(char *str, char c){
int j = 0;
char e[1000];
int len = strlen(str);
for (int i = 0; i < len; i++){
if (str[i] != c)e[j++]=str[i];
}
e[j] = '\0';
return e;
}
33.题目:判断一个数字是否为质数。
for (int i = 2; i < k; i++){if (k%i == 0){printf("not a prime number"); break;}if (i >= k-1)printf("is a prime number");}
34.题目:练习函数调用。
main->threehellos()->hellos();
35.题目:字符串反转,如将字符串 “www.runoob.com” 反转为 “moc.boonur.www”。
str2[len = strlen(str1)] = '\0';for (int i = len-1; i >=0; i--)str2[j++] = str1[i];puts(str2);
注意是i–;
36.题目:求100之内的素数。
for (int i = 2; i < 100; i++){k = (int)sqrt(i);for (j = 2; j <= k; j++)if (i%j == 0) break;if (j>k){printf("%d ", i);n++;if (n % 5 == 0)printf("\n");}
37.题目:对10个数进行排序。
冒泡法:for (i = 0; i < 10; i++)scanf_s("%d", &a[i]);for (i = 0; i < 10; i++){for (j = 0; j <10 - i; j++){if (a[j]>a[j + 1]){temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}}
选择法:for (i = 0; i < 10; i++){for (j = i + 1; j<10; j++){if (a[i]>a[j]){temp = a[i];a[i] = a[j];a[j] = temp;}}}
38.题目:求一个3*3矩阵对角线元素之和
for (i = 0; i < 3; i++)for (j = 0; j < 3;j++)scanf_s("%d", &a[i][j]);
39.题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
int len =0;while (a[len++] != 0){}len--;for (i = len-1; i >=0; i--){if (sum < a[i]){a[i + 1] = a[i];}else {a[i + 1] = sum; break;}if (i ==0){ a[0] = sum; }}
i==0中间的等号不能少
40.题目:将一个数组逆序输出。
for (i = 5; i >= 0; i--)b[j++] = a[i];
41.题目:学习使用auto定义变量的用法。
auto int num=1;printf("内置模块 num 变量为 %d \n",num);num++;
使用后即被释放
42.题目:学习使用static的另一用法。
static int num=1;printf("内置模块 num 变量为 %d \n",num);num++;
使用后值保存
43.题目:学习static定义静态变量的用法。
44.题目:学习使用external的用法。
45.题目:学习使用register定义变量的方法。
register int i;int tmp = 0;for (i = 1; i <= 100; i++)tmp += i;
register加快存取速度,变的局部变量
46.题目:宏#define命令练习。
#define SQ(x) (x)*(x)
47.#define exchange(a,b) { int t;t=a;a=b;b=t;}//注意放在一行里
48.#define EQ ==
49.#undef MAX #ifdef MAXprintf("更大的数字是 %d\n",MAXIMUM(a,b));#elseprintf("更小的数字是 %d\n",MINIMUM(a,b));#endif
67.题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
minp = 0; for (j = 1; j<10; j++) { if (a[minp]>a[j]) minp = j; } t = a[9]; a[9] = a[minp]; a[minp] = t;
68.题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。
//滚动数组
void move(int array[],int n,int offset)
{
int *p,*arr_end;
arr_end=array+n; //数组最后一个元素的下一个位置
int last;
//滚动直到偏移量为0
while(offset)
{
last=*(arr_end-1);
for(p=arr_end-1;p!=array;--p) //向右滚动一位
*p=*(p-1);
*array=last;
--offset;
}
}
69.题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#include <stdio.h>
void main()
{
int num[50],n,*p,j,loop,i,m,k;
printf("请输入这一圈人的数量:\n");
scanf("%d",&n);
p=num;
//开始给这些人编号
for (j=0;j<n;j++)
{
*(p+j)=j+1;
}
i=0;//i用于计数,即让指针后移
m=0;//m记录退出圈子的人数
k=0;//k报数1,2,3
while(m<n-1)//当退出的人数不大于总人数时,即留下的人数至少是一个人
//这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,
//这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出
{
if (*(p+i)!=0)//如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
{
k++;
}
if (k==3)
{ k=0; //报数清零,即下一个人从1开始报数
*(p+i)=0;//将报数为3的人编号重置为0
m++; //退出人数加1
}
i++; //指针后移
if (i==n)//这句很关键,如果到了队尾,就要使指针重新指向对头
//并且它只能放在i++后面,因为只有i++了才有可能i==n
{
i=0;
}
}
printf("现在剩下的人是:");
for (loop=0;loop<n;loop++)
{
if (num[loop]!=0)
{
printf("%2d号\n",num[loop]);
}
}
}
70.题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
char str[50];
char *s = str;
printf("请输入字符串:");
gets_s(str, 50);
int len = strlen(str);
while (*s!= '\0'){
i++;
s++;
}
71.题目:创建一个链表。