实验教学
实验共16学时,分为8个部分,每部分2学时,请按要求完成。
实验共16学时,分为8个部分,每部分2学时,请按要求完成。
本次实验要求熟悉开发环境,掌握选择和循环结构
启动 Code 软件,在左侧项目文件夹中新建
C语言源程序(注意文件名以.c
为后缀。
程序编写完毕后,点击右上角 三角形
图标按钮进行编译运行,如果有错,根据提示的行数进行修改,直至无错(可不理会警告)。
/*输入2个整数,将大者输出。*/
#include <stdio.h>
void main(){
int a,b,max;
printf("Please input 2 number:");
scanf("%d%d",&a,&b);
if(a > b){
max = a;
}else{
max = b;
}
printf("Max:%d\n", max);
}
/*使用switch语句,输入一个数字,输出对应的星期几(如5则输出Friday)。*/
#include "stdio.h"
void main(){
int n;
printf("Please input a integer number:");
scanf("%d", &n);
switch(n){
case 1: printf("MON\n");break;
case 2: printf("TUE\n");break;
case 3: printf("WED\n");break;
case 4: printf("THE\n");break;
case 5: printf("FRI\n");break;
case 6: printf("SAT\n");break;
case 7: printf("SUN\n");break;
default: printf("Error!\n");break;
}
}
/*使用switch语句编写一个简单的计算器(+-×÷)。如当用户输入2+3时输出结果。*/
#include "stdio.h"
void main(){
float a,b;
char c;
printf("Please input(like 1+2):");
scanf("%f%c%f", &a, &c, &b);
switch(c){
case '+': printf("%.2f%c%.2f=%.2f\n", a, c, b, a + b);break;
case '-': printf("%.2f%c%.2f=%.2f\n", a, c, b, a - b);break;
case '*': printf("%.2f%c%.2f=%.2f\n", a, c, b, a * b);break;
case '/': printf("%.2f%c%.2f=%.2f\n", a, c, b, a / b);break;
default: printf("Error!\n");break;
}
}
/*使用while语句,依次输出1~100中的偶数,每行五个,每个数字占5个字符宽度。*/
#include "stdio.h"
void main(){
int i, n=1;
for(i = 2; i <= 100; i+=2){
printf("%5d", i);
if(n % 5 == 0){
putchar('\n');
}
n++;
}
}
/*使用for语句,输出1+2+3+...+99+100的结果。*/
#include "stdio.h"
void main(){
int i, sum = 0;
for(i = 1; i <= 100; i++){
sum += i;
}
printf("1+2+3+...+99+100 = %d\n", sum);
}
/*求 1!+2!+...+9!+10!的结果。*/
#include "stdio.h"
void main(){
int i, jc = 1, sum = 0;
for(i = 1; i <= 10; i++){
jc = jc * i;
sum += jc;
}
printf("1!+2!+3!+...+9!+10! = %d\n", sum);
}
/*输出一个用*组成的倒三角形图案。*/
#include "stdio.h"
void main(){
int i, j;
for(i = 10; i >= 1; i--){
printf(" ");
for(j = 1; j <= 10 - i + 1; j++){
printf(" ");
}
for(j = 2 * i - 1; j >= 1; j--){
printf("*");
}
printf("\n");
}
}
/*求1.5元钱兑换成1、2、5分硬币的方案*/
#include "stdio.h"
void main(){
int i, j, k, n=0;
for(i = 0; i <= 150; i++){
for(j = 0; j <= 75; j++){
for(k = 0; k <= 30; k++){
if(i + j *2 + k * 5 == 150){
n++;
printf("No.%d: %d %d %d\n", n, i, j, k);
}
}
}
}
}
/*输出3-1000内的素数。*/
#include "stdio.h"
#include "math.h"
void main(){
int n, i, flag;
for(n = 3; n <= 1000; n++){
flag = 1;
for(i = 2; i <= sqrt(n); i++){
if(n % i == 0){
flag = 0;
break;
}
}
if(flag == 1){
printf("%5d", n);
}
}
}
/*输出Fibonacci(1,1,2,3,5,8,13,21...)数列的前20项。*/
#include <stdio.h>
void main(){
int f1,f2,f3,i;
f1 = f2 = 1;
printf("Fibonacci:\n%5d%5d", f1,f2);
for(i = 1;i <= 18;i++){
f3 = f1 + f2;
printf("%5d", f3);
f1 = f2;
f2 = f3;
}
}
/*一个三位整数的各位数字的立方之和等于其本身,该数则称为“水仙花数”,输出全部的水仙花数。*/
#include "stdio.h"
void main(){
int i,gw,sw,bw;
for(i = 100;i < 1000;i++){
gw = i % 10;
sw = (i / 10) % 10;
bw = i / 100;
if(i == gw * gw * gw + sw * sw * sw + bw * bw * bw){
printf("%5d", i);
}
}
}
/*任意输入一个正整数,倒序输出(如输入12345,则输出54321)。*/
#include "stdio.h"
void main(){
int n, num;
printf("Please input a integer number (>0):");
scanf("%d", &n);
while(n > 0){
num = n % 10;
printf("%d", num);
n = n / 10;
}
}
/*参考程序*/
#include <stdio.h>
void main(){
int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12;
printf("Please input 12 apple's weight:");
scanf("%d%d%d%d%d%d%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9,&a10,&a11,&a12);
if(a1+a2+a3+a4>a5+a6+a7+a8){
//第一次,不同的苹果在1~8中,当前左重右轻
if(a1+a2+a3+a5>a4+a9+a10+a11){
//第二次,因为9~11号苹果是标准的,我们又交换了a4和a5,还维持左边重,
//说明不同的苹果在1~3中,且重一些
if(a1>a2){//第三次
printf("No.1,Weighter\n");
}else if(a1<a2){//第三次
printf("No.2,Weighter\n");
}else{//第三次
printf("No.3,Weighter\n");
}
}else if(a1+a2+a3+a5<a4+a9+a10+a11){
//第二次,因为9~11号苹果是标准的,我们又交换了a4和a5,但现在右边重,
//说明不同的苹果在4~5中,现在不知道轻重
if(a4>a1){//第三次,a1是标准的,故4重
printf("No.4,Weighter\n");
}else if(a4<a1){//第三次,a1是标准的,故4轻
printf("No.4,lighter\n");
}else{//第三次,a1是标准的,故5轻
printf("No.5,lighter\n");
}
}else{//第二次,天平相等,说明不同的苹果在6~8中,且轻
if(a6>a7){
printf("No.7,lighter\n");
}else if(a6<a7){
printf("No.6,lighter\n");
}else{
printf("No.8.lighter\n");
}
}
}else if(a1+a2+a3+a4==a5+a6+a7+a8){
//第一次,,不同的苹果在9~12中
if(a1+a2+a3+a4>a5+a9+a10+a11){
//第二次,不同的苹果在9~11中,且轻一些
if(a9>a10){//第三次,10轻
printf("No.10,lighter\n");
}else if(a9<a10){//第三次,9轻
printf("No.9,lighter\n");
}else{//第三次,11轻
printf("No.11,lighter\n");
}
}else if(a1+a2+a3+a4<a5+a9+a10+a11){
//第二次,不同的苹果在9~11中,且重一些
if(a9>a10){//第三次,9重
printf("No.9,Weighter\n");
}else if(a9<a10){//第三次,10重
printf("No.10,Weighter\n");
}else{//第三次,11重
printf("No.11,Weighter\n");
}
}else{//第二次,不同的苹果是12
if(a1>a12){//第三次,12轻
printf("No.12,lighter\n");
}else if(a1<a12){//第三次,12重
printf("No.12,Weighter\n");
}else{//第三次,输入错误
printf("Input Error!\n");
}
}
}else{
//第一次,不同的苹果在1~8中,当前左轻右重
if(a1+a2+a3+a5<a4+a9+a10+a11){
//第二次,因为9~11号苹果是标准的,我们又交换了a4和a5,还维持左边轻,
//说明不同的苹果在1~3中,且轻一些
if(a1>a2){//第三次
printf("No.2,lighter\n");
}else if(a1<a2){//第三次
printf("No.1,lighter\n");
}else{//第三次
printf("No.3,lighter\n");
}
}else if(a1+a2+a3+a5>a4+a9+a10+a11){
//第二次,因为9~11号苹果是标准的,我们又交换了a4和a5,但现在右边轻,
//说明不同的苹果在4~5中,现在不知道轻重
if(a4>a1){//第三次,a1是标准的,故4重
printf("No.4,Weighter\n");
}else if(a4<a1){//第三次,a1是标准的,故4轻
printf("No.4,lighter\n");
}else{//第三次,a1是标准的,故5重
printf("No.5,Weighter\n");
}
}else{
//第二次,天平相等,说明不同的苹果在6~8中,且重
if(a6>a7){//第三次
printf("No.6,Weighter\n");
}else if(a6<a7){//第三次
printf("No.7,Weighter\n");
}else{//第三次
printf("No.8.Weighter\n");
}
}
}
}
本次实验要求了解C语言程序由函数构成,能熟练掌握自定义函数。
/*由用户给出次数后,main函数调用welcome函数能打印该次数的欢迎词。*/
#include "stdio.h"
void welcome(int n){
int i;
for(i=1;i<=n;i++){
printf("Welcome to CQ!\n");
}
}
void main(){
int a;
printf("Please input a integer number:");
scanf("%d", &a);
welcome(a);
}
/*用户任意输入2个整数,main函数调用getMin函数后得到小的数并输出。*/
#include "stdio.h"
int getMin(int a, int b){
int min;
min = a;
if(min > b){
min = b;
}
return min;
}
void main(){
int a, b;
printf("Please input two integer number:");
scanf("%d%d", &a, &b);
printf("MIN:%d\n", getMin(a, b));
}
/*用户输入要打印的字符和次数,main函数调用myPrint函数后打印指定次数的该字符。*/
#include "stdio.h"
void myPrint(char a, int n){
int i;
for(i = 1; i <= n; i++){
printf("%c", a);
}
}
void main(){
char a;
int n;
printf("Please input a character and a integer number:");
scanf("%c%d", &a, &n);
myPrint(a, n);
}
/*输出3~100之间的素数,判断是否素数用isPrime函数完成。*/
#include "stdio.h"
#include "math.h"
int isPrime(int n){
int i;
for(i = 2; i <= sqrt(n); i++){
if(n % i == 0){
return 0;
}
}
return 1;
}
void main(){
int i;
for(i = 3; i <= 100; i++){
if(isPrime(i)){
printf("%5d", i);
}
}
}
本次实验要求掌握普通自定义函数、递归函数的编写,掌握全局变量及其用法,掌握变量存储类型中的自动、静态变量及其用法,了解编译预处理。
/*在main函数中输入一个年份,由isLeap函数判断是否为闰年并在main函数中输出结果。(闰年的条件:能被4整除但不能被100整除,或者能被400整除)*/
#include "stdio.h"
int isLeap(int year){
int result = 0;
if((year % 4 == 0 && year % 100 != 0) || (year % 400 ==0)){
result = 1;
}
return result;
}
void main(){
int year;
printf("Please input a year:");
scanf("%d", &year);
if(isLeap(year)){
printf("%d is leap year!\n", year);
}
}
/*哥德巴赫猜想是:6及其以上的所以偶数都可分解为2个素数之和。请在main函数中对6~100直接的偶数进行判断并输出结果,是否为素数由函数isPrime完成。*/
#include "stdio.h"
#include "math.h"
int isPrime(int n){
int i;
for(i = 2; i <= sqrt(n); i++){
if(n % i == 0){
return 0;
}
}
return 1;
}
void main(){
int i,j;
for(i = 6; i <= 100; i+=2){
for(j = 2;j <= i/2;j++){
if(isPrime(j)&&isPrime(i-j)){
printf("%d=%d+%d\n", i, j, i-j);
}
}
}
}
/*在main函数中输入一个正整数,由fact函数使用递归的方式求出该正整数的阶乘并在main函数中输出结果。*/
#include "stdio.h"
int fact(int n){
if(n == 0){
return 1;
}else{
return n * fact(n - 1);
}
}
void main(){
int n;
do{
printf("Please input a integer number(>=0):");
scanf("%d", &n);
}while(n < 0);
printf("%d!=%d\n", n, fact(n));
}
/*由fibonacci函数采用递归的方式求出斐波那契数列某项,在main函数中调用该函数并输出其前20项的值。*/
#include "stdio.h"
int fibonacci(int n){
if(n == 1 || n == 2){
return 1;
}else{
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
void main(){
int i;
for(i = 1; i <=20; i++){
printf("%5d", fibonacci(i));
if(i % 5 == 0){
printf("\n");
}
}
}
/*在main函数中输入3个数,函数noReturn(无返回值)计算出这3个数的平均值、最大值和最小值,由main函数输出结果。(注意:请使用全局变量)*/
#include "stdio.h"
float average;
int min, max;
void noReturn(int a, int b, int c){
average = (a + b + c) / 3.0;
min = a;
if(min > b){
min = b;
}
if(min > c){
min = c;
}
max = a;
if(max < b){
max = b;
}
if(max < c){
max = c;
}
}
void main(){
int a, b, c;
printf("Please input 3 integer number:");
scanf("%d%d%d", &a, &b, &c);
noReturn(a, b, c);
printf("Average:%.2f, Min:%d, Max:%d\n", average, min, max);
}
本次实验要求掌握数值型一维数组、二维数组以及字符数组的使用。
/*输入10个数到数组,输出比平均值小的数。*/
#include "stdio.h"
void main(){
int a[10], sum = 0, average, i;
for(i = 0; i < 10; i++){
printf("Please input No.%d:", i + 1);
scanf("%d", &a[i]);
}
for(i = 0; i < 10; i++){
sum += a[i];
}
average = sum / 10;
for(i = 0; i < 10; i++){
if(a[i] < average){
printf("%5d", a[i]);
}
}
}
/*利用数组求Fibonacci数列的前20项并按每行5个输出。*/
#include "stdio.h"
void main(){
int a[20], i;
a[0] = a[1] = 1;
for(i = 2; i < 20; i++){
a[i] = a[i-1] + a[i-2];
}
for(i = 0; i < 20; i++){
printf("%5d", a[i]);
if((i + 1) % 5 == 0){
printf("\n");
}
}
}
/*输入10个数到数组,从小到大排序后输出。*/
#include "stdio.h"
void main(){
int a[10], i, j, temp;
for(i = 0; i < 10; i++){
printf("Please input No.%d:", i + 1);
scanf("%d", &a[i]);
}
for(i = 0; i < 9; i++){
for(j = i + 1; j < 10; j++){
if(a[i] > a[j]){
temp = a[i]; a[i] = a[j]; a[j] = temp;
}
}
}
for(i = 0; i < 10; i++){
printf("%d ", a[i]);
}
}
/*一个3×4的矩阵已经有数据(也即已经初始化),请输出其转置矩阵。*/
#include "stdio.h"
void main(){
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}, b[4][3], i, j;
for(i = 0; i < 4; i++){
for(j = 0; j < 3; j++){
b[i][j] = a[j][i];
}
}
for(i = 0; i < 4; i++){
for(j = 0; j < 3; j++){
printf("%5d", b[i][j]);;
}
putchar('\n');
}
}
/*一个3×4的矩阵已经有数据(也即已经初始化),请输出最大的数及其所在的行和列。*/
#include "stdio.h"
void main(){
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}, max, hang, lie, i, j;
max = a[0][0]; hang = 0; lie = 0;
for(i = 0; i < 3; i++){
for(j = 0; j < 4; j++){
if(max < a[i][j]){
max = a[i][j];
hang = i;
lie = j;
}
}
}
printf("Max is %d ( %d, %d )\n", max, hang + 1, lie + 1);
}
/*某班有4个同学,学习了3门课程,求各课程和各同学的平均分。*/
#include "stdio.h"
void main(){
int i, j;
float a[3][4], course[3], student[4];
for(i = 0; i < 3; i++){
for(j = 0; j < 4; j++){
printf("Please input No.%d course No.%d student's score:", i + 1, j + 1);
scanf("%f", &a[i][j]);
}
}
for(i = 0; i < 3; i++){
for(j = 0; j < 4; j++){
course[i] += a[i][j];
}
course[i] /= 3;
}
for(i = 0; i < 4; i++){
for(j = 0; j < 3; j++){
student[i] += a[j][i];
}
student[i] /= 4;
}
for(i = 0; i < 3; i++){
printf("No.%d course's average score is %5.2f", i + 1, course[i]);
}
for(i = 0; i < 4; i++){
printf("No.%d student's average score is %5.2f", i + 1, student[i]);
}
}
/*有字符串“I love you”,请分别使用scanf函数的%s格式控制符以及gets函数进行输入,用puts函数输出,了解这两个输入函数的区别。*/
#include "stdio.h"
void main(){
char str1[100], str2[100];
scanf("%s", str1);//请输入“I love you”字符串
gets(str2);
printf("No.1 string:");
puts(str1);
printf("No.2 string:");
puts(str2);
}
/*编程练习strcpy()、strcat()、strcmp()以及strlen()函数的用法。*/
#include "stdio.h"
#include "string.h"
void main(){
char str1[100] = "25th Anniversary for ", str2[] = "8 * 8";
if(strcmp(str1, str2) > 0){
printf("String one > string two.\n");
}else if(strcmp(str1, str2) == 0){
printf("String one is equal string two.\n");
}else{
printf("String one < string two.\n");
}
puts(strcat(str1, str2));
printf("length is %d\n", strlen(str1));
puts(strcpy(str1, str2));
}
/*编写自定义函数myStrcat()和myStrlen()完成系统函数strcat()和strlen()的功能。*/
#include "stdio.h"
void myStrcat(char s1[], char s2[]){
int i = 0, j = 0;
while(s1[i] != '\0'){
i++;
}
while(s2[j] != '\0'){
s1[i] = s2[j];
i++; j++;
}
s1[i] = '\0';
}
int myStrlen(char s[]){
int i = 0;
while(s[i] != '\0'){
i++;
}
return i;
}
void main(){
char str1[100] = "25th Anniversary for ", str2[] = "8 * 8";
myStrcat(str1, str2);
puts(str1);
printf("length is %d\n", myStrlen(str1));
}
/*从键盘上输入一行文字,分别统计出大写字母、小写字母、数字字符、空格以及其它字符的个数。*/
#include "stdio.h"
void main(){
char str[100];
int i = 0, daXie = 0, xiaoXie = 0, shuZhi = 0, kongGe = 0, qiTa = 0;
printf("Please input a string:\n");
gets(str);
while(str[i] != '\0'){
if(str[i] >= 'A' && str[i] <= 'Z'){
daXie++;
}else if(str[i] >= 'a' && str[i] <= 'z'){
xiaoXie++;
}else if(str[i] >= '0' && str[i] <= '9'){
shuZhi++;
}else if(str[i] == ' '){
kongGe++;
}else{
qiTa++;
}
i++;
}
printf("daxie:%d\n", daXie);
printf("xiaoxie:%d\n", xiaoXie);
printf("shuzhi:%d\n", shuZhi);
printf("kongge:%d\n", kongGe);
printf("qita:%d\n", qiTa);
}
本次实验要求掌握指针的用法,是课程的重点和难点。
/*有两个整型变量a,b,请用指针操作a和b,完成a和b的+-*÷运算并输出结果。*/
#include "stdio.h"
void main(){
int a, b, *pa, *pb, he, ca, ji, shang;
pa = &a;
pb = &b;
scanf("%d", pa);
scanf("%d", pb);
he = *pa + *pb;
ca = *pa - *pb;
ji = *pa * *pb;
shang = *pa / *pb;
printf("%d+%d=%d\n", a, b, he);
printf("%d-%d=%d\n", a, b, ca);
printf("%d*%d=%d\n", a, b, ji);
printf("%d/%d=%d\n", a, b, shang);
}
/*有10个元素的整型数组a,请用指针操作数组a,输出最大的元素并指出其所在位置。*/
#include "stdio.h"
void main(){
int a[10] = {1,2,3,4,5,66,7,8,9,28}, *p = a, max, wz, i;
max = *p;
wz = 0;
for(i = 1; i < 10; i++){
if(max < *(p + i)){
max = *(p + i);
wz = i;
}
}
printf("Max is %d, at %d\n", max, wz + 1);
}
/*用指针实现:生成Fibonacci数列的前20项。*/
#include "stdio.h"
void main(){
int fibo[20], *p, i;
p = fibo;
*p = *(p + 1) = 1;
for(i = 2; i < 20; i++){
*(p + i) = *(p + i - 1) + *(p + i - 2);
}
for(i = 0; i < 20; i++){
printf("%5d", *p++);
if((i + 1) % 5 == 0){
putchar('\n');
}
}
}
/*用指针实现:将数组元素逆序存放。*/
#include "stdio.h"
void main(){
int a[10] = {1,2,3,4,5,6,7,8,9,10}, *p1, *p2, temp, i;
p1 = &a[0];
p2 = &a[9];
while(p1 < p2){
temp = *p1;
*p1 = *p2;
*p2 = temp;
p1++;
p2--;
}
for(i = 0; i < 10; i++){
printf("%d ", a[i]);
}
}
/*请用指针操作字符串,输出该字符串中的大写字母的个数。*/
#include "stdio.h"
void main(){
char str[100], *p = str, dx = 0;
printf("Please input a string:");
gets(p);
while(*p != '\0'){
if(*p >= 'A' && *p <= 'Z'){
dx++;
}
p++;
}
printf("Daxie: %d\n", dx);
}
/*请用指针操作字符串,删除该字符串中指定的字母后输出更改后的字符串。*/
#include "stdio.h"
void main(){
char str[] = "delete one character", *p, ch;
int i, j;
printf("Please a character:");
ch = getchar(); //scanf("%c", &ch);
p = str;
for(i = j =0; *(p + i) != '\0'; i++){
if(*(p + i) != ch){
*(p + j) = *(p + i);
j++;
}
}
*(p + j) = '\0';
puts(str);
}
/*用字符指针数组存放8个字符串(“非法日期,周一 ~ 周日”),根据输入的数字,输出对应的星期。*/
#include "stdio.h"
void main(){
char *day[] = {"Illegal day", "Monday", "Tuesday", "Wednesday", "Tursday", "Friday", "Saturday", "Sunday"};
int n;
printf("Please input a number:");
scanf("%d", &n);
if(n >= 1 && n <= 7){
printf("%s", day[n]);
}else{
printf("%s\n", day[0]);
}
}
/*main函数中输入两个整数,调用swap函数后交换变量的值(用指针完成),在main函数中输出。*/
#include "stdio.h"
void swap(int *p1, int *p2){
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void main(){
int a = 1, b = 2;
swap(&a, &b);
printf("%d,%d\n", a, b);
}
/*将字符串中的第m个字符开始的全部字符复制生成一个新的字符串。要求main函数中输入该字符串和m,调用myCopy函数完成复制,然后在main函数中输出新字符串(注意:myCopy函数返回指针)。*/
#include "stdio.h"
char *myCopy(char *p, int m){
static char newString[100];//注意:此处需定义为static,否则返回该数组的首地址后,该数组的所占用的空间即刻被系统收回,则main函数中就得不到新的字符串。(编译警告:returning address of local variable or temporary)
int i = 0;
while(*(p + m) != '\0'){
newString[i] = *(p + m);
m++;
i++;
}
newString[i] = '\0';
return newString;
}
void main(){
char str[] = "copy string from somewhere", *p;
int m;
printf("Please input a number: ");
scanf("%d", &m);
p = myCopy(str, m);
puts(p);
}