目录
实验一
实验二
实验三
实验四
思考:注意分数之前的符号,什么时候为正什么时候为负?
2.编写程序,实现如下功能:求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12。
思考:如何求出一个三位数的百位、十位和个位?
思路:
1.该程序通过for循环即可实现,其关键在于奇加偶减,求和输出即可。
#include
int main()
{
double dsum = 0.; // 用于存储最终答案的数值
int i;
for(i = 1; i <= 100; i++) // 通过for循环实现对1~100的操作
{
if (1 == i % 2)// int强制类型转换 以满足取模的参数要求
{ // 通过取模操作判断当前的i是奇还是偶,若奇则加
dsum += 1. / i;
}
else
{ // 若偶则减
dsum -= 1. / i;
}
}
printf("ans = %f", dsum);
return 0;
}
2.该程序通过对数字的拆解,并分别进行求积及求和的操作,之后判断结果是否与题目要求相符合即可。
#include
int main()
{
int i;
int cnt = 0; // 对答案进行编码并计数
for (i = 200; i <= 300; i++)
{
int a = i % 10; // 取出个位数字
int b = (i / 10) % 10; // 取出十位数字
int c = i / 100; // 取出百位数字
if ( (42 == a * b * c) && (12 == a + b + c) )
{ // 如若满足题述条件
printf("ans%d = %d\n", ++cnt, i);
}
}
return 0;
}
编写程序,实现如下任务:从键盘输入若干个整数,输入整数的个数小于100,其值在0~100范围内,用-1作为输入结束的标志。统计每个整数的个数并从大到小排序,输出排序后的结果。
提示:定义两个数组,一个用来存放输入整数,另一个用来存放统计信息。
思路:
该程序开设了一个acnt数组,用于记录索引所对应的数字的出现次数,首先通过获取用户输入,来初始化acnt数组。
代码从17行开始是实现按照出现次数从大到小输出的功能,其中i用来做出现次数的比对,其变化从大到小,以实现按出现次数的降序输出,j用来遍历数组,判断每一个数出现的次数是否与 比对变量i 相同 。通过该过程即可实现要求的功能。
#include
int acnt[101];// 该数组用于记录 索引所对应的数字 的出现次数
int main()
{
while(1)
{ // 通过while循环进行对数据的持续输入
int t;
scanf("%d", &t);
if (-1 == t) break; // 如果输入是-1则跳出循环 即停止输入
acnt[t]++; // 对数字t的出现次数进行+1
}
int i, j;
for (i = 100; i > 0; i--)
{ // i用来做出现次数的比对,从大到小,以实现按次数的降序输出
for (j = 100; j >= 0 ; j--)
{ // j用来遍历数组,判断每一个数出现的次数是否与 比对变量i 相同
if(acnt[j] == i) // 数字j出现的次数为i
{
printf("出现:%d次的是数字:%d\n", i, j);
}
}
}
return 0;
}
编写函数,从标准输入中读取字符,直到遇到EOF。程序要输出每个字符是否是字母。如果是,还要求输出该字母在字母表中的数值位置。
思路:
该程序通过在主函数中读取字符,将字符作为实参传入CheckAlpha函数中,通过该函数的返回值,可以得知当前字符是否为字母,及其在字母表中的顺序。
CheckAlpha函数的实现方法为:通过判断该字符的ascii值是否介于字母a/A 与 z/Z之间,若是,则与a/A做差加1 即为字母表顺序。若非字母或为换行,则返回相应的标识数值,用以main函数中的处理操作。
#include
int CheckAlpha (char a)
{
if ( a >= 'A' && a <= 'Z')
{ // 返回字母所在字母表中的位置
return a - 'A' + 1;
}
if ( a >= 'a' && a <= 'z')
{ // 返回字母所在字母表中的位置
return a - 'a' + 1;
}
if (10 == a)
{ // 如果是换行符(ascii对应10)
return -1;
}
else
{ // 如果是非字母
return 0;
}
}
int main()
{
char t;// 用于临时存储当前输入的字符
while ((t = getchar()) != EOF)
{
int re = CheckAlpha(t); // re用于存储check函数的返回值,以减少重复调用
if (0 == re)
{ // 若非字母
printf("该字符不是字母\n");
}
else if (-1 == re)
{ // 若为回车键 则不进行操作
continue;
}
else
{ // 若为字母
printf("该字符是字母,其位置是%d\n", re);
}
}
return 0;
}
定义函数 void mystrcat(char *s1,char *s2,char *new_s) 实现对两个字符串进行交叉连接。
例如:有两个字符串“abcd”、“1234”,交叉连接后结果为“a4b3c2d1”。
思路:
首先对该程序的核心函数进行需求分析,其需要将字符串s1与字符串s2进行交叉连接,并将交叉连接的结果存于new_s字符串中,故根据数学分析,可得出表达通项,并根据该通项公式设计for循环即可得出答案,参数的传递则通过指针实现。
但是,在考虑特殊的情况下(s1,s2长度不一样)需要将余项接在字符串后
全部代码:
#include
#include
#define LEN 100
void mystrcat (char *s1, char *s2, char *new_s);
int main()
{
char a[LEN], b[LEN], c[LEN * 2];
printf("pleas input two strings, separated by ENTER\n");
scanf("%s", a);
scanf("%s", b);
mystrcat(a, b, c); // 进行处理
printf("After merged: %s\n", c);
return 0;
}
void mystrcat (char *s1, char *s2, char *new_s)
{
int l1=strlen(s1),l2=strlen(s2), i;
if(l1 == l2)
{
for(i = 0; i < l1; i++)
{
new_s[2 * i] = s1[i];
new_s[2 * i + 1] = s2[l2 - i - 1];
}
new_s[l1 + l2]= '\0';
}
if (l1 > l2)
{
for (i = 0; i < l2; i++)
{ // 把能正常弄得先弄上
new_s[2 * i] = s1[i];
new_s[2 * i + 1] = s2[l2 - i - 1];
}
// now i = l2
// new should start from
for (; i < l1; i++)
{
// 根据算法推导可知 从l2 + i 开始记录新数
new_s[l2 + i] = s1[i];
}
new_s[l1 + l2]= '\0';
}
if (l1 < l2)
{
for (i = 0; i < l1; i++)
{ // 把能正常弄得先弄上
new_s[2 * i] = s1[i];
new_s[2 * i + 1] = s2[l2 - i - 1];
}
// now i = l1
// new should start from
for (; i < l2; i++)
{
// 根据算法推导可知 从l2 + i 开始记录新数
new_s[l1 + i] = s2[l2 - i - 1];
}
new_s[l1 + l2]= '\0';
}
}