编程之路,从0开始:练习篇
Hello大家好,我们又见面啦!
给生活添点passion,开始今天的编程之路!
今天我们来练习十道基础小题~
1、从键盘任意输入一个字符串,计算其实际字符个数并打印输出,即不使用字符串处理函数strlen()编程实现strlen()的功能。
**输入格式要求:"%s" 提示信息:"Please enter a string:"
**输出格式要求:"The length of the string is: %u\n"
程序的运行示例如下:
Please enter a string:Hello China
The length of the string is: 11
#include <stdio.h>
int MyStrlen(char str[]);
int MyStrlen(char str[])
{
int i;
int len = 0;
for (i = 0; str[i] != '\0'; i++)
{
len++;
}
return (len);
}
int main()
{
char a[80];
int len;
printf("Please enter a string:");
gets(a);
len = MyStrlen(a);
printf("The length of the string is: %d\n", len);
return 0;
}
2、
A代表数字0到9中的前五个数字,Z代表后五个数字,请还原下列乘式。问题本身并不复杂,可以对乘式中的每一位使用穷举法,最终可以得到结果。本题的关键在于怎样有效的判断每个部分积的每一位是否满足题意,这一问题处理不好,编写的程序会很长。
A代表数字0到9中的前五个数字,Z代表后五个数字,请还原下列乘式。
A Z A
× A A Z
------------
A A A A
A A Z Z
Z A A
------------
Z A Z A A
*问题分析与算法设计
问题本身并不复杂,可以对乘式中的每一位使用穷举法,最终可以得到结果。本题的关键在于怎样有效的判断每个部分积的每一位是否满足题意,这一问题处理不好,编写的程序会很长。程序实现中采用了一个判断函数,通过传入函数的标志字符串对所有的数进行统一的判断处理。
*程序说明与注释
#include<stdio.h>
void print(long a, long b, long s1, long s2, long s3);
int jud(long q, char* pflag);
int main()
{
long i, j, k, l, m, n, term, t1, t2, t3;
int flag;
for (i = 0;i <= 4;++i) /*被乘数的第一位*/
for (j = 5;j <= 9;++j) /*被乘数的第二位*/
for (k = 0;k <= 4;++k) /*被乘数的第三位*/
{
term = 100 * i + 10 * j + k; /*被乘数*/
for (flag = 0, n = 0;n < 4 && !flag;) /*乘数的第一位*/
flag = jud((t3 = ++n * 100 * term) / 100, "001"); /*判断第三个部分积*/
if (flag)
{
for (flag = 0, m = 0;m < 4 && !flag;) /*乘数的第二位*/
flag = jud((t2 = ++m * 10 * term) / 10, "1100"); /*判断第二个部分积*/
if (flag)
{
for (flag = 0, l = 5;l < 9 && !flag;) /*乘数的第三位*/
flag = jud(t1 = ++l * term, "0000"); /*判断第一个部分积*/
if (flag && jud(t1 + t2 + t3, "00101")) /*判断乘式的积*/
print(term, n * 100 + m * 10 + l, t1, t2, t3);
}
}
}
}
void print(long a, long b, long s1, long s2, long s3) /*打印结果*/
{
printf("\n %ld\n", a);
printf("*%ld\n", b);
printf("......................\n");
printf(" %ld\n %ld\n %ld\n", s1, s2 / 10, s3 / 100);
printf("......................\n");
printf(" %ld\n", a * b);
}
int jud(long q, char* pflag) /*判断一个数的每一位是否满足要求的判断函数*/
/*q:需要判断的数。pflag:标志字符串,A用1表示,Z用0表示。标志串排列顺序:个十百...*/
{
while (q != 0 && *pflag != NULL) /*循环判断对应位的取值范围是否正确*/
if (*pflag - '0' != (q % 10 >= 5 ? 1 : 0)) /*标志位与对应的位不符,返回0*/
return 0;
else
{
q /= 10;++pflag; /*若相符则取下一位进行判断*/
}
if (q == 0 && *pflag == NULL) /*q的位数与标志字符串的长度相同时,返回1*/
return 1;
else return 0;
}
3、不使用字符串处理函数strcat()编程实现strcat()的功能,即任意输入两个字符串,然后连接这两个字符串,返回连接后字符串的首地址。
程序的运行示例如下:
Input the first string:Hello
Input the second string:China
The result is: HelloChina
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
void test(char a[], char b[])
{
int len = 0;
int i = 1;
for (i = 0;a[i] != '\0'; i++)
{
len++;
}
for (i = len;b[i - len] != '\0';i++)
{
a[i] = b[i - len];
}
int n = 0;
printf("The result is: ");
for (n = 0;n <= i;n++)
{
printf("%c", a[n]);
}
}
int main()
{
char a[100] = {0};
char b[100] = {0};
int len=0;
int i = 0;
printf("Input the first string:");
gets(a);
printf("Input the second string:");
gets(b);
test(a, b);
return 0;
}
4、请按给定的函数原型编程实现两个数组中对应该元素值的交换(数组的长度定义成5)。
函数原型:void exchange(int a[5],int b[5])
要求:
在主函数中输入两个数组中各元素的内容;
调用函数exchange实现两个数组中对应该元素值的交换;
在主函数中输出交换后两个数组的内容。
****输入提示信息格式: 无
****输入数据格式要求: "%d"
****输出提示信息格式:"Output array a:"
"Output array b:"
****输出数据格式要求:"%5d"
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void exchange(int a[5], int b[5])
{
int i = 0;
for (i = 0;i < 5;i++)
{
int temp = 0;
temp = a[i];
a[i] = b[i];
b[i] = temp;
}
printf("Output array a:");
for (i = 0;i < 5;i++)
{
printf("%5d", a[i]);
}
printf("Output array b:");
for (i = 0;i < 5;i++)
{
printf("%5d", b[i]);
}
}
int main()
{
int i = 0;
int a[5] = { 0 };
int b[5] = { 0 };
for (i = 0;i < 5;i++)
{
scanf("%d", &a[i]);
}
for (i = 0;i < 5;i++)
{
scanf("%d", &b[i]);
}
exchange(a,b);
return 0;
}
5、程序:数列求和
编写一个程序对用户输入的整数数列进行求和计算。
**输入格式要求:"%d" 提示信息:"This program sums a series of integers.\n" "Enter integers (0 to terminate):"
**输出格式要求:"The sum is: %d\n"
下面显示的是用户可见的内容:
This program sums a series of integers.
Enter integers (0 to terminate) : 8 23 71 5 0
The sum is : 107
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int arr[100] = { 0 };
int sum = 0;
printf("This program sums a series of integers.\nEnter integers (0 to terminate) : ");
do
{
scanf("%d",&arr[i]);
i++;
} while (getchar() != '\n');
int n = 0;
for (n = 0;n < i;n++)
{
sum = sum + arr[n];
}
printf("The sum is : %d", sum);
return 0;
}
6、编写程序,打印1~999之间的全部同构数。所谓同构数,是指该数出现在它的平方数的右侧。如25^2=625,25出现在625的右端,25就是同构数。
***输入提示信息:无
***输入数据格式:无
***输出提示信息:"Print all the isomorphism between 1-999:\n"
***输出数据格式:"%d "
注:输出提示信息请放在循环体之外
#include <stdio.h>
int main()
{
int i;
printf("Print all the isomorphism between 1-999:\n");
for(i=1;i<=999;i++)
{
if (i<10) {if(i*i%10==i) printf("%d ",i);}
else if (i<100) {if(i*i%100==i) printf("%d ",i);}
else {if(i*i%1000==i) printf("%d ",i);}
}
return 0;
}
7、
从键盘输入n,然后计算并输出1~n之间的所有数的阶乘值。
**输入格式要求:"%d" 提示信息:"Please enter n:"
**输出格式要求:"%d! = %ld\n"
程序运行示例如下:
Please enter n:10
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
#include <stdio.h>
main()
{
int i, n;
long p = 1;
printf("Please enter n:");
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
p = p * i;
printf("%d! = %ld\n", i, p); /* 输出1~n之间的所有数的阶乘值 */
}
}
8、从键盘输入一个英文字母,如果它是大写英文字母,则将其转换为小写英文字母,如果它是小写英文字母,则将其转换为大写英文字母,然后将它及其ASCII码值显示到屏幕上,如果不是英文字母,则不转换直接输出到屏幕上。
**输入格式要求:提示信息:"Press a key and then press Enter:"
**输出格式要求:"%c, %d\n"
程序运行示例1如下:
Press a key and then press Enter:A
a, 97
程序运行示例2如下:
Press a key and then press Enter:a
A, 65
#include<stdio.h>
int main()
{
char ch;
printf("Press a key and then press Enter:");
scanf("%c", &ch);
if (ch >= 'a'&&ch <= 'z')
{
ch = ch - 32;
printf("%c, %d\n", ch, ch);
}else if(ch >= 'A'&&ch <= 'Z')
{
ch = ch + 32;
printf("%c, %d\n", ch, ch);
}else
{
printf("%c, %d\n", ch, ch);
}
return 0;
}
9、一辆卡车违反了交通规则,撞人后逃逸。现场有三人目击该事件,但都没有记住车号,只记住车号的一些特征。甲说:车号的前两位数字是相同的;乙说:车号的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:4位的车号正好是一个整数的平方。现在请根据以上线索帮助警方找出车号以便尽快破案。
**输出格式要求:"The number is:%d\n"
#include <stdio.h>
int main()
{
int i,j,k,m ;
for (i = 0 ; i <= 9 ; i++)
{
for (j = 0 ; j <= 9 ; j++)
{
if ( i != j )
{
k = i * 1000 + i * 100 + j * 10 + j ;
for (m = 3 ; m * m <= k ; m++) //因为四位车牌最小为0011 所以m最小为3//
{
if (m*m == k)
{
printf("The number is:%d\n",k);
}
}
}
}
}
return 0 ;
}
10、假设银行一年整存零取的月息为1.875%(年息为12*1.875%,年息按复利计算),现在某人手头有一笔钱,他打算在今后5年中,每年年底取出1000元作为孩子来年的教育金,到第5年孩子毕业时刚好取完这笔钱,请采用逆推法编程计算第1年年初时他应存入银行多少钱。
**输出格式要求:"He must save %.2f at the first year.\n"
程序运行示例如下:
He must save 2833.29 at the first year.
#include<stdio.h >
#define a 12*1.875/100//利息
int main()
{
int i = 0;
double x = 0;
//从公式上看就是:(((x*(1*a)-1000)*(1+a)-1000)*(1+a)-1000)...=0
while (i < 5)
{
x = (x + 1000) /(1+ a);//不要忘了1
i++;
}
printf("He must save %.2f at the first year.\n",x);
return 0;
}
今天的内容就分享到这,期待我们再见!