此博客给的是谭浩强先生《C程序设计第四版》课程章节里的问题(不含课后答案)
课后答案见:https://blog.csdn.net/Mr_Cat123/article/details/84800905
第一部分 章节内的问题
第二章 算法----程序的灵魂
算法+数据结构=程序
例题2.1:求 1 × 2 × 3 × 4 × 5 1\times2\times3\times4\times5 1×2×3×4×5
C实现
#include<stdio.h>
int main()
{
int i=2, p=1;
while (i<=5)
{
p = p*i;
i++;
}
printf("answer=%d\n", p);
return 0;
}
python版本
ans = 1
for i in range(1,6):
ans*=i
print('answer = ',ans)
例题2.2 有50个学生,要求输出成绩在80分以上到学生的学号和成绩
由于学生人数较多,故只取五个学生作为参考
python代码:
import numpy as np
import xlrd #读取Excel文件
workbook = xlrd.open_workbook('C:/users/lenovo/desktop/student_score.xlsx')
sheet = workbook.sheet_by_name('Sheet1')
data_name = sheet.col_values(0)
data_st_ID = sheet.col_values(1)
data_st_score = sheet.col_values(2)
n = data_st_ID #学号
g = data_st_score #分数
itera = len(data_name) #人数
for i in range(1,itera):
if g[i] >= 80:
print('学号是:%d,分数是:%.2f'%(n[i],g[i]))
例题2.3 判断2000-2500年中的每一年是否是闰年,并将结果输出
leap_year = []
for year in range(2000,2501):
if year%4 == 0:
if year%100 != 0:
leap_year.append(year)
elif year%400 == 0:
leap_year.append(year)
elif year%400 == 0:
leap_year.append(year)
上面的程序可以通过布尔算符表示如下:
leap_year = []
for year in range(2000,2501):
if (year%4 == 0 and year%100 != 0) or (year%400 == 0):
leap_year.append(year)
C++/C程序
#include<stdio.h>
int main()
{
int year;
year = 2000;
while (year <= 2500)
{
if (year % 4 == 0)
if (year % 100 != 0)
printf("%d是闰年", year);
else
if (year % 400 == 0)
printf("%d是闰年", year);
year += 1;
}
return 0;
}
通过布尔算符改为:
#include<stdio.h>
int main()
{
int year;
year = 2000;
while (year <= 2500)
{
if ((year % 4 == 0 && year % 100 != 0) || (year%400==0))
printf("%d是闰年", year);
year += 1;
}
return 0;
}
例题2.4 求 1 − 1 2 + 1 3 − 1 4 + . . . − 1 100 1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+...-\frac{1}{100} 1−21+31−41+...−1001.
python代码
sum = 1
sign = 1
for i in range(2,101):
sign *= (-1)
sum+=sign/i
print(sum)
C++/C代码
#include<stdio.h>
int main()
{
int sign=1;
double sum_ans = 1, i = 2.0;
while (i <= 100)
{
sign = (-1)*sign;
sum_ans = sum_ans + sign / i;
i=i+1;
}
printf("%f\n", sum_ans);
return 0;
}
C++和C相比python比较坑的是,一定要声明sum_ans和i为double,否则结果是1,有时候忘记这个,那么就等着哭泣吧。
第四章 选择结构程序设计
例题4.2输入两个数,按数值从小到大排列输出.
#include<stdio.h>
#include<math.h>
int main()
{
float a, b,t;
printf("Please enter two numbers:");
scanf_s("%f %f", &a, &b);
if (a > b)
{
t = a;
a = b;
b = t;
}
printf("%6.1f\n%6.1f\n", a, b);
return 0;
}
如果是输入的多个数,可以使用algorithm中的sort函数。如下:
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
float a[3];
printf("Please enter three numbers:");
scanf_s("%f %f %f", &a[0], &a[1],&a[2]);
sort(a, a + 3);
printf("%6.1f\n%6.1f\n%6.1f\n", a[0],a[1],a[2]);
return 0;
}
注意:上面使用了sort函数,因此在预处理那儿要加入算法库algorithm,同时,由于不同库之间会有一些标识符等的冲突,于是要使用using namespace std,即命名空间是标准命名空间。
例题4.4, 输入一个字符判断是否是大写,如果不是则换成小写输出.
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
char ch;
scanf_s("%c", &ch,sizeof(ch));
ch = ('A' <= ch <= 'Z') ? (ch + 32) : ch;
printf("%c\n", ch);
return 0;
}
第五章
例题5.7用 π / 4 。 。 。 。 \pi/4。。。。 π/4。。。。求 π \pi π.
#include<stdio.h>
#include<algorithm>
#include<time.h>
#define SUM 10000
using namespace std;
int main()
{
clock_t timeStart, timeEnd;
timeStart = clock();
int i=0;
float n = 1.0;
double pi = 0.0;
int sign = 1;
for (; fabs(1.0 / n) >= 1e-6; i++)
{
pi = pi + sign / n;
sign = -sign;
n = n + 2;
}
timeEnd = clock();
printf("%f\n%d\n", 4*pi,i);
printf("time interval=%.4f\n", (float)(timeEnd - timeStart) / CLOCKS_PER_SEC);
return 0;
}
这里,当将1e-6改成1e-8时一定要记得将float改成double,因为float 4个字节不够储存会出现溢出导致无法给出结果的现象。
第六章
6.8 输入一行字符,统计其中
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<time.h>
#include<cstring>
using namespace std;
int main()
{
int i,count=0;
char str[30];
gets_s(str);
for (i = 0; i <= strlen(str); i++)
if (str[i] == ' ') count++;
printf("there are %d words", count+1);
return 0;
}
这个没有书上的严谨,一旦前面有多个空格或者两个单词之间有多个空格就无法用这个方法。
第七章 用函数实现模块化程序设计
例7.9 输入10个数,输出最大元素和该数是第几个数
文章使用的方法有点麻烦,还要定义max()函数,下面是不定义max函数的情况
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<time.h>
#include<cstring>
using namespace std;
int main()
{
int i,a[10],max,n=1;
printf("Please enter 10 integer numbers:");
for (i = 0; i < 10; i++)
scanf_s("%d",&a[i]);
for (i = 1, max = a[0]; i < 10; i++)
{
if (max < a[i]) max = a[i],n=i+1;
}
printf("The largest number is %d\nIt is the %dth number.", max,n);
return 0;
}
第八章 善于利用指针
这一章很重要,要点也很多,因此我将一些网上搜索的试题卷放在此处
1,试题卷1
例8.1 通过指针变量访问整型变量
#include<stdio.h>
int main()
{
int a = 100, b = 9;
int * pointer_1, *pointer_2;
pointer_1 = &a, pointer_2 = &b;
printf("%d,%d",* pointer_1,* pointer_2);
return 0;
}
例8.2通过指针来大小排序
#include<stdio.h>
int main()
{
int a, b;
int * pointer_1, *pointer_2;
scanf_s("%d,%d", &a, &b);
pointer_1 = &a, pointer_2 = &b;
if (a < b)
{
pointer_1 = &b, pointer_2 = &a;
}
printf("%d,%d\n",* pointer_1,* pointer_2);
return 0;
}
例8.3大小排序
#include<stdio.h>
int main()
{
void swap(int *p1,int *p2);
int a, b;
int * pointer_1, *pointer_2;
scanf_s("%d,%d", &a, &b);
pointer_1 = &a, pointer_2 = &b;
if (a < b)
{
swap(pointer_1, pointer_2);
}
printf("%d,%d\n",* pointer_1,* pointer_2);
return 0;
}
void swap(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
第二部分 个人笔记
1 数组
1.1数组的定义
1维数组:
定义整型10个元素的1维数组
int a[10];
定义并赋值
int a[4]={1,2,3,4}
int a[] = {1,2,3,4} //会自动知道有4个元素
int a[4] = {0} //未赋值的部分自动为0
2维数组
int a[2][2]; //定义
int a[2][2] = {{1,2},{3,4}} //定义并赋值
1.2数组运算(加减乘除)
#include<stdio.h>
int main()
{
int i,j;
int a[2][2] = {{1,2},{3,4}};
int b[2][2] = {{-3,-2},{0,2}};
int c[2][3];
for (i=0;i<2;i++)
{
for (j=0;j<2;j++)
{
c[i][j] = a[i][j]+b[i][j];
printf("%-4d",c[i][j]); //隔四格打印一个数,并从最左开始
}
printf("\n");
}
return 0;
}